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+CisKK2xpdGVyYWwgMAorSGNtVj9kMDAwMDEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGRfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9saXRlcmFsX2FkZF9Qb3N0SW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZGY4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvbGl0ZXJhbF9hZGRfUG9zdEltYWdlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdC5wYXRjaCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRkNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0LnBhdGNoCkBAIC0wLDAgKzEsOSBAQAorZGlmZiAtLWdpdCBhL3NtdWRnZXRlc3QgYi9zbXVkZ2V0ZXN0CitpbmRleCBhMjRkNDFlLi43NjJjNGQwIDEwMDY0NAorLS0tIGEvc211ZGdldGVzdAorKysrIGIvc211ZGdldGVzdAorQEAgLTEsMyArMSwzIEBACisgUEVSTEUKKy1IRUJMRQorK3NwcmljaAorIHNwZWFrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0X1Bvc3RJbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYzMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9zbXVkZ2V0ZXN0X1Bvc3RJbWFnZQpAQCAtMCwwICsxLDMgQEAKK1BBUkxBCitzcHJpY2gKK3NwZWFrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUHJlSW1hZ2UgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3NtdWRnZXRlc3RfUHJlSW1hZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvc211ZGdldGVzdF9QcmVJbWFnZQpAQCAtMCwwICsxLDMgQEAKK1BBUkxBCitIQUJMQQorc3BlYWsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0LnBhdGNoIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MGRiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0LnBhdGNoCkBAIC0wLDAgKzEsNyBAQAorZGlmZiAtLWdpdCBhL3VtbGF1dCBiL3VtbGF1dAoraW5kZXggMDAzYTA1NC4uNTU3ZjcyZiAxMDA2NDQKKy0tLSBhL3VtbGF1dAorKysrIGIvdW1sYXV0CitAQCAtMSArMSBAQAorLcOEw5bDnAorK8TW3ApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXRfUG9zdEltYWdlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi91bWxhdXRfUG9zdEltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2Y3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9Qb3N0SW1hZ2UKQEAgLTAsMCArMSBAQAorxNbcCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9QcmVJbWFnZSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvdW1sYXV0X1ByZUltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2EwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL3VtbGF1dF9QcmVJbWFnZQpAQCAtMCwwICsxIEBACivDhMOWw5wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vZGVsdGExLmZvcndhcmQgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5mb3J3YXJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGIxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5mb3J3YXJkCkBAIC0wLDAgKzEgQEAKK1NjbVpwMFhtd2ExeiorJFUzal9jc04oRG16CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL2RlbHRhMS5yZXZlcnNlIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9kZWx0YTEucmV2ZXJzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY3YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9kZWx0YTEucmV2ZXJzZQpAQCAtMCwwICsxIEBACitUY21acDVYbUQ1e3UheGE9NWhFaTI4P0ZQNApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQppbmRleCAwNTVlYmE3Li44NjczMTBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMjAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAyMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtOSw2ICs5LDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwpAQCAtMTgsMTEgKzE5LDIwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEFwcGx5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkZpbHRlckNvbW1hbmRSZWdpc3RyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIEFwcGx5Q29tbWFuZFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewpAQCAtNTgsNiArNjgsMjYwIEBACiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJZGIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsIHRydWUpOworCQkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiY3JsZiIsIHRydWUsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmIiksCisJCQkJCXJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpOworCQkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmIiksCisJCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOworCQl9IGZpbmFsbHkgeworCQkJZGIuZ2V0Q29uZmlnKCkudW5zZXQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyTGZPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWRiLmdldENvbmZpZygpLnNldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGLCBmYWxzZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJjcmxmIiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYiKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZkVtcHR5Q29tbWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgdHJ1ZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJjcmxmMyIsIHRydWUsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmMyIpLAorCQkJCQlyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKTsKKwkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiY3JsZjMiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JMZk5ld0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWRiLmdldENvbmZpZygpLnNldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGLCB0cnVlKTsKKwkJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoImNybGY0IiwgZmFsc2UsIHRydWUpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmNCIpLAorCQkJCQlyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKTsKKwkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiY3JsZjQiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisJCX0gZmluYWxseSB7CisJCQlkYi5nZXRDb25maWcoKS51bnNldChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hXaXRoQ3JMZigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJZGIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsIGZhbHNlKTsKKwkJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoImNybGYyIiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImNybGYyIiksCisJCQkJCXJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpOworCQkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJjcmxmMiIpLAorCQkJCQliLmdldFN0cmluZygwLCBiLnNpemUoKSwgZmFsc2UpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWRiLmdldENvbmZpZygpLnVuc2V0KENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQYXRjaFdpdGhDckxmMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbmFtZSA9ICJjcmxmMiI7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgZmFsc2UpOworCQkJYSA9IG5ldyBSYXdUZXh0KHJlYWRGaWxlKG5hbWUgKyAiX1ByZUltYWdlIikpOworCQkJd3JpdGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSksCisJCQkJCWEuZ2V0U3RyaW5nKDAsIGEuc2l6ZSgpLCBmYWxzZSkpOworCisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZSkuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlByZUltYWdlIikuY2FsbCgpOworCisJCQliID0gbmV3IFJhd1RleHQocmVhZEZpbGUobmFtZSArICJfUG9zdEltYWdlIikpOworCisJCQlkYi5nZXRDb25maWcoKS5zZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgdHJ1ZSk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBnaXQuYXBwbHkoKQorCQkJCQkuc2V0UGF0Y2goZ2V0VGVzdFJlc291cmNlKG5hbWUgKyAiLnBhdGNoIikpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyhuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCBuYW1lKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSksCisJCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOworCQl9IGZpbmFsbHkgeworCQkJZGIuZ2V0Q29uZmlnKCkudW5zZXQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FVVE9DUkxGKTsKKwkJfQorCX0KKworCS8vIENsZWFuL3NtdWRnZSBmaWx0ZXIgZm9yIHRlc3RGaWx0ZXJpbmcuIFRoZSBzbXVkZ2V0ZXN0IHRlc3QgcmVzb3VyY2VzIHdlcmUKKwkvLyBjcmVhdGVkIHdpdGggQyBnaXQgdXNpbmcgYSBjbGVhbiBmaWx0ZXIgc2VkIC1lICJzL0EvRS9nIiBhbmQgdGhlIHNtdWRnZQorCS8vIGZpbHRlciBzZWQgLWUgInMvRS9BL2ciLiBUbyBrZWVwIHRoZSB0ZXN0IGluZGVwZW5kZW50IG9mIHRoZSBwcmVzZW5jZSBvZgorCS8vIHNlZCwgaW1wbGVtZW50IHRoaXMgd2l0aCBhIGJ1aWx0LWluIGZpbHRlci4KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBsYWNlRmlsdGVyIGV4dGVuZHMgRmlsdGVyQ29tbWFuZCB7CisKKwkJcHJpdmF0ZSBmaW5hbCBjaGFyIHRvUmVwbGFjZTsKKworCQlwcml2YXRlIGZpbmFsIGNoYXIgcmVwbGFjZW1lbnQ7CisKKwkJUmVwbGFjZUZpbHRlcihJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgY2hhciB0b1JlcGxhY2UsCisJCQkJY2hhciByZXBsYWNlbWVudCkgeworCQkJc3VwZXIoaW4sIG91dCk7CisJCQl0aGlzLnRvUmVwbGFjZSA9IHRvUmVwbGFjZTsKKwkJCXRoaXMucmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJCWlmIChiIDwgMCkgeworCQkJCWluLmNsb3NlKCk7CisJCQkJb3V0LmNsb3NlKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKChiICYgMHhGRikgPT0gdG9SZXBsYWNlKSB7CisJCQkJYiA9IHJlcGxhY2VtZW50OworCQkJfQorCQkJb3V0LndyaXRlKGIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0IHVwIGZpbHRlcgorCQlGaWx0ZXJDb21tYW5kRmFjdG9yeSBjbGVhbiA9IChyZXBvLCBpbiwgb3V0KSAtPiB7CisJCQlyZXR1cm4gbmV3IFJlcGxhY2VGaWx0ZXIoaW4sIG91dCwgJ0EnLCAnRScpOworCQl9OworCQlGaWx0ZXJDb21tYW5kRmFjdG9yeSBzbXVkZ2UgPSAocmVwbywgaW4sIG91dCkgLT4geworCQkJcmV0dXJuIG5ldyBSZXBsYWNlRmlsdGVyKGluLCBvdXQsICdFJywgJ0EnKTsKKwkJfTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvY2xlYW4iLCBjbGVhbik7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcigiamdpdDovL2J1aWx0aW4vYTJlL3NtdWRnZSIsIHNtdWRnZSk7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfRklMVEVSX1NFQ1RJT04sICJhMmUiLAorCQkJCQkiY2xlYW4iLCAiamdpdDovL2J1aWx0aW4vYTJlL2NsZWFuIik7CisJCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfRklMVEVSX1NFQ1RJT04sICJhMmUiLAorCQkJCQkic211ZGdlIiwgImpnaXQ6Ly9idWlsdGluL2EyZS9zbXVkZ2UiKTsKKwkJCXdyaXRlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICIuZ2l0YXR0cmlidXRlcyIpLAorCQkJCQkic211ZGdldGVzdCBmaWx0ZXI9YTJlIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi5naXRhdHRyaWJ1dGVzIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkF0dHJpYnV0ZXMiKS5jYWxsKCk7CisJCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJzbXVkZ2V0ZXN0IiwgdHJ1ZSwgdHJ1ZSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgInNtdWRnZXRlc3QiKSwKKwkJCQkJcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgInNtdWRnZXRlc3QiKSwKKwkJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFRlYXIgZG93biBmaWx0ZXIKKwkJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvY2xlYW4iKTsKKwkJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKCJqZ2l0Oi8vYnVpbHRpbi9hMmUvc211ZGdlIik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tCaW5hcnkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaGFzUHJlSW1hZ2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkobmFtZSwgaGFzUHJlSW1hZ2UsIDEpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0JpbmFyeShTdHJpbmcgbmFtZSwgYm9vbGVhbiBoYXNQcmVJbWFnZSwKKwkJCWludCBudW1iZXJPZkZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWJ5dGVbXSBwb3N0ID0gSU8KKwkJCQkJLnJlYWRXaG9sZVN0cmVhbShnZXRUZXN0UmVzb3VyY2UobmFtZSArICJfUG9zdEltYWdlIiksIDApCisJCQkJCS5hcnJheSgpOworCQkJRmlsZSBmID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CisJCQlpZiAoaGFzUHJlSW1hZ2UpIHsKKwkJCQlieXRlW10gcHJlID0gSU8KKwkJCQkJCS5yZWFkV2hvbGVTdHJlYW0oZ2V0VGVzdFJlc291cmNlKG5hbWUgKyAiX1ByZUltYWdlIiksIDApCisJCQkJCQkuYXJyYXkoKTsKKwkJCQlGaWxlcy53cml0ZShmLnRvUGF0aCgpLCBwcmUpOworCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lKS5jYWxsKCk7CisJCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlByZUltYWdlIikuY2FsbCgpOworCQkJfQorCQkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gZ2l0LmFwcGx5KCkKKwkJCQkJLnNldFBhdGNoKGdldFRlc3RSZXNvdXJjZShuYW1lICsgIi5wYXRjaCIpKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMobnVtYmVyT2ZGaWxlcywgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZiwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSk7CisJCQlhc3NlcnRBcnJheUVxdWFscyhwb3N0LCBGaWxlcy5yZWFkQWxsQnl0ZXMoZi50b1BhdGgoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5RGVsdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkoImRlbHRhIiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5TGl0ZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljaGVja0JpbmFyeSgibGl0ZXJhbCIsIHRydWUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJpbmFyeUxpdGVyYWxBZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tCaW5hcnkoImxpdGVyYWxfYWRkIiwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVuY29kaW5nQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgaXMgYSB0ZXh0IHBhdGNoIHRoYXQgY2hhbmdlcyBhIGZpbGUgY29udGFpbmluZyDDhMOWw5wgaW4gVVRGLTggdG8KKwkJLy8gdGhlIHNhbWUgY2hhcmFjdGVycyBpbiBJU08tODg1OS0xLiBUaGUgcGF0Y2ggZmlsZSBpdHNlbGYgdXNlcyBtaXhlZAorCQkvLyBlbmNvZGluZy4gU2luY2UgY2hlY2tGaWxlKCkgd29ya3Mgd2l0aCBzdHJpbmdzIHVzZSB0aGUgYmluYXJ5IGNoZWNrLgorCQljaGVja0JpbmFyeSgidW1sYXV0IiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEMgZ2l0IGFjY2VwdHMgY29tcGxldGVseSBlbXB0eSBsaW5lcyBhcyBlbXB0eSBjb250ZXh0IGxpbmVzLgorCQkvLyBBY2NvcmRpbmcgdG8gY29tbWVudHMgaW4gdGhlIEMgZ2l0IHNvdXJjZXMgKGFwcGx5LmMpLCBuZXdlciBHTlUgZGlmZgorCQkvLyBtYXkgcHJvZHVjZSBzdWNoIGRpZmZzLgorCQljaGVja0JpbmFyeSgiZW1wdHlMaW5lIiwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaWxlTm9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgdGVzdCBuZWVkcyB0d28gZmlsZXMuIE9uZSBpcyBpbiB0aGUgdGVzdCByZXNvdXJjZXMuCisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlGaWxlcy53cml0ZShkYi5nZXRXb3JrVHJlZSgpLnRvUGF0aCgpLnJlc29sdmUoInllbGxvIiksCisJCQkJCSJ5ZWxsbyIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJ5ZWxsbyIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJ5ZWxsbyIpLmNhbGwoKTsKKwkJfQorCQljaGVja0JpbmFyeSgiaGVsbG8iLCB0cnVlLCAyKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBZGRBMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJBMSIsIGZhbHNlLCB0cnVlKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGVUZXN0LmphdmEKaW5kZXggMGY5Mzc0OS4uNTA5OTM1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiwgR2l0SHViIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDIxIEdpdEh1YiBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTksMTAgKzksMTYgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Mb2NrRmFpbGVkRXhjZXB0aW9uOwpAQCAtNDksNCArNTUsMTQ5IEBACiAJCQl9CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2NrVHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSBmID0gd3JpdGVUcmFzaEZpbGUoInNvbWVmaWxlIiwgImNvbnRlbnQiKTsKKwkJTG9ja0ZpbGUgbG9jayA9IG5ldyBMb2NrRmlsZShmKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmxvY2soKSk7CisJCWxvY2sud3JpdGUoIm90aGVyIi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSk7CisJCWxvY2suY29tbWl0KCk7CisJCWFzc2VydEZhbHNlKGxvY2suaXNMb2NrZWQoKSk7CisJCWNoZWNrRmlsZShmLCAib3RoZXIiKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmxvY2soKSk7CisJCWFzc2VydFRydWUobG9jay5pc0xvY2tlZCgpKTsKKwkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0ID0gbG9jay5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJb3V0LndyaXRlKCJzZWNvbmQiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJfQorCQlsb2NrLmNvbW1pdCgpOworCQlhc3NlcnRGYWxzZShsb2NrLmlzTG9ja2VkKCkpOworCQljaGVja0ZpbGUoZiwgInNlY29uZCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExvY2tUd2ljZVVubG9jaygpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIGYgPSB3cml0ZVRyYXNoRmlsZSgic29tZWZpbGUiLCAiY29udGVudCIpOworCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQlhc3NlcnRUcnVlKGxvY2subG9jaygpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworCQlsb2NrLndyaXRlKCJvdGhlciIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQlsb2NrLnVubG9jaygpOworCQlhc3NlcnRGYWxzZShsb2NrLmlzTG9ja2VkKCkpOworCQljaGVja0ZpbGUoZiwgImNvbnRlbnQiKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmxvY2soKSk7CisJCWFzc2VydFRydWUobG9jay5pc0xvY2tlZCgpKTsKKwkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0ID0gbG9jay5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJb3V0LndyaXRlKCJzZWNvbmQiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJfQorCQlsb2NrLmNvbW1pdCgpOworCQlhc3NlcnRGYWxzZShsb2NrLmlzTG9ja2VkKCkpOworCQljaGVja0ZpbGUoZiwgInNlY29uZCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExvY2tXcml0ZVR3aWNlVGhyb3dzMSgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIGYgPSB3cml0ZVRyYXNoRmlsZSgic29tZWZpbGUiLCAiY29udGVudCIpOworCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQlhc3NlcnRUcnVlKGxvY2subG9jaygpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworCQlsb2NrLndyaXRlKCJvdGhlciIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQlhc3NlcnRUaHJvd3MoRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IGxvY2sud3JpdGUoInNlY29uZCIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpKTsKKwkJbG9jay51bmxvY2soKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2NrV3JpdGVUd2ljZVRocm93czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSBmID0gd3JpdGVUcmFzaEZpbGUoInNvbWVmaWxlIiwgImNvbnRlbnQiKTsKKwkJTG9ja0ZpbGUgbG9jayA9IG5ldyBMb2NrRmlsZShmKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmxvY2soKSk7CisJCWFzc2VydFRydWUobG9jay5pc0xvY2tlZCgpKTsKKwkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0ID0gbG9jay5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJb3V0LndyaXRlKCJvdGhlciIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQl9CisJCWFzc2VydFRocm93cyhFeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gbG9jay53cml0ZSgic2Vjb25kIi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkpOworCQlsb2NrLnVubG9jaygpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExvY2tXcml0ZVR3aWNlVGhyb3dzMygpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIGYgPSB3cml0ZVRyYXNoRmlsZSgic29tZWZpbGUiLCAiY29udGVudCIpOworCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQlhc3NlcnRUcnVlKGxvY2subG9jaygpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworCQlsb2NrLndyaXRlKCJvdGhlciIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCQlhc3NlcnRUaHJvd3MoRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBsb2NrLmdldE91dHB1dFN0cmVhbSgpKSB7CisJCQkJb3V0LndyaXRlKCJzZWNvbmQiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJCX0KKwkJfSk7CisJCWxvY2sudW5sb2NrKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9ja1dyaXRlVHdpY2VUaHJvd3M0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgZiA9IHdyaXRlVHJhc2hGaWxlKCJzb21lZmlsZSIsICJjb250ZW50Iik7CisJCUxvY2tGaWxlIGxvY2sgPSBuZXcgTG9ja0ZpbGUoZik7CisJCWFzc2VydFRydWUobG9jay5sb2NrKCkpOworCQlhc3NlcnRUcnVlKGxvY2suaXNMb2NrZWQoKSk7CisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGxvY2suZ2V0T3V0cHV0U3RyZWFtKCkpIHsKKwkJCW91dC53cml0ZSgib3RoZXIiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJfQorCQlhc3NlcnRUaHJvd3MoRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBsb2NrLmdldE91dHB1dFN0cmVhbSgpKSB7CisJCQkJb3V0LndyaXRlKCJzZWNvbmQiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJCX0KKwkJfSk7CisJCWxvY2sudW5sb2NrKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9ja1VuY2xvc2VkQ29tbWl0VGhyb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgZiA9IHdyaXRlVHJhc2hGaWxlKCJzb21lZmlsZSIsICJjb250ZW50Iik7CisJCUxvY2tGaWxlIGxvY2sgPSBuZXcgTG9ja0ZpbGUoZik7CisJCWFzc2VydFRydWUobG9jay5sb2NrKCkpOworCQlhc3NlcnRUcnVlKGxvY2suaXNMb2NrZWQoKSk7CisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGxvY2suZ2V0T3V0cHV0U3RyZWFtKCkpIHsKKwkJCW91dC53cml0ZSgib3RoZXIiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKKwkJCWFzc2VydFRocm93cyhFeGNlcHRpb24uY2xhc3MsICgpIC0+IGxvY2suY29tbWl0KCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9ja05lc3RlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIGYgPSB3cml0ZVRyYXNoRmlsZSgic29tZWZpbGUiLCAiY29udGVudCIpOworCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQlhc3NlcnRUcnVlKGxvY2subG9jaygpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworCQlhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBsb2NrLmxvY2soKSk7CisJCWFzc2VydFRydWUobG9jay5pc0xvY2tlZCgpKTsKKwkJbG9jay51bmxvY2soKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2NrSGVsZCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIGYgPSB3cml0ZVRyYXNoRmlsZSgic29tZWZpbGUiLCAiY29udGVudCIpOworCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQlhc3NlcnRUcnVlKGxvY2subG9jaygpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NrLmlzTG9ja2VkKCkpOworCQlMb2NrRmlsZSBsb2NrMiA9IG5ldyBMb2NrRmlsZShmKTsKKwkJYXNzZXJ0RmFsc2UobG9jazIubG9jaygpKTsKKwkJYXNzZXJ0RmFsc2UobG9jazIuaXNMb2NrZWQoKSk7CisJCWFzc2VydFRydWUobG9jay5pc0xvY2tlZCgpKTsKKwkJbG9jay51bmxvY2soKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2NrRm9yQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgZiA9IHdyaXRlVHJhc2hGaWxlKCJzb21lZmlsZSIsICJjb250ZW50Iik7CisJCUxvY2tGaWxlIGxvY2sgPSBuZXcgTG9ja0ZpbGUoZik7CisJCWFzc2VydFRydWUobG9jay5sb2NrRm9yQXBwZW5kKCkpOworCQlhc3NlcnRUcnVlKGxvY2suaXNMb2NrZWQoKSk7CisJCWxvY2sud3JpdGUoIm90aGVyIi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSk7CisJCWxvY2suY29tbWl0KCk7CisJCWFzc2VydEZhbHNlKGxvY2suaXNMb2NrZWQoKSk7CisJCWNoZWNrRmlsZShmLCAiY29udGVudG90aGVyIik7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTg1VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTg1VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTg3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlODVUZXN0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIEJhc2U4NX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlODVUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9DSEFSUyA9ICIwMTIzNDU2Nzg5IgorCQkJKyAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKwkJCSsgIiEjJCUmKCkqKy07PD0+P0BeX2B7fH1+IjsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoYXJzKCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlieXRlW10gdGVzdERhdGEgPSB7ICcxJywgJzInLCAnMycsICc0JywgKGJ5dGUpIGkgfTsKKwkJCWlmIChWQUxJRF9DSEFSUy5pbmRleE9mKGkpID49IDApIHsKKwkJCQlieXRlW10gZGVjb2RlZCA9IEJhc2U4NS5kZWNvZGUodGVzdERhdGEsIDQpOworCQkJCWFzc2VydE5vdE51bGwoZGVjb2RlZCk7CisJCQl9IGVsc2UgeworCQkJCWFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisJCQkJCQkoKSAtPiBCYXNlODUuZGVjb2RlKHRlc3REYXRhLCA0KSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcm91bmR0cmlwKGJ5dGVbXSBkYXRhLCBpbnQgZXhwZWN0ZWRMZW5ndGgpIHsKKwkJYnl0ZVtdIGVuY29kZWQgPSBCYXNlODUuZW5jb2RlKGRhdGEpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMZW5ndGgsIGVuY29kZWQubGVuZ3RoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMoZGF0YSwgQmFzZTg1LmRlY29kZShlbmNvZGVkLCBkYXRhLmxlbmd0aCkpOworCX0KKworCXByaXZhdGUgdm9pZCByb3VuZHRyaXAoU3RyaW5nIGRhdGEsIGludCBleHBlY3RlZExlbmd0aCkgeworCQlyb3VuZHRyaXAoZGF0YS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSwgZXhwZWN0ZWRMZW5ndGgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFBhZGRpbmcoKSB7CisJCXJvdW5kdHJpcCgiIiwgMCk7CisJCXJvdW5kdHJpcCgiYSIsIDUpOworCQlyb3VuZHRyaXAoImFiIiwgNSk7CisJCXJvdW5kdHJpcCgiYWJjIiwgNSk7CisJCXJvdW5kdHJpcCgiYWJjZCIsIDUpOworCQlyb3VuZHRyaXAoImFiY2RlIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZiIsIDEwKTsKKwkJcm91bmR0cmlwKCJhYmNkZWZnIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZmdoIiwgMTApOworCQlyb3VuZHRyaXAoImFiY2RlZmdoaSIsIDE1KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoKSB7CisJCXJvdW5kdHJpcChuZXcgYnl0ZVtdIHsgMSB9LCA1KTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyIH0sIDUpOworCQlyb3VuZHRyaXAobmV3IGJ5dGVbXSB7IDEsIDIsIDMgfSwgNSk7CisJCXJvdW5kdHJpcChuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCB9LCA1KTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH0sIDEwKTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCAwLCAwLCAwIH0sIDEwKTsKKwkJcm91bmR0cmlwKG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCAwLCAwLCAwLCA1IH0sIDEwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvdygpIHsKKwkJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgPSBhc3NlcnRUaHJvd3MoCisJCQkJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IEJhc2U4NS5kZWNvZGUobmV3IGJ5dGVbXSB7ICd+JywgJ34nLCAnficsICd+JywgJ34nIH0sIDQpKTsKKwkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygib3ZlcmZsb3ciKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5RGVsdGFJbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyOTdmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeURlbHRhSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBDcnVkZSB0ZXN0cyBmb3IgdGhlIHtAbGluayBCaW5hcnlEZWx0YUlucHV0U3RyZWFtfSB1c2luZyBkZWx0YSBkaWZmcworICogZ2VuZXJhdGVkIGJ5IEMgZ2l0LgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5RGVsdGFJbnB1dFN0cmVhbVRlc3QgeworCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRCaW5hcnlIdW5rKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCaW5hcnlEZWx0YSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBQcmVwYXJlIG91ciB0ZXN0IGRhdGEKKwkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4MTkyXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQlkYXRhW2ldID0gKGJ5dGUpICgyNTUgLSAoaSAlIDI1NikpOworCQl9CisJCS8vIFNhbWUsIGJ1dCB3aXRoIGZpdmUgJ3gnIGluc2VydGVkIGluIHRoZSBtaWRkbGUuCisJCWludCBtaWRkbGUgPSBkYXRhLmxlbmd0aCAvIDI7CisJCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyA1XTsKKwkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBtaWRkbGUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworCQkJbmV3RGF0YVttaWRkbGUgKyBpXSA9ICd4JzsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG1pZGRsZSwgbmV3RGF0YSwgbWlkZGxlICsgNSwgbWlkZGxlKTsKKwkJLy8gZGVsdGExLmZvcndhcmQgaGFzIHRoZSBpbnN0cnVjdGlvbnMKKwkJLy8gQGZvcm1hdHRlcjpvZmYKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gSU5TRVJUIDUgeHh4eHgKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gQGZvcm1hdHRlcjpvbgorCQkvLyBOb3RlIHRoYXQgdGhlIHdheSB3ZSBidWlsdCBuZXdEYXRhIGNvdWxkIGJlIGV4cHJlc3NlZCBhcworCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBJTlNFUlQgNSB4eHh4eAorCQkvLyBDT1BZIDQwOTYgNDA5NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQlCaW5hcnlEZWx0YUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJpbmFyeURlbHRhSW5wdXRTdHJlYW0oZGF0YSwKKwkJCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQkJCWdldEJpbmFyeUh1bmsoImRlbHRhMS5mb3J3YXJkIikpKSkpIHsKKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCWludCBuOworCQkJd2hpbGUgKChuID0gaW5wdXQucmVhZChidWYpKSA+PSAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCQlhc3NlcnRBcnJheUVxdWFscyhuZXdEYXRhLCBvdXQudG9CeXRlQXJyYXkoKSk7CisJCQlhc3NlcnRUcnVlKGlucHV0LmlzRnVsbHlDb25zdW1lZCgpKTsKKwkJfQorCQkvLyBkZWx0YTEucmV2ZXJzZSBoYXMgdGhlIGluc3RydWN0aW9ucworCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBDT1BZIDI1NiAzODQwCisJCS8vIENPUFkgMjU2IDI1NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCS8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgYWx0ZXJuYXRpdmVzLCBmb3IgaW5zdGFuY2UKKwkJLy8gQGZvcm1hdHRlcjpvZmYKKwkJLy8gQ09QWSAwIDQwOTYKKwkJLy8gQ09QWSA0MTAxIDQwOTYKKwkJLy8gQGZvcm1hdHRlcjpvbgorCQkvLyBvcgorCQkvLyBAZm9ybWF0dGVyOm9mZgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBDT1BZIDAgNDA5NgorCQkvLyBAZm9ybWF0dGVyOm9uCisJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQlCaW5hcnlEZWx0YUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJpbmFyeURlbHRhSW5wdXRTdHJlYW0oCisJCQkJCQluZXdEYXRhLAorCQkJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCQkJZ2V0QmluYXJ5SHVuaygiZGVsdGExLnJldmVyc2UiKSkpKSkgeworCQkJbG9uZyBleHBlY3RlZFNpemUgPSBpbnB1dC5nZXRFeHBlY3RlZFJlc3VsdFNpemUoKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgZXhwZWN0ZWRTaXplKTsKKwkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCWludCBuOworCQkJd2hpbGUgKChuID0gaW5wdXQucmVhZChidWYpKSA+PSAwKSB7CisJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBvdXQudG9CeXRlQXJyYXkoKSk7CisJCQlhc3NlcnRUcnVlKGlucHV0LmlzRnVsbHlDb25zdW1lZCgpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rU3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOThjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rU3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBCaW5hcnlIdW5rSW5wdXRTdHJlYW19IGFuZCB7QGxpbmsgQmluYXJ5SHVua091dHB1dFN0cmVhbX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlIdW5rU3RyZWFtVGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBXaG9sZUJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoaW50IGxlbmd0aCA9IDE7IGxlbmd0aCA8IDUyMCArIDUyOyBsZW5ndGgrKykgeworCQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJZGF0YVtpXSA9IChieXRlKSAoMjU1IC0gKGkgJSAyNTYpKTsKKwkJCX0KKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQkJQmluYXJ5SHVua091dHB1dFN0cmVhbSBvdXQgPSBuZXcgQmluYXJ5SHVua091dHB1dFN0cmVhbSgKKwkJCQkJCQlib3MpKSB7CisJCQkJb3V0LndyaXRlKGRhdGEpOworCQkJCW91dC5mbHVzaCgpOworCQkJCWJ5dGVbXSBlbmNvZGVkID0gYm9zLnRvQnl0ZUFycmF5KCk7CisJCQkJYXNzZXJ0RmFsc2UoQXJyYXlzLmVxdWFscyhkYXRhLCBlbmNvZGVkKSk7CisJCQkJdHJ5IChCaW5hcnlIdW5rSW5wdXRTdHJlYW0gaW4gPSBuZXcgQmluYXJ5SHVua0lucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kZWQpKSkgeworCQkJCQlieXRlW10gZGVjb2RlZCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCQkJaW50IG5ld0xlbmd0aCA9IGluLnJlYWQoZGVjb2RlZCk7CisJCQkJCWFzc2VydEVxdWFscyhuZXdMZW5ndGgsIGRlY29kZWQubGVuZ3RoKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBDaHVua3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKGludCBsZW5ndGggPSAxOyBsZW5ndGggPCA1MjAgKyA1MjsgbGVuZ3RoKyspIHsKKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJCWRhdGFbaV0gPSAoYnl0ZSkgKDI1NSAtIChpICUgMjU2KSk7CisJCQl9CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCUJpbmFyeUh1bmtPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0oCisJCQkJCQkJYm9zKSkgeworCQkJCW91dC53cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCAvIDIpOworCQkJCW91dC53cml0ZShkYXRhLCBkYXRhLmxlbmd0aCAvIDIsIGRhdGEubGVuZ3RoIC0gZGF0YS5sZW5ndGggLyAyKTsKKwkJCQlvdXQuZmx1c2goKTsKKwkJCQlieXRlW10gZW5jb2RlZCA9IGJvcy50b0J5dGVBcnJheSgpOworCQkJCWFzc2VydEZhbHNlKEFycmF5cy5lcXVhbHMoZGF0YSwgZW5jb2RlZCkpOworCQkJCXRyeSAoQmluYXJ5SHVua0lucHV0U3RyZWFtIGluID0gbmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGVkKSkpIHsKKwkJCQkJYnl0ZVtdIGRlY29kZWQgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQkJCWludCBwID0gMDsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoZGVjb2RlZCwgcCwKKwkJCQkJCQlNYXRoLm1pbihkZWNvZGVkLmxlbmd0aCAtIHAsIDU3KSkpID49IDApIHsKKwkJCQkJCXAgKz0gbjsKKwkJCQkJCWlmIChwID09IGRlY29kZWQubGVuZ3RoKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYXNzZXJ0RXF1YWxzKHAsIGRlY29kZWQubGVuZ3RoKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoaW50IGxlbmd0aCA9IDE7IGxlbmd0aCA8IDUyMCArIDUyOyBsZW5ndGgrKykgeworCQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJZGF0YVtpXSA9IChieXRlKSAoMjU1IC0gKGkgJSAyNTYpKTsKKwkJCX0KKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQkJQmluYXJ5SHVua091dHB1dFN0cmVhbSBvdXQgPSBuZXcgQmluYXJ5SHVua091dHB1dFN0cmVhbSgKKwkJCQkJCQlib3MpKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJCW91dC53cml0ZShkYXRhW2ldKTsKKwkJCQl9CisJCQkJb3V0LmZsdXNoKCk7CisJCQkJYnl0ZVtdIGVuY29kZWQgPSBib3MudG9CeXRlQXJyYXkoKTsKKwkJCQlhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRhdGEsIGVuY29kZWQpKTsKKwkJCQl0cnkgKEJpbmFyeUh1bmtJbnB1dFN0cmVhbSBpbiA9IG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCkpKSB7CisJCQkJCWJ5dGVbXSBkZWNvZGVkID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWludCB2YWwgPSBpbi5yZWFkKCk7CisJCQkJCQlhc3NlcnRUcnVlKDAgPD0gdmFsICYmIHZhbCA8PSAyNTUpOworCQkJCQkJZGVjb2RlZFtpXSA9IChieXRlKSB2YWw7CisJCQkJCX0KKwkJCQkJYXNzZXJ0RXF1YWxzKC0xLCBpbi5yZWFkKCkpOworCQkJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhLCBkZWNvZGVkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBXaXRoQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKGludCBsZW5ndGggPSAxOyBsZW5ndGggPCA1MjAgKyA1MjsgbGVuZ3RoKyspIHsKKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJCWRhdGFbaV0gPSAoYnl0ZSkgKDI1NSAtIChpICUgMjU2KSk7CisJCQl9CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKKwkJCQl0cnkgKEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0oCisJCQkJCQlib3MpKSB7CisJCQkJCW91dC53cml0ZShkYXRhKTsKKwkJCQl9CisJCQkJYnl0ZVtdIGVuY29kZWQgPSBib3MudG9CeXRlQXJyYXkoKTsKKwkJCQlhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRhdGEsIGVuY29kZWQpKTsKKwkJCQl0cnkgKEJpbmFyeUh1bmtJbnB1dFN0cmVhbSBpbiA9IG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCkpKSB7CisJCQkJCWJ5dGVbXSBkZWNvZGVkID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJCQlpbnQgbmV3TGVuZ3RoID0gaW4ucmVhZChkZWNvZGVkKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKG5ld0xlbmd0aCwgZGVjb2RlZC5sZW5ndGgpOworCQkJCQlhc3NlcnRFcXVhbHMoLTEsIGluLnJlYWQoKSk7CisJCQkJCWFzc2VydEFycmF5RXF1YWxzKGRhdGEsIGRlY29kZWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzMzMWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTEuMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJQVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUyIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IGZlZWYzOTcuLjk2MjMyNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTEzLDYgKzEzLDkgQEAKIGFOZXdPYmplY3RJZElzUmVxdWlyZWQ9QSBOZXdPYmplY3RJZCBpcyByZXF1aXJlZC4KIGFuRXhjZXB0aW9uT2NjdXJyZWRXaGlsZVRyeWluZ1RvQWRkVGhlSWRPZkhFQUQ9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBhZGQgdGhlIElkIG9mIEhFQUQKIGFuU1NIU2Vzc2lvbkhhc0JlZW5BbHJlYWR5Q3JlYXRlZD1BbiBTU0ggc2Vzc2lvbiBoYXMgYmVlbiBhbHJlYWR5IGNyZWF0ZWQKK2FwcGx5QmluYXJ5QmFzZU9pZFdyb25nPUNhbm5vdCBhcHBseSBiaW5hcnkgcGF0Y2g7IE9JRCBmb3IgZmlsZSB7MH0gZG9lcyBub3QgbWF0Y2gKK2FwcGx5QmluYXJ5T2lkVG9vU2hvcnQ9QmluYXJ5IHBhdGNoIGZvciBmaWxlIHswfSBkb2VzIG5vdCBoYXZlIGZ1bGwgSURzCithcHBseUJpbmFyeVJlc3VsdE9pZFdyb25nPVJlc3VsdCBvZiBiaW5hcnkgcGF0Y2ggZm9yIGZpbGUgezB9IGhhcyB3cm9uZyBPSUQuCiBhcHBseWluZ0NvbW1pdD1BcHBseWluZyB7MH0KIGFyY2hpdmVGb3JtYXRBbHJlYWR5QWJzZW50PUFyY2hpdmUgZm9ybWF0IGFscmVhZHkgYWJzZW50OiB7MH0KIGFyY2hpdmVGb3JtYXRBbHJlYWR5UmVnaXN0ZXJlZD1BcmNoaXZlIGZvcm1hdCBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb246IHswfQpAQCAtMzcsNyArNDAsMTkgQEAKIGJhZFNlY3Rpb25FbnRyeT1CYWQgc2VjdGlvbiBlbnRyeTogezB9CiBiYWRTaGFsbG93TGluZT1CYWQgc2hhbGxvdyBsaW5lOiB7MH0KIGJhcmVSZXBvc2l0b3J5Tm9Xb3JrZGlyQW5kSW5kZXg9QmFyZSBSZXBvc2l0b3J5IGhhcyBuZWl0aGVyIGEgd29ya2luZyB0cmVlLCBub3IgYW4gaW5kZXgKK2Jhc2U4NWludmFsaWRDaGFyPUludmFsaWQgYmFzZS04NSBjaGFyYWN0ZXI6IDB4ezB9CitiYXNlODVsZW5ndGg9QmFzZS04NSBlbmNvZGVkIGRhdGEgbXVzdCBoYXZlIGEgbGVuZ3RoIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiA1CitiYXNlODVvdmVyZmxvdz1CYXNlLTg1IHZhbHVlIG92ZXJmbG93LCBkb2VzIG5vdCBmaXQgaW50byAzMiBiaXRzOiAweHswfQorYmFzZTg1dG9vTG9uZz1FeHRyYSBiYXNlLTg1IGVuY29kZWQgZGF0YSBmb3Igb3V0cHV0IHNpemUgb2YgezB9IGJ5dGVzCitiYXNlODV0b29TaG9ydD1CYXNlLTg1IGRhdGEgZGVjb2RlZCBpbnRvIGxlc3MgdGhhbiB7MH0gYnl0ZXMKIGJhc2VMZW5ndGhJbmNvcnJlY3Q9YmFzZSBsZW5ndGggaW5jb3JyZWN0CitiaW5hcnlEZWx0YUJhc2VMZW5ndGhNaXNtYXRjaD1CaW5hcnkgZGVsdGEgYmFzZSBsZW5ndGggZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkIHswfSwgZ290IHsxfQorYmluYXJ5RGVsdGFJbnZhbGlkT2Zmc2V0PUJpbmFyeSBkZWx0YSBvZmZzZXQgKyBsZW5ndGggdG9vIGxhcmdlOiB7MH0gKyB7MX0KK2JpbmFyeURlbHRhSW52YWxpZFJlc3VsdExlbmd0aD1CaW5hcnkgZGVsdGEgZXhwZWN0ZWQgcmVzdWx0IGxlbmd0aCBpcyBuZWdhdGl2ZQorYmluYXJ5SHVua0RlY29kZUVycm9yPUJpbmFyeSBodW5rLCBsaW5lIHswfTogaW52YWxpZCBpbnB1dAorYmluYXJ5SHVua0ludmFsaWRMZW5ndGg9QmluYXJ5IGh1bmssIGxpbmUgezB9OiBpbnB1dCBjb3JydXB0OyBleHBlY3RlZCBsZW5ndGggYnl0ZSwgZ290IDB4ezF9CitiaW5hcnlIdW5rTGluZVRvb1Nob3J0PUJpbmFyeSBodW5rLCBsaW5lIHswfTogaW5wdXQgZW5kZWQgcHJlbWF0dXJlbHkKK2JpbmFyeUh1bmtNaXNzaW5nTmV3bGluZT1CaW5hcnkgaHVuaywgbGluZSB7MH06IGlucHV0IGxpbmUgbm90IHRlcm1pbmF0ZWQgYnkgbmV3bGluZQogYml0bWFwTWlzc2luZ09iamVjdD1CaXRtYXAgYXQgezB9IGlzIG1pc3NpbmcgezF9LgogYml0bWFwc011c3RCZVByZXBhcmVkPUJpdG1hcHMgbXVzdCBiZSBwcmVwYXJlZCBiZWZvcmUgdGhleSBtYXkgYmUgd3JpdHRlbi4KIGJsYW1lTm90Q29tbWl0dGVkWWV0PU5vdCBDb21taXR0ZWQgWWV0CkBAIC00MTUsMTEgKzQzMCwxNCBAQAogbG9jYWxPYmplY3RzSW5jb21wbGV0ZT1Mb2NhbCBvYmplY3RzIGluY29tcGxldGUuCiBsb2NhbFJlZklzTWlzc2luZ09iamVjdHM9TG9jYWwgcmVmIHswfSBpcyBtaXNzaW5nIG9iamVjdChzKS4KIGxvY2FsUmVwb3NpdG9yeT1sb2NhbCByZXBvc2l0b3J5Citsb2NrQWxyZWFkeUhlbGQ9TG9jayBvbiB7MH0gYWxyZWFkeSBoZWxkCiBsb2NrQ291bnRNdXN0QmVHcmVhdGVyT3JFcXVhbDE9bG9ja0NvdW50IG11c3QgYmUgPj0gMQogbG9ja0Vycm9yPWxvY2sgZXJyb3I6IHswfQogbG9ja0ZhaWxlZFJldHJ5PWxvY2tpbmcgezB9IGZhaWxlZCBhZnRlciB7MX0gcmV0cmllcwogbG9ja09uTm90Q2xvc2VkPUxvY2sgb24gezB9IG5vdCBjbG9zZWQuCiBsb2NrT25Ob3RIZWxkPUxvY2sgb24gezB9IG5vdCBoZWxkLgorbG9ja1N0cmVhbUNsb3NlZD1PdXRwdXQgdG8gbG9jayBvbiB7MH0gYWxyZWFkeSBjbG9zZWQKK2xvY2tTdHJlYW1NdWx0aXBsZT1PdXRwdXQgdG8gbG9jayBvbiB7MH0gYWxyZWFkeSBvcGVuZWQKIGxvZ0luY29uc2lzdGVudEZpbGV0aW1lRGlmZj17fTogaW5jb25zaXN0ZW50IGR1cmF0aW9uIGZyb20gZmlsZSB0aW1lc3RhbXBzIG9uIHt9LCB7fToge30gPiB7fSwgYnV0IGRpZmYgPSB7fS4gQWJvcnRpbmcgbWVhc3VyZW1lbnQgYXQgcmVzb2x1dGlvbiB7fS4KIGxvZ0xhcmdlckZpbGV0aW1lRGlmZj17fTogaW5jb25zaXN0ZW50IGR1cmF0aW9uIGZyb20gZmlsZSB0aW1lc3RhbXBzIG9uIHt9LCB7fTogZGlmZiA9IHt9ID4ge30gKGxhc3QgZ29vZCB2YWx1ZSkuIEFib3J0aW5nIG1lYXN1cmVtZW50LgogbG9nU21hbGxlckZpbGV0aW1lPXt9OiBnb3Qgc21hbGxlciBmaWxlIHRpbWVzdGFtcCBvbiB7fSwge306IHt9IDwge30uIEFib3J0aW5nIG1lYXN1cmVtZW50IGF0IHJlc29sdXRpb24ge30uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCmluZGV4IGUyMjhlODIuLjU4Mzc2N2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAyMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDIxIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC05LDI5ICs5LDY4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZENvcHlPcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkZpbHRlckZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEFwcGx5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5QYXRjaEZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuUmF3VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVDaGVja291dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlQ2hlY2tvdXQuQ2hlY2tvdXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLkVvbFN0cmVhbVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGF0Y2guQmluYXJ5SHVuazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkZpbGVIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5GaWxlSGVhZGVyLlBhdGNoVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkh1bmtIZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5QYXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuQW5kVHJlZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5Ob3RJZ25vcmVkRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXJHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkV4ZWN1dGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQmluYXJ5RGVsdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQmluYXJ5SHVua0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5Fb2xTdHJlYW1UeXBlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExOwogCiAvKioKICAqIEFwcGx5IGEgcGF0Y2ggdG8gZmlsZXMgYW5kL29yIHRvIHRoZSBpbmRleC4KQEAgLTQ1LDcgKzg0LDcgQEAKIAlwcml2YXRlIElucHV0U3RyZWFtIGluOwogCiAJLyoqCi0JICogQ29uc3RydWN0cyB0aGUgY29tbWFuZCBpZiB0aGUgcGF0Y2ggaXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaW5kZXguCisJICogQ29uc3RydWN0cyB0aGUgY29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCiAJICovCkBAIC03OSw2ICsxMTgsNyBAQAogCXB1YmxpYyBBcHBseVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgUGF0Y2hGb3JtYXRFeGNlcHRpb24sCiAJCQlQYXRjaEFwcGx5RXhjZXB0aW9uIHsKIAkJY2hlY2tDYWxsYWJsZSgpOworCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAJCUFwcGx5UmVzdWx0IHIgPSBuZXcgQXBwbHlSZXN1bHQoKTsKIAkJdHJ5IHsKIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKQEAgLTg3LDE5ICsxMjcsMjIgQEAKIAkJCX0gZmluYWxseSB7CiAJCQkJaW4uY2xvc2UoKTsKIAkJCX0KLQkJCWlmICghcC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpCisJCQlpZiAoIXAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7CiAJCQkJdGhyb3cgbmV3IFBhdGNoRm9ybWF0RXhjZXB0aW9uKHAuZ2V0RXJyb3JzKCkpOworCQkJfQorCQkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gZ2V0UmVwb3NpdG9yeSgpOworCQkJRGlyQ2FjaGUgY2FjaGUgPSByZXBvc2l0b3J5LnJlYWREaXJDYWNoZSgpOwogCQkJZm9yIChGaWxlSGVhZGVyIGZoIDogcC5nZXRGaWxlcygpKSB7CiAJCQkJQ2hhbmdlVHlwZSB0eXBlID0gZmguZ2V0Q2hhbmdlVHlwZSgpOwogCQkJCUZpbGUgZiA9IG51bGw7CiAJCQkJc3dpdGNoICh0eXBlKSB7CiAJCQkJY2FzZSBBREQ6CiAJCQkJCWYgPSBnZXRGaWxlKGZoLmdldE5ld1BhdGgoKSwgdHJ1ZSk7Ci0JCQkJCWFwcGx5KGYsIGZoKTsKKwkJCQkJYXBwbHkocmVwb3NpdG9yeSwgZmguZ2V0TmV3UGF0aCgpLCBjYWNoZSwgZiwgZmgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE1PRElGWToKIAkJCQkJZiA9IGdldEZpbGUoZmguZ2V0T2xkUGF0aCgpLCBmYWxzZSk7Ci0JCQkJCWFwcGx5KGYsIGZoKTsKKwkJCQkJYXBwbHkocmVwb3NpdG9yeSwgZmguZ2V0T2xkUGF0aCgpLCBjYWNoZSwgZiwgZmgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIERFTEVURToKIAkJCQkJZiA9IGdldEZpbGUoZmguZ2V0T2xkUGF0aCgpLCBmYWxzZSk7CkBAIC0xMTgsMTQgKzE2MSwxNCBAQAogCQkJCQkJdGhyb3cgbmV3IFBhdGNoQXBwbHlFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQkJCUpHaXRUZXh0LmdldCgpLnJlbmFtZUZpbGVGYWlsZWQsIGYsIGRlc3QpLCBlKTsKIAkJCQkJfQotCQkJCQlhcHBseShkZXN0LCBmaCk7CisJCQkJCWFwcGx5KHJlcG9zaXRvcnksIGZoLmdldE9sZFBhdGgoKSwgY2FjaGUsIGRlc3QsIGZoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBDT1BZOgogCQkJCQlmID0gZ2V0RmlsZShmaC5nZXRPbGRQYXRoKCksIGZhbHNlKTsKIAkJCQkJRmlsZSB0YXJnZXQgPSBnZXRGaWxlKGZoLmdldE5ld1BhdGgoKSwgZmFsc2UpOwogCQkJCQlGaWxlVXRpbHMubWtkaXJzKHRhcmdldC5nZXRQYXJlbnRGaWxlKCksIHRydWUpOwogCQkJCQlGaWxlcy5jb3B5KGYudG9QYXRoKCksIHRhcmdldC50b1BhdGgoKSk7Ci0JCQkJCWFwcGx5KHRhcmdldCwgZmgpOworCQkJCQlhcHBseShyZXBvc2l0b3J5LCBmaC5nZXRPbGRQYXRoKCksIGNhY2hlLCB0YXJnZXQsIGZoKTsKIAkJCQl9CiAJCQkJci5hZGRVcGRhdGVkRmlsZShmKTsKIAkJCX0KQEAgLTEzMywxNCArMTc2LDEzIEBACiAJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkucGF0Y2hBcHBseUV4Y2VwdGlvbiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKIAkJfQotCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAJCXJldHVybiByOwogCX0KIAogCXByaXZhdGUgRmlsZSBnZXRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIGNyZWF0ZSkKIAkJCXRocm93cyBQYXRjaEFwcGx5RXhjZXB0aW9uIHsKIAkJRmlsZSBmID0gbmV3IEZpbGUoZ2V0UmVwb3NpdG9yeSgpLmdldFdvcmtUcmVlKCksIHBhdGgpOwotCQlpZiAoY3JlYXRlKQorCQlpZiAoY3JlYXRlKSB7CiAJCQl0cnkgewogCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7CiAJCQkJRmlsZVV0aWxzLm1rZGlycyhwYXJlbnQsIHRydWUpOwpAQCAtMTQ5LDIyICsxOTEsMzY2IEBACiAJCQkJdGhyb3cgbmV3IFBhdGNoQXBwbHlFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5jcmVhdGVOZXdGaWxlRmFpbGVkLCBmKSwgZSk7CiAJCQl9CisJCX0KIAkJcmV0dXJuIGY7CiAJfQogCisJcHJpdmF0ZSB2b2lkIGFwcGx5KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHBhdGgsIERpckNhY2hlIGNhY2hlLAorCQkJRmlsZSBmLCBGaWxlSGVhZGVyIGZoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhdGNoQXBwbHlFeGNlcHRpb24geworCQlpZiAoUGF0Y2hUeXBlLkJJTkFSWS5lcXVhbHMoZmguZ2V0UGF0Y2hUeXBlKCkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJYm9vbGVhbiBjb252ZXJ0Q3JMZiA9IG5lZWRzQ3JMZkNvbnZlcnNpb24oZiwgZmgpOworCQkvLyBVc2UgYSBUcmVlV2FsayB3aXRoIGEgRGlyQ2FjaGVJdGVyYXRvciB0byBwaWNrIHVwIHRoZSBjb3JyZWN0CisJCS8vIGNsZWFuL3NtdWRnZSBmaWx0ZXJzLiBDUi1MRiBoYW5kbGluZyBpcyBjb21wbGV0ZWx5IGRldGVybWluZWQgYnkKKwkJLy8gd2hldGhlciB0aGUgZmlsZSBvciB0aGUgcGF0Y2ggaGF2ZSBDUi1MRiBsaW5lIGVuZGluZ3MuCisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhyZXBvc2l0b3J5KSkgeworCQkJd2Fsay5zZXRPcGVyYXRpb25UeXBlKE9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCk7CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGZpbGVzID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IocmVwb3NpdG9yeSk7CisJCQlpbnQgZmlsZUlkeCA9IHdhbGsuYWRkVHJlZShmaWxlcyk7CisJCQlpbnQgY2FjaGVJZHggPSB3YWxrLmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoY2FjaGUpKTsKKwkJCWZpbGVzLnNldERpckNhY2hlSXRlcmF0b3Iod2FsaywgY2FjaGVJZHgpOworCQkJd2Fsay5zZXRGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoCisJCQkJCVBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhwYXRoKSwKKwkJCQkJbmV3IE5vdElnbm9yZWRGaWx0ZXIoZmlsZUlkeCkpKTsKKwkJCXdhbGsuc2V0UmVjdXJzaXZlKHRydWUpOworCQkJaWYgKHdhbGsubmV4dCgpKSB7CisJCQkJLy8gSWYgdGhlIGZpbGUgb24gZGlzayBoYXMgbm8gbmV3bGluZSBjaGFyYWN0ZXJzLCBjb252ZXJ0Q3JMZgorCQkJCS8vIHdpbGwgYmUgZmFsc2UuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIGhvbm9yIHRoZSBub3JtYWwgZ2l0CisJCQkJLy8gc2V0dGluZ3MuCisJCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlID0gY29udmVydENyTGYgPyBFb2xTdHJlYW1UeXBlLlRFWFRfQ1JMRgorCQkJCQkJOiB3YWxrLmdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUCk7CisJCQkJU3RyaW5nIGNvbW1hbmQgPSB3YWxrLmdldEZpbHRlckNvbW1hbmQoCisJCQkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpOworCQkJCUNoZWNrb3V0TWV0YWRhdGEgY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShzdHJlYW1UeXBlLCBjb21tYW5kKTsKKwkJCQlGaWxlVHJlZUl0ZXJhdG9yIGZpbGUgPSB3YWxrLmdldFRyZWUoZmlsZUlkeCwKKwkJCQkJCUZpbGVUcmVlSXRlcmF0b3IuY2xhc3MpOworCQkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQkJaWYgKFBhdGNoVHlwZS5HSVRfQklOQVJZLmVxdWFscyhmaC5nZXRQYXRjaFR5cGUoKSkpIHsKKwkJCQkJCWFwcGx5QmluYXJ5KHJlcG9zaXRvcnksIHBhdGgsIGYsIGZoLAorCQkJCQkJCQlmaWxlOjpvcGVuRW50cnlTdHJlYW0sIGZpbGUuZ2V0RW50cnlPYmplY3RJZCgpLAorCQkJCQkJCQljaGVja091dCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb21tYW5kID0gd2Fsay5nZXRGaWx0ZXJDb21tYW5kKAorCQkJCQkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9DTEVBTik7CisJCQkJCQlSYXdUZXh0IHJhdzsKKwkJCQkJCS8vIENhbid0IHVzZSBmaWxlLm9wZW5FbnRyeVN0cmVhbSgpIGFzIGl0IHdvdWxkIGRvIENSLUxGCisJCQkJCQkvLyBjb252ZXJzaW9uIGFzIHVzdWFsLCBub3QgYXMgd2FudGVkIGJ5IHVzLgorCQkJCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IGZpbHRlckNsZWFuKHJlcG9zaXRvcnksIHBhdGgsCisJCQkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZiksIGNvbnZlcnRDckxmLCBjb21tYW5kKSkgeworCQkJCQkJCXJhdyA9IG5ldyBSYXdUZXh0KAorCQkJCQkJCQkJSU8ucmVhZFdob2xlU3RyZWFtKGlucHV0LCAwKS5hcnJheSgpKTsKKwkJCQkJCX0KKwkJCQkJCWFwcGx5VGV4dChyZXBvc2l0b3J5LCBwYXRoLCByYXcsIGYsIGZoLCBjaGVja091dCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBGaWxlIGlnbm9yZWQ/CisJCVJhd1RleHQgcmF3OworCQlDaGVja291dE1ldGFkYXRhIGNoZWNrT3V0OworCQlpZiAoUGF0Y2hUeXBlLkdJVF9CSU5BUlkuZXF1YWxzKGZoLmdldFBhdGNoVHlwZSgpKSkgeworCQkJY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShFb2xTdHJlYW1UeXBlLkRJUkVDVCwgbnVsbCk7CisJCQlhcHBseUJpbmFyeShyZXBvc2l0b3J5LCBwYXRoLCBmLCBmaCwgKCkgLT4gbmV3IEZpbGVJbnB1dFN0cmVhbShmKSwKKwkJCQkJbnVsbCwgY2hlY2tPdXQpOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnZlcnRDckxmKSB7CisJCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IEVvbFN0cmVhbVR5cGVVdGlsLndyYXBJbnB1dFN0cmVhbSgKKwkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oZiksIEVvbFN0cmVhbVR5cGUuVEVYVF9MRikpIHsKKwkJCQkJcmF3ID0gbmV3IFJhd1RleHQoSU8ucmVhZFdob2xlU3RyZWFtKGlucHV0LCAwKS5hcnJheSgpKTsKKwkJCQl9CisJCQkJY2hlY2tPdXQgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShFb2xTdHJlYW1UeXBlLlRFWFRfQ1JMRiwgbnVsbCk7CisJCQl9IGVsc2UgeworCQkJCXJhdyA9IG5ldyBSYXdUZXh0KGYpOworCQkJCWNoZWNrT3V0ID0gbmV3IENoZWNrb3V0TWV0YWRhdGEoRW9sU3RyZWFtVHlwZS5ESVJFQ1QsIG51bGwpOworCQkJfQorCQkJYXBwbHlUZXh0KHJlcG9zaXRvcnksIHBhdGgsIHJhdywgZiwgZmgsIGNoZWNrT3V0KTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBuZWVkc0NyTGZDb252ZXJzaW9uKEZpbGUgZiwgRmlsZUhlYWRlciBmaWxlSGVhZGVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKFBhdGNoVHlwZS5HSVRfQklOQVJZLmVxdWFscyhmaWxlSGVhZGVyLmdldFBhdGNoVHlwZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghaGFzQ3JMZihmaWxlSGVhZGVyKSkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpIHsKKwkJCQlyZXR1cm4gUmF3VGV4dC5pc0NyTGZUZXh0KGlucHV0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDckxmKEZpbGVIZWFkZXIgZmlsZUhlYWRlcikgeworCQlpZiAoUGF0Y2hUeXBlLkdJVF9CSU5BUlkuZXF1YWxzKGZpbGVIZWFkZXIuZ2V0UGF0Y2hUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChIdW5rSGVhZGVyIGhlYWRlciA6IGZpbGVIZWFkZXIuZ2V0SHVua3MoKSkgeworCQkJYnl0ZVtdIGJ1ZiA9IGhlYWRlci5nZXRCdWZmZXIoKTsKKwkJCWludCBodW5rRW5kID0gaGVhZGVyLmdldEVuZE9mZnNldCgpOworCQkJaW50IGxpbmVTdGFydCA9IGhlYWRlci5nZXRTdGFydE9mZnNldCgpOworCQkJd2hpbGUgKGxpbmVTdGFydCA8IGh1bmtFbmQpIHsKKwkJCQlpbnQgbmV4dExpbmVTdGFydCA9IFJhd1BhcnNlVXRpbHMubmV4dExGKGJ1ZiwgbGluZVN0YXJ0KTsKKwkJCQlpZiAobmV4dExpbmVTdGFydCA+IGh1bmtFbmQpIHsKKwkJCQkJbmV4dExpbmVTdGFydCA9IGh1bmtFbmQ7CisJCQkJfQorCQkJCWlmIChuZXh0TGluZVN0YXJ0IDw9IGxpbmVTdGFydCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG5leHRMaW5lU3RhcnQgLSBsaW5lU3RhcnQgPiAxKSB7CisJCQkJCWNoYXIgZmlyc3QgPSAoY2hhcikgKGJ1ZltsaW5lU3RhcnRdICYgMHhGRik7CisJCQkJCWlmIChmaXJzdCA9PSAnICcgfHwgZmlyc3QgPT0gJy0nKSB7CisJCQkJCQkvLyBJdCdzIGFuIG9sZCBsaW5lLiBEb2VzIGl0IGVuZCBpbiBDUi1MRj8KKwkJCQkJCWlmIChidWZbbmV4dExpbmVTdGFydCAtIDJdID09ICdccicpIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlsaW5lU3RhcnQgPSBuZXh0TGluZVN0YXJ0OworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHBhdGgsCisJCQlJbnB1dFN0cmVhbSBmcm9tRmlsZSwgYm9vbGVhbiBjb252ZXJ0Q3JMZiwgU3RyaW5nIGZpbHRlckNvbW1hbmQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGZyb21GaWxlOworCQlpZiAoY29udmVydENyTGYpIHsKKwkJCWlucHV0ID0gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKGlucHV0LAorCQkJCQlFb2xTdHJlYW1UeXBlLlRFWFRfTEYpOworCQl9CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGZpbHRlckNvbW1hbmQpKSB7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKwkJaWYgKEZpbHRlckNvbW1hbmRSZWdpc3RyeS5pc1JlZ2lzdGVyZWQoZmlsdGVyQ29tbWFuZCkpIHsKKwkJCUxvY2FsRmlsZSBidWZmZXIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKKwkJCUZpbHRlckNvbW1hbmQgY29tbWFuZCA9IEZpbHRlckNvbW1hbmRSZWdpc3RyeS5jcmVhdGVGaWx0ZXJDb21tYW5kKAorCQkJCQlmaWx0ZXJDb21tYW5kLCByZXBvc2l0b3J5LCBpbnB1dCwgYnVmZmVyKTsKKwkJCXdoaWxlIChjb21tYW5kLnJ1bigpICE9IC0xKSB7CisJCQkJLy8gbG9vcCBhcyBsb25nIGFzIGNvbW1hbmQucnVuKCkgdGVsbHMgdGhlcmUgaXMgd29yayB0byBkbworCQkJfQorCQkJcmV0dXJuIGJ1ZmZlci5vcGVuSW5wdXRTdHJlYW1XaXRoQXV0b0Rlc3Ryb3koKTsKKwkJfQorCQlGUyBmcyA9IHJlcG9zaXRvcnkuZ2V0RlMoKTsKKwkJUHJvY2Vzc0J1aWxkZXIgZmlsdGVyUHJvY2Vzc0J1aWxkZXIgPSBmcy5ydW5JblNoZWxsKGZpbHRlckNvbW1hbmQsCisJCQkJbmV3IFN0cmluZ1swXSk7CisJCWZpbHRlclByb2Nlc3NCdWlsZGVyLmRpcmVjdG9yeShyZXBvc2l0b3J5LmdldFdvcmtUcmVlKCkpOworCQlmaWx0ZXJQcm9jZXNzQnVpbGRlci5lbnZpcm9ubWVudCgpLnB1dChDb25zdGFudHMuR0lUX0RJUl9LRVksCisJCQkJcmVwb3NpdG9yeS5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCUV4ZWN1dGlvblJlc3VsdCByZXN1bHQ7CisJCXRyeSB7CisJCQlyZXN1bHQgPSBmcy5leGVjdXRlKGZpbHRlclByb2Nlc3NCdWlsZGVyLCBpbik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCQluZXcgRmlsdGVyRmFpbGVkRXhjZXB0aW9uKGUsIGZpbHRlckNvbW1hbmQsIHBhdGgpKTsKKwkJfQorCQlpbnQgcmMgPSByZXN1bHQuZ2V0UmMoKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihuZXcgRmlsdGVyRmFpbGVkRXhjZXB0aW9uKHJjLCBmaWx0ZXJDb21tYW5kLAorCQkJCQlwYXRoLCByZXN1bHQuZ2V0U3Rkb3V0KCkudG9CeXRlQXJyYXkoNDA5NiksIFJhd1BhcnNlVXRpbHMKKwkJCQkJCQkuZGVjb2RlKHJlc3VsdC5nZXRTdGRlcnIoKS50b0J5dGVBcnJheSg0MDk2KSkpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LmdldFN0ZG91dCgpLm9wZW5JbnB1dFN0cmVhbVdpdGhBdXRvRGVzdHJveSgpOworCX0KKwogCS8qKgotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGZoCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUGF0Y2hBcHBseUV4Y2VwdGlvbgorCSAqIFNvbWV0aGluZyB0aGF0IGNhbiBzdXBwbHkgYW4ge0BsaW5rIElucHV0U3RyZWFtfS4KIAkgKi8KLQlwcml2YXRlIHZvaWQgYXBwbHkoRmlsZSBmLCBGaWxlSGVhZGVyIGZoKQorCXByaXZhdGUgaW50ZXJmYWNlIFN0cmVhbVN1cHBsaWVyIHsKKwkJSW5wdXRTdHJlYW0gbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBXZSB3cml0ZSB0aGUgcGF0Y2ggcmVzdWx0IHRvIGEge0BsaW5rIFRlbXBvcmFyeUJ1ZmZlcn0gYW5kIHRoZW4gdXNlCisJICoge0BsaW5rIERpckNhY2hlQ2hlY2tvdXR9LmdldENvbnRlbnQoKSB0byBydW4gdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBDUi1MRgorCSAqIGFuZCBzbXVkZ2UgZmlsdGVycy4gRGlyQ2FjaGVDaGVja291dCBuZWVkcyBhbiBPYmplY3RMb2FkZXIsIG5vdCBhCisJICogVGVtcG9yYXJ5QnVmZmVyLCBzbyB0aGlzIGNsYXNzIGJyaWRnZXMgYmV0d2VlbiB0aGUgdHdvLCBtYWtpbmcgYW55IFN0cmVhbQorCSAqIHByb3ZpZGVkIGJ5IGEge0BsaW5rIFN0cmVhbVN1cHBsaWVyfSBsb29rIGxpa2UgYW4gb3JkaW5hcnkgZ2l0IGJsb2IgdG8KKwkgKiBEaXJDYWNoZUNoZWNrb3V0LgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbUxvYWRlciBleHRlbmRzIE9iamVjdExvYWRlciB7CisKKwkJcHJpdmF0ZSBTdHJlYW1TdXBwbGllciBkYXRhOworCisJCXByaXZhdGUgbG9uZyBzaXplOworCisJCVN0cmVhbUxvYWRlcihTdHJlYW1TdXBwbGllciBkYXRhLCBsb25nIGxlbmd0aCkgeworCQkJdGhpcy5kYXRhID0gZGF0YTsKKwkJCXRoaXMuc2l6ZSA9IGxlbmd0aDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCQlyZXR1cm4gQ29uc3RhbnRzLk9CSl9CTE9COworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBsb25nIGdldFNpemUoKSB7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0xhcmdlKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJ5dGVbXSBnZXRDYWNoZWRCeXRlcygpIHRocm93cyBMYXJnZU9iamVjdEV4Y2VwdGlvbiB7CisJCQl0aHJvdyBuZXcgTGFyZ2VPYmplY3RFeGNlcHRpb24oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKQorCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCQlyZXR1cm4gbmV3IE9iamVjdFN0cmVhbS5GaWx0ZXIoZ2V0VHlwZSgpLCBnZXRTaXplKCksCisJCQkJCW5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGRhdGEubG9hZCgpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEhhc2goU0hBMSBoYXNoLCBsb25nIHNpemUpIHsKKwkJaGFzaC51cGRhdGUoQ29uc3RhbnRzLmVuY29kZWRUeXBlU3RyaW5nKENvbnN0YW50cy5PQkpfQkxPQikpOworCQloYXNoLnVwZGF0ZSgoYnl0ZSkgJyAnKTsKKwkJaGFzaC51cGRhdGUoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHNpemUpKTsKKwkJaGFzaC51cGRhdGUoKGJ5dGUpIDApOworCX0KKworCXByaXZhdGUgT2JqZWN0SWQgaGFzaChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVNIQTEgaGFzaCA9IFNIQTEubmV3SW5zdGFuY2UoKTsKKwkJaW5pdEhhc2goaGFzaCwgZi5sZW5ndGgoKSk7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSB7CisJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07CisJCQlpbnQgbjsKKwkJCXdoaWxlICgobiA9IGlucHV0LnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCWhhc2gudXBkYXRlKGJ1ZiwgMCwgbik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGhhc2gudG9PYmplY3RJZCgpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja09pZChPYmplY3RJZCBiYXNlSWQsIE9iamVjdElkIGlkLCBDaGFuZ2VUeXBlIHR5cGUsIEZpbGUgZiwKKwkJCVN0cmluZyBwYXRoKQorCQkJdGhyb3dzIFBhdGNoQXBwbHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiBoYXNoT2sgPSBmYWxzZTsKKwkJaWYgKGlkICE9IG51bGwpIHsKKwkJCWhhc2hPayA9IGJhc2VJZC5lcXVhbHMoaWQpOworCQkJaWYgKCFoYXNoT2sgJiYgQ2hhbmdlVHlwZS5BREQuZXF1YWxzKHR5cGUpCisJCQkJCSYmIE9iamVjdElkLnplcm9JZCgpLmVxdWFscyhiYXNlSWQpKSB7CisJCQkJLy8gV2UgY3JlYXRlIHRoZSBmaWxlIGZpcnN0LiBUaGUgT0lEIG9mIGFuIGVtcHR5IGZpbGUgaXMgbm90IHRoZQorCQkJCS8vIHplcm8gaWQhCisJCQkJaGFzaE9rID0gQ29uc3RhbnRzLkVNUFRZX0JMT0JfSUQuZXF1YWxzKGlkKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChPYmplY3RJZC56ZXJvSWQoKS5lcXVhbHMoYmFzZUlkKSkgeworCQkJCS8vIEZpbGUgZW1wdHkgaXMgT0suCisJCQkJaGFzaE9rID0gIWYuZXhpc3RzKCkgfHwgZi5sZW5ndGgoKSA9PSAwOworCQkJfSBlbHNlIHsKKwkJCQloYXNoT2sgPSBiYXNlSWQuZXF1YWxzKGhhc2goZikpOworCQkJfQorCQl9CisJCWlmICghaGFzaE9rKSB7CisJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlCYXNlT2lkV3JvbmcsIHBhdGgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhcHBseUJpbmFyeShSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBwYXRoLCBGaWxlIGYsCisJCQlGaWxlSGVhZGVyIGZoLCBTdHJlYW1TdXBwbGllciBsb2FkZXIsIE9iamVjdElkIGlkLAorCQkJQ2hlY2tvdXRNZXRhZGF0YSBjaGVja091dCkKKwkJCXRocm93cyBQYXRjaEFwcGx5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWlmICghZmguZ2V0T2xkSWQoKS5pc0NvbXBsZXRlKCkgfHwgIWZoLmdldE5ld0lkKCkuaXNDb21wbGV0ZSgpKSB7CisJCQl0aHJvdyBuZXcgUGF0Y2hBcHBseUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlPaWRUb29TaG9ydCwgcGF0aCkpOworCQl9CisJCUJpbmFyeUh1bmsgaHVuayA9IGZoLmdldEZvcndhcmRCaW5hcnlIdW5rKCk7CisJCS8vIEEgQmluYXJ5SHVuayBoYXMgdGhlIHN0YXJ0IGF0IHRoZSAibGl0ZXJhbCIgb3IgImRlbHRhIiB0b2tlbi4gRGF0YQorCQkvLyBzdGFydHMgb24gdGhlIG5leHQgbGluZS4KKwkJaW50IHN0YXJ0ID0gUmF3UGFyc2VVdGlscy5uZXh0TEYoaHVuay5nZXRCdWZmZXIoKSwKKwkJCQlodW5rLmdldFN0YXJ0T2Zmc2V0KCkpOworCQlpbnQgbGVuZ3RoID0gaHVuay5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OworCQlTSEExIGhhc2ggPSBTSEExLm5ld0luc3RhbmNlKCk7CisJCS8vIFdyaXRlIHRvIGEgYnVmZmVyIGFuZCBjb3B5IHRvIHRoZSBmaWxlIG9ubHkgaWYgZXZlcnl0aGluZyB3YXMgZmluZQorCQlUZW1wb3JhcnlCdWZmZXIgYnVmZmVyID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CisJCXRyeSB7CisJCQlzd2l0Y2ggKGh1bmsuZ2V0VHlwZSgpKSB7CisJCQljYXNlIExJVEVSQUxfREVGTEFURUQ6CisJCQkJLy8gVGhpcyBqdXN0IG92ZXJ3cml0ZXMgdGhlIGZpbGUuIFdlIG5lZWQgdG8gY2hlY2sgdGhlIGhhc2ggb2YKKwkJCQkvLyB0aGUgYmFzZS4KKwkJCQljaGVja09pZChmaC5nZXRPbGRJZCgpLnRvT2JqZWN0SWQoKSwgaWQsIGZoLmdldENoYW5nZVR5cGUoKSwgZiwKKwkJCQkJCXBhdGgpOworCQkJCWluaXRIYXNoKGhhc2gsIGh1bmsuZ2V0U2l6ZSgpKTsKKwkJCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBidWZmZXI7CisJCQkJCQlJbnB1dFN0cmVhbSBpbmZsYXRlZCA9IG5ldyBTSEExSW5wdXRTdHJlYW0oaGFzaCwKKwkJCQkJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oCisJCQkJCQkJCQkJbmV3IEJpbmFyeUh1bmtJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCQkJCQkJaHVuay5nZXRCdWZmZXIoKSwgc3RhcnQsCisJCQkJCQkJCQkJCQkJCWxlbmd0aCkpKSkpIHsKKwkJCQkJRGlyQ2FjaGVDaGVja291dC5nZXRDb250ZW50KHJlcG9zaXRvcnksIHBhdGgsIGNoZWNrT3V0LAorCQkJCQkJCW5ldyBTdHJlYW1Mb2FkZXIoKCkgLT4gaW5mbGF0ZWQsIGh1bmsuZ2V0U2l6ZSgpKSwKKwkJCQkJCQludWxsLCBvdXQpOworCQkJCQlpZiAoIWZoLmdldE5ld0lkKCkudG9PYmplY3RJZCgpLmVxdWFscyhoYXNoLnRvT2JqZWN0SWQoKSkpIHsKKwkJCQkJCXRocm93IG5ldyBQYXRjaEFwcGx5RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5hcHBseUJpbmFyeVJlc3VsdE9pZFdyb25nLAorCQkJCQkJCQlwYXRoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJdHJ5IChJbnB1dFN0cmVhbSBidWZJbiA9IGJ1ZmZlci5vcGVuSW5wdXRTdHJlYW0oKSkgeworCQkJCQlGaWxlcy5jb3B5KGJ1ZkluLCBmLnRvUGF0aCgpLAorCQkJCQkJCVN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFTFRBX0RFRkxBVEVEOgorCQkJCS8vIFVuZm9ydHVuYXRlbHkgZGVsdGEgYXBwbGljYXRpb24gbmVlZHMgcmFuZG9tIGFjY2VzcyB0byB0aGUKKwkJCQkvLyBiYXNlIHRvIGNvbnN0cnVjdCB0aGUgcmVzdWx0LgorCQkJCWJ5dGVbXSBiYXNlOworCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXQgPSBsb2FkZXIubG9hZCgpKSB7CisJCQkJCWJhc2UgPSBJTy5yZWFkV2hvbGVTdHJlYW0oaW5wdXQsIDApLmFycmF5KCk7CisJCQkJfQorCQkJCS8vIEF0IGxlYXN0IHN0cmVhbSB0aGUgcmVzdWx0IQorCQkJCXRyeSAoQmluYXJ5RGVsdGFJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCaW5hcnlEZWx0YUlucHV0U3RyZWFtKAorCQkJCQkJYmFzZSwKKwkJCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBCaW5hcnlIdW5rSW5wdXRTdHJlYW0oCisJCQkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShodW5rLmdldEJ1ZmZlcigpLAorCQkJCQkJCQkJCXN0YXJ0LCBsZW5ndGgpKSkpKSB7CisJCQkJCWxvbmcgZmluYWxTaXplID0gaW5wdXQuZ2V0RXhwZWN0ZWRSZXN1bHRTaXplKCk7CisJCQkJCWluaXRIYXNoKGhhc2gsIGZpbmFsU2l6ZSk7CisJCQkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGJ1ZmZlcjsKKwkJCQkJCQlTSEExSW5wdXRTdHJlYW0gaGFzaGVkID0gbmV3IFNIQTFJbnB1dFN0cmVhbShoYXNoLAorCQkJCQkJCQkJaW5wdXQpKSB7CisJCQkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQocmVwb3NpdG9yeSwgcGF0aCwgY2hlY2tPdXQsCisJCQkJCQkJCW5ldyBTdHJlYW1Mb2FkZXIoKCkgLT4gaGFzaGVkLCBmaW5hbFNpemUpLCBudWxsLAorCQkJCQkJCQlvdXQpOworCQkJCQkJaWYgKCFmaC5nZXROZXdJZCgpLnRvT2JqZWN0SWQoKQorCQkJCQkJCQkuZXF1YWxzKGhhc2gudG9PYmplY3RJZCgpKSkgeworCQkJCQkJCXRocm93IG5ldyBQYXRjaEFwcGx5RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuYXBwbHlCaW5hcnlSZXN1bHRPaWRXcm9uZywKKwkJCQkJCQkJCXBhdGgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl0cnkgKElucHV0U3RyZWFtIGJ1ZkluID0gYnVmZmVyLm9wZW5JbnB1dFN0cmVhbSgpKSB7CisJCQkJCUZpbGVzLmNvcHkoYnVmSW4sIGYudG9QYXRoKCksCisJCQkJCQkJU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlidWZmZXIuZGVzdHJveSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGx5VGV4dChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBwYXRoLCBSYXdUZXh0IHJ0LAorCQkJRmlsZSBmLCBGaWxlSGVhZGVyIGZoLCBDaGVja291dE1ldGFkYXRhIGNoZWNrT3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXRjaEFwcGx5RXhjZXB0aW9uIHsKLQkJUmF3VGV4dCBydCA9IG5ldyBSYXdUZXh0KGYpOwotCQlMaXN0PFN0cmluZz4gb2xkTGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ocnQuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydC5zaXplKCk7IGkrKykKLQkJCW9sZExpbmVzLmFkZChydC5nZXRTdHJpbmcoaSkpOwotCQlMaXN0PFN0cmluZz4gbmV3TGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ob2xkTGluZXMpOworCQlMaXN0PEJ5dGVCdWZmZXI+IG9sZExpbmVzID0gbmV3IEFycmF5TGlzdDw+KHJ0LnNpemUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcnQuc2l6ZSgpOyBpKyspIHsKKwkJCW9sZExpbmVzLmFkZChydC5nZXRSYXdTdHJpbmcoaSkpOworCQl9CisJCUxpc3Q8Qnl0ZUJ1ZmZlcj4gbmV3TGluZXMgPSBuZXcgQXJyYXlMaXN0PD4ob2xkTGluZXMpOwogCQlpbnQgYWZ0ZXJMYXN0SHVuayA9IDA7CiAJCWludCBsaW5lTnVtYmVyU2hpZnQgPSAwOwogCQlpbnQgbGFzdEh1bmtOZXdMaW5lID0gLTE7CkBAIC0xODIsOSArNTY4LDkgQEAKIAkJCQkJYi5sZW5ndGgpOwogCQkJUmF3VGV4dCBocnQgPSBuZXcgUmF3VGV4dChiKTsKIAotCQkJTGlzdDxTdHJpbmc+IGh1bmtMaW5lcyA9IG5ldyBBcnJheUxpc3Q8PihocnQuc2l6ZSgpKTsKKwkJCUxpc3Q8Qnl0ZUJ1ZmZlcj4gaHVua0xpbmVzID0gbmV3IEFycmF5TGlzdDw+KGhydC5zaXplKCkpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBocnQuc2l6ZSgpOyBpKyspIHsKLQkJCQlodW5rTGluZXMuYWRkKGhydC5nZXRTdHJpbmcoaSkpOworCQkJCWh1bmtMaW5lcy5hZGQoaHJ0LmdldFJhd1N0cmluZyhpKSk7CiAJCQl9CiAKIAkJCWlmIChoaC5nZXROZXdTdGFydExpbmUoKSA9PSAwKSB7CkBAIC0yNTMsOCArNjM5LDEzIEBACiAJCQlsaW5lTnVtYmVyU2hpZnQgPSBhcHBseUF0IC0gaGguZ2V0TmV3U3RhcnRMaW5lKCkgKyAxOwogCQkJaW50IHN6ID0gaHVua0xpbmVzLnNpemUoKTsKIAkJCWZvciAoaW50IGogPSAxOyBqIDwgc3o7IGorKykgewotCQkJCVN0cmluZyBodW5rTGluZSA9IGh1bmtMaW5lcy5nZXQoaik7Ci0JCQkJc3dpdGNoIChodW5rTGluZS5jaGFyQXQoMCkpIHsKKwkJCQlCeXRlQnVmZmVyIGh1bmtMaW5lID0gaHVua0xpbmVzLmdldChqKTsKKwkJCQlpZiAoIWh1bmtMaW5lLmhhc1JlbWFpbmluZygpKSB7CisJCQkJCS8vIENvbXBsZXRlbHkgZW1wdHkgbGluZTsgYWNjZXB0IGFzIGVtcHR5IGNvbnRleHQgbGluZQorCQkJCQlhcHBseUF0Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzd2l0Y2ggKGh1bmtMaW5lLmFycmF5KClbaHVua0xpbmUucG9zaXRpb24oKV0pIHsKIAkJCQljYXNlICcgJzoKIAkJCQkJYXBwbHlBdCsrOwogCQkJCQlicmVhazsKQEAgLTI2Miw3ICs2NTMsNyBAQAogCQkJCQluZXdMaW5lcy5yZW1vdmUoYXBwbHlBdCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgJysnOgotCQkJCQluZXdMaW5lcy5hZGQoYXBwbHlBdCsrLCBodW5rTGluZS5zdWJzdHJpbmcoMSkpOworCQkJCQluZXdMaW5lcy5hZGQoYXBwbHlBdCsrLCBzbGljZShodW5rTGluZSwgMSkpOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlicmVhazsKQEAgLTI3MSwzOSArNjYyLDY0IEBACiAJCQlhZnRlckxhc3RIdW5rID0gYXBwbHlBdDsKIAkJfQogCQlpZiAoIWlzTm9OZXdsaW5lQXRFbmRPZkZpbGUoZmgpKSB7Ci0JCQluZXdMaW5lcy5hZGQoIiIpOyAvLyROT04tTkxTLTEkCisJCQluZXdMaW5lcy5hZGQobnVsbCk7CiAJCX0KIAkJaWYgKCFydC5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKSkgewotCQkJb2xkTGluZXMuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJb2xkTGluZXMuYWRkKG51bGwpOwogCQl9Ci0JCWlmICghaXNDaGFuZ2VkKG9sZExpbmVzLCBuZXdMaW5lcykpIHsKLQkJCXJldHVybjsgLy8gRG9uJ3QgdG91Y2ggdGhlIGZpbGUKKwkJaWYgKG9sZExpbmVzLmVxdWFscyhuZXdMaW5lcykpIHsKKwkJCXJldHVybjsgLy8gVW5jaGFuZ2VkOyBkb24ndCB0b3VjaCB0aGUgZmlsZQogCQl9Ci0JCXRyeSAoV3JpdGVyIGZ3ID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIoZi50b1BhdGgoKSkpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBsID0gbmV3TGluZXMuaXRlcmF0b3IoKTsgbC5oYXNOZXh0KCk7KSB7Ci0JCQkJZncud3JpdGUobC5uZXh0KCkpOwotCQkJCWlmIChsLmhhc05leHQoKSkgewotCQkJCQkvLyBEb24ndCBib3RoZXIgaGFuZGxpbmcgbGluZSBlbmRpbmdzIC0gaWYgaXQgd2FzIFdpbmRvd3MsCi0JCQkJCS8vIHRoZSBcciBpcyBzdGlsbCB0aGVyZSEKLQkJCQkJZncud3JpdGUoJ1xuJyk7CisKKwkJVGVtcG9yYXJ5QnVmZmVyIGJ1ZmZlciA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOworCQl0cnkgeworCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0ID0gYnVmZmVyKSB7CisJCQkJZm9yIChJdGVyYXRvcjxCeXRlQnVmZmVyPiBsID0gbmV3TGluZXMuaXRlcmF0b3IoKTsgbAorCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJQnl0ZUJ1ZmZlciBsaW5lID0gbC5uZXh0KCk7CisJCQkJCWlmIChsaW5lID09IG51bGwpIHsKKwkJCQkJCS8vIE11c3QgYmUgdGhlIG1hcmtlciBmb3IgdGhlIGZpbmFsIG5ld2xpbmUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW91dC53cml0ZShsaW5lLmFycmF5KCksIGxpbmUucG9zaXRpb24oKSwgbGluZS5yZW1haW5pbmcoKSk7CisJCQkJCWlmIChsLmhhc05leHQoKSkgeworCQkJCQkJb3V0LndyaXRlKCdcbicpOworCQkJCQl9CiAJCQkJfQogCQkJfQorCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKKwkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQocmVwb3NpdG9yeSwgcGF0aCwgY2hlY2tPdXQsCisJCQkJCQluZXcgU3RyZWFtTG9hZGVyKGJ1ZmZlcjo6b3BlbklucHV0U3RyZWFtLAorCQkJCQkJCQlidWZmZXIubGVuZ3RoKCkpLAorCQkJCQkJbnVsbCwgb3V0cHV0KTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWJ1ZmZlci5kZXN0cm95KCk7CiAJCX0KLQkJZ2V0UmVwb3NpdG9yeSgpLmdldEZTKCkuc2V0RXhlY3V0ZShmLCBmaC5nZXROZXdNb2RlKCkgPT0gRmlsZU1vZGUuRVhFQ1VUQUJMRV9GSUxFKTsKKwkJcmVwb3NpdG9yeS5nZXRGUygpLnNldEV4ZWN1dGUoZiwKKwkJCQlmaC5nZXROZXdNb2RlKCkgPT0gRmlsZU1vZGUuRVhFQ1VUQUJMRV9GSUxFKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gY2FuQXBwbHlBdChMaXN0PFN0cmluZz4gaHVua0xpbmVzLCBMaXN0PFN0cmluZz4gbmV3TGluZXMsCi0JCQlpbnQgbGluZSkgeworCXByaXZhdGUgYm9vbGVhbiBjYW5BcHBseUF0KExpc3Q8Qnl0ZUJ1ZmZlcj4gaHVua0xpbmVzLAorCQkJTGlzdDxCeXRlQnVmZmVyPiBuZXdMaW5lcywgaW50IGxpbmUpIHsKIAkJaW50IHN6ID0gaHVua0xpbmVzLnNpemUoKTsKIAkJaW50IGxpbWl0ID0gbmV3TGluZXMuc2l6ZSgpOwogCQlpbnQgcG9zID0gbGluZTsKIAkJZm9yIChpbnQgaiA9IDE7IGogPCBzejsgaisrKSB7Ci0JCQlTdHJpbmcgaHVua0xpbmUgPSBodW5rTGluZXMuZ2V0KGopOwotCQkJc3dpdGNoIChodW5rTGluZS5jaGFyQXQoMCkpIHsKKwkJCUJ5dGVCdWZmZXIgaHVua0xpbmUgPSBodW5rTGluZXMuZ2V0KGopOworCQkJaWYgKCFodW5rTGluZS5oYXNSZW1haW5pbmcoKSkgeworCQkJCS8vIEVtcHR5IGxpbmUuIEFjY2VwdCBhcyBlbXB0eSBjb250ZXh0IGxpbmUuCisJCQkJaWYgKHBvcyA+PSBsaW1pdCB8fCBuZXdMaW5lcy5nZXQocG9zKS5oYXNSZW1haW5pbmcoKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXBvcysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3dpdGNoIChodW5rTGluZS5hcnJheSgpW2h1bmtMaW5lLnBvc2l0aW9uKCldKSB7CiAJCQljYXNlICcgJzoKIAkJCWNhc2UgJy0nOgogCQkJCWlmIChwb3MgPj0gbGltaXQKLQkJCQkJCXx8ICFuZXdMaW5lcy5nZXQocG9zKS5lcXVhbHMoaHVua0xpbmUuc3Vic3RyaW5nKDEpKSkgeworCQkJCQkJfHwgIW5ld0xpbmVzLmdldChwb3MpLmVxdWFscyhzbGljZShodW5rTGluZSwgMSkpKSB7CiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9CiAJCQkJcG9zKys7CkBAIC0zMTUsMTMgKzczMSw5IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGFuZ2VkKExpc3Q8U3RyaW5nPiBvbCwgTGlzdDxTdHJpbmc+IG5sKSB7Ci0JCWlmIChvbC5zaXplKCkgIT0gbmwuc2l6ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2wuc2l6ZSgpOyBpKyspCi0JCQlpZiAoIW9sLmdldChpKS5lcXVhbHMobmwuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOworCXByaXZhdGUgQnl0ZUJ1ZmZlciBzbGljZShCeXRlQnVmZmVyIGIsIGludCBvZmYpIHsKKwkJaW50IG5ld09mZnNldCA9IGIucG9zaXRpb24oKSArIG9mZjsKKwkJcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChiLmFycmF5KCksIG5ld09mZnNldCwgYi5saW1pdCgpIC0gbmV3T2Zmc2V0KTsKIAl9CiAKIAlwcml2YXRlIGJvb2xlYW4gaXNOb05ld2xpbmVBdEVuZE9mRmlsZShGaWxlSGVhZGVyIGZoKSB7CkBAIC0zMzAsOCArNzQyLDUxIEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJSHVua0hlYWRlciBsYXN0SHVuayA9IGh1bmtzLmdldChodW5rcy5zaXplKCkgLSAxKTsKLQkJUmF3VGV4dCBsaHJ0ID0gbmV3IFJhd1RleHQobGFzdEh1bmsuZ2V0QnVmZmVyKCkpOworCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbGFzdEh1bmsuZ2V0RW5kT2Zmc2V0KCkKKwkJCQktIGxhc3RIdW5rLmdldFN0YXJ0T2Zmc2V0KCldOworCQlTeXN0ZW0uYXJyYXljb3B5KGxhc3RIdW5rLmdldEJ1ZmZlcigpLCBsYXN0SHVuay5nZXRTdGFydE9mZnNldCgpLCBidWYsCisJCQkJMCwgYnVmLmxlbmd0aCk7CisJCVJhd1RleHQgbGhydCA9IG5ldyBSYXdUZXh0KGJ1Zik7CiAJCXJldHVybiBsaHJ0LmdldFN0cmluZyhsaHJ0LnNpemUoKSAtIDEpCiAJCQkJLmVxdWFscygiXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIpOyAvLyROT04tTkxTLTEkCiAJfQorCisJLyoqCisJICogQW4ge0BsaW5rIElucHV0U3RyZWFtfSB0aGF0IHVwZGF0ZXMgYSB7QGxpbmsgU0hBMX0gb24gZXZlcnkgYnl0ZSByZWFkLgorCSAqIFRoZSBoYXNoIGlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgcmVhZGluZyBzdGFydHMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU0hBMUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisJCXByaXZhdGUgZmluYWwgU0hBMSBoYXNoOworCisJCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47CisKKwkJU0hBMUlucHV0U3RyZWFtKFNIQTEgaGFzaCwgSW5wdXRTdHJlYW0gaW4pIHsKKwkJCXRoaXMuaGFzaCA9IGhhc2g7CisJCQl0aGlzLmluID0gaW47CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWludCBiID0gaW4ucmVhZCgpOworCQkJaWYgKGIgPj0gMCkgeworCQkJCWhhc2gudXBkYXRlKChieXRlKSBiKTsKKwkJCX0KKwkJCXJldHVybiBiOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWludCBuID0gaW4ucmVhZChiLCBvZmYsIGxlbik7CisJCQlpZiAobiA+IDApIHsKKwkJCQloYXNoLnVwZGF0ZShiLCBvZmYsIG4pOworCQkJfQorCQkJcmV0dXJuIG47CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJaW4uY2xvc2UoKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCmluZGV4IDlmNGIxZmEuLmQwOWRhMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDksIEdvb2dsZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDIxLCBKb2hhbm5lcyBFLiBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQmluYXJ5QmxvYkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKQEAgLTE2NSw2ICsxNjYsMjcgQEAKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIHJhdyB0ZXh0IGZvciBhIHNpbmdsZSBsaW5lLgorCSAqCisJICogQHBhcmFtIGkKKwkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBsaW5lIHRvIGV4dHJhY3QuIE5vdGUgdGhpcyBpcyAwLWJhc2VkLCBzbyBsaW5lCisJICogICAgICAgICAgICBudW1iZXIgMSBpcyBhY3R1YWxseSBpbmRleCAwLgorCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSBsaW5lLCB3aXRob3V0IGEgdHJhaWxpbmcgTEYsIGFzIGEKKwkgKiAgICAgICAgIHtAbGluayBCeXRlQnVmZmVyfSB0aGF0IGlzIGJhY2tlZCBieSBhIHNsaWNlIG9mIHRoZQorCSAqICAgICAgICAge0BsaW5rICNnZXRSYXdDb250ZW50KCkgcmF3IGNvbnRlbnR9LCB3aXRoIHRoZSBidWZmZXIncyBwb3NpdGlvbgorCSAqICAgICAgICAgb24gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGFuZCB0aGUgbGltaXQgYXQgdGhlIGVuZC4KKwkgKiBAc2luY2UgNS4xMgorCSAqLworCXB1YmxpYyBCeXRlQnVmZmVyIGdldFJhd1N0cmluZyhpbnQgaSkgeworCQlpbnQgcyA9IGdldFN0YXJ0KGkpOworCQlpbnQgZSA9IGdldEVuZChpKTsKKwkJaWYgKGUgPiAwICYmIGNvbnRlbnRbZSAtIDFdID09ICdcbicpIHsKKwkJCWUtLTsKKwkJfQorCQlyZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGNvbnRlbnQsIHMsIGUgLSBzKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIHRleHQgZm9yIGEgcmVnaW9uIG9mIGxpbmVzLgogCSAqCiAJICogQHBhcmFtIGJlZ2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCmluZGV4IDY3MTQ3NWUuLmM5MDRhNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCkBAIC0xNjEwLDExICsxNjEwLDkgQEAKIAkJfQogCQlpZiAocmMgIT0gMCkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG5ldyBGaWx0ZXJGYWlsZWRFeGNlcHRpb24ocmMsCi0JCQkJCWNoZWNrb3V0TWV0YWRhdGEuc211ZGdlRmlsdGVyQ29tbWFuZCwKLQkJCQkJcGF0aCwKKwkJCQkJY2hlY2tvdXRNZXRhZGF0YS5zbXVkZ2VGaWx0ZXJDb21tYW5kLCBwYXRoLAogCQkJCQlyZXN1bHQuZ2V0U3Rkb3V0KCkudG9CeXRlQXJyYXkoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpLAotCQkJCQlSYXdQYXJzZVV0aWxzLmRlY29kZShyZXN1bHQuZ2V0U3RkZXJyKCkKLQkJCQkJCQkudG9CeXRlQXJyYXkoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpKSkpOworCQkJCQlyZXN1bHQuZ2V0U3RkZXJyKCkudG9TdHJpbmcoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQppbmRleCAwOWZlMDNlLi5mZDU0OTg2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCkBAIC00MSw2ICs0MSw5IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBhTmV3T2JqZWN0SWRJc1JlcXVpcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYW5FeGNlcHRpb25PY2N1cnJlZFdoaWxlVHJ5aW5nVG9BZGRUaGVJZE9mSEVBRDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGFuU1NIU2Vzc2lvbkhhc0JlZW5BbHJlYWR5Q3JlYXRlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGFwcGx5QmluYXJ5QmFzZU9pZFdyb25nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXBwbHlCaW5hcnlPaWRUb29TaG9ydDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGFwcGx5QmluYXJ5UmVzdWx0T2lkV3Jvbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBhcHBseWluZ0NvbW1pdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGFyY2hpdmVGb3JtYXRBbHJlYWR5QWJzZW50OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYXJjaGl2ZUZvcm1hdEFscmVhZHlSZWdpc3RlcmVkOwpAQCAtNjUsNyArNjgsMTkgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGJhZFNlY3Rpb25FbnRyeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGJhZFNoYWxsb3dMaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFyZVJlcG9zaXRvcnlOb1dvcmtkaXJBbmRJbmRleDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJhc2U4NWludmFsaWRDaGFyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFzZTg1bGVuZ3RoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFzZTg1b3ZlcmZsb3c7CisJLyoqKi8gcHVibGljIFN0cmluZyBiYXNlODV0b29Mb25nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmFzZTg1dG9vU2hvcnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBiYXNlTGVuZ3RoSW5jb3JyZWN0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYmluYXJ5RGVsdGFCYXNlTGVuZ3RoTWlzbWF0Y2g7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlEZWx0YUludmFsaWRPZmZzZXQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlEZWx0YUludmFsaWRSZXN1bHRMZW5ndGg7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlIdW5rRGVjb2RlRXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlIdW5rSW52YWxpZExlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGJpbmFyeUh1bmtMaW5lVG9vU2hvcnQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBiaW5hcnlIdW5rTWlzc2luZ05ld2xpbmU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBiaXRtYXBNaXNzaW5nT2JqZWN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYml0bWFwc011c3RCZVByZXBhcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYmxhbWVOb3RDb21taXR0ZWRZZXQ7CkBAIC00NDQsMTAgKzQ1OSwxMyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9jYWxSZWZJc01pc3NpbmdPYmplY3RzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9jYWxSZXBvc2l0b3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja0NvdW50TXVzdEJlR3JlYXRlck9yRXF1YWwxOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja0FscmVhZHlIZWxkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja0Vycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja0ZhaWxlZFJldHJ5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja09uTm90Q2xvc2VkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9ja09uTm90SGVsZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGxvY2tTdHJlYW1DbG9zZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBsb2NrU3RyZWFtTXVsdGlwbGU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBsb2dJbmNvbnNpc3RlbnRGaWxldGltZURpZmY7CiAJLyoqKi8gcHVibGljIFN0cmluZyBsb2dMYXJnZXJGaWxldGltZURpZmY7CiAJLyoqKi8gcHVibGljIFN0cmluZyBsb2dTbWFsbGVyRmlsZXRpbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YQppbmRleCBiNWUzOTI3Li5mMDJjODYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEKQEAgLTEzMSwzMyArMTMxLDYgQEAKIAkJcmV0dXJuIHN0YXRzOwogCX0KIAotCS8qKiBUaHJvd24gaWYgdGhlIHVwZGF0ZSBpbmRpY2VzIGluIHRoZSBzdGFjayBhcmUgbm90IG1vbm90b25pYyAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmdGFibGVOdW1iZXJzTm90SW5jcmVhc2luZ0V4Y2VwdGlvbgotCQkJZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJU3RyaW5nIG5hbWU7Ci0KLQkJbG9uZyBsYXN0TWF4OwotCi0JCWxvbmcgbWluOwotCi0JCVJlZnRhYmxlTnVtYmVyc05vdEluY3JlYXNpbmdFeGNlcHRpb24oU3RyaW5nIG5hbWUsIGxvbmcgbGFzdE1heCwKLQkJCQlsb25nIG1pbikgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubGFzdE1heCA9IGxhc3RNYXg7Ci0JCQl0aGlzLm1pbiA9IG1pbjsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKHsgIm5scyIsICJib3hpbmciIH0pCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0JCQkJCSJSZWZ0YWJsZU51bWJlcnNOb3RJbmNyZWFzaW5nRXhjZXB0aW9uICVzOiBtaW4gJWQsIGxhc3RNYXggJWQiLAotCQkJCQluYW1lLCBtaW4sIGxhc3RNYXgpOwotCQl9Ci0JfQotCiAJLyoqCiAJICogUmVsb2FkcyB0aGUgc3RhY2ssIHBvdGVudGlhbGx5IHJldXNpbmcgb3BlbmVkIHJlZnRhYmxlUmVhZGVycy4KIAkgKgpAQCAtMTc2LDcgKzE0OSw2IEBACiAJCUxpc3Q8UmVmdGFibGVSZWFkZXI+IG5ld1RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlMaXN0PFN0YWNrRW50cnk+IG5ld1N0YWNrID0gbmV3IEFycmF5TGlzdDw+KHN0YWNrLnNpemUoKSArIDEpOwogCQl0cnkgewotCQkJUmVmdGFibGVSZWFkZXIgbGFzdCA9IG51bGw7CiAJCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKIAkJCQlTdGFja0VudHJ5IGVudHJ5ID0gbmV3IFN0YWNrRW50cnkoKTsKIAkJCQllbnRyeS5uYW1lID0gbmFtZTsKQEAgLTE5NCwxNSArMTY2LDYgQEAKIAkJCQkJbmV3VGFibGVzLmFkZCh0KTsKIAkJCQl9CiAKLQkJCQlpZiAobGFzdCAhPSBudWxsKSB7Ci0JCQkJCS8vIFRPRE86IG1vdmUgdGhpcyB0byBNZXJnZWRSZWZ0YWJsZQotCQkJCQlpZiAobGFzdC5tYXhVcGRhdGVJbmRleCgpID49IHQubWluVXBkYXRlSW5kZXgoKSkgewotCQkJCQkJdGhyb3cgbmV3IFJlZnRhYmxlTnVtYmVyc05vdEluY3JlYXNpbmdFeGNlcHRpb24obmFtZSwKLQkJCQkJCQkJbGFzdC5tYXhVcGRhdGVJbmRleCgpLCB0Lm1pblVwZGF0ZUluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWxhc3QgPSB0OwotCiAJCQkJZW50cnkucmVmdGFibGVSZWFkZXIgPSB0OwogCQkJCW5ld1N0YWNrLmFkZChlbnRyeSk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQppbmRleCAyZTBhNmRhLi43ODI2MmU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA3LCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjEsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtOTYsMTEgKzk2LDE1IEBACiAKIAlwcml2YXRlIGJvb2xlYW4gaGF2ZUxjazsKIAotCUZpbGVPdXRwdXRTdHJlYW0gb3M7CisJcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIG9zOwogCiAJcHJpdmF0ZSBib29sZWFuIG5lZWRTbmFwc2hvdDsKIAotCWJvb2xlYW4gZnN5bmM7CisJcHJpdmF0ZSBib29sZWFuIGZzeW5jOworCisJcHJpdmF0ZSBib29sZWFuIGlzQXBwZW5kOworCisJcHJpdmF0ZSBib29sZWFuIHdyaXR0ZW47CiAKIAlwcml2YXRlIEZpbGVTbmFwc2hvdCBjb21taXRTbmFwc2hvdDsKIApAQCAtMTI3LDYgKzEzMSwxMCBAQAogCSAqICAgICAgICAgICAgIGRvZXMgbm90IGhvbGQgdGhlIGxvY2suCiAJICovCiAJcHVibGljIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChoYXZlTGNrKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sb2NrQWxyZWFkeUhlbGQsIHJlZikpOworCQl9CiAJCUZpbGVVdGlscy5ta2RpcnMobGNrLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSB7CiAJCQl0b2tlbiA9IEZTLkRFVEVDVEVELmNyZWF0ZU5ld0ZpbGVBdG9taWMobGNrKTsKQEAgLTEzNCwxOCArMTQyLDE1IEBACiAJCQlMT0cuZXJyb3IoSkdpdFRleHQuZ2V0KCkuZmFpbGVkQ3JlYXRlTG9ja0ZpbGUsIGxjaywgZSk7CiAJCQl0aHJvdyBlOwogCQl9Ci0JCWlmICh0b2tlbi5pc0NyZWF0ZWQoKSkgeworCQlib29sZWFuIG9idGFpbmVkTG9jayA9IHRva2VuLmlzQ3JlYXRlZCgpOworCQlpZiAob2J0YWluZWRMb2NrKSB7CiAJCQloYXZlTGNrID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsY2spOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJdW5sb2NrKCk7Ci0JCQkJdGhyb3cgaW9lOwotCQkJfQorCQkJaXNBcHBlbmQgPSBmYWxzZTsKKwkJCXdyaXR0ZW4gPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWNsb3NlVG9rZW4oKTsKIAkJfQotCQlyZXR1cm4gaGF2ZUxjazsKKwkJcmV0dXJuIG9idGFpbmVkTG9jazsKIAl9CiAKIAkvKioKQEAgLTE1OCwxMiArMTYzLDI0IEBACiAJICogICAgICAgICAgICAgZG9lcyBub3QgaG9sZCB0aGUgbG9jay4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBsb2NrRm9yQXBwZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFsb2NrKCkpCisJCWlmICghbG9jaygpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CisJCX0KIAkJY29weUN1cnJlbnRDb250ZW50KCk7CisJCWlzQXBwZW5kID0gdHJ1ZTsKKwkJd3JpdHRlbiA9IGZhbHNlOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwkvLyBGb3IgdGVzdHMgb25seQorCWJvb2xlYW4gaXNMb2NrZWQoKSB7CisJCXJldHVybiBoYXZlTGNrOworCX0KKworCXByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSBnZXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0obGNrLCBpc0FwcGVuZCk7CisJfQorCiAJLyoqCiAJICogQ29weSB0aGUgY3VycmVudCBmaWxlIGNvbnRlbnQgaW50byB0aGUgdGVtcG9yYXJ5IGZpbGUuCiAJICogPHA+CkBAIC0xODUsMzIgKzIwMiwzMSBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGNvcHlDdXJyZW50Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlcXVpcmVMb2NrKCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBnZXRTdHJlYW0oKSkgewogCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZWYpKSB7CiAJCQkJaWYgKGZzeW5jKSB7CiAJCQkJCUZpbGVDaGFubmVsIGluID0gZmlzLmdldENoYW5uZWwoKTsKIAkJCQkJbG9uZyBwb3MgPSAwOwogCQkJCQlsb25nIGNudCA9IGluLnNpemUoKTsKIAkJCQkJd2hpbGUgKDAgPCBjbnQpIHsKLQkJCQkJCWxvbmcgciA9IG9zLmdldENoYW5uZWwoKS50cmFuc2ZlckZyb20oaW4sIHBvcywgY250KTsKKwkJCQkJCWxvbmcgciA9IG91dC5nZXRDaGFubmVsKCkudHJhbnNmZXJGcm9tKGluLCBwb3MsIGNudCk7CiAJCQkJCQlwb3MgKz0gcjsKIAkJCQkJCWNudCAtPSByOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOwogCQkJCQlpbnQgcjsKLQkJCQkJd2hpbGUgKChyID0gZmlzLnJlYWQoYnVmKSkgPj0gMCkKLQkJCQkJCW9zLndyaXRlKGJ1ZiwgMCwgcik7CisJCQkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJCW91dC53cml0ZShidWYsIDAsIHIpOworCQkJCQl9CiAJCQkJfQorCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKwkJCQlpZiAocmVmLmV4aXN0cygpKSB7CisJCQkJCXRocm93IGZuZmU7CisJCQkJfQorCQkJCS8vIERvbid0IHdvcnJ5IGFib3V0IGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCBpdAorCQkJCS8vIGNvbmNlcHR1YWxseSBoYXMgbm8gY3VycmVudCBjb250ZW50IHRvIGNvcHkuCiAJCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQlpZiAocmVmLmV4aXN0cygpKSB7Ci0JCQkJdW5sb2NrKCk7Ci0JCQkJdGhyb3cgZm5mZTsKLQkJCX0KLQkJCS8vIERvbid0IHdvcnJ5IGFib3V0IGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCBpdAotCQkJLy8gY29uY2VwdHVhbGx5IGhhcyBubyBjdXJyZW50IGNvbnRlbnQgdG8gY29weS4KLQkJCS8vCiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGlvZSkgewogCQkJdW5sb2NrKCk7CiAJCQl0aHJvdyBpb2U7CkBAIC0yNTMsMTggKzI2OSwyMiBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXF1aXJlTG9jaygpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0U3RyZWFtKCkpIHsKKwkJCWlmICh3cml0dGVuKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubG9ja1N0cmVhbUNsb3NlZCwgcmVmKSk7CisJCQl9CiAJCQlpZiAoZnN5bmMpIHsKLQkJCQlGaWxlQ2hhbm5lbCBmYyA9IG9zLmdldENoYW5uZWwoKTsKKwkJCQlGaWxlQ2hhbm5lbCBmYyA9IG91dC5nZXRDaGFubmVsKCk7CiAJCQkJQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoY29udGVudCk7Ci0JCQkJd2hpbGUgKDAgPCBidWYucmVtYWluaW5nKCkpCisJCQkJd2hpbGUgKDAgPCBidWYucmVtYWluaW5nKCkpIHsKIAkJCQkJZmMud3JpdGUoYnVmKTsKKwkJCQl9CiAJCQkJZmMuZm9yY2UodHJ1ZSk7CiAJCQl9IGVsc2UgewotCQkJCW9zLndyaXRlKGNvbnRlbnQpOworCQkJCW91dC53cml0ZShjb250ZW50KTsKIAkJCX0KLQkJCW9zLmNsb3NlKCk7Ci0JCQlvcyA9IG51bGw7CisJCQl3cml0dGVuID0gdHJ1ZTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgaW9lKSB7CiAJCQl1bmxvY2soKTsKIAkJCXRocm93IGlvZTsKQEAgLTI4MywzNiArMzAzLDY3IEBACiAJcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CiAJCXJlcXVpcmVMb2NrKCk7CiAKLQkJZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKLQkJaWYgKGZzeW5jKQotCQkJb3V0ID0gQ2hhbm5lbHMubmV3T3V0cHV0U3RyZWFtKG9zLmdldENoYW5uZWwoKSk7Ci0JCWVsc2UKLQkJCW91dCA9IG9zOworCQlpZiAod3JpdHRlbiB8fCBvcyAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sb2NrU3RyZWFtTXVsdGlwbGUsIHJlZikpOworCQl9CiAKIAkJcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CisKKwkJCXByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKKworCQkJcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsKKworCQkJcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQlpZiAod3JpdHRlbikgeworCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubG9ja1N0cmVhbU11bHRpcGxlLCByZWYpKTsKKwkJCQl9CisJCQkJaWYgKG91dCA9PSBudWxsKSB7CisJCQkJCW9zID0gZ2V0U3RyZWFtKCk7CisJCQkJCWlmIChmc3luYykgeworCQkJCQkJb3V0ID0gQ2hhbm5lbHMubmV3T3V0cHV0U3RyZWFtKG9zLmdldENoYW5uZWwoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvdXQgPSBvczsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gb3V0OworCQkJfQorCiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgbywgaW50IG4pCi0JCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJb3V0LndyaXRlKGIsIG8sIG4pOworCQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvLCBpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQlnZXQoKS53cml0ZShiLCBvLCBuKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlvdXQud3JpdGUoYik7CisJCQkJZ2V0KCkud3JpdGUoYik7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJb3V0LndyaXRlKGIpOworCQkJCWdldCgpLndyaXRlKGIpOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQlpZiAoY2xvc2VkKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJY2xvc2VkID0gdHJ1ZTsKIAkJCQl0cnkgewotCQkJCQlpZiAoZnN5bmMpCi0JCQkJCQlvcy5nZXRDaGFubmVsKCkuZm9yY2UodHJ1ZSk7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCQlvcyA9IG51bGw7CisJCQkJCWlmICh3cml0dGVuKSB7CisJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxvY2tTdHJlYW1DbG9zZWQsIHJlZikpOworCQkJCQl9CisJCQkJCWlmIChvdXQgIT0gbnVsbCkgeworCQkJCQkJaWYgKGZzeW5jKSB7CisJCQkJCQkJb3MuZ2V0Q2hhbm5lbCgpLmZvcmNlKHRydWUpOworCQkJCQkJfQorCQkJCQkJb3V0LmNsb3NlKCk7CisJCQkJCQlvcyA9IG51bGw7CisJCQkJCX0KKwkJCQkJd3JpdHRlbiA9IHRydWU7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgaW9lKSB7CiAJCQkJCXVubG9jaygpOwogCQkJCQl0aHJvdyBpb2U7CkBAIC0zMjIsNyArMzczLDcgQEAKIAl9CiAKIAl2b2lkIHJlcXVpcmVMb2NrKCkgewotCQlpZiAob3MgPT0gbnVsbCkgeworCQlpZiAoIWhhdmVMY2spIHsKIAkJCXVubG9jaygpOwogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sb2NrT25Ob3RIZWxkLCByZWYpKTsKIAkJfQpAQCAtNDExLDYgKzQ2Miw4IEBACiAJCXRyeSB7CiAJCQlGaWxlVXRpbHMucmVuYW1lKGxjaywgcmVmLCBTdGFuZGFyZENvcHlPcHRpb24uQVRPTUlDX01PVkUpOwogCQkJaGF2ZUxjayA9IGZhbHNlOworCQkJaXNBcHBlbmQgPSBmYWxzZTsKKwkJCXdyaXR0ZW4gPSBmYWxzZTsKIAkJCWNsb3NlVG9rZW4oKTsKIAkJCXJldHVybiB0cnVlOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC00OTcsNiArNTUwLDggQEAKIAkJCQljbG9zZVRva2VuKCk7CiAJCQl9CiAJCX0KKwkJaXNBcHBlbmQgPSBmYWxzZTsKKwkJd3JpdHRlbiA9IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCmluZGV4IGRlNmEzNDYuLmJmOTNkNzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAxNywgR29vZ2xlIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAxNywgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMSwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtODIsMTIgKzgzLDYgQEAKICAqLwogcHVibGljIGNsYXNzIE9wZW5Tc2hDb25maWdGaWxlIGltcGxlbWVudHMgU3NoQ29uZmlnU3RvcmUgewogCi0JLyoqCi0JICogIkhvc3QiIG5hbWUgb2YgdGhlIEhvc3RFbnRyeSBmb3IgdGhlIGRlZmF1bHQgb3B0aW9ucyBiZWZvcmUgdGhlIGZpcnN0Ci0JICogaG9zdCBibG9jayBpbiBhIGNvbmZpZyBmaWxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCiAJLyoqIFRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksIGFzIGtleSBmaWxlcyBtYXkgYmUgcmVsYXRpdmUgdG8gaGVyZS4gKi8KIAlwcml2YXRlIGZpbmFsIEZpbGUgaG9tZTsKIApAQCAtMTA1LDExICsxMDAsOSBAQAogCSAqIGZ1bGx5IHJlc29sdmVkIGVudHJpZXMgY3JlYXRlZCBmcm9tIHRoYXQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgewotCQkvLyBLZXllZCBieSBwYXR0ZXJuOyBpZiBhICJIb3N0IiBsaW5lIGhhcyBtdWx0aXBsZSBwYXR0ZXJucywgd2UgZ2VuZXJhdGUKLQkJLy8gZHVwbGljYXRlIEhvc3RFbnRyeSBvYmplY3RzCi0JCU1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJTGlzdDxIb3N0RW50cnk+IGVudHJpZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAKLQkJLy8gS2V5ZWQgYnkgdXNlckBob3N0bmFtZTpwb3J0CisJCS8vIFByZXZpb3VzIGxvb2t1cHMsIGtleWVkIGJ5IHVzZXJAaG9zdG5hbWU6cG9ydAogCQlNYXA8U3RyaW5nLCBIb3N0RW50cnk+IGhvc3RzID0gbmV3IEhhc2hNYXA8PigpOwogCiAJCUBPdmVycmlkZQpAQCAtMTY1LDE0ICsxNTgsMTYgQEAKIAkJCXJldHVybiBoOwogCQl9CiAJCUhvc3RFbnRyeSBmdWxsQ29uZmlnID0gbmV3IEhvc3RFbnRyeSgpOwotCQkvLyBJbml0aWFsaXplIHdpdGggZGVmYXVsdCBlbnRyaWVzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIGJlZm9yZSB0aGUKLQkJLy8gZmlyc3QgSG9zdCBibG9jay4KLQkJZnVsbENvbmZpZy5tZXJnZShjYWNoZS5lbnRyaWVzLmdldChERUZBVUxUX05BTUUpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBIb3N0RW50cnk+IGUgOiBjYWNoZS5lbnRyaWVzLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBwYXR0ZXJuID0gZS5nZXRLZXkoKTsKLQkJCWlmIChpc0hvc3RNYXRjaChwYXR0ZXJuLCBob3N0TmFtZSkpIHsKLQkJCQlmdWxsQ29uZmlnLm1lcmdlKGUuZ2V0VmFsdWUoKSk7Ci0JCQl9CisJCUl0ZXJhdG9yPEhvc3RFbnRyeT4gZW50cmllcyA9IGNhY2hlLmVudHJpZXMuaXRlcmF0b3IoKTsKKwkJaWYgKGVudHJpZXMuaGFzTmV4dCgpKSB7CisJCQkvLyBTaG91bGQgYWx3YXlzIGhhdmUgYXQgbGVhc3QgdGhlIGZpcnN0IHRvcCBlbnRyeSBjb250YWluaW5nCisJCQkvLyBrZXktdmFsdWUgcGFpcnMgYmVmb3JlIHRoZSBmaXJzdCBIb3N0IGJsb2NrCisJCQlmdWxsQ29uZmlnLm1lcmdlKGVudHJpZXMubmV4dCgpKTsKKwkJCWVudHJpZXMuZm9yRWFjaFJlbWFpbmluZyhlbnRyeSAtPiB7CisJCQkJaWYgKGVudHJ5Lm1hdGNoZXMoaG9zdE5hbWUpKSB7CisJCQkJCWZ1bGxDb25maWcubWVyZ2UoZW50cnkpOworCQkJCX0KKwkJCX0pOwogCQl9CiAJCWZ1bGxDb25maWcuc3Vic3RpdHV0ZShob3N0TmFtZSwgcG9ydCwgdXNlck5hbWUsIGxvY2FsVXNlck5hbWUsIGhvbWUpOwogCQljYWNoZS5ob3N0cy5wdXQoY2FjaGVLZXksIGZ1bGxDb25maWcpOwpAQCAtMjA4LDIwICsyMDMsMTkgQEAKIAkJcmV0dXJuIHN0YXRlOwogCX0KIAotCXByaXZhdGUgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpCisJcHJpdmF0ZSBMaXN0PEhvc3RFbnRyeT4gcGFyc2UoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotCQlmaW5hbCBMaXN0PEhvc3RFbnRyeT4gY3VycmVudCA9IG5ldyBBcnJheUxpc3Q8Pig0KTsKLQkJU3RyaW5nIGxpbmU7CisJCWZpbmFsIExpc3Q8SG9zdEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZExpc3Q8PigpOwogCiAJCS8vIFRoZSBtYW4gcGFnZSBkb2Vzbid0IHNheSBzbywgYnV0IHRoZSBvcGVuc3NoIHBhcnNlciAocmVhZGNvbmYuYykKIAkJLy8gc3RhcnRzIG91dCBpbiBhY3RpdmUgbW9kZSBhbmQgdGh1cyBhbHdheXMgYXBwbGllcyBhbnkgbGluZXMgdGhhdAogCQkvLyBvY2N1ciBiZWZvcmUgdGhlIGZpcnN0IGhvc3QgYmxvY2suIFdlIGdhdGhlciB0aG9zZSBvcHRpb25zIGluIGEKIAkJLy8gSG9zdEVudHJ5IGZvciBERUZBVUxUX05BTUUuCiAJCUhvc3RFbnRyeSBkZWZhdWx0cyA9IG5ldyBIb3N0RW50cnkoKTsKLQkJY3VycmVudC5hZGQoZGVmYXVsdHMpOwotCQllbnRyaWVzLnB1dChERUZBVUxUX05BTUUsIGRlZmF1bHRzKTsKKwkJSG9zdEVudHJ5IGN1cnJlbnQgPSBkZWZhdWx0czsKKwkJZW50cmllcy5hZGQoZGVmYXVsdHMpOwogCisJCVN0cmluZyBsaW5lOwogCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJLy8gT3BlblNzaCBpZ25vcmVzIHRyYWlsaW5nIGNvbW1lbnRzIG9uIGEgbGluZS4gQW55dGhpbmcgYWZ0ZXIgdGhlCiAJCQkvLyBmaXJzdCAjIG9uIGEgbGluZSBpcyB0cmltbWVkIGF3YXkgKHllcywgZXZlbiBpZiB0aGUgaGFzaCBpcwpAQCAtMjQ2LDM4ICsyNDAsMTcgQEAKIAkJCVN0cmluZyBhcmdWYWx1ZSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1sxXS50cmltKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAogCiAJCQlpZiAoU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZShTc2hDb25zdGFudHMuSE9TVCwga2V5d29yZCkpIHsKLQkJCQljdXJyZW50LmNsZWFyKCk7Ci0JCQkJZm9yIChTdHJpbmcgbmFtZSA6IHBhcnNlTGlzdChhcmdWYWx1ZSkpIHsKLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gbnVsbCBzaG91bGQgbm90IG9jY3VyLCBidXQgYmV0dGVyIGJlIHNhZmUgdGhhbiBzb3JyeS4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUhvc3RFbnRyeSBjID0gZW50cmllcy5nZXQobmFtZSk7Ci0JCQkJCWlmIChjID09IG51bGwpIHsKLQkJCQkJCWMgPSBuZXcgSG9zdEVudHJ5KCk7Ci0JCQkJCQllbnRyaWVzLnB1dChuYW1lLCBjKTsKLQkJCQkJfQotCQkJCQljdXJyZW50LmFkZChjKTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChjdXJyZW50LmlzRW1wdHkoKSkgewotCQkJCS8vIFdlIHJlY2VpdmVkIGFuIG9wdGlvbiBvdXRzaWRlIG9mIGEgSG9zdCBibG9jay4gV2UKLQkJCQkvLyBkb24ndCBrbm93IHdobyB0aGlzIHNob3VsZCBtYXRjaCBhZ2FpbnN0LCBzbyBza2lwLgorCQkJCWN1cnJlbnQgPSBuZXcgSG9zdEVudHJ5KHBhcnNlTGlzdChhcmdWYWx1ZSkpOworCQkJCWVudHJpZXMuYWRkKGN1cnJlbnQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlpZiAoSG9zdEVudHJ5LmlzTGlzdEtleShrZXl3b3JkKSkgewogCQkJCUxpc3Q8U3RyaW5nPiBhcmdzID0gdmFsaWRhdGUoa2V5d29yZCwgcGFyc2VMaXN0KGFyZ1ZhbHVlKSk7Ci0JCQkJZm9yIChIb3N0RW50cnkgZW50cnkgOiBjdXJyZW50KSB7Ci0JCQkJCWVudHJ5LnNldFZhbHVlKGtleXdvcmQsIGFyZ3MpOwotCQkJCX0KKwkJCQljdXJyZW50LnNldFZhbHVlKGtleXdvcmQsIGFyZ3MpOwogCQkJfSBlbHNlIGlmICghYXJnVmFsdWUuaXNFbXB0eSgpKSB7CiAJCQkJYXJnVmFsdWUgPSB2YWxpZGF0ZShrZXl3b3JkLCBkZXF1b3RlKGFyZ1ZhbHVlKSk7Ci0JCQkJZm9yIChIb3N0RW50cnkgZW50cnkgOiBjdXJyZW50KSB7Ci0JCQkJCWVudHJ5LnNldFZhbHVlKGtleXdvcmQsIGFyZ1ZhbHVlKTsKLQkJCQl9CisJCQkJY3VycmVudC5zZXRWYWx1ZShrZXl3b3JkLCBhcmdWYWx1ZSk7CiAJCQl9CiAJCX0KIApAQCAtMzAwLDcgKzI3Myw3IEBACiAJCWludCBsZW5ndGggPSBhcmd1bWVudC5sZW5ndGgoKTsKIAkJd2hpbGUgKHN0YXJ0IDwgbGVuZ3RoKSB7CiAJCQkvLyBTa2lwIHdoaXRlc3BhY2UKLQkJCWlmIChDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYXJndW1lbnQuY2hhckF0KHN0YXJ0KSkpIHsKKwkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGFyZ3VtZW50LmNoYXJBdChzdGFydCkpKSB7CiAJCQkJc3RhcnQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTMxNSw3ICsyODgsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlpbnQgc3RvcCA9IHN0YXJ0ICsgMTsKIAkJCQl3aGlsZSAoc3RvcCA8IGxlbmd0aAotCQkJCQkJJiYgIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcihhcmd1bWVudC5jaGFyQXQoc3RvcCkpKSB7CisJCQkJCQkmJiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShhcmd1bWVudC5jaGFyQXQoc3RvcCkpKSB7CiAJCQkJCXN0b3ArKzsKIAkJCQl9CiAJCQkJcmVzdWx0LmFkZChhcmd1bWVudC5zdWJzdHJpbmcoc3RhcnQsIHN0b3ApKTsKQEAgLTM1OCwxMyArMzMxLDYgQEAKIAkJcmV0dXJuIHZhbHVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIb3N0TWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoIiEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIXBhdHRlcm5NYXRjaGVzSG9zdChwYXR0ZXJuLnN1YnN0cmluZygxKSwgbmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdHRlcm5NYXRjaGVzSG9zdChwYXR0ZXJuLCBuYW1lKTsKLQl9Ci0KIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhdHRlcm5NYXRjaGVzSG9zdChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUpIHsKIAkJaWYgKHBhdHRlcm4uaW5kZXhPZignKicpID49IDAgfHwgcGF0dGVybi5pbmRleE9mKCc/JykgPj0gMCkgewogCQkJZmluYWwgRmlsZU5hbWVNYXRjaGVyIGZuOwpAQCAtMzg5LDkgKzM1NSwxMiBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmlwV2hpdGVzcGFjZShTdHJpbmcgdmFsdWUpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcih2YWx1ZS5jaGFyQXQoaSkpKQotCQkJCWIuYXBwZW5kKHZhbHVlLmNoYXJBdChpKSk7CisJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQliLmFwcGVuZChjaCk7CisJCQl9CiAJCX0KIAkJcmV0dXJuIGIudG9TdHJpbmcoKTsKIAl9CkBAIC01MTEsNiArNDgwLDMyIEBACiAKIAkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGxpc3RPcHRpb25zOwogCisJCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHBhdHRlcm5zOworCisJCS8vIENvbnN0cnVjdG9yIHVzZWQgdG8gYnVpbGQgdGhlIG1lcmdlZCBlbnRyeTsgbmV2ZXIgbWF0Y2hlcyBhbnl0aGluZworCQlIb3N0RW50cnkoKSB7CisJCQl0aGlzLnBhdHRlcm5zID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlIb3N0RW50cnkoTGlzdDxTdHJpbmc+IHBhdHRlcm5zKSB7CisJCQl0aGlzLnBhdHRlcm5zID0gcGF0dGVybnM7CisJCX0KKworCQlib29sZWFuIG1hdGNoZXMoU3RyaW5nIGhvc3ROYW1lKSB7CisJCQlib29sZWFuIGRvZXNNYXRjaCA9IGZhbHNlOworCQkJZm9yIChTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKSB7CisJCQkJaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiISIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHBhdHRlcm5NYXRjaGVzSG9zdChwYXR0ZXJuLnN1YnN0cmluZygxKSwgaG9zdE5hbWUpKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCFkb2VzTWF0Y2gKKwkJCQkJCSYmIHBhdHRlcm5NYXRjaGVzSG9zdChwYXR0ZXJuLCBob3N0TmFtZSkpIHsKKwkJCQkJZG9lc01hdGNoID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZG9lc01hdGNoOworCQl9CisKIAkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvS2V5KFN0cmluZyBrZXkpIHsKIAkJCVN0cmluZyBrID0gQUxJQVNFUy5nZXQoa2V5KTsKIAkJCXJldHVybiBrICE9IG51bGwgPyBrIDoga2V5OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQppbmRleCBiZTU1Y2QxLi41Y2Q1YjMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQpAQCAtMTE4LDcgKzExOCw3IEBACiAJICogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZTsgZGVmaW5lcyBzaWduYXR1cmUgYWxnb3JpdGhtcyBmb3IgcHVibGljIGtleQogCSAqIGF1dGhlbnRpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuCiAJICoKLQkgKiBAc2luY2UgNS4xMQorCSAqIEBzaW5jZSA1LjExLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUyA9ICJQdWJrZXlBY2NlcHRlZEFsZ29yaXRobXMiOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCmluZGV4IDU1YjdkNjIuLjBiN2MwYTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCkBAIC01MDIsOCArNTAyLDcgQEAKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obmV3IEZpbHRlckZhaWxlZEV4Y2VwdGlvbihyYywKIAkJCQkJCWZpbHRlckNvbW1hbmQsIGdldEVudHJ5UGF0aFN0cmluZygpLAogCQkJCQkJcmVzdWx0LmdldFN0ZG91dCgpLnRvQnl0ZUFycmF5KE1BWF9FWENFUFRJT05fVEVYVF9TSVpFKSwKLQkJCQkJCVJhd1BhcnNlVXRpbHMuZGVjb2RlKHJlc3VsdC5nZXRTdGRlcnIoKQotCQkJCQkJCQkudG9CeXRlQXJyYXkoTUFYX0VYQ0VQVElPTl9URVhUX1NJWkUpKSkpOworCQkJCQkJcmVzdWx0LmdldFN0ZGVycigpLnRvU3RyaW5nKE1BWF9FWENFUFRJT05fVEVYVF9TSVpFKSkpOwogCQkJfQogCQkJcmV0dXJuIHJlc3VsdC5nZXRTdGRvdXQoKS5vcGVuSW5wdXRTdHJlYW1XaXRoQXV0b0Rlc3Ryb3koKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U4NS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U4NS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjdjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTg1LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKKworLyoqCisgKiBCYXNlLTg1IGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAc2luY2UgNS4xMgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmFzZTg1IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTkNPREUgPSAoIjAxMjM0NTY3ODkiIC8vJE5PTi1OTFMtMSQKKwkJCSsgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiAvLyROT04tTkxTLTEkCisJCQkrICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgLy8kTk9OLU5MUy0xJAorCQkJKyAiISMkJSYoKSorLTs8PT4/QF5fYHt8fX4iKSAvLyROT04tTkxTLTEkCisJCQkJCS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIERFQ09ERSA9IG5ldyBpbnRbMjU2XTsKKworCXN0YXRpYyB7CisJCUFycmF5cy5maWxsKERFQ09ERSwgLTEpOworCQlmb3IgKGludCBpID0gMDsgaSA8IEVOQ09ERS5sZW5ndGg7IGkrKykgeworCQkJREVDT0RFW0VOQ09ERVtpXV0gPSBpOworCQl9CisJfQorCisJcHJpdmF0ZSBCYXNlODUoKSB7CisJCS8vIE5vIGluc3RhbnRpYXRpb24KKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIGJhc2UtODUgZW5jb2RpbmcgZm9yIHtAY29kZSByYXdMZW5ndGh9CisJICogYnl0ZXMuCisJICoKKwkgKiBAcGFyYW0gcmF3TGVuZ3RoCisJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jb2RlCisJICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGZvciB0aGUgYmFzZS04NSBlbmNvZGluZyBvZgorCSAqICAgICAgICAge0Bjb2RlIHJhd0xlbmd0aH0gYnl0ZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBlbmNvZGVkTGVuZ3RoKGludCByYXdMZW5ndGgpIHsKKwkJcmV0dXJuIChyYXdMZW5ndGggKyAzKSAvIDQgKiA1OworCX0KKworCS8qKgorCSAqIEVuY29kZXMgdGhlIGdpdmVuIHtAY29kZSBkYXRhfSBpbiBCYXNlLTg1LgorCSAqCisJICogQHBhcmFtIGRhdGEKKwkgKiAgICAgICAgICAgIHRvIGVuY29kZQorCSAqIEByZXR1cm4gZW5jb2RlZCBkYXRhCisJICovCisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKGJ5dGVbXSBkYXRhKSB7CisJCXJldHVybiBlbmNvZGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworCX0KKworCS8qKgorCSAqIEVuY29kZXMge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgb2Yge0Bjb2RlIGRhdGF9IGluIEJhc2UtODUsIGJlZ2lubmluZyBhdCB0aGUKKwkgKiB7QGNvZGUgc3RhcnR9IGluZGV4LgorCSAqCisJICogQHBhcmFtIGRhdGEKKwkgKiAgICAgICAgICAgIHRvIGVuY29kZQorCSAqIEBwYXJhbSBzdGFydAorCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gZW5jb2RlCisJICogQHBhcmFtIGxlbmd0aAorCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGVuY29kZQorCSAqIEByZXR1cm4gZW5jb2RlZCBkYXRhCisJICovCisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKwkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuY29kZWRMZW5ndGgobGVuZ3RoKV07CisJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKKwkJaW50IGluID0gc3RhcnQ7CisJCWludCBvdXQgPSAwOworCQl3aGlsZSAoaW4gPCBlbmQpIHsKKwkJCS8vIEFjY3VtdWxhdGUgcmVtYWluaW5nIGJ5dGVzIE1TQiBmaXJzdCBhcyBhIDMyYml0IHZhbHVlCisJCQlsb25nIGFjY3VtdWxhdG9yID0gKChsb25nKSAoZGF0YVtpbisrXSAmIDB4RkYpKSA8PCAyNDsKKwkJCWlmIChpbiA8IGVuZCkgeworCQkJCWFjY3VtdWxhdG9yIHw9IChkYXRhW2luKytdICYgMHhGRikgPDwgMTY7CisJCQkJaWYgKGluIDwgZW5kKSB7CisJCQkJCWFjY3VtdWxhdG9yIHw9IChkYXRhW2luKytdICYgMHhGRikgPDwgODsKKwkJCQkJaWYgKGluIDwgZW5kKSB7CisJCQkJCQlhY2N1bXVsYXRvciB8PSAoZGF0YVtpbisrXSAmIDB4RkYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gV3JpdGUgdGhlIDMyYml0IHZhbHVlIGluIGJhc2UtODUgZW5jb2RpbmcsIGFsc28gTVNCIGZpcnN0CisJCQlmb3IgKGludCBpID0gNDsgaSA+PSAwOyBpLS0pIHsKKwkJCQlyZXN1bHRbb3V0ICsgaV0gPSBFTkNPREVbKGludCkgKGFjY3VtdWxhdG9yICUgODUpXTsKKwkJCQlhY2N1bXVsYXRvciAvPSA4NTsKKwkJCX0KKwkJCW91dCArPSA1OworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogRGVjb2RlcyB0aGUgQmFzZS04NSB7QGNvZGUgZW5jb2RlZH0gZGF0YSBpbnRvIGEgYnl0ZSBhcnJheSBvZgorCSAqIHtAY29kZSBleHBlY3RlZFNpemV9IGJ5dGVzLgorCSAqCisJICogQHBhcmFtIGVuY29kZWQKKwkgKiAgICAgICAgICAgIEJhc2UtODUgZW5jb2RlZCBkYXRhCisJICogQHBhcmFtIGV4cGVjdGVkU2l6ZQorCSAqICAgICAgICAgICAgb2YgdGhlIHJlc3VsdAorCSAqIEByZXR1cm4gdGhlIGRlY29kZWQgYnl0ZXMKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIGV4cGVjdGVkU2l6ZSBkb2Vzbid0IG1hdGNoLCB0aGUgZW5jb2RlZCBkYXRhIGhhcyBhIGxlbmd0aAorCSAqICAgICAgICAgICAgIHRoYXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgNSwgb3IgdGhlcmUgYXJlIGludmFsaWQgY2hhcmFjdGVycworCSAqICAgICAgICAgICAgIGluIHRoZSBlbmNvZGVkIGRhdGEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGVuY29kZWQsIGludCBleHBlY3RlZFNpemUpIHsKKwkJcmV0dXJuIGRlY29kZShlbmNvZGVkLCAwLCBlbmNvZGVkLmxlbmd0aCwgZXhwZWN0ZWRTaXplKTsKKwl9CisKKwkvKioKKwkgKiBEZWNvZGVzIHtAY29kZSBsZW5ndGh9IGJ5dGVzIG9mIEJhc2UtODUge0Bjb2RlIGVuY29kZWR9IGRhdGEsIGJlZ2lubmluZworCSAqIGF0IHRoZSB7QGNvZGUgc3RhcnR9IGluZGV4LCBpbnRvIGEgYnl0ZSBhcnJheSBvZiB7QGNvZGUgZXhwZWN0ZWRTaXplfQorCSAqIGJ5dGVzLgorCSAqCisJICogQHBhcmFtIGVuY29kZWQKKwkgKiAgICAgICAgICAgIEJhc2UtODUgZW5jb2RlZCBkYXRhCisJICogQHBhcmFtIHN0YXJ0CisJICogICAgICAgICAgICBpbmRleCBhdCB3aGljaCB0aGUgZGF0YSB0byBkZWNvZGUgc3RhcnRzIGluIHtAY29kZSBlbmNvZGVkfQorCSAqIEBwYXJhbSBsZW5ndGgKKwkgKiAgICAgICAgICAgIG9mIHRoZSBCYXNlLTg1IGVuY29kZWQgZGF0YQorCSAqIEBwYXJhbSBleHBlY3RlZFNpemUKKwkgKiAgICAgICAgICAgIG9mIHRoZSByZXN1bHQKKwkgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJ5dGVzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBleHBlY3RlZFNpemUgZG9lc24ndCBtYXRjaCwge0Bjb2RlIGxlbmd0aH0gaXMgbm90IGEKKwkgKiAgICAgICAgICAgICBtdWx0aXBsZSBvZiA1LCBvciB0aGVyZSBhcmUgaW52YWxpZCBjaGFyYWN0ZXJzIGluIHRoZSBlbmNvZGVkCisJICogICAgICAgICAgICAgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShieXRlW10gZW5jb2RlZCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorCQkJaW50IGV4cGVjdGVkU2l6ZSkgeworCQlpZiAobGVuZ3RoICUgNSAhPSAwKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmJhc2U4NWxlbmd0aCk7CisJCX0KKwkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2V4cGVjdGVkU2l6ZV07CisJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKKwkJaW50IGluID0gc3RhcnQ7CisJCWludCBvdXQgPSAwOworCQl3aGlsZSAoaW4gPCBlbmQgJiYgb3V0IDwgZXhwZWN0ZWRTaXplKSB7CisJCQkvLyBBY2N1bXVsYXRlIDUgYnl0ZXMsICJNU0IiIGZpcnN0CisJCQlsb25nIGFjY3VtdWxhdG9yID0gMDsKKwkJCWZvciAoaW50IGkgPSA0OyBpID49IDA7IGktLSkgeworCQkJCWludCB2YWwgPSBERUNPREVbZW5jb2RlZFtpbisrXSAmIDB4RkZdOworCQkJCWlmICh2YWwgPCAwKSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuYmFzZTg1aW52YWxpZENoYXIsCisJCQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhlbmNvZGVkW2luIC0gMV0gJiAweEZGKSkpOworCQkJCX0KKwkJCQlhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogODUgKyB2YWw7CisJCQl9CisJCQlpZiAoYWNjdW11bGF0b3IgPiAweEZGRkZfRkZGRkwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYmFzZTg1b3ZlcmZsb3csCisJCQkJCQkJCUxvbmcudG9IZXhTdHJpbmcoYWNjdW11bGF0b3IpKSk7CisJCQl9CisJCQkvLyBXcml0ZSByZW1haW5pbmcgYnl0ZXMsIE1TQiBmaXJzdAorCQkJcmVzdWx0W291dCsrXSA9IChieXRlKSAoYWNjdW11bGF0b3IgPj4+IDI0KTsKKwkJCWlmIChvdXQgPCBleHBlY3RlZFNpemUpIHsKKwkJCQlyZXN1bHRbb3V0KytdID0gKGJ5dGUpIChhY2N1bXVsYXRvciA+Pj4gMTYpOworCQkJCWlmIChvdXQgPCBleHBlY3RlZFNpemUpIHsKKwkJCQkJcmVzdWx0W291dCsrXSA9IChieXRlKSAoYWNjdW11bGF0b3IgPj4+IDgpOworCQkJCQlpZiAob3V0IDwgZXhwZWN0ZWRTaXplKSB7CisJCQkJCQlyZXN1bHRbb3V0KytdID0gKGJ5dGUpIGFjY3VtdWxhdG9yOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIFNob3VsZCBoYXZlIGV4aGF1c3RlZCAnaW4nIGFuZCBmaWxsZWQgJ291dCcgY29tcGxldGVseQorCQlpZiAoaW4gPCBlbmQpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmJhc2U4NXRvb0xvbmcsCisJCQkJCQkJSW50ZWdlci52YWx1ZU9mKGV4cGVjdGVkU2l6ZSkpKTsKKwkJfQorCQlpZiAob3V0IDwgZXhwZWN0ZWRTaXplKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5iYXNlODV0b29TaG9ydCwKKwkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YoZXhwZWN0ZWRTaXplKSkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IDU2MmViMDUuLmZiODkzYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbmNoZWNrZWRJT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKQEAgLTIxMyw2ICsyMTQsMjQgQEAKIAl9CiAKIAkvKioKKwkgKiBDb252ZXJ0IGZpcnN0IHtAY29kZSBsaW1pdH0gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBidWZmZXIgY29udGVudCB0bworCSAqIFN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBsaW1pdAorCSAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvbnZlcnRlZCB0byBTdHJpbmcKKwkgKiBAcmV0dXJuIGZpcnN0IHtAY29kZSBsaW1pdH0gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBidWZmZXIgY29udGVudAorCSAqICAgICAgICAgY29udmVydGVkIHRvIFN0cmluZy4KKwkgKiBAc2luY2UgNS4xMgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGxpbWl0KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUodG9CeXRlQXJyYXkobGltaXQpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFVuY2hlY2tlZElPRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCiAJICogQ29udmVydCB0aGlzIGJ1ZmZlcidzIGNvbnRlbnRzIGludG8gYSBjb250aWd1b3VzIGJ5dGUgYXJyYXkuIElmIHRoaXMgc2l6ZQogCSAqIG9mIHRoZSBidWZmZXIgZXhjZWVkcyB0aGUgbGltaXQgb25seSByZXR1cm4gdGhlIGZpcnN0IHtAY29kZSBsaW1pdH0gYnl0ZXMKIAkgKiA8cD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlEZWx0YUlucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5RGVsdGFJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGQ4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5RGVsdGFJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworCisvKioKKyAqIEFuIHtAbGluayBJbnB1dFN0cmVhbX0gdGhhdCBhcHBsaWVzIGEgYmluYXJ5IGRlbHRhIHRvIGEgYmFzZSBvbiB0aGUgZmx5LgorICogPHA+CisgKiBEZWx0YSBhcHBsaWNhdGlvbiB0byBhIGJhc2UgbmVlZHMgcmFuZG9tIGFjY2VzcyB0byB0aGUgYmFzZSBkYXRhLiBUaGUgZGVsdGEKKyAqIGlzIGV4cHJlc3NlZCBhcyBhIHNlcXVlbmNlIG9mIGNvcHkgYW5kIGluc2VydCBpbnN0cnVjdGlvbnMuIEEgY29weQorICogaW5zdHJ1Y3Rpb24gaGFzIHRoZSBmb3JtICJDT1BZIGZyb21PZmZzZXQgbGVuZ3RoIiBhbmQgc2F5cyAiY29weSBsZW5ndGggYnl0ZXMKKyAqIGZyb20gdGhlIGJhc2UsIHN0YXJ0aW5nIGF0IG9mZnNldCBmcm9tT2Zmc2V0LCB0byB0aGUgcmVzdWx0Ii4gQW4gaW5zZXJ0CisgKiBpbnN0cnVjdGlvbiBoYXMgdGhlIGZvcm0gIklOU0VSVCBsZW5ndGgiIGZvbGxvd2VkIGJ5IGxlbmd0aCBieXRlcyBhbmQgc2F5cworICogImNvcHkgdGhlIG5leHQgbGVuZ3RoIGJ5dGVzIGZyb20gdGhlIGRlbHRhIHRvIHRoZSByZXN1bHQiLgorICogPC9wPgorICogPHA+CisgKiBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIGNvbnRlbnQtZGVmaW5lZCBjaHVua2luZyBhbGdvcml0aG0KKyAqIChjdXJyZW50bHkgQyBnaXQgdXNlcyB0aGUgc3RhbmRhcmQgUmFiaW4gdmFyaWFudDsgYnV0IHRoZXJlIGFyZSBvdGhlcnMgdGhhdAorICogY291bGQgYmUgdXNlZCkgdGhhdCBpZGVudGlmaWVzIGVxdWFsIGNodW5rcy4gSXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBhCisgKiBsYXRlciBjb3B5IGluc3RydWN0aW9uIGhhcyBhIGZyb21PZmZzZXQgdGhhdCBpcyBiZWZvcmUgdGhlIGZyb21PZmZzZXQgb2YgYW4KKyAqIGVhcmxpZXIgY29weSBpbnN0cnVjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHN0cmVhbSB0aGUgYmFzZS4KKyAqIDwvcD4KKyAqIDxwPgorICogSkdpdCBpcyBsaW1pdGVkIHRvIDJHQiBtYXhpbXVtIHNpemUgZm9yIHRoZSBiYXNlIHNpbmNlIGFycmF5IGluZGljZXMgYXJlCisgKiBzaWduZWQgMzJiaXQgdmFsdWVzLgorICoKKyAqIEBzaW5jZSA1LjEyCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlEZWx0YUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisJcHJpdmF0ZSBmaW5hbCBieXRlW10gYmFzZTsKKworCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gZGVsdGE7CisKKwlwcml2YXRlIGxvbmcgcmVzdWx0TGVuZ3RoOworCisJcHJpdmF0ZSBsb25nIHRvRGVsaXZlciA9IC0xOworCisJcHJpdmF0ZSBpbnQgZnJvbUJhc2U7CisKKwlwcml2YXRlIGludCBmcm9tRGVsdGE7CisKKwlwcml2YXRlIGludCBiYXNlT2Zmc2V0ID0gLTE7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBCaW5hcnlEZWx0YUlucHV0U3RyZWFtfSB0aGF0IGFwcGxpZXMge0Bjb2RlIGRlbHRhfQorCSAqIHRvIHtAY29kZSBiYXNlfS4KKwkgKgorCSAqIEBwYXJhbSBiYXNlCisJICogICAgICAgICAgICBkYXRhIHRvIGFwcGx5IHRoZSBkZWx0YSB0bworCSAqIEBwYXJhbSBkZWx0YQorCSAqICAgICAgICAgICAge0BsaW5rIElucHV0U3RyZWFtfSBkZWxpdmVyaW5nIHRoZSBkZWx0YSB0byBhcHBseQorCSAqLworCXB1YmxpYyBCaW5hcnlEZWx0YUlucHV0U3RyZWFtKGJ5dGVbXSBiYXNlLCBJbnB1dFN0cmVhbSBkZWx0YSkgeworCQl0aGlzLmJhc2UgPSBiYXNlOworCQl0aGlzLmRlbHRhID0gZGVsdGE7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGIgPSByZWFkTmV4dCgpOworCQlpZiAoYiA+PSAwKSB7CisJCQl0b0RlbGl2ZXItLTsKKwkJfQorCQlyZXR1cm4gYjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWxvbmcgYmFzZVNpemUgPSByZWFkVmFySW50KGRlbHRhKTsKKwkJaWYgKGJhc2VTaXplID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgYmFzZVNpemUgPCAwCisJCQkJfHwgKGludCkgYmFzZVNpemUgIT0gYmFzZS5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5RGVsdGFCYXNlTGVuZ3RoTWlzbWF0Y2gsCisJCQkJCUludGVnZXIudmFsdWVPZihiYXNlLmxlbmd0aCksIExvbmcudmFsdWVPZihiYXNlU2l6ZSkpKTsKKwkJfQorCQlyZXN1bHRMZW5ndGggPSByZWFkVmFySW50KGRlbHRhKTsKKwkJaWYgKHJlc3VsdExlbmd0aCA8IDApIHsKKwkJCXRocm93IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oCisJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeURlbHRhSW52YWxpZFJlc3VsdExlbmd0aCk7CisJCX0KKwkJdG9EZWxpdmVyID0gcmVzdWx0TGVuZ3RoOworCQliYXNlT2Zmc2V0ID0gMDsKKwl9CisKKwlwcml2YXRlIGludCByZWFkTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChiYXNlT2Zmc2V0IDwgMCkgeworCQkJaW5pdGlhbGl6ZSgpOworCQl9CisJCWlmIChmcm9tQmFzZSA+IDApIHsKKwkJCWZyb21CYXNlLS07CisJCQlyZXR1cm4gYmFzZVtiYXNlT2Zmc2V0KytdICYgMHhGRjsKKwkJfSBlbHNlIGlmIChmcm9tRGVsdGEgPiAwKSB7CisJCQlmcm9tRGVsdGEtLTsKKwkJCXJldHVybiBkZWx0YS5yZWFkKCk7CisJCX0KKwkJaW50IGNvbW1hbmQgPSBkZWx0YS5yZWFkKCk7CisJCWlmIChjb21tYW5kIDwgMCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICgoY29tbWFuZCAmIDB4ODApICE9IDApIHsKKwkJCS8vIERlY29kZSBvZmZzZXQgYW5kIGxlbmd0aCB0byByZWFkIGZyb20gYmFzZQorCQkJbG9uZyBjb3B5T2Zmc2V0ID0gMDsKKwkJCWZvciAoaW50IGkgPSAxLCBzaGlmdCA9IDA7IGkgPCAweDEwOyBpICo9IDIsIHNoaWZ0ICs9IDgpIHsKKwkJCQlpZiAoKGNvbW1hbmQgJiBpKSAhPSAwKSB7CisJCQkJCWNvcHlPZmZzZXQgfD0gKChsb25nKSBuZXh0KGRlbHRhKSkgPDwgc2hpZnQ7CisJCQkJfQorCQkJfQorCQkJaW50IGNvcHlTaXplID0gMDsKKwkJCWZvciAoaW50IGkgPSAweDEwLCBzaGlmdCA9IDA7IGkgPCAweDgwOyBpICo9IDIsIHNoaWZ0ICs9IDgpIHsKKwkJCQlpZiAoKGNvbW1hbmQgJiBpKSAhPSAwKSB7CisJCQkJCWNvcHlTaXplIHw9IG5leHQoZGVsdGEpIDw8IHNoaWZ0OworCQkJCX0KKwkJCX0KKwkJCWlmIChjb3B5U2l6ZSA9PSAwKSB7CisJCQkJY29weVNpemUgPSAweDEwMDAwOworCQkJfQorCQkJaWYgKGNvcHlPZmZzZXQgPiBiYXNlLmxlbmd0aCAtIGNvcHlTaXplKSB7CisJCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeURlbHRhSW52YWxpZE9mZnNldCwKKwkJCQkJCUxvbmcudmFsdWVPZihjb3B5T2Zmc2V0KSwgSW50ZWdlci52YWx1ZU9mKGNvcHlTaXplKSkpOworCQkJfQorCQkJYmFzZU9mZnNldCA9IChpbnQpIGNvcHlPZmZzZXQ7CisJCQlmcm9tQmFzZSA9IGNvcHlTaXplOworCQkJcmV0dXJuIHJlYWROZXh0KCk7CisJCX0gZWxzZSBpZiAoY29tbWFuZCAhPSAwKSB7CisJCQkvLyBUaGUgbmV4dCAnY29tbWFuZCcgYnl0ZXMgY29tZSBmcm9tIHRoZSBkZWx0YQorCQkJZnJvbURlbHRhID0gY29tbWFuZCAtIDE7CisJCQlyZXR1cm4gZGVsdGEucmVhZCgpOworCQl9IGVsc2UgeworCQkJLy8gWmVybyBpcyByZXNlcnZlZAorCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbigKKwkJCQkJSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRDb21tYW5kMCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGludCBuZXh0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJaWYgKGIgPCAwKSB7CisJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIGI7CisJfQorCisJcHJpdmF0ZSBsb25nIHJlYWRWYXJJbnQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWxvbmcgdmFsID0gMDsKKwkJaW50IHNoaWZ0ID0gMDsKKwkJaW50IGI7CisJCWRvIHsKKwkJCWIgPSBuZXh0KGluKTsKKwkJCXZhbCB8PSAoKGxvbmcpIChiICYgMHg3ZikpIDw8IHNoaWZ0OworCQkJc2hpZnQgKz0gNzsKKwkJfSB3aGlsZSAoKGIgJiAweDgwKSAhPSAwKTsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgZmluYWwgcmVzdWx0LgorCSAqCisJICogQHJldHVybiB0aGUgc2l6ZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHtAY29kZSBkZWx0YX0KKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRFeHBlY3RlZFJlc3VsdFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYmFzZU9mZnNldCA8IDApIHsKKwkJCWluaXRpYWxpemUoKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0TGVuZ3RoOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhlIGRlbHRhIGhhcyBiZWVuIGZ1bGx5IGNvbnN1bWVkLCBhbmQgdGhlIGV4cGVjdGVkIG51bWJlcgorCSAqIG9mIGJ5dGVzIGZvciB0aGUgY29tYmluZWQgcmVzdWx0IGhhdmUgYmVlbiByZWFkIGZyb20gdGhpcworCSAqIHtAbGluayBCaW5hcnlEZWx0YUlucHV0U3RyZWFtfS4KKwkgKgorCSAqIEByZXR1cm4gd2hldGhlciBkZWx0YSBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRnVsbHlDb25zdW1lZCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0b0RlbGl2ZXIgPT0gMCAmJiBkZWx0YS5yZWFkKCkgPCAwOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gdG9EZWxpdmVyID09IDA7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWRlbHRhLmNsb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjJkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkJhc2U4NTsKKworLyoqCisgKiBBIHN0cmVhbSB0aGF0IGRlY29kZXMgZ2l0IGJpbmFyeSBwYXRjaCBkYXRhIG9uIHRoZSBmbHkuCisgKgorICogQHNpbmNlIDUuMTIKKyAqLworcHVibGljIGNsYXNzIEJpbmFyeUh1bmtJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47CisKKwlwcml2YXRlIGludCBsaW5lTnVtYmVyOworCisJcHJpdmF0ZSBieXRlW10gYnVmZmVyOworCisJcHJpdmF0ZSBpbnQgcG9zID0gMDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEJpbmFyeUh1bmtJbnB1dFN0cmVhbX0uCisJICoKKwkgKiBAcGFyYW0gaW4KKwkgKiAgICAgICAgICAgIHtAbGluayBJbnB1dFN0cmVhbX0gdG8gcmVhZCB0aGUgYmFzZS04NSBlbmNvZGVkIHBhdGNoIGRhdGEKKwkgKiAgICAgICAgICAgIGZyb20KKwkgKi8KKwlwdWJsaWMgQmluYXJ5SHVua0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisJCXRoaXMuaW4gPSBpbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAocG9zIDwgMCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChidWZmZXIgPT0gbnVsbCB8fCBwb3MgPT0gYnVmZmVyLmxlbmd0aCkgeworCQkJZmlsbEJ1ZmZlcigpOworCQl9CisJCWlmIChwb3MgPj0gMCkgeworCQkJcmV0dXJuIGJ1ZmZlcltwb3MrK10gJiAweEZGOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluLmNsb3NlKCk7CisJCWJ1ZmZlciA9IG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgbGVuZ3RoID0gaW4ucmVhZCgpOworCQlpZiAobGVuZ3RoIDwgMCkgeworCQkJcG9zID0gbGVuZ3RoOworCQkJYnVmZmVyID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQlsaW5lTnVtYmVyKys7CisJCS8vIExlbmd0aCBpcyBlbmNvZGVkIHdpdGggY2hhcmFjdGVycywgQS4uWiBmb3IgMS4uMjYgYW5kIGEuLnogZm9yIDI3Li41MgorCQlpZiAoJ0EnIDw9IGxlbmd0aCAmJiBsZW5ndGggPD0gJ1onKSB7CisJCQlsZW5ndGggPSBsZW5ndGggLSAnQScgKyAxOworCQl9IGVsc2UgaWYgKCdhJyA8PSBsZW5ndGggJiYgbGVuZ3RoIDw9ICd6JykgeworCQkJbGVuZ3RoID0gbGVuZ3RoIC0gJ2EnICsgMjc7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlIdW5rSW52YWxpZExlbmd0aCwKKwkJCQkJSW50ZWdlci52YWx1ZU9mKGxpbmVOdW1iZXIpLCBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxlbmd0aCkpKTsKKwkJfQorCQlieXRlW10gZW5jb2RlZCA9IG5ldyBieXRlW0Jhc2U4NS5lbmNvZGVkTGVuZ3RoKGxlbmd0aCldOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpKyspIHsKKwkJCWludCBiID0gaW4ucmVhZCgpOworCQkJaWYgKGIgPCAwIHx8IGIgPT0gJ1xuJykgeworCQkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlIdW5rSW52YWxpZExlbmd0aCwKKwkJCQkJCUludGVnZXIudmFsdWVPZihsaW5lTnVtYmVyKSkpOworCQkJfQorCQkJZW5jb2RlZFtpXSA9IChieXRlKSBiOworCQl9CisJCS8vIE11c3QgYmUgZm9sbG93ZWQgYnkgYSBuZXdsaW5lOyB0b2xlcmF0ZSBFT0YuCisJCWludCBiID0gaW4ucmVhZCgpOworCQlpZiAoYiA+PSAwICYmIGIgIT0gJ1xuJykgeworCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua01pc3NpbmdOZXdsaW5lLAorCQkJCQlJbnRlZ2VyLnZhbHVlT2YobGluZU51bWJlcikpKTsKKwkJfQorCQl0cnkgeworCQkJYnVmZmVyID0gQmFzZTg1LmRlY29kZShlbmNvZGVkLCBsZW5ndGgpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uIGV4ID0gbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua0RlY29kZUVycm9yLAorCQkJCQkJCUludGVnZXIudmFsdWVPZihsaW5lTnVtYmVyKSkpOworCQkJZXguaW5pdENhdXNlKGUpOworCQkJdGhyb3cgZXg7CisJCX0KKwkJcG9zID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua091dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU1MWMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlODU7CisKKy8qKgorICogQW4ge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhhdCBlbmNvZGVzIGRhdGEgZm9yIGEgZ2l0IGJpbmFyeSBwYXRjaC4KKyAqCisgKiBAc2luY2UgNS4xMgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5SHVua091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JZVEVTID0gNTI7CisKKwlwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CisKKwlwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtNQVhfQllURVNdOworCisJcHJpdmF0ZSBpbnQgcG9zOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQmluYXJ5SHVua091dHB1dFN0cmVhbX0uCisJICoKKwkgKiBAcGFyYW0gb3V0CisJICogICAgICAgICAgICB7QGxpbmsgT3V0cHV0U3RyZWFtfSB0byB3cml0ZSB0aGUgZW5jb2RlZCBkYXRhIHRvCisJICovCisJcHVibGljIEJpbmFyeUh1bmtPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgeworCQl0aGlzLm91dCA9IG91dDsKKwl9CisKKwkvKioKKwkgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhpcyBzdHJlYW0sIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcKKwkgKiB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZsdXNoKCk7CisJCW91dC5jbG9zZSgpOworCX0KKworCS8qKgorCSAqIFdyaXRlcyBhbnkgYnVmZmVyZWQgb3V0cHV0IGFzIGEgYmluYXJ5IHBhdGNoIGxpbmUgdG8gdGhlIHVuZGVybHlpbmcKKwkgKiB7QGxpbmsgT3V0cHV0U3RyZWFtfSBhbmQgZmx1c2hlcyB0aGF0IHN0cmVhbSwgdG9vLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHBvcyA+IDApIHsKKwkJCWVuY29kZShidWZmZXIsIDAsIHBvcyk7CisJCQlwb3MgPSAwOworCQl9CisJCW91dC5mbHVzaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlidWZmZXJbcG9zKytdID0gKGJ5dGUpIGI7CisJCWlmIChwb3MgPT0gYnVmZmVyLmxlbmd0aCkgeworCQkJZW5jb2RlKGJ1ZmZlciwgMCwgcG9zKTsKKwkJCXBvcyA9IDA7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHRvQ29weSA9IGxlbjsKKwkJaW50IGluID0gb2ZmOworCQlpZiAocG9zID4gMCkgeworCQkJLy8gRmlsbCB0aGUgYnVmZmVyCisJCQlpbnQgY2h1bmsgPSBNYXRoLm1pbih0b0NvcHksIGJ1ZmZlci5sZW5ndGggLSBwb3MpOworCQkJU3lzdGVtLmFycmF5Y29weShiLCBpbiwgYnVmZmVyLCBwb3MsIGNodW5rKTsKKwkJCWluICs9IGNodW5rOworCQkJcG9zICs9IGNodW5rOworCQkJdG9Db3B5IC09IGNodW5rOworCQkJaWYgKHBvcyA9PSBidWZmZXIubGVuZ3RoKSB7CisJCQkJZW5jb2RlKGJ1ZmZlciwgMCwgcG9zKTsKKwkJCQlwb3MgPSAwOworCQkJfQorCQkJaWYgKHRvQ29weSA9PSAwKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXdoaWxlICh0b0NvcHkgPj0gTUFYX0JZVEVTKSB7CisJCQllbmNvZGUoYiwgaW4sIE1BWF9CWVRFUyk7CisJCQl0b0NvcHkgLT0gTUFYX0JZVEVTOworCQkJaW4gKz0gTUFYX0JZVEVTOworCQl9CisJCWlmICh0b0NvcHkgPiAwKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIGluLCBidWZmZXIsIDAsIHRvQ29weSk7CisJCQlwb3MgPSB0b0NvcHk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZW5jb2RlKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAobGVuZ3RoIDw9IDI2KSB7CisJCQlvdXQud3JpdGUoJ0EnICsgbGVuZ3RoIC0gMSk7CisJCX0gZWxzZSB7CisJCQlvdXQud3JpdGUoJ2EnICsgbGVuZ3RoIC0gMjcpOworCQl9CisJCW91dC53cml0ZShCYXNlODUuZW5jb2RlKGRhdGEsIG9mZiwgbGVuZ3RoKSk7CisJCW91dC53cml0ZSgnXG4nKTsKKwl9Cit9Cg==