LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLyoqCiAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgogKi8KcHVibGljIGNsYXNzIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgewoJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX0hPU1QgPSAxOwoJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFTkRPUiA9IDI7CglwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfVkVSU0lPTiA9IDM7CgkKCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9uczsKCgkvKioKCSAqIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSkgewoJCXN1cGVyKHN0eWxlKTsKCX0KCQoJcHVibGljIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7CgkJc3VwZXIoc3R5bGUsIGZhbHNlKTsKCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwoJCQoJCWZpbGxUcmVlKCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKCQlpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMgPSBiOwoJCWZpbGxUcmVlKCk7Cgl9CgkKCXByb3RlY3RlZCB2b2lkIGZpbGxUcmVlKCkgewoJCWNsZWFuKCk7CgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCWlmIChzdHlsZSAhPSBTVFlMRV9GTEFUKSB7CgkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CgkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCWlmIChhY2NlcHRTZXJ2ZXIoc2VydmVyc1tpXSkpIHsKCQkJCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpOwoJCQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7CgkJCQkJCWludCBvcmRlciA9IGdldFNlcnZlck9yZGVyKHNlcnZlclR5cGUpOwoJCQkJCQlpZiAob3JkZXIgPiBpbml0aWFsU2VsZWN0aW9uT3JkZXIpIHsKCQkJCQkJCWluaXRpYWxTZWxlY3Rpb24gPSBzZXJ2ZXJzW2ldOwoJCQkJCQkJaW5pdGlhbFNlbGVjdGlvbk9yZGVyID0gb3JkZXI7CgkJCQkJCX0KCQkJCQkJVHJlZUVsZW1lbnQgdGUgPSBudWxsOwoJCQkJCQlpZiAoc3R5bGUgPT0gU1RZTEVfSE9TVCkgewoJCQkJCQkJdGUgPSBnZXRPckNyZWF0ZShsaXN0LCBzZXJ2ZXJzW2ldLmdldEhvc3QoKSk7CgkJCQkJCX0gZWxzZSBpZiAoc3R5bGUgPT0gU1RZTEVfVkVSU0lPTikgewoJCQkJCQkJU3RyaW5nIHZlcnNpb24gPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVsZW1lbnRVbmtub3duTmFtZSIpOwoJCQkJCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCgkJCQkJCQkJdmVyc2lvbiA9IHJ1bnRpbWVUeXBlLmdldFZlcnNpb24oKTsKCQkJCQkJCXRlID0gZ2V0T3JDcmVhdGUobGlzdCwgdmVyc2lvbik7CgkJCQkJCX0gZWxzZSBpZiAoc3R5bGUgPT0gU1RZTEVfVkVORE9SKSB7CgkJCQkJCQlTdHJpbmcgdmVuZG9yID0gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlbGVtZW50VW5rbm93bk5hbWUiKTsKCQkJCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQoJCQkJCQkJCXZlbmRvciA9IHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpOwoJCQkJCQkJdGUgPSBnZXRPckNyZWF0ZShsaXN0LCB2ZW5kb3IpOwoJCQkJCQl9CgkJCQkJCXRlLmNvbnRlbnRzLmFkZChzZXJ2ZXJzW2ldKTsKCQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChzZXJ2ZXJzW2ldLCB0ZSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQkJaWYgKGFjY2VwdFNlcnZlcihzZXJ2ZXJzW2ldKSkgewoJCQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCk7CgkJCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwoJCQkJCQlpbnQgb3JkZXIgPSBnZXRTZXJ2ZXJPcmRlcihzZXJ2ZXJUeXBlKTsKCQkJCQkJaWYgKG9yZGVyID4gaW5pdGlhbFNlbGVjdGlvbk9yZGVyKSB7CgkJCQkJCQlpbml0aWFsU2VsZWN0aW9uID0gc2VydmVyc1tpXTsKCQkJCQkJCWluaXRpYWxTZWxlY3Rpb25PcmRlciA9IG9yZGVyOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsZW1lbnRzID0gbGlzdC50b0FycmF5KCk7Cgl9CgoJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0U2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7CgkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IGxhdW5jaE1vZGUgPT0gbnVsbCkKCQkJcmV0dXJuIHRydWU7CgkJaWYgKCFTZXJ2ZXJVdGlsLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCgkJCXJldHVybiBmYWxzZTsKCQkKCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CgkJaWYgKGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucykgewoJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10LmdldElkKCksIG51bGwpKQoJCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbXQuZ2V0SWQoKSwgbXQuZ2V0VmVyc2lvbigpKSkKCQkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXByaXZhdGUgaW50IGdldFNlcnZlck9yZGVyKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKCQlyZXR1cm4gMDsKCX0KfQ==