LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9wcm92aWRlcl9ldmVudC5jCiAqIFZlcnNpb246ICAgICAgIDAuOQogKiBEZXNjcmlwdGlvbjogICBJckxBTiBwcm92aWRlciBzdGF0ZSBtYWNoaW5lKQogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTI6NDEgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CgpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2RhdGEoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgpzdGF0aWMgaW50ICgqc3RhdGVbXSkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSA9CnsKCWlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUsCglOVUxMLCAvKiBRdWVyeSAqLwoJTlVMTCwgLyogSW5mbyAqLwoJaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbywKCU5VTEwsIC8qIE1lZGlhICovCglpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuLAoJTlVMTCwgLyogV2FpdCAqLwoJTlVMTCwgLyogQXJiICovCglpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhLAoJTlVMTCwgLyogQ2xvc2UgKi8KCU5VTEwsIC8qIFN5bmMgKi8KfTsKCnZvaWQgaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVCgqc3RhdGVbIHNlbGYtPnByb3ZpZGVyLnN0YXRlXSAhPSBOVUxMLCByZXR1cm47KTsKCgkoKnN0YXRlW3NlbGYtPnByb3ZpZGVyLnN0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pZGxlIChldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBJRExFLCBXZSBhcmUgd2FpdGluZyBmb3IgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGEgcHJvdmlkZXIKICogICAgYXZhaWxhYmxlLgogKi8Kc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pZGxlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0NPTk5FQ1RfSU5ESUNBVElPTjoKCSAgICAgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZSggc2VsZiwgc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKCSAgICAgaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZSggc2VsZiwgSVJMQU5fSU5GTyk7CgkgICAgIGJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbyAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgSU5GTywgV2UgaGF2ZSBpc3N1ZWQgYSBHZXRJbmZvIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEgcmVwbHkuCiAqLwpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJaW50IHJldDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXN3aXRjaChldmVudCkgewoJY2FzZSBJUkxBTl9HRVRfSU5GT19DTUQ6CgkJLyogQmUgc3VyZSB0byB1c2UgODAyLjMgaW4gY2FzZSBvZiBwZWVyIG1vZGUgKi8KCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpIHsKCQkJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfMzsKCgkJCS8qIENoZWNrIGlmIGNsaWVudCBoYXMgc3RhcnRlZCB5ZXQgKi8KCQkJaWYgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSB7CgkJCQkvKiBUaGlzIHNob3VsZCBnZXQgdGhlIGNsaWVudCBnb2luZyAqLwoJCQkJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoOCk7CgkJCX0KCQl9CgoJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0dFVF9QUk9WSURFUl9JTkZPLAoJCQkJCSAgUlNQX1NVQ0NFU1MpOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgSVJMQU5fR0VUX01FRElBX0NNRDoKCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9HRVRfTUVESUFfQ0hBUiwKCQkJCQkgIFJTUF9TVUNDRVNTKTsKCQkvKiBLZWVwIHN0YXRlICovCgkJYnJlYWs7CgljYXNlIElSTEFOX09QRU5fREFUQV9DTUQ6CgkJcmV0ID0gaXJsYW5fcGFyc2Vfb3Blbl9kYXRhX2NtZChzZWxmLCBza2IpOwoJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgewoJCQkvKiBGSVhNRTogbWFrZSB1c2Ugb2YgcmFuZG9tIGZ1bmN0aW9ucyEgKi8KCQkJc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsID0gKGppZmZpZXMgJiAweGZmZmYpOwoJCX0KCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9PUEVOX0RBVEFfQ0hBTk5FTCwgcmV0KTsKCgkJaWYgKHJldCA9PSBSU1BfU1VDQ0VTUykgewoJCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOwoKCQkJLyogU2lnbmFsIGNsaWVudCB0aGF0IHdlIGFyZSBub3cgb3BlbiAqLwoJCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fUFJPVklERVJfU0lHTkFMLCBOVUxMKTsKCQl9CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAgLyogRkFMTFRIUk9VR0ggKi8KCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRyggMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBPUEVOLCBUaGUgY2xpZW50IGhhcyBpc3N1ZWQgYSBPcGVuRGF0YSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCiAqICAgIHJlcGx5CiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX29wZW4oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQ6CgkJaXJsYW5fcHJvdmlkZXJfcGFyc2VfY29tbWFuZChzZWxmLCBDTURfRklMVEVSX09QRVJBVElPTiwgc2tiKTsKCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLAoJCQkJCSAgUlNQX1NVQ0NFU1MpOwoJCS8qIEtlZXAgc3RhdGUgKi8KCQlicmVhazsKCWNhc2UgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT046CgkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKCQlpcmxhbl9wcm92aWRlcl9jb25uZWN0X3Jlc3BvbnNlKHNlbGYsIHNlbGYtPnRzYXBfZGF0YSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAgLyogRkFMTFRIUk9VR0ggKi8KCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2RhdGEgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIERBVEEsIFRoZSBkYXRhIGNoYW5uZWwgaXMgY29ubmVjdGVkLCBhbGxvd2luZyBkYXRhIHRyYW5zZmVycyBiZXR3ZWVuCiAqICAgIHRoZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgogKgogKi8Kc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0ZJTFRFUl9DT05GSUdfQ01EOgoJCWlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIHNrYik7CgkJaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseShzZWxmLCBDTURfRklMVEVSX09QRVJBVElPTiwKCQkJCQkgIFJTUF9TVUNDRVNTKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6IC8qIEZBTExUSFJPVUdIICovCgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoIDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKCgoKCgoKCgoK