LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp1c2luZyBuYW1lc3BhY2UgY29uY3VycmVuY3k7DQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQoNCi8qIGRlbGVnYXRlICovDQpkZWxlZ2F0ZSB2b2lkIEluY29taW5nQ2FsbChTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSk7DQpkZWxlZ2F0ZSB2b2lkIFN0YXRlQ2hhbmdlKFN0cmluZ14gY2FsbElkLCBTdHJpbmdeIHN0YXRlLCBpbnQgY29kZSk7DQpkZWxlZ2F0ZSB2b2lkIEluY29taW5nQWNjb3VudE1lc3NhZ2UoU3RyaW5nXiBhY2NvdW50SWQsIFN0cmluZ14gZnJvbSwgU3RyaW5nXiBwYXlsb2FkKTsNCg0KDQpwdWJsaWMgcmVmIGNsYXNzIFJpbmdEIHNlYWxlZA0Kew0KcHVibGljOg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KDQogICAgLyogcHJvcGVydGllcyAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBSaW5nRF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIFJpbmdEXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgUmluZ0ReIGluc3RhbmNlXyA9IHJlZiBuZXcgUmluZ0QoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwcm9wZXJ0eSBib29sIGRhZW1vblJ1bm5pbmcNCiAgICB7DQogICAgICAgIGJvb2wgZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGRhZW1vblJ1bm5pbmdfOw0KICAgICAgICB9DQogICAgfQ0KDQppbnRlcm5hbDoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICB2b2lkIHN0YXJ0RGFlbW9uKCk7DQogICAgdm9pZCByZWxvYWRBY2NvdW50TGlzdCgpOw0KICAgIHZvaWQgc2VuZEFjY291bnRUZXh0TWVzc2FnZShTdHJpbmdeIG1lc3NhZ2UpOw0KDQogICAgLyogVE9ETyA6IG1vdmUgbWVtYmVycyAqLw0KICAgIGJvb2wgaGFzQ29uZmlnOw0KICAgIHN0ZDo6c3RyaW5nIGFjY291bnROYW1lOw0KDQogICAgLyogZXZlbnRzICovDQogICAgZXZlbnQgSW5jb21pbmdDYWxsXiBpbmNvbWluZ0NhbGw7DQogICAgZXZlbnQgU3RhdGVDaGFuZ2VeIHN0YXRlQ2hhbmdlOw0KICAgIGV2ZW50IEluY29taW5nQWNjb3VudE1lc3NhZ2VeIGluY29taW5nQWNjb3VudE1lc3NhZ2U7DQoNCnByaXZhdGU6DQogICAgLyogc3ViIGNsYXNzZXMgKi8NCiAgICBlbnVtIGNsYXNzIFJlcXVlc3Qgew0KICAgICAgICBOb25lLA0KICAgICAgICBBZGRSaW5nQWNjb3VudCwNCiAgICAgICAgQWRkU0lQQWNjb3VudA0KICAgIH07DQogICAgcmVmIGNsYXNzIFRhc2sNCiAgICB7DQogICAgaW50ZXJuYWw6DQogICAgICAgIFRhc2soUmVxdWVzdCByKSB7IHJlcXVlc3QgPSByOyB9DQogICAgcHVibGljOg0KICAgICAgICBwcm9wZXJ0eSBSZXF1ZXN0IHJlcXVlc3Q7DQogICAgfTsNCg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KICAgIFJpbmdEKCk7IC8vIHNpbmdsZXRvbg0KICAgIHZvaWQgZGVxdWV1ZVRhc2tzKCk7DQoNCiAgICAvKiBtZW1iZXJzICovDQogICAgc3RkOjpzdHJpbmcgbG9jYWxGb2xkZXJfOw0KICAgIGJvb2wgZGFlbW9uUnVubmluZ18gPSBmYWxzZTsNCiAgICBzdGQ6OnF1ZXVlPFRhc2tePiB0YXNrc0xpc3RfOw0KfTsNCn0=