LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQogKiBDb3B5cmlnaHQgKGMpIDIwMTIgQnVuZGVzaW5zdGl0dXQgZvxyIFJpc2lrb2Jld2VydHVuZy4gDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCANCiAqIA0KICogQ29udHJpYnV0b3JzOiANCiAqICAgICBCdW5kZXNpbnN0aXR1dCBm/HIgUmlzaWtvYmV3ZXJ0dW5nIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIA0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCnBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGVkaXRvcjsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWU7DQoNCnB1YmxpYyBjbGFzcyBDb25uZWN0aW9uRGF0YSB7DQoNCglwcml2YXRlIEVkZ2UgZWRnZTsNCglwcml2YXRlIGludCBjdXJ2ZURlcHRoOw0KDQoJcHVibGljIENvbm5lY3Rpb25EYXRhKEVkZ2UgZWRnZSwgaW50IGN1cnZlRGVwdGgpIHsNCgkJdGhpcy5lZGdlID0gZWRnZTsNCgkJdGhpcy5jdXJ2ZURlcHRoID0gY3VydmVEZXB0aDsNCgl9DQoNCglwdWJsaWMgRWRnZSBnZXRFZGdlKCkgew0KCQlyZXR1cm4gZWRnZTsNCgl9DQoNCglwdWJsaWMgVVJJIGdldFVSSSgpIHsNCgkJcmV0dXJuIGVkZ2UuZ2V0VVJJKCk7DQoJfQ0KDQoJcHVibGljIFVSSSBnZXROb2RlQVVSSSgpIHsNCgkJcmV0dXJuIGVkZ2UuZ2V0Tm9kZUFVUkkoKTsNCgl9DQoNCglwdWJsaWMgVVJJIGdldE5vZGVCVVJJKCkgew0KCQlyZXR1cm4gZWRnZS5nZXROb2RlQlVSSSgpOw0KCX0NCg0KCXB1YmxpYyBFZGdlTGFiZWwgZ2V0RWRnZUxhYmVsKCkgew0KCQlyZXR1cm4gZWRnZS5nZXRMYWJlbCgpOw0KCX0NCg0KCXB1YmxpYyBTdHJpbmcgZ2V0RWRnZVRpdGxlKCkgew0KCQlpZiAoZWRnZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKSAhPSBudWxsKSB7DQoJCQlyZXR1cm4gZWRnZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAiIjsNCgkJfQ0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldEVkZ2VUaXRsZShTdHJpbmcgZWRnZVRpdGxlKSB7DQoJCWVkZ2UuZ2V0RHVibGluQ29yZSgpLnNldFRpdGxlKGVkZ2VUaXRsZSk7DQoJfQ0KDQoJcHVibGljIGRvdWJsZSBnZXRDb21tb25Cb3JkZXJMZW5ndGgoKSB7DQoJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgYm9yZGVyVmFsdWUgPSAoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSkgZWRnZQ0KCQkJCS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpOw0KDQoJCXJldHVybiBib3JkZXJWYWx1ZS5nZXRCb3JkZXJMZW5ndGgoKTsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRDb21tb25Cb3JkZXJMZW5ndGgoZG91YmxlIHZhbHVlKSB7DQoJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgYm9yZGVyVmFsdWUgPSAoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSkgZWRnZQ0KCQkJCS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpOw0KDQoJCWJvcmRlclZhbHVlLnNldEJvcmRlckxlbmd0aCh2YWx1ZSk7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRNaWdyYXRpb25Qb3B1bGF0aW9uKCkgew0KCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgPSAoTWlncmF0aW9uRWRnZSkgZWRnZTsNCg0KCQlpZiAobWlncmF0aW9uRWRnZS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpICE9IG51bGwpIHsNCgkJCXJldHVybiBtaWdyYXRpb25FZGdlLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gIiI7DQoJCX0NCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRNaWdyYXRpb25Qb3B1bGF0aW9uKFN0cmluZyB2YWx1ZSkgew0KCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgPSAoTWlncmF0aW9uRWRnZSkgZWRnZTsNCg0KCQltaWdyYXRpb25FZGdlLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHZhbHVlKTsNCgl9DQoJDQoJcHVibGljIGJvb2xlYW4gZ2V0TWlncmF0aW9uQWJzb2x1dGUoKSB7DQoJCU1pZ3JhdGlvbkVkZ2UgbWlncmF0aW9uRWRnZSA9IChNaWdyYXRpb25FZGdlKSBlZGdlOw0KDQoJCXJldHVybiBtaWdyYXRpb25FZGdlLmlzVXNlQWJzb2x1dGVWYWx1ZXMoKTsNCgl9DQoJDQoJcHVibGljIHZvaWQgc2V0TWlncmF0aW9uQWJzb2x1dGUoYm9vbGVhbiB2YWx1ZSkgew0KCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgPSAoTWlncmF0aW9uRWRnZSkgZWRnZTsNCg0KCQltaWdyYXRpb25FZGdlLnNldFVzZUFic29sdXRlVmFsdWVzKHZhbHVlKTsNCgl9DQoNCglwdWJsaWMgZG91YmxlIGdldE1pZ3JhdGlvblJhdGUoKSB7DQoJCU1pZ3JhdGlvbkVkZ2UgbWlncmF0aW9uRWRnZSA9IChNaWdyYXRpb25FZGdlKSBlZGdlOw0KDQoJCXJldHVybiBtaWdyYXRpb25FZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0TWlncmF0aW9uUmF0ZSgpOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldE1pZ3JhdGlvblJhdGUoZG91YmxlIHZhbHVlKSB7DQoJCU1pZ3JhdGlvbkVkZ2UgbWlncmF0aW9uRWRnZSA9IChNaWdyYXRpb25FZGdlKSBlZGdlOw0KDQoJCW1pZ3JhdGlvbkVkZ2UuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKS5zZXRNaWdyYXRpb25SYXRlKHZhbHVlKTsNCgl9DQoNCglwdWJsaWMgbG9uZyBnZXRNaWdyYXRpb25QZXJpb2QoKSB7DQoJCU1pZ3JhdGlvbkVkZ2UgbWlncmF0aW9uRWRnZSA9IChNaWdyYXRpb25FZGdlKSBlZGdlOw0KDQoJCXJldHVybiBtaWdyYXRpb25FZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0VGltZVBlcmlvZCgpOw0KCX0NCgkNCglwdWJsaWMgdm9pZCBzZXRNaWdyYXRpb25QZXJpb2QobG9uZyB2YWx1ZSkgew0KCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgPSAoTWlncmF0aW9uRWRnZSkgZWRnZTsNCg0KCQltaWdyYXRpb25FZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuc2V0VGltZVBlcmlvZCh2YWx1ZSk7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRSb2FkTmFtZSgpIHsNCgkJUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgcm9hZFZhbHVlID0gKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKSBlZGdlDQoJCQkJLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCk7DQoNCgkJaWYgKHJvYWRWYWx1ZS5nZXRSb2FkTmFtZSgpICE9IG51bGwpIHsNCgkJCXJldHVybiByb2FkVmFsdWUuZ2V0Um9hZE5hbWUoKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAiIjsNCgkJfQ0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldFJvYWROYW1lKFN0cmluZyByb2FkTmFtZSkgew0KCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByb2FkVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlyb2FkVmFsdWUuc2V0Um9hZE5hbWUocm9hZE5hbWUpOw0KCX0NCg0KCXB1YmxpYyBTdHJpbmcgZ2V0Um9hZENsYXNzKCkgew0KCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByb2FkVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlpZiAocm9hZFZhbHVlLmdldFJvYWRDbGFzcygpICE9IG51bGwpIHsNCgkJCXJldHVybiByb2FkVmFsdWUuZ2V0Um9hZENsYXNzKCk7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gIiI7DQoJCX0NCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRSb2FkQ2xhc3MoU3RyaW5nIHJvYWRDbGFzcykgew0KCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByb2FkVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlyb2FkVmFsdWUuc2V0Um9hZENsYXNzKHJvYWRDbGFzcyk7DQoJfQ0KDQoJcHVibGljIGludCBnZXRSb2FkQ3Jvc3NpbmdzKCkgew0KCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByb2FkVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlyZXR1cm4gcm9hZFZhbHVlLmdldE51bWJlckNyb3NzaW5ncygpOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldFJvYWRDcm9zc2luZ3MoaW50IGNyb3NzaW5ncykgew0KCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByb2FkVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlyb2FkVmFsdWUuc2V0TnVtYmVyQ3Jvc3NpbmdzKGNyb3NzaW5ncyk7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRQaXBlUG9wdWxhdGlvbigpIHsNCgkJUGlwZVRyYW5zcG9ydEVkZ2UgcGlwZSA9IChQaXBlVHJhbnNwb3J0RWRnZSkgZWRnZTsNCg0KCQlpZiAocGlwZS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpICE9IG51bGwpIHsNCgkJCXJldHVybiBwaXBlLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gIiI7DQoJCX0NCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRQaXBlUG9wdWxhdGlvbihTdHJpbmcgcG9wdWxhdGlvbikgew0KCQlQaXBlVHJhbnNwb3J0RWRnZSBwaXBlID0gKFBpcGVUcmFuc3BvcnRFZGdlKSBlZGdlOw0KDQoJCXBpcGUuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIocG9wdWxhdGlvbik7DQoJfQ0KDQoJcHVibGljIGRvdWJsZSBnZXRQaXBlRmxvdygpIHsNCgkJUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIHBpcGVWYWx1ZSA9IChQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUpIGVkZ2UNCgkJCQkuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCg0KCQlyZXR1cm4gcGlwZVZhbHVlLmdldE1heEZsb3coKTsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRQaXBlRmxvdyhkb3VibGUgZmxvdykgew0KCQlQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUgcGlwZVZhbHVlID0gKFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSkgZWRnZQ0KCQkJCS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpOw0KDQoJCXBpcGVWYWx1ZS5zZXRNYXhGbG93KGZsb3cpOw0KCX0NCg0KCXB1YmxpYyBsb25nIGdldFBpcGVQZXJpb2QoKSB7DQoJCVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSBwaXBlVmFsdWUgPSAoUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKSBlZGdlDQoJCQkJLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCk7DQoNCgkJcmV0dXJuIHBpcGVWYWx1ZS5nZXRUaW1lUGVyaW9kKCk7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0UGlwZVBlcmlvZChsb25nIHBlcmlvZCkgew0KCQlQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUgcGlwZVZhbHVlID0gKFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSkgZWRnZQ0KCQkJCS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpOw0KDQoJCXBpcGVWYWx1ZS5zZXRUaW1lUGVyaW9kKHBlcmlvZCk7DQoJfQ0KDQoJcHVibGljIGludCBnZXRDdXJ2ZURlcHRoKCkgew0KCQlyZXR1cm4gY3VydmVEZXB0aDsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRDdXJ2ZURlcHRoKGludCBjdXJ2ZURlcHRoKSB7DQoJCXRoaXMuY3VydmVEZXB0aCA9IGN1cnZlRGVwdGg7DQoJfQ0KDQp9