LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9maWx0ZXIuYwogKiBWZXJzaW9uOgogKiBEZXNjcmlwdGlvbjoKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBKYW4gMjkgMTE6MTY6MzggMTk5OQogKiBNb2RpZmllZCBhdDogICBTYXQgT2N0IDMwIDEyOjU4OjQ1IDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZmlsdGVyLmg+CgovKgogKiBGdW5jdGlvbiBpcmxhbl9maWx0ZXJfcmVxdWVzdCAoc2VsZiwgc2tiKQogKgogKiAgICBIYW5kbGUgZmlsdGVyIHJlcXVlc3QgZnJvbSBjbGllbnQgcGVlciBkZXZpY2UKICoKICovCnZvaWQgaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPT0gRFlOQU1JQykpCgl7CgkJSVJEQV9ERUJVRygwLCAiR2l2aW5nIHBlZXIgYSBkeW5hbWljIEV0aGVybmV0IGFkZHJlc3NcbiIpOwoJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzBdID0gMHg0MDsKCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1sxXSA9IDB4MDA7CgkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbMl0gPSAweDAwOwoJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzNdID0gMHgwMDsKCgkJLyogVXNlIGFyYml0cmF0aW9uIHZhbHVlIHRvIGdlbmVyYXRlIE1BQyBhZGRyZXNzICovCgkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CgkJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzRdID0KCQkJCXNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCAmIDB4ZmY7CgkJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzVdID0KCQkJCShzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwgPj4gOCkgJiAweGZmOwoJCX0gZWxzZSB7CgkJCS8qIEp1c3QgZ2VuZXJhdGUgc29tZXRoaW5nIGZvciBub3cgKi8KCQkJZ2V0X3JhbmRvbV9ieXRlcyhzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzcys0LCAxKTsKCQkJZ2V0X3JhbmRvbV9ieXRlcyhzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzcys1LCAxKTsKCQl9CgoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAzOwoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOwoJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJNQVhfRU5UUlkiLCAweDAwMDEpOwoJCWlybGFuX2luc2VydF9hcnJheV9wYXJhbShza2IsICJGSUxURVJfRU5UUlkiLAoJCQkJCSBzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzcywgNik7CgkJcmV0dXJuOwoJfQoKCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCgl7CgkJSVJEQV9ERUJVRygwLCAiRGlyZWN0ZWQgZmlsdGVyIG9uXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0RJUkVDVEVEKSAmJgoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBOT05FKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJEaXJlY3RlZCBmaWx0ZXIgb2ZmXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CgoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9CUk9BRENBU1QpICYmCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCgl7CgkJSVJEQV9ERUJVRygwLCAiQnJvYWRjYXN0IGZpbHRlciBvblxuIik7CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CgkJcmV0dXJuOwoJfQoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9CUk9BRENBU1QpICYmCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQoJewoJCUlSREFfREVCVUcoMCwgIkJyb2FkY2FzdCBmaWx0ZXIgb2ZmXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX01VTFRJQ0FTVCkgJiYKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gRklMVEVSKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIG9uXG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMDsKCQlyZXR1cm47Cgl9CglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX01VTFRJQ0FTVCkgJiYKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gTk9ORSkpCgl7CgkJSVJEQV9ERUJVRygwLCAiTXVsdGljYXN0IGZpbHRlciBvZmZcbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJgoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID09IEdFVCkpCgl7CgkJSVJEQV9ERUJVRygwLCAiTXVsdGljYXN0IGZpbHRlciBnZXRcbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3M/ICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMjsKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsKCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiTUFYX0VOVFJZIiwgMTYpOwoJCXJldHVybjsKCX0KCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIENvbW1hbmQgbm90IHN1cHBvcnRlZCAqLwoJc2tiLT5kYXRhWzFdID0gMHgwMDsKCglJUkRBX0RFQlVHKDAsICJOb3QgaW1wbGVtZW50ZWQhXG4iKTsKfQoKLyoKICogRnVuY3Rpb24gY2hlY2tfcmVxdWVzdF9wYXJhbSAoc2VsZiwgcGFyYW0sIHZhbHVlKQogKgogKiAgICBDaGVjayBwYXJhbWV0ZXJzIGluIHJlcXVlc3QgZnJvbSBwZWVyIGRldmljZQogKgogKi8Kdm9pZCBpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIGNoYXIgKnZhbHVlKQp7CglfX3U4ICpieXRlczsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglieXRlcyA9IHZhbHVlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9ERUJVRyg0LCAiJXMsICVzXG4iLCBwYXJhbSwgdmFsdWUpOwoKCS8qCgkgKiAgVGhpcyBpcyBleHBlcmltZW50YWwhISBEQi4KCSAqLwoJIGlmIChzdHJjbXAocGFyYW0sICJNT0RFIikgPT0gMCkgewoJCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXNlbGYtPnVzZV91ZGF0YSA9IFRSVUU7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiAgRklMVEVSX1RZUEUKCSAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9UWVBFIikgPT0gMCkgewoJCWlmIChzdHJjbXAodmFsdWUsICJESVJFQ1RFRCIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPSBJUkxBTl9ESVJFQ1RFRDsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc3RyY21wKHZhbHVlLCAiTVVMVElDQVNUIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9IElSTEFOX01VTFRJQ0FTVDsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc3RyY21wKHZhbHVlLCAiQlJPQURDQVNUIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9IElSTEFOX0JST0FEQ0FTVDsKCQkJcmV0dXJuOwoJCX0KCX0KCS8qCgkgKiAgRklMVEVSX01PREUKCSAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9NT0RFIikgPT0gMCkgewoJCWlmIChzdHJjbXAodmFsdWUsICJBTEwiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gQUxMOwoJCQlyZXR1cm47CgkJfQoJCWlmIChzdHJjbXAodmFsdWUsICJGSUxURVIiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gRklMVEVSOwoJCQlyZXR1cm47CgkJfQoJCWlmIChzdHJjbXAodmFsdWUsICJOT05FIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9IEZJTFRFUjsKCQkJcmV0dXJuOwoJCX0KCX0KCS8qCgkgKiAgRklMVEVSX09QRVJBVElPTgoJICovCglpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX09QRVJBVElPTiIpID09IDApIHsKCQlpZiAoc3RyY21wKHZhbHVlLCAiRFlOQU1JQyIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9IERZTkFNSUM7CgkJCXJldHVybjsKCQl9CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkdFVCIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9IEdFVDsKCQkJcmV0dXJuOwoJCX0KCX0KfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJpbnRfZmlsdGVyIChmaWx0ZXJfdHlwZSwgYnVmKQogKgogKiAgICBQcmludCBzdGF0dXMgb2YgZmlsdGVyLiBVc2VkIGJ5IC9wcm9jIGZpbGUgc3lzdGVtCiAqCiAqLwojaWZkZWYgQ09ORklHX1BST0NfRlMKI2RlZmluZSBNQVNLMlNUUihtLHMpCXsgLm1hc2sgPSBtLCAuc3RyID0gcyB9Cgp2b2lkIGlybGFuX3ByaW50X2ZpbHRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IGZpbHRlcl90eXBlKQp7CglzdGF0aWMgc3RydWN0IHsKCQlpbnQgbWFzazsKCQljb25zdCBjaGFyICpzdHI7Cgl9IGZpbHRlcl9tYXNrMnN0cltdID0gewoJCU1BU0syU1RSKElSTEFOX0RJUkVDVEVELAkiRElSRUNURUQiKSwKCQlNQVNLMlNUUihJUkxBTl9GVU5DVElPTkFMLAkiRlVOQ1RJT05BTCIpLAoJCU1BU0syU1RSKElSTEFOX0dST1VQLAkJIkdST1VQIiksCgkJTUFTSzJTVFIoSVJMQU5fTUFDX0ZSQU1FLAkiTUFDX0ZSQU1FIiksCgkJTUFTSzJTVFIoSVJMQU5fTVVMVElDQVNULAkiTVVMVElDQVNUIiksCgkJTUFTSzJTVFIoSVJMQU5fQlJPQURDQVNULAkiQlJPQURDQVNUIiksCgkJTUFTSzJTVFIoSVJMQU5fSVBYX1NPQ0tFVCwJIklQWF9TT0NLRVQiKSwKCQlNQVNLMlNUUigwLAkJCU5VTEwpCgl9LCAqcDsKCglmb3IgKHAgPSBmaWx0ZXJfbWFzazJzdHI7IHAtPnN0cjsgcCsrKSB7CgkJaWYgKGZpbHRlcl90eXBlICYgcC0+bWFzaykKCQkJc2VxX3ByaW50ZihzZXEsICIlcyAiLCBwLT5zdHIpOwoJfQoJc2VxX3B1dGMoc2VxLCAnXG4nKTsKfQojdW5kZWYgTUFTSzJTVFIKI2VuZGlmCg==