LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fcHJvdmlkZXJfZXZlbnQuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJMQU4gcHJvdmlkZXIgc3RhdGUgbWFjaGluZSkKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgT2N0IDMwIDEyOjUyOjQxIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9wcm92aWRlci5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KCnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaWRsZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfb3BlbihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfZGF0YShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgpzdGF0aWMgaW50ICgqc3RhdGVbXSkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgPSAKeyAKCWlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUsCglOVUxMLCAvKiBRdWVyeSAqLwoJTlVMTCwgLyogSW5mbyAqLwoJaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbywKCU5VTEwsIC8qIE1lZGlhICovCglpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuLAoJTlVMTCwgLyogV2FpdCAqLwoJTlVMTCwgLyogQXJiICovCglpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhLAoJTlVMTCwgLyogQ2xvc2UgKi8KCU5VTEwsIC8qIFN5bmMgKi8KfTsKCnZvaWQgaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfQVNTRVJUKCpzdGF0ZVsgc2VsZi0+cHJvdmlkZXIuc3RhdGVdICE9IE5VTEwsIHJldHVybjspOwoKCSgqc3RhdGVbc2VsZi0+cHJvdmlkZXIuc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUgKGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIElETEUsIFdlIGFyZSB3YWl0aW5nIGZvciBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlcmUgaXMgYSBwcm92aWRlcgogKiAgICBhdmFpbGFibGUuCiAqLwpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkKCXN3aXRjaChldmVudCkgewoJY2FzZSBJUkxBTl9DT05ORUNUX0lORElDQVRJT046CgkgICAgIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfcmVzcG9uc2UoIHNlbGYsIHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCk7CgkgICAgIGlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoIHNlbGYsIElSTEFOX0lORk8pOwoJICAgICBicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8gKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIElORk8sIFdlIGhhdmUgaXNzdWVkIGEgR2V0SW5mbyBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5LgogKi8Kc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJaW50IHJldDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fR0VUX0lORk9fQ01EOgoJCS8qIEJlIHN1cmUgdG8gdXNlIDgwMi4zIGluIGNhc2Ugb2YgcGVlciBtb2RlICovCgkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CgkJCXNlbGYtPm1lZGlhID0gTUVESUFfODAyXzM7CgkJCQoJCQkvKiBDaGVjayBpZiBjbGllbnQgaGFzIHN0YXJ0ZWQgeWV0ICovCgkJCWlmIChzZWxmLT5jbGllbnQuc3RhdGUgPT0gSVJMQU5fSURMRSkgewoJCQkJLyogVGhpcyBzaG91bGQgZ2V0IHRoZSBjbGllbnQgZ29pbmcgKi8KCQkJCWlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KDgpOwoJCQl9CgkJfQoKCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9HRVRfUFJPVklERVJfSU5GTywgCgkJCQkJICBSU1BfU1VDQ0VTUyk7CgkJLyogS2VlcCBzdGF0ZSAqLwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9HRVRfTUVESUFfQ01EOiAKCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9HRVRfTUVESUFfQ0hBUiwgCgkJCQkJICBSU1BfU1VDQ0VTUyk7CgkJLyogS2VlcCBzdGF0ZSAqLwoJCWJyZWFrOwkJCgljYXNlIElSTEFOX09QRU5fREFUQV9DTUQ6CgkJcmV0ID0gaXJsYW5fcGFyc2Vfb3Blbl9kYXRhX2NtZChzZWxmLCBza2IpOwoJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgewoJCQkvKiBGSVhNRTogbWFrZSB1c2Ugb2YgcmFuZG9tIGZ1bmN0aW9ucyEgKi8KCQkJc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsID0gKGppZmZpZXMgJiAweGZmZmYpOwoJCX0KCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9PUEVOX0RBVEFfQ0hBTk5FTCwgcmV0KTsKCgkJaWYgKHJldCA9PSBSU1BfU1VDQ0VTUykgewoJCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOwoKCQkJLyogU2lnbmFsIGNsaWVudCB0aGF0IHdlIGFyZSBub3cgb3BlbiAqLwoJCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fUFJPVklERVJfU0lHTkFMLCBOVUxMKTsKCQl9CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAgLyogRkFMTFRIUk9VR0ggKi8KCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRyggMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc3RhdGVfb3BlbiAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgT1BFTiwgVGhlIGNsaWVudCBoYXMgaXNzdWVkIGEgT3BlbkRhdGEgY29tbWFuZCBhbmQgaXMgYXdhaXRpbmcgYQogKiAgICByZXBseQogKgogKi8Kc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXN3aXRjaChldmVudCkgewoJY2FzZSBJUkxBTl9GSUxURVJfQ09ORklHX0NNRDoKCQlpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLCBza2IpOwoJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIAoJCQkJCSAgUlNQX1NVQ0NFU1MpOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT046IAoJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CgkJaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZShzZWxmLCBzZWxmLT50c2FwX2RhdGEpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDogIC8qIEZBTExUSFJPVUdIICovCgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBEQVRBLCBUaGUgZGF0YSBjaGFubmVsIGlzIGNvbm5lY3RlZCwgYWxsb3dpbmcgZGF0YSB0cmFuc2ZlcnMgYmV0d2VlbgogKiAgICB0aGUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfZGF0YShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0ZJTFRFUl9DT05GSUdfQ01EOgoJCWlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIHNrYik7CgkJaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseShzZWxmLCBDTURfRklMVEVSX09QRVJBVElPTiwgCgkJCQkJICBSU1BfU1VDQ0VTUyk7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAvKiBGQUxMVEhST1VHSCAqLwoJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkKCXJldHVybiAwOwp9CgoKCgoKCgoKCgo=