I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpEYXRhOw0KDQpuYW1lc3BhY2UgUmluZ0NsaWVudFVXUA0Kew0KLyogZW51bWVyYXRpb25zLiAqLw0KcHVibGljIGVudW0gY2xhc3MgQ2FsbFN0YXR1cyB7IE5PTkUsIElOQ09NSU5HX1JJTkdJTkcsIE9VVEdPSU5HX1JJTkdJTkcsIFNFQVJDSElORywgSU5fUFJPR1JFU1MsIEVOREVEIH07DQoNCnB1YmxpYyByZWYgY2xhc3MgQ2FsbCBzZWFsZWQgOiBwdWJsaWMgSU5vdGlmeVByb3BlcnR5Q2hhbmdlZA0Kew0KcHVibGljOg0KDQogICAgLyogZnVuY3Rpb25zICovDQogICAgQ2FsbChTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSk7DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgdmlydHVhbCBldmVudCBQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJeIFByb3BlcnR5Q2hhbmdlZDsNCg0KICAgIHByb3BlcnR5IFN0cmluZ14gYWNjb3VudElkOw0KICAgIHByb3BlcnR5IFN0cmluZ14gY2FsbElkOw0KICAgIHByb3BlcnR5IFN0cmluZ14gZnJvbTsNCiAgICBwcm9wZXJ0eSBDYWxsU3RhdHVzIHN0YXRlIHsNCiAgICAgICAgQ2FsbFN0YXR1cyBnZXQoKSB7DQogICAgICAgICAgICByZXR1cm4gc3RhdGVfOw0KICAgICAgICB9DQogICAgICAgIHZvaWQgc2V0KENhbGxTdGF0dXMgdmFsdWUpIHsNCiAgICAgICAgICAgIHN0YXRlXyA9IHZhbHVlOw0KICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VkKHRoaXMsIHJlZiBuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKCJzdGF0ZSIpKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwcm9wZXJ0eSBib29sIGlzT3V0R29pbmc7DQogICAgcHJvcGVydHkgaW50IGNvZGU7DQoNCiAgICAvKiBldmVudHMgKi8NCg0KcHJvdGVjdGVkOg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCiAgICB2b2lkIE5vdGlmeVByb3BlcnR5Q2hhbmdlZChTdHJpbmdeIHByb3BlcnR5TmFtZSk7DQoNCmludGVybmFsOg0KICAgIC8vdm9pZCByZWZ1c2UoKTsNCiAgICAvL3ZvaWQgYWNjZXB0KCk7DQogICAgLy92b2lkIGNhbmNlbCgpOw0KDQpwcml2YXRlOg0KICAgIENhbGxTdGF0dXMgc3RhdGVfOw0KDQp9Ow0KfQ0KDQo=