LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLyoqCiAqIFB1Ymxpc2ggY29udHJvbGxlci4KICovCnB1YmxpYyBjbGFzcyBQdWJsaXNoQ29udHJvbCB7CglwdWJsaWMgU3RyaW5nIG1lbWVudG87CglwdWJsaWMgU3RyaW5nIHBhcmVudHM7CglwdWJsaWMgYm9vbGVhbiBpc0RpcnR5ID0gdHJ1ZTsKCXB1YmxpYyBMaXN0IHJlc291cmNlSW5mbyA9IG5ldyBBcnJheUxpc3QoKTsKCglwdWJsaWMgY2xhc3MgUmVzb3VyY2VQdWJsaXNoSW5mbyB7CgkJSVBhdGggbG9jYWxQYXRoOwoJCWxvbmcgbG9jYWxUaW1lc3RhbXA7CgkJSVBhdGggcmVtb3RlUGF0aDsKCQlsb25nIHJlbW90ZVRpbWVzdGFtcDsKCgkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VQdWJsaXNoSW5mbykpCgkJCQlyZXR1cm4gZmFsc2U7CgoJCQkvLyByZXR1cm4gdHJ1ZSBpZiBsb2NhbCBvciByZW1vdGUgcGF0aHMgYXJlIGVxdWFsCgkJCVJlc291cmNlUHVibGlzaEluZm8gcnBpID0gKFJlc291cmNlUHVibGlzaEluZm8pIG9iajsKCQkJaWYgKGxvY2FsUGF0aCA9PSBudWxsICYmIHJwaS5sb2NhbFBhdGggPT0gbnVsbCkKCQkJCXJldHVybiB0cnVlOwoJCQllbHNlIGlmIChsb2NhbFBhdGggIT0gbnVsbCAmJiBsb2NhbFBhdGguZXF1YWxzKHJwaS5sb2NhbFBhdGgpKQoJCQkJcmV0dXJuIHRydWU7CgkJCWVsc2UgaWYgKHJlbW90ZVBhdGggIT0gbnVsbCAmJiBycGkucmVtb3RlUGF0aCA9PSBudWxsKQoJCQkJcmV0dXJuIHRydWU7CgkJCWVsc2UgaWYgKHJlbW90ZVBhdGggIT0gbnVsbCAmJiByZW1vdGVQYXRoLmVxdWFscyhycGkucmVtb3RlUGF0aCkpCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJZWxzZQoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCQoJLyoqCgkgKiBQdWJsaXNoQ29udHJvbCBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgUHVibGlzaENvbnRyb2woU3RyaW5nIHBhcmVudHMsIFN0cmluZyBtZW1lbnRvKSB7CgkJc3VwZXIoKTsKCgkJdGhpcy5wYXJlbnRzID0gcGFyZW50czsKCQl0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwoJfQoJCgkvKioKCSAqIFB1Ymxpc2hDb250cm9sIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBQdWJsaXNoQ29udHJvbChJTWVtZW50byBtZW1lbnRvKSB7CgkJc3VwZXIoKTsKCQkKCQlsb2FkKG1lbWVudG8pOwoJfQoJCglwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB7CgkJcmV0dXJuIG1lbWVudG87Cgl9CgkKCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50c1JlZigpIHsKCQlyZXR1cm4gcGFyZW50czsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgaXMgZGlydHkuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CgkJcmV0dXJuIGlzRGlydHk7Cgl9CgkKCS8qKgoJICogU2V0cyB0aGUgZGlydHkgZmxhZy4KCSAqCgkgKiBAcGFyYW0gYm9vbGVhbgoJICovCglwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGIpIHsKCQlpc0RpcnR5ID0gYjsKCX0KCQoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvMikgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBjb250cm9sIGZvcjogIiArIG1lbWVudG8yKTsKCQoJCXRyeSB7CgkJCW1lbWVudG8gPSBtZW1lbnRvMi5nZXRTdHJpbmcoIm1lbWVudG8iKTsKCQkJcGFyZW50cyA9IG1lbWVudG8yLmdldFN0cmluZygicGFyZW50cyIpOwoJCQkvKlN0cmluZyB0ZW1wID0gcHJvamVjdENoaWxkW2ldLmdldFN0cmluZygiZGlydHkiKTsKCQkJaWYgKCJ0cnVlIi5lcXVhbHModGVtcCkpCgkJCQlwcGkuaXNEaXJ0eSA9IHRydWU7CgkJCWVsc2UKCQkJCXBwaS5pc0RpcnR5ID0gZmFsc2U7Ki8KCQoJCQlJTWVtZW50b1tdIHJlc291cmNlQ2hpbGQgPSBtZW1lbnRvMi5nZXRDaGlsZHJlbigicmVzb3VyY2UiKTsKCQkJaW50IHNpemUyID0gcmVzb3VyY2VDaGlsZC5sZW5ndGg7CgkJCXJlc291cmNlSW5mbyA9IG5ldyBBcnJheUxpc3Qoc2l6ZTIgKyA1KTsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7CgkJCQlSZXNvdXJjZVB1Ymxpc2hJbmZvIHJwaSA9IG5ldyBSZXNvdXJjZVB1Ymxpc2hJbmZvKCk7CgkJCQlTdHJpbmcgdGVtcCA9IHJlc291cmNlQ2hpbGRbal0uZ2V0U3RyaW5nKCJsb2NhbFBhdGgiKTsKCQkJCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcC5sZW5ndGgoKSA+IDEpCgkJCQkJcnBpLmxvY2FsUGF0aCA9IG5ldyBQYXRoKHRlbXApOwoJCQkJdGVtcCA9IHJlc291cmNlQ2hpbGRbal0uZ2V0U3RyaW5nKCJyZW1vdGVQYXRoIik7CgkJCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAxKQoJCQkJCXJwaS5yZW1vdGVQYXRoID0gbmV3IFBhdGgodGVtcCk7CgkJCQl0ZW1wID0gcmVzb3VyY2VDaGlsZFtqXS5nZXRTdHJpbmcoImxvY2FsVGltZXN0YW1wIik7CgkJCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAxKQoJCQkJCXJwaS5sb2NhbFRpbWVzdGFtcCA9IExvbmcucGFyc2VMb25nKHRlbXApOwoJCQkJdGVtcCA9IHJlc291cmNlQ2hpbGRbal0uZ2V0U3RyaW5nKCJyZW1vdGVUaW1lc3RhbXAiKTsKCQkJCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcC5sZW5ndGgoKSA+IDEpCgkJCQkJcnBpLnJlbW90ZVRpbWVzdGFtcCA9IExvbmcucGFyc2VMb25nKHRlbXApOwoJCQkJcmVzb3VyY2VJbmZvLmFkZChycGkpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHB1Ymxpc2ggY29udHJvbCBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgkKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bzIpIHsKCQl0cnkgewoJCQltZW1lbnRvMi5wdXRTdHJpbmcoIm1lbWVudG8iLCBtZW1lbnRvKTsKCQkJbWVtZW50bzIucHV0U3RyaW5nKCJwYXJlbnRzIiwgcGFyZW50cyk7CgkJCS8qaWYgKHBwaS5pc0RpcnR5KQoJCQkJcHJvamVjdC5wdXRTdHJpbmcoImRpcnR5IiwgInRydWUiKTsKCQkJZWxzZQoJCQkJcHJvamVjdC5wdXRTdHJpbmcoImRpcnR5IiwgImZhbHNlIik7Ki8KCQoJCQlJdGVyYXRvciBpdGUgPSByZXNvdXJjZUluZm8uaXRlcmF0b3IoKTsKCQkJd2hpbGUgKGl0ZS5oYXNOZXh0KCkpIHsKCQkJCVJlc291cmNlUHVibGlzaEluZm8gcnBpID0gKFJlc291cmNlUHVibGlzaEluZm8pIGl0ZS5uZXh0KCk7CgkJCQlJTWVtZW50byByZXNvdXJjZSA9IG1lbWVudG8yLmNyZWF0ZUNoaWxkKCJyZXNvdXJjZSIpOwoJCgkJCQlpZiAocnBpLmxvY2FsUGF0aCAhPSBudWxsKSB7CgkJCQkJcmVzb3VyY2UucHV0U3RyaW5nKCJsb2NhbFBhdGgiLCBycGkubG9jYWxQYXRoLnRvU3RyaW5nKCkpOwoJCQkJCXJlc291cmNlLnB1dFN0cmluZygibG9jYWxUaW1lc3RhbXAiLCBuZXcgTG9uZyhycGkubG9jYWxUaW1lc3RhbXApLnRvU3RyaW5nKCkpOwoJCQkJfQoJCQkJaWYgKHJwaS5yZW1vdGVQYXRoICE9IG51bGwpIHsKCQkJCQlyZXNvdXJjZS5wdXRTdHJpbmcoInJlbW90ZVBhdGgiLCBycGkucmVtb3RlUGF0aC50b1N0cmluZygpKTsKCQkJCQlyZXNvdXJjZS5wdXRTdHJpbmcoInJlbW90ZVRpbWVzdGFtcCIsIG5ldyBMb25nKHJwaS5yZW1vdGVUaW1lc3RhbXApLnRvU3RyaW5nKCkpOwoJCQkJfQoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgcHVibGlzaCBjb250cm9sIGluZm8iLCBlKTsKCQl9Cgl9CgkKCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJcmV0dXJuICJQdWJsaXNoQ29udHJvbCBbIiArIG1lbWVudG8gKyAiICIgKyBpc0RpcnR5ICsgIl0iOwoJfQp9