LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uIGFuZCBLUElUIFRlY2hub2xvZ2llcy4NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjANCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQogKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC0yLjAvRVBMLTIuMC5odG1sDQogKg0KICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjANCiAqDQogKiBDb250cmlidXRvcnM6DQogKiAgIEh1YXNjYXIgRXNwaW5vemEoVGVjbmFsaWEpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFsZWphbmRyYSBSde16KFRlY25hbGlhKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vKFRlY25hbGlhKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBNYXJpIENhcm1lbiBQYWxhY2lvcyhUZWNuYWxpYSkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgQW5nZWwgTPNwZXooVGVjbmFsaWEpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEphbiBNYXVlcnNiZXJnZXIoS1BJVCktIExheW91dFV0aWwgaW1wbGVtZW50YXRpb24NCiAqICAgU2FzY2hhIEJhdW1nYXJ0KEtQSVQpLSBMYXlvdXRVdGlsIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuZ3NuLmZpZ3VyZXM7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsNCmltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCmltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCg0KcHVibGljIGNsYXNzIEdTTkNvbnRyYWN0IGV4dGVuZHMgRmlndXJlew0KDQoJcHVibGljIEdTTkNvbnRyYWN0KCl7DQoJCXRoaXMuc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbig4MCw2MCkpOw0KCX0NCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykgew0KCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOw0KCQkNCgkJUG9pbnQgcDE9bmV3IFBvaW50KHIueCxyLnkpOw0KCQlQb2ludCBwMj1uZXcgUG9pbnQoci54KzIqci53aWR0aC82LHIueSk7DQoJCVBvaW50IHAzPW5ldyBQb2ludChyLngrMipyLndpZHRoLzYsci55K3IuaGVpZ2h0LzcpOw0KCQlQb2ludCBwND1uZXcgUG9pbnQoci54LHIueStyLmhlaWdodC83KTsNCgkJUG9pbnQgcDUgPW5ldyBQb2ludChyLngrci53aWR0aCxyLnkrci5oZWlnaHQvNyk7DQoJCVBvaW50IHA2PW5ldyBQb2ludChyLngsci55KzYqci5oZWlnaHQvNyk7DQoJCVBvaW50IHA3PW5ldyBQb2ludChyLngrci53aWR0aCxyLnkrNipyLmhlaWdodC83KTsNCgkJUG9pbnQgcDg9bmV3IFBvaW50KHIueCs0KnIud2lkdGgvNixyLnkrci5oZWlnaHQpOw0KCQlQb2ludCBwOT1uZXcgUG9pbnQoci54KzQqci53aWR0aC82LHIueSs2KnIuaGVpZ2h0LzcpOw0KCQlQb2ludCBwMTA9bmV3IFBvaW50KHIueCtyLndpZHRoLHIueStyLmhlaWdodCk7DQoNCg0KCQlQb2ludExpc3QgcG9pbnRMaXN0ID0gbmV3IFBvaW50TGlzdCgpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDEpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDIpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDMpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDQpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDUpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDYpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDcpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDgpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDkpOw0KCQlwb2ludExpc3QuYWRkUG9pbnQocDEwKTsNCg0KCQkvLyBGaWxsIHRoZSBzaGFwZQ0KCQlncmFwaGljcy5maWxsUG9seWdvbihwb2ludExpc3QpOw0KDQoJCWdyYXBoaWNzLmRyYXdMaW5lKHAxLCBwMik7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHAyLCBwMyk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHAxLCBwNCk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA0LCBwNSk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA1LCBwNyk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA2LCBwNyk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA2LCBwNCk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA4LCBwOSk7DQoJCWdyYXBoaWNzLmRyYXdMaW5lKHA4LCBwMTApOw0KCQlncmFwaGljcy5kcmF3TGluZShwMTAsIHA3KTsNCg0KCQkNCgkJLy8gTW92ZSB0aGUgZmlyc3QgbGFiZWwgdG8gdGhlIGNlbnRlciBvZiB0aGUgcGFyYWxsZWxvZ3JhbQ0KCQlXcmFwcGluZ0xhYmVsIGxhYmVsID0gKFdyYXBwaW5nTGFiZWwpIGdldENoaWxkcmVuKCkuZ2V0KDApOw0KCQlMYXlvdXRVdGlsLm1vdmVUb0NlbnRlckFuZFVwKGxhYmVsLCB0aGlzLCBncmFwaGljcyk7DQoJCWxhYmVsLnBhaW50KGdyYXBoaWNzKTsNCgkJLy8gTW92ZSB0aGUgc2Vjb25kIGxhYmVsIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHBhcmFsbGVsb2dyYW0NCgkJbGFiZWwgPSAoV3JhcHBpbmdMYWJlbCkgZ2V0Q2hpbGRyZW4oKS5nZXQoMSk7DQoJCUxheW91dFV0aWwubW92ZVRvQ2VudGVyQW5kRG93bihsYWJlbCwgdGhpcywgZ3JhcGhpY3MpOw0KCQlsYWJlbC5wYWludChncmFwaGljcyk7DQoJfQ0KfQ0K