LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7CgoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUkk7CmltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwovKioKICogQGF1dGhvciBOYWNpIERhaSAKICovCnB1YmxpYyBjbGFzcyBYTUxVdGlscyB7CgkKCUFycmF5TGlzdCBkZWZpbml0aW9uczsKCUZpbGUgc291cmNlRGlyOwoJCglwdWJsaWMgWE1MVXRpbHMoVVJMIGluc3RhbGxVcmwpCgl7CgkJU3RyaW5nIHNlcnZlcnNQYXRoID0gaW5zdGFsbFVybC5nZXRQYXRoKCkrIi9zZXJ2ZXJzIjsKCQlVUkkgdXJpOwoJCXRyeSB7CgkJCXVyaSA9IG5ldyBVUkkoaW5zdGFsbFVybC5nZXRQcm90b2NvbCgpLGluc3RhbGxVcmwuZ2V0SG9zdCgpLHNlcnZlcnNQYXRoLGluc3RhbGxVcmwuZ2V0UXVlcnkoKSk7CgkJCXNvdXJjZURpciA9IG5ldyBGaWxlKHVyaSk7CgkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0KCQkKCQlyZWZyZXNoKCk7Cgl9CgkKCQoJcHVibGljIHZvaWQgcmVmcmVzaCgpCgl7CgkJZGVmaW5pdGlvbnMgPSBzY2FuRmlsZXMoc291cmNlRGlyKTsKCX0KCXB1YmxpYyB2b2lkIHVwZGF0ZShTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBlbGVtZW50KQoJewoJCXRvRmlsZShlbGVtZW50KTsKCX0JCgkKCXB1YmxpYyB2b2lkIHVwZGF0ZSgpCgl7CgkJSXRlcmF0b3IgZGVmcyA9IGRlZmluaXRpb25zLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGRlZnMuaGFzTmV4dCgpKSB7CgkJCVNlcnZlclR5cGVEZWZpbml0aW9uIGVsZW1lbnQgPSAoU2VydmVyVHlwZURlZmluaXRpb24pIGRlZnMubmV4dCgpOwoJCQl1cGRhdGUoZWxlbWVudCk7CgkJfQoJfQoJCglwcml2YXRlIHZvaWQgdG9GaWxlKFNlcnZlclR5cGVEZWZpbml0aW9uIGRlZikKCXsKCQl0cnkgewoJCQlkZWYuZ2V0RGVmaW5pdGlvbkZpbGUoKS5yZW5hbWVUbyhuZXcgRmlsZShkZWYuZ2V0RGVmaW5pdGlvbkZpbGUoKS5nZXRDYW5vbmljYWxGaWxlKCkrIi5iYWsiKSk7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCX0KCQkKCQl0cnkgewoJCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlZi5nZXREZWZpbml0aW9uRmlsZSgpKTsKCQkJb3V0LndyaXRlKGRlZi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwoJCQlvdXQuY2xvc2UoKTsKCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQl9Cgl9Cglwcml2YXRlICBBcnJheUxpc3Qgc2NhbkZpbGVzKEZpbGUgZGlyKQoJewoJCUFycmF5TGlzdCBhbGwgPSBuZXcgQXJyYXlMaXN0KCk7CgkJdHJ5IHsKCQkJaWYoZGlyLmlzRGlyZWN0b3J5KCkpewoJCQkJRmlsZVtdIGFsbFNlcnZlcnMgPSBkaXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpewoJCQkJCS8qIChub24tSmF2YWRvYykKCQkJCQkgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKCQkJCQkgKi8KCQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CgkJCQkJCWlmKG5hbWUuZW5kc1dpdGgoIi5zZXJ2ZXIiKSkKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkKCQkJCX0pOwoJCQkJCgkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlcnZlcnMubGVuZ3RoOyBpKyspIHsKCQkJCQlGaWxlIGZpbGUgPSBhbGxTZXJ2ZXJzW2ldOwoJCQkJCVNlcnZlclR5cGVEZWZpbml0aW9uIGRlZiA9IFhNTFJlYWRlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKCQkJCQlpZihkZWYgIT0gbnVsbCl7CgkJCQkJCWRlZi5zZXREZWZpbml0aW9uRmlsZShmaWxlKTsKCQkJCQkJYWxsLmFkZChkZWYpOwoJCQkJCX0KCQkJCQoJCQkJfQoJCQl9CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCX0KCQkKCQlyZXR1cm4gYWxsOwoJfQoKCS8qKgoJICogQHJldHVybiBBcnJheUxpc3QKCSAqLwoJcHVibGljIEFycmF5TGlzdCBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKSB7CgkJcmV0dXJuIGRlZmluaXRpb25zOwoJfQoKCS8qKgoJICogQHJldHVybiBBcnJheUxpc3QKCSAqLwoJcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uIGdldFNlcnZlclR5cGVEZWZpbml0aW9uTmFtZWQoU3RyaW5nIG5hbWUpIHsKCQlyZWZyZXNoKCk7CgkJSXRlcmF0b3IgZGVmcyA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGRlZnMuaGFzTmV4dCgpKSB7CgkJCVNlcnZlclR5cGVEZWZpbml0aW9uIGVsZW0gPSAoU2VydmVyVHlwZURlZmluaXRpb24pIGRlZnMubmV4dCgpOwoJCQlpZihuYW1lLmVxdWFscyhlbGVtLmdldE5hbWUoKSkpCgkJCQlyZXR1cm4gZWxlbTsJCQkKCQl9CQkKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGRlZmluaXRpb25zLgoJICogQHBhcmFtIGRlZmluaXRpb25zIFRoZSBkZWZpbml0aW9ucyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbnMoQXJyYXlMaXN0IGRlZmluaXRpb25zKSB7CgkJdGhpcy5kZWZpbml0aW9ucyA9IGRlZmluaXRpb25zOwoJfQoKfQo=