LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBOZXdBY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgTm9BY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgVXBkYXRlU2Nyb2xsVmlldygpOw0KDQpuYW1lc3BhY2UgVmlld01vZGVsIHsNCnB1YmxpYyByZWYgY2xhc3MgQWNjb3VudHNWaWV3TW9kZWwgc2VhbGVkDQp7DQppbnRlcm5hbDoNCiAgICAvKiBzaW5nbGV0b24gKi8NCiAgICBzdGF0aWMgcHJvcGVydHkgQWNjb3VudHNWaWV3TW9kZWxeIGluc3RhbmNlDQogICAgew0KICAgICAgICBBY2NvdW50c1ZpZXdNb2RlbF4gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgc3RhdGljIEFjY291bnRzVmlld01vZGVsXiBpbnN0YW5jZV8gPSByZWYgbmV3IEFjY291bnRzVmlld01vZGVsKCk7DQogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VfOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogZnVuY3Rpb25zICovDQogICAgdm9pZCBhZGQoc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nJiByaW5nSUQsIHN0ZDo6c3RyaW5nJiBhY2NvdW50VHlwZSwgc3RkOjpzdHJpbmcmIGFjY291bnRJRCk7DQogICAgdm9pZCBjbGVhckFjY291bnRMaXN0KCk7DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgcHJvcGVydHkgQWNjb3VudF4gc2VsZWN0ZWRBY2NvdW50DQogICAgew0KICAgICAgICBBY2NvdW50XiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW1fOw0KICAgICAgICB9DQogICAgICAgIHZvaWQgc2V0KEFjY291bnReIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBvbGRJdGVtXyA9IGN1cnJlbnRJdGVtXzsNCiAgICAgICAgICAgIGN1cnJlbnRJdGVtXyA9IHZhbHVlOw0KICAgICAgICAgICAgaWYgKHZhbHVlKQ0KICAgICAgICAgICAgICAgIG5ld0FjY291bnRTZWxlY3RlZCgpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIG5vQWNjb3VudFNlbGVjdGVkKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwcm9wZXJ0eSBWZWN0b3I8QWNjb3VudF4+XiBhY2NvdW50c0xpc3QNCiAgICB7DQogICAgICAgIFZlY3RvcjxBY2NvdW50Xj5eIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBhY2NvdW50c0xpc3RfOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogZXZlbnRzICovDQogICAgZXZlbnQgTmV3QWNjb3VudFNlbGVjdGVkXiBuZXdBY2NvdW50U2VsZWN0ZWQ7DQogICAgZXZlbnQgTm9BY2NvdW50U2VsZWN0ZWReIG5vQWNjb3VudFNlbGVjdGVkOw0KICAgIGV2ZW50IFVwZGF0ZVNjcm9sbFZpZXdeIHVwZGF0ZVNjcm9sbFZpZXc7DQoNCnByaXZhdGU6DQogICAgQWNjb3VudHNWaWV3TW9kZWwoKTsgLy8gc2luZ2xldG9uDQogICAgVmVjdG9yPEFjY291bnRePl4gYWNjb3VudHNMaXN0XzsNCiAgICBBY2NvdW50XiBjdXJyZW50SXRlbV87DQogICAgQWNjb3VudF4gb2xkSXRlbV87DQoNCn07DQp9DQp9DQo=