LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgovLyBNQVJLRVIodXBkYXRlX3ByZWNvbXAucHkpOiBhdXRvZ2VuIGluY2x1ZGUgc3RhdGVtZW50LCBkbyBub3QgcmVtb3ZlCiNpbmNsdWRlICJwcmVjb21waWxlZF9zYW1wbGUuaHh4IgojaW5jbHVkZSA8dG9vbHMvZXJyY29kZS5oeHg+CiNpbmNsdWRlIDx2Y2wvbXNnYm94Lmh4eD4KI2luY2x1ZGUgPGJhc2ljL3NieC5oeHg+CiNpbmNsdWRlICJjb2xsZWxlbS5oeHgiCgovLyBEYXMgU2FtcGxlLUVsZW1lbnQgaXN0IGVpbiBrbGVpbmVzIE9iamVrdCwgZGFzIGRpZSBQcm9wZXJ0aWVzCi8vIE5hbWUgdW5kIFZhbHVlIGVudGiEbHQgc293aWUgZGllIE1ldGhvZGUgU2F5LCBkaWUgZGVuIIFiZXJnZWJlbmVuCi8vIFRleHQgbWl0IGRlbSBlaWdlbmVuIE5hbWVuIHZlcmtvcHBlbHQgdW5kIGF1c2dpYnQuCgpTYW1wbGVFbGVtZW50OjpTYW1wbGVFbGVtZW50KCBjb25zdCBTdHJpbmcmIHIgKSA6IFNieE9iamVjdCggciApCnsKCS8vIE1ldGhvZGUgU2F5IG1pdCBlaW5lbSBTdHJpbmctUGFyYW1ldGVyCglTYnhWYXJpYWJsZSogcE1ldGggPSBNYWtlKCBTdHJpbmcoIFJUTF9DT05TVEFTQ0lJX1VTVFJJTkdQQVJBTSgiU2F5IikgKSwgU2J4Q0xBU1NfTUVUSE9ELCBTYnhFTVBUWSApOwoJcE1ldGgtPlNldFVzZXJEYXRhKCAweDEyMzQ1Njc4ICk7CglwTWV0aC0+UmVzZXRGbGFnKCBTQlhfRklYRUQgKTsKCVNieEluZm8qIHBJbmZvXyA9IG5ldyBTYnhJbmZvOwoJcEluZm9fLT5BZGRQYXJhbSggU3RyaW5nKCBSVExfQ09OU1RBU0NJSV9VU1RSSU5HUEFSQU0oInRleHQiKSApLCBTYnhTVFJJTkcsIFNCWF9SRUFEICk7CglwTWV0aC0+U2V0SW5mbyggcEluZm9fICk7Cn0KCnZvaWQgU2FtcGxlRWxlbWVudDo6U0ZYX05PVElGWSggU2Z4QnJvYWRjYXN0ZXImIHJCQywgY29uc3QgVHlwZUlkJiByQkNUeXBlLAoJCQkJCQkJCWNvbnN0IFNmeEhpbnQmIHJIaW50LCBjb25zdCBUeXBlSWQmIHJIaW50VHlwZSApCnsKCWNvbnN0IFNieEhpbnQqIHBIaW50ID0gUFRSX0NBU1QoU2J4SGludCwmckhpbnQpOwoJaWYoIHBIaW50ICkKCXsKCQlTYnhWYXJpYWJsZSogcFZhciA9IHBIaW50LT5HZXRWYXIoKTsKCQlTYnhBcnJheSogcFBhcl8gPSBwVmFyLT5HZXRQYXJhbWV0ZXJzKCk7CgkJc2FsX3VJbnRQdHIgdCA9IHBIaW50LT5HZXRJZCgpOwoJCWlmKCB0ID09IFNCWF9ISU5UX0RBVEFXQU5URUQgJiYJcFZhci0+R2V0VXNlckRhdGEoKSA9PSAweDEyMzQ1Njc4ICkKCQl7CgkJCS8vIERpZSBTYXktTWV0aG9kZToKCQkJLy8gMSBQYXJhbWV0ZXIgKyBSZXR1cm53ZXJ0CgkJCWlmKCAhcFBhcl8gfHwgcFBhcl8tPkNvdW50KCkgIT0gMiApCgkJCQlTZXRFcnJvciggU2J4RVJSX1dST05HX0FSR1MgKTsKCQkJZWxzZQoJCQl7CgkJCQlTdHJpbmcgcyggR2V0TmFtZSgpICk7CgkJCQlzLkFwcGVuZEFzY2lpKCAiIHNheXM6ICIgKTsKCQkJCXMgKz0gcFBhcl8tPkdldCggMSApLT5HZXRTdHJpbmcoKTsKCQkJCXBQYXJfLT5HZXQoIDAgKS0+U2V0VHlwZShTYnhTVFJJTkcpOwoJCQkJcFBhcl8tPkdldCggMCApLT5QdXRTdHJpbmcoIHMgKTsKCQkJCUluZm9Cb3goIE5VTEwsIHMgKS5FeGVjdXRlKCk7CgkJCX0KCQkJcmV0dXJuOwoJCX0KCQlTYnhPYmplY3Q6OlNGWF9OT1RJRlkoIHJCQywgckJDVHlwZSwgckhpbnQsIHJIaW50VHlwZSApOwoJfQp9Cg==