LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiQ2FsbHNWaWV3TW9kZWwuaCINCg0KdXNpbmcgbmFtZXNwYWNlIFJpbmdDbGllbnRVV1A7DQp1c2luZyBuYW1lc3BhY2UgVmlld01vZGVsOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkFwcGxpY2F0aW9uTW9kZWw6OkNvcmU7DQoNCkNhbGxzVmlld01vZGVsOjpDYWxsc1ZpZXdNb2RlbCgpDQp7DQogICAgQ2FsbHNMaXN0XyA9IHJlZiBuZXcgVmVjdG9yPENhbGxePigpOw0KDQogICAgLyogY29ubmVjdCB0byBkZWxlZ2F0ZXMuICovDQoNCiAgICBSaW5nRDo6aW5zdGFuY2UtPmluY29taW5nQ2FsbCArPSByZWYgbmV3IFJpbmdDbGllbnRVV1A6OkluY29taW5nQ2FsbChbJl0oDQogICAgU3RyaW5nXiBhY2NvdW50SWQsIFN0cmluZ14gY2FsbElkLCBTdHJpbmdeIGZyb20pIHsNCiAgICAgICAgYXV0byBjYWxsID0gYWRkTmV3Q2FsbChhY2NvdW50SWQsIGNhbGxJZCwgZnJvbSk7DQogICAgICAgIC8vIFJFRkFDVE8gOiBhZGQgaWYgY2FsbCA9PSBudWxscHRyDQogICAgICAgIGNhbGxSZWNpZXZlZChjYWxsKTsNCiAgICB9KTsNCg0KICAgIFJpbmdEOjppbnN0YW5jZS0+c3RhdGVDaGFuZ2UgKz0gcmVmIG5ldyBSaW5nQ2xpZW50VVdQOjpTdGF0ZUNoYW5nZShbJl0oDQogICAgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gc3RhdGUsIGludCBjb2RlKSB7DQogICAgICAgIGZvciBlYWNoIChhdXRvIGNhbGwgaW4gQ2FsbHNMaXN0Xykgew0KICAgICAgICAgICAgaWYgKGNhbGwtPmNhbGxJZCA9PSBjYWxsSWQpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gIk9WRVIiKSB7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWxsOw0KICAgICAgICAgICAgICAgICAgICBjYWxsLT5zdGF0ZUNoYW5nZSgiIiwgY29kZSk7DQogICAgICAgICAgICAgICAgICAgIGNhbGxFbmRlZCgpOw0KICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzVXBkYXRlZChjYWxsKTsgLy8gdXNlZCA/DQogICAgICAgICAgICAgICAgICAgIFJpbmdEOjppbnN0YW5jZS0+aGFuZ1VwQ2FsbChjYWxsKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAiQ1VSUkVOVCIpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXJ0ZWQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2FsbC0+c3RhdGVDaGFuZ2Uoc3RhdGUsIGNvZGUpOw0KICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNVcGRhdGVkKGNhbGwpOyAvLyBzYW1lLi4uDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIFdOR18oIkNhbGwgbm90IGZvdW5kIik7DQogICAgfSk7DQp9DQoNCkNhbGxeDQpSaW5nQ2xpZW50VVdQOjpWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsOjphZGROZXdDYWxsKFN0cmluZ14gYWNjb3VudElkLCBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBwZWVyKQ0Kew0KICAgIGlmIChhY2NvdW50SWQgPT0gIiIgfCBjYWxsSWQgPT0gIiIgfCBwZWVyID09ICIiKSB7DQogICAgICAgIFdOR18oImNhbGwgY2FuJ3QgYmUgY3JlYXRlZCIpOw0KICAgIH0NCiAgICBhdXRvIGNhbGwgPSByZWYgbmV3IENhbGwoYWNjb3VudElkLCBjYWxsSWQsIHBlZXIpOw0KICAgIENhbGxzTGlzdF8tPkFwcGVuZChjYWxsKTsNCiAgICByZXR1cm4gY2FsbDsNCn0NCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsOjpjbGVhckNhbGxzTGlzdCgpDQp7DQogICAgQ2FsbHNMaXN0Xy0+Q2xlYXIoKTsNCn0NCg0KQ2FsbF4NCkNhbGxzVmlld01vZGVsOjpmaW5kQ2FsbChTdHJpbmdeIGNhbGxJZCkNCnsNCiAgICBmb3IgZWFjaCAoQ2FsbF4gY2FsbCBpbiBDYWxsc0xpc3RfKQ0KICAgICAgICBpZiAoY2FsbC0+Y2FsbElkID09IGNhbGxJZCkNCiAgICAgICAgICAgIHJldHVybiBjYWxsOw0KDQogICAgcmV0dXJuIG51bGxwdHI7DQp9DQo=