LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLklUb21jYXRSdW50aW1lOwoKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFRvbWNhdFJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIgewoJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlJVG9tY2F0UnVudGltZSB0b21jYXRSdW50aW1lID0gKElUb21jYXRSdW50aW1lKSBydW50aW1lLmdldEFkYXB0ZXIoSVRvbWNhdFJ1bnRpbWUuY2xhc3MpOwoJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gdG9tY2F0UnVudGltZS5nZXRWTUluc3RhbGwoKTsKCQlpZiAodm1JbnN0YWxsICE9IG51bGwpIHsKCQkJU3RyaW5nIG5hbWUgPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwoJCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikuYXBwZW5kKCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUiKS5hcHBlbmQobmFtZSkpIH07CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc3BhdGhFbnRyeUlkcyhJUnVudGltZSBydW50aW1lKSB7CgkJcmV0dXJuIG5ldyBTdHJpbmdbMV07Cgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBsYWJlbCBmb3IgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCgkgKiAgCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKSB7CgkJU3RyaW5nIGlkMiA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwoJCWlmIChpZDIuaW5kZXhPZigiMzIiKSA+IDApCgkJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiV0YXJnZXQzMnJ1bnRpbWUiKTsKCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNDAiKSA+IDApCgkJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiV0YXJnZXQ0MHJ1bnRpbWUiKTsKCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNDEiKSA+IDApCgkJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiV0YXJnZXQ0MXJ1bnRpbWUiKTsKCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNTAiKSA+IDApCgkJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiV0YXJnZXQ1MHJ1bnRpbWUiKTsKCQkKCQlyZXR1cm4gVG9tY2F0UGx1Z2luLmdldFJlc291cmNlKCIldGFyZ2V0NTVydW50aW1lIik7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyCgkgKi8KCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCkgewoJCXJldHVybiByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKHJ1bnRpbWUpOwoJfQoKCS8qKgoJICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGVudHJpZXMuCgkgKi8KCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUpIHsKCQlJUGF0aCBpbnN0YWxsUGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKCQkKCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CgkJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5pbmRleE9mKCIzMiIpID4gMCkgewoJCQlJUGF0aCBwYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKTsKCQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgcGF0aC50b0ZpbGUoKSwgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJSVBhdGggcGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgiY29tbW9uIik7CgkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGguYXBwZW5kKCJsaWIiKS50b0ZpbGUoKSwgdHJ1ZSk7CgkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGguYXBwZW5kKCJlbmRvcnNlZCIpLnRvRmlsZSgpLCB0cnVlKTsKCQl9CgkJcmV0dXJuIHJlc29sdmVMaXN0KGxpc3QpOwoJfQp9