LyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBSb2JlcnQgQm9zY2ggR21iSC4KICogCiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCiAqCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIFJvYmVydCBCb3NjaCBHbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnBhY2thZ2Ugb3JnLmVjbGlwc2UuYXBwNG1jLnRyYW5zZm9ybWF0aW9uLmV4dGVuc2lvbnMuYmFzZS50ZW1wbGF0ZXMKCmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllcwppbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyCmltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcgppbXBvcnQgb3JnLmVjbGlwc2UuYXBwNG1jLnRyYW5zZm9ybWF0aW9uLmV4dGVuc2lvbnMuQ3VzdG9tT2JqZWN0c1N0b3JlCmltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgppbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CmltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcgoKcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJhbnNmb3JtZXJ7CgkKCXN0YXRpYyBwdWJsaWMgQ3VzdG9tT2JqZWN0c1N0b3JlIGN1c3RvbU9ianNTdG9yZSA9IG5ldyBDdXN0b21PYmplY3RzU3RvcmUKCglzdGF0aWMgcHVibGljIExvZ2dlciBsb2dnZXIKCiAgICBzdGF0aWMgcHVibGljIFByb3BlcnRpZXMgcHJvcGVydGllcwoJCglzdGF0aWMgcHVibGljIEluamVjdG9yIGluamVjdG9yCgoJLyoqCgkgKiBQcm92aWRlcyBMb2c0SiBsb2dnZXIgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgVHJhbnNmb3JtZXIgY2xhc3Nlcy4KCSAqIE5vdGU6IFJvb3QgTG9nZ2VyIGlzIGluaXRpYWxpemVkIGR1cmluZyB0aGUgc3RhcnR1cCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQXBwZW5kZXJzIGFyZSBob29rZWQgdG8gaXQgYWNjb3JkaW5nbHkuCgkgKiBJbiBjYXNlLCBpZiB1c2VyIHNwZWNpZmljIGFwcGVuZGVycyBhcmUgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIGxvZ2dlciwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYW5kIG5ldyBBcHBlbmRlcnMgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSBsb2dnZXIgCgkgKiAKCSAqLwoJcHJvdGVjdGVkIGRlZiBMb2dnZXIgZ2V0TG9nZ2VyKCkgewoJCWlmIChsb2dnZXIgPT09IG51bGwpIHsKCQkJbG9nZ2VyID0gY3JlYXRlTG9nZ2VyCgkJCWxvZ2dlci5hZGRBcHBlbmRlcihuZXcgQ29uc29sZUFwcGVuZGVyKG5ldyBQYXR0ZXJuTGF5b3V0KSkKCQl9CgkJcmV0dXJuIGxvZ2dlcgoJfQoKCXByb3RlY3RlZCBkZWYgTG9nZ2VyIGNyZWF0ZUxvZ2dlcigpewoJCQlsb2dnZXIgPSBMb2dNYW5hZ2VyLmdldExvZ2dlcigiY29tLmJvc2NoLm0ybS5hcHA0bWMuc2ltdWxhdGlvbiIpOwoJCQoJfQoJcHJvdGVjdGVkIGRlZiBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BLZXkpIHsKCgkJaWYgKHByb3BlcnRpZXMgPT09IG51bGwpIHsKCgkJCWlmIChjdXN0b21PYmpzU3RvcmUgIT09IG51bGwpIHsKCQkJCXByb3BlcnRpZXMgPSBjdXN0b21PYmpzU3RvcmUuZ2V0SW5zdGFuY2UoUHJvcGVydGllcykKCQkJCWlmIChwcm9wZXJ0aWVzID09PSBudWxsKSB7CgkJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAoJCQkJCQkiUHJvcGVydGllcyBvYmplY3Qgbm90IHNldCBpbiBDdXN0b21PYmplY3RzU3RvcmUgOiBWZXJpZnkgdGhlIGN1c3RvbSBHb29nbGUgR3VpY2UgTW9kdWxlIGNvbmZpZ3VyYXRpb24gIikKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCgkJCQkJIkN1c3RvbU9iamVjdHNTdG9yZSBvYmplY3Qgbm90IGJpbmRlZDogVmVyaWZ5IHRoZSBjdXN0b20gR29vZ2xlIEd1aWNlIE1vZHVsZSBjb25maWd1cmF0aW9uICIpCgkJCX0KCQl9CgoJCXZhbCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KHByb3BLZXkpCgoJCWlmICh2YWx1ZSA9PT0gbnVsbCkgewoJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlJlcXVlc3QgaW5wdXQga2V5IDogXCIiICsgcHJvcEtleSArCgkJCQkiXCIgbm90IHN1cHBsaWVkIGluIHRoZSBpbnB1dCBwcm9wZXJ0aWVzIGZpbGUiKQoJCX0KCgkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nCgoJfQoKLyogCXB1YmxpYyBkZWYgZG9HZW5lcmF0ZSgpICcnJwogKiAJIAogKiAJCasgIHZhbCBpbnN0YW5jZSA9IGN1c3RvbU9ianNTdG9yZS5nZXRJbnN0YW5jZShQcm9wZXJ0aWVzKbsKICogCQmraW5zdGFuY2UuZ2V0KCJsb2dfZmlsZSIpuwogKiAJCatnZXRMb2dnZXIud2FybigibG9nZ2luZyBpbmZvIGFib3V0IHRyYW5zZm9ybWF0aW9uIG9mIDoiK3RoaXMuY2xhc3MubmFtZSkJuwogKiAJIC0tLS0tLS0tLS0+IKt0aGlzLmNsYXNzLm5hbWW7CiAqIAkgPT09PT09PT09PT09PT09PiCrcHJvcGVydGllcy5nZXQoImxvZ19maWxlIim7CiAqIAknJycKICovCn0K