ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYWdmL2NoYXJ0L0NoYXJ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYWdmL2NoYXJ0L0NoYXJ0RWRpdFBhcnQuamF2YQppbmRleCBkNzA2YzNhLi5jMjA3YzljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYWdmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFnZi5jaGFydC9zcmMvb3JnL2VjbGlwc2UvYW1wL2FnZi9jaGFydC9DaGFydEVkaXRQYXJ0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQvc3JjL29yZy9lY2xpcHNlL2FtcC9hZ2YvY2hhcnQvQ2hhcnRFZGl0UGFydC5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ow0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsNCkBAIC05MCw2ICs5MSw3IEBACiAJICogSW5zdGFudGlhdGVzIGEgbmV3IGNoYXJ0IGVkaXQgcGFydC4NCiAJICovDQogCXB1YmxpYyBDaGFydEVkaXRQYXJ0KCkgew0KKwkJY2hhcnRTdHJhdGVneSA9IGdldEluaXRTdHJhdGVnaWUoKTsNCiAJCXJlc291cmNlTWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTsNCiAJCVBsYXRmb3JtQ29uZmlnIGNvbmZpZyA9IG5ldyBQbGF0Zm9ybUNvbmZpZygpOw0KIAkJdHJ5IHsNCkBAIC0xMDIsNiArMTA0LDEwIEBACiAJCWdlbmVyaWNQYWxldHRlLnNoaWZ0KDApOw0KIAl9DQogDQorCUlDaGFydERlc2lnblN0cmF0ZWd5IGdldEluaXRTdHJhdGVnaWUoKSB7DQorCQlyZXR1cm4gQ2hhcnRUeXBlLlRJTUVfU0VSSUVTLmNyZWF0ZVN0cmF0ZWd5KCk7DQorCX0NCisNCiAJLyoqDQogCSAqIFRoZSBsaXN0ZW5lciBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBjaGFydE1vZGVsIGV2ZW50cy4gVGhlIGNsYXNzIHRoYXQgaXMNCiAJICogaW50ZXJlc3RlZCBpbiBwcm9jZXNzaW5nIGEgY2hhcnRNb2RlbCBldmVudCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCBhbmQNCkBAIC0xMTMsNiArMTE5LDcgQEAKIAkgKiBAc2VlIENoYXJ0TW9kZWxFdmVudA0KIAkgKi8NCiAJY2xhc3MgQ2hhcnRNb2RlbExpc3RlbmVyIGV4dGVuZHMgU1dUQXN5bmNNb2RlbExpc3RlbmVyIHsNCisNCiAJCS8qKg0KIAkJICogSW5zdGFudGlhdGVzIGEgbmV3IGNoYXJ0IG1vZGVsIGxpc3RlbmVyLg0KIAkJICovDQpAQCAtMTIyLDE1ICsxMjksNyBAQAogDQogCQlAT3ZlcnJpZGUNCiAJCXB1YmxpYyB2b2lkIG9ic2VydmluZyhJT2JzZXJ2YXRpb25Qcm92aWRlciBvYnNlcnZlZCkgew0KLQkJCS8vIHdhaXQgZm9yIGRhdGEgc291cmNlIHRvIGJlIGF2YWlsYWJsZSBmcm9tIG1vZGVsIHNldC4uDQotCQkJd2hpbGUgKGdldERhdGFQcm92aWRlcigpID09IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCVRocmVhZC5zbGVlcCgyNSk7DQotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vDQotCQkJCX0NCi0JCQl9DQotCQkJc2V0Q2hhcnRTdHJhdGVneShDaGFydFR5cGUuVElNRV9TRVJJRVMuY3JlYXRlU3RyYXRlZ3koKSk7DQorCQkJc2V0Q2hhcnRTdHJhdGVneShnZXRJbml0U3RyYXRlZ2llKCkpOw0KIAkJfQ0KIA0KIAkJQE92ZXJyaWRlDQpAQCAtMjAxLDYgKzIwMCw3IEBACiAJCWNoYXJ0TGlzdGVuZXIuc2V0V2lkZ2V0KGdldFZpZXdlcigpLmdldENvbnRyb2woKSk7DQogDQogCQlmaW5hbCBGaWd1cmUgbmV3RmlndXJlID0gbmV3IEZpZ3VyZSgpIHsNCisNCiAJCQlAT3ZlcnJpZGUNCiAJCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgew0KIAkJCQlpZiAoZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0SW1hZ2UoKSAhPSBudWxsKSB7DQpAQCAtMjEyLDYgKzIxMiw3IEBACiAJCQl9DQogCQl9Ow0KIAkJbmV3RmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IEFic3RyYWN0TGF5b3V0KCkgew0KKw0KIAkJCUBPdmVycmlkZQ0KIAkJCXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCBoaW50V2lkdGgsIGludCBoaW50SGVpZ2h0KSB7DQogCQkJCXJldHVybiBuZXcgRGltZW5zaW9uKGhpbnRXaWR0aCA8IDEgPyAxIDogaGludFdpZHRoLCBoaW50SGVpZ2h0IDwgMSA/IDEgOiBoaW50SGVpZ2h0KTsNCkBAIC0yMjcsNiArMjI4LDcgQEAKIAkJCX0NCiAJCX0pOw0KIAkJbmV3RmlndXJlLmFkZEZpZ3VyZUxpc3RlbmVyKG5ldyBGaWd1cmVMaXN0ZW5lcigpIHsNCisNCiAJCQlwdWJsaWMgdm9pZCBmaWd1cmVNb3ZlZChJRmlndXJlIHNvdXJjZSkgew0KIAkJCQlyZWdlbmVyYXRlQ2hhcnQoKTsNCiAJCQl9DQpAQCAtMjQyLDEyICsyNDQsNyBAQAogDQogCUBPdmVycmlkZQ0KIAlwdWJsaWMgdm9pZCByZWZyZXNoKCkgew0KLQkJbmV3IFRocmVhZCgpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCXJlZ2VuZXJhdGVDaGFydCh0cnVlKTsNCi0JCQl9DQotCQl9LnJ1bigpOw0KKwkJcmVnZW5lcmF0ZUNoYXJ0KHRydWUpOw0KIAl9DQogDQogCUBPdmVycmlkZQ0KQEAgLTI2MSw3ICsyNTgsOSBAQAogCQlPYmplY3QgcHJvdmlkZXIgPSBhZGFwdGVyTWFuYWdlci5sb2FkQWRhcHRlcih0aGlzLmdldE1vZGVsKCksIElEYXRhUHJvdmlkZXIuSUQpOw0KIA0KIAkJaWYgKCEocHJvdmlkZXIgaW5zdGFuY2VvZiBJRGF0YVByb3ZpZGVyKSkgew0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIGRhdGEgcHJvdmlkZXIgZm9yIGNoYXJ0IG1vZGVsLiBQbGVhc2UgZW5zdXJlIHRoYXQgYSBkYXRhIHByb3ZpZGVyIGFkYXB0ZXIgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGNsYXNzOiAiICsgdGhpcy5nZXRNb2RlbCgpLmdldENsYXNzKCkpOw0KKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKA0KKwkJCQkJIkNvdWxkbid0IGZpbmQgZGF0YSBwcm92aWRlciBmb3IgY2hhcnQgbW9kZWwuIFBsZWFzZSBlbnN1cmUgdGhhdCBhIGRhdGEgcHJvdmlkZXIgYWRhcHRlciBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgY2xhc3M6ICINCisJCQkJCQkJKyB0aGlzLmdldE1vZGVsKCkuZ2V0Q2xhc3MoKSk7DQogCQl9DQogDQogCQlzZXREYXRhUHJvdmlkZXIoKElEYXRhUHJvdmlkZXIpIHByb3ZpZGVyKTsNCkBAIC0zMDYsNyArMzA1LDggQEAKIAkJCQljaGFydExpc3RlbmVyLmVuZFBhaW50aW5nKCk7DQogCQkJfQ0KIAkJfSBjYXRjaCAoQ2hhcnRFeGNlcHRpb24gY2UpIHsNCi0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhTdGF0dXMuV0FSTklORywgQUdGQ2hhcnRQbHVnaW4uUExVR0lOX0lELCAiQ291bGRuJ3QgZ2VuZXJhdGUgY2hhcnQuIiwgY2UpKTsNCisJCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoDQorCQkJCQluZXcgU3RhdHVzKFN0YXR1cy5XQVJOSU5HLCBBR0ZDaGFydFBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZG4ndCBnZW5lcmF0ZSBjaGFydC4iLCBjZSkpOw0KIAkJCWNoYXJ0TGlzdGVuZXIuZW5kUGFpbnRpbmcoKTsNCiAJCX0NCiAJfQ0KQEAgLTMyNSwxNCArMzI1LDYgQEAKIAl9DQogDQogCS8qKg0KLQkgKiBDcmVhdGVzIHRoZSBjaGFydC4NCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVDaGFydCgpIHsNCi0JCWNoYXJ0ID0gY2hhcnRTdHJhdGVneS5jcmVhdGVDaGFydChkYXRhUHJvdmlkZXIsIGRhdGFTb3VyY2UpOw0KLQkJY2hhcnQuZ2V0VGl0bGUoKS5nZXRMYWJlbCgpLnNldFZpc2libGUoZmFsc2UpOw0KLQl9DQotDQotCS8qKg0KIAkgKiBVcGRhdGUgY2hhcnQgc2VyaWVzLg0KIAkgKi8NCiAJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUNoYXJ0U2VsZWN0aW9uKCkgew0KQEAgLTM4Nyw4ICszNzksNyBAQAogDQogCS8qKg0KIAkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5JQ2FsbEJhY2tOb3RpZmllciNjYWxsYmFjayhqYXZhLmxhbmcuT2JqZWN0LA0KLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsDQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2UuSUNhbGxCYWNrTm90aWZpZXIjY2FsbGJhY2soamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwNCiAJICogICAgICBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5DYWxsQmFja1ZhbHVlKQ0KIAkgKi8NCiAJcHVibGljIHZvaWQgY2FsbGJhY2soT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBDYWxsQmFja1ZhbHVlIGFyZzIpIHsNCkBAIC00NDcsMTAgKzQzOCwxMiBAQAogCQl0aGlzLmRhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjsNCiAJCWRhdGFTb3VyY2UgPSBkYXRhUHJvdmlkZXIuZ2V0RGF0YVNvdXJjZShnZXRNb2RlbCgpKTsNCiAJCWRhdGFMaXN0ZW5lciA9IG5ldyBJRGF0YVNlbGVjdGlvbkxpc3RlbmVyKCkgew0KKw0KIAkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoT2JqZWN0IGRhdGFTZXQpIHsNCiAJCQkJaWYgKGdldFBhcmVudCgpICE9IG51bGwgJiYgZ2V0Um9vdCgpICE9IG51bGwgJiYgZ2V0Vmlld2VyKCkgIT0gbnVsbCAmJiBnZXRDaGFydCgpICE9IG51bGwpIHsNCiAJCQkJCXVwZGF0ZUNoYXJ0U2VsZWN0aW9uKCk7DQogCQkJCQlnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQorDQogCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KIAkJCQkJCQlyZWdlbmVyYXRlQ2hhcnQodHJ1ZSk7DQogCQkJCQkJfQ0KQEAgLTQ1OSwxNCArNDUyLDI0IEBACiAJCQl9DQogCQl9Ow0KIAkJZGF0YVByb3ZpZGVyLmFkZExpc3RlbmVyKGRhdGFTb3VyY2UsIGRhdGFMaXN0ZW5lcik7DQorCQljcmVhdGVBbmRJbml0Q2hhcnQoKTsNCiAJfQ0KIA0KIAlwdWJsaWMgdm9pZCBzZXRDaGFydFN0cmF0ZWd5KElDaGFydERlc2lnblN0cmF0ZWd5IGNoYXJ0U3RyYXRlZ3kpIHsNCiAJCXRoaXMuY2hhcnRTdHJhdGVneSA9IGNoYXJ0U3RyYXRlZ3k7DQotCQljcmVhdGVDaGFydCgpOw0KKwkJY3JlYXRlQW5kSW5pdENoYXJ0KCk7DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEluaXRDaGFydCgpIHsNCisJCWlmKGRhdGFQcm92aWRlciA9PSBudWxsKXsNCisJCQlyZXR1cm47DQorCQl9DQorCQljaGFydCA9IGNoYXJ0U3RyYXRlZ3kuY3JlYXRlQ2hhcnQoZGF0YVByb3ZpZGVyLCBkYXRhU291cmNlKTsNCisJCWNoYXJ0LmdldFRpdGxlKCkuZ2V0TGFiZWwoKS5zZXRWaXNpYmxlKGZhbHNlKTsNCiAJCXVwZGF0ZUNoYXJ0U2VsZWN0aW9uKCk7DQotCQlpZiAoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSAhPSBudWxsKSB7DQorCQlpZiAoZ2V0Vmlld2VyKCkgIT0gbnVsbCAmJiBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgew0KIAkJCWdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCisNCiAJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KIAkJCQkJcmVwYWludENoYXJ0KCk7DQogCQkJCX0NCkBAIC00OTMsNiArNDk2LDcgQEAKIAkgKiBAYXV0aG9yIGZlaQ0KIAkgKi8NCiAJcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIERpc3Bvc2VMaXN0ZW5lciB7DQorDQogCQlwcml2YXRlIEdDIGdjOw0KIA0KIAkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsNCkBAIC01MzAsNyArNTM0LDggQEAKIA0KIAkJcHJpdmF0ZSB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcigpIHsNCiAJCQlyZW1vdmVEaXNwb3NlTGlzdGVuZXIoKTsNCi0JCQlpZiAoZGlzcG9zZUV2ZW50UHJvdmlkZXIgPT0gbnVsbCAmJiBnZXRWaWV3ZXIoKSAhPSBudWxsICYmIGdldFZpZXdlcigpLmdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7DQorCQkJaWYgKGRpc3Bvc2VFdmVudFByb3ZpZGVyID09IG51bGwgJiYgZ2V0Vmlld2VyKCkgIT0gbnVsbCAmJiBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkgIT0gbnVsbA0KKwkJCQkJJiYgIWdldFZpZXdlcigpLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsNCiAJCQkJZGlzcG9zZUV2ZW50UHJvdmlkZXIgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7DQogCQkJCWRpc3Bvc2VFdmVudFByb3ZpZGVyLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzKTsNCiAJCQl9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlL3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS92aWV3L1NjYWxlR3JhbnVsYXJpdHlDb250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3ZpZXcvU2NhbGVHcmFudWxhcml0eUNvbnRyb2wuamF2YQppbmRleCBhNGNiZWI4Li4yOGVkOTRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3ZpZXcvU2NhbGVHcmFudWxhcml0eUNvbnRyb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3ZpZXcvU2NhbGVHcmFudWxhcml0eUNvbnRyb2wuamF2YQpAQCAtNjQsNyArNjQsMTIgQEAKIAkJCX0NCiAJCX0pOw0KIA0KLQkJTW9kZWxWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1hbmFnZXJMaXN0ZW5lcnMoKS5hZGRNb2RlbE1hbmFnZXJMaXN0ZW5lcihTY2FsZUdyYW51bGFyaXR5Q29udHJvbC50aGlzKTsNCisJCUlNb2RlbCBhY3RpdmVNb2RlbCA9IE1vZGVsVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBY3RpdmVNb2RlbCgpOw0KKwkJaWYgKGFjdGl2ZU1vZGVsICE9IG51bGwpIHsNCisJCQllbmdpbmUgPSBhY3RpdmVNb2RlbC5nZXRFbmdpbmUoKTsNCisJCX0NCisNCisJCU1vZGVsVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNYW5hZ2VyTGlzdGVuZXJzKCkuYWRkTW9kZWxNYW5hZ2VyTGlzdGVuZXIodGhpcyk7DQogCQlyZXR1cm4gc2NhbGU7DQogCX0NCiANCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi52aWV3cy9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi92aWV3L1NXVEFzeW5jTW9kZWxMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYudmlld3Mvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvdmlldy9TV1RBc3luY01vZGVsTGlzdGVuZXIuamF2YQppbmRleCBjYjU3ZWUwLi5hYjZjMTUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi52aWV3cy9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi92aWV3L1NXVEFzeW5jTW9kZWxMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLnZpZXdzL3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL3ZpZXcvU1dUQXN5bmNNb2RlbExpc3RlbmVyLmphdmEKQEAgLTE1LDYgKzE1LDkgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYXhmLnZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLklNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUuTGlmZUN5Y2xlU3RhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi50aW1lLlRpbWVHcmFudWxhcml0eTsKQEAgLTMzLDE1NSArMzYsMTYxIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTV1RBc3luY01vZGVsTGlzdGVuZXIgZXh0ZW5kcyBTV1RUaHJlYWRNb2RlbExpc3RlbmVyIHsKIAotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVwb3J0aW5nUnVubmVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIGZpbmFsIExpZmVDeWNsZVN0YXRlIGtleTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJTW9kZWwgbW9kZWw7Ci0gICAgICAgIEV4Y2VwdGlvbiB0OworCXByaXZhdGUgTGlzdDxSZXBvcnRpbmdSdW5uZXI+IHJlcG9ydGluZ1J1bm5lcnM7CiAKLSAgICAgICAgcHVibGljIFJlcG9ydGluZ1J1bm5lcihMaWZlQ3ljbGVTdGF0ZSBrZXksIElNb2RlbCBtb2RlbCkgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIH0KKwlwcml2YXRlIGJvb2xlYW4gd2FpdEZvclBhaW50ID0gdHJ1ZTsKIAotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvVXBkYXRlKGtleSwgbW9kZWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0ID0gZTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhaW50aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9ibGVtIGluIHZpZXcgdXBkYXRpbmcgZm9yICIgKyBnZXROYW1lKCksIHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwlwcml2YXRlIGxvbmcgbWluVGltZUJldHdlZW5VcGRhdGVzID0gMTAwMDA7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gd2FpdEZvclBhaW50ID0gdHJ1ZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBsb25nIG1pblRpbWVCZXR3ZWVuVXBkYXRlcyA9IDEwMDAwOworCXByaXZhdGUgYm9vbGVhbiBwYWludGluZyA9IGZhbHNlOwogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmcgPSBmYWxzZTsKKwlwcml2YXRlIGxvbmcgbGFzdFVwZGF0ZTsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBwYWludGluZyA9IGZhbHNlOworCS8qKgorCSAqIEluc3RhbnRpYXRlcyBhIG5ldyBzV1QgYXN5bmMgbW9kZWwgbGlzdGVuZXIuCisJICogCisJICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0CisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU1dUQXN5bmNNb2RlbExpc3RlbmVyKENvbnRyb2wgd2lkZ2V0LCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcih3aWRnZXQsIG5hbWUpOworCQlyZXBvcnRpbmdSdW5uZXJzID0gbmV3IEFycmF5TGlzdDxTV1RBc3luY01vZGVsTGlzdGVuZXIuUmVwb3J0aW5nUnVubmVyPigpOworCX0KIAotICAgIHByaXZhdGUgbG9uZyBsYXN0VXBkYXRlOworCS8qKgorCSAqIEluc3RhbnRpYXRlcyBhIG5ldyBzV1QgYXN5bmMgbW9kZWwgbGlzdGVuZXIuCisJICogCisJICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0CisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKwkgKiBAcGFyYW0gdXBkYXRlUGVyaW9kIHRoZSB1cGRhdGUgcGVyaW9kCisJICovCisJcHVibGljIFNXVEFzeW5jTW9kZWxMaXN0ZW5lcihDb250cm9sIHdpZGdldCwgU3RyaW5nIG5hbWUsIGxvbmcgdXBkYXRlUGVyaW9kKSB7CisJCXRoaXMod2lkZ2V0LCBuYW1lKTsKKwkJdGhpcy5taW5UaW1lQmV0d2VlblVwZGF0ZXMgPSB1cGRhdGVQZXJpb2Q7CisJfQogCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHNXVCBhc3luYyBtb2RlbCBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IHRoZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTV1RBc3luY01vZGVsTGlzdGVuZXIoQ29udHJvbCB3aWRnZXQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdpZGdldCwgbmFtZSk7Ci0gICAgfQorCUxpc3Q8UmVwb3J0aW5nUnVubmVyPiBnZXRSZXBvcnRpbmdSdW5uZXJzKCkgeworCQlyZXR1cm4gcmVwb3J0aW5nUnVubmVyczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc1dUIGFzeW5jIG1vZGVsIGxpc3RlbmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICogQHBhcmFtIHVwZGF0ZVBlcmlvZCB0aGUgdXBkYXRlIHBlcmlvZAotICAgICAqLwotICAgIHB1YmxpYyBTV1RBc3luY01vZGVsTGlzdGVuZXIoQ29udHJvbCB3aWRnZXQsIFN0cmluZyBuYW1lLCBsb25nIHVwZGF0ZVBlcmlvZCkgewotICAgICAgICBzdXBlcih3aWRnZXQsIG5hbWUpOwotICAgICAgICB0aGlzLm1pblRpbWVCZXR3ZWVuVXBkYXRlcyA9IHVwZGF0ZVBlcmlvZDsKLSAgICB9CisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEBwYXJhbSBvYnNlcnZlZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLkFic3RyYWN0TGlmZWN5Y2xlTGlzdGVuZXIjc3RhdGVDaGFuZ2UoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZShPYmplY3Qga2V5LCBPYmplY3Qgb2JzZXJ2ZWQpIHsKKwkJSU1vZGVsIG1vZGVsID0gKElNb2RlbCkgb2JzZXJ2ZWQ7CisJCWlmIChtb2RlbC5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKQorCQkJCSYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IGxhc3RVcGRhdGUgKyBtaW5UaW1lQmV0d2VlblVwZGF0ZXMgfHwgbW9kZWwuZ2V0UGVyaW9kKCkKKwkJCQkJCSUgKChUaW1lR3JhbnVsYXJpdHkpIG1vZGVsLmdldEVuZ2luZSgpLmdldFVwZGF0ZUdyYW51bGFyaXR5KCkpLmdldFVwZGF0ZUZyZXF1ZW5jeSgpID09IDApKSB7CisJCQlsYXN0VXBkYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQl1cGRhdGluZyA9IHRydWU7CisJCQlpZiAoQVhGVmlld1BsdWdpbi5nZXREZWZhdWx0KCkgIT0gbnVsbCkgeworCQkJCURpc3BsYXkgZGlzcGxheSA9IEFYRlZpZXdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKKwkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCVJlcG9ydGluZ1J1bm5lciBydW5uYWJsZSA9IG5ldyBSZXBvcnRpbmdSdW5uZXIoKExpZmVDeWNsZVN0YXRlKSBrZXksIG1vZGVsKTsKKwkJCQkJcmVwb3J0aW5nUnVubmVycy5hZGQocnVubmFibGUpOworCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIG9ic2VydmVkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUuQWJzdHJhY3RMaWZlY3ljbGVMaXN0ZW5lciNzdGF0ZUNoYW5nZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlKE9iamVjdCBrZXksIE9iamVjdCBvYnNlcnZlZCkgewotICAgICAgICBJTW9kZWwgbW9kZWwgPSAoSU1vZGVsKSBvYnNlcnZlZDsKLSAgICAgICAgaWYgKG1vZGVsLmdldEVuZ2luZSgpLmlzUnVubmluZygpCi0gICAgICAgICAgICAgICAgJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gbGFzdFVwZGF0ZSArIG1pblRpbWVCZXR3ZWVuVXBkYXRlcyB8fCBtb2RlbC5nZXRQZXJpb2QoKQotICAgICAgICAgICAgICAgICAgICAgICAgJSAoKFRpbWVHcmFudWxhcml0eSkgbW9kZWwuZ2V0RW5naW5lKCkuZ2V0VXBkYXRlR3JhbnVsYXJpdHkoKSkuZ2V0VXBkYXRlRnJlcXVlbmN5KCkgPT0gMCkpIHsKLSAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIHVwZGF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIFJlcG9ydGluZ1J1bm5lciBydW5uYWJsZSA9IG5ldyBSZXBvcnRpbmdSdW5uZXIoKExpZmVDeWNsZVN0YXRlKSBrZXksIG1vZGVsKTsKLSAgICAgICAgICAgIGlmIChBWEZWaWV3UGx1Z2luLmdldERlZmF1bHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gQVhGVmlld1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgIGlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHVwZGF0aW5nIHx8IHBhaW50aW5nKSAmJiBpc1dhaXRGb3JVcGRhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChnZXRXaWRnZXQoKSA9PSBudWxsIHx8ICFnZXRXaWRnZXQoKS5pc0Rpc3Bvc2VkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBiZXN0IGNhc2Ugb2YgNjBmcHMgKyBhbGxvdyBjb21wdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJ1bm5hYmxlLnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09IExpZmVDeWNsZVN0YXRlLk9CU0VSVkVEIHx8IGtleSA9PSBMaWZlQ3ljbGVTdGF0ZS5FTkQpIHsKLSAgICAgICAgICAgIFNXVEFzeW5jTW9kZWxMaXN0ZW5lci5zdXBlci5zdGF0ZUNoYW5nZShrZXksIG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICAvLyBFdmVuIHRob3VnaCBtb2RlbCBpcyBub3QgbnVsbCBvbiBtZXRob2QgZW50cmFuY2UgKHN0YXRlIGNoYW5nZSksIGl0IGNvdWxkIGJlY29tZSBudWxsIGR1cmluZyBleGVjdXRpb24gb2YKLSAgICAgICAgLy8gcmVwb3J0aW5nIHJ1bm5lcgotICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yY2VNb2RlbE5vdGlmeShtb2RlbCk7Ci0gICAgICAgIH0KLSAgICB9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBMaWZlQ3ljbGVTdGF0ZS5PQlNFUlZFRCB8fCBrZXkgPT0gTGlmZUN5Y2xlU3RhdGUuRU5EKSB7CisJCQlTV1RBc3luY01vZGVsTGlzdGVuZXIuc3VwZXIuc3RhdGVDaGFuZ2Uoa2V5LCBtb2RlbCk7CisJCX0KKwkJLy8gRXZlbiB0aG91Z2ggbW9kZWwgaXMgbm90IG51bGwgb24gbWV0aG9kIGVudHJhbmNlIChzdGF0ZSBjaGFuZ2UpLCBpdCBjb3VsZCBiZWNvbWUgbnVsbCBkdXJpbmcgZXhlY3V0aW9uIG9mCisJCS8vIHJlcG9ydGluZyBydW5uZXIKKwkJaWYgKG1vZGVsICE9IG51bGwpIHsKKwkJCWZvcmNlTW9kZWxOb3RpZnkobW9kZWwpOworCQl9CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvVXBkYXRlKE9iamVjdCBrZXksIGZpbmFsIElNb2RlbCBtb2RlbCkgewotICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIHZpc2liaWxpdHkgd2l0aGluIFVJIHRocmVhZAotICAgICAgICBpZiAoZ2V0V2lkZ2V0KCkgPT0gbnVsbCB8fCAhZ2V0V2lkZ2V0KCkuaXNEaXNwb3NlZCgpICYmIGdldFdpZGdldCgpLmlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICB1cGRhdGUobW9kZWwpOwotICAgICAgICAgICAgZ2V0TGlzdGVuZXIoKS5zdGF0ZUNoYW5nZShrZXksIG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB0aGUgdXBkYXRlIG1ldGhvZCBoYXNuJ3QgZXhwbGljaXRseSBpbmRpY2F0ZWQgYmVnaW5QYWludGluZywgd2UgYXJlIG5vdCB3YWl0aW5nIGZvciB0aGUKLSAgICAgICAgLy8gYWN0dWFsIHVwZGF0ZSBvciBpdCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLSAgICAgICAgaWYgKCFwYWludGluZykgewotICAgICAgICB9Ci0gICAgfQorCXByaXZhdGUgdm9pZCBkb1VwZGF0ZShPYmplY3Qga2V5LCBmaW5hbCBJTW9kZWwgbW9kZWwpIHsKKwkJLy8gSGF2ZSB0byBjaGVjayB2aXNpYmlsaXR5IHdpdGhpbiBVSSB0aHJlYWQKKwkJaWYgKGdldFdpZGdldCgpID09IG51bGwgfHwgIWdldFdpZGdldCgpLmlzRGlzcG9zZWQoKSAmJiBnZXRXaWRnZXQoKS5pc1Zpc2libGUoKSkgeworCQkJdXBkYXRlKG1vZGVsKTsKKwkJCWdldExpc3RlbmVyKCkuc3RhdGVDaGFuZ2Uoa2V5LCBtb2RlbCk7CisJCX0KKwkJLy8gSWYgdGhlIHVwZGF0ZSBtZXRob2QgaGFzbid0IGV4cGxpY2l0bHkgaW5kaWNhdGVkIGJlZ2luUGFpbnRpbmcsIHdlIGFyZSBub3Qgd2FpdGluZyBmb3IgdGhlCisJCS8vIGFjdHVhbCB1cGRhdGUgb3IgaXQgaGFzIGFscmVhZHkgb2NjdXJyZWQuCisJCWlmICghcGFpbnRpbmcpIHsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIEZvcmNlIG1vZGVsIG5vdGlmeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VNb2RlbE5vdGlmeShJTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgbW9kZWwuZ2V0RW5naW5lKCkub2JzZXJ2YXRpb25Db21wbGV0ZSh0aGlzKTsKLSAgICB9CisJLyoqCisJICogRm9yY2UgbW9kZWwgbm90aWZ5LgorCSAqIAorCSAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwKKwkgKi8KKwlwdWJsaWMgdm9pZCBmb3JjZU1vZGVsTm90aWZ5KElNb2RlbCBtb2RlbCkgeworCQltb2RlbC5nZXRFbmdpbmUoKS5vYnNlcnZhdGlvbkNvbXBsZXRlKHRoaXMpOworCX0KIAotICAgIC8qKgotICAgICAqIEJlZ2luIHBhaW50aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZ2luUGFpbnRpbmcoKSB7Ci0gICAgICAgIHRoaXMucGFpbnRpbmcgPSB0cnVlOwotICAgIH0KKwkvKioKKwkgKiBCZWdpbiBwYWludGluZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBiZWdpblBhaW50aW5nKCkgeworCQl0aGlzLnBhaW50aW5nID0gdHJ1ZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBFbmQgcGFpbnRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kUGFpbnRpbmcoKSB7Ci0gICAgICAgIHRoaXMucGFpbnRpbmcgPSBmYWxzZTsKLSAgICB9CisJLyoqCisJICogRW5kIHBhaW50aW5nLgorCSAqLworCXB1YmxpYyB2b2lkIGVuZFBhaW50aW5nKCkgeworCQl0aGlzLnBhaW50aW5nID0gZmFsc2U7CisJfQogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2FpdCBmb3IgcGFpbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdhaXRGb3JQYWludCB0aGUgbmV3IHdhaXQgZm9yIHBhaW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2FpdEZvclVwZGF0ZShib29sZWFuIHdhaXRGb3JQYWludCkgewotICAgICAgICB0aGlzLndhaXRGb3JQYWludCA9IHdhaXRGb3JQYWludDsKLSAgICB9CisJLyoqCisJICogU2V0cyB0aGUgd2FpdCBmb3IgcGFpbnQuCisJICogCisJICogQHBhcmFtIHdhaXRGb3JQYWludCB0aGUgbmV3IHdhaXQgZm9yIHBhaW50CisJICovCisJcHVibGljIHZvaWQgc2V0V2FpdEZvclVwZGF0ZShib29sZWFuIHdhaXRGb3JQYWludCkgeworCQl0aGlzLndhaXRGb3JQYWludCA9IHdhaXRGb3JQYWludDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgaXMgd2FpdCBmb3IgcGFpbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpcyB3YWl0IGZvciBwYWludAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FpdEZvclVwZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHdhaXRGb3JQYWludDsKLSAgICB9CisJLyoqCisJICogQ2hlY2tzIGlmIGlzIHdhaXQgZm9yIHBhaW50LgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgd2FpdCBmb3IgcGFpbnQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1dhaXRGb3JVcGRhdGUoKSB7CisJCXJldHVybiB3YWl0Rm9yUGFpbnQ7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZXBvcnRpbmdSdW5uZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwkJcHJpdmF0ZSBmaW5hbCBMaWZlQ3ljbGVTdGF0ZSBrZXk7CisKKwkJcHJpdmF0ZSBmaW5hbCBJTW9kZWwgbW9kZWw7CisKKwkJRXhjZXB0aW9uIHQ7CisKKwkJcHVibGljIFJlcG9ydGluZ1J1bm5lcihMaWZlQ3ljbGVTdGF0ZSBrZXksIElNb2RlbCBtb2RlbCkgeworCQkJdGhpcy5rZXkgPSBrZXk7CisJCQl0aGlzLm1vZGVsID0gbW9kZWw7CisJCX0KKworCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQl0cnkgeworCQkJCWlmIChyZXBvcnRpbmdSdW5uZXJzLnNpemUoKSA+IDEpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlkb1VwZGF0ZShrZXksIG1vZGVsKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdCA9IGU7CisJCQl9IGZpbmFsbHkgeworCQkJCXJlcG9ydGluZ1J1bm5lcnMucmVtb3ZlKHRoaXMpOworCQkJCXVwZGF0aW5nID0gZmFsc2U7CisJCQkJaWYgKHQgIT0gbnVsbCkgeworCQkJCQlwYWludGluZyA9IGZhbHNlOworCQkJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvYmxlbSBpbiB2aWV3IHVwZGF0aW5nIGZvciAiICsgZ2V0TmFtZSgpLCB0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmFzY2FwZS9zcmMvb3JnL2VjbGlwc2UvYW1wL2VzY2FwZS9hc2NhcGUvd3JhcC9TY2FwZVdyYXBwZXJNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlL3NyYy9vcmcvZWNsaXBzZS9hbXAvZXNjYXBlL2FzY2FwZS93cmFwL1NjYXBlV3JhcHBlck1vZGVsLmphdmEKaW5kZXggMDIyZDRhZi4uZThjMmQwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlL3NyYy9vcmcvZWNsaXBzZS9hbXAvZXNjYXBlL2FzY2FwZS93cmFwL1NjYXBlV3JhcHBlck1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlL3NyYy9vcmcvZWNsaXBzZS9hbXAvZXNjYXBlL2FzY2FwZS93cmFwL1NjYXBlV3JhcHBlck1vZGVsLmphdmEKQEAgLTcxLDE3ICs3MSwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlzdGVuZXIoZmluYWwgSUxpZmVDeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCQlpZiAoIShsaXN0ZW5lciBpbnN0YW5jZW9mIFNjYXBlV3JhcHBlck1vZGVsTGlzdGVuZXIpKSB7Ci0JCQkJCU1vZGVsV3JhcHBlclNjYXBlTGlzdGVuZXIgd3JhcHBlciA9IG5ldyBNb2RlbFdyYXBwZXJTY2FwZUxpc3RlbmVyKFNjYXBlV3JhcHBlck1vZGVsLnRoaXMsIGdldFNjYXBlKCksIGxpc3RlbmVyKTsKLQkJCQkJZ2V0U2NhcGUoKS5hZGRWaWV3KHdyYXBwZXIpOwotCQkJCQl3cmFwcGVyRm9yTGlzdGVuZXIucHV0KGxpc3RlbmVyLCB3cmFwcGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJCWlmICghKGxpc3RlbmVyIGluc3RhbmNlb2YgU2NhcGVXcmFwcGVyTW9kZWxMaXN0ZW5lcikpIHsKKwkJCU1vZGVsV3JhcHBlclNjYXBlTGlzdGVuZXIgd3JhcHBlciA9IG5ldyBNb2RlbFdyYXBwZXJTY2FwZUxpc3RlbmVyKFNjYXBlV3JhcHBlck1vZGVsLnRoaXMsIGdldFNjYXBlKCksIGxpc3RlbmVyKTsKKwkJCWdldFNjYXBlKCkuYWRkVmlldyh3cmFwcGVyKTsKKwkJCXdyYXBwZXJGb3JMaXN0ZW5lci5wdXQobGlzdGVuZXIsIHdyYXBwZXIpOworCQl9CiAJfQogCiAJcHVibGljIENvbGxlY3Rpb248SUxpZmVDeWNsZUxpc3RlbmVyPiBnZXRNb2RlbExpc3RlbmVycygpIHsKQEAgLTg5LDE2ICs4NCwxMSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsTGlzdGVuZXIoZmluYWwgSUxpZmVDeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBTY2FwZVdyYXBwZXJNb2RlbExpc3RlbmVyKSB7Ci0JCQkJCWdldFNjYXBlKCkucmVtb3ZlU2NhcGVMaXN0ZW5lcigoKFNjYXBlV3JhcHBlck1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyKS5nZXRXcmFwcGVkKCkpOwotCQkJCX0KLQkJCQlsaXN0ZW5lci5vYnNlcnZhdGlvbkVuZChTY2FwZVdyYXBwZXJNb2RlbC50aGlzKTsKLQkJCX0KLQkJfS5zdGFydCgpOworCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU2NhcGVXcmFwcGVyTW9kZWxMaXN0ZW5lcikgeworCQkJZ2V0U2NhcGUoKS5yZW1vdmVTY2FwZUxpc3RlbmVyKCgoU2NhcGVXcmFwcGVyTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXIpLmdldFdyYXBwZWQoKSk7CisJCX0KKwkJbGlzdGVuZXIub2JzZXJ2YXRpb25FbmQoU2NhcGVXcmFwcGVyTW9kZWwudGhpcyk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2VzY2FwZS9pZGUvUHJvamVjdExvYWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2VzY2FwZS9pZGUvUHJvamVjdExvYWRlclRlc3QuamF2YQppbmRleCA5YzNhYzgwLi5lNGUwN2UxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9lc2NhcGUvaWRlL1Byb2plY3RMb2FkZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvZXNjYXBlL2lkZS9Qcm9qZWN0TG9hZGVyVGVzdC5qYXZhCkBAIC02LDggKzYsMTIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwpAQCAtMzEsNyArMzUsNyBAQAogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlYWREZXBlbmRlbmNpZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlMaXN0PEJ1bmRsZT4gZGVwZW5kZW5jaWVzID0gUHJvamVjdExvYWRlci5yZWFkRGVwZW5kZW5jaWVzKG5ldyBGaWxlSW5wdXRTdHJlYW0oInRlc3RGaWxlcy9kZWZhdWx0TWFuaWZlc3QuTUYiKSk7CisJCUxpc3Q8QnVuZGxlPiBkZXBlbmRlbmNpZXMgPSBQcm9qZWN0TG9hZGVyLnJlYWREZXBlbmRlbmNpZXMoZ2V0SW5wdXRTdHJlYW0oImRlZmF1bHRNYW5pZmVzdC5NRiIpKTsKIAkJYXNzZXJ0RXF1YWxzKDgsIGRlcGVuZGVuY2llcy5zaXplKCkpOwogCQlhc3NlcnRUcnVlKGRlcGVuZGVuY2llcy5jb250YWlucyhQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIikpKTsKIAkJYXNzZXJ0VHJ1ZShkZXBlbmRlbmNpZXMuY29udGFpbnMoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKSkpOwpAQCAtNTMsNyArNTcsNyBAQAogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlYWREZXBlbmRlbmNpZXNfb3B0aW9uYWxCdW5kbGVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJTGlzdDxCdW5kbGU+IGRlcGVuZGVuY2llcyA9IFByb2plY3RMb2FkZXIucmVhZERlcGVuZGVuY2llcyhuZXcgRmlsZUlucHV0U3RyZWFtKCJ0ZXN0RmlsZXMvb3B0aW9uYWxCdW5kbGVzLk1GIikpOworCQlMaXN0PEJ1bmRsZT4gZGVwZW5kZW5jaWVzID0gUHJvamVjdExvYWRlci5yZWFkRGVwZW5kZW5jaWVzKGdldElucHV0U3RyZWFtKCJvcHRpb25hbEJ1bmRsZXMuTUYiKSk7CiAJCWFzc2VydEVxdWFscyg4LCBkZXBlbmRlbmNpZXMuc2l6ZSgpKTsKIAkJYXNzZXJ0VHJ1ZShkZXBlbmRlbmNpZXMuY29udGFpbnMoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIpKSk7CiAJCWFzc2VydFRydWUoZGVwZW5kZW5jaWVzLmNvbnRhaW5zKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIikpKTsKQEAgLTc3LDcgKzgxLDcgQEAKIAkgKi8KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWFkRGVwZW5kZW5jaWVzX2J1bmRsZVVuYXZhbGlsYWJsZUJ1dE9wdGlvbmFsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJTGlzdDxCdW5kbGU+IGRlcGVuZGVuY2llcyA9IFByb2plY3RMb2FkZXIucmVhZERlcGVuZGVuY2llcyhuZXcgRmlsZUlucHV0U3RyZWFtKCJ0ZXN0RmlsZXMvYnVuZGxlVW5hdmFsaWxhYmxlQnV0T3B0aW9uYWwuTUYiKSk7CisJCUxpc3Q8QnVuZGxlPiBkZXBlbmRlbmNpZXMgPSBQcm9qZWN0TG9hZGVyLnJlYWREZXBlbmRlbmNpZXMoZ2V0SW5wdXRTdHJlYW0oImJ1bmRsZVVuYXZhbGlsYWJsZUJ1dE9wdGlvbmFsLk1GIikpOwogCQlhc3NlcnRFcXVhbHMoOCwgZGVwZW5kZW5jaWVzLnNpemUoKSk7CiAJCWFzc2VydFRydWUoZGVwZW5kZW5jaWVzLmNvbnRhaW5zKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiKSkpOwogCQlhc3NlcnRUcnVlKGRlcGVuZGVuY2llcy5jb250YWlucyhQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpKSk7CkBAIC0xMDEsNyArMTA1LDEyIEBACiAJICovCiAJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCiAJcHVibGljIHZvaWQgdGVzdFJlYWREZXBlbmRlbmNpZXNfYnVuZGxlVW5hdmFpbGFibGVCdXROZWNlc3NhcnkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlQcm9qZWN0TG9hZGVyLnJlYWREZXBlbmRlbmNpZXMobmV3IEZpbGVJbnB1dFN0cmVhbSgidGVzdEZpbGVzL2J1bmRsZVVuYXZhaWxhYmxlQnV0TmVjZXNzYXJ5Lk1GIikpOworCQlQcm9qZWN0TG9hZGVyLnJlYWREZXBlbmRlbmNpZXMoZ2V0SW5wdXRTdHJlYW0oImJ1bmRsZVVuYXZhaWxhYmxlQnV0TmVjZXNzYXJ5Lk1GIikpOwogCX0KIAorCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb257CisJCVVSTFtdIHVybCA9IEZpbGVMb2NhdG9yLmZpbmRFbnRyaWVzKEVzY2FwZUlERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKCJ0ZXN0RmlsZXMvIitmaWxlTmFtZSkpOworCQlhc3NlcnQgdXJsLmxlbmd0aCA9PSAxIDogIkVzIHd1cmRlIG5pY2h0IGdlbmF1IGVpbmVuIFBmYWQgZ2VmdW5kZW4uIEVyd2FydGV0IHd1cmRlIGRlciBQZmFkIGb8ciBkYXM6dGVzdEZpbGVzLyIgKyBmaWxlTmFtZTsKKwkJcmV0dXJuIHVybFswXS5vcGVuU3RyZWFtKCk7CisJfQogfQo=