ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIGt5bGV6aGFvIDxreWxlemhhb0B0ZW5jZW50LmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXZMaXN0VGVzdCBleHRlbmRzIENMSVJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcml2YXRlIEdpdCBnaXQ7CisKKwlAT3ZlcnJpZGUKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJZ2l0ID0gbmV3IEdpdChkYik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0V2l0aFBhcmVudHNGbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gY3JlYXRlQ29tbWl0c0ZvclBhcmVudHNGbGFnKGdpdCk7CisJCVN0cmluZyByZXN1bHQgPSB0b1N0cmluZygKKwkJCQlleGVjdXRlKCJnaXQgcmV2LWxpc3QgSEVBRCAtLXBhcmVudHMgLS0gVGVzdC50eHQiKSk7CisKKwkJU3RyaW5nIGV4cGVjdCA9IHRvU3RyaW5nKAorCQkJCWNvbW1pdHMuZ2V0KDMpLm5hbWUoKSArICcgJyArIGNvbW1pdHMuZ2V0KDEpLm5hbWUoKSwKKwkJCQljb21taXRzLmdldCgxKS5uYW1lKCkpOworCisJCWFzc2VydEVxdWFscyhleHBlY3QsIHJlc3VsdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dFBhcmVudHNGbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gY3JlYXRlQ29tbWl0c0ZvclBhcmVudHNGbGFnKGdpdCk7CisJCVN0cmluZyByZXN1bHQgPSB0b1N0cmluZyhleGVjdXRlKCJnaXQgcmV2LWxpc3QgSEVBRCAtLSBUZXN0LnR4dCIpKTsKKworCQlTdHJpbmcgZXhwZWN0ID0gdG9TdHJpbmcoY29tbWl0cy5nZXQoMykubmFtZSgpLCBjb21taXRzLmdldCgxKS5uYW1lKCkpOworCisJCWFzc2VydEVxdWFscyhleHBlY3QsIHJlc3VsdCk7CisJfQorCisJcHJpdmF0ZSBMaXN0PFJldkNvbW1pdD4gY3JlYXRlQ29tbWl0c0ZvclBhcmVudHNGbGFnKEdpdCBnaXQpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJd3JpdGVUcmFzaEZpbGUoIlRlc3QxLnR4dCIsICJIZWxsbyB3b3JsZCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIlRlc3QxLnR4dCIpLmNhbGwoKTsKKwkJY29tbWl0cy5hZGQoZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImNvbW1pdCMwIikuY2FsbCgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoIlRlc3QudHh0IiwgIkhlbGxvIHdvcmxkISIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIlRlc3QudHh0IikuY2FsbCgpOworCQljb21taXRzLmFkZChnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0IzEiKS5jYWxsKCkpOworCQl3cml0ZVRyYXNoRmlsZSgiVGVzdDEudHh0IiwgIkhlbGxvIHdvcmxkISEiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0MS50eHQiKS5jYWxsKCk7CisJCWNvbW1pdHMuYWRkKGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQjMiIpLmNhbGwoKSk7CisJCXdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsICJIZWxsbyB3b3JsZCEhISIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIlRlc3QudHh0IikuY2FsbCgpOworCQljb21taXRzLmFkZChnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0IzMiKS5jYWxsKCkpOworCQlyZXR1cm4gY29tbWl0czsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKaW5kZXggODIyZjg5OS4uNjk2YTkyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQpAQCAtMTI5LDYgKzEyOSw5IEBACiAJCQl3YWxrLnNldFRyZWVGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUocGF0aEZpbHRlciwKIAkJCQkJVHJlZUZpbHRlci5BTllfRElGRikpOwogCQl9CisJCWlmIChwYXJlbnRzKSB7CisJCQl3YWxrLnNldFJld3JpdGVQYXJlbnRzKHRydWUpOworCQl9CiAKIAkJaWYgKHJldkxpbWl0ZXIuc2l6ZSgpID09IDEpCiAJCQl3YWxrLnNldFJldkZpbHRlcihyZXZMaW1pdGVyLmdldCgwKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKaW5kZXggNGJlMjI3MS4uOTNkODVlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTcgR29vZ2xlIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIxIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTUxNyw0ICs1MTcsNzYgQEAKIAkJYXNzZXJ0RXF1YWxzKCIvdG1wLyR7VFNUX1ZBUi9iYXIiLAogCQkJCWMuZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQljb25maWcoIkhvc3QgZm9vLmJhciAhZm9vYmFyLmJheiAqLmJhelxuIiArICJQb3J0IDI5NDE4XG4iKTsKKwkJSG9zdCBoID0gb3NjLmxvb2t1cCgiZm9vLmJhciIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjk0MTgsIGguZ2V0UG9ydCgpKTsKKwkJaCA9IG9zYy5sb29rdXAoImZvb2Jhci5iYXoiKTsKKwkJYXNzZXJ0Tm90TnVsbChoKTsKKwkJYXNzZXJ0RXF1YWxzKDIyLCBoLmdldFBvcnQoKSk7CisJCWggPSBvc2MubG9va3VwKCJmb28uYmF6Iik7CisJCWFzc2VydE5vdE51bGwoaCk7CisJCWFzc2VydEVxdWFscygyOTQxOCwgaC5nZXRQb3J0KCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlTWF0Y2gyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5lZ2F0aXZlIG1hdGNoIGFmdGVyIHRoZSBwb3NpdGl2ZSBtYXRjaC4KKwkJY29uZmlnKCJIb3N0IGZvby5iYXIgKi5iYXogIWZvb2Jhci5iYXpcbiIgKyAiUG9ydCAyOTQxOFxuIik7CisJCUhvc3QgaCA9IG9zYy5sb29rdXAoImZvby5iYXIiKTsKKwkJYXNzZXJ0Tm90TnVsbChoKTsKKwkJYXNzZXJ0RXF1YWxzKDI5NDE4LCBoLmdldFBvcnQoKSk7CisJCWggPSBvc2MubG9va3VwKCJmb29iYXIuYmF6Iik7CisJCWFzc2VydE5vdE51bGwoaCk7CisJCWFzc2VydEVxdWFscygyMiwgaC5nZXRQb3J0KCkpOworCQloID0gb3NjLmxvb2t1cCgiZm9vLmJheiIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjk0MTgsIGguZ2V0UG9ydCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbmZpZygiSG9zdCAhaG9zdDEgIWhvc3QyXG4iICsgIlBvcnQgMjk0MThcbiIpOworCQlIb3N0IGggPSBvc2MubG9va3VwKCJob3N0MSIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjIsIGguZ2V0UG9ydCgpKTsKKwkJaCA9IG9zYy5sb29rdXAoImhvc3QyIik7CisJCWFzc2VydE5vdE51bGwoaCk7CisJCWFzc2VydEVxdWFscygyMiwgaC5nZXRQb3J0KCkpOworCQloID0gb3NjLmxvb2t1cCgiaG9zdDMiKTsKKwkJYXNzZXJ0Tm90TnVsbChoKTsKKwkJYXNzZXJ0RXF1YWxzKDIyLCBoLmdldFBvcnQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQljb25maWcoIkhvc3QgZm9vLmJhclxuUG9ydCAyOTQxOFxuSWRlbnRpdHlGaWxlIC9mb29cblxuIgorCQkJCSsgIkhvc3QgKi5iYXJcblBvcnQgMjJcbklkZW50aXR5RmlsZSAvYmFyXG4iCisJCQkJKyAiSG9zdCBmb28uYmFyXG5Qb3J0IDQ3XG5JZGVudGl0eUZpbGUgL2JhelxuIik7CisJCUhvc3QgaCA9IG9zYy5sb29rdXAoImZvby5iYXIiKTsKKwkJYXNzZXJ0Tm90TnVsbChoKTsKKwkJYXNzZXJ0RXF1YWxzKDI5NDE4LCBoLmdldFBvcnQoKSk7CisJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICIvZm9vIiwgIi9iYXIiLCAiL2JheiIgfSwKKwkJCQloLmdldENvbmZpZygpLmdldFZhbHVlcygiSWRlbnRpdHlGaWxlIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IGZvbyBcdGJhciAgIGJhelxuUG9ydCAyOTQxOFxuIik7CisJCUhvc3QgaCA9IG9zYy5sb29rdXAoImZvbyIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjk0MTgsIGguZ2V0UG9ydCgpKTsKKwkJaCA9IG9zYy5sb29rdXAoImJhciIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjk0MTgsIGguZ2V0UG9ydCgpKTsKKwkJaCA9IG9zYy5sb29rdXAoImJheiIpOworCQlhc3NlcnROb3ROdWxsKGgpOworCQlhc3NlcnRFcXVhbHMoMjk0MTgsIGguZ2V0UG9ydCgpKTsKKwkJaCA9IG9zYy5sb29rdXAoIlx0YmFyIik7CisJCWFzc2VydE5vdE51bGwoaCk7CisJCWFzc2VydEVxdWFscygyMiwgaC5nZXRQb3J0KCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmluZGV4IDZhOTYyMWQuLmNkZGI5OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMSw1ICsxLDYgQEAKLSNTYXQgRGVjIDIwIDIxOjIxOjI0IENFVCAyMDA4CiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXQucGF0Y2g9SVNPLTg4NTktMQorZW5jb2RpbmcvL3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXRfUG9zdEltYWdlPUlTTy04ODU5LTEKIGVuY29kaW5nLy90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL3Rlc3RHZXRUZXh0X0JvdGhJU084ODU5MS5wYXRjaD1JU08tODg1OS0xCiBlbmNvZGluZy8vdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC90ZXN0R2V0VGV4dF9Db252ZXJ0LnBhdGNoPUlTTy04ODU5LTEKIGVuY29kaW5nLy90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL3Rlc3RHZXRUZXh0X0RpZmZDYy5wYXRjaD1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NHaXRMb2NrRmlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ0dpdExvY2tGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTk0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NHaXRMb2NrRmlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFNBUCBTRSBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkV4ZWN1dGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBVbml0IHRlc3RzIG9mIHtAbGluayBMb2NrRmlsZX0gdGVzdGluZyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggQyBnaXQKKyAqLworcHVibGljIGNsYXNzIENHaXRMb2NrRmlsZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9ja2VkVHdpY2VGYWlscygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUudHh0IiwgImNvbnRlbnQiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZS50eHQiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0MSA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjcmVhdGUgZmlsZSIpLmNhbGwoKTsKKworCQkJYXNzZXJ0Tm90TnVsbChjb21taXQxKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlLnR4dCIsICJjb250ZW50MiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlLnR4dCIpLmNhbGwoKTsKKwkJCWFzc2VydE5vdE51bGwoZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImVkaXQgZmlsZSIpLmNhbGwoKSk7CisKKwkJCUxvY2tGaWxlIGxmID0gbmV3IExvY2tGaWxlKGRiLmdldEluZGV4RmlsZSgpKTsKKwkJCWFzc2VydFRydWUobGYubG9jaygpKTsKKwkJCXRyeSB7CisJCQkJU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbXSB7ICJnaXQiLCAiY2hlY2tvdXQiLAorCQkJCQkJY29tbWl0MS5uYW1lKCkgfTsKKwkJCQlQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihjb21tYW5kKTsKKwkJCQlwYi5kaXJlY3RvcnkoZGIuZ2V0V29ya1RyZWUoKSk7CisJCQkJRXhlY3V0aW9uUmVzdWx0IHJlc3VsdCA9IEZTLkRFVEVDVEVELmV4ZWN1dGUocGIsIG51bGwpOworCQkJCWFzc2VydE5vdEVxdWFscygwLCByZXN1bHQuZ2V0UmMoKSk7CisJCQkJU3RyaW5nIGVyciA9IHJlc3VsdC5nZXRTdGRlcnIoKS50b1N0cmluZygpLnNwbGl0KCJcXFIiKVswXTsKKwkJCQlhc3NlcnRUcnVlKGVyci5tYXRjaGVzKAorCQkJCQkJImZhdGFsOiBVbmFibGUgdG8gY3JlYXRlIC4qL1xcLmdpdC9pbmRleFxcLmxvY2snOiBGaWxlIGV4aXN0c1xcLiIpKTsKKwkJCX0gZmluYWxseSB7CisJCQkJbGYudW5sb2NrKCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmLy5naXRhdHRyaWJ1dGVzIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi8uZ2l0YXR0cmlidXRlcwppbmRleCBjNTgzMWQ5Li4yOGNhYTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmLy5naXRhdHRyaWJ1dGVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvLmdpdGF0dHJpYnV0ZXMKQEAgLTEsMyArMSw1IEBACiAqLnBhdGNoIC1jcmxmCiAqSW1hZ2UgLWNybGYKICoub3V0IC1jcmxmCitkZWx0YSogLXRleHQKK2xpdGVyYWwqIC10ZXh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYucGF0Y2ggYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYjBiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZi5wYXRjaApAQCAtMCwwICsxLDkgQEAKK2RpZmYgLS1naXQgYS9jcmxmIGIvY3JsZgoraW5kZXggOTIwNmVlNi4uOTVkZDE5MyAxMDA2NDQKKy0tLSBhL2NybGYKKysrKyBiL2NybGYKK0BAIC0xLDMgKzEsMyBAQAorIGZvbworLWZpZQorK2JhcgorIGZ1bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmMi5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2MjEwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjIucGF0Y2gKQEAgLTAsMCArMSw5IEBACitkaWZmIC0tZ2l0IGEvY3JsZjIgYi9jcmxmMgoraW5kZXggMDVjMWM3OC4uOTFlMjQ2ZCAxMDA2NDQKKy0tLSBhL2NybGYyCisrKysgYi9jcmxmMgorQEAgLTEsMyArMSwzIEBACisgZm9vDQorLWZpZQ0KKytiYXINCisgZnVtDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmMl9Qb3N0SW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYyX1Bvc3RJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWUyNDZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmMl9Qb3N0SW1hZ2UKQEAgLTAsMCArMSwzIEBACitmb28NCitiYXINCitmdW0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYyX1ByZUltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmMl9QcmVJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMxYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmMl9QcmVJbWFnZQpAQCAtMCwwICsxLDMgQEAKK2Zvbw0KK2ZpZQ0KK2Z1bQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjMucGF0Y2ggYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTUxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYzLnBhdGNoCkBAIC0wLDAgKzEsOCBAQAorZGlmZiAtLWdpdCBhL2NybGYzIGIvY3JsZjMKK2luZGV4IGU2OWRlMjkuLjkyMDZlZTYgMTAwNjQ0CistLS0gYS9jcmxmMworKysrIGIvY3JsZjMKK0BAIC0wLDAgKzEsMyBAQAorK2ZvbworK2ZpZQorK2Z1bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmM19Qb3N0SW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYzX1Bvc3RJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMxYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmM19Qb3N0SW1hZ2UKQEAgLTAsMCArMSwzIEBACitmb28NCitmaWUNCitmdW0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGYzX1ByZUltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmM19QcmVJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmM19QcmVJbWFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmNC5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmNjA2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjQucGF0Y2gKQEAgLTAsMCArMSw5IEBACitkaWZmIC0tZ2l0IGEvY3JsZjQgYi9jcmxmNAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjkyMDZlZTYKKy0tLSAvZGV2L251bGwKKysrKyBiL2NybGY0CitAQCAtMCwwICsxLDMgQEAKKytmb28KKytmaWUKKytmdW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjRfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmNF9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMWM3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZjRfUG9zdEltYWdlCkBAIC0wLDAgKzEsMyBAQAorZm9vDQorZmllDQorZnVtDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9jcmxmX1Bvc3RJbWFnZSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZl9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMjQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZl9Qb3N0SW1hZ2UKQEAgLTAsMCArMSwzIEBACitmb28NCitiYXINCitmdW0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGZfUHJlSW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2NybGZfUHJlSW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMWM3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvY3JsZl9QcmVJbWFnZQpAQCAtMCwwICsxLDMgQEAKK2Zvbw0KK2ZpZQ0KK2Z1bQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvZGVsdGEucGF0Y2ggYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2RlbHRhLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODU1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2RlbHRhLnBhdGNoCkBAIC0wLDAgKzEsOCBAQAorZGlmZiAtLWdpdCBhL2RlbHRhIGIvZGVsdGEKK2luZGV4IGI0NTI3MDA1YmY5ZTRkYTJkZDFkNzE4NWI1MWJkYWM2MjNhNDIxOGYuLjhiMzcwYmI1ZjJiYzMyNjFiNmI2MmU4MGQ2ZWRkNzg0YTYxZWMyMjUgMTAwNjQ0CitHSVQgYmluYXJ5IHBhdGNoCitkZWx0YSAxNAorU2NtWnAwWG13YTF6KiskVTNqX2NzTihEbXoKKworZGVsdGEgMTIKK1RjbVpwNVhtRDV7dSF4YT01aEVpMjg/RlA0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2RlbHRhX1Bvc3RJbWFnZSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvZGVsdGFfUG9zdEltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzcwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2RlbHRhX1Bvc3RJbWFnZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2RlbHRhX1ByZUltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9kZWx0YV9QcmVJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUyNzAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9kZWx0YV9QcmVJbWFnZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2VtcHR5TGluZS5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvZW1wdHlMaW5lLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzgwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2VtcHR5TGluZS5wYXRjaApAQCAtMCwwICsxLDEwIEBACitkaWZmIC0tZ2l0IGEvZW1wdHlMaW5lIGIvZW1wdHlMaW5lCitpbmRleCAxZmQzZmEyLi40NWMyYzliIDEwMDY0NAorLS0tIGEvZW1wdHlMaW5lCisrKysgYi9lbXB0eUxpbmUKK0BAIC0xLDQgKzEsNCBAQAorIGZvbworCistZmllCisrYmFyCisgZnVtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2VtcHR5TGluZV9Qb3N0SW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2VtcHR5TGluZV9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMmM5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvZW1wdHlMaW5lX1Bvc3RJbWFnZQpAQCAtMCwwICsxLDQgQEAKK2ZvbworCitiYXIKK2Z1bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9lbXB0eUxpbmVfUHJlSW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2VtcHR5TGluZV9QcmVJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQzZmEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9lbXB0eUxpbmVfUHJlSW1hZ2UKQEAgLTAsMCArMSw0IEBACitmb28KKworZmllCitmdW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvaGVsbG8ucGF0Y2ggYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2hlbGxvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTVhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2hlbGxvLnBhdGNoCkBAIC0wLDAgKzEsMTYgQEAKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCitpbmRleCBiNmZjNGM2Li4wYWJhZWFhIDEwMDY0NAorLS0tIGEvaGVsbG8KKysrKyBiL2hlbGxvCitAQCAtMSArMSBAQAorLWhlbGxvCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKytieWUKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGlmZiAtLWdpdCBhL3llbGxvIGIveWVsbG8KK2luZGV4IDM5MWE4Y2IuLmQxZWQwODEgMTAwNjQ0CistLS0gYS95ZWxsbworKysrIGIveWVsbG8KK0BAIC0xICsxIEBACisteWVsbG8KKyt5ZWxsb3cKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvaGVsbG9fUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9oZWxsb19Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiYWVhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvaGVsbG9fUG9zdEltYWdlCkBAIC0wLDAgKzEgQEAKK2J5ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvaGVsbG9fUHJlSW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2hlbGxvX1ByZUltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmM0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2hlbGxvX1ByZUltYWdlCkBAIC0wLDAgKzEgQEAKK2hlbGxvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsLnBhdGNoIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODExZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2xpdGVyYWwucGF0Y2gKQEAgLTAsMCArMSwxMjYgQEAKK2RpZmYgLS1naXQgYS9saXRlcmFsIGIvbGl0ZXJhbAoraW5kZXggNzk5ZGY4NTc4ZTNjYWU4YTVlOTc5MTgyMzkxYjhlOWE2YTNkZWRlZC4uNzRlNDIwMWFmNjM3OGFjODdiZjllMTE4ZmJhYjY1NTNjN2ZkMzU1YyAxMDA2NDQKK0dJVCBiaW5hcnkgcGF0Y2gKK2xpdGVyYWwgNTM4OQoremNtYyYmWDtmMjV4Mj0wZ0ZhKGc7JGZPOEM1Zmx8cjIkTWhwZi07WFhoK3FPQHF3Um8qM2FGM15QZXEoWm9Ye1k0Cit6SXstPT9QKGQrNFJHZUNaQVR1UTMwMUFRKVZLQ3QpdVAqam0+I2JoemB9TC1eWU5nSU9Sa2hGRnlESXNTb1M9WVoKK3puJCY0ajBEentxbXEhUXlDPTV8UlFHcnZ7NzFJfVJBfDwlX3k4Jj9QaTI4VWU4UmtmRyRURHx1XlIzfCp4VSh6QgorelpASzVQJjMreGVqQ01jVWMwWSFJJD9XajY+K3JReGEpQn18T3pndldWYEJwPXQ9QEwrdW52Y2hlWS1GR1dWSEZpCit6bCtoVUFHO3RRTEdHT3JZRUliWl93eDgpbFAjP3lHc31ROGEkNCZgQXREanZ2alF3bXt5PV97Jk9iS00pend1a1YKK3o/QXBBRW92PSUqcEFCcig0ITZPOytmSzV+MjcpeUMqfXpfSzh8MnBOWEZFWk8oRnRpeGZRYkRWXjxmdDZ1KGdqfQorelNDfDgyKnpQXlMzSTxUMXVVKXNOQ0VXQUwmISl9S3ckK3lhQV44OEs+VFVCZT14LUlVI1pOO1okdWBLQTBFaG5BCit6TG8hNiYtPTUmX1o2fV92Myg5SHJ2NHZFe3pSKDs3VDwhM05SQlpfI3l6U2NqcTA5LSNoKmNYbitJKCFHQFV+el8KK3ohWmdBUGM8YHJ6UCVAKl8qU1hFbDl4XjlmQkpQREQ0eiEwSDJ1cjxmK0M2TjxrT1JAcWp3bGtoVT8mY01zY3FMJQoremh5UzwmYF97bVQ/aF9ZNWtvUllfYFYpI0Uhd3coRXchZ0pOTVRGMW9LNllZJUF8TjxKIXpWQ2RRUX5oMHNZPzdOCit6WT1sZ19DLThtanBnQFFLdVNwVk0qOHk4WTVQd00waVVePUBLRzBgYUJ3VElyQX0kTDticjNnMjZ4KlBqM0J5fncKK3p0ZjQ8JHo3Qio2VXdnMytsbmhfbSZ1I0dXNURwTmBmMVZ8Km58S2NkTnIrNmE/U3ZkQXhgX1J1alNQNkNqbkU2PAorejQ3XnN0OTVIbF5JQnU2YlhGTGMje28kPTQwaW9jXnJLX2FofDNGb3wkVHg9Ynp1V1VKeCkqNXstJUwlfXcqQmVsCit6ZmBpV3ZYZEsyNUEmVGVuQGsjQ0hsVnA9V0hNKSFyZWY7KnJwblUzNEwrayRMKUBmcz45OTdSZVFycjd5VkpZTEQKK3pgZFZzM2xZVit+T3BvQG0rPDFSTWl9WmVsdihhT3t6RnRhT3deSjJzbyMpX31SaF4zbVR5NVVsbTV1MGJkMSRzZAoreiUxU2FOY0dHOFVDO2VQcWh0ezB2YGtLSjYzdX1LX3ZvdjV2X1VfbG0he19CaDhxV3s/WlQ8NG80amJ8fHVGbWleCit6MzBaVV5heztAe3ZmOT9kZTUpVWdkJHo+bSFwZDFrdH0mbk54ZlElJEN2NXRJI0pMfnRNIWZYZG0zOH5ndWc2NHAKK3pQUUh6c3hyRVBvSH5hY3V1aVBxd2dlTGtYOXN0bEBjemRgbFBpXlVJUHVxSShsVFAodGRLemFKbmctMX43RS1pdAorel59RjQpVXlrJGxAVTdKM1g3YjFUWm9pem9NbGF8PClMaVAhMU5rIzRII2ZHSVJ7IXp2VWdfNmNyN2tmNmpkZDY2Cit6RCFRYyNGPWQyTGlTSE9LOCt4O0kwQyhZaj1CNCFHOEk7NmQ3b0RaXiheUEJiYVNJPWRVeWF4SXl9WXd5Xjd6YEkKK3pSb0xvbz1eV2spfEwlKzl2WFlJQDxOV2ZUPUUkYlRecWY+fFNVUlFRR1g4TnFMcE5yO245SW5+eCRZYDlVVXU0Ygorej1qVH1POVdeSUE+IXNeZldxUXRhMkB+WFI0UVRjJV9XNmBuYm5ATmUzI1ZnTyRPM3xgZTNYV2prTCVtPD92T0tlCit6YjJDcVVgTzJOV1hZcnBWIW1WNWl6cno/VTk/Yl41eFFUR2J8NUJRQkdaV1BQX3dlYjk2UW0ob3B6ZG5iZG0yRmcKK3opbzZCTlZ9SyZlMWNubklOM0xwO1NtMitkJEhBTG9veFgpeWtffTFhKDFxTG9wPDJtRFRiNXdBNipOdS1sTjMzaQoremcqMz5RVjhqMVJKP3k9N0xANFNZYCFDa3VOcDIqPC1WTjZMMyg+cnVEMmpGYWU+UHFaWC1gYnNJUSYrSk10e2dQCit6TUdrQ2ZnPHFgd2I/bGMjRTBlcDIyUjNEYT52JEZRbnFjc35mfk9kaVl8RFBnIXJteE0ka0Y0e3tgWnFtKH4kJmkKK3orUUF2MnN0NzZ7UWxvNlM2NSk9V1J4Qyk8ZHVjfTNjZSFncitTZ2slbSE3JnRwOW4xSTE1cCVPQlFLMmdKPnlVeQorejt3P1JMMGg8d0ghaXdTK155KFhiOGVjKTktKFokdE0oSVJwNnwkfTk9YlUmcTMjYE1fJGJTQkEqaj5kVilRbT4qCit6QkVTfUVxZmR0dWJUJFdTUEpuWiF5SX5JJGRGYiZgY2tCX0lFekshTTgrb0NeNURLa3s3bVJmJEIyTUo3ZnRvb1MKK3o3bWA8QjtJfWQoVCQ9PTAqS05JLXReOWAyPXpRKXJhd2B6ZUF7WnxIP3IpdCNYR0w/SlVmUjJGVG5PPDQyZHBSRworeiVCSGlUbCZBN1NvIXgybFZrVnhPZEB6aUpKZHhHQyZQJGU+UURfWjN2IXUhSWY7NVFJRkFjJUUrTjJqPjFGS2dnCit6NyVaakhpPHFVY0dwLX53ZTE3M3l6JiUtYUhzemRxNzZgYFlAPjI0bWlRc3lhN1JXKHdja3MlS2Vwczt6dSliMEEKK3pzMjVKUGhGTz8yYUZ2RUViVmplMikmIW5CR05JNnZhYFpqVl48Jjw7Km9BSWJ2MHwlemNUbVl3NCY0T3BkZEVBTAorejZpfEFCJldoeD1KYVlgVSReeC0/JlpoWGgtVl9xQFBGQTxAYWFzU0kqXzVMVnlkZzc1PGM3V2JPUj8xOXRFRytgCit6UEIxMlBfdDA5YC1kTzFke2diVyZOVWw4ODhAfHl0LWwmITs7cHlfXk51PGRCS3dEYzN5dkREfjkzflFIQkZQelgKK3okRyN8UikyS3ZBeEB5WUFpVjNrWWNiaXVVX04ldXZRTVJFbGlgV19VP2NhIzB5a2F1TSpTLS1zRmBkZlc0VTV3UQorekU3dWIzdHxoSn5yYUFBNlAqaGA3SWtxUXJwKEJtK2ZjcyhZViRsPj5OcCNrZD9qPUFodENpPiN4eEVAKTRKbXxeCit6PFlSJmZEX0xvVis8bCNtYEFQLSo+czlDIVE1I2JlKERLVztQSnFyelFyLW5EdFY4aHkhOVhjcU0qPktje0hpKVkKK3pQbVRtbTJjKGBwby0zZFBIOFYrb0I1R280el9eSnk2fj5LQkxsYCRRTytoN1U+MDd7NTBsakdidSRIRnE5IVNUbAorelJRVTUqdX1UVylxcnlXfVA9cWNZSVlKVSUwVD1NZzIhOVQxb3BLLU9ReG1sP0V4PnhUZSZtUlRGYyh6ZG1zUit0Cit6dFIoSXZ1JHtFRmUqbVF5VnFmTFVvYUwzZj9gPDVBI1U0MFlibGAmKFlhNz1iT2QpTU9KMkctVT1aPkgkX1R8MFkKK3pee1dAS1FuPmNPZ3VKMD9hR1dmLTcoSlQoQHxJNWlCZiVgfUN+QkZwV258TiN0S2JfUmdZZVpUU3NpPHh7aVU3JQorelNZUUt8QjkqLVomOzJvbHE4flZyTmhkWlBKX1NfcF5RNy0tZ0JGfTJVWXgxV29qVnk2cWdqSztBNWc0b2QxTyQ2Cit6dHhQPGU0V3tGMTs1K3JmI3QxYF97K0FqTzc5azkqUEdEb0Y2d3g0K0VWWClsNHx+Y34xTVl9S1hMQyowZUQlfkUKK3pLc049ZWtYYmA2e2REXnojVjYpNkskYH1eP3gkT0pVTFdHcHliJUAmSlZOKTV3TE4qN1kjRm9DOF8+dzAyKW1XOworenZnd2tQblpQY2VqaihKWDUhRH5Oa35WanJ3OSN8KjB5R15eMVdKQEA8MmBSfHp6Mmx4MU9reEs4QEYlb1RTeCt2Cit6cGA1JEpXJjEzN3lMTHkjTyN1IUZYUjReT0gqdTFvTHdjPjI4ZlhMNylVbUBneyhWbVBaaXpwVFBfYVJLWWI0VEkKK3oqbGxzcWQzY2NyNzMza0o7RzJtXlJyPH1pe18yUH1jT2NQXyNOS05hdmdPZzllfm13JXJfY2ohaCtuK1EoZTdkWQorekM3O3x4eDJEMVRRUHBVP2h+YikmNmlRblRvMm89VTlYbD5jY1RLNlNzTyh0NEc2UCVWTlRSQ1ZNVE8oOGMoSU85Cit6dGRFZkglUFo4Yk8jJiVFe0UteVlsV2I2PGlVWGttPmtCNlVTamo4WXF0KEQkQFhBM0IhIz0lX0R3cXYrd2lyQjgKK3pMXnFnd0F1eEZ6aUh1a0UpP2ArMDBHbX48a0xuMEJjKDNQN0hZNF5gTTxUWGtfKylFIXM2PUI4YEtXWkttUGl9TQoremhRRT9Vd0Y3fk8zSWZ8JGcjKD1vLWxRPUskUD4+VkgzJGRReFUyUzxFbzgxPU50Tzd6byg/d3BfQF5wfTA5dj12Cit6UkJgdkImKmFLKnUkZGZHTWRjSiEkN3JtaldGLUxNanwrb0NqITFPcHUjcSp6P2xpI1dWTjNHQi1uMHR4VElYYVMKK3opRFpeaSVhMDY/WCR7c1ZrfCleXmdeO0Qtd2FkK31kTzRhXkFWLTgjU2x2YHRWNE5FTD84SF44R0FmOHhNISZuZgorejNwaFdINWNIajM+Z0cxN2ZXdSgjb25od0pCPChzU3gwVjRVbHpkckhHJXk7dnpiYDM0NXllNWsxMD4pNEw1SVA7Cit6SWBQYWE3bCthMTJDJCtaQGw9S0xQfmVnYGJZUjEqI1ZWTEtrbWNTQCRnfipjQzNofGE1PjwoS0s5ME1YaHNyKC0KK3pTKkRYZjl1VFEoO00mfkxkd1R7MFY7KlY0SGBDS3RKNDNpTihmNUpTWUxXUmw2LSp0LV85aVElNjFsVUFKIWtVZworeihMK0pHcHAhfihZfUVwS2laYEBiPXByKHY9bz5TdFVBPnx8KFViS1loPHBSXk0wdnpMYFNkQUE5bF9tS20kPko1Cit6LVZ1eFVWajhHRS0lPSplVD45KmlLbipiPHZEVCt9XnMkJUlqd3AwVkB4SzY8QDJQaGNielNlbzc8TGZOLSF5Qk0KK3p2fVckVUtyVzZoUXBXfklfajJ0ZSZtRCMldG1zdT40I1ZXNVpgSCU8WEdNYlQkWFFqRVpHemh3TWJVM3Y0ZVQ9UAorempZfEg/akkkJCFpU3ZJUzgqV0A2UX4/RlNpQzBvYU5CeFEtTTxOeW8pcSV5P0BKOHV6PEtmWlpWPHooVHh7XnNDCit6Y3JAVTJNZ1hUJUl5X2FaKmlSbHFNWDQ+dVAyNWB2ODVmUDM0I2w7ek9SeV98cFJ0fG9vJkhjU2BLe298WFlEMkIKK3pKN3plQmE3KW9nc0thbyo9KUpnb09XZEZSKn03NzBoSXB7VnhhXmdESyhlZl9CbihSZCY5MkFmXks+fHgqYj9wcQorel5kUGVOWWVAKlUwMzV+e1JCTilaT3lHez4wJjhpYnhzVjJPNjw8a0JoX0lmMDlAdX47Kip0OXk4TFp+VXBhJWl4Cit6VFpzPiozRXRvZ0hFUlRgNVg/ayRMNDNaejJ2RyZgellDQHpHOT48KktvfExuIzF7KkdMMFhWX3pGOyEpM1c+aWYKK3pwZCNmK2B+IWgxUWkjTXE1fT9SQUIoPXdpam0zZGd2SUJiZ2RlfkxQSk11Tk08YzQ0fjV7MERwUypeckV6JCpDeAorei1GJDdWVFhDRnhqVT1mTWFGQSg4ezNTcyY1O31+JEBabnhVY05vbk5uTUMpK1hIKEMjbVZkZHZMdTBOUilUYUIjCit6a0lzeVRfNjFQVl8xPGFrRjBTOGNGS3NsRmxvbmJpNUJLQ0spPV9ETG0zMXF4PyN9REk4N0dZfTx3VDhuUmBCTzQKK3pSeEA1X2ExR0U1P0tPUDJiUCtvVHlJLUskQEs4JXVNNUZ5ITVAVFA/OyoheFRwMm1GfkhPUUQ+eUMoUnhoK1U0ZworelVVa3E2I312MjhDb1BsQ3VrVEJoPk1oYDA+eTRofVRnJkVTazdyIXlFPU8+KGRTdChBTHl3UENaeXR3SzltI2QkCit6VVB0JCpAY2tHQF8jVyFteXFle3NtanBwYm5EZGZQVFJwa1FQe2oqSWVTNDJwaTEyalR1WjZ5czFUNXJfKGhXOSQKK3pkVTcrLSZ4NDJWWVQjc1Eoe3VhYTg4WT4kbkA9VmNTb1Q7MnU8WU12S0YoNWZrcSZte2JxN2ZHJXE3O3s0cHMjTQorejJqcW1xKXBjezBhQFV+XntEMz85XyNiTCNZTWtEYmh9aD9fK1R1RzBTPT9DRUN3MTlOUGRFPnpuVXxzWDk8fDhJCit6I2FgeDhKdT9tJUYjTk5ZZUZscmBjJn0zK3V0aUZYTCpJQm5CJV8yRzE/bjxpP2VCKVk4YjVsaHs4XjZPQiZ8IVoKK3o3Z0opJHY1KzBteyFaYHl6ezRQJGxsTmtHamE/UzhGSmNDfXZ8TE02QGxSXntGR2lhWjJgU35ld19LI2xNQzx9QQorekVuM1RZI1NnKHFlO2NFNDQhRz1+LS1TKm95JW41Zz9PflJyZjYmUnFFJjQzUVZ4TGJDP0ozRF48fGNhOTJRPXpJCit6eyElb25pREQ3SD4xb0lFTz8mb3hpaz5fVjVRVjJ6SDBBNyQmcG1ENXZHWG1pPyVGPnZeXldPflJPPVIyLSQ4aj4KK3okOSNkUnZhaV82ND1HfUdgUXtnRCNtVGJsNn5iM0htKWpsYkc1IXM/S0pHMyZSR18kfFl3ZGpRaTl7RSNTfEV3fQoremtnUjNkJFpTS009NG89TnlPdGBDc3l9RyU9QHM2UFd5YzZ4cDY2YkNgXjdqRklXb1EzYWtHY2d6PTlKU2p1ZndtCit6UGA7fUFBakBYNnpIRGxyZW19dUIkKnpYXjhsOXxCP3wzVnBZZT9SalNoIXhpOSQhNnxeWHlxbTxGPC1NPTAkWGUKK3pZa20yfnhFI2Vvb3VlZ3g2P0k7b2plb0c5OCteVHkoYTt1PWhGX2tTLTw/KjxvZ0xNaitoWkp5eWk2QEMzeytBYgorekBtVU0jS2VsV3ljZyR8TkJWV2VCP153fHRNPnZIOGxsMHoqXkxtVV5rZTlNIT5HK0JNKVQ5TTx5aUFjYDE9O2thCit6PFp2KDNPdEZlenY/WHJjXkZZZGIhQ0NVU1c3Vmp4VVQqcmg/RUF7c0hOTVNFOVV0WHFKPColWCUhZEdQQ2ltMT4KK3p2YmZ0MyomVEhlRjkhYT1xUzZHdHtRdGAockpvK1pNPStCMy11VkJle3JgbTI+VHVSMkd2eHxkXj4oTTBfMV57SgoreiZPT2drdyhBeXN0WUh0fEVeeik3OHVzSUtjdnslOGk/elFReHdQK1NLQ3BrKFArKzV9eW01YjNOWld3dyRmaCR7Cit6K3omY3p5cVlJZVR6Y3owb1NaS0JvYShaI1BUbiowZ0RaXy0+JnJociF2ZDZiMzR3M0Z4aSpKeWMtWT40ZUAkXjQKK2N4Z3VONGtuaShOVTM8NiV7OzMxSkpwKCokeF51R3I5ZkdhWnY7WTdBCisKK2xpdGVyYWwgMTYyOQoremNtVi1qMkJQX2lQKTxoOzNLfExrMDAwZTFOSkxUcTAwMUJXMDAxQmUxXkBzNmI5I0Y4MDAwMDRiMyNjfTJuWXhXCit6ZDxiTlMwMDBJUU5rbDxaU2NTIXhlUWNIMDhOaCRmZEdHQjlQO1F9UkNEMEY3dX1+bF8zWD5YT3Atb3VFRzd0dzAKK3pyejEtPUYlRjBPQVoqQnQlNEFXZSVjZDZHJW1gc1k2dSR5ZmhCOURPcmZrZXZrUGpRfDdientZXnQ7Z2VlVitaJQorei1iLSg5ZCs5S1hQeDl0eyZwRlJ8cDVPREZeRkhUJjtZJHt8a3gzb0QlUyN7YXd2Kmw3Syl0TVF6V1JSJEBOTGJfCit6dztIfXYpR1FJZjYlM2o4SH4lZmE7amQ+aCQ2OTVRUldja1crXlMoJDZFNG5YVztZK0xzSGd+aVZGMiYqYE1LaFIKK3pIbW1DUTFieXlVYGxEXkYmWG08cEtLNjIrd2R4c21xR3xfTHw2Jn4xYkQhNGtLQXAmaUd1JUxMZENwSG4+fFROVgoreiU4UjNhX3xUem1tIyozUEBRLUhTVVlNMWVIITxiIyFILWVaVlp4R0JqTGZvWEFEck5zYWRVPWU+YzNqTXM7JiZGCit6OFZDUlFeZCNTZXU5dntNNUEyeno0fUVwPm48dWhmNnBfcCsxdnpabmA1NUNmSm5ZK2hsI1QxUlY4Yj8xZlBGVFYKK3pNcXt9MVJMdlh6TnRnanUjRDZBdjdkWVFYP0VZbmN5MCFlRD1oSnRITkUkJFVUUX5uV2EpTkl4RX17Nj0wJjtWKworek5TS0xlTEt2JmM+YTF9eWo8PEI0dHNORiVMdVNxc2g8UWskVzVZV0k1MSh1cl5PfWdINCVCSUhAODs7PURfT0wtCit6Z3lQIUBtXnYrdz8zXnFEZmdtbC05Zj1eXkRsRSshVGV6cEM+JEJFcWY4P1FlWWhIPDFKcUZQMD1mP31tWn52KGcKK3p4b0ozcWBCTnNkZWIqQz0mK3puVFBnKG9HWj5Uc05tKnA2LXNePGRFKXVRVV57ZUEhdzg4RnM5KUF5d1JFXz4tfgorem88ejw4WU81UW11ZSYlUExTZ3g7dlZfaDdqN1VMcElCaVh8NGQ1JSFTKXxDPFFNSHYjPjVxaU12aWBjM2ZYam5ZCit6P256ST5uMzBxZ3lLKHlUbTFDaitpb0Z7XjNAMENXclNPKT5ybntjfXtAR29ldWZMWHMrdlpHVCheQyYjN2VZaWIKK3pAdiMpWj08N0lPbUlBMWk2Vn0rSkJYSklKcGBuQEdJfVpUeC1vQjQkWXdjcCRpcWE4NTd8VUclQ2ZHVzgyMXE3PQorenE5K0FQTSt6YGQ+U2BMZnxLM2Zzd19Tc25scyRvUTxIcnVFdVpCZWNNc2FjP29tSV9nYnN+fi1CTER6MylmYyRgCit6LWUxd3QtcCNUVnJNekZVZyMjYUs7YWZ9USNwdyFvcmNQYSZYNEVwZHBHbHVUbEdrPmwmTGRMJmM+e2xWQHZVZSgKK3pCe2k5fj4rVCtNTnN8MUBsVSU0eE1ocXo3clhGe2tsNEQjWEk8ckpmfEp9aGNlZTtjcEp6fjwqTXc2VkJnNGdHYgorem9vcS1sUj1DaF8hTF9jZUs1cUFtSTJodnxfN1pXVEFkJFh6X1oqfEs7V0UleXBrQ1E9Zkl1KyolPCNLaDdoTVAhCit6PXI4MzladEJjZFJWJElPYGI8WTc4JWooK2ZFa2JoVXZHJS1FUGotRTN1YVBaY1pyN2NFcGEoaSlQTF5XdEY1azcKK3pLY3tfMys2eXd1NyVmNkw0d09VeylnfWZvKkQ/XkpyfHs3U3A4PzwpSF5FU0Ulc2YlfnVuK3VhN3JZe0owNit9MAorekJ5OFJwczJIfF5KfGorMit+ckM0Rm4/aFkwSkNQX0xoN2l8TCtVOT8qYWwrJnRrRkZYc2YwSENSJHNLdHslLU4qCit6M1JSNitGbUlwfTVtKCYkdWVAZz1iTEpLUkZsVE43LSZgX3gkVVdsb2NnQ2gpM0FsfkM5Uil+ZlpGfioxOGY0VloKK3o3b0EmVWt3M0BLKzdTTGc3bWpocVRxV31oVitgTGh6YzViNj1rTFU3STV2OVc8JiZTayhISTRnT0B4NDcwO285bQorelkrclR5SnluZmFHKyZeTHA1OUE8TTVDKVhjcVliaCNsZkBERkBUPHs3eDQjczIxVHp1WmJEQisrUit6d15TPHUwCit6O2czRFZ6X2Z7SmZ0a0IxQztjS0FIZ15yMjlKVEBjZmk3SDUzVTFkWllSPEtBc2lfbGRtN1V2O2FgYUZZREVJPjEKK3piWHtwNloyZzBzdDEreFBScn5mUWstbkk+TCReI0E8SkhzOzEmVCFNUT9zQUYxMkhfcGtSckhVZUlQQztuTlprQQorekFsT1NOPjw1UGFMPSE2O1BTd0J1T3N0aGI7QHZ0YU4zSDghZmctUnc3UVFnST5Qaz80OWF8Z3pNXk96VHRVWD0oCit6PHt0K1MjVGlYcSk2fGVFLWd6U0kwclBfK1ltWUI0eX01ST5Ecz95THl2bUF7NGRvbVg2blJ5fFRie2NAZ3czR28KK3pTQXk+USVDOzAyKnN5RHpOYU8kO1VhVkBwNXVWUC14eDZqV1UoJDhJcFkoQkR6T1E3ajZxViUpKCpAYzhZVVJXOworenpwY3AyUzQjbl5TJXsxUytRQndrSEMxazdfSV9Ia2A7K1YwOXVZdGMlPVd3Iz8tZUB9R318IX1QVTtPRHstUXNwCitiVSVMRGtNREJXWCZSdWA8MDAwMDBOa3ZYWHUwbWpmSkFAYn4KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX1Bvc3RJbWFnZSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlNDIwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9Qb3N0SW1hZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX1ByZUltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX1ByZUltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWRmODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL2xpdGVyYWxfUHJlSW1hZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX2FkZC5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2YTllNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGQucGF0Y2gKQEAgLTAsMCArMSw0MCBAQAorZGlmZiAtLWdpdCBhL2xpdGVyYWxfYWRkIGIvbGl0ZXJhbF9hZGQKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43OTlkZjg1NzhlM2NhZThhNWU5NzkxODIzOTFiOGU5YTZhM2RlZGVkCitHSVQgYmluYXJ5IHBhdGNoCitsaXRlcmFsIDE2MjkKK3pjbVYtajJCUF9pUCk8aDszS3xMazAwMGUxTkpMVHEwMDFCVzAwMUJlMV5AczZiOSNGODAwMDA0YjMjY30ybll4VworemQ8Yk5TMDAwSVFOa2w8WlNjUyF4ZVFjSDA4TmgkZmRHR0I5UDtRfVJDRDBGN3V9fmxfM1g+WE9wLW91RUc3dHcwCit6cnoxLT1GJUYwT0FaKkJ0JTRBV2UlY2Q2RyVtYHNZNnUkeWZoQjlET3Jma2V2a1BqUXw3Ynp7WV50O2dlZVYrWiUKK3otYi0oOWQrOUtYUHg5dHsmcEZSfHA1T0RGXkZIVCY7WSR7fGt4M29EJVMje2F3dipsN0spdE1ReldSUiRATkxiXworenc7SH12KUdRSWY2JTNqOEh+JWZhO2pkPmgkNjk1UVJXY2tXK15TKCQ2RTRuWFc7WStMc0hnfmlWRjImKmBNS2hSCit6SG1tQ1ExYnl5VWBsRF5GJlhtPHBLSzYyK3dkeHNtcUd8X0x8NiZ+MWJEITRrS0FwJmlHdSVMTGRDcEhuPnxUTlYKK3olOFIzYV98VHptbSMqM1BAUS1IU1VZTTFlSCE8YiMhSC1lWlZaeEdCakxmb1hBRHJOc2FkVT1lPmMzak1zOyYmRgorejhWQ1JRXmQjU2V1OXZ7TTVBMnp6NH1FcD5uPHVoZjZwX3ArMXZ6Wm5gNTVDZkpuWStobCNUMVJWOGI/MWZQRlRWCit6TXF7fTFSTHZYek50Z2p1I0Q2QXY3ZFlRWD9FWW5jeTAhZUQ9aEp0SE5FJCRVVFF+bldhKU5JeEV9ezY9MCY7VisKK3pOU0tMZUxLdiZjPmExfXlqPDxCNHRzTkYlTHVTcXNoPFFrJFc1WVdJNTEodXJeT31nSDQlQklIQDg7Oz1EX09MLQoremd5UCFAbV52K3c/M15xRGZnbWwtOWY9Xl5EbEUrIVRlenBDPiRCRXFmOD9RZVloSDwxSnFGUDA9Zj99bVp+dihnCit6eG9KM3FgQk5zZGViKkM9Jit6blRQZyhvR1o+VHNObSpwNi1zXjxkRSl1UVVee2VBIXc4OEZzOSlBeXdSRV8+LX4KK3pvPHo8OFlPNVFtdWUmJVBMU2d4O3ZWX2g3ajdVTHBJQmlYfDRkNSUhUyl8QzxRTUh2Iz41cWlNdmlgYzNmWGpuWQorej9uekk+bjMwcWd5Syh5VG0xQ2oraW9Ge14zQDBDV3JTTyk+cm57Y317QEdvZXVmTFhzK3ZaR1QoXkMmIzdlWWliCit6QHYjKVo9PDdJT21JQTFpNlZ9K0pCWEpJSnBgbkBHSX1aVHgtb0I0JFl3Y3AkaXFhODU3fFVHJUNmR1c4MjFxNz0KK3pxOStBUE0remBkPlNgTGZ8SzNmc3dfU3NubHMkb1E8SHJ1RXVaQmVjTXNhYz9vbUlfZ2Jzfn4tQkxEejMpZmMkYAorei1lMXd0LXAjVFZyTXpGVWcjI2FLO2FmfVEjcHchb3JjUGEmWDRFcGRwR2x1VGxHaz5sJkxkTCZjPntsVkB2VWUoCit6QntpOX4+K1QrTU5zfDFAbFUlNHhNaHF6N3JYRntrbDREI1hJPHJKZnxKfWhjZWU7Y3BKen48Kk13NlZCZzRnR2IKK3pvb3EtbFI9Q2hfIUxfY2VLNXFBbUkyaHZ8XzdaV1RBZCRYel9aKnxLO1dFJXlwa0NRPWZJdSsqJTwjS2g3aE1QIQorej1yODM5WnRCY2RSViRJT2BiPFk3OCVqKCtmRWtiaFV2RyUtRVBqLUUzdWFQWmNacjdjRXBhKGkpUExeV3RGNWs3Cit6S2N7XzMrNnl3dTclZjZMNHdPVXspZ31mbypEP15Kcnx7N1NwOD88KUheRVNFJXNmJX51bit1YTdyWXtKMDYrfTAKK3pCeThScHMySHxeSnxqKzIrfnJDNEZuP2hZMEpDUF9MaDdpfEwrVTk/KmFsKyZ0a0ZGWHNmMEhDUiRzS3R7JS1OKgorejNSUjYrRm1JcH01bSgmJHVlQGc9YkxKS1JGbFRONy0mYF94JFVXbG9jZ0NoKTNBbH5DOVIpfmZaRn4qMThmNFZaCit6N29BJlVrdzNASys3U0xnN21qaHFUcVd9aFYrYExoemM1YjY9a0xVN0k1djlXPCYmU2soSEk0Z09AeDQ3MDtvOW0KK3pZK3JUeUp5bmZhRysmXkxwNTlBPE01QylYY3FZYmgjbGZAREZAVDx7N3g0I3MyMVR6dVpiREIrK1IrendeUzx1MAorejtnM0RWel9me0pmdGtCMUM7Y0tBSGdecjI5SlRAY2ZpN0g1M1UxZFpZUjxLQXNpX2xkbTdVdjthYGFGWURFST4xCit6Ylh7cDZaMmcwc3QxK3hQUnJ+ZlFrLW5JPkwkXiNBPEpIczsxJlQhTVE/c0FGMTJIX3BrUnJIVWVJUEM7bk5aa0EKK3pBbE9TTj48NVBhTD0hNjtQU3dCdU9zdGhiO0B2dGFOM0g4IWZnLVJ3N1FRZ0k+UGs/NDlhfGd6TV5PelR0VVg9KAorejx7dCtTI1RpWHEpNnxlRS1nelNJMHJQXytZbVlCNHl9NUk+RHM/eUx5dm1BezRkb21YNm5SeXxUYntjQGd3M0dvCit6U0F5PlElQzswMipzeUR6TmFPJDtVYVZAcDV1VlAteHg2aldVKCQ4SXBZKEJEek9RN2o2cVYlKSgqQGM4WVVSVzsKK3p6cGNwMlM0I25eUyV7MVMrUUJ3a0hDMWs3X0lfSGtgOytWMDl1WXRjJT1XdyM/LWVAfUd9fCF9UFU7T0R7LVFzcAorYlUlTERrTURCV1gmUnVgPDAwMDAwTmt2WFh1MG1qZkpBQGJ+CisKK2xpdGVyYWwgMAorSGNtVj9kMDAwMDEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGRfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX2FkZF9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZGY4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGRfUG9zdEltYWdlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdC5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRkNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0LnBhdGNoCkBAIC0wLDAgKzEsOSBAQAorZGlmZiAtLWdpdCBhL3NtdWRnZXRlc3QgYi9zbXVkZ2V0ZXN0CitpbmRleCBhMjRkNDFlLi43NjJjNGQwIDEwMDY0NAorLS0tIGEvc211ZGdldGVzdAorKysrIGIvc211ZGdldGVzdAorQEAgLTEsMyArMSwzIEBACisgUEVSTEUKKy1IRUJMRQorK3NwcmljaAorIHNwZWFrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0X1Bvc3RJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYzMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0X1Bvc3RJbWFnZQpAQCAtMCwwICsxLDMgQEAKK1BBUkxBCitzcHJpY2gKK3NwZWFrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUHJlSW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUHJlSW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdF9QcmVJbWFnZQpAQCAtMCwwICsxLDMgQEAKK1BBUkxBCitIQUJMQQorc3BlYWsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0LnBhdGNoIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MGRiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0LnBhdGNoCkBAIC0wLDAgKzEsNyBAQAorZGlmZiAtLWdpdCBhL3VtbGF1dCBiL3VtbGF1dAoraW5kZXggMDAzYTA1NC4uNTU3ZjcyZiAxMDA2NDQKKy0tLSBhL3VtbGF1dAorKysrIGIvdW1sYXV0CitAQCAtMSArMSBAQAorLcOEw5bDnAorK8TW3ApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXRfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXRfUG9zdEltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2Y3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9Qb3N0SW1hZ2UKQEAgLTAsMCArMSBAQAorxNbcCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9QcmVJbWFnZSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0X1ByZUltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2EwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9QcmVJbWFnZQpAQCAtMCwwICsxIEBACivDhMOWw5wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vZGVsdGExLmZvcndhcmQgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5mb3J3YXJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGIxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5mb3J3YXJkCkBAIC0wLDAgKzEgQEAKK1NjbVpwMFhtd2ExeiorJFUzal9jc04oRG16CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5yZXZlcnNlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9kZWx0YTEucmV2ZXJzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY3YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9kZWx0YTEucmV2ZXJzZQpAQCAtMCwwICsxIEBACitUY21acDVYbUQ1e3UheGE9NWhFaTI4P0ZQNApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQppbmRleCAwNTVlYmE3Li44NjczMTBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMjAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAyMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtOSw2ICs5LDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwpAQCAtMTgsMTEgKzE5LDIwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEFwcGx5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkZpbHRlckNvbW1hbmRSZWdpc3RyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIEFwcGx5Q29tbWFuZFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewpAQCAtNTgsNiArNjgsMjYwIEBACiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJZGIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsIHRydWUpOworCQkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiY3JsZiIsIHRydWUsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmIiksCisJCQkJCXJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpOworCQkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmIiksCisJCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOworCQl9IGZpbmFsbHkgeworCQkJZGIuZ2V0Q29uZmlnKCkudW5zZXQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyTGZPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWRiLmdldENvbmZpZygpLnNldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGLCBmYWxzZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJjcmxmIiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYiKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZkVtcHR5Q29tbWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgdHJ1ZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJjcmxmMyIsIHRydWUsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmMyIpLAorCQkJCQlyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKTsKKwkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiY3JsZjMiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZk5ld0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWRiLmdldENvbmZpZygpLnNldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGLCB0cnVlKTsKKwkJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoImNybGY0IiwgZmFsc2UsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmNCIpLAorCQkJCQlyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKTsKKwkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiY3JsZjQiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hXaXRoQ3JMZigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJZGIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsIGZhbHNlKTsKKwkJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoImNybGYyIiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYyIiksCisJCQkJCXJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpOworCQkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmMiIpLAorCQkJCQliLmdldFN0cmluZygwLCBiLnNpemUoKSwgZmFsc2UpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWRiLmdldENvbmZpZygpLnVuc2V0KENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQYXRjaFdpdGhDckxmMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbmFtZSA9ICJjcmxmMiI7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgZmFsc2UpOworCQkJYSA9IG5ldyBSYXdUZXh0KHJlYWRGaWxlKG5hbWUgKyAiX1ByZUltYWdlIikpOworCQkJd3JpdGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSksCisJCQkJCWEuZ2V0U3RyaW5nKDAsIGEuc2l6ZSgpLCBmYWxzZSkpOworCisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZSkuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlByZUltYWdlIikuY2FsbCgpOworCisJCQliID0gbmV3IFJhd1RleHQocmVhZEZpbGUobmFtZSArICJfUG9zdEltYWdlIikpOworCisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgdHJ1ZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBnaXQuYXBwbHkoKQorCQkJCQkuc2V0UGF0Y2goZ2V0VGVzdFJlc291cmNlKG5hbWUgKyAiLnBhdGNoIikpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyhuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCBuYW1lKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSksCisJCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOworCQl9IGZpbmFsbHkgeworCQkJZGIuZ2V0Q29uZmlnKCkudW5zZXQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGKTsKKwkJfQorCX0KKworCS8vIENsZWFuL3NtdWRnZSBmaWx0ZXIgZm9yIHRlc3RGaWx0ZXJpbmcuIFRoZSBzbXVkZ2V0ZXN0IHRlc3QgcmVzb3VyY2VzIHdlcmUKKwkvLyBjcmVhdGVkIHdpdGggQyBnaXQgdXNpbmcgYSBjbGVhbiBmaWx0ZXIgc2VkIC1lICJzL0EvRS9nIiBhbmQgdGhlIHNtdWRnZQorCS8vIGZpbHRlciBzZWQgLWUgInMvRS9BL2ciLiBUbyBrZWVwIHRoZSB0ZXN0IGluZGVwZW5kZW50IG9mIHRoZSBwcmVzZW5jZSBvZgorCS8vIHNlZCwgaW1wbGVtZW50IHRoaXMgd2l0aCBhIGJ1aWx0LWluIGZpbHRlci4KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBsYWNlRmlsdGVyIGV4dGVuZHMgRmlsdGVyQ29tbWFuZCB7CisKKwkJcHJpdmF0ZSBmaW5hbCBjaGFyIHRvUmVwbGFjZTsKKworCQlwcml2YXRlIGZpbmFsIGNoYXIgcmVwbGFjZW1lbnQ7CisKKwkJUmVwbGFjZUZpbHRlcihJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgY2hhciB0b1JlcGxhY2UsCisJCQkJY2hhciByZXBsYWNlbWVudCkgeworCQkJc3VwZXIoaW4sIG91dCk7CisJCQl0aGlzLnRvUmVwbGFjZSA9IHRvUmVwbGFjZTsKKwkJCXRoaXMucmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJCWlmIChiIDwgMCkgeworCQkJCWluLmNsb3NlKCk7CisJCQkJb3V0LmNsb3NlKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKChiICYgMHhGRikgPT0gdG9SZXBsYWNlKSB7CisJCQkJYiA9IHJlcGxhY2VtZW50OworCQkJfQorCQkJb3V0LndyaXRlKGIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0IHVwIGZpbHRlcgorCQlGaWx0ZXJDb21tYW5kRmFjdG9yeSBjbGVhbiA9IChyZXBvLCBpbiwgb3V0KSAtPiB7CisJCQlyZXR1cm4gbmV3IFJlcGxhY2VGaWx0ZXIoaW4sIG91dCwgJ0EnLCAnRScpOworCQl9OworCQlGaWx0ZXJDb21tYW5kRmFjdG9yeSBzbXVkZ2UgPSAocmVwbywgaW4sIG91dCkgLT4geworCQkJcmV0dXJuIG5ldyBSZXBsYWNlRmlsdGVyKGluLCBvdXQsICdFJywgJ0EnKTsKKwkJfTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvY2xlYW4iLCBjbGVhbik7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcigiamdpdDovL2J1aWx0aW4vYTJlL3NtdWRnZSIsIHNtdWRnZSk7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfRklMVEVSX1NFQ1RJT04sICJhMmUiLAorCQkJCQkiY2xlYW4iLCAiamdpdDovL2J1aWx0aW4vYTJlL2NsZWFuIik7CisJCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfRklMVEVSX1NFQ1RJT04sICJhMmUiLAorCQkJCQkic211ZGdlIiwgImpnaXQ6Ly9idWlsdGluL2EyZS9zbXVkZ2UiKTsKKwkJCXdyaXRlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICIuZ2l0YXR0cmlidXRlcyIpLAorCQkJCQkic211ZGdldGVzdCBmaWx0ZXI9YTJlIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi5naXRhdHRyaWJ1dGVzIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkF0dHJpYnV0ZXMiKS5jYWxsKCk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJzbXVkZ2V0ZXN0IiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgInNtdWRnZXRlc3QiKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgInNtdWRnZXRlc3QiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFRlYXIgZG93biBmaWx0ZXIKKwkJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvY2xlYW4iKTsKKwkJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvc211ZGdlIik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tCaW5hcnkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaGFzUHJlSW1hZ2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkobmFtZSwgaGFzUHJlSW1hZ2UsIDEpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0JpbmFyeShTdHJpbmcgbmFtZSwgYm9vbGVhbiBoYXNQcmVJbWFnZSwKKwkJCWludCBudW1iZXJPZkZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWJ5dGVbXSBwb3N0ID0gSU8KKwkJCQkJLnJlYWRXaG9sZVN0cmVhbShnZXRUZXN0UmVzb3VyY2UobmFtZSArICJfUG9zdEltYWdlIiksIDApCisJCQkJCS5hcnJheSgpOworCQkJRmlsZSBmID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CisJCQlpZiAoaGFzUHJlSW1hZ2UpIHsKKwkJCQlieXRlW10gcHJlID0gSU8KKwkJCQkJCS5yZWFkV2hvbGVTdHJlYW0oZ2V0VGVzdFJlc291cmNlKG5hbWUgKyAiX1ByZUltYWdlIiksIDApCisJCQkJCQkuYXJyYXkoKTsKKwkJCQlGaWxlcy53cml0ZShmLnRvUGF0aCgpLCBwcmUpOworCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lKS5jYWxsKCk7CisJCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlByZUltYWdlIikuY2FsbCgpOworCQkJfQorCQkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gZ2l0LmFwcGx5KCkKKwkJCQkJLnNldFBhdGNoKGdldFRlc3RSZXNvdXJjZShuYW1lICsgIi5wYXRjaCIpKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMobnVtYmVyT2ZGaWxlcywgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZiwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQlhc3NlcnRBcnJheUVxdWFscyhwb3N0LCBGaWxlcy5yZWFkQWxsQnl0ZXMoZi50b1BhdGgoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5RGVsdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkoImRlbHRhIiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5TGl0ZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljaGVja0JpbmFyeSgibGl0ZXJhbCIsIHRydWUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJpbmFyeUxpdGVyYWxBZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkoImxpdGVyYWxfYWRkIiwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVuY29kaW5nQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgaXMgYSB0ZXh0IHBhdGNoIHRoYXQgY2hhbmdlcyBhIGZpbGUgY29udGFpbmluZyDDhMOWw5wgaW4gVVRGLTggdG8KKwkJLy8gdGhlIHNhbWUgY2hhcmFjdGVycyBpbiBJU08tODg1OS0xLiBUaGUgcGF0Y2ggZmlsZSBpdHNlbGYgdXNlcyBtaXhlZAorCQkvLyBlbmNvZGluZy4gU2luY2UgY2hlY2tGaWxlKCkgd29ya3Mgd2l0aCBzdHJpbmdzIHVzZSB0aGUgYmluYXJ5IGNoZWNrLgorCQljaGVja0JpbmFyeSgidW1sYXV0IiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEMgZ2l0IGFjY2VwdHMgY29tcGxldGVseSBlbXB0eSBsaW5lcyBhcyBlbXB0eSBjb250ZXh0IGxpbmVzLgorCQkvLyBBY2NvcmRpbmcgdG8gY29tbWVudHMgaW4gdGhlIEMgZ2l0IHNvdXJjZXMgKGFwcGx5LmMpLCBuZXdlciBHTlUgZGlmZgorCQkvLyBtYXkgcHJvZHVjZSBzdWNoIGRpZmZzLgorCQljaGVja0JpbmFyeSgiZW1wdHlMaW5lIiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaWxlTm9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgdGVzdCBuZWVkcyB0d28gZmlsZXMuIE9uZSBpcyBpbiB0aGUgdGVzdCByZXNvdXJjZXMuCisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlGaWxlcy53cml0ZShkYi5nZXRXb3JrVHJlZSgpLnRvUGF0aCgpLnJlc29sdmUoInllbGxvIiksCisJCQkJCSJ5ZWxsbyIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJ5ZWxsbyIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJ5ZWxsbyIpLmNhbGwoKTsKKwkJfQorCQljaGVja0JpbmFyeSgiaGVsbG8iLCB0cnVlLCAyKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBZGRBMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJBMSIsIGZhbHNlLCB0cnVlKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQppbmRleCBhZTRkYjBiLi41MDlhZGMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBSZXBvQ29tbWFuZFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewpAQCAtNzQ5LDEwICs3NTEsNTYgQEAKIAkJCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7CiAJCQlhc3NlcnRFcXVhbHMoIlRoZSBnaXRsaW5rIGlzIHNhbWUgYXMgcmVtb3RlIGhlYWQiLAogCQkJCQlvbGRDb21taXRJZC5uYW1lKCksIGdpdGxpbmspOworCisJCQlGaWxlIGRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQkJYXNzZXJ0VHJ1ZShkb3Rtb2R1bGVzLmV4aXN0cygpKTsKKwkJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBoYXZlICJicmFuY2giIGxpbmVzCisJCQlTdHJpbmcgZ2l0TW9kdWxlc0NvbnRlbnRzID0gUmF3UGFyc2VVdGlscworCQkJCQkuZGVjb2RlKElPLnJlYWRGdWxseShkb3Rtb2R1bGVzKSk7CisJCQlhc3NlcnRUcnVlKGdpdE1vZHVsZXNDb250ZW50cy5jb250YWlucygiYnJhbmNoID0gYnJhbmNoIikpOwogCQl9CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25CYXJlX2lnbm9yZVRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVwb3NpdG9yeSByZW1vdGVEYiA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCVJlcG9zaXRvcnkgdGVtcERiID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKworCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi5cIiAvPiIpCisJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCIiKS5hcHBlbmQoInJlZnMvdGFncy8iICsgVEFHKQorCQkJCS5hcHBlbmQoIlwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImZvb1wiIG5hbWU9XCIiKQorCQkJCS5hcHBlbmQoZGVmYXVsdFVyaSkKKwkJCQkuYXBwZW5kKCJcIiAvPiIpLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJSkdpdFRlc3RVdGlsLndyaXRlVHJhc2hGaWxlKHRlbXBEYiwgIm1hbmlmZXN0LnhtbCIsCisJCQkJeG1sQ29udGVudC50b1N0cmluZygpKTsKKwkJUmVwb0NvbW1hbmQgY29tbWFuZCA9IG5ldyBSZXBvQ29tbWFuZChyZW1vdGVEYik7CisJCWNvbW1hbmQuc2V0UGF0aCgKKwkJCQl0ZW1wRGIuZ2V0V29ya1RyZWUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvbWFuaWZlc3QueG1sIikKKwkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKKwkJLy8gQ2xvbmUgaXQKKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0UmVwbGFjZU1hbmlmZXN0QmFyZSIpOworCQlGaWxlIGRvdG1vZHVsZXM7CisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQorCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQkJYXNzZXJ0VHJ1ZShkb3Rtb2R1bGVzLmV4aXN0cygpKTsKKwkJfQorCisJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBub3QgaGF2ZSAiYnJhbmNoIiBsaW5lcworCQlTdHJpbmcgZ2l0TW9kdWxlc0NvbnRlbnRzID0gUmF3UGFyc2VVdGlscworCQkJCS5kZWNvZGUoSU8ucmVhZEZ1bGx5KGRvdG1vZHVsZXMpKTsKKwkJYXNzZXJ0RmFsc2UoZ2l0TW9kdWxlc0NvbnRlbnRzLmNvbnRhaW5zKCJicmFuY2giKSk7CisJCWFzc2VydFRydWUoZ2l0TW9kdWxlc0NvbnRlbnRzLmNvbnRhaW5zKCJyZWYgPSByZWZzL3RhZ3MvIiArIFRBRykpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENvcHlGaWxlQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXBvc2l0b3J5IHJlbW90ZURiID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKIAkJUmVwb3NpdG9yeSB0ZW1wRGIgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTg1VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTg1VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTg3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlODVUZXN0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIEJhc2U4NX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlODVUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9DSEFSUyA9ICIwMTIzNDU2Nzg5IgorCQkJKyAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKwkJCSsgIiEjJCUmKCkqKy07PD0+P0BeX2B7fH1+IjsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoYXJzKCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlieXRlW10gdGVzdERhdGEgPSB7ICcxJywgJzInLCAnMycsICc0JywgKGJ5dGUpIGkgfTsKKwkJCWlmIChWQUxJRF9DSEFSUy5pbmRleE9mKGkpID49IDApIHsKKwkJCQlieXRlW10gZGVjb2RlZCA9IEJhc2U4NS5kZWNvZGUodGVzdERhdGEsIDQpOworCQkJCWFzc2VydE5vdE51bGwoZGVjb2RlZCk7CisJCQl9IGVsc2UgeworCQkJCWFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisJCQkJCQkoKSAtPiBCYXNlODUuZGVjb2RlKHRlc3REYXRhLCA0KSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcm91bmR0cmlwKGJ5dGVbXSBkYXRhLCBpbnQgZXhwZWN0ZWRMZW5ndGgpIHsKKwkJYnl0ZVtdIGVuY29kZWQgPSBCYXNlODUuZW5jb2RlKGRhdGEpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMZW5ndGgsIGVuY29kZWQubGVuZ3RoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMoZGF0YSwgQmFzZTg1LmRlY29kZShlbmNvZGVkLCBkYXRhLmxlbmd0aCkpOworCX0KKworCXByaXZhdGUgdm9pZCByb3VuZHRyaXAoU3RyaW5nIGRhdGEsIGludCBleHBlY3RlZExlbmd0aCkgeworCQlyb3VuZHRyaXAoZGF0YS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSwgZXhwZWN0ZWRMZW5ndGgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFBhZGRpbmcoKSB7CisJCXJvdW5kdHJpcCgiIiwgMCk7CisJCXJvdW5kdHJpcCgiYSIsIDUpOworCQlyb3VuZHRyaXAoImFiIiwgNSk7CisJCXJvdW5kdHJpcCgiYWJjIiwgNSk7CisJCXJvdW5kdHJpcCgiYWJjZCIsIDUpOworCQlyb3VuZHRyaXAoImFiY2RlIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZiIsIDEwKTsKKwkJcm91bmR0cmlwKCJhYmNkZWZnIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZmdoIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZmdoaSIsIDE1KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoKSB7CisJCXJvdW5kdHJpcChuZXcgYnl0ZVtdIHsgMSB9LCA1KTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyIH0sIDUpOworCQlyb3VuZHRyaXAobmV3IGJ5dGVbXSB7IDEsIDIsIDMgfSwgNSk7CisJCXJvdW5kdHJpcChuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCB9LCA1KTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH0sIDEwKTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCAwLCAwLCAwIH0sIDEwKTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCAwLCAwLCAwLCA1IH0sIDEwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvdygpIHsKKwkJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgPSBhc3NlcnRUaHJvd3MoCisJCQkJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IEJhc2U4NS5kZWNvZGUobmV3IGJ5dGVbXSB7ICd+JywgJ34nLCAnficsICd+JywgJ34nIH0sIDQpKTsKKwkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygib3ZlcmZsb3ciKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5RGVsdGFJbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyOTdmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBDcnVkZSB0ZXN0cyBmb3IgdGhlIHtAbGluayBCaW5hcnlEZWx0YUlucHV0U3RyZWFtfSB1c2luZyBkZWx0YSBkaWZmcworICogZ2VuZXJhdGVkIGJ5IEMgZ2l0LgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbVRlc3QgeworCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRCaW5hcnlIdW5rKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCaW5hcnlEZWx0YSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBQcmVwYXJlIG91ciB0ZXN0IGRhdGEKKwkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4MTkyXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQlkYXRhW2ldID0gKGJ5dGUpICgyNTUgLSAoaSAlIDI1NikpOworCQl9CisJCS8vIFNhbWUsIGJ1dCB3aXRoIGZpdmUgJ3gnIGluc2VydGVkIGluIHRoZSBtaWRkbGUuCisJCWludCBtaWRkbGUgPSBkYXRhLmxlbmd0aCAvIDI7CisJCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyA1XTsKKwkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBtaWRkbGUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworCQkJbmV3RGF0YVttaWRkbGUgKyBpXSA9ICd4JzsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG1pZGRsZSwgbmV3RGF0YSwgbWlkZGxlICsgNSwgbWlkZGxlKTsKKwkJLy8gZGVsdGExLmZvcndhcmQgaGFzIHRoZSBpbnN0cnVjdGlvbnMKKwkJLy8gQGZvcm1hdHRlcjpvZmYKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gSU5TRVJUIDUgeHh4eHgKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gQGZvcm1hdHRlcjpvbgorCQkvLyBOb3RlIHRoYXQgdGhlIHdheSB3ZSBidWlsdCBuZXdEYXRhIGNvdWxkIGJlIGV4cHJlc3NlZCBhcworCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBJTlNFUlQgNSB4eHh4eAorCQkvLyBDT1BZIDQwOTYgNDA5NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQlCaW5hcnlEZWx0YUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJpbmFyeURlbHRhSW5wdXRTdHJlYW0oZGF0YSwKKwkJCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQkJCWdldEJpbmFyeUh1bmsoImRlbHRhMS5mb3J3YXJkIikpKSkpIHsKKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCWludCBuOworCQkJd2hpbGUgKChuID0gaW5wdXQucmVhZChidWYpKSA+PSAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCQlhc3NlcnRBcnJheUVxdWFscyhuZXdEYXRhLCBvdXQudG9CeXRlQXJyYXkoKSk7CisJCQlhc3NlcnRUcnVlKGlucHV0LmlzRnVsbHlDb25zdW1lZCgpKTsKKwkJfQorCQkvLyBkZWx0YTEucmV2ZXJzZSBoYXMgdGhlIGluc3RydWN0aW9ucworCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBDT1BZIDI1NiAzODQwCisJCS8vIENPUFkgMjU2IDI1NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCS8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgYWx0ZXJuYXRpdmVzLCBmb3IgaW5zdGFuY2UKKwkJLy8gQGZvcm1hdHRlcjpvZmYKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gQ09QWSA0MTAxIDQwOTYKKwkJLy8gQGZvcm1hdHRlcjpvbgorCQkvLyBvcgorCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQlCaW5hcnlEZWx0YUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJpbmFyeURlbHRhSW5wdXRTdHJlYW0oCisJCQkJCQluZXdEYXRhLAorCQkJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCQkJZ2V0QmluYXJ5SHVuaygiZGVsdGExLnJldmVyc2UiKSkpKSkgeworCQkJbG9uZyBleHBlY3RlZFNpemUgPSBpbnB1dC5nZXRFeHBlY3RlZFJlc3VsdFNpemUoKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgZXhwZWN0ZWRTaXplKTsKKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCWludCBuOworCQkJd2hpbGUgKChuID0gaW5wdXQucmVhZChidWYpKSA+PSAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBvdXQudG9CeXRlQXJyYXkoKSk7CisJCQlhc3NlcnRUcnVlKGlucHV0LmlzRnVsbHlDb25zdW1lZCgpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rU3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOThjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rU3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBCaW5hcnlIdW5rSW5wdXRTdHJlYW19IGFuZCB7QGxpbmsgQmluYXJ5SHVua091dHB1dFN0cmVhbX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlIdW5rU3RyZWFtVGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBXaG9sZUJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoaW50IGxlbmd0aCA9IDE7IGxlbmd0aCA8IDUyMCArIDUyOyBsZW5ndGgrKykgeworCQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJZGF0YVtpXSA9IChieXRlKSAoMjU1IC0gKGkgJSAyNTYpKTsKKwkJCX0KKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQkJQmluYXJ5SHVua091dHB1dFN0cmVhbSBvdXQgPSBuZXcgQmluYXJ5SHVua091dHB1dFN0cmVhbSgKKwkJCQkJCQlib3MpKSB7CisJCQkJb3V0LndyaXRlKGRhdGEpOworCQkJCW91dC5mbHVzaCgpOworCQkJCWJ5dGVbXSBlbmNvZGVkID0gYm9zLnRvQnl0ZUFycmF5KCk7CisJCQkJYXNzZXJ0RmFsc2UoQXJyYXlzLmVxdWFscyhkYXRhLCBlbmNvZGVkKSk7CisJCQkJdHJ5IChCaW5hcnlIdW5rSW5wdXRTdHJlYW0gaW4gPSBuZXcgQmluYXJ5SHVua0lucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kZWQpKSkgeworCQkJCQlieXRlW10gZGVjb2RlZCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCQkJaW50IG5ld0xlbmd0aCA9IGluLnJlYWQoZGVjb2RlZCk7CisJCQkJCWFzc2VydEVxdWFscyhuZXdMZW5ndGgsIGRlY29kZWQubGVuZ3RoKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBDaHVua3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKGludCBsZW5ndGggPSAxOyBsZW5ndGggPCA1MjAgKyA1MjsgbGVuZ3RoKyspIHsKKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJCWRhdGFbaV0gPSAoYnl0ZSkgKDI1NSAtIChpICUgMjU2KSk7CisJCQl9CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCUJpbmFyeUh1bmtPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0oCisJCQkJCQkJYm9zKSkgeworCQkJCW91dC53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCAvIDIpOworCQkJCW91dC53cml0ZShkYXRhLCBkYXRhLmxlbmd0aCAvIDIsIGRhdGEubGVuZ3RoIC0gZGF0YS5sZW5ndGggLyAyKTsKKwkJCQlvdXQuZmx1c2goKTsKKwkJCQlieXRlW10gZW5jb2RlZCA9IGJvcy50b0J5dGVBcnJheSgpOworCQkJCWFzc2VydEZhbHNlKEFycmF5cy5lcXVhbHMoZGF0YSwgZW5jb2RlZCkpOworCQkJCXRyeSAoQmluYXJ5SHVua0lucHV0U3RyZWFtIGluID0gbmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGVkKSkpIHsKKwkJCQkJYnl0ZVtdIGRlY29kZWQgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQkJCWludCBwID0gMDsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoZGVjb2RlZCwgcCwKKwkJCQkJCQlNYXRoLm1pbihkZWNvZGVkLmxlbmd0aCAtIHAsIDU3KSkpID49IDApIHsKKwkJCQkJCXAgKz0gbjsKKwkJCQkJCWlmIChwID09IGRlY29kZWQubGVuZ3RoKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYXNzZXJ0RXF1YWxzKHAsIGRlY29kZWQubGVuZ3RoKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoaW50IGxlbmd0aCA9IDE7IGxlbmd0aCA8IDUyMCArIDUyOyBsZW5ndGgrKykgeworCQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJZGF0YVtpXSA9IChieXRlKSAoMjU1IC0gKGkgJSAyNTYpKTsKKwkJCX0KKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQkJQmluYXJ5SHVua091dHB1dFN0cmVhbSBvdXQgPSBuZXcgQmluYXJ5SHVua091dHB1dFN0cmVhbSgKKwkJCQkJCQlib3MpKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJCW91dC53cml0ZShkYXRhW2ldKTsKKwkJCQl9CisJCQkJb3V0LmZsdXNoKCk7CisJCQkJYnl0ZVtdIGVuY29kZWQgPSBib3MudG9CeXRlQXJyYXkoKTsKKwkJCQlhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRhdGEsIGVuY29kZWQpKTsKKwkJCQl0cnkgKEJpbmFyeUh1bmtJbnB1dFN0cmVhbSBpbiA9IG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCkpKSB7CisJCQkJCWJ5dGVbXSBkZWNvZGVkID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWludCB2YWwgPSBpbi5yZWFkKCk7CisJCQkJCQlhc3NlcnRUcnVlKDAgPD0gdmFsICYmIHZhbCA8PSAyNTUpOworCQkJCQkJZGVjb2RlZFtpXSA9IChieXRlKSB2YWw7CisJCQkJCX0KKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBXaXRoQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKGludCBsZW5ndGggPSAxOyBsZW5ndGggPCA1MjAgKyA1MjsgbGVuZ3RoKyspIHsKKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJCWRhdGFbaV0gPSAoYnl0ZSkgKDI1NSAtIChpICUgMjU2KSk7CisJCQl9CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKKwkJCQl0cnkgKEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0oCisJCQkJCQlib3MpKSB7CisJCQkJCW91dC53cml0ZShkYXRhKTsKKwkJCQl9CisJCQkJYnl0ZVtdIGVuY29kZWQgPSBib3MudG9CeXRlQXJyYXkoKTsKKwkJCQlhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRhdGEsIGVuY29kZWQpKTsKKwkJCQl0cnkgKEJpbmFyeUh1bmtJbnB1dFN0cmVhbSBpbiA9IG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCkpKSB7CisJCQkJCWJ5dGVbXSBkZWNvZGVkID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJCQlpbnQgbmV3TGVuZ3RoID0gaW4ucmVhZChkZWNvZGVkKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKG5ld0xlbmd0aCwgZGVjb2RlZC5sZW5ndGgpOworCQkJCQlhc3NlcnRFcXVhbHMoLTEsIGluLnJlYWQoKSk7CisJCQkJCWFzc2VydEFycmF5RXF1YWxzKGRhdGEsIGRlY29kZWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzMzMWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTEuMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJQVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUyIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IDJmYTg3MTMuLjk2MjMyNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTEzLDYgKzEzLDkgQEAKIGFOZXdPYmplY3RJZElzUmVxdWlyZWQ9QSBOZXdPYmplY3RJZCBpcyByZXF1aXJlZC4KIGFuRXhjZXB0aW9uT2NjdXJyZWRXaGlsZVRyeWluZ1RvQWRkVGhlSWRPZkhFQUQ9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBhZGQgdGhlIElkIG9mIEhFQUQKIGFuU1NIU2Vzc2lvbkhhc0JlZW5BbHJlYWR5Q3JlYXRlZD1BbiBTU0ggc2Vzc2lvbiBoYXMgYmVlbiBhbHJlYWR5IGNyZWF0ZWQKK2FwcGx5QmluYXJ5QmFzZU9pZFdyb25nPUNhbm5vdCBhcHBseSBiaW5hcnkgcGF0Y2g7IE9JRCBmb3IgZmlsZSB7MH0gZG9lcyBub3QgbWF0Y2gKK2FwcGx5QmluYXJ5T2lkVG9vU2hvcnQ9QmluYXJ5IHBhdGNoIGZvciBmaWxlIHswfSBkb2VzIG5vdCBoYXZlIGZ1bGwgSURzCithcHBseUJpbmFyeVJlc3VsdE9pZFdyb25nPVJlc3VsdCBvZiBiaW5hcnkgcGF0Y2ggZm9yIGZpbGUgezB9IGhhcyB3cm9uZyBPSUQuCiBhcHBseWluZ0NvbW1pdD1BcHBseWluZyB7MH0KIGFyY2hpdmVGb3JtYXRBbHJlYWR5QWJzZW50PUFyY2hpdmUgZm9ybWF0IGFscmVhZHkgYWJzZW50OiB7MH0KIGFyY2hpdmVGb3JtYXRBbHJlYWR5UmVnaXN0ZXJlZD1BcmNoaXZlIGZvcm1hdCBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb246IHswfQpAQCAtMzcsNyArNDAsMTkgQEAKIGJhZFNlY3Rpb25FbnRyeT1CYWQgc2VjdGlvbiBlbnRyeTogezB9CiBiYWRTaGFsbG93TGluZT1CYWQgc2hhbGxvdyBsaW5lOiB7MH0KIGJhcmVSZXBvc2l0b3J5Tm9Xb3JrZGlyQW5kSW5kZXg9QmFyZSBSZXBvc2l0b3J5IGhhcyBuZWl0aGVyIGEgd29ya2luZyB0cmVlLCBub3IgYW4gaW5kZXgKK2Jhc2U4NWludmFsaWRDaGFyPUludmFsaWQgYmFzZS04NSBjaGFyYWN0ZXI6IDB4ezB9CitiYXNlODVsZW5ndGg9QmFzZS04NSBlbmNvZGVkIGRhdGEgbXVzdCBoYXZlIGEgbGVuZ3RoIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiA1CitiYXNlODVvdmVyZmxvdz1CYXNlLTg1IHZhbHVlIG92ZXJmbG93LCBkb2VzIG5vdCBmaXQgaW50byAzMiBiaXRzOiAweHswfQorYmFzZTg1dG9vTG9uZz1FeHRyYSBiYXNlLTg1IGVuY29kZWQgZGF0YSBmb3Igb3V0cHV0IHNpemUgb2YgezB9IGJ5dGVzCitiYXNlODV0b29TaG9ydD1CYXNlLTg1IGRhdGEgZGVjb2RlZCBpbnRvIGxlc3MgdGhhbiB7MH0gYnl0ZXMKIGJhc2VMZW5ndGhJbmNvcnJlY3Q9YmFzZSBsZW5ndGggaW5jb3JyZWN0CitiaW5hcnlEZWx0YUJhc2VMZW5ndGhNaXNtYXRjaD1CaW5hcnkgZGVsdGEgYmFzZSBsZW5ndGggZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkIHswfSwgZ290IHsxfQorYmluYXJ5RGVsdGFJbnZhbGlkT2Zmc2V0PUJpbmFyeSBkZWx0YSBvZmZzZXQgKyBsZW5ndGggdG9vIGxhcmdlOiB7MH0gKyB7MX0KK2JpbmFyeURlbHRhSW52YWxpZFJlc3VsdExlbmd0aD1CaW5hcnkgZGVsdGEgZXhwZWN0ZWQgcmVzdWx0IGxlbmd0aCBpcyBuZWdhdGl2ZQorYmluYXJ5SHVua0RlY29kZUVycm9yPUJpbmFyeSBodW5rLCBsaW5lIHswfTogaW52YWxpZCBpbnB1dAorYmluYXJ5SHVua0ludmFsaWRMZW5ndGg9QmluYXJ5IGh1bmssIGxpbmUgezB9OiBpbnB1dCBjb3JydXB0OyBleHBlY3RlZCBsZW5ndGggYnl0ZSwgZ290IDB4ezF9CitiaW5hcnlIdW5rTGluZVRvb1Nob3J0PUJpbmFyeSBodW5rLCBsaW5lIHswfTogaW5wdXQgZW5kZWQgcHJlbWF0dXJlbHkKK2JpbmFyeUh1bmtNaXNzaW5nTmV3bGluZT1CaW5hcnkgaHVuaywgbGluZSB7MH06IGlucHV0IGxpbmUgbm90IHRlcm1pbmF0ZWQgYnkgbmV3bGluZQogYml0bWFwTWlzc2luZ09iamVjdD1CaXRtYXAgYXQgezB9IGlzIG1pc3NpbmcgezF9LgogYml0bWFwc011c3RCZVByZXBhcmVkPUJpdG1hcHMgbXVzdCBiZSBwcmVwYXJlZCBiZWZvcmUgdGhleSBtYXkgYmUgd3JpdHRlbi4KIGJsYW1lTm90Q29tbWl0dGVkWWV0PU5vdCBDb21taXR0ZWQgWWV0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCmluZGV4IGUyMjhlODIuLjU4Mzc2N2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAyMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDIxIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC05LDI5ICs5LDY4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZENvcHlPcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkZpbHRlckZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEFwcGx5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVDaGVja291dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlQ2hlY2tvdXQuQ2hlY2tvdXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLkVvbFN0cmVhbVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGF0Y2guQmluYXJ5SHVuazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkZpbGVIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5GaWxlSGVhZGVyLlBhdGNoVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkh1bmtIZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5QYXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuQW5kVHJlZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5Ob3RJZ25vcmVkRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXJHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkV4ZWN1dGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQmluYXJ5RGVsdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQmluYXJ5SHVua0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5Fb2xTdHJlYW1UeXBlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExOwogCiAvKioKICAqIEFwcGx5IGEgcGF0Y2ggdG8gZmlsZXMgYW5kL29yIHRvIHRoZSBpbmRleC4KQEAgLTQ1LDcgKzg0LDcgQEAKIAlwcml2YXRlIElucHV0U3RyZWFtIGluOwogCiAJLyoqCi0JICogQ29uc3RydWN0cyB0aGUgY29tbWFuZCBpZiB0aGUgcGF0Y2ggaXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaW5kZXguCisJICogQ29uc3RydWN0cyB0aGUgY29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCiAJICovCkBAIC03OSw2ICsxMTgsNyBAQAogCXB1YmxpYyBBcHBseVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgUGF0Y2hGb3JtYXRFeGNlcHRpb24sCiAJCQlQYXRjaEFwcGx5RXhjZXB0aW9uIHsKIAkJY2hlY2tDYWxsYWJsZSgpOworCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAJCUFwcGx5UmVzdWx0IHIgPSBuZXcgQXBwbHlSZXN1bHQoKTsKIAkJdHJ5IHsKIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKQEAgLTg3LDE5ICsxMjcsMjIgQEAKIAkJCX0gZmluYWxseSB7CiAJCQkJaW4uY2xvc2UoKTsKIAkJCX0KLQkJCWlmICghcC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpCisJCQlpZiAoIXAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7CiAJCQkJdGhyb3cgbmV3IFBhdGNoRm9ybWF0RXhjZXB0aW9uKHAuZ2V0RXJyb3JzKCkpOworCQkJfQorCQkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gZ2V0UmVwb3NpdG9yeSgpOworCQkJRGlyQ2FjaGUgY2FjaGUgPSByZXBvc2l0b3J5LnJlYWREaXJDYWNoZSgpOwogCQkJZm9yIChGaWxlSGVhZGVyIGZoIDogcC5nZXRGaWxlcygpKSB7CiAJCQkJQ2hhbmdlVHlwZSB0eXBlID0gZmguZ2V0Q2hhbmdlVHlwZSgpOwogCQkJCUZpbGUgZiA9IG51bGw7CiAJCQkJc3dpdGNoICh0eXBlKSB7CiAJCQkJY2FzZSBBREQ6CiAJCQkJCWYgPSBnZXRGaWxlKGZoLmdldE5ld1BhdGgoKSwgdHJ1ZSk7Ci0JCQkJCWFwcGx5KGYsIGZoKTsKKwkJCQkJYXBwbHkocmVwb3NpdG9yeSwgZmguZ2V0TmV3UGF0aCgpLCBjYWNoZSwgZiwgZmgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE1PRElGWToKIAkJCQkJZiA9IGdldEZpbGUoZmguZ2V0T2xkUGF0aCgpLCBmYWxzZSk7Ci0JCQkJCWFwcGx5KGYsIGZoKTsKKwkJCQkJYXBwbHkocmVwb3NpdG9yeSwgZmguZ2V0T2xkUGF0aCgpLCBjYWNoZSwgZiwgZmgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIERFTEVURToKIAkJCQkJZiA9IGdldEZpbGUoZmguZ2V0T2xkUGF0aCgpLCBmYWxzZSk7CkBAIC0xMTgsMTQgKzE2MSwxNCBAQAogCQkJCQkJdGhyb3cgbmV3IFBhdGNoQXBwbHlFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQkJCUpHaXRUZXh0LmdldCgpLnJlbmFtZUZpbGVGYWlsZWQsIGYsIGRlc3QpLCBlKTsKIAkJCQkJfQotCQkJCQlhcHBseShkZXN0LCBmaCk7CisJCQkJCWFwcGx5KHJlcG9zaXRvcnksIGZoLmdldE9sZFBhdGgoKSwgY2FjaGUsIGRlc3QsIGZoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBDT1BZOgogCQkJCQlmID0gZ2V0RmlsZShmaC5nZXRPbGRQYXRoKCksIGZhbHNlKTsKIAkJCQkJRmlsZSB0YXJnZXQgPSBnZXRGaWxlKGZoLmdldE5ld1BhdGgoKSwgZmFsc2UpOwogCQkJCQlGaWxlVXRpbHMubWtkaXJzKHRhcmdldC5nZXRQYXJlbnRGaWxlKCksIHRydWUpOwogCQkJCQlGaWxlcy5jb3B5KGYudG9QYXRoKCksIHRhcmdldC50b1BhdGgoKSk7Ci0JCQkJCWFwcGx5KHRhcmdldCwgZmgpOworCQkJCQlhcHBseShyZXBvc2l0b3J5LCBmaC5nZXRPbGRQYXRoKCksIGNhY2hlLCB0YXJnZXQsIGZoKTsKIAkJCQl9CiAJCQkJci5hZGRVcGRhdGVkRmlsZShmKTsKIAkJCX0KQEAgLTEzMywxNCArMTc2LDEzIEBACiAJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkucGF0Y2hBcHBseUV4Y2VwdGlvbiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKIAkJfQotCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAJCXJldHVybiByOwogCX0KIAogCXByaXZhdGUgRmlsZSBnZXRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIGNyZWF0ZSkKIAkJCXRocm93cyBQYXRjaEFwcGx5RXhjZXB0aW9uIHsKIAkJRmlsZSBmID0gbmV3IEZpbGUoZ2V0UmVwb3NpdG9yeSgpLmdldFdvcmtUcmVlKCksIHBhdGgpOwotCQlpZiAoY3JlYXRlKQorCQlpZiAoY3JlYXRlKSB7CiAJCQl0cnkgewogCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7CiAJCQkJRmlsZVV0aWxzLm1rZGlycyhwYXJlbnQsIHRydWUpOwpAQCAtMTQ5LDIyICsxOTEsMzY2IEBACiAJCQkJdGhyb3cgbmV3IFBhdGNoQXBwbHlFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5jcmVhdGVOZXdGaWxlRmFpbGVkLCBmKSwgZSk7CiAJCQl9CisJCX0KIAkJcmV0dXJuIGY7CiAJfQogCisJcHJpdmF0ZSB2b2lkIGFwcGx5KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHBhdGgsIERpckNhY2hlIGNhY2hlLAorCQkJRmlsZSBmLCBGaWxlSGVhZGVyIGZoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhdGNoQXBwbHlFeGNlcHRpb24geworCQlpZiAoUGF0Y2hUeXBlLkJJTkFSWS5lcXVhbHMoZmguZ2V0UGF0Y2hUeXBlKCkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJYm9vbGVhbiBjb252ZXJ0Q3JMZiA9IG5lZWRzQ3JMZkNvbnZlcnNpb24oZiwgZmgpOworCQkvLyBVc2UgYSBUcmVlV2FsayB3aXRoIGEgRGlyQ2FjaGVJdGVyYXRvciB0byBwaWNrIHVwIHRoZSBjb3JyZWN0CisJCS8vIGNsZWFuL3NtdWRnZSBmaWx0ZXJzLiBDUi1MRiBoYW5kbGluZyBpcyBjb21wbGV0ZWx5IGRldGVybWluZWQgYnkKKwkJLy8gd2hldGhlciB0aGUgZmlsZSBvciB0aGUgcGF0Y2ggaGF2ZSBDUi1MRiBsaW5lIGVuZGluZ3MuCisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhyZXBvc2l0b3J5KSkgeworCQkJd2Fsay5zZXRPcGVyYXRpb25UeXBlKE9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCk7CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGZpbGVzID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IocmVwb3NpdG9yeSk7CisJCQlpbnQgZmlsZUlkeCA9IHdhbGsuYWRkVHJlZShmaWxlcyk7CisJCQlpbnQgY2FjaGVJZHggPSB3YWxrLmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoY2FjaGUpKTsKKwkJCWZpbGVzLnNldERpckNhY2hlSXRlcmF0b3Iod2FsaywgY2FjaGVJZHgpOworCQkJd2Fsay5zZXRGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoCisJCQkJCVBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhwYXRoKSwKKwkJCQkJbmV3IE5vdElnbm9yZWRGaWx0ZXIoZmlsZUlkeCkpKTsKKwkJCXdhbGsuc2V0UmVjdXJzaXZlKHRydWUpOworCQkJaWYgKHdhbGsubmV4dCgpKSB7CisJCQkJLy8gSWYgdGhlIGZpbGUgb24gZGlzayBoYXMgbm8gbmV3bGluZSBjaGFyYWN0ZXJzLCBjb252ZXJ0Q3JMZgorCQkJCS8vIHdpbGwgYmUgZmFsc2UuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIGhvbm9yIHRoZSBub3JtYWwgZ2l0CisJCQkJLy8gc2V0dGluZ3MuCisJCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlID0gY29udmVydENyTGYgPyBFb2xTdHJlYW1UeXBlLlRFWFRfQ1JMRgorCQkJCQkJOiB3YWxrLmdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUCk7CisJCQkJU3RyaW5nIGNvbW1hbmQgPSB3YWxrLmdldEZpbHRlckNvbW1hbmQoCisJCQkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpOworCQkJCUNoZWNrb3V0TWV0YWRhdGEgY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShzdHJlYW1UeXBlLCBjb21tYW5kKTsKKwkJCQlGaWxlVHJlZUl0ZXJhdG9yIGZpbGUgPSB3YWxrLmdldFRyZWUoZmlsZUlkeCwKKwkJCQkJCUZpbGVUcmVlSXRlcmF0b3IuY2xhc3MpOworCQkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQkJaWYgKFBhdGNoVHlwZS5HSVRfQklOQVJZLmVxdWFscyhmaC5nZXRQYXRjaFR5cGUoKSkpIHsKKwkJCQkJCWFwcGx5QmluYXJ5KHJlcG9zaXRvcnksIHBhdGgsIGYsIGZoLAorCQkJCQkJCQlmaWxlOjpvcGVuRW50cnlTdHJlYW0sIGZpbGUuZ2V0RW50cnlPYmplY3RJZCgpLAorCQkJCQkJCQljaGVja091dCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb21tYW5kID0gd2Fsay5nZXRGaWx0ZXJDb21tYW5kKAorCQkJCQkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9DTEVBTik7CisJCQkJCQlSYXdUZXh0IHJhdzsKKwkJCQkJCS8vIENhbid0IHVzZSBmaWxlLm9wZW5FbnRyeVN0cmVhbSgpIGFzIGl0IHdvdWxkIGRvIENSLUxGCisJCQkJCQkvLyBjb252ZXJzaW9uIGFzIHVzdWFsLCBub3QgYXMgd2FudGVkIGJ5IHVzLgorCQkJCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IGZpbHRlckNsZWFuKHJlcG9zaXRvcnksIHBhdGgsCisJCQkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZiksIGNvbnZlcnRDckxmLCBjb21tYW5kKSkgeworCQkJCQkJCXJhdyA9IG5ldyBSYXdUZXh0KAorCQkJCQkJCQkJSU8ucmVhZFdob2xlU3RyZWFtKGlucHV0LCAwKS5hcnJheSgpKTsKKwkJCQkJCX0KKwkJCQkJCWFwcGx5VGV4dChyZXBvc2l0b3J5LCBwYXRoLCByYXcsIGYsIGZoLCBjaGVja091dCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBGaWxlIGlnbm9yZWQ/CisJCVJhd1RleHQgcmF3OworCQlDaGVja291dE1ldGFkYXRhIGNoZWNrT3V0OworCQlpZiAoUGF0Y2hUeXBlLkdJVF9CSU5BUlkuZXF1YWxzKGZoLmdldFBhdGNoVHlwZSgpKSkgeworCQkJY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShFb2xTdHJlYW1UeXBlLkRJUkVDVCwgbnVsbCk7CisJCQlhcHBseUJpbmFyeShyZXBvc2l0b3J5LCBwYXRoLCBmLCBmaCwgKCkgLT4gbmV3IEZpbGVJbnB1dFN0cmVhbShmKSwKKwkJCQkJbnVsbCwgY2hlY2tPdXQpOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnZlcnRDckxmKSB7CisJCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IEVvbFN0cmVhbVR5cGVVdGlsLndyYXBJbnB1dFN0cmVhbSgKKwkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZiksIEVvbFN0cmVhbVR5cGUuVEVYVF9MRikpIHsKKwkJCQkJcmF3ID0gbmV3IFJhd1RleHQoSU8ucmVhZFdob2xlU3RyZWFtKGlucHV0LCAwKS5hcnJheSgpKTsKKwkJCQl9CisJCQkJY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShFb2xTdHJlYW1UeXBlLlRFWFRfQ1JMRiwgbnVsbCk7CisJCQl9IGVsc2UgeworCQkJCXJhdyA9IG5ldyBSYXdUZXh0KGYpOworCQkJCWNoZWNrT3V0ID0gbmV3IENoZWNrb3V0TWV0YWRhdGEoRW9sU3RyZWFtVHlwZS5ESVJFQ1QsIG51bGwpOworCQkJfQorCQkJYXBwbHlUZXh0KHJlcG9zaXRvcnksIHBhdGgsIHJhdywgZiwgZmgsIGNoZWNrT3V0KTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBuZWVkc0NyTGZDb252ZXJzaW9uKEZpbGUgZiwgRmlsZUhlYWRlciBmaWxlSGVhZGVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKFBhdGNoVHlwZS5HSVRfQklOQVJZLmVxdWFscyhmaWxlSGVhZGVyLmdldFBhdGNoVHlwZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghaGFzQ3JMZihmaWxlSGVhZGVyKSkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpIHsKKwkJCQlyZXR1cm4gUmF3VGV4dC5pc0NyTGZUZXh0KGlucHV0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDckxmKEZpbGVIZWFkZXIgZmlsZUhlYWRlcikgeworCQlpZiAoUGF0Y2hUeXBlLkdJVF9CSU5BUlkuZXF1YWxzKGZpbGVIZWFkZXIuZ2V0UGF0Y2hUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChIdW5rSGVhZGVyIGhlYWRlciA6IGZpbGVIZWFkZXIuZ2V0SHVua3MoKSkgeworCQkJYnl0ZVtdIGJ1ZiA9IGhlYWRlci5nZXRCdWZmZXIoKTsKKwkJCWludCBodW5rRW5kID0gaGVhZGVyLmdldEVuZE9mZnNldCgpOworCQkJaW50IGxpbmVTdGFydCA9IGhlYWRlci5nZXRTdGFydE9mZnNldCgpOworCQkJd2hpbGUgKGxpbmVTdGFydCA8IGh1bmtFbmQpIHsKKwkJCQlpbnQgbmV4dExpbmVTdGFydCA9IFJhd1BhcnNlVXRpbHMubmV4dExGKGJ1ZiwgbGluZVN0YXJ0KTsKKwkJCQlpZiAobmV4dExpbmVTdGFydCA+IGh1bmtFbmQpIHsKKwkJCQkJbmV4dExpbmVTdGFydCA9IGh1bmtFbmQ7CisJCQkJfQorCQkJCWlmIChuZXh0TGluZVN0YXJ0IDw9IGxpbmVTdGFydCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG5leHRMaW5lU3RhcnQgLSBsaW5lU3RhcnQgPiAxKSB7CisJCQkJCWNoYXIgZmlyc3QgPSAoY2hhcikgKGJ1ZltsaW5lU3RhcnRdICYgMHhGRik7CisJCQkJCWlmIChmaXJzdCA9PSAnICcgfHwgZmlyc3QgPT0gJy0nKSB7CisJCQkJCQkvLyBJdCdzIGFuIG9sZCBsaW5lLiBEb2VzIGl0IGVuZCBpbiBDUi1MRj8KKwkJCQkJCWlmIChidWZbbmV4dExpbmVTdGFydCAtIDJdID09ICdccicpIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlsaW5lU3RhcnQgPSBuZXh0TGluZVN0YXJ0OworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHBhdGgsCisJCQlJbnB1dFN0cmVhbSBmcm9tRmlsZSwgYm9vbGVhbiBjb252ZXJ0Q3JMZiwgU3RyaW5nIGZpbHRlckNvbW1hbmQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGZyb21GaWxlOworCQlpZiAoY29udmVydENyTGYpIHsKKwkJCWlucHV0ID0gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKGlucHV0LAorCQkJCQlFb2xTdHJlYW1UeXBlLlRFWFRfTEYpOworCQl9CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGZpbHRlckNvbW1hbmQpKSB7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKwkJaWYgKEZpbHRlckNvbW1hbmRSZWdpc3RyeS5pc1JlZ2lzdGVyZWQoZmlsdGVyQ29tbWFuZCkpIHsKKwkJCUxvY2FsRmlsZSBidWZmZXIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKKwkJCUZpbHRlckNvbW1hbmQgY29tbWFuZCA9IEZpbHRlckNvbW1hbmRSZWdpc3RyeS5jcmVhdGVGaWx0ZXJDb21tYW5kKAorCQkJCQlmaWx0ZXJDb21tYW5kLCByZXBvc2l0b3J5LCBpbnB1dCwgYnVmZmVyKTsKKwkJCXdoaWxlIChjb21tYW5kLnJ1bigpICE9IC0xKSB7CisJCQkJLy8gbG9vcCBhcyBsb25nIGFzIGNvbW1hbmQucnVuKCkgdGVsbHMgdGhlcmUgaXMgd29yayB0byBkbworCQkJfQorCQkJcmV0dXJuIGJ1ZmZlci5vcGVuSW5wdXRTdHJlYW1XaXRoQXV0b0Rlc3Ryb3koKTsKKwkJfQorCQlGUyBmcyA9IHJlcG9zaXRvcnkuZ2V0RlMoKTsKKwkJUHJvY2Vzc0J1aWxkZXIgZmlsdGVyUHJvY2Vzc0J1aWxkZXIgPSBmcy5ydW5JblNoZWxsKGZpbHRlckNvbW1hbmQsCisJCQkJbmV3IFN0cmluZ1swXSk7CisJCWZpbHRlclByb2Nlc3NCdWlsZGVyLmRpcmVjdG9yeShyZXBvc2l0b3J5LmdldFdvcmtUcmVlKCkpOworCQlmaWx0ZXJQcm9jZXNzQnVpbGRlci5lbnZpcm9ubWVudCgpLnB1dChDb25zdGFudHMuR0lUX0RJUl9LRVksCisJCQkJcmVwb3NpdG9yeS5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCUV4ZWN1dGlvblJlc3VsdCByZXN1bHQ7CisJCXRyeSB7CisJCQlyZXN1bHQgPSBmcy5leGVjdXRlKGZpbHRlclByb2Nlc3NCdWlsZGVyLCBpbik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCQluZXcgRmlsdGVyRmFpbGVkRXhjZXB0aW9uKGUsIGZpbHRlckNvbW1hbmQsIHBhdGgpKTsKKwkJfQorCQlpbnQgcmMgPSByZXN1bHQuZ2V0UmMoKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihuZXcgRmlsdGVyRmFpbGVkRXhjZXB0aW9uKHJjLCBmaWx0ZXJDb21tYW5kLAorCQkJCQlwYXRoLCByZXN1bHQuZ2V0U3Rkb3V0KCkudG9CeXRlQXJyYXkoNDA5NiksIFJhd1BhcnNlVXRpbHMKKwkJCQkJCQkuZGVjb2RlKHJlc3VsdC5nZXRTdGRlcnIoKS50b0J5dGVBcnJheSg0MDk2KSkpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LmdldFN0ZG91dCgpLm9wZW5JbnB1dFN0cmVhbVdpdGhBdXRvRGVzdHJveSgpOworCX0KKwogCS8qKgotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGZoCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUGF0Y2hBcHBseUV4Y2VwdGlvbgorCSAqIFNvbWV0aGluZyB0aGF0IGNhbiBzdXBwbHkgYW4ge0BsaW5rIElucHV0U3RyZWFtfS4KIAkgKi8KLQlwcml2YXRlIHZvaWQgYXBwbHkoRmlsZSBmLCBGaWxlSGVhZGVyIGZoKQorCXByaXZhdGUgaW50ZXJmYWNlIFN0cmVhbVN1cHBsaWVyIHsKKwkJSW5wdXRTdHJlYW0gbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBXZSB3cml0ZSB0aGUgcGF0Y2ggcmVzdWx0IHRvIGEge0BsaW5rIFRlbXBvcmFyeUJ1ZmZlcn0gYW5kIHRoZW4gdXNlCisJICoge0BsaW5rIERpckNhY2hlQ2hlY2tvdXR9LmdldENvbnRlbnQoKSB0byBydW4gdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBDUi1MRgorCSAqIGFuZCBzbXVkZ2UgZmlsdGVycy4gRGlyQ2FjaGVDaGVja291dCBuZWVkcyBhbiBPYmplY3RMb2FkZXIsIG5vdCBhCisJICogVGVtcG9yYXJ5QnVmZmVyLCBzbyB0aGlzIGNsYXNzIGJyaWRnZXMgYmV0d2VlbiB0aGUgdHdvLCBtYWtpbmcgYW55IFN0cmVhbQorCSAqIHByb3ZpZGVkIGJ5IGEge0BsaW5rIFN0cmVhbVN1cHBsaWVyfSBsb29rIGxpa2UgYW4gb3JkaW5hcnkgZ2l0IGJsb2IgdG8KKwkgKiBEaXJDYWNoZUNoZWNrb3V0LgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbUxvYWRlciBleHRlbmRzIE9iamVjdExvYWRlciB7CisKKwkJcHJpdmF0ZSBTdHJlYW1TdXBwbGllciBkYXRhOworCisJCXByaXZhdGUgbG9uZyBzaXplOworCisJCVN0cmVhbUxvYWRlcihTdHJlYW1TdXBwbGllciBkYXRhLCBsb25nIGxlbmd0aCkgeworCQkJdGhpcy5kYXRhID0gZGF0YTsKKwkJCXRoaXMuc2l6ZSA9IGxlbmd0aDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCQlyZXR1cm4gQ29uc3RhbnRzLk9CSl9CTE9COworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBsb25nIGdldFNpemUoKSB7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0xhcmdlKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJ5dGVbXSBnZXRDYWNoZWRCeXRlcygpIHRocm93cyBMYXJnZU9iamVjdEV4Y2VwdGlvbiB7CisJCQl0aHJvdyBuZXcgTGFyZ2VPYmplY3RFeGNlcHRpb24oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKQorCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCQlyZXR1cm4gbmV3IE9iamVjdFN0cmVhbS5GaWx0ZXIoZ2V0VHlwZSgpLCBnZXRTaXplKCksCisJCQkJCW5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGRhdGEubG9hZCgpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEhhc2goU0hBMSBoYXNoLCBsb25nIHNpemUpIHsKKwkJaGFzaC51cGRhdGUoQ29uc3RhbnRzLmVuY29kZWRUeXBlU3RyaW5nKENvbnN0YW50cy5PQkpfQkxPQikpOworCQloYXNoLnVwZGF0ZSgoYnl0ZSkgJyAnKTsKKwkJaGFzaC51cGRhdGUoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHNpemUpKTsKKwkJaGFzaC51cGRhdGUoKGJ5dGUpIDApOworCX0KKworCXByaXZhdGUgT2JqZWN0SWQgaGFzaChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVNIQTEgaGFzaCA9IFNIQTEubmV3SW5zdGFuY2UoKTsKKwkJaW5pdEhhc2goaGFzaCwgZi5sZW5ndGgoKSk7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSB7CisJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07CisJCQlpbnQgbjsKKwkJCXdoaWxlICgobiA9IGlucHV0LnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCWhhc2gudXBkYXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGhhc2gudG9PYmplY3RJZCgpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja09pZChPYmplY3RJZCBiYXNlSWQsIE9iamVjdElkIGlkLCBDaGFuZ2VUeXBlIHR5cGUsIEZpbGUgZiwKKwkJCVN0cmluZyBwYXRoKQorCQkJdGhyb3dzIFBhdGNoQXBwbHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiBoYXNoT2sgPSBmYWxzZTsKKwkJaWYgKGlkICE9IG51bGwpIHsKKwkJCWhhc2hPayA9IGJhc2VJZC5lcXVhbHMoaWQpOworCQkJaWYgKCFoYXNoT2sgJiYgQ2hhbmdlVHlwZS5BREQuZXF1YWxzKHR5cGUpCisJCQkJCSYmIE9iamVjdElkLnplcm9JZCgpLmVxdWFscyhiYXNlSWQpKSB7CisJCQkJLy8gV2UgY3JlYXRlIHRoZSBmaWxlIGZpcnN0LiBUaGUgT0lEIG9mIGFuIGVtcHR5IGZpbGUgaXMgbm90IHRoZQorCQkJCS8vIHplcm8gaWQhCisJCQkJaGFzaE9rID0gQ29uc3RhbnRzLkVNUFRZX0JMT0JfSUQuZXF1YWxzKGlkKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChPYmplY3RJZC56ZXJvSWQoKS5lcXVhbHMoYmFzZUlkKSkgeworCQkJCS8vIEZpbGUgZW1wdHkgaXMgT0suCisJCQkJaGFzaE9rID0gIWYuZXhpc3RzKCkgfHwgZi5sZW5ndGgoKSA9PSAwOworCQkJfSBlbHNlIHsKKwkJCQloYXNoT2sgPSBiYXNlSWQuZXF1YWxzKGhhc2goZikpOworCQkJfQorCQl9CisJCWlmICghaGFzaE9rKSB7CisJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlCYXNlT2lkV3JvbmcsIHBhdGgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhcHBseUJpbmFyeShSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBwYXRoLCBGaWxlIGYsCisJCQlGaWxlSGVhZGVyIGZoLCBTdHJlYW1TdXBwbGllciBsb2FkZXIsIE9iamVjdElkIGlkLAorCQkJQ2hlY2tvdXRNZXRhZGF0YSBjaGVja091dCkKKwkJCXRocm93cyBQYXRjaEFwcGx5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWlmICghZmguZ2V0T2xkSWQoKS5pc0NvbXBsZXRlKCkgfHwgIWZoLmdldE5ld0lkKCkuaXNDb21wbGV0ZSgpKSB7CisJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlPaWRUb29TaG9ydCwgcGF0aCkpOworCQl9CisJCUJpbmFyeUh1bmsgaHVuayA9IGZoLmdldEZvcndhcmRCaW5hcnlIdW5rKCk7CisJCS8vIEEgQmluYXJ5SHVuayBoYXMgdGhlIHN0YXJ0IGF0IHRoZSAibGl0ZXJhbCIgb3IgImRlbHRhIiB0b2tlbi4gRGF0YQorCQkvLyBzdGFydHMgb24gdGhlIG5leHQgbGluZS4KKwkJaW50IHN0YXJ0ID0gUmF3UGFyc2VVdGlscy5uZXh0TEYoaHVuay5nZXRCdWZmZXIoKSwKKwkJCQlodW5rLmdldFN0YXJ0T2Zmc2V0KCkpOworCQlpbnQgbGVuZ3RoID0gaHVuay5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OworCQlTSEExIGhhc2ggPSBTSEExLm5ld0luc3RhbmNlKCk7CisJCS8vIFdyaXRlIHRvIGEgYnVmZmVyIGFuZCBjb3B5IHRvIHRoZSBmaWxlIG9ubHkgaWYgZXZlcnl0aGluZyB3YXMgZmluZQorCQlUZW1wb3JhcnlCdWZmZXIgYnVmZmVyID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CisJCXRyeSB7CisJCQlzd2l0Y2ggKGh1bmsuZ2V0VHlwZSgpKSB7CisJCQljYXNlIExJVEVSQUxfREVGTEFURUQ6CisJCQkJLy8gVGhpcyBqdXN0IG92ZXJ3cml0ZXMgdGhlIGZpbGUuIFdlIG5lZWQgdG8gY2hlY2sgdGhlIGhhc2ggb2YKKwkJCQkvLyB0aGUgYmFzZS4KKwkJCQljaGVja09pZChmaC5nZXRPbGRJZCgpLnRvT2JqZWN0SWQoKSwgaWQsIGZoLmdldENoYW5nZVR5cGUoKSwgZiwKKwkJCQkJCXBhdGgpOworCQkJCWluaXRIYXNoKGhhc2gsIGh1bmsuZ2V0U2l6ZSgpKTsKKwkJCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBidWZmZXI7CisJCQkJCQlJbnB1dFN0cmVhbSBpbmZsYXRlZCA9IG5ldyBTSEExSW5wdXRTdHJlYW0oaGFzaCwKKwkJCQkJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oCisJCQkJCQkJCQkJbmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCQkJCQkJaHVuay5nZXRCdWZmZXIoKSwgc3RhcnQsCisJCQkJCQkJCQkJCQkJCWxlbmd0aCkpKSkpIHsKKwkJCQkJRGlyQ2FjaGVDaGVja291dC5nZXRDb250ZW50KHJlcG9zaXRvcnksIHBhdGgsIGNoZWNrT3V0LAorCQkJCQkJCW5ldyBTdHJlYW1Mb2FkZXIoKCkgLT4gaW5mbGF0ZWQsIGh1bmsuZ2V0U2l6ZSgpKSwKKwkJCQkJCQludWxsLCBvdXQpOworCQkJCQlpZiAoIWZoLmdldE5ld0lkKCkudG9PYmplY3RJZCgpLmVxdWFscyhoYXNoLnRvT2JqZWN0SWQoKSkpIHsKKwkJCQkJCXRocm93IG5ldyBQYXRjaEFwcGx5RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5hcHBseUJpbmFyeVJlc3VsdE9pZFdyb25nLAorCQkJCQkJCQlwYXRoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJdHJ5IChJbnB1dFN0cmVhbSBidWZJbiA9IGJ1ZmZlci5vcGVuSW5wdXRTdHJlYW0oKSkgeworCQkJCQlGaWxlcy5jb3B5KGJ1ZkluLCBmLnRvUGF0aCgpLAorCQkJCQkJCVN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFTFRBX0RFRkxBVEVEOgorCQkJCS8vIFVuZm9ydHVuYXRlbHkgZGVsdGEgYXBwbGljYXRpb24gbmVlZHMgcmFuZG9tIGFjY2VzcyB0byB0aGUKKwkJCQkvLyBiYXNlIHRvIGNvbnN0cnVjdCB0aGUgcmVzdWx0LgorCQkJCWJ5dGVbXSBiYXNlOworCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXQgPSBsb2FkZXIubG9hZCgpKSB7CisJCQkJCWJhc2UgPSBJTy5yZWFkV2hvbGVTdHJlYW0oaW5wdXQsIDApLmFycmF5KCk7CisJCQkJfQorCQkJCS8vIEF0IGxlYXN0IHN0cmVhbSB0aGUgcmVzdWx0IQorCQkJCXRyeSAoQmluYXJ5RGVsdGFJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCaW5hcnlEZWx0YUlucHV0U3RyZWFtKAorCQkJCQkJYmFzZSwKKwkJCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShodW5rLmdldEJ1ZmZlcigpLAorCQkJCQkJCQkJCXN0YXJ0LCBsZW5ndGgpKSkpKSB7CisJCQkJCWxvbmcgZmluYWxTaXplID0gaW5wdXQuZ2V0RXhwZWN0ZWRSZXN1bHRTaXplKCk7CisJCQkJCWluaXRIYXNoKGhhc2gsIGZpbmFsU2l6ZSk7CisJCQkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGJ1ZmZlcjsKKwkJCQkJCQlTSEExSW5wdXRTdHJlYW0gaGFzaGVkID0gbmV3IFNIQTFJbnB1dFN0cmVhbShoYXNoLAorCQkJCQkJCQkJaW5wdXQpKSB7CisJCQkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQocmVwb3NpdG9yeSwgcGF0aCwgY2hlY2tPdXQsCisJCQkJCQkJCW5ldyBTdHJlYW1Mb2FkZXIoKCkgLT4gaGFzaGVkLCBmaW5hbFNpemUpLCBudWxsLAorCQkJCQkJCQlvdXQpOworCQkJCQkJaWYgKCFmaC5nZXROZXdJZCgpLnRvT2JqZWN0SWQoKQorCQkJCQkJCQkuZXF1YWxzKGhhc2gudG9PYmplY3RJZCgpKSkgeworCQkJCQkJCXRocm93IG5ldyBQYXRjaEFwcGx5RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlSZXN1bHRPaWRXcm9uZywKKwkJCQkJCQkJCXBhdGgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl0cnkgKElucHV0U3RyZWFtIGJ1ZkluID0gYnVmZmVyLm9wZW5JbnB1dFN0cmVhbSgpKSB7CisJCQkJCUZpbGVzLmNvcHkoYnVmSW4sIGYudG9QYXRoKCksCisJCQkJCQkJU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlidWZmZXIuZGVzdHJveSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGx5VGV4dChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBwYXRoLCBSYXdUZXh0IHJ0LAorCQkJRmlsZSBmLCBGaWxlSGVhZGVyIGZoLCBDaGVja291dE1ldGFkYXRhIGNoZWNrT3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXRjaEFwcGx5RXhjZXB0aW9uIHsKLQkJUmF3VGV4dCBydCA9IG5ldyBSYXdUZXh0KGYpOwotCQlMaXN0PFN0cmluZz4gb2xkTGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ocnQuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydC5zaXplKCk7IGkrKykKLQkJCW9sZExpbmVzLmFkZChydC5nZXRTdHJpbmcoaSkpOwotCQlMaXN0PFN0cmluZz4gbmV3TGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ob2xkTGluZXMpOworCQlMaXN0PEJ5dGVCdWZmZXI+IG9sZExpbmVzID0gbmV3IEFycmF5TGlzdDw+KHJ0LnNpemUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcnQuc2l6ZSgpOyBpKyspIHsKKwkJCW9sZExpbmVzLmFkZChydC5nZXRSYXdTdHJpbmcoaSkpOworCQl9CisJCUxpc3Q8Qnl0ZUJ1ZmZlcj4gbmV3TGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ob2xkTGluZXMpOwogCQlpbnQgYWZ0ZXJMYXN0SHVuayA9IDA7CiAJCWludCBsaW5lTnVtYmVyU2hpZnQgPSAwOwogCQlpbnQgbGFzdEh1bmtOZXdMaW5lID0gLTE7CkBAIC0xODIsOSArNTY4LDkgQEAKIAkJCQkJYi5sZW5ndGgpOwogCQkJUmF3VGV4dCBocnQgPSBuZXcgUmF3VGV4dChiKTsKIAotCQkJTGlzdDxTdHJpbmc+IGh1bmtMaW5lcyA9IG5ldyBBcnJheUxpc3Q8PihocnQuc2l6ZSgpKTsKKwkJCUxpc3Q8Qnl0ZUJ1ZmZlcj4gaHVua0xpbmVzID0gbmV3IEFycmF5TGlzdDw+KGhydC5zaXplKCkpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBocnQuc2l6ZSgpOyBpKyspIHsKLQkJCQlodW5rTGluZXMuYWRkKGhydC5nZXRTdHJpbmcoaSkpOworCQkJCWh1bmtMaW5lcy5hZGQoaHJ0LmdldFJhd1N0cmluZyhpKSk7CiAJCQl9CiAKIAkJCWlmIChoaC5nZXROZXdTdGFydExpbmUoKSA9PSAwKSB7CkBAIC0yNTMsOCArNjM5LDEzIEBACiAJCQlsaW5lTnVtYmVyU2hpZnQgPSBhcHBseUF0IC0gaGguZ2V0TmV3U3RhcnRMaW5lKCkgKyAxOwogCQkJaW50IHN6ID0gaHVua0xpbmVzLnNpemUoKTsKIAkJCWZvciAoaW50IGogPSAxOyBqIDwgc3o7IGorKykgewotCQkJCVN0cmluZyBodW5rTGluZSA9IGh1bmtMaW5lcy5nZXQoaik7Ci0JCQkJc3dpdGNoIChodW5rTGluZS5jaGFyQXQoMCkpIHsKKwkJCQlCeXRlQnVmZmVyIGh1bmtMaW5lID0gaHVua0xpbmVzLmdldChqKTsKKwkJCQlpZiAoIWh1bmtMaW5lLmhhc1JlbWFpbmluZygpKSB7CisJCQkJCS8vIENvbXBsZXRlbHkgZW1wdHkgbGluZTsgYWNjZXB0IGFzIGVtcHR5IGNvbnRleHQgbGluZQorCQkJCQlhcHBseUF0Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzd2l0Y2ggKGh1bmtMaW5lLmFycmF5KClbaHVua0xpbmUucG9zaXRpb24oKV0pIHsKIAkJCQljYXNlICcgJzoKIAkJCQkJYXBwbHlBdCsrOwogCQkJCQlicmVhazsKQEAgLTI2Miw3ICs2NTMsNyBAQAogCQkJCQluZXdMaW5lcy5yZW1vdmUoYXBwbHlBdCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgJysnOgotCQkJCQluZXdMaW5lcy5hZGQoYXBwbHlBdCsrLCBodW5rTGluZS5zdWJzdHJpbmcoMSkpOworCQkJCQluZXdMaW5lcy5hZGQoYXBwbHlBdCsrLCBzbGljZShodW5rTGluZSwgMSkpOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlicmVhazsKQEAgLTI3MSwzOSArNjYyLDY0IEBACiAJCQlhZnRlckxhc3RIdW5rID0gYXBwbHlBdDsKIAkJfQogCQlpZiAoIWlzTm9OZXdsaW5lQXRFbmRPZkZpbGUoZmgpKSB7Ci0JCQluZXdMaW5lcy5hZGQoIiIpOyAvLyROT04tTkxTLTEkCisJCQluZXdMaW5lcy5hZGQobnVsbCk7CiAJCX0KIAkJaWYgKCFydC5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKSkgewotCQkJb2xkTGluZXMuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJb2xkTGluZXMuYWRkKG51bGwpOwogCQl9Ci0JCWlmICghaXNDaGFuZ2VkKG9sZExpbmVzLCBuZXdMaW5lcykpIHsKLQkJCXJldHVybjsgLy8gRG9uJ3QgdG91Y2ggdGhlIGZpbGUKKwkJaWYgKG9sZExpbmVzLmVxdWFscyhuZXdMaW5lcykpIHsKKwkJCXJldHVybjsgLy8gVW5jaGFuZ2VkOyBkb24ndCB0b3VjaCB0aGUgZmlsZQogCQl9Ci0JCXRyeSAoV3JpdGVyIGZ3ID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIoZi50b1BhdGgoKSkpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBsID0gbmV3TGluZXMuaXRlcmF0b3IoKTsgbC5oYXNOZXh0KCk7KSB7Ci0JCQkJZncud3JpdGUobC5uZXh0KCkpOwotCQkJCWlmIChsLmhhc05leHQoKSkgewotCQkJCQkvLyBEb24ndCBib3RoZXIgaGFuZGxpbmcgbGluZSBlbmRpbmdzIC0gaWYgaXQgd2FzIFdpbmRvd3MsCi0JCQkJCS8vIHRoZSBcciBpcyBzdGlsbCB0aGVyZSEKLQkJCQkJZncud3JpdGUoJ1xuJyk7CisKKwkJVGVtcG9yYXJ5QnVmZmVyIGJ1ZmZlciA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOworCQl0cnkgeworCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0ID0gYnVmZmVyKSB7CisJCQkJZm9yIChJdGVyYXRvcjxCeXRlQnVmZmVyPiBsID0gbmV3TGluZXMuaXRlcmF0b3IoKTsgbAorCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJQnl0ZUJ1ZmZlciBsaW5lID0gbC5uZXh0KCk7CisJCQkJCWlmIChsaW5lID09IG51bGwpIHsKKwkJCQkJCS8vIE11c3QgYmUgdGhlIG1hcmtlciBmb3IgdGhlIGZpbmFsIG5ld2xpbmUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW91dC53cml0ZShsaW5lLmFycmF5KCksIGxpbmUucG9zaXRpb24oKSwgbGluZS5yZW1haW5pbmcoKSk7CisJCQkJCWlmIChsLmhhc05leHQoKSkgeworCQkJCQkJb3V0LndyaXRlKCdcbicpOworCQkJCQl9CiAJCQkJfQogCQkJfQorCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKKwkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQocmVwb3NpdG9yeSwgcGF0aCwgY2hlY2tPdXQsCisJCQkJCQluZXcgU3RyZWFtTG9hZGVyKGJ1ZmZlcjo6b3BlbklucHV0U3RyZWFtLAorCQkJCQkJCQlidWZmZXIubGVuZ3RoKCkpLAorCQkJCQkJbnVsbCwgb3V0cHV0KTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWJ1ZmZlci5kZXN0cm95KCk7CiAJCX0KLQkJZ2V0UmVwb3NpdG9yeSgpLmdldEZTKCkuc2V0RXhlY3V0ZShmLCBmaC5nZXROZXdNb2RlKCkgPT0gRmlsZU1vZGUuRVhFQ1VUQUJMRV9GSUxFKTsKKwkJcmVwb3NpdG9yeS5nZXRGUygpLnNldEV4ZWN1dGUoZiwKKwkJCQlmaC5nZXROZXdNb2RlKCkgPT0gRmlsZU1vZGUuRVhFQ1VUQUJMRV9GSUxFKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gY2FuQXBwbHlBdChMaXN0PFN0cmluZz4gaHVua0xpbmVzLCBMaXN0PFN0cmluZz4gbmV3TGluZXMsCi0JCQlpbnQgbGluZSkgeworCXByaXZhdGUgYm9vbGVhbiBjYW5BcHBseUF0KExpc3Q8Qnl0ZUJ1ZmZlcj4gaHVua0xpbmVzLAorCQkJTGlzdDxCeXRlQnVmZmVyPiBuZXdMaW5lcywgaW50IGxpbmUpIHsKIAkJaW50IHN6ID0gaHVua0xpbmVzLnNpemUoKTsKIAkJaW50IGxpbWl0ID0gbmV3TGluZXMuc2l6ZSgpOwogCQlpbnQgcG9zID0gbGluZTsKIAkJZm9yIChpbnQgaiA9IDE7IGogPCBzejsgaisrKSB7Ci0JCQlTdHJpbmcgaHVua0xpbmUgPSBodW5rTGluZXMuZ2V0KGopOwotCQkJc3dpdGNoIChodW5rTGluZS5jaGFyQXQoMCkpIHsKKwkJCUJ5dGVCdWZmZXIgaHVua0xpbmUgPSBodW5rTGluZXMuZ2V0KGopOworCQkJaWYgKCFodW5rTGluZS5oYXNSZW1haW5pbmcoKSkgeworCQkJCS8vIEVtcHR5IGxpbmUuIEFjY2VwdCBhcyBlbXB0eSBjb250ZXh0IGxpbmUuCisJCQkJaWYgKHBvcyA+PSBsaW1pdCB8fCBuZXdMaW5lcy5nZXQocG9zKS5oYXNSZW1haW5pbmcoKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXBvcysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3dpdGNoIChodW5rTGluZS5hcnJheSgpW2h1bmtMaW5lLnBvc2l0aW9uKCldKSB7CiAJCQljYXNlICcgJzoKIAkJCWNhc2UgJy0nOgogCQkJCWlmIChwb3MgPj0gbGltaXQKLQkJCQkJCXx8ICFuZXdMaW5lcy5nZXQocG9zKS5lcXVhbHMoaHVua0xpbmUuc3Vic3RyaW5nKDEpKSkgeworCQkJCQkJfHwgIW5ld0xpbmVzLmdldChwb3MpLmVxdWFscyhzbGljZShodW5rTGluZSwgMSkpKSB7CiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9CiAJCQkJcG9zKys7CkBAIC0zMTUsMTMgKzczMSw5IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGFuZ2VkKExpc3Q8U3RyaW5nPiBvbCwgTGlzdDxTdHJpbmc+IG5sKSB7Ci0JCWlmIChvbC5zaXplKCkgIT0gbmwuc2l6ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2wuc2l6ZSgpOyBpKyspCi0JCQlpZiAoIW9sLmdldChpKS5lcXVhbHMobmwuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOworCXByaXZhdGUgQnl0ZUJ1ZmZlciBzbGljZShCeXRlQnVmZmVyIGIsIGludCBvZmYpIHsKKwkJaW50IG5ld09mZnNldCA9IGIucG9zaXRpb24oKSArIG9mZjsKKwkJcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChiLmFycmF5KCksIG5ld09mZnNldCwgYi5saW1pdCgpIC0gbmV3T2Zmc2V0KTsKIAl9CiAKIAlwcml2YXRlIGJvb2xlYW4gaXNOb05ld2xpbmVBdEVuZE9mRmlsZShGaWxlSGVhZGVyIGZoKSB7CkBAIC0zMzAsOCArNzQyLDUxIEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJSHVua0hlYWRlciBsYXN0SHVuayA9IGh1bmtzLmdldChodW5rcy5zaXplKCkgLSAxKTsKLQkJUmF3VGV4dCBsaHJ0ID0gbmV3IFJhd1RleHQobGFzdEh1bmsuZ2V0QnVmZmVyKCkpOworCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbGFzdEh1bmsuZ2V0RW5kT2Zmc2V0KCkKKwkJCQktIGxhc3RIdW5rLmdldFN0YXJ0T2Zmc2V0KCldOworCQlTeXN0ZW0uYXJyYXljb3B5KGxhc3RIdW5rLmdldEJ1ZmZlcigpLCBsYXN0SHVuay5nZXRTdGFydE9mZnNldCgpLCBidWYsCisJCQkJMCwgYnVmLmxlbmd0aCk7CisJCVJhd1RleHQgbGhydCA9IG5ldyBSYXdUZXh0KGJ1Zik7CiAJCXJldHVybiBsaHJ0LmdldFN0cmluZyhsaHJ0LnNpemUoKSAtIDEpCiAJCQkJLmVxdWFscygiXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIpOyAvLyROT04tTkxTLTEkCiAJfQorCisJLyoqCisJICogQW4ge0BsaW5rIElucHV0U3RyZWFtfSB0aGF0IHVwZGF0ZXMgYSB7QGxpbmsgU0hBMX0gb24gZXZlcnkgYnl0ZSByZWFkLgorCSAqIFRoZSBoYXNoIGlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgcmVhZGluZyBzdGFydHMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU0hBMUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisJCXByaXZhdGUgZmluYWwgU0hBMSBoYXNoOworCisJCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47CisKKwkJU0hBMUlucHV0U3RyZWFtKFNIQTEgaGFzaCwgSW5wdXRTdHJlYW0gaW4pIHsKKwkJCXRoaXMuaGFzaCA9IGhhc2g7CisJCQl0aGlzLmluID0gaW47CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWludCBiID0gaW4ucmVhZCgpOworCQkJaWYgKGIgPj0gMCkgeworCQkJCWhhc2gudXBkYXRlKChieXRlKSBiKTsKKwkJCX0KKwkJCXJldHVybiBiOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWludCBuID0gaW4ucmVhZChiLCBvZmYsIGxlbik7CisJCQlpZiAobiA+IDApIHsKKwkJCQloYXNoLnVwZGF0ZShiLCBvZmYsIG4pOworCQkJfQorCQkJcmV0dXJuIG47CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJaW4uY2xvc2UoKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKaW5kZXggYzYxMWY5MS4uZWY1NmQ4MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKQEAgLTg3LDYgKzg3LDIwIEBACiAJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CiAKIAkvKioKKwkgKiBWYWx1ZXMgZm9yIHRoZSAibWVyZ2UuY29uZmxpY3RTdHlsZSIgZ2l0IGNvbmZpZy4KKwkgKgorCSAqIEBzaW5jZSA1LjEyCisJICovCisJcHVibGljIGVudW0gQ29uZmxpY3RTdHlsZSB7CisKKwkJLyoqICJtZXJnZSIgc3R5bGU6IG9ubHkgb3Vycy90aGVpcnMuIFRoaXMgaXMgdGhlIGRlZmF1bHQuICovCisJCU1FUkdFLAorCisJCS8qKiAiZGlmZjMiIHN0eWxlOiBvdXJzL2Jhc2UvdGhlaXJzLiAqLworCQlESUZGMworCX0KKworCS8qKgogCSAqIFRoZSBtb2RlcyBhdmFpbGFibGUgZm9yIGZhc3QgZm9yd2FyZCBtZXJnZXMgY29ycmVzcG9uZGluZyB0byB0aGUKIAkgKiA8Y29kZT4tLWZmPC9jb2RlPiwgPGNvZGU+LS1uby1mZjwvY29kZT4gYW5kIDxjb2RlPi0tZmYtb25seTwvY29kZT4KIAkgKiBvcHRpb25zIHVuZGVyIDxjb2RlPmJyYW5jaC4mbHQ7bmFtZSZndDsubWVyZ2VvcHRpb25zPC9jb2RlPi4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCmluZGV4IDlmNGIxZmEuLmQwOWRhMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDksIEdvb2dsZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDIxLCBKb2hhbm5lcyBFLiBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQmluYXJ5QmxvYkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKQEAgLTE2NSw2ICsxNjYsMjcgQEAKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIHJhdyB0ZXh0IGZvciBhIHNpbmdsZSBsaW5lLgorCSAqCisJICogQHBhcmFtIGkKKwkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBsaW5lIHRvIGV4dHJhY3QuIE5vdGUgdGhpcyBpcyAwLWJhc2VkLCBzbyBsaW5lCisJICogICAgICAgICAgICBudW1iZXIgMSBpcyBhY3R1YWxseSBpbmRleCAwLgorCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSBsaW5lLCB3aXRob3V0IGEgdHJhaWxpbmcgTEYsIGFzIGEKKwkgKiAgICAgICAgIHtAbGluayBCeXRlQnVmZmVyfSB0aGF0IGlzIGJhY2tlZCBieSBhIHNsaWNlIG9mIHRoZQorCSAqICAgICAgICAge0BsaW5rICNnZXRSYXdDb250ZW50KCkgcmF3IGNvbnRlbnR9LCB3aXRoIHRoZSBidWZmZXIncyBwb3NpdGlvbgorCSAqICAgICAgICAgb24gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGFuZCB0aGUgbGltaXQgYXQgdGhlIGVuZC4KKwkgKiBAc2luY2UgNS4xMgorCSAqLworCXB1YmxpYyBCeXRlQnVmZmVyIGdldFJhd1N0cmluZyhpbnQgaSkgeworCQlpbnQgcyA9IGdldFN0YXJ0KGkpOworCQlpbnQgZSA9IGdldEVuZChpKTsKKwkJaWYgKGUgPiAwICYmIGNvbnRlbnRbZSAtIDFdID09ICdcbicpIHsKKwkJCWUtLTsKKwkJfQorCQlyZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGNvbnRlbnQsIHMsIGUgLSBzKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIHRleHQgZm9yIGEgcmVnaW9uIG9mIGxpbmVzLgogCSAqCiAJICogQHBhcmFtIGJlZ2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCmluZGV4IDY3MTQ3NWUuLmM5MDRhNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCkBAIC0xNjEwLDExICsxNjEwLDkgQEAKIAkJfQogCQlpZiAocmMgIT0gMCkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG5ldyBGaWx0ZXJGYWlsZWRFeGNlcHRpb24ocmMsCi0JCQkJCWNoZWNrb3V0TWV0YWRhdGEuc211ZGdlRmlsdGVyQ29tbWFuZCwKLQkJCQkJcGF0aCwKKwkJCQkJY2hlY2tvdXRNZXRhZGF0YS5zbXVkZ2VGaWx0ZXJDb21tYW5kLCBwYXRoLAogCQkJCQlyZXN1bHQuZ2V0U3Rkb3V0KCkudG9CeXRlQXJyYXkoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpLAotCQkJCQlSYXdQYXJzZVV0aWxzLmRlY29kZShyZXN1bHQuZ2V0U3RkZXJyKCkKLQkJCQkJCQkudG9CeXRlQXJyYXkoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpKSkpOworCQkJCQlyZXN1bHQuZ2V0U3RkZXJyKCkudG9TdHJpbmcoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKaW5kZXggYzAzOWFhZi4uNWJmOTVkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKQEAgLTEyLDYgKzEyLDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfUkVNT1RFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKQEAgLTU4Nyw4ICs1ODgsMTEgQEAKIAkJCQkJCQl0aHJvdyBuZXcgUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24odXJsKTsKIAkJCQkJCX0KIAkJCQkJCWlmIChyZWNvcmRSZW1vdGVCcmFuY2gpIHsKLQkJCQkJCQkvLyBjYW4gYmUgYnJhbmNoIG9yIHRhZwotCQkJCQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJicmFuY2giLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkvLyAiYnJhbmNoIiBmaWVsZCBpcyBvbmx5IGZvciBub24tdGFnIHJlZmVyZW5jZXMuCisJCQkJCQkJLy8gS2VlcCB0YWdzIGluICJyZWYiIGZpZWxkIGFzIGhpbnQgZm9yIG90aGVyIHRvb2xzLgorCQkJCQkJCVN0cmluZyBmaWVsZCA9IHByb2ouZ2V0UmV2aXNpb24oKS5zdGFydHNXaXRoKAorCQkJCQkJCQkJUl9UQUdTKSA/ICJyZWYiIDogImJyYW5jaCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsIGZpZWxkLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCkpOwogCQkJCQkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKaW5kZXggYWI5ZmM1Yy4uZmQ1NDk4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQpAQCAtNDEsNiArNDEsOSBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgYU5ld09iamVjdElkSXNSZXF1aXJlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGFuRXhjZXB0aW9uT2NjdXJyZWRXaGlsZVRyeWluZ1RvQWRkVGhlSWRPZkhFQUQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBhblNTSFNlc3Npb25IYXNCZWVuQWxyZWFkeUNyZWF0ZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBhcHBseUJpbmFyeUJhc2VPaWRXcm9uZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGFwcGx5QmluYXJ5T2lkVG9vU2hvcnQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBhcHBseUJpbmFyeVJlc3VsdE9pZFdyb25nOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYXBwbHlpbmdDb21taXQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBhcmNoaXZlRm9ybWF0QWxyZWFkeUFic2VudDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGFyY2hpdmVGb3JtYXRBbHJlYWR5UmVnaXN0ZXJlZDsKQEAgLTY1LDcgKzY4LDE5IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBiYWRTZWN0aW9uRW50cnk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBiYWRTaGFsbG93TGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGJhcmVSZXBvc2l0b3J5Tm9Xb3JrZGlyQW5kSW5kZXg7CisJLyoqKi8gcHVibGljIFN0cmluZyBiYXNlODVpbnZhbGlkQ2hhcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJhc2U4NWxlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJhc2U4NW92ZXJmbG93OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFzZTg1dG9vTG9uZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJhc2U4NXRvb1Nob3J0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFzZUxlbmd0aEluY29ycmVjdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJpbmFyeURlbHRhQmFzZUxlbmd0aE1pc21hdGNoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5RGVsdGFJbnZhbGlkT2Zmc2V0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5RGVsdGFJbnZhbGlkUmVzdWx0TGVuZ3RoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5SHVua0RlY29kZUVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5SHVua0ludmFsaWRMZW5ndGg7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlIdW5rTGluZVRvb1Nob3J0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5SHVua01pc3NpbmdOZXdsaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYml0bWFwTWlzc2luZ09iamVjdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGJpdG1hcHNNdXN0QmVQcmVwYXJlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGJsYW1lTm90Q29tbWl0dGVkWWV0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQppbmRleCBkZTZhMzQ2Li5iZjkzZDc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTcsIEdvb2dsZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMTgsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjEsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTgyLDEyICs4Myw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBPcGVuU3NoQ29uZmlnRmlsZSBpbXBsZW1lbnRzIFNzaENvbmZpZ1N0b3JlIHsKIAotCS8qKgotCSAqICJIb3N0IiBuYW1lIG9mIHRoZSBIb3N0RW50cnkgZm9yIHRoZSBkZWZhdWx0IG9wdGlvbnMgYmVmb3JlIHRoZSBmaXJzdAotCSAqIGhvc3QgYmxvY2sgaW4gYSBjb25maWcgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIiI7IC8vJE5PTi1OTFMtMSQKLQogCS8qKiBUaGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCBhcyBrZXkgZmlsZXMgbWF5IGJlIHJlbGF0aXZlIHRvIGhlcmUuICovCiAJcHJpdmF0ZSBmaW5hbCBGaWxlIGhvbWU7CiAKQEAgLTEwNSwxMSArMTAwLDkgQEAKIAkgKiBmdWxseSByZXNvbHZlZCBlbnRyaWVzIGNyZWF0ZWQgZnJvbSB0aGF0LgogCSAqLwogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlIHsKLQkJLy8gS2V5ZWQgYnkgcGF0dGVybjsgaWYgYSAiSG9zdCIgbGluZSBoYXMgbXVsdGlwbGUgcGF0dGVybnMsIHdlIGdlbmVyYXRlCi0JCS8vIGR1cGxpY2F0ZSBIb3N0RW50cnkgb2JqZWN0cwotCQlNYXA8U3RyaW5nLCBIb3N0RW50cnk+IGVudHJpZXMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCUxpc3Q8SG9zdEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZExpc3Q8PigpOwogCi0JCS8vIEtleWVkIGJ5IHVzZXJAaG9zdG5hbWU6cG9ydAorCQkvLyBQcmV2aW91cyBsb29rdXBzLCBrZXllZCBieSB1c2VyQGhvc3RuYW1lOnBvcnQKIAkJTWFwPFN0cmluZywgSG9zdEVudHJ5PiBob3N0cyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogCQlAT3ZlcnJpZGUKQEAgLTE2NSwxNCArMTU4LDE2IEBACiAJCQlyZXR1cm4gaDsKIAkJfQogCQlIb3N0RW50cnkgZnVsbENvbmZpZyA9IG5ldyBIb3N0RW50cnkoKTsKLQkJLy8gSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgZW50cmllcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCBiZWZvcmUgdGhlCi0JCS8vIGZpcnN0IEhvc3QgYmxvY2suCi0JCWZ1bGxDb25maWcubWVyZ2UoY2FjaGUuZW50cmllcy5nZXQoREVGQVVMVF9OQU1FKSk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgSG9zdEVudHJ5PiBlIDogY2FjaGUuZW50cmllcy5lbnRyeVNldCgpKSB7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGUuZ2V0S2V5KCk7Ci0JCQlpZiAoaXNIb3N0TWF0Y2gocGF0dGVybiwgaG9zdE5hbWUpKSB7Ci0JCQkJZnVsbENvbmZpZy5tZXJnZShlLmdldFZhbHVlKCkpOwotCQkJfQorCQlJdGVyYXRvcjxIb3N0RW50cnk+IGVudHJpZXMgPSBjYWNoZS5lbnRyaWVzLml0ZXJhdG9yKCk7CisJCWlmIChlbnRyaWVzLmhhc05leHQoKSkgeworCQkJLy8gU2hvdWxkIGFsd2F5cyBoYXZlIGF0IGxlYXN0IHRoZSBmaXJzdCB0b3AgZW50cnkgY29udGFpbmluZworCQkJLy8ga2V5LXZhbHVlIHBhaXJzIGJlZm9yZSB0aGUgZmlyc3QgSG9zdCBibG9jaworCQkJZnVsbENvbmZpZy5tZXJnZShlbnRyaWVzLm5leHQoKSk7CisJCQllbnRyaWVzLmZvckVhY2hSZW1haW5pbmcoZW50cnkgLT4geworCQkJCWlmIChlbnRyeS5tYXRjaGVzKGhvc3ROYW1lKSkgeworCQkJCQlmdWxsQ29uZmlnLm1lcmdlKGVudHJ5KTsKKwkJCQl9CisJCQl9KTsKIAkJfQogCQlmdWxsQ29uZmlnLnN1YnN0aXR1dGUoaG9zdE5hbWUsIHBvcnQsIHVzZXJOYW1lLCBsb2NhbFVzZXJOYW1lLCBob21lKTsKIAkJY2FjaGUuaG9zdHMucHV0KGNhY2hlS2V5LCBmdWxsQ29uZmlnKTsKQEAgLTIwOCwyMCArMjAzLDE5IEBACiAJCXJldHVybiBzdGF0ZTsKIAl9CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gcGFyc2UoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQorCXByaXZhdGUgTGlzdDxIb3N0RW50cnk+IHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLQkJZmluYWwgTGlzdDxIb3N0RW50cnk+IGN1cnJlbnQgPSBuZXcgQXJyYXlMaXN0PD4oNCk7Ci0JCVN0cmluZyBsaW5lOworCQlmaW5hbCBMaXN0PEhvc3RFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogCQkvLyBUaGUgbWFuIHBhZ2UgZG9lc24ndCBzYXkgc28sIGJ1dCB0aGUgb3BlbnNzaCBwYXJzZXIgKHJlYWRjb25mLmMpCiAJCS8vIHN0YXJ0cyBvdXQgaW4gYWN0aXZlIG1vZGUgYW5kIHRodXMgYWx3YXlzIGFwcGxpZXMgYW55IGxpbmVzIHRoYXQKIAkJLy8gb2NjdXIgYmVmb3JlIHRoZSBmaXJzdCBob3N0IGJsb2NrLiBXZSBnYXRoZXIgdGhvc2Ugb3B0aW9ucyBpbiBhCiAJCS8vIEhvc3RFbnRyeSBmb3IgREVGQVVMVF9OQU1FLgogCQlIb3N0RW50cnkgZGVmYXVsdHMgPSBuZXcgSG9zdEVudHJ5KCk7Ci0JCWN1cnJlbnQuYWRkKGRlZmF1bHRzKTsKLQkJZW50cmllcy5wdXQoREVGQVVMVF9OQU1FLCBkZWZhdWx0cyk7CisJCUhvc3RFbnRyeSBjdXJyZW50ID0gZGVmYXVsdHM7CisJCWVudHJpZXMuYWRkKGRlZmF1bHRzKTsKIAorCQlTdHJpbmcgbGluZTsKIAkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCS8vIE9wZW5Tc2ggaWdub3JlcyB0cmFpbGluZyBjb21tZW50cyBvbiBhIGxpbmUuIEFueXRoaW5nIGFmdGVyIHRoZQogCQkJLy8gZmlyc3QgIyBvbiBhIGxpbmUgaXMgdHJpbW1lZCBhd2F5ICh5ZXMsIGV2ZW4gaWYgdGhlIGhhc2ggaXMKQEAgLTI0NiwzOCArMjQwLDE3IEBACiAJCQlTdHJpbmcgYXJnVmFsdWUgPSBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0udHJpbSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKIAogCQkJaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UoU3NoQ29uc3RhbnRzLkhPU1QsIGtleXdvcmQpKSB7Ci0JCQkJY3VycmVudC5jbGVhcigpOwotCQkJCWZvciAoU3RyaW5nIG5hbWUgOiBwYXJzZUxpc3QoYXJnVmFsdWUpKSB7Ci0JCQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIG51bGwgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGJldHRlciBiZSBzYWZlIHRoYW4gc29ycnkuCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlIb3N0RW50cnkgYyA9IGVudHJpZXMuZ2V0KG5hbWUpOwotCQkJCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQkJCQljID0gbmV3IEhvc3RFbnRyeSgpOwotCQkJCQkJZW50cmllcy5wdXQobmFtZSwgYyk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudC5hZGQoYyk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoY3VycmVudC5pc0VtcHR5KCkpIHsKLQkJCQkvLyBXZSByZWNlaXZlZCBhbiBvcHRpb24gb3V0c2lkZSBvZiBhIEhvc3QgYmxvY2suIFdlCi0JCQkJLy8gZG9uJ3Qga25vdyB3aG8gdGhpcyBzaG91bGQgbWF0Y2ggYWdhaW5zdCwgc28gc2tpcC4KKwkJCQljdXJyZW50ID0gbmV3IEhvc3RFbnRyeShwYXJzZUxpc3QoYXJnVmFsdWUpKTsKKwkJCQllbnRyaWVzLmFkZChjdXJyZW50KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKEhvc3RFbnRyeS5pc0xpc3RLZXkoa2V5d29yZCkpIHsKIAkJCQlMaXN0PFN0cmluZz4gYXJncyA9IHZhbGlkYXRlKGtleXdvcmQsIHBhcnNlTGlzdChhcmdWYWx1ZSkpOwotCQkJCWZvciAoSG9zdEVudHJ5IGVudHJ5IDogY3VycmVudCkgewotCQkJCQllbnRyeS5zZXRWYWx1ZShrZXl3b3JkLCBhcmdzKTsKLQkJCQl9CisJCQkJY3VycmVudC5zZXRWYWx1ZShrZXl3b3JkLCBhcmdzKTsKIAkJCX0gZWxzZSBpZiAoIWFyZ1ZhbHVlLmlzRW1wdHkoKSkgewogCQkJCWFyZ1ZhbHVlID0gdmFsaWRhdGUoa2V5d29yZCwgZGVxdW90ZShhcmdWYWx1ZSkpOwotCQkJCWZvciAoSG9zdEVudHJ5IGVudHJ5IDogY3VycmVudCkgewotCQkJCQllbnRyeS5zZXRWYWx1ZShrZXl3b3JkLCBhcmdWYWx1ZSk7Ci0JCQkJfQorCQkJCWN1cnJlbnQuc2V0VmFsdWUoa2V5d29yZCwgYXJnVmFsdWUpOwogCQkJfQogCQl9CiAKQEAgLTMwMCw3ICsyNzMsNyBAQAogCQlpbnQgbGVuZ3RoID0gYXJndW1lbnQubGVuZ3RoKCk7CiAJCXdoaWxlIChzdGFydCA8IGxlbmd0aCkgewogCQkJLy8gU2tpcCB3aGl0ZXNwYWNlCi0JCQlpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGFyZ3VtZW50LmNoYXJBdChzdGFydCkpKSB7CisJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShhcmd1bWVudC5jaGFyQXQoc3RhcnQpKSkgewogCQkJCXN0YXJ0Kys7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0zMTUsNyArMjg4LDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaW50IHN0b3AgPSBzdGFydCArIDE7CiAJCQkJd2hpbGUgKHN0b3AgPCBsZW5ndGgKLQkJCQkJCSYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYXJndW1lbnQuY2hhckF0KHN0b3ApKSkgeworCQkJCQkJJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYXJndW1lbnQuY2hhckF0KHN0b3ApKSkgewogCQkJCQlzdG9wKys7CiAJCQkJfQogCQkJCXJlc3VsdC5hZGQoYXJndW1lbnQuc3Vic3RyaW5nKHN0YXJ0LCBzdG9wKSk7CkBAIC0zNTgsMTMgKzMzMSw2IEBACiAJCXJldHVybiB2YWx1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSG9zdE1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSkgewotCQlpZiAocGF0dGVybi5zdGFydHNXaXRoKCIhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICFwYXR0ZXJuTWF0Y2hlc0hvc3QocGF0dGVybi5zdWJzdHJpbmcoMSksIG5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXR0ZXJuTWF0Y2hlc0hvc3QocGF0dGVybiwgbmFtZSk7Ci0JfQotCiAJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXR0ZXJuTWF0Y2hlc0hvc3QoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBuYW1lKSB7CiAJCWlmIChwYXR0ZXJuLmluZGV4T2YoJyonKSA+PSAwIHx8IHBhdHRlcm4uaW5kZXhPZignPycpID49IDApIHsKIAkJCWZpbmFsIEZpbGVOYW1lTWF0Y2hlciBmbjsKQEAgLTM4OSw5ICszNTUsMTIgQEAKIAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpcFdoaXRlc3BhY2UoU3RyaW5nIHZhbHVlKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIodmFsdWUuY2hhckF0KGkpKSkKLQkJCQliLmFwcGVuZCh2YWx1ZS5jaGFyQXQoaSkpOworCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7CisJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJYi5hcHBlbmQoY2gpOworCQkJfQogCQl9CiAJCXJldHVybiBiLnRvU3RyaW5nKCk7CiAJfQpAQCAtNTExLDYgKzQ4MCwzMiBAQAogCiAJCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBsaXN0T3B0aW9uczsKIAorCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXR0ZXJuczsKKworCQkvLyBDb25zdHJ1Y3RvciB1c2VkIHRvIGJ1aWxkIHRoZSBtZXJnZWQgZW50cnk7IG5ldmVyIG1hdGNoZXMgYW55dGhpbmcKKwkJSG9zdEVudHJ5KCkgeworCQkJdGhpcy5wYXR0ZXJucyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJSG9zdEVudHJ5KExpc3Q8U3RyaW5nPiBwYXR0ZXJucykgeworCQkJdGhpcy5wYXR0ZXJucyA9IHBhdHRlcm5zOworCQl9CisKKwkJYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBob3N0TmFtZSkgeworCQkJYm9vbGVhbiBkb2VzTWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykgeworCQkJCWlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoIiEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChwYXR0ZXJuTWF0Y2hlc0hvc3QocGF0dGVybi5zdWJzdHJpbmcoMSksIGhvc3ROYW1lKSkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICghZG9lc01hdGNoCisJCQkJCQkmJiBwYXR0ZXJuTWF0Y2hlc0hvc3QocGF0dGVybiwgaG9zdE5hbWUpKSB7CisJCQkJCWRvZXNNYXRjaCA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGRvZXNNYXRjaDsKKwkJfQorCiAJCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b0tleShTdHJpbmcga2V5KSB7CiAJCQlTdHJpbmcgayA9IEFMSUFTRVMuZ2V0KGtleSk7CiAJCQlyZXR1cm4gayAhPSBudWxsID8gayA6IGtleTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKaW5kZXggMDNjMWVmOS4uM2UzZDliNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKQEAgLTM5OCw3ICszOTgsMTUgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0ZGID0gImZmIjsKIAogCS8qKgorCSAqIFRoZSAiY29uZmxpY3RTdHlsZSIga2V5LgorCSAqCisJICogQHNpbmNlIDUuMTIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0NPTkZMSUNUU1RZTEUgPSAiY29uZmxpY3RTdHlsZSI7CisKKwkvKioKIAkgKiBUaGUgImNoZWNrc3RhdCIga2V5CisJICoKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9DSEVDS1NUQVQgPSAiY2hlY2tzdGF0IjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKaW5kZXggYmU1NWNkMS4uNWNkNWIzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKQEAgLTExOCw3ICsxMTgsNyBAQAogCSAqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGU7IGRlZmluZXMgc2lnbmF0dXJlIGFsZ29yaXRobXMgZm9yIHB1YmxpYyBrZXkKIAkgKiBhdXRoZW50aWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgogCSAqCi0JICogQHNpbmNlIDUuMTEKKwkgKiBAc2luY2UgNS4xMS4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCS0VZX0FDQ0VQVEVEX0FMR09SSVRITVMgPSAiUHVia2V5QWNjZXB0ZWRBbGdvcml0aG1zIjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQppbmRleCA1NWI3ZDYyLi4wYjdjMGE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQpAQCAtNTAyLDggKzUwMiw3IEBACiAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG5ldyBGaWx0ZXJGYWlsZWRFeGNlcHRpb24ocmMsCiAJCQkJCQlmaWx0ZXJDb21tYW5kLCBnZXRFbnRyeVBhdGhTdHJpbmcoKSwKIAkJCQkJCXJlc3VsdC5nZXRTdGRvdXQoKS50b0J5dGVBcnJheShNQVhfRVhDRVBUSU9OX1RFWFRfU0laRSksCi0JCQkJCQlSYXdQYXJzZVV0aWxzLmRlY29kZShyZXN1bHQuZ2V0U3RkZXJyKCkKLQkJCQkJCQkJLnRvQnl0ZUFycmF5KE1BWF9FWENFUFRJT05fVEVYVF9TSVpFKSkpKTsKKwkJCQkJCXJlc3VsdC5nZXRTdGRlcnIoKS50b1N0cmluZyhNQVhfRVhDRVBUSU9OX1RFWFRfU0laRSkpKTsKIAkJCX0KIAkJCXJldHVybiByZXN1bHQuZ2V0U3Rkb3V0KCkub3BlbklucHV0U3RyZWFtV2l0aEF1dG9EZXN0cm95KCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlODUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlODUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI3Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U4NS5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CisKKy8qKgorICogQmFzZS04NSBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQHNpbmNlIDUuMTIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJhc2U4NSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU5DT0RFID0gKCIwMTIzNDU2Nzg5IiAvLyROT04tTkxTLTEkCisJCQkrICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIgLy8kTk9OLU5MUy0xJAorCQkJKyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiIC8vJE5PTi1OTFMtMSQKKwkJCSsgIiEjJCUmKCkqKy07PD0+P0BeX2B7fH1+IikgLy8kTk9OLU5MUy0xJAorCQkJCQkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBERUNPREUgPSBuZXcgaW50WzI1Nl07CisKKwlzdGF0aWMgeworCQlBcnJheXMuZmlsbChERUNPREUsIC0xKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBFTkNPREUubGVuZ3RoOyBpKyspIHsKKwkJCURFQ09ERVtFTkNPREVbaV1dID0gaTsKKwkJfQorCX0KKworCXByaXZhdGUgQmFzZTg1KCkgeworCQkvLyBObyBpbnN0YW50aWF0aW9uCisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlLTg1IGVuY29kaW5nIGZvciB7QGNvZGUgcmF3TGVuZ3RofQorCSAqIGJ5dGVzLgorCSAqCisJICogQHBhcmFtIHJhd0xlbmd0aAorCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGVuY29kZQorCSAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGJhc2UtODUgZW5jb2Rpbmcgb2YKKwkgKiAgICAgICAgIHtAY29kZSByYXdMZW5ndGh9IGJ5dGVzCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlZExlbmd0aChpbnQgcmF3TGVuZ3RoKSB7CisJCXJldHVybiAocmF3TGVuZ3RoICsgMykgLyA0ICogNTsKKwl9CisKKwkvKioKKwkgKiBFbmNvZGVzIHRoZSBnaXZlbiB7QGNvZGUgZGF0YX0gaW4gQmFzZS04NS4KKwkgKgorCSAqIEBwYXJhbSBkYXRhCisJICogICAgICAgICAgICB0byBlbmNvZGUKKwkgKiBAcmV0dXJuIGVuY29kZWQgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShieXRlW10gZGF0YSkgeworCQlyZXR1cm4gZW5jb2RlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKwl9CisKKwkvKioKKwkgKiBFbmNvZGVzIHtAY29kZSBsZW5ndGh9IGJ5dGVzIG9mIHtAY29kZSBkYXRhfSBpbiBCYXNlLTg1LCBiZWdpbm5pbmcgYXQgdGhlCisJICoge0Bjb2RlIHN0YXJ0fSBpbmRleC4KKwkgKgorCSAqIEBwYXJhbSBkYXRhCisJICogICAgICAgICAgICB0byBlbmNvZGUKKwkgKiBAcGFyYW0gc3RhcnQKKwkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGVuY29kZQorCSAqIEBwYXJhbSBsZW5ndGgKKwkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyB0byBlbmNvZGUKKwkgKiBAcmV0dXJuIGVuY29kZWQgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShieXRlW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisJCWJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmNvZGVkTGVuZ3RoKGxlbmd0aCldOworCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisJCWludCBpbiA9IHN0YXJ0OworCQlpbnQgb3V0ID0gMDsKKwkJd2hpbGUgKGluIDwgZW5kKSB7CisJCQkvLyBBY2N1bXVsYXRlIHJlbWFpbmluZyBieXRlcyBNU0IgZmlyc3QgYXMgYSAzMmJpdCB2YWx1ZQorCQkJbG9uZyBhY2N1bXVsYXRvciA9ICgobG9uZykgKGRhdGFbaW4rK10gJiAweEZGKSkgPDwgMjQ7CisJCQlpZiAoaW4gPCBlbmQpIHsKKwkJCQlhY2N1bXVsYXRvciB8PSAoZGF0YVtpbisrXSAmIDB4RkYpIDw8IDE2OworCQkJCWlmIChpbiA8IGVuZCkgeworCQkJCQlhY2N1bXVsYXRvciB8PSAoZGF0YVtpbisrXSAmIDB4RkYpIDw8IDg7CisJCQkJCWlmIChpbiA8IGVuZCkgeworCQkJCQkJYWNjdW11bGF0b3IgfD0gKGRhdGFbaW4rK10gJiAweEZGKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIFdyaXRlIHRoZSAzMmJpdCB2YWx1ZSBpbiBiYXNlLTg1IGVuY29kaW5nLCBhbHNvIE1TQiBmaXJzdAorCQkJZm9yIChpbnQgaSA9IDQ7IGkgPj0gMDsgaS0tKSB7CisJCQkJcmVzdWx0W291dCArIGldID0gRU5DT0RFWyhpbnQpIChhY2N1bXVsYXRvciAlIDg1KV07CisJCQkJYWNjdW11bGF0b3IgLz0gODU7CisJCQl9CisJCQlvdXQgKz0gNTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIERlY29kZXMgdGhlIEJhc2UtODUge0Bjb2RlIGVuY29kZWR9IGRhdGEgaW50byBhIGJ5dGUgYXJyYXkgb2YKKwkgKiB7QGNvZGUgZXhwZWN0ZWRTaXplfSBieXRlcy4KKwkgKgorCSAqIEBwYXJhbSBlbmNvZGVkCisJICogICAgICAgICAgICBCYXNlLTg1IGVuY29kZWQgZGF0YQorCSAqIEBwYXJhbSBleHBlY3RlZFNpemUKKwkgKiAgICAgICAgICAgIG9mIHRoZSByZXN1bHQKKwkgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJ5dGVzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBleHBlY3RlZFNpemUgZG9lc24ndCBtYXRjaCwgdGhlIGVuY29kZWQgZGF0YSBoYXMgYSBsZW5ndGgKKwkgKiAgICAgICAgICAgICB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDUsIG9yIHRoZXJlIGFyZSBpbnZhbGlkIGNoYXJhY3RlcnMKKwkgKiAgICAgICAgICAgICBpbiB0aGUgZW5jb2RlZCBkYXRhCisJICovCisJcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKGJ5dGVbXSBlbmNvZGVkLCBpbnQgZXhwZWN0ZWRTaXplKSB7CisJCXJldHVybiBkZWNvZGUoZW5jb2RlZCwgMCwgZW5jb2RlZC5sZW5ndGgsIGV4cGVjdGVkU2l6ZSk7CisJfQorCisJLyoqCisJICogRGVjb2RlcyB7QGNvZGUgbGVuZ3RofSBieXRlcyBvZiBCYXNlLTg1IHtAY29kZSBlbmNvZGVkfSBkYXRhLCBiZWdpbm5pbmcKKwkgKiBhdCB0aGUge0Bjb2RlIHN0YXJ0fSBpbmRleCwgaW50byBhIGJ5dGUgYXJyYXkgb2Yge0Bjb2RlIGV4cGVjdGVkU2l6ZX0KKwkgKiBieXRlcy4KKwkgKgorCSAqIEBwYXJhbSBlbmNvZGVkCisJICogICAgICAgICAgICBCYXNlLTg1IGVuY29kZWQgZGF0YQorCSAqIEBwYXJhbSBzdGFydAorCSAqICAgICAgICAgICAgaW5kZXggYXQgd2hpY2ggdGhlIGRhdGEgdG8gZGVjb2RlIHN0YXJ0cyBpbiB7QGNvZGUgZW5jb2RlZH0KKwkgKiBAcGFyYW0gbGVuZ3RoCisJICogICAgICAgICAgICBvZiB0aGUgQmFzZS04NSBlbmNvZGVkIGRhdGEKKwkgKiBAcGFyYW0gZXhwZWN0ZWRTaXplCisJICogICAgICAgICAgICBvZiB0aGUgcmVzdWx0CisJICogQHJldHVybiB0aGUgZGVjb2RlZCBieXRlcworCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgZXhwZWN0ZWRTaXplIGRvZXNuJ3QgbWF0Y2gsIHtAY29kZSBsZW5ndGh9IGlzIG5vdCBhCisJICogICAgICAgICAgICAgbXVsdGlwbGUgb2YgNSwgb3IgdGhlcmUgYXJlIGludmFsaWQgY2hhcmFjdGVycyBpbiB0aGUgZW5jb2RlZAorCSAqICAgICAgICAgICAgIGRhdGEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGVuY29kZWQsIGludCBzdGFydCwgaW50IGxlbmd0aCwKKwkJCWludCBleHBlY3RlZFNpemUpIHsKKwkJaWYgKGxlbmd0aCAlIDUgIT0gMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5iYXNlODVsZW5ndGgpOworCQl9CisJCWJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtleHBlY3RlZFNpemVdOworCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisJCWludCBpbiA9IHN0YXJ0OworCQlpbnQgb3V0ID0gMDsKKwkJd2hpbGUgKGluIDwgZW5kICYmIG91dCA8IGV4cGVjdGVkU2l6ZSkgeworCQkJLy8gQWNjdW11bGF0ZSA1IGJ5dGVzLCAiTVNCIiBmaXJzdAorCQkJbG9uZyBhY2N1bXVsYXRvciA9IDA7CisJCQlmb3IgKGludCBpID0gNDsgaSA+PSAwOyBpLS0pIHsKKwkJCQlpbnQgdmFsID0gREVDT0RFW2VuY29kZWRbaW4rK10gJiAweEZGXTsKKwkJCQlpZiAodmFsIDwgMCkgeworCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmJhc2U4NWludmFsaWRDaGFyLAorCQkJCQkJCUludGVnZXIudG9IZXhTdHJpbmcoZW5jb2RlZFtpbiAtIDFdICYgMHhGRikpKTsKKwkJCQl9CisJCQkJYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvciAqIDg1ICsgdmFsOworCQkJfQorCQkJaWYgKGFjY3VtdWxhdG9yID4gMHhGRkZGX0ZGRkZMKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmJhc2U4NW92ZXJmbG93LAorCQkJCQkJCQlMb25nLnRvSGV4U3RyaW5nKGFjY3VtdWxhdG9yKSkpOworCQkJfQorCQkJLy8gV3JpdGUgcmVtYWluaW5nIGJ5dGVzLCBNU0IgZmlyc3QKKwkJCXJlc3VsdFtvdXQrK10gPSAoYnl0ZSkgKGFjY3VtdWxhdG9yID4+PiAyNCk7CisJCQlpZiAob3V0IDwgZXhwZWN0ZWRTaXplKSB7CisJCQkJcmVzdWx0W291dCsrXSA9IChieXRlKSAoYWNjdW11bGF0b3IgPj4+IDE2KTsKKwkJCQlpZiAob3V0IDwgZXhwZWN0ZWRTaXplKSB7CisJCQkJCXJlc3VsdFtvdXQrK10gPSAoYnl0ZSkgKGFjY3VtdWxhdG9yID4+PiA4KTsKKwkJCQkJaWYgKG91dCA8IGV4cGVjdGVkU2l6ZSkgeworCQkJCQkJcmVzdWx0W291dCsrXSA9IChieXRlKSBhY2N1bXVsYXRvcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBTaG91bGQgaGF2ZSBleGhhdXN0ZWQgJ2luJyBhbmQgZmlsbGVkICdvdXQnIGNvbXBsZXRlbHkKKwkJaWYgKGluIDwgZW5kKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5iYXNlODV0b29Mb25nLAorCQkJCQkJCUludGVnZXIudmFsdWVPZihleHBlY3RlZFNpemUpKSk7CisJCX0KKwkJaWYgKG91dCA8IGV4cGVjdGVkU2l6ZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYmFzZTg1dG9vU2hvcnQsCisJCQkJCQkJSW50ZWdlci52YWx1ZU9mKGV4cGVjdGVkU2l6ZSkpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQppbmRleCA1NjJlYjA1Li5mYjg5M2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CkBAIC0yMTMsNiArMjE0LDI0IEBACiAJfQogCiAJLyoqCisJICogQ29udmVydCBmaXJzdCB7QGNvZGUgbGltaXR9IG51bWJlciBvZiBieXRlcyBvZiB0aGUgYnVmZmVyIGNvbnRlbnQgdG8KKwkgKiBTdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gbGltaXQKKwkgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb252ZXJ0ZWQgdG8gU3RyaW5nCisJICogQHJldHVybiBmaXJzdCB7QGNvZGUgbGltaXR9IG51bWJlciBvZiBieXRlcyBvZiB0aGUgYnVmZmVyIGNvbnRlbnQKKwkgKiAgICAgICAgIGNvbnZlcnRlZCB0byBTdHJpbmcuCisJICogQHNpbmNlIDUuMTIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBsaW1pdCkgeworCQl0cnkgeworCQkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKHRvQnl0ZUFycmF5KGxpbWl0KSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCS8qKgogCSAqIENvbnZlcnQgdGhpcyBidWZmZXIncyBjb250ZW50cyBpbnRvIGEgY29udGlndW91cyBieXRlIGFycmF5LiBJZiB0aGlzIHNpemUKIAkgKiBvZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIGxpbWl0IG9ubHkgcmV0dXJuIHRoZSBmaXJzdCB7QGNvZGUgbGltaXR9IGJ5dGVzCiAJICogPHA+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5RGVsdGFJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBkODdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKKworLyoqCisgKiBBbiB7QGxpbmsgSW5wdXRTdHJlYW19IHRoYXQgYXBwbGllcyBhIGJpbmFyeSBkZWx0YSB0byBhIGJhc2Ugb24gdGhlIGZseS4KKyAqIDxwPgorICogRGVsdGEgYXBwbGljYXRpb24gdG8gYSBiYXNlIG5lZWRzIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIGJhc2UgZGF0YS4gVGhlIGRlbHRhCisgKiBpcyBleHByZXNzZWQgYXMgYSBzZXF1ZW5jZSBvZiBjb3B5IGFuZCBpbnNlcnQgaW5zdHJ1Y3Rpb25zLiBBIGNvcHkKKyAqIGluc3RydWN0aW9uIGhhcyB0aGUgZm9ybSAiQ09QWSBmcm9tT2Zmc2V0IGxlbmd0aCIgYW5kIHNheXMgImNvcHkgbGVuZ3RoIGJ5dGVzCisgKiBmcm9tIHRoZSBiYXNlLCBzdGFydGluZyBhdCBvZmZzZXQgZnJvbU9mZnNldCwgdG8gdGhlIHJlc3VsdCIuIEFuIGluc2VydAorICogaW5zdHJ1Y3Rpb24gaGFzIHRoZSBmb3JtICJJTlNFUlQgbGVuZ3RoIiBmb2xsb3dlZCBieSBsZW5ndGggYnl0ZXMgYW5kIHNheXMKKyAqICJjb3B5IHRoZSBuZXh0IGxlbmd0aCBieXRlcyBmcm9tIHRoZSBkZWx0YSB0byB0aGUgcmVzdWx0Ii4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBnZW5lcmF0ZWQgdXNpbmcgYSBjb250ZW50LWRlZmluZWQgY2h1bmtpbmcgYWxnb3JpdGhtCisgKiAoY3VycmVudGx5IEMgZ2l0IHVzZXMgdGhlIHN0YW5kYXJkIFJhYmluIHZhcmlhbnQ7IGJ1dCB0aGVyZSBhcmUgb3RoZXJzIHRoYXQKKyAqIGNvdWxkIGJlIHVzZWQpIHRoYXQgaWRlbnRpZmllcyBlcXVhbCBjaHVua3MuIEl0IGlzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgYQorICogbGF0ZXIgY29weSBpbnN0cnVjdGlvbiBoYXMgYSBmcm9tT2Zmc2V0IHRoYXQgaXMgYmVmb3JlIHRoZSBmcm9tT2Zmc2V0IG9mIGFuCisgKiBlYXJsaWVyIGNvcHkgaW5zdHJ1Y3Rpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBzdHJlYW0gdGhlIGJhc2UuCisgKiA8L3A+CisgKiA8cD4KKyAqIEpHaXQgaXMgbGltaXRlZCB0byAyR0IgbWF4aW11bSBzaXplIGZvciB0aGUgYmFzZSBzaW5jZSBhcnJheSBpbmRpY2VzIGFyZQorICogc2lnbmVkIDMyYml0IHZhbHVlcy4KKyAqCisgKiBAc2luY2UgNS4xMgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworCXByaXZhdGUgZmluYWwgYnl0ZVtdIGJhc2U7CisKKwlwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGRlbHRhOworCisJcHJpdmF0ZSBsb25nIHJlc3VsdExlbmd0aDsKKworCXByaXZhdGUgbG9uZyB0b0RlbGl2ZXIgPSAtMTsKKworCXByaXZhdGUgaW50IGZyb21CYXNlOworCisJcHJpdmF0ZSBpbnQgZnJvbURlbHRhOworCisJcHJpdmF0ZSBpbnQgYmFzZU9mZnNldCA9IC0xOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbX0gdGhhdCBhcHBsaWVzIHtAY29kZSBkZWx0YX0KKwkgKiB0byB7QGNvZGUgYmFzZX0uCisJICoKKwkgKiBAcGFyYW0gYmFzZQorCSAqICAgICAgICAgICAgZGF0YSB0byBhcHBseSB0aGUgZGVsdGEgdG8KKwkgKiBAcGFyYW0gZGVsdGEKKwkgKiAgICAgICAgICAgIHtAbGluayBJbnB1dFN0cmVhbX0gZGVsaXZlcmluZyB0aGUgZGVsdGEgdG8gYXBwbHkKKwkgKi8KKwlwdWJsaWMgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbShieXRlW10gYmFzZSwgSW5wdXRTdHJlYW0gZGVsdGEpIHsKKwkJdGhpcy5iYXNlID0gYmFzZTsKKwkJdGhpcy5kZWx0YSA9IGRlbHRhOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCBiID0gcmVhZE5leHQoKTsKKwkJaWYgKGIgPj0gMCkgeworCQkJdG9EZWxpdmVyLS07CisJCX0KKwkJcmV0dXJuIGI7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlsb25nIGJhc2VTaXplID0gcmVhZFZhckludChkZWx0YSk7CisJCWlmIChiYXNlU2l6ZSA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IGJhc2VTaXplIDwgMAorCQkJCXx8IChpbnQpIGJhc2VTaXplICE9IGJhc2UubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeURlbHRhQmFzZUxlbmd0aE1pc21hdGNoLAorCQkJCQlJbnRlZ2VyLnZhbHVlT2YoYmFzZS5sZW5ndGgpLCBMb25nLnZhbHVlT2YoYmFzZVNpemUpKSk7CisJCX0KKwkJcmVzdWx0TGVuZ3RoID0gcmVhZFZhckludChkZWx0YSk7CisJCWlmIChyZXN1bHRMZW5ndGggPCAwKSB7CisJCQl0aHJvdyBuZXcgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlEZWx0YUludmFsaWRSZXN1bHRMZW5ndGgpOworCQl9CisJCXRvRGVsaXZlciA9IHJlc3VsdExlbmd0aDsKKwkJYmFzZU9mZnNldCA9IDA7CisJfQorCisJcHJpdmF0ZSBpbnQgcmVhZE5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYmFzZU9mZnNldCA8IDApIHsKKwkJCWluaXRpYWxpemUoKTsKKwkJfQorCQlpZiAoZnJvbUJhc2UgPiAwKSB7CisJCQlmcm9tQmFzZS0tOworCQkJcmV0dXJuIGJhc2VbYmFzZU9mZnNldCsrXSAmIDB4RkY7CisJCX0gZWxzZSBpZiAoZnJvbURlbHRhID4gMCkgeworCQkJZnJvbURlbHRhLS07CisJCQlyZXR1cm4gZGVsdGEucmVhZCgpOworCQl9CisJCWludCBjb21tYW5kID0gZGVsdGEucmVhZCgpOworCQlpZiAoY29tbWFuZCA8IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoKGNvbW1hbmQgJiAweDgwKSAhPSAwKSB7CisJCQkvLyBEZWNvZGUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gcmVhZCBmcm9tIGJhc2UKKwkJCWxvbmcgY29weU9mZnNldCA9IDA7CisJCQlmb3IgKGludCBpID0gMSwgc2hpZnQgPSAwOyBpIDwgMHgxMDsgaSAqPSAyLCBzaGlmdCArPSA4KSB7CisJCQkJaWYgKChjb21tYW5kICYgaSkgIT0gMCkgeworCQkJCQljb3B5T2Zmc2V0IHw9ICgobG9uZykgbmV4dChkZWx0YSkpIDw8IHNoaWZ0OworCQkJCX0KKwkJCX0KKwkJCWludCBjb3B5U2l6ZSA9IDA7CisJCQlmb3IgKGludCBpID0gMHgxMCwgc2hpZnQgPSAwOyBpIDwgMHg4MDsgaSAqPSAyLCBzaGlmdCArPSA4KSB7CisJCQkJaWYgKChjb21tYW5kICYgaSkgIT0gMCkgeworCQkJCQljb3B5U2l6ZSB8PSBuZXh0KGRlbHRhKSA8PCBzaGlmdDsKKwkJCQl9CisJCQl9CisJCQlpZiAoY29weVNpemUgPT0gMCkgeworCQkJCWNvcHlTaXplID0gMHgxMDAwMDsKKwkJCX0KKwkJCWlmIChjb3B5T2Zmc2V0ID4gYmFzZS5sZW5ndGggLSBjb3B5U2l6ZSkgeworCQkJCXRocm93IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlEZWx0YUludmFsaWRPZmZzZXQsCisJCQkJCQlMb25nLnZhbHVlT2YoY29weU9mZnNldCksIEludGVnZXIudmFsdWVPZihjb3B5U2l6ZSkpKTsKKwkJCX0KKwkJCWJhc2VPZmZzZXQgPSAoaW50KSBjb3B5T2Zmc2V0OworCQkJZnJvbUJhc2UgPSBjb3B5U2l6ZTsKKwkJCXJldHVybiByZWFkTmV4dCgpOworCQl9IGVsc2UgaWYgKGNvbW1hbmQgIT0gMCkgeworCQkJLy8gVGhlIG5leHQgJ2NvbW1hbmQnIGJ5dGVzIGNvbWUgZnJvbSB0aGUgZGVsdGEKKwkJCWZyb21EZWx0YSA9IGNvbW1hbmQgLSAxOworCQkJcmV0dXJuIGRlbHRhLnJlYWQoKTsKKwkJfSBlbHNlIHsKKwkJCS8vIFplcm8gaXMgcmVzZXJ2ZWQKKwkJCXRocm93IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oCisJCQkJCUpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkQ29tbWFuZDApOworCQl9CisJfQorCisJcHJpdmF0ZSBpbnQgbmV4dChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGIgPSBpbi5yZWFkKCk7CisJCWlmIChiIDwgMCkgeworCQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworCQl9CisJCXJldHVybiBiOworCX0KKworCXByaXZhdGUgbG9uZyByZWFkVmFySW50KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlsb25nIHZhbCA9IDA7CisJCWludCBzaGlmdCA9IDA7CisJCWludCBiOworCQlkbyB7CisJCQliID0gbmV4dChpbik7CisJCQl2YWwgfD0gKChsb25nKSAoYiAmIDB4N2YpKSA8PCBzaGlmdDsKKwkJCXNoaWZ0ICs9IDc7CisJCX0gd2hpbGUgKChiICYgMHg4MCkgIT0gMCk7CisJCXJldHVybiB2YWw7CisJfQorCisJLyoqCisJICogVGVsbHMgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIGZpbmFsIHJlc3VsdC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHNpemUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSB7QGNvZGUgZGVsdGF9CisJICovCisJcHVibGljIGxvbmcgZ2V0RXhwZWN0ZWRSZXN1bHRTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJhc2VPZmZzZXQgPCAwKSB7CisJCQlpbml0aWFsaXplKCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdExlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoZSBkZWx0YSBoYXMgYmVlbiBmdWxseSBjb25zdW1lZCwgYW5kIHRoZSBleHBlY3RlZCBudW1iZXIKKwkgKiBvZiBieXRlcyBmb3IgdGhlIGNvbWJpbmVkIHJlc3VsdCBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoaXMKKwkgKiB7QGxpbmsgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbX0uCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgZGVsdGEgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5Q29uc3VtZWQoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdG9EZWxpdmVyID09IDAgJiYgZGVsdGEucmVhZCgpIDwgMDsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIHRvRGVsaXZlciA9PSAwOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlkZWx0YS5jbG9zZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2IyZDdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlODU7CisKKy8qKgorICogQSBzdHJlYW0gdGhhdCBkZWNvZGVzIGdpdCBiaW5hcnkgcGF0Y2ggZGF0YSBvbiB0aGUgZmx5LgorICoKKyAqIEBzaW5jZSA1LjEyCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKwlwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGluOworCisJcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKKworCXByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsKKworCXByaXZhdGUgaW50IHBvcyA9IDA7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBCaW5hcnlIdW5rSW5wdXRTdHJlYW19LgorCSAqCisJICogQHBhcmFtIGluCisJICogICAgICAgICAgICB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIHJlYWQgdGhlIGJhc2UtODUgZW5jb2RlZCBwYXRjaCBkYXRhCisJICogICAgICAgICAgICBmcm9tCisJICovCisJcHVibGljIEJpbmFyeUh1bmtJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworCQl0aGlzLmluID0gaW47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHBvcyA8IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoYnVmZmVyID09IG51bGwgfHwgcG9zID09IGJ1ZmZlci5sZW5ndGgpIHsKKwkJCWZpbGxCdWZmZXIoKTsKKwkJfQorCQlpZiAocG9zID49IDApIHsKKwkJCXJldHVybiBidWZmZXJbcG9zKytdICYgMHhGRjsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbi5jbG9zZSgpOworCQlidWZmZXIgPSBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGxlbmd0aCA9IGluLnJlYWQoKTsKKwkJaWYgKGxlbmd0aCA8IDApIHsKKwkJCXBvcyA9IGxlbmd0aDsKKwkJCWJ1ZmZlciA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJbGluZU51bWJlcisrOworCQkvLyBMZW5ndGggaXMgZW5jb2RlZCB3aXRoIGNoYXJhY3RlcnMsIEEuLlogZm9yIDEuLjI2IGFuZCBhLi56IGZvciAyNy4uNTIKKwkJaWYgKCdBJyA8PSBsZW5ndGggJiYgbGVuZ3RoIDw9ICdaJykgeworCQkJbGVuZ3RoID0gbGVuZ3RoIC0gJ0EnICsgMTsKKwkJfSBlbHNlIGlmICgnYScgPD0gbGVuZ3RoICYmIGxlbmd0aCA8PSAneicpIHsKKwkJCWxlbmd0aCA9IGxlbmd0aCAtICdhJyArIDI3OworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua0ludmFsaWRMZW5ndGgsCisJCQkJCUludGVnZXIudmFsdWVPZihsaW5lTnVtYmVyKSwgSW50ZWdlci50b0hleFN0cmluZyhsZW5ndGgpKSk7CisJCX0KKwkJYnl0ZVtdIGVuY29kZWQgPSBuZXcgYnl0ZVtCYXNlODUuZW5jb2RlZExlbmd0aChsZW5ndGgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSsrKSB7CisJCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJCWlmIChiIDwgMCB8fCBiID09ICdcbicpIHsKKwkJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua0ludmFsaWRMZW5ndGgsCisJCQkJCQlJbnRlZ2VyLnZhbHVlT2YobGluZU51bWJlcikpKTsKKwkJCX0KKwkJCWVuY29kZWRbaV0gPSAoYnl0ZSkgYjsKKwkJfQorCQkvLyBNdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbmV3bGluZTsgdG9sZXJhdGUgRU9GLgorCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJaWYgKGIgPj0gMCAmJiBiICE9ICdcbicpIHsKKwkJCXRocm93IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeUh1bmtNaXNzaW5nTmV3bGluZSwKKwkJCQkJSW50ZWdlci52YWx1ZU9mKGxpbmVOdW1iZXIpKSk7CisJCX0KKwkJdHJ5IHsKKwkJCWJ1ZmZlciA9IEJhc2U4NS5kZWNvZGUoZW5jb2RlZCwgbGVuZ3RoKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCVN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiBleCA9IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmJpbmFyeUh1bmtEZWNvZGVFcnJvciwKKwkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YobGluZU51bWJlcikpKTsKKwkJCWV4LmluaXRDYXVzZShlKTsKKwkJCXRocm93IGV4OworCQl9CisJCXBvcyA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1NTFjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTg1OworCisvKioKKyAqIEFuIHtAbGluayBPdXRwdXRTdHJlYW19IHRoYXQgZW5jb2RlcyBkYXRhIGZvciBhIGdpdCBiaW5hcnkgcGF0Y2guCisgKgorICogQHNpbmNlIDUuMTIKKyAqLworcHVibGljIGNsYXNzIEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CWVRFUyA9IDUyOworCisJcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0OworCisJcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbTUFYX0JZVEVTXTsKKworCXByaXZhdGUgaW50IHBvczsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEJpbmFyeUh1bmtPdXRwdXRTdHJlYW19LgorCSAqCisJICogQHBhcmFtIG91dAorCSAqICAgICAgICAgICAge0BsaW5rIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdGhlIGVuY29kZWQgZGF0YSB0bworCSAqLworCXB1YmxpYyBCaW5hcnlIdW5rT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKKwkJdGhpcy5vdXQgPSBvdXQ7CisJfQorCisJLyoqCisJICogRmx1c2hlcyBhbmQgY2xvc2VzIHRoaXMgc3RyZWFtLCBhbmQgY2xvc2VzIHRoZSB1bmRlcmx5aW5nCisJICoge0BsaW5rIE91dHB1dFN0cmVhbX0uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmbHVzaCgpOworCQlvdXQuY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBXcml0ZXMgYW55IGJ1ZmZlcmVkIG91dHB1dCBhcyBhIGJpbmFyeSBwYXRjaCBsaW5lIHRvIHRoZSB1bmRlcmx5aW5nCisJICoge0BsaW5rIE91dHB1dFN0cmVhbX0gYW5kIGZsdXNoZXMgdGhhdCBzdHJlYW0sIHRvby4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChwb3MgPiAwKSB7CisJCQllbmNvZGUoYnVmZmVyLCAwLCBwb3MpOworCQkJcG9zID0gMDsKKwkJfQorCQlvdXQuZmx1c2goKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYnVmZmVyW3BvcysrXSA9IChieXRlKSBiOworCQlpZiAocG9zID09IGJ1ZmZlci5sZW5ndGgpIHsKKwkJCWVuY29kZShidWZmZXIsIDAsIHBvcyk7CisJCQlwb3MgPSAwOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChsZW4gPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCB0b0NvcHkgPSBsZW47CisJCWludCBpbiA9IG9mZjsKKwkJaWYgKHBvcyA+IDApIHsKKwkJCS8vIEZpbGwgdGhlIGJ1ZmZlcgorCQkJaW50IGNodW5rID0gTWF0aC5taW4odG9Db3B5LCBidWZmZXIubGVuZ3RoIC0gcG9zKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYiwgaW4sIGJ1ZmZlciwgcG9zLCBjaHVuayk7CisJCQlpbiArPSBjaHVuazsKKwkJCXBvcyArPSBjaHVuazsKKwkJCXRvQ29weSAtPSBjaHVuazsKKwkJCWlmIChwb3MgPT0gYnVmZmVyLmxlbmd0aCkgeworCQkJCWVuY29kZShidWZmZXIsIDAsIHBvcyk7CisJCQkJcG9zID0gMDsKKwkJCX0KKwkJCWlmICh0b0NvcHkgPT0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQl3aGlsZSAodG9Db3B5ID49IE1BWF9CWVRFUykgeworCQkJZW5jb2RlKGIsIGluLCBNQVhfQllURVMpOworCQkJdG9Db3B5IC09IE1BWF9CWVRFUzsKKwkJCWluICs9IE1BWF9CWVRFUzsKKwkJfQorCQlpZiAodG9Db3B5ID4gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weShiLCBpbiwgYnVmZmVyLCAwLCB0b0NvcHkpOworCQkJcG9zID0gdG9Db3B5OworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuY29kZShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGxlbmd0aCA8PSAyNikgeworCQkJb3V0LndyaXRlKCdBJyArIGxlbmd0aCAtIDEpOworCQl9IGVsc2UgeworCQkJb3V0LndyaXRlKCdhJyArIGxlbmd0aCAtIDI3KTsKKwkJfQorCQlvdXQud3JpdGUoQmFzZTg1LmVuY29kZShkYXRhLCBvZmYsIGxlbmd0aCkpOworCQlvdXQud3JpdGUoJ1xuJyk7CisJfQorfQo=