LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBOZXdBY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgTm9BY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgVXBkYXRlU2Nyb2xsVmlldygpOw0KZGVsZWdhdGUgdm9pZCBBY2NvdW50QWRkZWQoQWNjb3VudF4gYWNjb3VudCk7DQpkZWxlZ2F0ZSB2b2lkIENsZWFyQWNjb3VudHNMaXN0KCk7DQoNCm5hbWVzcGFjZSBWaWV3TW9kZWwgew0KDQpwdWJsaWMgcmVmIGNsYXNzIEFjY291bnRzVmlld01vZGVsIHNlYWxlZA0Kew0KaW50ZXJuYWw6DQogICAgLyogc2luZ2xldG9uICovDQogICAgc3RhdGljIHByb3BlcnR5IEFjY291bnRzVmlld01vZGVsXiBpbnN0YW5jZQ0KICAgIHsNCiAgICAgICAgQWNjb3VudHNWaWV3TW9kZWxeIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN0YXRpYyBBY2NvdW50c1ZpZXdNb2RlbF4gaW5zdGFuY2VfID0gcmVmIG5ldyBBY2NvdW50c1ZpZXdNb2RlbCgpOw0KICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KICAgIHZvaWQgYWRkUmluZ0FjY291bnQoc3RkOjpzdHJpbmcmIGFsaWFzLCBzdGQ6OnN0cmluZyYgcmluZ0lELCBzdGQ6OnN0cmluZyYgYWNjb3VudElELCBzdGQ6OnN0cmluZyYgZGV2aWNlSWQsIGJvb2wgdXBucFN0YXRlKTsNCiAgICB2b2lkIGFkZFNpcEFjY291bnQoc3RkOjpzdHJpbmcmIGFsaWFzLCBzdGQ6OnN0cmluZyYgYWNjb3VudElELCBzdGQ6OnN0cmluZyYgc2lwSG9zdG5hbWUsIHN0ZDo6c3RyaW5nJiBzaXBVc2VybmFtZSwgc3RkOjpzdHJpbmcmIHNpcFBhc3N3b3JkKTsNCiAgICB2b2lkIGNsZWFyQWNjb3VudExpc3QoKTsNCiAgICBBY2NvdW50XiBmaW5kSXRlbShTdHJpbmdeIGFjY291bnRJZCk7DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgcHJvcGVydHkgVmVjdG9yPEFjY291bnRePl4gYWNjb3VudHNMaXN0DQogICAgew0KICAgICAgICBWZWN0b3I8QWNjb3VudF4+XiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gYWNjb3VudHNMaXN0XzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIGV2ZW50cyAqLw0KICAgIGV2ZW50IE5ld0FjY291bnRTZWxlY3RlZF4gbmV3QWNjb3VudFNlbGVjdGVkOw0KICAgIGV2ZW50IE5vQWNjb3VudFNlbGVjdGVkXiBub0FjY291bnRTZWxlY3RlZDsNCiAgICBldmVudCBVcGRhdGVTY3JvbGxWaWV3XiB1cGRhdGVTY3JvbGxWaWV3Ow0KICAgIGV2ZW50IEFjY291bnRBZGRlZF4gYWNjb3VudEFkZGVkOw0KICAgIGV2ZW50IENsZWFyQWNjb3VudHNMaXN0XiBjbGVhckFjY291bnRzTGlzdDsNCg0KcHJpdmF0ZToNCiAgICBBY2NvdW50c1ZpZXdNb2RlbCgpOyAvLyBzaW5nbGV0b24NCiAgICBWZWN0b3I8QWNjb3VudF4+XiBhY2NvdW50c0xpc3RfOw0KDQp9Ow0KfQ0KfQ0K