LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4IEplc3BlciBTdGVlbiBN+GxsZXIKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgWFNMIGxhdW5jaGluZyB0ZXN0CiAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI2MjA0NiAtIHJlZmFjdG9yZWQgZm9yIGJldHRlciByZWxpYWJpbGl0eS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzLnRlc3RjYXNlOwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLnczYy5kb20uKjsKaW1wb3J0IG9yZy54bWwuc2F4Lio7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMuQWJzdHJhY3RMYXVuY2hpbmdUZXN0OwoKcHVibGljIGNsYXNzIFhTTExhdW5jaGluZ1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hpbmdUZXN0IHsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGT1JNX0NPTU1FTlRTID0gIlRyYW5zZm9ybUNvbW1lbnRzIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfVFJBTlNGT1JNID0gIlNpbXBsZVRyYW5zZm9ybSI7CgoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewoJCXN1cGVyLnNldFVwKCk7CgoJCUlQYXRoIHBhdGggPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKCQljb3B5Q29uZmlndXJhdGlvblRvV29ya3NwYWNlKHBhdGgsICJTaW1wbGVUcmFuc2Zvcm0ubGF1bmNoIik7CgkJY29weUNvbmZpZ3VyYXRpb25Ub1dvcmtzcGFjZShwYXRoLCAiVHJhbnNmb3JtQ29tbWVudHMubGF1bmNoIik7CgkJdGVzdFByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwKCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCXdoaWxlICh0ZXN0UHJvamVjdC5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpID09IGZhbHNlKSB7CgkJCVRocmVhZC5zbGVlcCgxMDApOwoJCX0KCX0KCglAT3ZlcnJpZGUKCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJZW52LmRpc3Bvc2UoKTsKCQlzdXBlci50ZWFyRG93bigpOwoJfQoJCglwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdGVzdFNpbXBsZVRyYW5zZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJSVBhdGggZm9sZGVyID0gdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKTsKCQllbnYuYWRkRmlsZUZyb21SZXNvdXJjZShmb2xkZXIsICIxLWlucHV0LnhtbCIsICIxLWlucHV0LnhtbCIpOwoJCWVudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgIjEtdHJhbnNmb3JtLnhzbCIsICIxLXRyYW5zZm9ybS54c2wiKTsKCQlyZWZyZXNoUHJvamVjdCgpOwoKCQlsYXVuY2hDb25maWd1cmF0aW9uKFNJTVBMRV9UUkFOU0ZPUk0pOwoJCUlGaWxlIG91dHB1dCA9IHRlc3RQcm9qZWN0LmdldEZpbGUoIjEtaW5wdXQub3V0LnhtbCIpOwoJCURvY3VtZW50IGRvYyA9IHBhcnNlWG1sKG91dHB1dC5nZXRDb250ZW50cyh0cnVlKSk7CgkJYXNzZXJ0RXF1YWxzKCJyb290LW91dCIsIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpKTsKCX0KCgkvKioKCSAqIFRlc3QgdG8gbWFrZSBzdXJlIGNvbW1lbnRzIGFyZSBiZWluZyBjb3BpZWQgb3V0IHRvIHRoZSBvdXRwdXQgZmlsZS4gYnVnCgkgKiAyNTM3MDMKCSAqIAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCgkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCgkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0ZXN0VHJhbnNmb3JtQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlJUGF0aCBmb2xkZXIgPSB0ZXN0UHJvamVjdC5nZXRGdWxsUGF0aCgpOwoJCWVudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgInRlc3RDb21tZW50SW5wdXQueG1sIiwKCQkJCSJ0ZXN0Q29tbWVudElucHV0LnhtbCIpOwoJCWVudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgInRlc3RDb21tZW50cy54c2wiLCAidGVzdENvbW1lbnRzLnhzbCIpOwoJCWVudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgImV4cGVjdGVkLnhtbCIsCgkJCQkidGVzdENvbW1lbnRzRXhwZWN0ZWQueG1sIik7CgkJcmVmcmVzaFByb2plY3QoKTsKCgkJbGF1bmNoQ29uZmlndXJhdGlvbihUUkFOU0ZPUk1fQ09NTUVOVFMpOwoJCUlGaWxlIG91dHB1dCA9IHRlc3RQcm9qZWN0LmdldEZpbGUoInRlc3RDb21tZW50SW5wdXQub3V0LnhtbCIpOwoJCUlGaWxlIGV4cGVjdGVkID0gdGVzdFByb2plY3QuZ2V0RmlsZSgiZXhwZWN0ZWQueG1sIik7CgoJCVN0cmluZyByZXN1bHQgPSByZWFkRmlsZShvdXRwdXQuZ2V0Q29udGVudHMoKSk7CgkJU3RyaW5nIHdhbnRlZCA9IHJlYWRGaWxlKGV4cGVjdGVkLmdldENvbnRlbnRzKCkpOwoKCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzdWx0czoiLCB3YW50ZWQsIHJlc3VsdCk7Cgl9Cgp9Cg==