LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEdlbmVyYXRlZCB3aXRoIEFjY2VsZW8KICovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLmNvbXBvbmVudHM7CgovLyBTdGFydCBvZiB1c2VyIGNvZGUgZm9yIGltcG9ydHMKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LkVTdHJ1Y3R1cmFsRmVhdHVyZU5vdGlmaWNhdGlvbkZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LklQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuTm90aWZpY2F0aW9uRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuUHJvcGVydGllc0VkaXRpbmdDb250ZXh0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuaW1wbC5FT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TaW5nbGVQYXJ0UHJvcGVydGllc0VkaXRpbmdDb21wb25lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5ub3RpZnkuUHJvcGVydGllc0VkaXRpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLnV0aWxzLkVFRkNvbnZlcnRlclV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC51dGlscy5FRUZVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wb2xpY2llcy5Qcm9wZXJ0aWVzRWRpdGluZ1BvbGljeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wcm92aWRlcnMuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS51aS53aWRnZXRzLkJ1dHRvbnNNb2RlRW51bTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS51aS53aWRnZXRzLmVvYmpmbGF0Y29tYm8uRU9iamVjdEZsYXRDb21ib1NldHRpbmdzOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmluZnJhLmdlbmVyYWwuZ2VuZXJhbC5SZXF1aXJlbWVudFJlbEtpbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZVJlcXVpcmVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VSZXF1aXJlbWVudFJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlbGluZUZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZWxpbmVQYWNrYWdlOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLnBhcnRzLkJhc2VSZXF1aXJlbWVudFJlbFByb3BlcnRpZXNFZGl0aW9uUGFydDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5wYXJ0cy5CYXNlbGluZVZpZXdzUmVwb3NpdG9yeTsKCgovLyBFbmQgb2YgdXNlciBjb2RlCgovKioKICogCiAqIAogKi8KcHVibGljIGNsYXNzIEJhc2VSZXF1aXJlbWVudFJlbFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50IGV4dGVuZHMgU2luZ2xlUGFydFByb3BlcnRpZXNFZGl0aW5nQ29tcG9uZW50IHsKCgkKCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJBU0VfUEFSVCA9ICJCYXNlIjsgLy8kTk9OLU5MUy0xJAoKCQoJLyoqCgkgKiBTZXR0aW5ncyBmb3IgdGFyZ2V0IEVPYmplY3RGbGF0Q29tYm9WaWV3ZXIKCSAqLwoJcHJpdmF0ZSBFT2JqZWN0RmxhdENvbWJvU2V0dGluZ3MgdGFyZ2V0U2V0dGluZ3M7CgkKCS8qKgoJICogU2V0dGluZ3MgZm9yIHNvdXJjZSBFT2JqZWN0RmxhdENvbWJvVmlld2VyCgkgKi8KCXByaXZhdGUgRU9iamVjdEZsYXRDb21ib1NldHRpbmdzIHNvdXJjZVNldHRpbmdzOwoJCgkKCS8qKgoJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgoJICogCgkgKi8KCXB1YmxpYyBCYXNlUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudChQcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQgZWRpdGluZ0NvbnRleHQsIEVPYmplY3QgYmFzZVJlcXVpcmVtZW50UmVsLCBTdHJpbmcgZWRpdGluZ19tb2RlKSB7CgkJc3VwZXIoZWRpdGluZ0NvbnRleHQsIGJhc2VSZXF1aXJlbWVudFJlbCwgZWRpdGluZ19tb2RlKTsKCQlwYXJ0cyA9IG5ldyBTdHJpbmdbXSB7IEJBU0VfUEFSVCB9OwoJCXJlcG9zaXRvcnlLZXkgPSBCYXNlbGluZVZpZXdzUmVwb3NpdG9yeS5jbGFzczsKCQlwYXJ0S2V5ID0gQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLmNsYXNzOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkuY29tcG9uZW50LklQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCNpbml0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCAKCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQoJICogCgkgKi8KCXB1YmxpYyB2b2lkIGluaXRQYXJ0KE9iamVjdCBrZXksIGludCBraW5kLCBFT2JqZWN0IGVsdCwgUmVzb3VyY2VTZXQgYWxsUmVzb3VyY2UpIHsKCQlzZXRJbml0aWFsaXppbmcodHJ1ZSk7CgkJaWYgKGVkaXRpbmdQYXJ0ICE9IG51bGwgJiYga2V5ID09IHBhcnRLZXkpIHsKCQkJZWRpdGluZ1BhcnQuc2V0Q29udGV4dChlbHQsIGFsbFJlc291cmNlKTsKCQkJCgkJCWZpbmFsIEJhc2VSZXF1aXJlbWVudFJlbCBiYXNlUmVxdWlyZW1lbnRSZWwgPSAoQmFzZVJlcXVpcmVtZW50UmVsKWVsdDsKCQkJZmluYWwgQmFzZVJlcXVpcmVtZW50UmVsUHJvcGVydGllc0VkaXRpb25QYXJ0IGJhc2VQYXJ0ID0gKEJhc2VSZXF1aXJlbWVudFJlbFByb3BlcnRpZXNFZGl0aW9uUGFydCllZGl0aW5nUGFydDsKCQkJLy8gaW5pdCB2YWx1ZXMKCQkJaWYgKGlzQWNjZXNzaWJsZShCYXNlbGluZVZpZXdzUmVwb3NpdG9yeS5CYXNlUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy50YXJnZXQpKSB7CgkJCQkvLyBpbml0IHBhcnQKCQkJCXRhcmdldFNldHRpbmdzID0gbmV3IEVPYmplY3RGbGF0Q29tYm9TZXR0aW5ncyhiYXNlUmVxdWlyZW1lbnRSZWwsIEJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZVJlcXVpcmVtZW50UmVsX1RhcmdldCgpKTsKCQkJCWJhc2VQYXJ0LmluaXRUYXJnZXQodGFyZ2V0U2V0dGluZ3MpOwoJCQkJLy8gc2V0IHRoZSBidXR0b24gbW9kZQoJCQkJYmFzZVBhcnQuc2V0VGFyZ2V0QnV0dG9uTW9kZShCdXR0b25zTW9kZUVudW0uQlJPV1NFKTsKCQkJfQoJCQlpZiAoaXNBY2Nlc3NpYmxlKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnNvdXJjZSkpIHsKCQkJCS8vIGluaXQgcGFydAoJCQkJc291cmNlU2V0dGluZ3MgPSBuZXcgRU9iamVjdEZsYXRDb21ib1NldHRpbmdzKGJhc2VSZXF1aXJlbWVudFJlbCwgQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfU291cmNlKCkpOwoJCQkJYmFzZVBhcnQuaW5pdFNvdXJjZShzb3VyY2VTZXR0aW5ncyk7CgkJCQkvLyBzZXQgdGhlIGJ1dHRvbiBtb2RlCgkJCQliYXNlUGFydC5zZXRTb3VyY2VCdXR0b25Nb2RlKEJ1dHRvbnNNb2RlRW51bS5CUk9XU0UpOwoJCQl9CgkJCWlmIChpc0FjY2Vzc2libGUoQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudHlwZSkpIHsKCQkJCWJhc2VQYXJ0LmluaXRUeXBlKEVFRlV0aWxzLmNob2ljZU9mVmFsdWVzKGJhc2VSZXF1aXJlbWVudFJlbCwgQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfVHlwZSgpKSwgYmFzZVJlcXVpcmVtZW50UmVsLmdldFR5cGUoKSk7CgkJCX0KCQkJLy8gaW5pdCBmaWx0ZXJzCgkJCWlmIChpc0FjY2Vzc2libGUoQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0KSkgewoJCQkJYmFzZVBhcnQuYWRkRmlsdGVyVG9UYXJnZXQobmV3IFZpZXdlckZpbHRlcigpIHsKCQkJCQoJCQkJCS8qKgoJCQkJCSAqIHtAaW5oZXJpdERvY30KCQkJCQkgKiAKCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyI3NlbGVjdChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKCQkJCQkgKi8KCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7CgkJCQkJCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIEJhc2VSZXF1aXJlbWVudCk7CgkJCQkJfQoJCQkJCQoJCQkJfSk7CgkJCQkvLyBTdGFydCBvZiB1c2VyIGNvZGUgZm9yIGFkZGl0aW9uYWwgYnVzaW5lc3NmaWx0ZXJzIGZvciB0YXJnZXQKCQkJCS8vIEVuZCBvZiB1c2VyIGNvZGUKCQkJfQoJCQlpZiAoaXNBY2Nlc3NpYmxlKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnNvdXJjZSkpIHsKCQkJCWJhc2VQYXJ0LmFkZEZpbHRlclRvU291cmNlKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7CgkJCQkKCQkJCQkvKioKCQkJCQkgKiB7QGluaGVyaXREb2N9CgkJCQkJICogCgkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCgkJCQkJICovCgkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewoJCQkJCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlUmVxdWlyZW1lbnQpOwoJCQkJCX0KCQkJCQkKCQkJCX0pOwoJCQkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGZvciBhZGRpdGlvbmFsIGJ1c2luZXNzZmlsdGVycyBmb3Igc291cmNlCgkJCQkvLyBFbmQgb2YgdXNlciBjb2RlCgkJCX0KCQkJCgkJCS8vIGluaXQgdmFsdWVzIGZvciByZWZlcmVuY2VkIHZpZXdzCgkJCQoJCQkvLyBpbml0IGZpbHRlcnMgZm9yIHJlZmVyZW5jZWQgdmlld3MKCQkJCgkJfQoJCXNldEluaXRpYWxpemluZyhmYWxzZSk7Cgl9CgoKCgoKCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TdGFuZGFyZFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I2Fzc29jaWF0ZWRGZWF0dXJlKGphdmEubGFuZy5PYmplY3QpCgkgKi8KCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgYXNzb2NpYXRlZEZlYXR1cmUoT2JqZWN0IGVkaXRvcktleSkgewoJCWlmIChlZGl0b3JLZXkgPT0gQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0KSB7CgkJCXJldHVybiBCYXNlbGluZVBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VSZXF1aXJlbWVudFJlbF9UYXJnZXQoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBCYXNlbGluZVZpZXdzUmVwb3NpdG9yeS5CYXNlUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy5zb3VyY2UpIHsKCQkJcmV0dXJuIEJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZVJlcXVpcmVtZW50UmVsX1NvdXJjZSgpOwoJCX0KCQlpZiAoZWRpdG9yS2V5ID09IEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUpIHsKCQkJcmV0dXJuIEJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZVJlcXVpcmVtZW50UmVsX1R5cGUoKTsKCQl9CgkJcmV0dXJuIHN1cGVyLmFzc29jaWF0ZWRGZWF0dXJlKGVkaXRvcktleSk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLmNvbXBvbmVudHMuU3RhbmRhcmRQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCN1cGRhdGVTZW1hbnRpY01vZGVsKG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LklQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50KQoJICogCgkgKi8KCXB1YmxpYyB2b2lkIHVwZGF0ZVNlbWFudGljTW9kZWwoZmluYWwgSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQgZXZlbnQpIHsKCQlCYXNlUmVxdWlyZW1lbnRSZWwgYmFzZVJlcXVpcmVtZW50UmVsID0gKEJhc2VSZXF1aXJlbWVudFJlbClzZW1hbnRpY09iamVjdDsKCQlpZiAoQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0ID09IGV2ZW50LmdldEFmZmVjdGVkRWRpdG9yKCkpIHsKCQkJaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50LlNFVCkgewoJCQkJdGFyZ2V0U2V0dGluZ3Muc2V0VG9SZWZlcmVuY2UoKEJhc2VSZXF1aXJlbWVudClldmVudC5nZXROZXdWYWx1ZSgpKTsKCQkJfSBlbHNlIGlmIChldmVudC5nZXRLaW5kKCkgPT0gUHJvcGVydGllc0VkaXRpb25FdmVudC5BREQpIHsKCQkJCUJhc2VSZXF1aXJlbWVudCBlT2JqZWN0ID0gQmFzZWxpbmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCYXNlUmVxdWlyZW1lbnQoKTsKCQkJCUVPYmplY3RQcm9wZXJ0aWVzRWRpdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0KGVkaXRpbmdDb250ZXh0LCB0aGlzLCBlT2JqZWN0LCBlZGl0aW5nQ29udGV4dC5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKCQkJCVByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIgcHJvdmlkZXIgPSAoUHJvcGVydGllc0VkaXRpbmdQcm92aWRlcillZGl0aW5nQ29udGV4dC5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVPYmplY3QsIFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIuY2xhc3MpOwoJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKCQkJCQlQcm9wZXJ0aWVzRWRpdGluZ1BvbGljeSBwb2xpY3kgPSBwcm92aWRlci5nZXRQb2xpY3koY29udGV4dCk7CgkJCQkJaWYgKHBvbGljeSAhPSBudWxsKSB7CgkJCQkJCXBvbGljeS5leGVjdXRlKCk7CgkJCQkJfQoJCQkJfQoJCQkJdGFyZ2V0U2V0dGluZ3Muc2V0VG9SZWZlcmVuY2UoZU9iamVjdCk7CgkJCX0KCQl9CgkJaWYgKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnNvdXJjZSA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWlmIChldmVudC5nZXRLaW5kKCkgPT0gUHJvcGVydGllc0VkaXRpb25FdmVudC5TRVQpIHsKCQkJCXNvdXJjZVNldHRpbmdzLnNldFRvUmVmZXJlbmNlKChCYXNlUmVxdWlyZW1lbnQpZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CgkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0S2luZCgpID09IFByb3BlcnRpZXNFZGl0aW9uRXZlbnQuQUREKSB7CgkJCQlCYXNlUmVxdWlyZW1lbnQgZU9iamVjdCA9IEJhc2VsaW5lRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmFzZVJlcXVpcmVtZW50KCk7CgkJCQlFT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRU9iamVjdFByb3BlcnRpZXNFZGl0aW9uQ29udGV4dChlZGl0aW5nQ29udGV4dCwgdGhpcywgZU9iamVjdCwgZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKSk7CgkJCQlQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIpZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlT2JqZWN0LCBQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyLmNsYXNzKTsKCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7CgkJCQkJUHJvcGVydGllc0VkaXRpbmdQb2xpY3kgcG9saWN5ID0gcHJvdmlkZXIuZ2V0UG9saWN5KGNvbnRleHQpOwoJCQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewoJCQkJCQlwb2xpY3kuZXhlY3V0ZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXNvdXJjZVNldHRpbmdzLnNldFRvUmVmZXJlbmNlKGVPYmplY3QpOwoJCQl9CgkJfQoJCWlmIChCYXNlbGluZVZpZXdzUmVwb3NpdG9yeS5CYXNlUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy50eXBlID09IGV2ZW50LmdldEFmZmVjdGVkRWRpdG9yKCkpIHsKCQkJYmFzZVJlcXVpcmVtZW50UmVsLnNldFR5cGUoKFJlcXVpcmVtZW50UmVsS2luZClldmVudC5nZXROZXdWYWx1ZSgpKTsKCQl9Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLmNvbXBvbmVudHMuU3RhbmRhcmRQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCN1cGRhdGVQYXJ0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKCSAqLwoJcHVibGljIHZvaWQgdXBkYXRlUGFydChOb3RpZmljYXRpb24gbXNnKSB7CgkJc3VwZXIudXBkYXRlUGFydChtc2cpOwoJCWlmIChlZGl0aW5nUGFydC5pc1Zpc2libGUoKSkgewoJCQlCYXNlUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvblBhcnQgYmFzZVBhcnQgPSAoQmFzZVJlcXVpcmVtZW50UmVsUHJvcGVydGllc0VkaXRpb25QYXJ0KWVkaXRpbmdQYXJ0OwoJCQlpZiAoQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfVGFyZ2V0KCkuZXF1YWxzKG1zZy5nZXRGZWF0dXJlKCkpICYmIGJhc2VQYXJ0ICE9IG51bGwgJiYgaXNBY2Nlc3NpYmxlKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnRhcmdldCkpCgkJCQliYXNlUGFydC5zZXRUYXJnZXQoKEVPYmplY3QpbXNnLmdldE5ld1ZhbHVlKCkpOwoJCQlpZiAoQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfU291cmNlKCkuZXF1YWxzKG1zZy5nZXRGZWF0dXJlKCkpICYmIGJhc2VQYXJ0ICE9IG51bGwgJiYgaXNBY2Nlc3NpYmxlKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnNvdXJjZSkpCgkJCQliYXNlUGFydC5zZXRTb3VyY2UoKEVPYmplY3QpbXNnLmdldE5ld1ZhbHVlKCkpOwoJCQlpZiAoQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfVHlwZSgpLmVxdWFscyhtc2cuZ2V0RmVhdHVyZSgpKSAmJiBtc2cuZ2V0Tm90aWZpZXIoKS5lcXVhbHMoc2VtYW50aWNPYmplY3QpICYmIGlzQWNjZXNzaWJsZShCYXNlbGluZVZpZXdzUmVwb3NpdG9yeS5CYXNlUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy50eXBlKSkKCQkJCWJhc2VQYXJ0LnNldFR5cGUoKFJlcXVpcmVtZW50UmVsS2luZCltc2cuZ2V0TmV3VmFsdWUoKSk7CgkJCQoJCQkKCQl9Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiAKCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TdGFuZGFyZFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I2dldE5vdGlmaWNhdGlvbkZpbHRlcnMoKQoJICovCglAT3ZlcnJpZGUKCXByb3RlY3RlZCBOb3RpZmljYXRpb25GaWx0ZXJbXSBnZXROb3RpZmljYXRpb25GaWx0ZXJzKCkgewoJCU5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlTm90aWZpY2F0aW9uRmlsdGVyKAoJCQlCYXNlbGluZVBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VSZXF1aXJlbWVudFJlbF9UYXJnZXQoKSwKCQkJQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlUmVxdWlyZW1lbnRSZWxfU291cmNlKCksCgkJCUJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZVJlcXVpcmVtZW50UmVsX1R5cGUoKQkJKTsKCQlyZXR1cm4gbmV3IE5vdGlmaWNhdGlvbkZpbHRlcltdIHtmaWx0ZXIsfTsKCX0KCgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiAKCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TdGFuZGFyZFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I2lzUmVxdWlyZWQoamF2YS5sYW5nLk9iamVjdCwgaW50KQoJICogCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoT2JqZWN0IGtleSwgaW50IGtpbmQpIHsKCQlyZXR1cm4ga2V5ID09IEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnRhcmdldCB8fCBrZXkgPT0gQmFzZWxpbmVWaWV3c1JlcG9zaXRvcnkuQmFzZVJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMuc291cmNlOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkuY29tcG9uZW50LklQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCN2YWxpZGF0ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LklQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50KQoJICogCgkgKi8KCXB1YmxpYyBEaWFnbm9zdGljIHZhbGlkYXRlVmFsdWUoSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQgZXZlbnQpIHsKCQlEaWFnbm9zdGljIHJldCA9IERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CgkJaWYgKGV2ZW50LmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewoJCQl0cnkgewoJCQkJaWYgKEJhc2VsaW5lVmlld3NSZXBvc2l0b3J5LkJhc2VSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUgPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQkJCU9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CgkJCQkJCW5ld1ZhbHVlID0gRUVGQ29udmVydGVyVXRpbC5jcmVhdGVGcm9tU3RyaW5nKEJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZVJlcXVpcmVtZW50UmVsX1R5cGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKCQkJCQl9CgkJCQkJcmV0ID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShCYXNlbGluZVBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VSZXF1aXJlbWVudFJlbF9UeXBlKCkuZ2V0RUF0dHJpYnV0ZVR5cGUoKSwgbmV3VmFsdWUpOwoJCQkJfQoJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CgkJCQlyZXQgPSBCYXNpY0RpYWdub3N0aWMudG9EaWFnbm9zdGljKGlhZSk7CgkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKCQkJCXJldCA9IEJhc2ljRGlhZ25vc3RpYy50b0RpYWdub3N0aWMod2UpOwoJCQl9CgkJfQoJCXJldHVybiByZXQ7Cgl9CgoKCQoKfQo=