cGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3JwLiAKQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41CndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Cmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCqAKQ29udHJpYnV0b3JzOgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLio7CgpwdWJsaWMgY2xhc3MgU3RhcnR1cFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewoJcHJpdmF0ZSBUYWJsZSBwbHVnaW5zTGlzdDsKCXByaXZhdGUgV29ya2JlbmNoIHdvcmtiZW5jaDsKCQoJLyoqCgkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSkKCSAqLwoJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewoJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5TVEFSVFVQX1BSRUZFUkVOQ0VfUEFHRSk7CgkJCgkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKCQkKCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CgkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQljb21wb3NpdGUuc2V0Rm9udChmb250KTsKCgkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKTsKCQlsYWJlbC5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiU3RhcnR1cFByZWZlcmVuY2VQYWdlLmxhYmVsIikpOyAvLyROT04tTkxTLTEkCgkJbGFiZWwuc2V0Rm9udChmb250KTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsJCQoJCXBsdWdpbnNMaXN0ID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSxTV1QuQk9SREVSIHwgU1dULkNIRUNLIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJcGx1Z2luc0xpc3Quc2V0Rm9udChmb250KQk7CgkJcGx1Z2luc0xpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlwb3B1bGF0ZVBsdWdpbnNMaXN0KCk7CgoJCXJldHVybiBjb21wb3NpdGU7Cgl9Cglwcml2YXRlIHZvaWQgcG9wdWxhdGVQbHVnaW5zTGlzdCgpIHsKCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0gd29ya2JlbmNoLmdldEVhcmx5QWN0aXZhdGVkUGx1Z2lucygpOwoJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSB3b3JrYmVuY2guZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CgkJU3RyaW5nIHByZWYgPSBzdG9yZS5nZXRTdHJpbmcoSVByZWZlcmVuY2VDb25zdGFudHMuUExVR0lOU19OT1RfQUNUSVZBVEVEX09OX1NUQVJUVVApOwoJCWlmKHByZWYgPT0gbnVsbCkKCQkJcHJlZiA9IG5ldyBTdHJpbmcoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7CgkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2MgPSBkZXNjcmlwdG9yc1tpXTsKCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHBsdWdpbnNMaXN0LFNXVC5OT05FKTsKCQkJaXRlbS5zZXRUZXh0KGRlc2MuZ2V0TGFiZWwoKSk7CgkJCWl0ZW0uc2V0RGF0YShkZXNjKTsKCQkJU3RyaW5nIGlkID0gZGVzYy5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyBJUHJlZmVyZW5jZUNvbnN0YW50cy5TRVBBUkFUT1I7CgkJCWl0ZW0uc2V0Q2hlY2tlZChwcmVmLmluZGV4T2YoaWQpIDwgMCk7CgkJfQoJfQoJLyoqCgkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQoJICovCglwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CgkJdGhpcy53b3JrYmVuY2ggPSAoV29ya2JlbmNoKXdvcmtiZW5jaDsKCX0KCS8qKgoJICogQHNlZSBQcmVmZXJlbmNlUGFnZQoJICovCglwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CgkJVGFibGVJdGVtIGl0ZW1zW10gPSBwbHVnaW5zTGlzdC5nZXRJdGVtcygpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsKCQl9Cgl9CgkvKioKCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UKCSAqLwoJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewoJCVN0cmluZ0J1ZmZlciBwcmVmZXJlbmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCVRhYmxlSXRlbSBpdGVtc1tdID0gcGx1Z2luc0xpc3QuZ2V0SXRlbXMoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CgkJCWlmKCFpdGVtc1tpXS5nZXRDaGVja2VkKCkpIHsKCQkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoSVBsdWdpbkRlc2NyaXB0b3IpaXRlbXNbaV0uZ2V0RGF0YSgpOwoJCQkJcHJlZmVyZW5jZS5hcHBlbmQoZGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOwoJCQkJcHJlZmVyZW5jZS5hcHBlbmQoSVByZWZlcmVuY2VDb25zdGFudHMuU0VQQVJBVE9SKTsKCQkJfQoJCX0KCQlTdHJpbmcgcHJlZiA9IHByZWZlcmVuY2UudG9TdHJpbmcoKTsKCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gd29ya2JlbmNoLmdldFByZWZlcmVuY2VTdG9yZSgpOwoJCXN0b3JlLnB1dFZhbHVlKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBMVUdJTlNfTk9UX0FDVElWQVRFRF9PTl9TVEFSVFVQLHByZWYpOwoJCXJldHVybiB0cnVlOwoJfQp9Cg==