LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEdlbmVyYXRlZCB3aXRoIEFjY2VsZW8KICovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLmNvbXBvbmVudHM7CgovLyBTdGFydCBvZiB1c2VyIGNvZGUgZm9yIGltcG9ydHMKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuRVN0cnVjdHVyYWxGZWF0dXJlTm90aWZpY2F0aW9uRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuYXBpLm5vdGlmeS5Ob3RpZmljYXRpb25GaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5Qcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5pbXBsLkVPYmplY3RQcm9wZXJ0aWVzRWRpdGlvbkNvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5pbXBsLkVSZWZlcmVuY2VQcm9wZXJ0aWVzRWRpdGlvbkNvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlNpbmdsZVBhcnRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLm5vdGlmeS5Qcm9wZXJ0aWVzRWRpdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwudXRpbHMuRUVGQ29udmVydGVyVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wb2xpY2llcy5Qcm9wZXJ0aWVzRWRpdGluZ1BvbGljeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wb2xpY2llcy5pbXBsLkNyZWF0ZUVkaXRpbmdQb2xpY3k7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUucHJvdmlkZXJzLlByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUudWkud2lkZ2V0cy5yZWZlcmVuY2VzdGFibGUuUmVmZXJlbmNlc1RhYmxlU2V0dGluZ3M7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0RGVmaW5pdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5FdmlkZW5jZVBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UucGFydHMuQXJ0ZWZhY3RWZXJzaW9uUHJvcGVydGllc0VkaXRpb25QYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLnBhcnRzLkV2aWRlbmNlVmlld3NSZXBvc2l0b3J5OwoKCi8vIEVuZCBvZiB1c2VyIGNvZGUKCi8qKgogKiAKICogCiAqLwpwdWJsaWMgY2xhc3MgQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCBleHRlbmRzIFNpbmdsZVBhcnRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudCB7CgoJCglwdWJsaWMgc3RhdGljIFN0cmluZyBBUlRFRkFDVFZFUlNJT05fUEFSVCA9ICJBcnRlZmFjdFZlcnNpb24iOyAvLyROT04tTkxTLTEkCgoJCgkvKioKCSAqIFNldHRpbmdzIGZvciByZXNvdXJjZSBSZWZlcmVuY2VzVGFibGUKCSAqLwoJcHJvdGVjdGVkIFJlZmVyZW5jZXNUYWJsZVNldHRpbmdzIHJlc291cmNlU2V0dGluZ3M7CgkKCQoJLyoqCgkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCgkgKiAKCSAqLwoJcHVibGljIEFydGVmYWN0QXJ0ZWZhY3RWZXJzaW9uUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQoUHJvcGVydGllc0VkaXRpbmdDb250ZXh0IGVkaXRpbmdDb250ZXh0LCBFT2JqZWN0IGFydGVmYWN0LCBTdHJpbmcgZWRpdGluZ19tb2RlKSB7CgkJc3VwZXIoZWRpdGluZ0NvbnRleHQsIGFydGVmYWN0LCBlZGl0aW5nX21vZGUpOwoJCXBhcnRzID0gbmV3IFN0cmluZ1tdIHsgQVJURUZBQ1RWRVJTSU9OX1BBUlQgfTsKCQlyZXBvc2l0b3J5S2V5ID0gRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuY2xhc3M7CgkJcGFydEtleSA9IEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5jbGFzczsKCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIAoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuYXBpLmNvbXBvbmVudC5JUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjaW5pdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgaW50LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgCgkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKCSAqIAoJICovCglwdWJsaWMgdm9pZCBpbml0UGFydChPYmplY3Qga2V5LCBpbnQga2luZCwgRU9iamVjdCBlbHQsIFJlc291cmNlU2V0IGFsbFJlc291cmNlKSB7CgkJc2V0SW5pdGlhbGl6aW5nKHRydWUpOwoJCWlmIChlZGl0aW5nUGFydCAhPSBudWxsICYmIGtleSA9PSBwYXJ0S2V5KSB7CgkJCWVkaXRpbmdQYXJ0LnNldENvbnRleHQoZWx0LCBhbGxSZXNvdXJjZSk7CgkJCQoJCQlmaW5hbCBBcnRlZmFjdCBhcnRlZmFjdCA9IChBcnRlZmFjdCllbHQ7CgkJCWZpbmFsIEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uUGFydCBhcnRlZmFjdFZlcnNpb25QYXJ0ID0gKEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uUGFydCllZGl0aW5nUGFydDsKCQkJLy8gaW5pdCB2YWx1ZXMKCQkJaWYgKGlzQWNjZXNzaWJsZShFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy52ZXJzaW9uSUQpKQoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXRWZXJzaW9uSUQoRUVGQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkcsIGFydGVmYWN0LmdldFZlcnNpb25JRCgpKSk7CgkJCQoJCQlpZiAoaXNBY2Nlc3NpYmxlKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmRhdGUpKQoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXREYXRlKEVFRkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FREFURSwgYXJ0ZWZhY3QuZ2V0RGF0ZSgpKSk7CgkJCQoJCQlpZiAoaXNBY2Nlc3NpYmxlKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmNoYW5nZXMpKQoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXRDaGFuZ2VzKEVFRkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HLCBhcnRlZmFjdC5nZXRDaGFuZ2VzKCkpKTsKCQkJCgkJCWlmIChpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuaXNMYXN0VmVyc2lvbikpIHsKCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0SXNMYXN0VmVyc2lvbihhcnRlZmFjdC5pc0lzTGFzdFZlcnNpb24oKSk7CgkJCX0KCQkJaWYgKGlzQWNjZXNzaWJsZShFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc1RlbXBsYXRlKSkgewoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXRJc1RlbXBsYXRlKGFydGVmYWN0LmlzSXNUZW1wbGF0ZSgpKTsKCQkJfQoJCQlpZiAoaXNBY2Nlc3NpYmxlKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmlzQ29uZmlndXJhYmxlKSkgewoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXRJc0NvbmZpZ3VyYWJsZShhcnRlZmFjdC5pc0lzQ29uZmlndXJhYmxlKCkpOwoJCQl9CgkJCWlmIChpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMucmVzb3VyY2UpKSB7CgkJCQlyZXNvdXJjZVNldHRpbmdzID0gbmV3IFJlZmVyZW5jZXNUYWJsZVNldHRpbmdzKGFydGVmYWN0LCBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X1Jlc291cmNlKCkpOwoJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5pbml0UmVzb3VyY2UocmVzb3VyY2VTZXR0aW5ncyk7CgkJCX0KCQkJLy8gaW5pdCBmaWx0ZXJzCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCWlmIChpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMucmVzb3VyY2UpKSB7CgkJCQlhcnRlZmFjdFZlcnNpb25QYXJ0LmFkZEZpbHRlclRvUmVzb3VyY2UobmV3IFZpZXdlckZpbHRlcigpIHsKCQkJCQkvKioKCQkJCQkgKiB7QGluaGVyaXREb2N9CgkJCQkJICogCgkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCgkJCQkJICovCgkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewoJCQkJCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZWxlbWVudC5lcXVhbHMoIiIpKSB8fCAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlKTsgLy8kTk9OLU5MUy0xJCAKCQkJCQl9CgkJCQoJCQkJfSk7CgkJCQkvLyBTdGFydCBvZiB1c2VyIGNvZGUgZm9yIGFkZGl0aW9uYWwgYnVzaW5lc3NmaWx0ZXJzIGZvciByZXNvdXJjZQoJCQkJLy8gRW5kIG9mIHVzZXIgY29kZQoJCQl9CgkJCS8vIGluaXQgdmFsdWVzIGZvciByZWZlcmVuY2VkIHZpZXdzCgkJCQoJCQkvLyBpbml0IGZpbHRlcnMgZm9yIHJlZmVyZW5jZWQgdmlld3MKCQkJCgkJfQoJCXNldEluaXRpYWxpemluZyhmYWxzZSk7Cgl9CgoKCgoKCgoKCgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLmNvbXBvbmVudHMuU3RhbmRhcmRQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCNhc3NvY2lhdGVkRmVhdHVyZShqYXZhLmxhbmcuT2JqZWN0KQoJICovCglwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGFzc29jaWF0ZWRGZWF0dXJlKE9iamVjdCBlZGl0b3JLZXkpIHsKCQlpZiAoZWRpdG9yS2V5ID09IEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLnZlcnNpb25JRCkgewoJCQlyZXR1cm4gRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9WZXJzaW9uSUQoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5kYXRlKSB7CgkJCXJldHVybiBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0RhdGUoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5jaGFuZ2VzKSB7CgkJCXJldHVybiBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0NoYW5nZXMoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc0xhc3RWZXJzaW9uKSB7CgkJCXJldHVybiBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzTGFzdFZlcnNpb24oKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc1RlbXBsYXRlKSB7CgkJCXJldHVybiBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzVGVtcGxhdGUoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc0NvbmZpZ3VyYWJsZSkgewoJCQlyZXR1cm4gRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9Jc0NvbmZpZ3VyYWJsZSgpOwoJCX0KCQlpZiAoZWRpdG9yS2V5ID09IEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLnJlc291cmNlKSB7CgkJCXJldHVybiBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X1Jlc291cmNlKCk7CgkJfQoJCXJldHVybiBzdXBlci5hc3NvY2lhdGVkRmVhdHVyZShlZGl0b3JLZXkpOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlN0YW5kYXJkUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjdXBkYXRlU2VtYW50aWNNb2RlbChvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuYXBpLm5vdGlmeS5JUHJvcGVydGllc0VkaXRpb25FdmVudCkKCSAqIAoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVTZW1hbnRpY01vZGVsKGZpbmFsIElQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50IGV2ZW50KSB7CgkJQXJ0ZWZhY3QgYXJ0ZWZhY3QgPSAoQXJ0ZWZhY3Qpc2VtYW50aWNPYmplY3Q7CgkJaWYgKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLnZlcnNpb25JRCA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWFydGVmYWN0LnNldFZlcnNpb25JRCgoamF2YS5sYW5nLlN0cmluZylFRUZDb252ZXJ0ZXJVdGlsLmNyZWF0ZUZyb21TdHJpbmcoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkcsIChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwoJCX0KCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuZGF0ZSA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWFydGVmYWN0LnNldERhdGUoKGphdmEudXRpbC5EYXRlKUVFRkNvbnZlcnRlclV0aWwuY3JlYXRlRnJvbVN0cmluZyhFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRURBVEUsIChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwoJCX0KCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuY2hhbmdlcyA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWFydGVmYWN0LnNldENoYW5nZXMoKGphdmEubGFuZy5TdHJpbmcpRUVGQ29udmVydGVyVXRpbC5jcmVhdGVGcm9tU3RyaW5nKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HLCAoU3RyaW5nKWV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKCQl9CgkJaWYgKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmlzTGFzdFZlcnNpb24gPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQkvL1N0YXJ0IElSUgoJCQlpZiAoKEJvb2xlYW4pZXZlbnQuZ2V0TmV3VmFsdWUoKSkgewoJCQkJQXJ0ZWZhY3REZWZpbml0aW9uIGFydGRlZmluaXRpb24gPShBcnRlZmFjdERlZmluaXRpb24pYXJ0ZWZhY3QuZUNvbnRhaW5lcigpOwoJCQkJRUxpc3Q8QXJ0ZWZhY3Q+IGFsbFZlcnNpb24gPSBhcnRkZWZpbml0aW9uLmdldEFydGVmYWN0KCk7CgkJCQlJdGVyYXRvcjxBcnRlZmFjdD4gaXRlciA9IGFsbFZlcnNpb24uaXRlcmF0b3IoKTsKCQkJCQoJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CgkJCQkJQXJ0ZWZhY3Qgb25lQXJ0ZWZhY3Q9IChBcnRlZmFjdCkgaXRlci5uZXh0KCk7CgkJCQkJb25lQXJ0ZWZhY3Quc2V0SXNMYXN0VmVyc2lvbihmYWxzZSk7CgkJCQl9CgkJCX0KCQkJLy9FbmQgSVJSCgkJCQoJCQlhcnRlZmFjdC5zZXRJc0xhc3RWZXJzaW9uKChCb29sZWFuKWV2ZW50LmdldE5ld1ZhbHVlKCkpOwoJCX0KCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuaXNUZW1wbGF0ZSA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWFydGVmYWN0LnNldElzVGVtcGxhdGUoKEJvb2xlYW4pZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CgkJfQoJCWlmIChFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc0NvbmZpZ3VyYWJsZSA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCWFydGVmYWN0LnNldElzQ29uZmlndXJhYmxlKChCb29sZWFuKWV2ZW50LmdldE5ld1ZhbHVlKCkpOwoJCX0KCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMucmVzb3VyY2UgPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQlpZiAoZXZlbnQuZ2V0S2luZCgpID09IFByb3BlcnRpZXNFZGl0aW9uRXZlbnQuQUREKSB7CgkJCQlFUmVmZXJlbmNlUHJvcGVydGllc0VkaXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRVJlZmVyZW5jZVByb3BlcnRpZXNFZGl0aW9uQ29udGV4dChlZGl0aW5nQ29udGV4dCwgdGhpcywgcmVzb3VyY2VTZXR0aW5ncywgZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKSk7CgkJCQlQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIpZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChzZW1hbnRpY09iamVjdCwgUHJvcGVydGllc0VkaXRpbmdQcm92aWRlci5jbGFzcyk7CgkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewoJCQkJCVByb3BlcnRpZXNFZGl0aW5nUG9saWN5IHBvbGljeSA9IHByb3ZpZGVyLmdldFBvbGljeShjb250ZXh0KTsKCQkJCQlpZiAocG9saWN5IGluc3RhbmNlb2YgQ3JlYXRlRWRpdGluZ1BvbGljeSkgewoJCQkJCQlwb2xpY3kuZXhlY3V0ZSgpOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIGlmIChldmVudC5nZXRLaW5kKCkgPT0gUHJvcGVydGllc0VkaXRpb25FdmVudC5FRElUKSB7CgkJCQlFT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRU9iamVjdFByb3BlcnRpZXNFZGl0aW9uQ29udGV4dChlZGl0aW5nQ29udGV4dCwgdGhpcywgKEVPYmplY3QpIGV2ZW50LmdldE5ld1ZhbHVlKCksIGVkaXRpbmdDb250ZXh0LmdldEFkYXB0ZXJGYWN0b3J5KCkpOwoJCQkJUHJvcGVydGllc0VkaXRpbmdQcm92aWRlciBwcm92aWRlciA9IChQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyKWVkaXRpbmdDb250ZXh0LmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoKEVPYmplY3QpIGV2ZW50LmdldE5ld1ZhbHVlKCksIFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIuY2xhc3MpOwoJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKCQkJCQlQcm9wZXJ0aWVzRWRpdGluZ1BvbGljeSBlZGl0aW9uUG9saWN5ID0gcHJvdmlkZXIuZ2V0UG9saWN5KGNvbnRleHQpOwoJCQkJCWlmIChlZGl0aW9uUG9saWN5ICE9IG51bGwpIHsKCQkJCQkJZWRpdGlvblBvbGljeS5leGVjdXRlKCk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50LlJFTU9WRSkgewoJCQkJcmVzb3VyY2VTZXR0aW5ncy5yZW1vdmVGcm9tUmVmZXJlbmNlKChFT2JqZWN0KSBldmVudC5nZXROZXdWYWx1ZSgpKTsKCQkJfSBlbHNlIGlmIChldmVudC5nZXRLaW5kKCkgPT0gUHJvcGVydGllc0VkaXRpb25FdmVudC5NT1ZFKSB7CgkJCQlyZXNvdXJjZVNldHRpbmdzLm1vdmUoZXZlbnQuZ2V0TmV3SW5kZXgoKSwgKFJlc291cmNlKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TdGFuZGFyZFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I3VwZGF0ZVBhcnQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVQYXJ0KE5vdGlmaWNhdGlvbiBtc2cpIHsKCQlzdXBlci51cGRhdGVQYXJ0KG1zZyk7CgkJaWYgKGVkaXRpbmdQYXJ0LmlzVmlzaWJsZSgpKSB7CgkJCUFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uUGFydCBhcnRlZmFjdFZlcnNpb25QYXJ0ID0gKEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uUGFydCllZGl0aW5nUGFydDsKCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfVmVyc2lvbklEKCkuZXF1YWxzKG1zZy5nZXRGZWF0dXJlKCkpICYmIG1zZy5nZXROb3RpZmllcigpLmVxdWFscyhzZW1hbnRpY09iamVjdCkgJiYgYXJ0ZWZhY3RWZXJzaW9uUGFydCAhPSBudWxsICYmIGlzQWNjZXNzaWJsZShFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy52ZXJzaW9uSUQpKSB7CgkJCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewoJCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0VmVyc2lvbklEKEVjb3JlVXRpbC5jb252ZXJ0VG9TdHJpbmcoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkcsIG1zZy5nZXROZXdWYWx1ZSgpKSk7CgkJCQl9IGVsc2UgewoJCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0VmVyc2lvbklEKCIiKTsKCQkJCX0KCQkJfQoJCQlpZiAoRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9EYXRlKCkuZXF1YWxzKG1zZy5nZXRGZWF0dXJlKCkpICYmIG1zZy5nZXROb3RpZmllcigpLmVxdWFscyhzZW1hbnRpY09iamVjdCkgJiYgYXJ0ZWZhY3RWZXJzaW9uUGFydCAhPSBudWxsICYmIGlzQWNjZXNzaWJsZShFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5kYXRlKSkgewoJCQkJaWYgKG1zZy5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKCQkJCQlhcnRlZmFjdFZlcnNpb25QYXJ0LnNldERhdGUoRWNvcmVVdGlsLmNvbnZlcnRUb1N0cmluZyhFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRURBVEUsIG1zZy5nZXROZXdWYWx1ZSgpKSk7CgkJCQl9IGVsc2UgewoJCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0RGF0ZSgiIik7CgkJCQl9CgkJCX0KCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfQ2hhbmdlcygpLmVxdWFscyhtc2cuZ2V0RmVhdHVyZSgpKSAmJiBtc2cuZ2V0Tm90aWZpZXIoKS5lcXVhbHMoc2VtYW50aWNPYmplY3QpICYmIGFydGVmYWN0VmVyc2lvblBhcnQgIT0gbnVsbCAmJiBpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuY2hhbmdlcykpIHsKCQkJCWlmIChtc2cuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSB7CgkJCQkJYXJ0ZWZhY3RWZXJzaW9uUGFydC5zZXRDaGFuZ2VzKEVjb3JlVXRpbC5jb252ZXJ0VG9TdHJpbmcoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkcsIG1zZy5nZXROZXdWYWx1ZSgpKSk7CgkJCQl9IGVsc2UgewoJCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0Q2hhbmdlcygiIik7CgkJCQl9CgkJCX0KCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNMYXN0VmVyc2lvbigpLmVxdWFscyhtc2cuZ2V0RmVhdHVyZSgpKSAmJiBtc2cuZ2V0Tm90aWZpZXIoKS5lcXVhbHMoc2VtYW50aWNPYmplY3QpICYmIGFydGVmYWN0VmVyc2lvblBhcnQgIT0gbnVsbCAmJiBpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuaXNMYXN0VmVyc2lvbikpCgkJCQlhcnRlZmFjdFZlcnNpb25QYXJ0LnNldElzTGFzdFZlcnNpb24oKEJvb2xlYW4pbXNnLmdldE5ld1ZhbHVlKCkpOwoJCQkKCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNUZW1wbGF0ZSgpLmVxdWFscyhtc2cuZ2V0RmVhdHVyZSgpKSAmJiBtc2cuZ2V0Tm90aWZpZXIoKS5lcXVhbHMoc2VtYW50aWNPYmplY3QpICYmIGFydGVmYWN0VmVyc2lvblBhcnQgIT0gbnVsbCAmJiBpc0FjY2Vzc2libGUoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuaXNUZW1wbGF0ZSkpCgkJCQlhcnRlZmFjdFZlcnNpb25QYXJ0LnNldElzVGVtcGxhdGUoKEJvb2xlYW4pbXNnLmdldE5ld1ZhbHVlKCkpOwoJCQkKCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNDb25maWd1cmFibGUoKS5lcXVhbHMobXNnLmdldEZlYXR1cmUoKSkgJiYgbXNnLmdldE5vdGlmaWVyKCkuZXF1YWxzKHNlbWFudGljT2JqZWN0KSAmJiBhcnRlZmFjdFZlcnNpb25QYXJ0ICE9IG51bGwgJiYgaXNBY2Nlc3NpYmxlKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmlzQ29uZmlndXJhYmxlKSkKCQkJCWFydGVmYWN0VmVyc2lvblBhcnQuc2V0SXNDb25maWd1cmFibGUoKEJvb2xlYW4pbXNnLmdldE5ld1ZhbHVlKCkpOwoJCQkKCQkJaWYgKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfUmVzb3VyY2UoKS5lcXVhbHMobXNnLmdldEZlYXR1cmUoKSkgJiYgaXNBY2Nlc3NpYmxlKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLnJlc291cmNlKSkKCQkJCWFydGVmYWN0VmVyc2lvblBhcnQudXBkYXRlUmVzb3VyY2UoKTsKCQkJCgkJfQoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLmNvbXBvbmVudHMuU3RhbmRhcmRQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCNnZXROb3RpZmljYXRpb25GaWx0ZXJzKCkKCSAqLwoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgTm90aWZpY2F0aW9uRmlsdGVyW10gZ2V0Tm90aWZpY2F0aW9uRmlsdGVycygpIHsKCQlOb3RpZmljYXRpb25GaWx0ZXIgZmlsdGVyID0gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZU5vdGlmaWNhdGlvbkZpbHRlcigKCQkJRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9WZXJzaW9uSUQoKSwKCQkJRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9EYXRlKCksCgkJCUV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfQ2hhbmdlcygpLAoJCQlFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzTGFzdFZlcnNpb24oKSwKCQkJRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9Jc1RlbXBsYXRlKCksCgkJCUV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNDb25maWd1cmFibGUoKSwKCQkJRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9SZXNvdXJjZSgpCQkpOwoJCXJldHVybiBuZXcgTm90aWZpY2F0aW9uRmlsdGVyW10ge2ZpbHRlcix9OwoJfQoKCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIAoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlN0YW5kYXJkUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjaXNSZXF1aXJlZChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCgkgKiAKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZChPYmplY3Qga2V5LCBpbnQga2luZCkgewoJCXJldHVybiBrZXkgPT0gRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMudmVyc2lvbklEOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkuY29tcG9uZW50LklQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCN2YWxpZGF0ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LklQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50KQoJICogCgkgKi8KCXB1YmxpYyBEaWFnbm9zdGljIHZhbGlkYXRlVmFsdWUoSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQgZXZlbnQpIHsKCQlEaWFnbm9zdGljIHJldCA9IERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CgkJaWYgKGV2ZW50LmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewoJCQl0cnkgewoJCQkJaWYgKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLnZlcnNpb25JRCA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKCQkJCQkJbmV3VmFsdWUgPSBFRUZDb252ZXJ0ZXJVdGlsLmNyZWF0ZUZyb21TdHJpbmcoRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9WZXJzaW9uSUQoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKCQkJCQl9CgkJCQkJcmV0ID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X1ZlcnNpb25JRCgpLmdldEVBdHRyaWJ1dGVUeXBlKCksIG5ld1ZhbHVlKTsKCQkJCX0KCQkJCWlmIChFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5kYXRlID09IGV2ZW50LmdldEFmZmVjdGVkRWRpdG9yKCkpIHsKCQkJCQlPYmplY3QgbmV3VmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwoJCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewoJCQkJCQluZXdWYWx1ZSA9IEVFRkNvbnZlcnRlclV0aWwuY3JlYXRlRnJvbVN0cmluZyhFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0RhdGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKCQkJCQl9CgkJCQkJcmV0ID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0RhdGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCBuZXdWYWx1ZSk7CgkJCQl9CgkJCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuY2hhbmdlcyA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKCQkJCQkJbmV3VmFsdWUgPSBFRUZDb252ZXJ0ZXJVdGlsLmNyZWF0ZUZyb21TdHJpbmcoRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9DaGFuZ2VzKCkuZ2V0RUF0dHJpYnV0ZVR5cGUoKSwgKFN0cmluZyluZXdWYWx1ZSk7CgkJCQkJfQoJCQkJCXJldCA9IERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoRXZpZGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRlZmFjdF9DaGFuZ2VzKCkuZ2V0RUF0dHJpYnV0ZVR5cGUoKSwgbmV3VmFsdWUpOwoJCQkJfQoJCQkJaWYgKEV2aWRlbmNlVmlld3NSZXBvc2l0b3J5LkFydGVmYWN0VmVyc2lvbi5Qcm9wZXJ0aWVzLmlzTGFzdFZlcnNpb24gPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQkJCU9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CgkJCQkJCW5ld1ZhbHVlID0gRUVGQ29udmVydGVyVXRpbC5jcmVhdGVGcm9tU3RyaW5nKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNMYXN0VmVyc2lvbigpLmdldEVBdHRyaWJ1dGVUeXBlKCksIChTdHJpbmcpbmV3VmFsdWUpOwoJCQkJCX0KCQkJCQlyZXQgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNMYXN0VmVyc2lvbigpLmdldEVBdHRyaWJ1dGVUeXBlKCksIG5ld1ZhbHVlKTsKCQkJCX0KCQkJCWlmIChFdmlkZW5jZVZpZXdzUmVwb3NpdG9yeS5BcnRlZmFjdFZlcnNpb24uUHJvcGVydGllcy5pc1RlbXBsYXRlID09IGV2ZW50LmdldEFmZmVjdGVkRWRpdG9yKCkpIHsKCQkJCQlPYmplY3QgbmV3VmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwoJCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewoJCQkJCQluZXdWYWx1ZSA9IEVFRkNvbnZlcnRlclV0aWwuY3JlYXRlRnJvbVN0cmluZyhFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzVGVtcGxhdGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKCQkJCQl9CgkJCQkJcmV0ID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzVGVtcGxhdGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCBuZXdWYWx1ZSk7CgkJCQl9CgkJCQlpZiAoRXZpZGVuY2VWaWV3c1JlcG9zaXRvcnkuQXJ0ZWZhY3RWZXJzaW9uLlByb3BlcnRpZXMuaXNDb25maWd1cmFibGUgPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQkJCU9iamVjdCBuZXdWYWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CgkJCQkJCW5ld1ZhbHVlID0gRUVGQ29udmVydGVyVXRpbC5jcmVhdGVGcm9tU3RyaW5nKEV2aWRlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0ZWZhY3RfSXNDb25maWd1cmFibGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKCQkJCQl9CgkJCQkJcmV0ID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGVmYWN0X0lzQ29uZmlndXJhYmxlKCkuZ2V0RUF0dHJpYnV0ZVR5cGUoKSwgbmV3VmFsdWUpOwoJCQkJfQoJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CgkJCQlyZXQgPSBCYXNpY0RpYWdub3N0aWMudG9EaWFnbm9zdGljKGlhZSk7CgkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKCQkJCXJldCA9IEJhc2ljRGlhZ25vc3RpYy50b0RpYWdub3N0aWMod2UpOwoJCQl9CgkJfQoJCXJldHVybiByZXQ7Cgl9CgoKCQoKfQo=