LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CgpjbGFzcyBTeWJhc2UKCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKewoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHRwVmVuZG9yTmFtZTsKCglzdGF0aWMgZmluYWwgVmVuZG9yIEFTQSA9IG5ldyBTeWJhc2UoIlN5YmFzZV9BU0EiKTsgLy8kTk9OLU5MUy0xJAoJc3RhdGljIGZpbmFsIFZlbmRvciBBU0UgPSBuZXcgU3liYXNlKCJTeWJhc2VfQVNFIik7IC8vJE5PTi1OTFMtMSQKCglzdGF0aWMgVmVuZG9yIGFzYSgpIHsKCQlyZXR1cm4gQVNBOwoJfQoKCXN0YXRpYyBWZW5kb3IgYXNlKCkgewoJCXJldHVybiBBU0U7Cgl9CgoJLyoqCgkgKiBFbnN1cmUgb25seSBzdGF0aWMgaW5zdGFuY2VzLgoJICovCglwcml2YXRlIFN5YmFzZShTdHJpbmcgZHRwVmVuZG9yTmFtZSkgewoJCXN1cGVyKCk7CgkJdGhpcy5kdHBWZW5kb3JOYW1lID0gZHRwVmVuZG9yTmFtZTsKCX0KCglAT3ZlcnJpZGUKCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKCQlyZXR1cm4gdGhpcy5kdHBWZW5kb3JOYW1lOwoJfQoKCUBPdmVycmlkZQoJQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKCQlyZXR1cm4gU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Cgl9CgoJLyoqCgkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKCSAqIGRlbGltaXRlcnMuIFRoaXMgY2FuIGRlcGVuZCBvbiB0aGUgY29sbGF0aW9uIHNldHRpbmcuLi4uCgkgKi8KCUBPdmVycmlkZQoJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Cgl9CgoJLyoqCgkgKiBTeWJhc2Ugd2lsbCB1c2UgdGhlIHVzZXItcmVxdWVzdGVkIGRhdGFiYXNlOyBpZiB0aGF0IGRhdGFiYXNlIGlzIG5vdAoJICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byAnbWFzdGVyJy4KCSAqLwoJQE92ZXJyaWRlCgl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewoJCW5hbWVzLmFkZChkYXRhYmFzZS5nZXROYW1lKCkpOwoJCW5hbWVzLmFkZChNQVNURVJfQ0FUQUxPR19OQU1FKTsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19OQU1FID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKCSAqICdkYm8nLgoJICogCgkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgoJICogVGhlIHNlcnZlciBsb29rcyBmb3IgYSBzY2hlbWEgb2JqZWN0IChlLmcuIGEgdGFibGUpIGZpcnN0IGluIHRoZSB1c2VyJ3MKCSAqIHNjaGVtYSwgdGhlbiBpdCBsb29rcyBmb3IgdGhlIHNjaGVtYSBvYmplY3QgaW4gdGhlIGRhdGFiYXNlIG93bmVyJ3MKCSAqIHNjaGVtYSAoZGJvKS4gQXMgYSByZXN1bHQsIGl0J3MgcmVhbGx5IG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5CgkgKiB0aGUgImRlZmF1bHQiIHNjaGVtYSB3aXRob3V0IGtub3dpbmcgdGhlIHNjaGVtYSBvYmplY3Qgd2UgYXJlCgkgKiBsb29raW5nIGZvci4KCSAqIAoJICogKE5vdGU6IHRoZSBjdXJyZW50ICd1c2VyJyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGN1cnJlbnQKCSAqICdsb2dpbicgLSBzZWUgc3BfYWRkdXNlciBhbmQgc3BfYWRkbG9naW47IHNvIHdlIHByb2JhYmx5IGNhbid0CgkgKiB1c2UgQ29ubmVjdGlvblByb2ZpbGUjZ2V0VXNlck5hbWUoKS4pCgkgKi8KCUBPdmVycmlkZQoJdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewoJCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCgoJQE92ZXJyaWRlCgljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Cgl9Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcgfTsKCglAT3ZlcnJpZGUKCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7CgkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Cgl9Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICelJywgJ6MnLCAnIycgfTsKCgkvKioKCSAqIEJ5IGRlZmF1bHQsIFN5YmFzZSBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJyYWNrZXRzIChbXSk7IGJ1dCBpdAoJICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KCSAqLwoJQE92ZXJyaWRlCglib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewoJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChpZGVudGlmaWVyKQoJCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKCX0KCn0K