LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwoKcHVibGljIGNsYXNzIE9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQp7CiAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiOwoKICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQogIHsKICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlLmNsYXNzLCAiT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UiKTsKICB9CgogIHByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KICB7CiAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKICAgIGFzc2VydFRydWUocHJvamVjdC5leGlzdHMoKSk7CiAgICBwcm9qZWN0Lm9wZW4obnVsbCk7CiAgICBwcm9qZWN0LnJlZnJlc2hMb2NhbChJUHJvamVjdC5ERVBUSF9JTkZJTklURSwgbnVsbCk7CiAgICBqb2luQXV0b0J1aWxkKCk7CiAgICByZXR1cm4gcHJvamVjdDsKICB9CgogIHByb3RlY3RlZCB2b2lkIGpvaW5BdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgogIHsKICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSB0cnVlOwogICAgd2hpbGUgKGludGVycnVwdGVkKQogICAgewogICAgICB0cnkKICAgICAgewogICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7CiAgICAgICAgaW50ZXJydXB0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKICAgICAgewogICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBTdHJpbmcgZWRpdG9yaWQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgogIHsKICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKICAgIHJldHVybiB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIGVkaXRvcmlkLCB0cnVlKTsKICB9CgogIHByb3RlY3RlZCBib29sZWFuIGNsb3NlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikKICB7CiAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CiAgICByZXR1cm4gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKICB9CgogIHB1YmxpYyB2b2lkIHRlc3RPcGVuU3RvY2tRdW90ZVdTREwoKSB0aHJvd3MgRXhjZXB0aW9uCiAgewogICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAuUFJPSkVDVF9OQU1FKTsKICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKXByb2plY3QuZmluZE1lbWJlcigiU3RvY2tRdW90ZS53c2RsIikpOwogICAgc3RhcnRNZWFzdXJpbmcoKTsKICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBvcGVuRWRpdG9yKGVkaXRvcklucHV0LCBFRElUT1JfSUQpOwogICAgc3RvcE1lYXN1cmluZygpOwogICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7CiAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwogICAgY2xvc2VFZGl0b3IoZWRpdG9yUGFydCk7CiAgfQp9Cg==