LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDEyIHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KICoKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICoKICogQ09OVFJJQlVUT1JTOgogKiAJCUhlbnJpayBSZW50ei1SZWljaGVydCAoaW5pdGlhbCBjb250cmlidXRpb24pCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmdlbmVyaWMKCmltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uR3VhcmRlZFRyYW5zaXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uTm9uSW5pdGlhbFRyYW5zaXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uUmVmaW5lZFN0YXRlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5mc20uZlNNLlN0YXRlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5mc20uZlNNLlRyaWdnZXJlZFRyYW5zaXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS51dGlsLkZTTUhlbHBlcnMKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmZzbS5UcmlnZ2VyRXh0ZW5zaW9ucwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZnNtLmZzbWdlbi5HcmFwaENvbnRhaW5lcgppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZnNtLmZzbWdlbi5MaW5rCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5mc20uZnNtZ2VuLk5vZGUKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZnNtLmdlbmVyaWMuQWJzdHJhY3RTdGF0ZU1hY2hpbmVHZW5lcmF0b3IKCi8qKgogKiBBIHRhcmdldCBsYW5ndWFnZSBpbmRlcGVuZGVudCBnZW5lcmF0b3Igb2YgdGhlIHN0YXRlIG1hY2hpbmUgaW1wbGVtZW50YXRpb24KICovCmNsYXNzIEdlbmVyaWNTdGF0ZU1hY2hpbmVHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0YXRlTWFjaGluZUdlbmVyYXRvciB7CgoJQEluamVjdAoJcHJvdGVjdGVkIGV4dGVuc2lvbiBUcmlnZ2VyRXh0ZW5zaW9ucwoJCglASW5qZWN0Cglwcm90ZWN0ZWQgZXh0ZW5zaW9uIEZTTUhlbHBlcnMKCQoJLyoqCgkgKiBnZW5lcmF0ZXMgdGhlIGNvZGUgb2YgdGhlIHdob2xlIHN0YXRlIG1hY2hpbmUsIGNvbnNpc3Rpbmcgb2YgY29uc3RhbnRzICsgbWV0aG9kcwoJICoKCSAqIEBwYXJhbSB4cG1jIHRoZSB7QGxpbmsgRXhwYW5kZWRNb2RlbENvbXBvbmVudH0KCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBjb2RlCgkgKi8KCWRlZiBnZW5TdGF0ZU1hY2hpbmUoR3JhcGhDb250YWluZXIgZ2MpICcnJwoJCatnZW5TdGF0ZU1hY2hpbmVDb25zdGFudHMoZ2MpuwoKCQmrZ2VuU3RhdGVNYWNoaW5lTWV0aG9kcyhnYywgdHJ1ZSm7CgknJycKCgkvKioKCSAqIGdlbmVyYXRlcyB0aGUgY29uc3RhbnRzIGZvciB0aGUgc3RhdGUgbWFjaGluZQoJICovCglkZWYgZ2VuU3RhdGVNYWNoaW5lQ29uc3RhbnRzKEdyYXBoQ29udGFpbmVyIGdjKSAnJycKCQkvKiBzdGF0ZSBJRHMgKi8KCQmrZ2MuZ2VuU3RhdGVJZENvbnN0YW50c7sKCgkJLyogdHJhbnNpdGlvbiBjaGFpbnMgKi8KCQmrZ2MuZ2VuVHJhbnNpdGlvbkNoYWluQ29uc3RhbnRzuwoKCQkvKiB0cmlnZ2VycyAqLwoJCatnYy5nZW5UcmlnZ2VyQ29uc3RhbnRzuwoJJycnCgoJLyoqCgkgKiBnZW5lcmF0ZXMgdGhlIG1ldGhvZHMgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lIGNvZGVzIGFuZCBzdGF0ZSBzd2l0Y2hpbmcKCSAqCgkgKiBAcGFyYW0geHBtYyB0aGUge0BsaW5rIEV4cGFuZGVkTW9kZWxDb21wb25lbnR9CgkgKiBAcGFyYW0gZ2VuZXJhdGVJbXBsZW1lbmF0aW9uIG9yIGRlY2xhcmF0aW9uIG9ubHkKCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBjb2RlCgkgKi8KCWRlZiBnZW5TdGF0ZU1hY2hpbmVNZXRob2RzKEdyYXBoQ29udGFpbmVyIGdjLCBib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pICcnJwoJCatnZW5FeHRyYShnYywgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbim7CgoJCS8qIEVudHJ5IGFuZCBFeGl0IENvZGVzICovCgkJq2djLmdlbkVudHJ5QW5kRXhpdENvZGVzKGdlbmVyYXRlSW1wbGVtZW50YXRpb24puwoKCQkvKiBBY3Rpb24gQ29kZXMgKi8KCQmrZ2MuZ2VuQWN0aW9uQ29kZXMoZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbim7CgoJCS8qIFN0YXRlIFN3aXRjaCBNZXRob2RzICovCgkJq2djLmdlblN0YXRlU3dpdGNoTWV0aG9kcyhnZW5lcmF0ZUltcGxlbWVudGF0aW9uKbsKCScnJwoKCS8qKgoJICogZ2VuZXJhdGUgYSB0cmFuc2l0aW9uIGd1YXJkIGlmIGFwcGxpY2FibGUKCSAqCgkgKiBAcGFyYW0gdHQgYSB7QGxpbmsgVHJpZ2dlcmVkVHJhbnNpdGlvbn0KCSAqIEBwYXJhbSB0cmlnZ2VyIGEgdHJpZ2dlciBzdHJpbmcKCSAqIEBwYXJhbSB4cG1jIGFuIGV4cGFuZGVkIGFjdG9yIGNsYXNzCgkgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY29kZQoJICovCglvdmVycmlkZSBTdHJpbmcgZ2VuVHJpZ2dlcmVkVHJhbnNpdGlvbkd1YXJkKExpbmsgdHQsIFN0cmluZyB0cmlnZ2VyLCBHcmFwaENvbnRhaW5lciBnYykgewoJCXZhbCB0ciA9ICh0dC50cmFuc2l0aW9uIGFzIFRyaWdnZXJlZFRyYW5zaXRpb24pLnRyaWdnZXJzLmZpbmRGaXJzdCh0cmlnfHRyaWcuaXNNYXRjaGluZyh0cmlnZ2VyKSkKCScnJwoJCatJRiB0ci5oYXNHdWFyZCgpuwoJCQlpZiAoq3RyYW5zbGF0b3IuZ2V0VHJhbnNsYXRlZENvZGUodHIuZ3VhcmQuZ3VhcmQpuykKCQmrRU5ESUa7CgknJycKCX0KCiAgICBvdmVycmlkZSBTdHJpbmcgZ2VuR3VhcmRlZFRyYW5zaXRpb25HdWFyZChMaW5rIGxpbmssIFN0cmluZyB0cmlnZ2VyLCBHcmFwaENvbnRhaW5lciBnYykgewogICAgICAgICcnJwogICAgICAgICAgICCrdHJhbnNsYXRvci5nZXRUcmFuc2xhdGVkQ29kZSgobGluay50cmFuc2l0aW9uIGFzIEd1YXJkZWRUcmFuc2l0aW9uKS5ndWFyZCm7CiAgICAgICAgJycnCiAgICB9CgoJb3ZlcnJpZGUgU3RyaW5nIGdlbkFjdGlvbkNvZGVNZXRob2QoR3JhcGhDb250YWluZXIgZ2MsIExpbmsgbGluaywgYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7CiAgICAgICAgdmFyIGhhc0FyZ3MgPSAhbGluay5jaGFpbkhlYWRzLmVtcHR5ICYmIGxpbmsuY2hhaW5IZWFkcy5mb3JhbGxbdHJhbnNpdGlvbiBpbnN0YW5jZW9mIE5vbkluaXRpYWxUcmFuc2l0aW9uICYmICEodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEd1YXJkZWRUcmFuc2l0aW9uKV0KICAgICAgICB2YWwgb3BTY29wZSA9IGxhbmdFeHQub3BlcmF0aW9uU2NvcGUoZ2MuY2xhc3NOYW1lLCBmYWxzZSkKICAgICAgICB2YWwgb3BTY29wZVByaXYgPSBpZiAobGFuZ0V4dC51c2VzSW5oZXJpdGFuY2UpIG9wU2NvcGUgZWxzZSAiIgogICAgICAgIHZhbCBpZkl0ZW1QdHIgPSAiSW50ZXJmYWNlSXRlbUJhc2UiK2xhbmdFeHQucG9pbnRlckxpdGVyYWwoKQogICAgICAgIHZhbCBjb25zdElmSXRlbVB0ciA9IGlmIChsYW5nRXh0LnVzZXNQb2ludGVycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3QgIitpZkl0ZW1QdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZkl0ZW1QdHIKCiAgICAgICAgaWYgKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKICAgIAkgICAgJycnCiAgICAgICAgICAgICAgICCrbGFuZ0V4dC5hY2Nlc3NMZXZlbFByb3RlY3RlZLt2b2lkIKtvcFNjb3BlUHJpdrurbGluay50cmFuc2l0aW9uLmdldEFjdGlvbkNvZGVPcGVyYXRpb25OYW1lKCm7KKtsYW5nRXh0LnNlbGZQb2ludGVyKGdjLmNsYXNzTmFtZSwgaGFzQXJncym7q0lGIGhhc0FyZ3O7q2NvbnN0SWZJdGVtUHRyuyBpZml0ZW2rdHJhbnNpdGlvbkNoYWluR2VuZXJhdG9yLmdlbmVyYXRlQXJndW1lbnRMaXN0KGdjLCBsaW5rKburRU5ESUa7KSB7CiAgICAgICAgICAgICAgICAgICAgq3RyYW5zbGF0b3IuZ2V0VHJhbnNsYXRlZENvZGUobGluay50cmFuc2l0aW9uLmFjdGlvbim7CiAgICAgICAgICAgICAgICB9CiAgICAJICAgICcnJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJycnCiAgICAgICAgICAgICAgICCrbGFuZ0V4dC5hY2Nlc3NMZXZlbFByb3RlY3RlZLurbGFuZ0V4dC5tYWtlT3ZlcnJpZGFibGW7dm9pZCCrbGluay50cmFuc2l0aW9uLmdldEFjdGlvbkNvZGVPcGVyYXRpb25OYW1lKCm7KKtsYW5nRXh0LnNlbGZQb2ludGVyKGdjLmNsYXNzTmFtZSwgaGFzQXJncym7q0lGIGhhc0FyZ3O7q2NvbnN0SWZJdGVtUHRyuyBpZml0ZW2rdHJhbnNpdGlvbkNoYWluR2VuZXJhdG9yLmdlbmVyYXRlQXJndW1lbnRMaXN0KGdjLCBsaW5rKburRU5ESUa7KTsKICAgICAgICAgICAgJycnCiAgICAgICAgfQoJfQoKCS8qKgoJICogZ2VuZXJhdGUgYWN0aW9uIGNvZGUgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBvciBkZWNsYXJhdGlvbnMKCSAqCgkgKiBAcGFyYW0geHBheCB0aGUge0BsaW5rIEV4cGFuZGVkTW9kZWxDb21wb25lbnR9CgkgKiBAcGFyYW0gc3RhdGUgdGhlIHtAbGluayBTdGF0ZX0KCSAqIEBwYXJhbSBnZW5lcmF0ZUltcGxlbWVudGF0aW9uIGlmIG9ubHkgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBnZW5lcmF0ZWQgdGhlbiA8Y29kZT5mYWxzZTwvY29kZT4gaGFzIHRvIGJlIHBhc3NlZAoJICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvZGUKCSAqLwoJb3ZlcnJpZGUgU3RyaW5nIGdlbkFjdGlvbkNvZGVNZXRob2RzKEdyYXBoQ29udGFpbmVyIGdjLCBOb2RlIG5vZGUsIGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewoJCXZhbCBtYyA9IGdjLm1vZGVsQ29tcG9uZW50CgkJdmFsIHNlbGZQdHIgPSBsYW5nRXh0LnNlbGZQb2ludGVyKGdjLmNsYXNzTmFtZSwgZmFsc2UpCgkJdmFsIG9wU2NvcGUgPSBsYW5nRXh0Lm9wZXJhdGlvblNjb3BlKGdjLmNsYXNzTmFtZSwgZmFsc2UpCgkJdmFsIG9wU2NvcGVQcml2ID0gaWYgKGxhbmdFeHQudXNlc0luaGVyaXRhbmNlKQoJCQkJCQkJb3BTY29wZQoJCQkJCQllbHNlCgkJCQkJCQkiIgoJCXZhbCBzdGF0ZSA9IG5vZGUuc3RhdGVHcmFwaE5vZGUgYXMgU3RhdGUKCQl2YWwgZW50cnlPcCA9IHN0YXRlLmdldEVudHJ5Q29kZU9wZXJhdGlvbk5hbWUoKQoJCXZhbCBleGl0T3AgPSBzdGF0ZS5nZXRFeGl0Q29kZU9wZXJhdGlvbk5hbWUoKQoJCXZhbCBkb09wID0gc3RhdGUuZ2V0RG9Db2RlT3BlcmF0aW9uTmFtZSgpCgkJdmFyIGVudHJ5ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGVkQ29kZShzdGF0ZS5lbnRyeUNvZGUpCgkJdmFyIGV4aXQgPSB0cmFuc2xhdG9yLmdldFRyYW5zbGF0ZWRDb2RlKHN0YXRlLmV4aXRDb2RlKQoJCXZhciBkb2NvZGUgPSB0cmFuc2xhdG9yLmdldFRyYW5zbGF0ZWRDb2RlKHN0YXRlLmRvQ29kZSkKCQlpZiAoc3RhdGUgaW5zdGFuY2VvZiBSZWZpbmVkU3RhdGUpIHsKCQkJdmFsIGluaEVudHJ5ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGVkQ29kZShzdGF0ZS5pbmhlcml0ZWRFbnRyeUNvZGUpCgkJCXZhbCBpbmhFeGl0ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGVkQ29kZShzdGF0ZS5pbmhlcml0ZWRFeGl0Q29kZSkKCQkJdmFsIGluaERvID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGVkQ29kZShzdGF0ZS5pbmhlcml0ZWREb0NvZGUpCgkJCWlmIChsYW5nRXh0LnVzZXNJbmhlcml0YW5jZSkgewoJCQkJLy8gd2UgY2FsbCB0aGUgc3VwZXIgbWV0aG9kIGluIHRoZSBnZW5lcmF0ZWQgY29kZQoJCQkJdmFsIGJhc2VOYW1lID0gbWMuYmFzZS5jbGFzc05hbWUKCQkJCWlmIChzdGF0ZS5pbmhlcml0ZWRFbnRyeUNvZGUuaGFzRGV0YWlsQ29kZSkKCQkJCQllbnRyeSA9IGxhbmdFeHQuc3VwZXJDYWxsKGJhc2VOYW1lLCBlbnRyeU9wLCAiIikgKyBlbnRyeQoJCQkJaWYgKHN0YXRlLmluaGVyaXRlZEV4aXRDb2RlLmhhc0RldGFpbENvZGUpCgkJCQkJZXhpdCA9IGV4aXQgKyBsYW5nRXh0LnN1cGVyQ2FsbChiYXNlTmFtZSwgZXhpdE9wLCAiIikKCQkJCWlmIChzdGF0ZS5pbmhlcml0ZWREb0NvZGUuaGFzRGV0YWlsQ29kZSkKCQkJCQlkb2NvZGUgPSBsYW5nRXh0LnN1cGVyQ2FsbChiYXNlTmFtZSwgZG9PcCwgIiIpICsgZG9jb2RlCgkJCX0KCQkJZWxzZSB7CgkJCQkvLyB0aGUgaW5oZXJpdGVkIGNvZGUgaXMgYWRkZWQgZGlyZWN0bHkKCQkJCWVudHJ5ID0gaW5oRW50cnkgKyBlbnRyeQoJCQkJZXhpdCA9IGV4aXQgKyBpbmhFeGl0CgkJCQlkb2NvZGUgPSBpbmhEbyArIGRvY29kZQoJCQl9CgkJfQoJCScnJwoJCatJRiAhZW50cnkuZW1wdHm7CgkJCatJRiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uuwoJCQkJq2xhbmdFeHQuYWNjZXNzTGV2ZWxQcm90ZWN0ZWS7dm9pZCCrb3BTY29wZVByaXa7q2VudHJ5T3C7KKtzZWxmUHRyuykgewoJCQkJCatlbnRyebsKCQkJCX0KCQkJq0VMU0W7CgkJCQmrbGFuZ0V4dC5hY2Nlc3NMZXZlbFByb3RlY3RlZLurbGFuZ0V4dC5tYWtlT3ZlcnJpZGFibGW7dm9pZCCrZW50cnlPcLsoq3NlbGZQdHK7KTsKCQkJq0VORElGuwoJCatFTkRJRrsKCQmrSUYgIWV4aXQuZW1wdHm7CgkJCatJRiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uuwoJCQkJq2xhbmdFeHQuYWNjZXNzTGV2ZWxQcm90ZWN0ZWS7dm9pZCCrb3BTY29wZVByaXa7q2V4aXRPcLsoq3NlbGZQdHK7KSB7CgkJCQkJq2V4aXS7CgkJCQl9CgkJCatFTFNFuwoJCQkJq2xhbmdFeHQuYWNjZXNzTGV2ZWxQcm90ZWN0ZWS7q2xhbmdFeHQubWFrZU92ZXJyaWRhYmxlu3ZvaWQgq2V4aXRPcLsoq3NlbGZQdHK7KTsKCQkJq0VORElGuwoJCatFTkRJRrsKCQmrSUYgIWRvY29kZS5lbXB0ebsKCQkJq0lGIGdlbmVyYXRlSW1wbGVtZW50YXRpb267CgkJCQmrbGFuZ0V4dC5hY2Nlc3NMZXZlbFByb3RlY3RlZLsgdm9pZCCrb3BTY29wZVByaXa7q2RvT3C7KKtzZWxmUHRyuykgewoJCQkJCatkb2NvZGW7CgkJCQl9CgkJCatFTFNFuwoJCQkJq2xhbmdFeHQuYWNjZXNzTGV2ZWxQcm90ZWN0ZWS7q2xhbmdFeHQubWFrZU92ZXJyaWRhYmxlu3ZvaWQgq2RvT3C7KKtzZWxmUHRyuyk7CgkJCatFTkRJRrsKCQmrRU5ESUa7CgkJJycnCgl9CgoJIC8qKgogICAgICogbGV0IGRlcml2ZWQgY2xhc3MgYWRkIGV4dHJhIGNvZGUgYWZ0ZXIgZGVmaW5pdGlvbiBvZiBjb25zdGFudHMKICAgICAqCiAgICAgKiBAcGFyYW0geHBtYyBhbiBleHBhbmRlZCBhY3RvciBjbGFzcwogICAgICogQHBhcmFtIGdlbmVyYXRlSW1wbGVtZW50YXRpb24gb3IgZGVjbGFyYXRpb24gb25seQogICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAqLwogICAgZGVmIGdlbkV4dHJhKEdyYXBoQ29udGFpbmVyIGdjLCBib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsnJycnJyd9Cn0K