ZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY2xpZW50X2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5NDNiNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudF9ldmVudC5jCkBAIC0wLDAgKzEsNTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX2NsaWVudF9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyTEFOIGNsaWVudCBzdGF0ZSBtYWNoaW5lCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTI6MjQgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CisKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2luZm8gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX29wZW4gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2FyYiAgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmxhbl9jYiAqLCBJUkxBTl9FVkVOVCBldmVudCwgc3RydWN0IHNrX2J1ZmYgKikgPQoreyAKKwlpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSwKKwlpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnksCisJaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4sCisJaXJsYW5fY2xpZW50X3N0YXRlX2luZm8sCisJaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhLAorCWlybGFuX2NsaWVudF9zdGF0ZV9vcGVuLAorCWlybGFuX2NsaWVudF9zdGF0ZV93YWl0LAorCWlybGFuX2NsaWVudF9zdGF0ZV9hcmIsCisJaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEsCisJaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlLAorCWlybGFuX2NsaWVudF9zdGF0ZV9zeW5jCit9OworCit2b2lkIGlybGFuX2RvX2NsaWVudF9ldmVudChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJKCpzdGF0ZVsgc2VsZi0+Y2xpZW50LnN0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSURMRSwgV2UgYXJlIHdhaXRpbmcgZm9yIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBhIHByb3ZpZGVyCisgKiAgICBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9ESVNDT1ZFUllfSU5ESUNBVElPTjoKKwkJaWYgKHNlbGYtPmNsaWVudC5pcmlhcCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCQorCQlzZWxmLT5jbGllbnQuaXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJCQkJaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtKTsKKwkJLyogR2V0IHNvbWUgdmFsdWVzIGZyb20gcGVlciBJQVMgKi8KKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fUVVFUlkpOworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5jbGllbnQuaXJpYXAsCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkJICAgICAgIklyTEFOIiwgIklyREE6VGlueVRQOkxzYXBTZWwiKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikgCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFFVRVJZLCBXZSBoYXZlIHF1ZXJ5ZWQgdGhlIHJlbW90ZSBJQVMgYW5kIGlzIHJlYWR5IHRvIGNvbm5lY3QKKyAqICAgIHRvIHByb3ZpZGVyLCBqdXN0IHdhaXRpbmcgZm9yIHRoZSBjb25maXJtLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9JQVNfUFJPVklERVJfQVZBSUw6CisJCUlSREFfQVNTRVJUKHNlbGYtPmR0c2FwX3NlbF9jdHJsICE9IDAsIHJldHVybiAtMTspOworCisJCXNlbGYtPmNsaWVudC5vcGVuX3JldHJpZXMgPSAwOworCQkKKwkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIAorCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9jdHJsLCAKKwkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIE5VTEwsIAorCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0NPTk4pOworCQlicmVhazsKKwljYXNlIElSTEFOX0lBU19QUk9WSURFUl9OT1RfQVZBSUw6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElBU19QUk9WSURFUl9OT1RfQVZBSUxcbiIsIF9fRlVOQ1RJT05fXyApOworCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKworCQkvKiBHaXZlIHRoZSBjbGllbnQgYSBraWNrISAqLworCQlpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKKwkJICAgIChzZWxmLT5wcm92aWRlci5zdGF0ZSAhPSBJUkxBTl9JRExFKSkKKwkJCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4gKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgQ09OTiwgV2UgaGF2ZSBjb25uZWN0ZWQgdG8gYSBwcm92aWRlciBidXQgaGFzIG5vdCBpc3N1ZWQgYW55CisgKiAgICBjb21tYW5kcyB5ZXQuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9jb25uKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJMQU5fQ09OTkVDVF9DT01QTEVURToKKwkJLyogU2VuZCBnZXRpbmZvIGNtZCAqLworCQlpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyhzZWxmKTsKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSU5GTyk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9pbmZvIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIElORk8sIFdlIGhhdmUgaXNzdWVkIGEgR2V0SW5mbyBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5LgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwkJaXJsYW5fY2xpZW50X3BhcnNlX3Jlc3BvbnNlKHNlbGYsIHNrYik7CisJCQorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9NRURJQSk7CisJCQorCQlpcmxhbl9nZXRfbWVkaWFfY2hhcihzZWxmKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBNRURJQSwgVGhlIGlybGFuX2NsaWVudCBoYXMgaXNzdWVkIGEgR2V0TWVkaWEgY29tbWFuZCBhbmQgaXMgYXdhaXRpbmcgYQorICogICAgcmVwbHkuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgorCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJaXJsYW5fb3Blbl9kYXRhX2NoYW5uZWwoc2VsZik7CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbiAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBPUEVOLCBUaGUgaXJsYW5fY2xpZW50IGhhcyBpc3N1ZWQgYSBPcGVuRGF0YSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCisgKiAgICByZXBseQorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgorCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJCisJCS8qCisJCSAqICBDaGVjayBpZiB3ZSBoYXZlIGdvdCB0aGUgcmVtb3RlIFRTQVAgZm9yIGRhdGEgCisJCSAqICBjb21tdW5pY2F0aW9ucworCQkgKi8KKwkgIAlJUkRBX0FTU0VSVChzZWxmLT5kdHNhcF9zZWxfZGF0YSAhPSAwLCByZXR1cm4gLTE7KTsKKworCQkvKiBDaGVjayB3aGljaCBhY2Nlc3MgdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoICovCisJCXN3aXRjaCAoc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlKSB7CisJCWNhc2UgQUNDRVNTX1BFRVI6CisJCSAgICBpZiAoc2VsZi0+cHJvdmlkZXIuc3RhdGUgPT0gSVJMQU5fT1BFTikgeworCQkJICAgIAorCQkJICAgIGlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0FSQik7CisJCQkgICAgaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NIRUNLX0NPTl9BUkIsIAorCQkJCQkJICBOVUxMKTsKKwkJICAgIH0gZWxzZSB7CisJCQkKKwkJCSAgICBpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9XQUlUKTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlIEFDQ0VTU19ESVJFQ1Q6CisJCWNhc2UgQUNDRVNTX0hPU1RFRDoKKwkJCXFvcy5saW5rX2Rpc2NfdGltZS5iaXRzID0gMHgwMTsgLyogMyBzZWNzICovCisJCQkKKwkJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIAorCQkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywgCisJCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCQkKKwkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwkKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV93YWl0IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFdBSVQsIFRoZSBpcmxhbl9jbGllbnQgaXMgd2FpdGluZyBmb3IgdGhlIGxvY2FsIHByb3ZpZGVyIHRvIGVudGVyIHRoZQorICogICAgcHJvdmlkZXIgT1BFTiBzdGF0ZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX1BST1ZJREVSX1NJR05BTDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQVJCKTsKKwkJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NIRUNLX0NPTl9BUkIsIE5VTEwpOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2FyYihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9DSEVDS19DT05fQVJCOgorCQlpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9PSBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKKwkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0NMT1NFKTsKKwkJCWlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzZWxmKTsKKwkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsIDwgCisJCQkgICBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIAorCQl7CisJCQlxb3MubGlua19kaXNjX3RpbWUuYml0cyA9IDB4MDE7IC8qIDMgc2VjcyAqLworCisJCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKKwkJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIAorCQkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywgCisJCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA+CisJCQkgICBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIAorCQl7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBsb3N0IHRoZSBiYXR0bGUgOi0oXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgREFUQSwgVGhlIGRhdGEgY2hhbm5lbCBpcyBjb25uZWN0ZWQsIGFsbG93aW5nIGRhdGEgdHJhbnNmZXJzIGJldHdlZW4KKyAqICAgIHRoZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOworCQlicmVhazsJCQorCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6IC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9jbG9zZSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9zeW5jKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKKworCisKKworCisKKwo=