LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRXZlbnRzTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZhY3RvcnlFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNlcnZlckFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcudHJlZS5Nb2R1bGVSZXNvdXJjZUFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcudHJlZS5TZXJ2ZXJFbGVtZW50QWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy50cmVlLlRleHRSZXNvdXJjZUFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwppbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci8qKgogKiBQcm92aWRlcyB0cmVlIGNvbnRlbnRzIGZvciBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgSVdvcmtiZW5jaEFkYXB0ZXIKICogYWRhcHRlciByZWdpc3RlcmVkLiAKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewoJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdmlld2VyOwoJCgkvLyBsaXN0ZW5lcnMKCXByb3RlY3RlZCBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcjsKCXByb3RlY3RlZCBJU2VydmVyTGlzdGVuZXIgc2VydmVyTGlzdGVuZXI7Cglwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKCXByb3RlY3RlZCBJTW9kdWxlRXZlbnRzTGlzdGVuZXIgbW9kdWxlRXZlbnRzTGlzdGVuZXI7CgkKCWNsYXNzIExpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHsKCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChmaW5hbCBJU2VydmVyIHNlcnZlcikgewoJCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwoJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CgkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkJCQkJaGFuZGxlU2VydmVyUmVzb3VyY2VBZGRlZChzZXJ2ZXIpOwoJCQkJfQoJCQl9KTsKCQl9CgkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChmaW5hbCBJU2VydmVyIHNlcnZlcikgewoJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwoJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CgkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkJCQkJaGFuZGxlU2VydmVyUmVzb3VyY2VSZW1vdmVkKHNlcnZlcik7CgkJCQl9CgkJCX0pOwoJCX0KCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7CgkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJCQloYW5kbGVTZXJ2ZXJSZXNvdXJjZUNoYW5nZWQoc2VydmVyKTsKCQkJCX0KCQkJfSk7CgkJfQoJfQoKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKCkgewoJCS8vIGFkZCBsaXN0ZW5lcnMKCQlhZGRTZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyKCk7CgkJYWRkU2VydmVyQ29uZmlndXJhdGlvbkxpc3RlbmVyKCk7CgkJYWRkTW9kdWxlRXZlbnRzTGlzdGVuZXIoKTsKCX0KCglwdWJsaWMgT2JqZWN0W10gZ2V0U2VydmVyVHJlZVJvb3RzKE9iamVjdCBwYXJlbnQpIHsKCQkvKmxvb3NlQ29uZmlnID0gZ2V0TG9vc2VDb25maWd1cmF0aW9ucygpOwoJCWlmIChsb29zZUNvbmZpZy5sZW5ndGggPT0gMCkKCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBUZXh0UmVzb3VyY2VBZGFwdGVyKHBhcmVudCwgVGV4dFJlc291cmNlQWRhcHRlci5TVFlMRV9TRVJWRVJTKSB9OwoJCWVsc2UqLwoJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IFRleHRSZXNvdXJjZUFkYXB0ZXIocGFyZW50LCBUZXh0UmVzb3VyY2VBZGFwdGVyLlNUWUxFX1NFUlZFUlMpIH07CgkJCQkvL25ldyBUZXh0UmVzb3VyY2VBZGFwdGVyKHBhcmVudCwgVGV4dFJlc291cmNlQWRhcHRlci5TVFlMRV9MT09TRV9DT05GSUdVUkFUSU9OUykgfTsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUNvbnRlbnRQcm92aWRlci4KCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQkvLyByZW1vdmUgbGlzdGVuZXJzCgkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CgkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCQkJc2VydmVyc1tpXS5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7CgkJfQoKCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKCQkKCQlpZiAobW9kdWxlRXZlbnRzTGlzdGVuZXIgIT0gbnVsbCkKCQkJU2VydmVyQ29yZS5yZW1vdmVNb2R1bGVFdmVudHNMaXN0ZW5lcihtb2R1bGVFdmVudHNMaXN0ZW5lcik7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBJV29ya2JlbmNoQWRhcHRlciBmb3IgdGhlIGdpdmVuCgkgKiBvYmplY3QuICBSZXR1cm5zIG51bGwgaWYgdGhlIGFkYXB0ZXIgaXMgbm90IGRlZmluZWQgb3IgdGhlCgkgKiBvYmplY3QgaXMgbm90IGFkYXB0YWJsZS4KCSAqLwoJcHJvdGVjdGVkIElXb3JrYmVuY2hBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pIHsKCQlpZiAoIShvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkpCgkJCXJldHVybiBudWxsOwoKCQlyZXR1cm4gKElXb3JrYmVuY2hBZGFwdGVyKSgoSUFkYXB0YWJsZSlvKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVRyZWVDb250ZW50UHJvdmlkZXIuCgkgKi8KCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewoJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGV4dFJlc291cmNlQWRhcHRlcikgewoJCQlUZXh0UmVzb3VyY2VBZGFwdGVyIGFkYXB0ZXIgPSAoVGV4dFJlc291cmNlQWRhcHRlcikgZWxlbWVudDsKCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKG51bGwpOwoJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewoJCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFNlcnZlckVsZW1lbnRBZGFwdGVyKSB7CgkJCQkJCVNlcnZlckVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIyID0gKFNlcnZlckVsZW1lbnRBZGFwdGVyKSBjaGlsZHJlbltpXTsKCQkJCQkJYWRhcHRlcjIuc2V0RmxhZ3MoKGJ5dGUpIDEpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gY2hpbGRyZW47CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlUmVzb3VyY2VBZGFwdGVyKSB7CgkJCU1vZHVsZVJlc291cmNlQWRhcHRlciBhZGFwdGVyID0gKE1vZHVsZVJlc291cmNlQWRhcHRlcikgZWxlbWVudDsKCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4obnVsbCk7CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRWxlbWVudEFkYXB0ZXIpIHsKCQkJU2VydmVyRWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IChTZXJ2ZXJFbGVtZW50QWRhcHRlcikgZWxlbWVudDsKCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKTsKCQl9CgkJCgkJSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCk7CgkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKCQkgICAgcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7CgoJCXJldHVybiBuZXcgT2JqZWN0WzBdOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuCgkgKi8KCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewoJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KTsKCX0KCQoJLyogKG5vbi1KYXZhZG9jKQoJICogTWV0aG9kIGRlY2xhcmVkIG9uIElUcmVlQ29udGVudFByb3ZpZGVyLgoJICovCglwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewoJCUlXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwoJCWlmIChhZGFwdGVyICE9IG51bGwpCgkJICAgIHJldHVybiBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKCgkJcmV0dXJuIG51bGw7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVHJlZUNvbnRlbnRQcm92aWRlci4KCSAqLwoJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKCX0KCQoJLyogKG5vbi1KYXZhZG9jKQoJICogTWV0aG9kIGRlY2xhcmVkIG9uIElDb250ZW50UHJvdmlkZXIuCgkgKi8KCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgbmV3Vmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewoJCWlmIChuZXdWaWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKQoJCQl0aGlzLnZpZXdlciA9IChUcmVlVmlld2VyKSBuZXdWaWV3ZXI7Cgl9CgkKCS8qKgoJICogQWRkIGxpc3RlbmVycyBmb3IgcmVzb3VyY2UgY2hhbmdlcy4KCSAqLwoJcHJpdmF0ZSB2b2lkIGFkZFNlcnZlckNvbmZpZ3VyYXRpb25MaXN0ZW5lcigpIHsKCQkvLyBhZGQgYSBsaXN0ZW5lciBmb3IgY29uZmlndXJhdGlvbiBjaGlsZCBtb2R1bGUgY2hhbmdlcwoJCXNlcnZlckxpc3RlbmVyID0gbmV3IFNlcnZlckFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIG1vZHVsZXNDaGFuZ2VkKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7CgkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CgkJCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJCQloYW5kbGVTZXJ2ZXJNb2R1bGVzQ2hhbmdlZChzZXJ2ZXIpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfTsKCgkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CgkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCQkJc2VydmVyc1tpXS5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7CgkJfQoJfQoJCgkvKioKCSAqIEFkZCBsaXN0ZW5lcnMgZm9yIHNlcnZlciByZXNvdXJjZSBjaGFuZ2VzLgoJICovCglwcml2YXRlIHZvaWQgYWRkU2VydmVyUmVzb3VyY2VMaXN0ZW5lcigpIHsKCQkvLyBhZGQgYSBsaXN0ZW5lciBmb3IgcmVzb3VyY2VzIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQKCQlsaXN0ZW5lciA9IG5ldyBMaWZlY3ljbGVMaXN0ZW5lcigpOwoJCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIEFkZCBsaXN0ZW5lciB0byByZWZyZXNoIHdoZW4gbW9kdWxlcyBhcmUgYWRkZWQuCgkgKi8KCXByaXZhdGUgdm9pZCBhZGRNb2R1bGVFdmVudHNMaXN0ZW5lcigpIHsKCQltb2R1bGVFdmVudHNMaXN0ZW5lciA9IG5ldyBJTW9kdWxlRXZlbnRzTGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIG1vZHVsZUV2ZW50cyhJTW9kdWxlRmFjdG9yeUV2ZW50W10gZmFjdG9yeUV2ZW50LCBJTW9kdWxlRXZlbnRbXSBldmVudCkgewoJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewoJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKQoJCQkJCQkJdmlld2VyLnJlZnJlc2godHJ1ZSk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9OwoJCQoJCVNlcnZlckNvcmUuYWRkTW9kdWxlRXZlbnRzTGlzdGVuZXIobW9kdWxlRXZlbnRzTGlzdGVuZXIpOwoJfQoKCS8qKgoJICogVXBkYXRlcyBhbiBlbGVtZW50IGluIHRoZSB0cmVlLgoJICoKCSAqIEBwYXJhbSBlbGVtZW50IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JU2VydmVyUmVzb3VyY2UKCSAqLwoJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyTW9kdWxlc0NoYW5nZWQoSVNlcnZlciBzZXJ2ZXIyKSB7CgkJaWYgKHZpZXdlciAhPSBudWxsKSB7CgkJCXZpZXdlci5yZWZyZXNoKG5ldyBTZXJ2ZXJFbGVtZW50QWRhcHRlcihudWxsLCBzZXJ2ZXIyKSk7CgkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CgkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCWlmIChzZXJ2ZXIyLmVxdWFscyhzZXJ2ZXJzW2ldKSkgewoJCQkJCQl2aWV3ZXIucmVmcmVzaChuZXcgU2VydmVyRWxlbWVudEFkYXB0ZXIobnVsbCwgc2VydmVyc1tpXSkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCQoJLyoqCgkgKiBIYW5kbGVzIHRoZSBhZGQgb2YgYSBuZXcgc2VydmVyIHJlc291cmNlLgoJICoKCSAqIEBwYXJhbSBlbGVtZW50CgkgKi8KCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQWRkZWQoT2JqZWN0IGVsZW1lbnQpIHsKCQkvL1RyYWNlLnRyYWNlKCJhZGQ6ICIgKyBlbGVtZW50KTsKCQlpZiAodmlld2VyID09IG51bGwpCgkJCXJldHVybjsKCgkJU2VydmVyRWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTZXJ2ZXJFbGVtZW50QWRhcHRlcihudWxsLCBlbGVtZW50KTsKCQlhZGFwdGVyLnNldEZsYWdzKChieXRlKSAxKTsKCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKCQkJdmlld2VyLmFkZChuZXcgVGV4dFJlc291cmNlQWRhcHRlcihudWxsLCBUZXh0UmVzb3VyY2VBZGFwdGVyLlNUWUxFX1NFUlZFUlMpLCBhZGFwdGVyKTsKCQl9Cgl9CgoJLyoqCgkgKiBVcGRhdGVzIGFuIGVsZW1lbnQgaW4gdGhlIHRyZWUuCgkgKgoJICogQHBhcmFtIGVsZW1lbnQKCSAqLwoJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSB7CgkJLy9UcmFjZS50cmFjZSgiY2hhbmdlOiAiICsgZWxlbWVudCk7CgkJaWYgKHZpZXdlciA9PSBudWxsKQoJCQlyZXR1cm47CgoJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewoJCQlTZXJ2ZXJFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IFNlcnZlckVsZW1lbnRBZGFwdGVyKG51bGwsIGVsZW1lbnQpOwoJCQlhZGFwdGVyLnNldEZsYWdzKChieXRlKSAxKTsKCQkJdmlld2VyLnJlZnJlc2goYWRhcHRlcik7CgkJfQoJfQoKCS8qKgoJICogSGFuZGxlcyB0aGUgcmVtb3ZhbCBvZiBhIHNlcnZlciByZXNvdXJjZS4KCSAqCgkgKiBAcGFyYW0gZWxlbWVudAoJICovCglwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZVJlbW92ZWQoT2JqZWN0IGVsZW1lbnQpIHsKCQkvL1RyYWNlLnRyYWNlKCJyZW1vdmU6ICIgKyBlbGVtZW50KTsKCQlpZiAodmlld2VyID09IG51bGwpCgkJCXJldHVybjsKCQkKCQlUZXh0UmVzb3VyY2VBZGFwdGVyLmRlbGV0ZWQgPSBlbGVtZW50OwoJCQoJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewoJCQkvL0lTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7CgkJCVRleHRSZXNvdXJjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXh0UmVzb3VyY2VBZGFwdGVyKG51bGwsIFRleHRSZXNvdXJjZUFkYXB0ZXIuU1RZTEVfU0VSVkVSUyk7CgkJCXZpZXdlci5yZWZyZXNoKGFkYXB0ZXIpOwoJCQkvKklTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBSZWZlcmVuY2UuZ2V0U2VydmVyQ29uZmlndXJhdGlvbkJ5UmVmKHNlcnZlci5nZXRDb25maWd1cmF0aW9uUmVmKCkpOwoJCQkKCQkJYm9vbGVhbiB1c2VkID0gZmFsc2U7CgkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyQ29yZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5nZXRTZXJ2ZXJzKCkuaXRlcmF0b3IoKTsKCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQkJSVNlcnZlciBzZXJ2ZXIyID0gKElTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKCQkJCWlmICghc2VydmVyLmVxdWFscyhzZXJ2ZXIyKSkgewoJCQkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uIGNmZyA9IFJlZmVyZW5jZS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uQnlSZWYoc2VydmVyMi5nZXRDb25maWd1cmF0aW9uUmVmKCkpOwoJCQkJCWlmIChjZmcgIT0gbnVsbCAmJiBjZmcuZXF1YWxzKGNvbmZpZ3VyYXRpb24pKSB7CgkJCQkJCXVzZWQgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoIXVzZWQpIHsKCQkJCVNlcnZlckxpZmVjeWNsZUFkYXB0ZXIgYWRhcHRlcjIgPSBuZXcgU2VydmVyTGlmZWN5Y2xlQWRhcHRlcihudWxsLCBjb25maWd1cmF0aW9uKTsKCQkJCWFkYXB0ZXIyLnNldEZsYWdzKChieXRlKSAxKTsKCQkJCXZpZXdlci5hZGQobmV3IFRleHRSZXNvdXJjZUFkYXB0ZXIobnVsbCwgVGV4dFJlc291cmNlQWRhcHRlci5TVFlMRV9MT09TRV9DT05GSUdVUkFUSU9OUyksIGFkYXB0ZXIyKTsKCQkJfSovCgkJfQoJfQp9