ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCmluZGV4IDUxYzY1YTUuLjg3NjJmYTIgMTAwNjQ0Ci0tLSBhLy5jbGFzc3BhdGgKKysrIGIvLmNsYXNzcGF0aApAQCAtMSwxMSArMSwxMCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIKLSAgICAgICAgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc291cmNlcy5qYXIiIHNvdXJjZXBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXNvdXJjZXNzcmMuemlwIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc291cmNlcy5qYXIiIHNvdXJjZXBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXNvdXJjZXNzcmMuemlwIi8+CiAgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL29yZy5hcGFjaGUueGVyY2VzL3hlcmNlcy5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIgotICAgICAgICBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWUuamFyIiBzb3VyY2VwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWVzcmMuemlwIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lLmphciIgc291cmNlcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lc3JjLnppcCIvPgogICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkVjbGlwc2UgSmF2YSBBbnQgQ29tcGlsZXIiLz4KICAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIEphdmEgQmF0Y2ggQ29tcGlsZXIiLz4KICAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIEphdmEgQ29kZSBBc3Npc3QiLz4KICAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIEphdmEgQ29tcGlsZXIiLz4KQEAgLTEzLDUgKzEyLDcgQEAKICAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJFY2xpcHNlIEphdmEgRXZhbHVhdGlvbiIvPgogICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkVjbGlwc2UgSmF2YSBNb2RlbCIvPgogICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkVjbGlwc2UgSmF2YSBGb3JtYXR0ZXIiLz4KKyAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvb3JnLmVjbGlwc2UuYW50LmNvcmUvYW50LmphciIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9vcmcuZWNsaXBzZS5hbnQuY29yZS9hbnRzdXBwb3J0LmphciIgc291cmNlcGF0aD0iL29yZy5lY2xpcHNlLmFudC5jb3JlL2FudHN1cHBvcnRzcmMuemlwIi8+CiAgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+CiA8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YSBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQppbmRleCA2ZDFlNTVjLi45NTk0ODBmIDEwMDY0NAotLS0gYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKKysrIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCkBAIC03NSw2ICs3NSw2IEBACiAJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIobmV3IENvbXBpbGF0aW9uVW5pdChudWxsLCBmdWxsTmFtZSkpOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIkNsYXNzcGF0aERpcmVjdG9yeSAiLypub25OTFMqLyArIHBhdGg7DQorCXJldHVybiAiQ2xhc3NwYXRoRGlyZWN0b3J5ICIgKyBwYXRoOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoSmFyLmphdmEgYi9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoSmFyLmphdmEKaW5kZXggNWJkYWZkNC4uNzBjNTYzNCAxMDA2NDQKLS0tIGEvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhCisrKyBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhKYXIuamF2YQpAQCAtODAsNiArODAsNiBAQAogCX0NCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJDbGFzc3BhdGggZm9yIGphciBmaWxlICIvKm5vbk5MUyovICsgemlwRmlsZTsNCisJcmV0dXJuICJDbGFzc3BhdGggZm9yIGphciBmaWxlICIgKyB6aXBGaWxlOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggYmY3ZDVmNS4uYjIzYzg2YiAxMDA2NDQKLS0tIGEvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMTYsMTEgKzE2LDExIEBACiAJdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzOw0KIAl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWUudG9DaGFyQXJyYXkoKTsNCiANCi0JaW50IHN0YXJ0ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi8iLypub25OTFMqLykgKyAxOw0KLQlpZiAoc3RhcnQgPT0gMCB8fCBzdGFydCA8IGZpbGVOYW1lLmxhc3RJbmRleE9mKCJcXCIvKm5vbk5MUyovKSkNCi0JCXN0YXJ0ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIlxcIi8qbm9uTkxTKi8pICsgMTsNCisJaW50IHN0YXJ0ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi8iKSArIDE7IC8vJE5PTi1OTFMtMSQNCisJaWYgKHN0YXJ0ID09IDAgfHwgc3RhcnQgPCBmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSkgLy8kTk9OLU5MUy0xJA0KKwkJc3RhcnQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSArIDE7IC8vJE5PTi1OTFMtMSQNCiANCi0JaW50IGVuZCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIi8qbm9uTkxTKi8pOw0KKwlpbnQgZW5kID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZW5kID09IC0xKQ0KIAkJZW5kID0gZmlsZU5hbWUubGVuZ3RoKCk7DQogDQpAQCAtNzAsNiArNzAsNiBAQAogCXJldHVybiBtYWluVHlwZU5hbWU7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiAiQ29tcGlsYXRpb25Vbml0WyIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhmaWxlTmFtZSkgKyAiXSIvKm5vbk5MUyovOyANCisJcmV0dXJuICJDb21waWxhdGlvblVuaXRbIiArIG5ldyBTdHJpbmcoZmlsZU5hbWUpICsgIl0iOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVGaW5kZXIuamF2YQppbmRleCBiMTg3NzYzLi5iMmFiNTNmIDEwMDY0NAotLS0gYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhCisrKyBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlRmluZGVyLmphdmEKQEAgLTEyLDEzICsxMiwxMyBAQAogCXB1YmxpYyBpbnQgY291bnRlciA9IDA7DQogcHVibGljIHZvaWQgZmluZChGaWxlIGYsIFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIHZlcmJvc2UpIHsNCiAJaWYgKHZlcmJvc2UpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbihNYWluLmJpbmQoInNjYW5uaW5nLnN0YXJ0Ii8qbm9uTkxTKi8sZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKE1haW4uYmluZCgic2Nhbm5pbmcuc3RhcnQiLGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWZpbmQwKGYsIHBhdHRlcm4sIHZlcmJvc2UpOw0KIAlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdEZpbGVzLCAwLCAocmVzdWx0RmlsZXMgPSBuZXcgU3RyaW5nW2NvdW50ZXJdKSwgMCwgY291bnRlcik7DQogCWlmICh2ZXJib3NlKSB7DQogCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbihNYWluLmJpbmQoInNjYW5uaW5nLmRvbmUiLypub25OTFMqLyxmLmdldEFic29sdXRlUGF0aCgpKSk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oTWFpbi5iaW5kKCJzY2FubmluZy5kb25lIixmLmdldEFic29sdXRlUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiBwdWJsaWMgdm9pZCBmaW5kMChGaWxlIGYsIFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIHZlcmJvc2UpIHsNCmRpZmYgLS1naXQgYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVTeXN0ZW0uamF2YQppbmRleCAyNjVjYTMyLi5lZDhmYzdjIDEwMDY0NAotLS0gYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhCisrKyBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlU3lzdGVtLmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKIAkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQogCQkJCQljbGFzc3BhdGhzW2ldID0gbmV3IENsYXNzcGF0aERpcmVjdG9yeShmaWxlKTsNCiAJCQkJCXBhdGhOYW1lc1tpXSA9ICgoQ2xhc3NwYXRoRGlyZWN0b3J5KSBjbGFzc3BhdGhzW2ldKS5wYXRoOw0KLQkJCQl9IGVsc2UgaWYgKGNsYXNzcGF0aE5hbWVzW2ldLmVuZHNXaXRoKCIuamFyIi8qbm9uTkxTKi8pIHwgKGNsYXNzcGF0aE5hbWVzW2ldLmVuZHNXaXRoKCIuemlwIi8qbm9uTkxTKi8pKSkgew0KKwkJCQl9IGVsc2UgaWYgKGNsYXNzcGF0aE5hbWVzW2ldLmVuZHNXaXRoKCIuamFyIikgfCAoY2xhc3NwYXRoTmFtZXNbaV0uZW5kc1dpdGgoIi56aXAiKSkpIHsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQljbGFzc3BhdGhzW2ldID0gbmV3IENsYXNzcGF0aEphcihmaWxlKTsNCiAJCQkJCXBhdGhOYW1lc1tpXSA9IGNsYXNzcGF0aE5hbWVzW2ldLnN1YnN0cmluZygwLCBjbGFzc3BhdGhOYW1lc1tpXS5sYXN0SW5kZXhPZignLicpKTsNCiAJCQkJfQ0KQEAgLTY1LDcgKzY1LDcgQEAKIAlmb3IgKGludCBpID0gaW5pdGlhbEZpbGVOYW1lcy5sZW5ndGg7IC0taSA+PSAwOykgew0KIAkJU3RyaW5nIGZpbGVOYW1lID0gaW5pdGlhbEZpbGVOYW1lc1tpXTsNCiAJCVN0cmluZyBtYXRjaGluZ1BhdGhOYW1lID0gbnVsbDsNCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIvKm5vbk5MUyovKSAhPSAtMSkNCisJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkDQogCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7IC8vIHJlbW92ZSB0cmFpbGluZyAiLmphdmEiDQogDQogCQlmaWxlTmFtZSA9IGNvbnZlcnRQYXRoU2VwYXJhdG9ycyhmaWxlTmFtZSk7DQpAQCAtMTAxLDggKzEwMSw4IEBACiAJCQlyZXR1cm4gbnVsbDsgLy8gbG9va2luZyBmb3IgYSBmaWxlIHdoaWNoIHdlIGtub3cgd2FzIHByb3ZpZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXBpbGF0aW9uDQogDQogCVN0cmluZyBmaWxlbmFtZSA9IG5ldyBTdHJpbmcobmFtZSk7DQotCVN0cmluZyBiaW5hcnlGaWxlbmFtZSA9IGZpbGVuYW1lICsgIi5jbGFzcyIvKm5vbk5MUyovOw0KLQlTdHJpbmcgc291cmNlRmlsZW5hbWUgPSBmaWxlbmFtZSArICIuamF2YSIvKm5vbk5MUyovOw0KKwlTdHJpbmcgYmluYXJ5RmlsZW5hbWUgPSBmaWxlbmFtZSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkDQorCVN0cmluZyBzb3VyY2VGaWxlbmFtZSA9IGZpbGVuYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRocy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJQ2xhc3NwYXRoIGNsYXNzcGF0aCA9IGNsYXNzcGF0aHNbaV07DQogCQlib29sZWFuIGJpbmFyeUV4aXN0cyA9IGNsYXNzcGF0aC5leGlzdHMoYmluYXJ5RmlsZW5hbWUsIHBhY2thZ2VOYW1lKTsNCmRpZmYgLS1naXQgYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL01haW4uamF2YQppbmRleCA3NTdmZjM1Li4wYmU1OTU0IDEwMDY0NAotLS0gYS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCisrKyBiL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEKQEAgLTIwLDI3ICsyMCwzMiBAQAogaW1wb3J0IGphdmEudXRpbC4qOw0KIA0KIHB1YmxpYyBjbGFzcyBNYWluIGltcGxlbWVudHMgQ29uZmlndXJhYmxlUHJvYmxlbXMsIFByb2JsZW1TZXZlcml0aWVzIHsNCisJcHJpdmF0ZSBDb25maWd1cmFibGVPcHRpb25bXSBvcHRpb25zOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwcm9ibGVtT3B0aW9uID17DQorCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUsDQorCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssDQorCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwNCisJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sDQorCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsLA0KKwkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsDQorCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiwNCisJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwNCisJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW52YWxpZEltcG9ydCwNCisJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5yZWFjaGFibGVDb2RlLA0KKwkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRBc3NlcnRJZGVudGlmaWVyLA0KKwl9Ow0KKwlwcml2YXRlIGJvb2xlYW4gbm9XYXJuID0gZmFsc2U7DQorCQ0KIAlQcmludFdyaXRlciBvdXQ7DQogCWJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IHRydWU7DQogCWJvb2xlYW4gcHJvY2VlZE9uRXJyb3IgPSBmYWxzZTsNCi0JaW50IHdhcm5pbmdNYXNrID0NCi0JCVBhcnNpbmdPcHRpb25hbEVycm9yIHwNCi0JCU1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgfCBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QgfA0KLQkJVXNpbmdEZXByZWNhdGVkQVBJIHwgTWFza2VkQ2F0Y2hCbG9jayB8DQotCQlVbnVzZWRMb2NhbFZhcmlhYmxlIHwgVW51c2VkQXJndW1lbnQgfA0KLQkJVGVtcG9yYXJ5V2FybmluZyB8IE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZCB8DQotCQlBY2Nlc3NFbXVsYXRpb247DQogCQkJDQotCWludCBkZWJ1Z01hc2sgPSBDb21waWxlck9wdGlvbnMuTGluZXMgfCBDb21waWxlck9wdGlvbnMuU291cmNlOw0KLQlpbnQgdGFyZ2V0SkRLID0gQ29tcGlsZXJPcHRpb25zLkpESzFfMTsNCiAJYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7DQogCWJvb2xlYW4gcHJvZHVjZVJlZkluZm8gPSBmYWxzZTsNCi0JYm9vbGVhbiBpbXBvcnRQcm9ibGVtSXNFcnJvciA9IHRydWU7DQogCWJvb2xlYW4gdGltZXIgPSBmYWxzZTsNCiAJYm9vbGVhbiBzaG93UHJvZ3Jlc3MgPSBmYWxzZTsNCiAJcHVibGljIGxvbmcgdGltZSA9IDA7DQogCWxvbmcgbGluZUNvdW50Ow0KLQlib29sZWFuIHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMgPSBmYWxzZTsgLy8gVGhlIHVudXNlZCBhbmQgZmluYWwgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgb3B0aW1pemVkDQogDQogCVN0cmluZ1tdIGZpbGVuYW1lczsNCiAJU3RyaW5nW10gY2xhc3NwYXRoczsNCkBAIC01MSw4ICs1Niw4IEBACiAJaW50IGdsb2JhbEVycm9yc0NvdW50Ow0KIAlpbnQgZ2xvYmFsV2FybmluZ3NDb3VudDsNCiANCi0JU3RyaW5nIHZlcnNpb25JRCA9ICIxLjBOTCIvKm5vbk5MUyovOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQ0xBU1NfRklMRV9FWFRFTlNJT04gPSAiLmNsYXNzIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCisJU3RyaW5nIHZlcnNpb25JRCA9ICIwLjEyNS4xMiAoamNrMS4zYSkiOyAvLyROT04tTkxTLTEkDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDTEFTU19GSUxFX0VYVEVOU0lPTiA9ICIuY2xhc3MiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiANCiAJaW50IGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXI7DQogDQpAQCAtNjMsMTYgKzY4LDIwIEBACiANCiAJLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMgKi8NCiAJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBidW5kbGVOYW1lID0gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5tZXNzYWdlcyIvKm5vbk5MUyovOw0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2gubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQogCXN0YXRpYyB7DQotCQlTdHJpbmcgdmVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLypub25OTFMqLyk7DQotCQlKREsxXzEgPSAoKHZlciAhPSBudWxsKSAmJiB2ZXIuc3RhcnRzV2l0aCgiMS4xIi8qbm9uTkxTKi8pKTsNCisJCVN0cmluZyB2ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOyAvLyROT04tTkxTLTEkDQorCQlKREsxXzEgPSAoKHZlciAhPSBudWxsKSAmJiB2ZXIuc3RhcnRzV2l0aCgiMS4xIikpOyAvLyROT04tTkxTLTEkDQogCQlyZWxvY2FsaXplKCk7DQogCX0NCisJDQorCXByaXZhdGUgYm9vbGVhbiBwcm9jZWVkID0gdHJ1ZTsNCisJDQogcHJvdGVjdGVkIE1haW4oUHJpbnRXcml0ZXIgd3JpdGVyLCBib29sZWFuIHN5c3RlbUV4aXRXaGVuRmluaXNoZWQpIHsNCiAJdGhpcy5vdXQgPSB3cml0ZXI7DQogCXRoaXMuc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IHN5c3RlbUV4aXRXaGVuRmluaXNoZWQ7DQogCWV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIgPSAwOw0KKwlvcHRpb25zID0gQ29tcGlsZXIuZ2V0RGVmYXVsdE9wdGlvbnMoTG9jYWxlLmdldERlZmF1bHQoKSk7DQogfQ0KIC8qDQogICogIExvdy1sZXZlbCBBUEkgcGVyZm9ybWluZyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uDQpAQCAtODEsNzEgKzkwLDczIEBACiAJLy8gZGVjb2RlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMNCiAJdHJ5IHsNCiAJCWNvbmZpZ3VyZShhcmd2KTsNCi0JCWlmIChzaG93UHJvZ3Jlc3MpIFN5c3RlbS5vdXQucHJpbnQoTWFpbi5iaW5kKCJwcm9ncmVzcy5jb21waWxpbmciLypub25OTFMqLykpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKXsNCi0JCQlnbG9iYWxQcm9ibGVtc0NvdW50ID0gMDsNCi0JCQlnbG9iYWxFcnJvcnNDb3VudCA9IDA7DQotCQkJZ2xvYmFsV2FybmluZ3NDb3VudCA9IDA7CQkNCi0JCQlsaW5lQ291bnQgPSAwOw0KLQkJCWlmIChyZXBldGl0aW9ucyA+IDEpew0KLQkJCQlvdXQuZmx1c2goKTsNCi0JCQkJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJjb21waWxlLnJlcGV0aXRpb24iLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihpKzEpLFN0cmluZy52YWx1ZU9mKHJlcGV0aXRpb25zKSkpOw0KLQkJCX0NCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkJCS8vIHJlcXVlc3QgY29tcGlsYXRpb24NCi0JCQlwZXJmb3JtQ29tcGlsYXRpb24oKTsNCi0JCQlpZiAodGltZXIpIHsNCi0JCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOw0KLQkJCQlpZiAobGluZUNvdW50ICE9IDApew0KLQkJCQkJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJjb21waWxlLmluc3RhbnRUaW1lIi8qbm9uTkxTKi8sbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGxpbmVDb3VudCksU3RyaW5nLnZhbHVlT2YodGltZSksU3RyaW5nLnZhbHVlT2YoKCgoaW50KSgobGluZUNvdW50KjEwMDAwLjApL3RpbWUpKS8xMC4wKSl9KSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbXBpbGUudG90YWxUaW1lIi8qbm9uTkxTKi8sU3RyaW5nLnZhbHVlT2YodGltZSkpKTsNCi0JCQkJCQ0KKwkJaWYocHJvY2VlZCl7DQorCQkJaWYgKHNob3dQcm9ncmVzcykgb3V0LnByaW50KE1haW4uYmluZCgicHJvZ3Jlc3MuY29tcGlsaW5nIikpOyAvLyROT04tTkxTLTEkDQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKXsNCisJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudCA9IDA7DQorCQkJCWdsb2JhbEVycm9yc0NvdW50ID0gMDsNCisJCQkJZ2xvYmFsV2FybmluZ3NDb3VudCA9IDA7CQkNCisJCQkJbGluZUNvdW50ID0gMDsNCisJDQorCQkJCWlmIChyZXBldGl0aW9ucyA+IDEpew0KKwkJCQkJb3V0LmZsdXNoKCk7DQorCQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbXBpbGUucmVwZXRpdGlvbiIsU3RyaW5nLnZhbHVlT2YoaSsxKSxTdHJpbmcudmFsdWVPZihyZXBldGl0aW9ucykpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQotCQkJfQ0KLQkJCWlmIChnbG9iYWxQcm9ibGVtc0NvdW50ID4gMCkgew0KLQkJCQlpZiAoZ2xvYmFsUHJvYmxlbXNDb3VudCA9PSAxKSB7DQotCQkJCQlvdXQucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLm9uZVByb2JsZW0iLypub25OTFMqLykpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsUHJvYmxlbXMiLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihnbG9iYWxQcm9ibGVtc0NvdW50KSkpOw0KLQkJCQl9DQotCQkJCW91dC5wcmludCgiICgiLypub25OTFMqLyk7DQotCQkJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA+IDApIHsNCi0JCQkJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA9PSAxKSB7DQotCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVFcnJvciIvKm5vbk5MUyovKSk7DQorCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorCQkJCS8vIHJlcXVlc3QgY29tcGlsYXRpb24NCisJCQkJcGVyZm9ybUNvbXBpbGF0aW9uKCk7DQorCQkJCWlmICh0aW1lcikgew0KKwkNCisJCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsNCisJCQkJCWlmIChsaW5lQ291bnQgIT0gMCl7DQorCQkJCQkJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJjb21waWxlLmluc3RhbnRUaW1lIixuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YobGluZUNvdW50KSxTdHJpbmcudmFsdWVPZih0aW1lKSxTdHJpbmcudmFsdWVPZigoKChpbnQpKChsaW5lQ291bnQqMTAwMDAuMCkvdGltZSkpLzEwLjApKX0pKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJfSBlbHNlIHsNCi0JCQkJCQlvdXQucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLnNldmVyYWxFcnJvcnMiLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihnbG9iYWxFcnJvcnNDb3VudCkpKTsNCisJCQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbXBpbGUudG90YWxUaW1lIixTdHJpbmcudmFsdWVPZih0aW1lKSkpOwkJCQkgLy8kTk9OLU5MUy0xJA0KIAkJCQkJfQ0KIAkJCQl9DQotCQkJCWlmIChnbG9iYWxXYXJuaW5nc0NvdW50ID4gMCkgew0KKwkJCQlpZiAoZ2xvYmFsUHJvYmxlbXNDb3VudCA+IDApIHsNCisJCQkJCWlmIChnbG9iYWxQcm9ibGVtc0NvdW50ID09IDEpIHsNCisJCQkJCQlvdXQucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLm9uZVByb2JsZW0iKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsUHJvYmxlbXMiLFN0cmluZy52YWx1ZU9mKGdsb2JhbFByb2JsZW1zQ291bnQpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0NCisJCQkJCW91dC5wcmludCgiICgiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJaWYgKGdsb2JhbEVycm9yc0NvdW50ID4gMCkgew0KLQkJCQkJCW91dC5wcmludCgiLCAiLypub25OTFMqLyk7DQorCQkJCQkJaWYgKGdsb2JhbEVycm9yc0NvdW50ID09IDEpIHsNCisJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVFcnJvciIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbEVycm9ycyIsU3RyaW5nLnZhbHVlT2YoZ2xvYmFsRXJyb3JzQ291bnQpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQl9DQogCQkJCQl9DQotCQkJCQlpZiAoZ2xvYmFsV2FybmluZ3NDb3VudCA9PSAxKSB7DQotCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVXYXJuaW5nIi8qbm9uTkxTKi8pKTsNCisJCQkJCWlmIChnbG9iYWxXYXJuaW5nc0NvdW50ID4gMCkgew0KKwkJCQkJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA+IDApIHsNCisJCQkJCQkJb3V0LnByaW50KCIsICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJfQ0KKwkJCQkJCWlmIChnbG9iYWxXYXJuaW5nc0NvdW50ID09IDEpIHsNCisJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsV2FybmluZ3MiLFN0cmluZy52YWx1ZU9mKGdsb2JhbFdhcm5pbmdzQ291bnQpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQlvdXQucHJpbnRsbigiKSIpOyAvLyROT04tTkxTLTEkDQorCQkJCX0NCisJCQkJaWYgKGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIgIT0gMCAmJiAodGhpcy5zaG93UHJvZ3Jlc3MgfHwgdGhpcy50aW1lciB8fCB0aGlzLnZlcmJvc2UpKSB7DQorCQkJCQlpZiAoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciA9PSAxKSB7DQorCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVDbGFzc0ZpbGVHZW5lcmF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCX0gZWxzZSB7DQotCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsV2FybmluZ3MiLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihnbG9iYWxXYXJuaW5nc0NvdW50KSkpOw0KKwkJCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbENsYXNzRmlsZXNHZW5lcmF0ZWQiLFN0cmluZy52YWx1ZU9mKGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIpKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCX0NCiAJCQkJfQ0KLQkJCQlvdXQucHJpbnRsbigiKSIvKm5vbk5MUyovKTsNCiAJCQl9DQotCQkJaWYgKGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIgIT0gMCAmJiAodGhpcy5zaG93UHJvZ3Jlc3MgfHwgdGhpcy50aW1lciB8fCB0aGlzLnZlcmJvc2UpKSB7DQotCQkJCWlmIChleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyID09IDEpIHsNCi0JCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUub25lQ2xhc3NGaWxlR2VuZXJhdGVkIi8qbm9uTkxTKi8pKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbENsYXNzRmlsZXNHZW5lcmF0ZWQiLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyKSkpOw0KLQkJCQl9DQotCQkJfQ0KKwkJCWlmIChzaG93UHJvZ3Jlc3MpIFN5c3RlbS5vdXQucHJpbnRsbigpOw0KIAkJfQ0KLQkJaWYgKHNob3dQcm9ncmVzcykgU3lzdGVtLm91dC5wcmludGxuKCk7DQogCQlpZiAoc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCl7DQogCQkJb3V0LmZsdXNoKCk7DQogCQkJU3lzdGVtLmV4aXQoZ2xvYmFsRXJyb3JzQ291bnQgPiAwID8gLTEgOiAwKTsNCiAJCX0NCiAJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCiAJCW91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCW91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLypub25OTFMqLyk7DQorCQlvdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByaW50VXNhZ2UoKTsNCiAJCWlmIChzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkKXsNCiAJCQlTeXN0ZW0uZXhpdCgtMSk7CQkJDQpAQCAtMTk1LDcgKzIwNiw3IEBACiAJCQkJYXJndltjb3VudC0xXSArPSBGaWxlLnBhdGhTZXBhcmF0b3I7DQogCQkJCWluc2lkZUNsYXNzcGF0aCA9IHRydWU7DQogCQkJfSBlbHNlIHsNCi0JCQkJdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdWJDb21tYW5kTGluZSwgRmlsZS5wYXRoU2VwYXJhdG9yICsgIiAiLypub25OTFMqLyk7DQorCQkJCXRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3ViQ29tbWFuZExpbmUsIEZpbGUucGF0aFNlcGFyYXRvciArICIgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCiAJCQkJCWlmIChjb3VudCA9PSBhcmd2Lmxlbmd0aCkgew0KIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMCwgKGFyZ3YgPSBuZXcgU3RyaW5nW2NvdW50ICogMl0pLCAwLCBjb3VudCk7DQpAQCAtMjI0LDcgKzIzNSw3IEBACiAJCQkJfQ0KIAkJCQlhcmd2W2NvdW50KytdID0gY29tbWFuZExpbmUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGNvbW1hbmRMaW5lLmxlbmd0aCgpKTsNCiAJCQl9IGVsc2Ugew0KLQkJCQl0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1hbmRMaW5lLnN1YnN0cmluZyhzdGFydEluZGV4LCBjb21tYW5kTGluZS5sZW5ndGgoKSksIEZpbGUucGF0aFNlcGFyYXRvciArICIgIi8qbm9uTkxTKi8pOw0KKwkJCQl0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1hbmRMaW5lLnN1YnN0cmluZyhzdGFydEluZGV4LCBjb21tYW5kTGluZS5sZW5ndGgoKSksIEZpbGUucGF0aFNlcGFyYXRvciArICIgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCiAJCQkJCWlmIChjb3VudCA9PSBhcmd2Lmxlbmd0aCkgew0KIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMCwgKGFyZ3YgPSBuZXcgU3RyaW5nW2NvdW50ICogMl0pLCAwLCBjb3VudCk7DQpAQCAtMjM3LDIxICsyNDgsMzEgQEAKIAlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDAsIGFyZ3YgPSBuZXcgU3RyaW5nW2NvdW50XSwgMCwgY291bnQpOw0KIAluZXcgTWFpbih3cml0ZXIsIGZhbHNlKS5jb21waWxlKGFyZ3YpOw0KIH0NCitwcml2YXRlIHZvaWQgc2V0T3B0aW9uVmFsdWVJbmRleChTdHJpbmcgaWQsaW50IHZhbHVlSW5kZXgpew0KKwlmb3IoaW50IGkgPSAwIDsgaSA8IG9wdGlvbnMubGVuZ3RoIDsgaSsrKXsNCisJCWlmKG9wdGlvbnNbaV0uZ2V0SUQoKS5lcXVhbHMoaWQpKXsNCisJCQlvcHRpb25zW2ldLnNldFZhbHVlSW5kZXgodmFsdWVJbmRleCk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQorfQ0KKw0KIC8qDQogRGVjb2RlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIA0KICAqLw0KIHByaXZhdGUgdm9pZCBjb25maWd1cmUoU3RyaW5nW10gYXJndikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7DQogCWlmICgoYXJndiA9PSBudWxsKSB8fCAoYXJndi5sZW5ndGggPT0gMCkpDQotCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLm5vU291cmNlRmlsZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLm5vU291cmNlRmlsZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAlmaW5hbCBpbnQgSW5zaWRlQ2xhc3NwYXRoID0gMTsNCiAJZmluYWwgaW50IEluc2lkZURlc3RpbmF0aW9uUGF0aCA9IDI7DQogCWZpbmFsIGludCBUYXJnZXRTZXR0aW5nID0gNDsNCiAJZmluYWwgaW50IEluc2lkZUxvZyA9IDg7DQogCWZpbmFsIGludCBJbnNpZGVSZXBldGl0aW9uID0gMTY7DQorCWZpbmFsIGludCBJbnNpZGVTb3VyY2UgPSAzMjsNCiAJZmluYWwgaW50IERlZmF1bHQgPSAwOw0KIAlpbnQgREVGQVVMVF9TSVpFX0NMQVNTUEFUSCA9IDQ7DQotCWJvb2xlYW4gbm9XYXJuT3B0aW9uSW5Vc2VkID0gZmFsc2U7DQogCWJvb2xlYW4gd2Fybk9wdGlvbkluVXNlZCA9IGZhbHNlOw0KKwlib29sZWFuIG5vV2Fybk9wdGlvbkluVXNlZCA9IGZhbHNlOw0KIAlpbnQgcGF0aENvdW50ID0gMDsNCiAJaW50IGluZGV4ID0gLTEsIGZpbGVzQ291bnQgPSAwLCBhcmdDb3VudCA9IGFyZ3YubGVuZ3RoOw0KIAlpbnQgbW9kZSA9IERlZmF1bHQ7DQpAQCAtMjYxLDcgKzI4Miw3IEBACiAJDQogCXdoaWxlICgrK2luZGV4IDwgYXJnQ291bnQpIHsNCiAJCVN0cmluZyBjdXJyZW50QXJnID0gYXJndltpbmRleF0udHJpbSgpOw0KLQkJaWYgKGN1cnJlbnRBcmcuZW5kc1dpdGgoIi5qYXZhIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lbmRzV2l0aCgiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJaWYgKGZpbGVuYW1lcyA9PSBudWxsKSB7DQogCQkJCWZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbYXJnQ291bnQgLSBpbmRleF07DQogCQkJfSBlbHNlIGlmIChmaWxlc0NvdW50ID09IGZpbGVuYW1lcy5sZW5ndGgpIHsNCkBAIC0yNzIsMTY5ICsyOTMsMTg5IEBACiAJCQltb2RlID0gRGVmYXVsdDsNCiAJCQljb250aW51ZTsNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLWxvZyIvKm5vbk5MUyovKSkgew0KKwkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItbG9nIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCWlmIChsb2cgIT0gbnVsbCkNCi0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVMb2ciLypub25OTFMqLyxjdXJyZW50QXJnKSk7DQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlTG9nIixjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gSW5zaWRlTG9nOw0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KLQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcmVwZWF0Ii8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1yZXBlYXQiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJaWYgKHJlcGV0aXRpb25zID4gMCkNCi0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVSZXBlYXQiLypub25OTFMqLyxjdXJyZW50QXJnKSk7DQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlUmVwZWF0IixjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gSW5zaWRlUmVwZXRpdGlvbjsNCiAJCQljb250aW51ZTsNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLWQiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXNvdXJjZSIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQltb2RlID0gSW5zaWRlU291cmNlOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItZCIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQlpZiAoZGVzdGluYXRpb25QYXRoICE9IG51bGwpDQotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlT3V0cHV0UGF0aCIvKm5vbk5MUyovLGN1cnJlbnRBcmcpKTsNCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVPdXRwdXRQYXRoIixjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gSW5zaWRlRGVzdGluYXRpb25QYXRoOw0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KLQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItY2xhc3NwYXRoIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1jbGFzc3BhdGgiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJaWYgKHBhdGhDb3VudCA+IDApDQotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlQ2xhc3NwYXRoIi8qbm9uTkxTKi8sY3VycmVudEFyZykpOw0KKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUNsYXNzcGF0aCIsY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkDQogCQkJY2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbREVGQVVMVF9TSVpFX0NMQVNTUEFUSF07DQogCQkJbW9kZSA9IEluc2lkZUNsYXNzcGF0aDsNCiAJCQljb250aW51ZTsNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXByb2dyZXNzIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcm9ncmVzcyIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gRGVmYXVsdDsNCiAJCQlzaG93UHJvZ3Jlc3MgPSB0cnVlOw0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KLQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcHJvY2VlZE9uRXJyb3IiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXByb2NlZWRPbkVycm9yIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCW1vZGUgPSBEZWZhdWx0Ow0KIAkJCXByb2NlZWRPbkVycm9yID0gdHJ1ZTsNCiAJCQljb250aW51ZTsNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXRpbWUiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXRpbWUiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJbW9kZSA9IERlZmF1bHQ7DQogCQkJdGltZXIgPSB0cnVlOw0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KLQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdmVyc2lvbiIvKm5vbk5MUyovKSB8fCBjdXJyZW50QXJnLmVxdWFscygiLXYiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXZlcnNpb24iKSB8fCBjdXJyZW50QXJnLmVxdWFscygiLXYiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQl2ZXJzaW9uSURSZXF1aXJlZCA9IHRydWU7DQogCQkJY29udGludWU7DQogCQl9DQotCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1oZWxwIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1oZWxwIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCXByaW50VXNhZ2VSZXF1aXJlZCA9IHRydWU7DQogCQkJY29udGludWU7DQogCQl9CQkNCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLW5vSW1wb3J0RXJyb3IiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLW5vSW1wb3J0RXJyb3IiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJbW9kZSA9IERlZmF1bHQ7DQotCQkJaW1wb3J0UHJvYmxlbUlzRXJyb3IgPSBmYWxzZTsNCisJCQlzZXRPcHRpb25WYWx1ZUluZGV4KCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXIucHJvYmxlbUludmFsaWRJbXBvcnQiLDIpOyAvLyROT04tTkxTLTEkDQogCQkJY29udGludWU7DQogCQl9DQotCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1ub0V4aXQiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLW5vRXhpdCIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gRGVmYXVsdDsNCiAJCQlzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkID0gZmFsc2U7DQogCQkJY29udGludWU7DQogCQl9CQkNCi0JCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXZlcmJvc2UiLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXZlcmJvc2UiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJbW9kZSA9IERlZmF1bHQ7DQogCQkJdmVyYm9zZSA9IHRydWU7DQogCQkJY29udGludWU7DQogCQl9DQotCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1yZWZlcmVuY2VJbmZvIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1yZWZlcmVuY2VJbmZvIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCW1vZGUgPSBEZWZhdWx0Ow0KIAkJCXByb2R1Y2VSZWZJbmZvID0gdHJ1ZTsNCiAJCQljb250aW51ZTsNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi1nIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5zdGFydHNXaXRoKCItZyIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gRGVmYXVsdDsNCi0JCQlkZWJ1Z01hc2sgPSAwOyAvLyByZWluaXRpYWxpemUgdGhlIGRlZmF1bHQgdmFsdWUNCiAJCQlTdHJpbmcgZGVidWdPcHRpb24gPSBjdXJyZW50QXJnOw0KIAkJCWludCBsZW5ndGggPSBjdXJyZW50QXJnLmxlbmd0aCgpOw0KIAkJCWlmIChsZW5ndGggPT0gMikgew0KLQkJCQlkZWJ1Z01hc2sgPSBDb21waWxlck9wdGlvbnMuTGluZXMgfCBDb21waWxlck9wdGlvbnMuVmFycyB8IENvbXBpbGVyT3B0aW9ucy5Tb3VyY2U7DQorCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLCAwKTsNCisJCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsIDApOw0KKwkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwgMCk7DQogCQkJCWNvbnRpbnVlOw0KIAkJCX0NCiAJCQlpZiAobGVuZ3RoID4gMykgew0KLQkJCQlpZiAobGVuZ3RoID09IDcgJiYgZGVidWdPcHRpb24uZXF1YWxzKCItZzpub25lIi8qbm9uTkxTKi8pKQ0KKwkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgMSk7DQorCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLCAxKTsNCisJCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZUZpbGVBdHRyaWJ1dGUsIDEpOwkJCQkNCisJCQkJaWYgKGxlbmd0aCA9PSA3ICYmIGRlYnVnT3B0aW9uLmVxdWFscygiLWc6bm9uZSIpKSAvLyROT04tTkxTLTEkDQogCQkJCQljb250aW51ZTsNCi0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVidWdPcHRpb24uc3Vic3RyaW5nKDMsIGRlYnVnT3B0aW9uLmxlbmd0aCgpKSwgIiwiLypub25OTFMqLyk7DQorCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlYnVnT3B0aW9uLnN1YnN0cmluZygzLCBkZWJ1Z09wdGlvbi5sZW5ndGgoKSksICIsIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCiAJCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsNCi0JCQkJCWlmICh0b2tlbi5lcXVhbHMoInZhcnMiLypub25OTFMqLykpIHsNCi0JCQkJCQlkZWJ1Z01hc2sgfD0gQ29tcGlsZXJPcHRpb25zLlZhcnM7DQotCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibGluZXMiLypub25OTFMqLykpIHsNCi0JCQkJCQlkZWJ1Z01hc2sgfD0gQ29tcGlsZXJPcHRpb25zLkxpbmVzOw0KLQkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInNvdXJjZSIvKm5vbk5MUyovKSkgew0KLQkJCQkJCWRlYnVnTWFzayB8PSBDb21waWxlck9wdGlvbnMuU291cmNlOw0KKwkJCQkJaWYgKHRva2VuLmVxdWFscygidmFycyIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgMCk7DQorCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibGluZXMiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsIDApOw0KKwkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInNvdXJjZSIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwgMCk7DQogCQkJCQl9IGVsc2Ugew0KLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uIi8qbm9uTkxTKi8sZGVidWdPcHRpb24pKTsNCisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWREZWJ1Z09wdGlvbiIsZGVidWdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJCWNvbnRpbnVlOw0KIAkJCX0NCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWREZWJ1Z09wdGlvbiIvKm5vbk5MUyovLGRlYnVnT3B0aW9uKSk7DQorCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkRGVidWdPcHRpb24iLGRlYnVnT3B0aW9uKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCi0JCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi1ub3dhcm4iLypub25OTFMqLykpIHsNCisJCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi1ub3dhcm4iKSkgeyAvLyROT04tTkxTLTEkDQogCQkJbm9XYXJuT3B0aW9uSW5Vc2VkID0gdHJ1ZTsNCisJCQlub1dhcm4gPSB0cnVlOw0KIAkJCWlmICh3YXJuT3B0aW9uSW5Vc2VkKQ0KLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZVdhcm5pbmdDb25maWd1cmF0aW9uIi8qbm9uTkxTKi8pKTsNCi0JCQltb2RlID0gRGVmYXVsdDsNCi0JCQl3YXJuaW5nTWFzayA9IFRlbXBvcmFyeVdhcm5pbmc7IC8vIHJlaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZSAoc3RpbGwgc2VlIFRlbXBvcmFyeVdhcm5pbmcpCQkNCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVXYXJuaW5nQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW1vZGUgPSBEZWZhdWx0OwkJDQogCQkJY29udGludWU7DQogCQl9DQotCQlpZiAoY3VycmVudEFyZy5zdGFydHNXaXRoKCItd2FybiIvKm5vbk5MUyovKSkgew0KKwkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiLXdhcm4iKSkgeyAvLyROT04tTkxTLTEkDQogCQkJd2Fybk9wdGlvbkluVXNlZCA9IHRydWU7DQogCQkJaWYgKG5vV2Fybk9wdGlvbkluVXNlZCkNCi0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVXYXJuaW5nQ29uZmlndXJhdGlvbiIvKm5vbk5MUyovKSk7DQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQltb2RlID0gRGVmYXVsdDsNCiAJCQlTdHJpbmcgd2FybmluZ09wdGlvbiA9IGN1cnJlbnRBcmc7DQogCQkJaW50IGxlbmd0aCA9IGN1cnJlbnRBcmcubGVuZ3RoKCk7DQotCQkJaWYgKGxlbmd0aCA9PSAxMCAmJiB3YXJuaW5nT3B0aW9uLmVxdWFscygiLXdhcm46bm9uZSIvKm5vbk5MUyovKSkgew0KLQkJCQl3YXJuaW5nTWFzayA9IFRlbXBvcmFyeVdhcm5pbmc7IC8vIHJlaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZSAoc3RpbGwgc2VlIFRlbXBvcmFyeVdhcm5pbmcpDQorCQkJaWYgKGxlbmd0aCA9PSAxMCAmJiB3YXJuaW5nT3B0aW9uLmVxdWFscygiLXdhcm46bm9uZSIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJbm9XYXJuID0gdHJ1ZTsNCiAJCQkJY29udGludWU7DQogCQkJfQ0KIAkJCWlmIChsZW5ndGggPCA2KQ0KLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWRXYXJuaW5nQ29uZmlndXJhdGlvbiIvKm5vbk5MUyovLHdhcm5pbmdPcHRpb24pKTsNCi0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih3YXJuaW5nT3B0aW9uLnN1YnN0cmluZyg2LCB3YXJuaW5nT3B0aW9uLmxlbmd0aCgpKSwgIiwiLypub25OTFMqLyk7DQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmdDb25maWd1cmF0aW9uIix3YXJuaW5nT3B0aW9uKSk7IC8vJE5PTi1OTFMtMSQNCisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih3YXJuaW5nT3B0aW9uLnN1YnN0cmluZyg2LCB3YXJuaW5nT3B0aW9uLmxlbmd0aCgpKSwgIiwiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWludCB0b2tlbkNvdW50ZXIgPSAwOw0KLQkJCXdhcm5pbmdNYXNrID0gMDsgLy8gcmVpbml0aWFsaXplIHRoZSBkZWZhdWx0IHZhbHVlCQkJCQ0KKw0KKwkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLCAyKTsNCisJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLCAyKTsNCisJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywgMik7DQorCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCAyKTsNCisJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsIDIpOw0KKwkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsIDIpOw0KKwkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sIDIpOw0KKwkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsLCAyKTsNCisJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwgMik7DQorCQkJDQogCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCiAJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KIAkJCQl0b2tlbkNvdW50ZXIrKzsNCi0JCQkJaWYgKHRva2VuLmVxdWFscygiY29uc3RydWN0b3JOYW1lIi8qbm9uTkxTKi8pKSB7DQotCQkJCQl3YXJuaW5nTWFzayB8PSBDb21waWxlck9wdGlvbnMuTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZTsNCi0JCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInBhY2thZ2VEZWZhdWx0TWV0aG9kIi8qbm9uTkxTKi8pKSB7DQotCQkJCQl3YXJuaW5nTWFzayB8PSBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibWFza2VkQ2F0Y2hCbG9ja3MiLypub25OTFMqLykpIHsNCi0JCQkJCXdhcm5pbmdNYXNrIHw9IENvbXBpbGVyT3B0aW9ucy5NYXNrZWRDYXRjaEJsb2NrOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZGVwcmVjYXRpb24iLypub25OTFMqLykpIHsNCi0JCQkJCXdhcm5pbmdNYXNrIHw9IENvbXBpbGVyT3B0aW9ucy5Vc2luZ0RlcHJlY2F0ZWRBUEk7DQotCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRMb2NhbHMiLypub25OTFMqLykpIHsNCi0JCQkJCXdhcm5pbmdNYXNrIHw9IENvbXBpbGVyT3B0aW9ucy5VbnVzZWRMb2NhbFZhcmlhYmxlOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkQXJndW1lbnRzIi8qbm9uTkxTKi8pKSB7DQotCQkJCQl3YXJuaW5nTWFzayB8PSBDb21waWxlck9wdGlvbnMuVW51c2VkQXJndW1lbnQ7DQotCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzeW50aGV0aWNBY2Nlc3MiLypub25OTFMqLykpew0KLQkJCQkJd2FybmluZ01hc2sgfD0gQ29tcGlsZXJPcHRpb25zLkFjY2Vzc0VtdWxhdGlvbjsNCi0JCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm5scyIvKm5vbk5MUyovKSl7DQotCQkJCQl3YXJuaW5nTWFzayB8PSBDb21waWxlck9wdGlvbnMuTm9uRXh0ZXJuYWxpemVkU3RyaW5nOw0KKwkJCQlpZiAodG9rZW4uZXF1YWxzKCJjb25zdHJ1Y3Rvck5hbWUiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSwgMSk7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJwYWNrYWdlRGVmYXVsdE1ldGhvZCIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QsIDEpOw0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibWFza2VkQ2F0Y2hCbG9ja3MiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywgMSk7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJkZXByZWNhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgMSk7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRMb2NhbHMiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsIDEpOw0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkQXJndW1lbnRzIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwgMSk7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzeW50aGV0aWNBY2Nlc3MiKSl7IC8vJE5PTi1OTFMtMSQNCisJCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sIDEpOw0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibmxzIikpeyAvLyROT04tTkxTLTEkDQorCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwgMSk7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJhc3NlcnRJZGVudGlmaWVyIikpeyAvLyROT04tTkxTLTEkDQorCQkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwgMSk7DQogCQkJCX0gZWxzZSB7DQotCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWRXYXJuaW5nIi8qbm9uTkxTKi8sdG9rZW4pKTsNCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmciLHRva2VuKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJfQ0KIAkJCX0NCiAJCQlpZiAodG9rZW5Db3VudGVyID09IDApDQotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmdPcHRpb24iLypub25OTFMqLyxjdXJyZW50QXJnKSk7DQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmdPcHRpb24iLGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KLQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGFyZ2V0Ii8qbm9uTkxTKi8pKSB7DQorCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi10YXJnZXQiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJbW9kZSA9IFRhcmdldFNldHRpbmc7DQogCQkJY29udGludWU7DQogCQl9DQotCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcmVzZXJ2ZUFsbExvY2FscyIvKm5vbk5MUyovKSkgew0KLQkJCXByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMgPSB0cnVlOw0KKwkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcHJlc2VydmVBbGxMb2NhbHMiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwsIDApOw0KIAkJCWNvbnRpbnVlOw0KIAkJfQ0KIAkJaWYgKG1vZGUgPT0gVGFyZ2V0U2V0dGluZykgew0KLQkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiMS4xIi8qbm9uTkxTKi8pKSB7DQotCQkJCXRhcmdldEpESyA9IENvbXBpbGVyT3B0aW9ucy5KREsxXzE7DQotCQkJfSBlbHNlIGlmIChjdXJyZW50QXJnLmVxdWFscygiMS4yIi8qbm9uTkxTKi8pKSB7DQotCQkJCXRhcmdldEpESyA9IENvbXBpbGVyT3B0aW9ucy5KREsxXzI7DQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCIxLjEiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgMCk7DQorCQkJfSBlbHNlIGlmIChjdXJyZW50QXJnLmVxdWFscygiMS4yIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlzZXRPcHRpb25WYWx1ZUluZGV4KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIDEpOw0KIAkJCX0gZWxzZSB7DQotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUudGFyZ2V0SkRLIi8qbm9uTkxTKi8sY3VycmVudEFyZykpOw0KKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLnRhcmdldEpESyIsY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCW1vZGUgPSBEZWZhdWx0Ow0KIAkJCWNvbnRpbnVlOw0KQEAgLTQ0OCwxMCArNDg5LDIxIEBACiAJCQl0cnkgew0KIAkJCQlyZXBldGl0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoY3VycmVudEFyZyk7DQogCQkJCWlmIChyZXBldGl0aW9ucyA8PSAwKXsNCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUucmVwZXRpdGlvbiIvKm5vbk5MUyovLGN1cnJlbnRBcmcpKTsNCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUucmVwZXRpdGlvbiIsY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkDQogCQkJCX0NCiAJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsNCi0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5yZXBldGl0aW9uIi8qbm9uTkxTKi8sY3VycmVudEFyZykpOw0KKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLnJlcGV0aXRpb24iLGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCQltb2RlID0gRGVmYXVsdDsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmIChtb2RlID09IEluc2lkZVNvdXJjZSl7DQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCIxLjMiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCXNldE9wdGlvblZhbHVlSW5kZXgoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsIDApOw0KKwkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuNCIpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJc2V0T3B0aW9uVmFsdWVJbmRleChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgMSk7DQorCQkJfSBlbHNlIHsNCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5zb3VyY2UiLGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQltb2RlID0gRGVmYXVsdDsNCiAJCQljb250aW51ZTsNCkBAIC00NzksMTIgKzUzMSwxMiBAQAogCQkJY3VycmVudEFyZyA9IGN1cnJlbnRBcmcuc3Vic3RyaW5nKDAsIGN1cnJlbnRBcmcubGVuZ3RoKCkgLSBGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7DQogCQlGaWxlIGRpciA9IG5ldyBGaWxlKGN1cnJlbnRBcmcpOw0KIAkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkNCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmRpcmVjdG9yeU5vdEV4aXN0Ii8qbm9uTkxTKi8sY3VycmVudEFyZykpOw0KKwkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuZGlyZWN0b3J5Tm90RXhpc3QiLGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJA0KIAkJRmlsZUZpbmRlciBmaW5kZXIgPSBuZXcgRmlsZUZpbmRlcigpOw0KIAkJdHJ5ew0KLQkJCWZpbmRlci5maW5kKGRpciwgIi5KQVZBIi8qbm9uTkxTKi8sIHZlcmJvc2UpOw0KKwkJCWZpbmRlci5maW5kKGRpciwgIi5KQVZBIiwgdmVyYm9zZSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuSU9FcnJvciIvKm5vbk5MUyovLGN1cnJlbnRBcmcpKTsJCQ0KKwkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuSU9FcnJvciIsY3VycmVudEFyZykpOwkJIC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmIChmaWxlbmFtZXMgIT0gbnVsbCkgew0KIAkJCS8vIHNvbWUgc291cmNlIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkNCkBAIC01MDEsMjcgKzU1MywzOCBAQAogCQljb250aW51ZTsNCiAJfQ0KIA0KKwlpZihub1dhcm4pew0KKwkJZm9yKGludCBpID0gMDsgaSA8IHByb2JsZW1PcHRpb24ubGVuZ3RoIDsgaSsrKXsNCisJCQlmb3IoaW50IGogPSAwIDsgaiA8IG9wdGlvbnMubGVuZ3RoIDsgaisrKXsNCisJCQkJaWYob3B0aW9uc1tqXS5nZXRJRCgpLmVxdWFscyhwcm9ibGVtT3B0aW9uW2ldKSAmJiBvcHRpb25zW2pdLmdldFZhbHVlSW5kZXgoKSA9PSAxKXsNCisJCQkJCW9wdGlvbnNbal0uc2V0VmFsdWVJbmRleCgyKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KIAkvKg0KIAkgKiBTdGFuZGFsb25lIG9wdGlvbnMNCiAJICovDQogCWlmICh2ZXJzaW9uSURSZXF1aXJlZCkgew0KLQkJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJjb25maWd1cmUudmVyc2lvbiIvKm5vbk5MUyovLHRoaXMudmVyc2lvbklEKSk7DQorCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbmZpZ3VyZS52ZXJzaW9uIix0aGlzLnZlcnNpb25JRCkpOyAvLyROT04tTkxTLTEkDQogCQlvdXQucHJpbnRsbigpOw0KKwkJcHJvY2VlZCA9IGZhbHNlOw0KIAkJcmV0dXJuOw0KIAl9DQogCQkNCiAJaWYgKHByaW50VXNhZ2VSZXF1aXJlZCkgew0KIAkJcHJpbnRVc2FnZSgpOw0KKwkJcHJvY2VlZCA9IGZhbHNlOw0KIAkJcmV0dXJuOw0KIAl9CQ0KIAkNCiAJaWYgKGZpbGVzQ291bnQgIT0gMCkNCiAJCVN5c3RlbS5hcnJheWNvcHkoZmlsZW5hbWVzLCAwLCAoZmlsZW5hbWVzID0gbmV3IFN0cmluZ1tmaWxlc0NvdW50XSksIDAsIGZpbGVzQ291bnQpOw0KIAlpZiAocGF0aENvdW50ID09IDApIHsNCi0JCVN0cmluZyBjbGFzc1Byb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkxGY2xhc3NwYXRoIi8qbm9uTkxTKi8pOw0KKwkJU3RyaW5nIGNsYXNzUHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiTEZjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJA0KIAkJaWYgKChjbGFzc1Byb3AgPT0gbnVsbCkgfHwgKGNsYXNzUHJvcC5sZW5ndGgoKSA9PSAwKSkgew0KLQkJCW91dC5wcmludGxuKE1haW4uYmluZCgiY29uZmlndXJlLm5vQ2xhc3NwYXRoIi8qbm9uTkxTKi8pKTsNCi0JCQljbGFzc1Byb3AgPSAiLiIvKm5vbk5MUyovOw0KKwkJCW91dC5wcmludGxuKE1haW4uYmluZCgiY29uZmlndXJlLm5vQ2xhc3NwYXRoIikpOyAvLyROT04tTkxTLTEkDQorCQkJY2xhc3NQcm9wID0gIi4iOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1Byb3AsIEZpbGUucGF0aFNlcGFyYXRvcik7DQogCQljbGFzc3BhdGhzID0gbmV3IFN0cmluZ1t0b2tlbml6ZXIuY291bnRUb2tlbnMoKV07DQpAQCAtNTM2LDI2ICs1OTksMjcgQEAKIAlmb3IgKGludCBpID0gMCwgbWF4ID0gY2xhc3NwYXRocy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2xhc3NwYXRoc1tpXSk7DQogCQlpZiAoIWZpbGUuZXhpc3RzKCkpDQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGgiLypub25OTFMqLyxjbGFzc3BhdGhzW2ldKSk7DQorCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGgiLGNsYXNzcGF0aHNbaV0pKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChkZXN0aW5hdGlvblBhdGggPT0gbnVsbCkgew0KLQkJZGVzdGluYXRpb25QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIvKm5vbk5MUyovKTsNCi0JfSBlbHNlIGlmICgibm9uZSIvKm5vbk5MUyovLmVxdWFscyhkZXN0aW5hdGlvblBhdGgpKSB7DQorCQlkZXN0aW5hdGlvblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQNCisJfSBlbHNlIGlmICgibm9uZSIuZXF1YWxzKGRlc3RpbmF0aW9uUGF0aCkpIHsgLy8kTk9OLU5MUy0xJA0KIAkJZGVzdGluYXRpb25QYXRoID0gbnVsbDsNCiAJfQ0KIAkJDQogCWlmIChmaWxlbmFtZXMgPT0gbnVsbCkNCi0JCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUubm9Tb3VyY2UiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5ub1NvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAlpZiAobG9nICE9IG51bGwpew0KIAkJdHJ5IHsNCiAJCQlvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCBmYWxzZSkpOw0KIAkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmNhbm5vdE9wZW5Mb2ciLypub25OTFMqLykpOw0KKwkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuY2Fubm90T3BlbkxvZyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9IGVsc2Ugew0KIAkJc2hvd1Byb2dyZXNzID0gZmFsc2U7DQogCX0NCisNCiAJaWYgKHJlcGV0aXRpb25zID09IDApIHsNCiAJCXJlcGV0aXRpb25zID0gMTsNCiAJfQ0KQEAgLTU4NCwyMiArNjQ4LDIyIEBACiAJCQkJCWlmIChwcm9ibGVtc1tpXSAhPSBudWxsKSB7DQogCQkJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudCsrOw0KIAkJCQkJCWlmIChsb2NhbEVycm9yQ291bnQgPT0gMCkNCi0JCQkJCQkJb3V0LnByaW50bG4oIi0tLS0tLS0tLS0iLypub25OTFMqLyk7DQotCQkJCQkJb3V0LnByaW50KGdsb2JhbFByb2JsZW1zQ291bnQgKyAiLiAiLypub25OTFMqLyArIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkgPyBNYWluLmJpbmQoInJlcXVlc3Rvci5lcnJvciIvKm5vbk5MUyovKSA6IE1haW4uYmluZCgicmVxdWVzdG9yLndhcm5pbmciLypub25OTFMqLykpKTsNCisJCQkJCQkJb3V0LnByaW50bG4oIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCW91dC5wcmludChnbG9iYWxQcm9ibGVtc0NvdW50ICsgIi4gIiArIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkgPyBNYWluLmJpbmQoInJlcXVlc3Rvci5lcnJvciIpIDogTWFpbi5iaW5kKCJyZXF1ZXN0b3Iud2FybmluZyIpKSk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSkgew0KIAkJCQkJCQlnbG9iYWxFcnJvcnNDb3VudCsrOw0KIAkJCQkJCX0gZWxzZSB7DQogCQkJCQkJCWdsb2JhbFdhcm5pbmdzQ291bnQrKzsNCiAJCQkJCQl9DQotCQkJCQkJb3V0LnByaW50KCIgIi8qbm9uTkxTKi8pOw0KLQkJCQkJCW91dC5wcmludChNYWluLmJpbmQoInJlcXVlc3Rvci5pbiIvKm5vbk5MUyovLG5ldyBTdHJpbmcocHJvYmxlbXNbaV0uZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpKSkpOw0KKwkJCQkJCW91dC5wcmludCgiICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgicmVxdWVzdG9yLmluIixuZXcgU3RyaW5nKHByb2JsZW1zW2ldLmdldE9yaWdpbmF0aW5nRmlsZU5hbWUoKSkpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCXRyeSB7DQogCQkJCQkJCW91dC5wcmludGxuKCgoRGVmYXVsdFByb2JsZW0pcHJvYmxlbXNbaV0pLmVycm9yUmVwb3J0U291cmNlKGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCkpOw0KIAkJCQkJCQlvdXQucHJpbnRsbihwcm9ibGVtc1tpXS5nZXRNZXNzYWdlKCkpOw0KIAkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCW91dC5wcmludGxuKE1haW4uYmluZCgicmVxdWVzdG9yLm5vdFJldHJpZXZlRXJyb3JNZXNzYWdlIi8qbm9uTkxTKi8scHJvYmxlbXNbaV0udG9TdHJpbmcoKSkpOw0KKwkJCQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoInJlcXVlc3Rvci5ub3RSZXRyaWV2ZUVycm9yTWVzc2FnZSIscHJvYmxlbXNbaV0udG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkDQogCQkJCQkJfQ0KLQkJCQkJCW91dC5wcmludGxuKCItLS0tLS0tLS0tIi8qbm9uTkxTKi8pOw0KKwkJCQkJCW91dC5wcmludGxuKCItLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCQlpZiAocHJvYmxlbXNbaV0uaXNFcnJvcigpKQ0KIAkJCQkJCQlsb2NhbEVycm9yQ291bnQrKzsNCiAJCQkJCX0NCkBAIC02MjAsMTkgKzY4NCwxOCBAQAogcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdFtdIGdldENvbXBpbGF0aW9uVW5pdHMoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsNCiAJaW50IGZpbGVDb3VudCA9IGZpbGVuYW1lcy5sZW5ndGg7DQogCUNvbXBpbGF0aW9uVW5pdFtdIHVuaXRzID0gbmV3IENvbXBpbGF0aW9uVW5pdFtmaWxlQ291bnRdOw0KLQ0KIAlIYXNodGFibGVPZk9iamVjdCBrbm93bkZpbGVOYW1lcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdChmaWxlQ291bnQpOw0KIAkNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgew0KIAkJY2hhcltdIGNoYXJOYW1lID0gZmlsZW5hbWVzW2ldLnRvQ2hhckFycmF5KCk7DQogCQlpZiAoa25vd25GaWxlTmFtZXMuZ2V0KGNoYXJOYW1lKSAhPSBudWxsKXsNCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgidW5pdC5tb3JlIi8qbm9uTkxTKi8sZmlsZW5hbWVzW2ldKSk7CQkJDQorCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoInVuaXQubW9yZSIsZmlsZW5hbWVzW2ldKSk7CQkJIC8vJE5PTi1OTFMtMSQNCiAJCX0gZWxzZSB7DQogCQkJa25vd25GaWxlTmFtZXMucHV0KGNoYXJOYW1lLCBjaGFyTmFtZSk7DQogCQl9DQogCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZXNbaV0pOw0KIAkJaWYgKCFmaWxlLmV4aXN0cygpKQ0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJ1bml0Lm1pc3NpbmciLypub25OTFMqLyxmaWxlbmFtZXNbaV0pKTsNCisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgidW5pdC5taXNzaW5nIixmaWxlbmFtZXNbaV0pKTsgLy8kTk9OLU5MUy0xJA0KIAkJdW5pdHNbaV0gPSBuZXcgQ29tcGlsYXRpb25Vbml0KG51bGwsIGZpbGVuYW1lc1tpXSk7DQogCX0NCiAJcmV0dXJuIHVuaXRzOw0KQEAgLTY2MiwxMyArNzI1LDcgQEAKICAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbg0KICAqLw0KIHByb3RlY3RlZCBDb25maWd1cmFibGVPcHRpb25bXSBnZXRPcHRpb25zKCkgew0KLQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsNCi0Jb3B0aW9ucy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzKGRlYnVnTWFzayk7DQotCW9wdGlvbnMucHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcyhwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzKTsNCi0Jb3B0aW9ucy5oYW5kbGVJbXBvcnRQcm9ibGVtQXNFcnJvcihpbXBvcnRQcm9ibGVtSXNFcnJvcik7DQotCW9wdGlvbnMuc2V0V2FybmluZ1RocmVzaG9sZCh3YXJuaW5nTWFzayk7DQotCW9wdGlvbnMuc2V0VGFyZ2V0SkRLKHRhcmdldEpESyk7DQotCXJldHVybiBvcHRpb25zLmdldENvbmZpZ3VyYWJsZU9wdGlvbnMoTG9jYWxlLmdldERlZmF1bHQoKSk7DQorCXJldHVybiBvcHRpb25zOw0KIH0NCiBwcm90ZWN0ZWQgSVByb2JsZW1GYWN0b3J5IGdldFByb2JsZW1GYWN0b3J5KCkgew0KIAlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsNCkBAIC03MDQsNyArNzYxLDcgQEAKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQogCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBkZXN0aW5hdGlvblBhdGggKyBuZXcgU3RyaW5nKHJlbGF0aXZlTmFtZSk7DQogCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1haW4uYmluZCgib3V0cHV0Lm5vQ2xhc3NGaWxlQ3JlYXRlZCIvKm5vbk5MUyovLGZpbGVOYW1lKSk7DQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWFpbi5iaW5kKCJvdXRwdXQubm9DbGFzc0ZpbGVDcmVhdGVkIixmaWxlTmFtZSkpOyAvLyROT04tTkxTLTEkDQogCQkJCX0NCiAJCQkJZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlcisrOw0KIAkJCX0NCkBAIC03MjIsNDUgKzc3OSwxNSBAQAogCQkJCWdldE9wdGlvbnMoKSwNCiAJCSAJCWdldEJhdGNoUmVxdWVzdG9yKCksDQogCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOw0KLQ0KIAlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IGJhdGNoQ29tcGlsZXIub3B0aW9uczsNCisNCiAJLy8gc2V0IHRoZSBub24tZXh0ZXJuYWxseSBjb25maWd1cmFibGUgb3B0aW9ucy4NCiAJb3B0aW9ucy5zZXRWZXJib3NlTW9kZSh2ZXJib3NlKTsNCiAJb3B0aW9ucy5wcm9kdWNlUmVmZXJlbmNlSW5mbyhwcm9kdWNlUmVmSW5mbyk7DQotCQ0KIAliYXRjaENvbXBpbGVyLmNvbXBpbGUoZ2V0Q29tcGlsYXRpb25Vbml0cygpKTsNCiB9DQogcHJpdmF0ZSB2b2lkIHByaW50VXNhZ2UoKSB7DQotCW91dC5wcmludGxuKE1haW4uYmluZCgibWlzYy51c2FnZSIvKm5vbk5MUyovLHRoaXMudmVyc2lvbklEKSk7DQotCS8qb3V0LnByaW50bG4oDQotCQkiRWNsaXBzZSBKYXZhIENvbXBpbGVyICIrIHRoaXMudmVyc2lvbklEICsgIiwgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDBcblxuIiArDQotCQkiVXNhZ2U6IDxvcHRpb25zPiA8c291cmNlIGZpbGVzIHwgZGlyZWN0b3JpZXM+XG5cbiIgKw0KLQkJCQkJIndoZXJlIG9wdGlvbnMgaW5jbHVkZTpcbiIgKw0KLQkJCQkJIi12ZXJzaW9uIG9yIC12XHRkaXNwbGF5cyB0aGUgdmVyc2lvbiBudW1iZXIgKHN0YW5kYWxvbmUgb3B0aW9uKVxuIiArDQotCQkJCQkiLWhlbHBcdGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgKHN0YW5kYWxvbmUgb3B0aW9uKVxuIiArDQotCQkJCQkiLW5vRXhpdFx0UHJldmVudCB0aGUgY29tcGlsZXIgdG8gY2FsbCBTeXN0ZW0uZXhpdCBhdCB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzXG4iICsJCQkJCQ0KLQkJCQkJIi1jbGFzc3BhdGggPGRpciAxPjs8ZGlyIDI+Oy4uLjs8ZGlyIFA+XG4iICsNCi0JCQkJCSItZCA8ZGlyPlx0ZGVzdGluYXRpb24gZGlyZWN0b3J5XG5cdFx0LCBzcGVjaWZpZWQgJy1kIG5vbmUnIGlmIHlvdSBkb24ndCB3YW50IHRvIGR1bXAgZmlsZXNcbiIgKw0KLQkJCQkJIi12ZXJib3NlXHRwcmludCBhY2Nlc3NlZC9wcm9jZXNzZWQgY29tcGlsYXRpb24gdW5pdHMgXG4iICsNCi0JCQkJCSItdGltZVx0XHRkaXNwbGF5IHRvdGFsIGNvbXBpbGF0aW9uIHRpbWUiICsNCi0JCQkJCQkJIlxuXHRcdGFuZCBzcGVlZCBpZiBsaW5lIGF0dHJpYnV0ZXMgYXJlIGVuYWJsZWRcbiIgKw0KLQkJCQkJIi1sb2cgPGZpbGVuYW1lPlx0c3BlY2lmeSBhIGxvZyBmaWxlIGZvciByZWNvcmRpbmcgcHJvYmxlbXNcbiIgKw0KLQkJCQkJIi1wcm9ncmVzc1x0XHRzaG93IHByb2dyZXNzIChvbmx5IGluIC1sb2cgbW9kZSlcbiIgKw0KLQkJCQkJIi1nWzo8bGV2ZWw+XVx0c3BlY2lmeSB0aGUgbGV2ZWwgb2YgZGV0YWlscyBmb3IgZGVidWcgYXR0cmlidXRlcyIgKw0KLQkJCQkJCQkiXG5cdFx0LWdcdGdlbmVyYXRlIGFsbCBkZWJ1ZyBpbmZvIisNCi0JCQkJCQkJIlxuXHRcdC1nOm5vbmVcdG5vIGRlYnVnIGluZm8iKw0KLQkJCQkJCQkiXG5cdFx0LWc6e2xpbmVzLHZhcnMsc291cmNlfVx0b25seSBzb21lIGRlYnVnIGluZm9cbiIgKw0KLQkJCQkJIi1ub3dhcm5cdFx0ZG8gbm90IHJlcG9ydCB3YXJuaW5ncyBcbiIgKw0KLQkJCQkJIi13YXJuOjxtYXNrPlx0c3BlY2lmeSB0aGUgbGV2ZWwgb2YgZGV0YWlscyBmb3Igd2FybmluZ3NcbiIgKw0KLQkJCQkJCQkiXHRcdC13YXJuOm5vbmUgbm8gd2FybmluZ1xuIisNCi0JCQkJCQkJIlx0XHQtd2Fybjp7Y29uc3RydWN0b3JOYW1lLCBwYWNrYWdlRGVmYXVsdE1ldGhvZCwgZGVwcmVjYXRpb24sXG4iICsNCi0JCQkJCQkJIlx0XHRcdG1hc2tlZENhdGNoQmxvY2tzLCB1bnVzZWRMb2NhbHMsIHVudXNlZEFyZ3VtZW50cywgXG4iICsNCi0JCQkJCQkJIlx0XHRcdHN5bnRoZXRpY0FjY2Vzc31cbiIgKwkJCQkJDQotCQkJCQkiLW5vSW1wb3J0RXJyb3JcdGRvIG5vdCByZXBvcnQgZXJyb3JzIG9uIGluY29ycmVjdCBpbXBvcnRzXG4iICsNCi0JCQkJCSItcHJvY2VlZE9uRXJyb3JcdGtlZXAgY29tcGlsaW5nIHdoZW4gZXJyb3IsIFxuXHRcdGR1bXBpbmcgY2xhc3MgZmlsZXMgd2l0aCBwcm9ibGVtIG1ldGhvZHNcbiIgKw0KLQkJCQkJIi1yZWZlcmVuY2VJbmZvXHRjb21wdXRlIHJlZmVyZW5jZSBpbmZvXG4iICsNCi0JCQkJCSItcHJlc2VydmVBbGxMb2NhbHNcdHJlcXVlc3QgY29kZSBnZW4gcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlc1xuIiArDQotCQkJCQkiLXJlcGVhdCA8bj5cdHJlcGVhdCBjb21waWxhdGlvbiBwcm9jZXNzIGZvciBwZXJmb3JtYW5jZSBhbmFseXNpc1xuIik7Ki8NCisJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJtaXNjLnVzYWdlIix0aGlzLnZlcnNpb25JRCkpOyAvLyROT04tTkxTLTEkDQogCW91dC5mbHVzaCgpOw0KIH0NCiANCkBAIC03ODQsMTQgKzgxMSwxNCBAQAogICovDQogcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZ1tdIGJpbmRpbmdzKSB7DQogCWlmIChpZCA9PSBudWxsKQ0KLQkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSI7IC8vJE5PTi1OTFMtMSQNCiAJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOw0KIAl0cnkgew0KIAkJbWVzc2FnZSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQpOw0KIAl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KIAkJLy8gSWYgd2UgZ290IGFuIGV4Y2VwdGlvbiBsb29raW5nIGZvciB0aGUgbWVzc2FnZSwgZmFpbCBncmFjZWZ1bGx5IGJ5IGp1c3QgcmV0dXJuaW5nDQogCQkvLyB0aGUgaWQgd2Ugd2VyZSBsb29raW5nIGZvci4gIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBzZW1pLWluZm9ybWF0aXZlIHNvIGlzIG5vdCB0b28gYmFkLg0KLQkJcmV0dXJuICJNaXNzaW5nIG1lc3NhZ2U6ICIvKm5vbk5MUyovK2lkKyIgaW46ICIvKm5vbk5MUyovK2J1bmRsZU5hbWU7DQorCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIitpZCsiIGluOiAiK2J1bmRsZU5hbWU7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChiaW5kaW5ncyA9PSBudWxsKQ0KIAkJcmV0dXJuIG1lc3NhZ2U7DQpAQCAtODEwLDcgKzgzNyw3IEBACiAJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgew0KIAkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsNCiAJCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0JCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIvKm5vbk5MUyovICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIvKm5vbk5MUyovKTsNCisJCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSArICJ9Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQogCQkJfSBlbHNlIHsNCiAJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQsIGxlbmd0aCkpOw0KZGlmZiAtLWdpdCBhL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNmQ0YmM3Ni4uYWNjY2E5MiAxMDA2NDQKLS0tIGEvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTI0LDYgKzI0LDcgQEAKIGNvbmZpZ3VyZS5ub1NvdXJjZUZpbGUgPSBubyBzb3VyY2UgZmlsZSBzcGVjaWZpZWQNCiBjb25maWd1cmUuZHVwbGljYXRlTG9nID0gZHVwbGljYXRlIGxvZyBzcGVjaWZpY2F0aW9uOiB7MH0NCiBjb25maWd1cmUuZHVwbGljYXRlUmVwZWF0ID0gZHVwbGljYXRlIHJlcGVhdCBzcGVjaWZpY2F0aW9uOiB7MH0NCitjb25maWd1cmUuc291cmNlID0gaW52YWxpZCBzb3VyY2Ugb3B0aW9uLCBzb3VyY2UgaXMgZWl0aGVyICcxLjMnIG9yICcxLjQnOiB7MH0NCiBjb25maWd1cmUuZHVwbGljYXRlT3V0cHV0UGF0aCA9IGR1cGxpY2F0ZSBvdXRwdXQgcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0NCiBjb25maWd1cmUuZHVwbGljYXRlQ2xhc3NwYXRoID0gZHVwbGljYXRlIGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0NCiBjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uID0gaW52YWxpZCBkZWJ1ZyBvcHRpb246IHswfQ0KQEAgLTU1LDQgKzU2LDQgQEAKIG91dHB1dC5ub0NsYXNzRmlsZUNyZWF0ZWQgPSBObyAuY2xhc3MgZmlsZSBjcmVhdGVkIGZvciBmaWxlIG5hbWVkIHswfSBiZWNhdXNlIG9mIGEgSU9FeGNlcHRpb24uDQogDQogIyMjIG1pc2NlbGxhbmVvdXMNCi1taXNjLnVzYWdlID0gRWNsaXBzZSBKYXZhIENvbXBpbGVyIHswfSwgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDBcblxuVXNhZ2U6IDxvcHRpb25zPiA8c291cmNlIGZpbGVzIHwgZGlyZWN0b3JpZXM+XG5cbndoZXJlIG9wdGlvbnMgaW5jbHVkZTpcbi12ZXJzaW9uIG9yIC12XHRkaXNwbGF5cyB0aGUgdmVyc2lvbiBudW1iZXIgKHN0YW5kYWxvbmUgb3B0aW9uKVxuLWhlbHBcdGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgKHN0YW5kYWxvbmUgb3B0aW9uKVxuLW5vRXhpdFx0UHJldmVudCB0aGUgY29tcGlsZXIgdG8gY2FsbCBTeXN0ZW0uZXhpdCBhdCB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzXG4tY2xhc3NwYXRoIDxkaXIgMT47PGRpciAyPjsuLi47PGRpciBQPlxuLWQgPGRpcj5cdGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgc3BlY2lmaWVkICctZCBub25lJyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkdW1wIGZpbGVzXG4tdmVyYm9zZVx0cHJpbnQgYWNjZXNzZWQvcHJvY2Vzc2VkIGNvbXBpbGF0aW9uIHVuaXRzIFxuLXRpbWVcdFx0ZGlzcGxheSB0b3RhbCBjb21waWxhdGlvbiB0aW1lIGFuZCBzcGVlZCBpZiBsaW5lIGF0dHJpYnV0ZXMgYXJlIGVuYWJsZWRcbi1sb2cgPGZpbGVuYW1lPlx0c3BlY2lmeSBhIGxvZyBmaWxlIGZvciByZWNvcmRpbmcgcHJvYmxlbXNcbi1wcm9ncmVzc1x0XHRzaG93IHByb2dyZXNzIChvbmx5IGluIC1sb2cgbW9kZSlcbi1nWzo8bGV2ZWw+XVx0c3BlY2lmeSB0aGUgbGV2ZWwgb2YgZGV0YWlscyBmb3IgZGVidWcgYXR0cmlidXRlc1xuXHRcdC1nXHRnZW5lcmF0ZSBhbGwgZGVidWcgaW5mb1xuXHRcdC1nOm5vbmVcdG5vIGRlYnVnIGluZm9cblx0XHQtZzp7bGluZXMsdmFycyxzb3VyY2V9XHRvbmx5IHNvbWUgZGVidWcgaW5mb1xuLW5vd2Fyblx0XHRkbyBub3QgcmVwb3J0IHdhcm5pbmdzIFxuLXdhcm46PG1hc2s+XHRzcGVjaWZ5IHRoZSBsZXZlbCBvZiBkZXRhaWxzIGZvciB3YXJuaW5nc1xuXHRcdC13YXJuOm5vbmUgbm8gd2FybmluZ1xuXHRcdC13YXJuOntjb25zdHJ1Y3Rvck5hbWUsIHBhY2thZ2VEZWZhdWx0TWV0aG9kLCBkZXByZWNhdGlvbixcblx0XHRcdG1hc2tlZENhdGNoQmxvY2tzLCB1bnVzZWRMb2NhbHMsIHVudXNlZEFyZ3VtZW50cywgXG5cdFx0XHRzeW50aGV0aWNBY2Nlc3N9XG4tbm9JbXBvcnRFcnJvclx0ZG8gbm90IHJlcG9ydCBlcnJvcnMgb24gaW5jb3JyZWN0IGltcG9ydHNcbi1wcm9jZWVkT25FcnJvclx0a2VlcCBjb21waWxpbmcgd2hlbiBlcnJvciwgZHVtcGluZyBjbGFzcyBmaWxlcyB3aXRoIHByb2JsZW0gbWV0aG9kc1xuLXJlZmVyZW5jZUluZm9cdGNvbXB1dGUgcmVmZXJlbmNlIGluZm9cbi1wcmVzZXJ2ZUFsbExvY2Fsc1x0cmVxdWVzdCBjb2RlIGdlbiBwcmVzZXJ2ZSBhbGwgbG9jYWwgdmFyaWFibGVzXG4tcmVwZWF0IDxuPlx0cmVwZWF0IGNvbXBpbGF0aW9uIHByb2Nlc3MgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzXG4NCittaXNjLnVzYWdlID0gRWNsaXBzZSBKYXZhIENvbXBpbGVyIHswfSwgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDBcblxuVXNhZ2U6IDxvcHRpb25zPiA8c291cmNlIGZpbGVzIHwgZGlyZWN0b3JpZXM+XG5cbndoZXJlIG9wdGlvbnMgaW5jbHVkZTpcbi12ZXJzaW9uIG9yIC12XHRkaXNwbGF5cyB0aGUgdmVyc2lvbiBudW1iZXIgKHN0YW5kYWxvbmUgb3B0aW9uKVxuLWhlbHBcdGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgKHN0YW5kYWxvbmUgb3B0aW9uKVxuLW5vRXhpdFx0UHJldmVudCB0aGUgY29tcGlsZXIgdG8gY2FsbCBTeXN0ZW0uZXhpdCBhdCB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzXG4tY2xhc3NwYXRoIDxkaXIgMT47PGRpciAyPjsuLi47PGRpciBQPlxuLWQgPGRpcj5cdGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgc3BlY2lmaWVkICctZCBub25lJyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkdW1wIGZpbGVzXG4tdmVyYm9zZVx0cHJpbnQgYWNjZXNzZWQvcHJvY2Vzc2VkIGNvbXBpbGF0aW9uIHVuaXRzIFxuLXRpbWVcdFx0ZGlzcGxheSB0b3RhbCBjb21waWxhdGlvbiB0aW1lIGFuZCBzcGVlZCBpZiBsaW5lIGF0dHJpYnV0ZXMgYXJlIGVuYWJsZWRcbi1sb2cgPGZpbGVuYW1lPlx0c3BlY2lmeSBhIGxvZyBmaWxlIGZvciByZWNvcmRpbmcgcHJvYmxlbXNcbi1wcm9ncmVzc1x0XHRzaG93IHByb2dyZXNzIChvbmx5IGluIC1sb2cgbW9kZSlcbi1nWzo8bGV2ZWw+XVx0c3BlY2lmeSB0aGUgbGV2ZWwgb2YgZGV0YWlscyBmb3IgZGVidWcgYXR0cmlidXRlc1xuXHRcdC1nXHRnZW5lcmF0ZSBhbGwgZGVidWcgaW5mb1xuXHRcdC1nOm5vbmVcdG5vIGRlYnVnIGluZm9cblx0XHQtZzp7bGluZXMsdmFycyxzb3VyY2V9XHRvbmx5IHNvbWUgZGVidWcgaW5mb1xuLW5vd2Fyblx0XHRkbyBub3QgcmVwb3J0IHdhcm5pbmdzIFxuLXdhcm46PG1hc2s+XHRzcGVjaWZ5IHRoZSBsZXZlbCBvZiBkZXRhaWxzIGZvciB3YXJuaW5nc1xuXHRcdC13YXJuOm5vbmUgbm8gd2FybmluZ1xuXHRcdC13YXJuOntjb25zdHJ1Y3Rvck5hbWUsIHBhY2thZ2VEZWZhdWx0TWV0aG9kLCBkZXByZWNhdGlvbixcblx0XHRcdG1hc2tlZENhdGNoQmxvY2tzLCB1bnVzZWRMb2NhbHMsIHVudXNlZEFyZ3VtZW50cywgXG5cdFx0XHRzeW50aGV0aWNBY2Nlc3MsYXNzZXJ0SWRlbnRpZmllcn1cbi1ub0ltcG9ydEVycm9yXHRkbyBub3QgcmVwb3J0IGVycm9ycyBvbiBpbmNvcnJlY3QgaW1wb3J0c1xuLXByb2NlZWRPbkVycm9yXHRrZWVwIGNvbXBpbGluZyB3aGVuIGVycm9yLCBkdW1waW5nIGNsYXNzIGZpbGVzIHdpdGggcHJvYmxlbSBtZXRob2RzXG4tcmVmZXJlbmNlSW5mb1x0Y29tcHV0ZSByZWZlcmVuY2UgaW5mb1xuLXByZXNlcnZlQWxsTG9jYWxzXHRyZXF1ZXN0IGNvZGUgZ2VuIHByZXNlcnZlIGFsbCBsb2NhbCB2YXJpYWJsZXNcbi1yZXBlYXQgPG4+XHRyZXBlYXQgY29tcGlsYXRpb24gcHJvY2VzcyBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXNcbi1zb3VyY2UgMS40XHRcbkFjdGl2ZSB0aGUgYXNzZXJ0aW9uIGluc2lkZSB0aGUgY29tcGlsZXIuIEJ5IGRlZmF1bHQgYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQuDQpkaWZmIC0tZ2l0IGEvYnVpbGQucHJvcGVydGllcyBiL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggNTg4MTRkZC4uZjY5NWUyMiAxMDA2NDQKLS0tIGEvYnVpbGQucHJvcGVydGllcworKysgYi9idWlsZC5wcm9wZXJ0aWVzCkBAIC00LDYgKzQsNyBAQAogCQkJCWJ1aWxkLnByb3BlcnRpZXMsXA0KIAkJCQlzY3JpcHRzLw0KIA0KK2J1aWxkLnZhai5FY2xpcHNlXCBKYXZhXCBBbnRcIENvbXBpbGVyPUVjbGlwc2UgSmF2YSBBbnQgQ29tcGlsZXINCiBidWlsZC52YWouRWNsaXBzZVwgSmF2YVwgQmF0Y2hcIENvbXBpbGVyPUVjbGlwc2UgSmF2YSBCYXRjaCBDb21waWxlcg0KIGJ1aWxkLnZhai5FY2xpcHNlXCBKYXZhXCBDb2RlXCBBc3Npc3Q9RWNsaXBzZSBKYXZhIENvZGUgQXNzaXN0DQogYnVpbGQudmFqLkVjbGlwc2VcIEphdmFcIENvbXBpbGVyPUVjbGlwc2UgSmF2YSBDb21waWxlcg0KQEAgLTEyLDcgKzEzLDggQEAKIGJ1aWxkLnZhai5FY2xpcHNlXCBKYXZhXCBGb3JtYXR0ZXI9RWNsaXBzZSBKYXZhIEZvcm1hdHRlcg0KIGJ1aWxkLnZhai5FY2xpcHNlXCBKYXZhXCBNb2RlbD1FY2xpcHNlIEphdmEgTW9kZWwNCiANCi1zb3VyY2UuamR0Y29yZS5qYXIgPSBFY2xpcHNlIEphdmEgQmF0Y2ggQ29tcGlsZXIsXA0KK3NvdXJjZS5qZHRjb3JlLmphciA9IEVjbGlwc2UgSmF2YSBBbnQgQ29tcGlsZXIsXA0KKwkJCQkJIEVjbGlwc2UgSmF2YSBCYXRjaCBDb21waWxlcixcDQogCQkJCQkgRWNsaXBzZSBKYXZhIENvZGUgQXNzaXN0LFwNCiAJCQkJCSBFY2xpcHNlIEphdmEgRm9ybWF0dGVyLFwNCiAJCQkJCSBFY2xpcHNlIEphdmEgQ29tcGlsZXIsXA0KZGlmZiAtLWdpdCBhL2NoYW5nZXMudHh0IGIvY2hhbmdlcy50eHQKaW5kZXggMDJiYzc4Mi4uMWJlOTE1YiAxMDA2NDQKLS0tIGEvY2hhbmdlcy50eHQKKysrIGIvY2hhbmdlcy50eHQKQEAgLTEsMTQgKzEsNTUgQEAKLVNUUkVBTTogMS4wIE5MDQorU1RSRUFNOiAyLjANCiANCi1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcA0KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wIChzaW5jZSAwLjkpDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgKiBKQ0sxLjNhIGNvbXBsaWFudC4gDQogICAqIEFsbCBtZXNzYWdlcyBoYXZlIGJlZW4gZXh0ZXJuYWxpemVkLiANCisgICogQWRkZWQgMiBuZXcgQVBJcyBvbiBKYXZhQ29udmVudGlvbnMgZm9yIGNsYXNzcGF0aCB2YWxpZGF0aW9uLg0KKyAgICAgICAgIC0gSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aChJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgDQorICAgICAgICAgLSBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgYm9vbGVhbiBjaGVja1NvdXJjZUF0dGFjaG1lbnQpIA0KKyAqIEFudCBFY2xpcHNlIGNvbXBpbGVyIHRhc2sgYWRkZWQgKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFudC5KZHRjb20pDQorICogQXNzZXJ0aW9ucyBzdXBwb3J0IGVuYWJsZWQ6IGJ5IGRlZmF1bHQgdGhlIGNvbXBpbGVyIGlzIDEuMyBjb21wbGlhbnQsIGJ1dCBpdCBjYW4gb3B0aW9uYWxseSBiZSB0dXJuZWQgaW50byBzb3VyY2UgMS40IG1vZGUgY2YuIEphdmFDb3JlIG9wdGlvbnMuDQorICogQWRkZWQgbmV3IEFQSXMgb24gSmF2YUNvcmUgc28gYXMgdG8gY2hhbmdlIG9wdGlvbmFsIHNldHRpbmdzIChjb21waWxlciwgZm9ybWF0dGVyLCBjb2RlYXNzaXN0LCAuLi4pLiANCisgCQktIERlc2NyaXB0aW9uIG9mIGF2YWlsYWJsZSBvcHRpb25zIGlzIGF2YWlsYWJsZSBpbiBKYXZhQ29yZS5pbmkgCWFsb25nIHdpdGggZGVmYXVsdCB2YWx1ZXMuIA0KKyAJCS0gT3B0aW9uIHNldHRpbmdzIGFyZSBnbG9iYWxseSBrZXB0IG9uIEphdmFDb3JlLg0KKw0KK1BScyBGaXhlZCBpbiB0aGlzIFJlbGVhc2UgKHNpbmNlIDEuME5MIHN0cmVhbSkNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorMUdJNlQ0WTogSVRQSkNPUkU6V0lOTlQgLSBOUEUgaW4gSmF2YU1vZGVNYW5hZ2VyIHJldHJpZXZpbmcgd29ya3NwYWNlIG9wdGlvbnMNCisxR0U0SUxSOiBJVFBKQ09SRTpBTEwgLSBFdmFsIC0gRXZhbHVhdGlvbiBpbiBCaW5hcnkgUHJvamVjdCBmYWlscw0KKzFHSTNMTEM6IElUUEpDT1JFOkFMTCAtIEluY29ycmVjdCBmb3JtYXR0aW5nIGZvciB0aGUgbmV3IGtleXdvcmQNCisxR0hVNk81OiBJVFBKQ09SRTpXSU5OVCAtIFJNSUMgdGVzdCBmYWlsDQorMUdISDZPNzogSVRQSkNPUkU6QUxMIC0gTmVlZCB0byB0dW5lIHRoZSBleGNlcHRpb24gYW5hbHlzaXMgZm9yIEFzc2VydFN0YXRlbWVudA0KKzFHSFVXN1Q6IElUUEpDT1JFOldJTjIwMDAgLSBCdWlsZCBQcm9ibGVtDQorMUdJM0lHOTogSVRQSkNPUkU6QUxMIC0gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgaW52b2x2aW5nIGJvZ3VzIG1ldGhvZC9maWVsZCBkZWNsYXJhdGlvbg0KKzFHSFU0UEs6IElUUEpDT1JFOldJTk5UIC0gTm9TdWNoTWV0aG9kRXJyb3Igd2hlbiBydW5uaW5nIHByb2dyYW0NCisxR0hPTkFYOiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgdXNlcyBkaWZmZXJlbnQgbmFtZSBsb29rdXAgZm9yIHJlZmFjdG9yaW5nDQorMUdFSllBSjogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGVyIC0gQmluZGluZyBvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIGlzIG51bGwNCisxR0hGSFdSOiBJVFBKQ09SRTpBTEwgLSBBc3NlcnRpb25zOiBDb2RlQXNzaXN0IGFuZCBTZWxlY3Rpb24gbmVlZCB0byBiZSB1cGRhdGVkDQorMUdIRkhYRzogSVRQSkNPUkU6QUxMIC0gQXNzZXJ0aW9uczogQWRkIG9wdGlvbmFsIHdhcm5pbmcgb24gYXNzZXJ0IGlkZW50aWZpZXINCisxR0NaOVZNOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29tcGlsZXIgLSBCYXRjaCBjb21waWxlciBzaG91bGQgYmUgQVBJDQorMUdITzZRUjogSVRQSkNPUkU6V0lOTlQgLSBDb2RlIEFzc2lzdCAtIG5vIG1ldGhvZCBjb21wbGV0aW9uIHdoZW4gcmV0dXJuIHR5cGUgaXMgc2Vjb25kYXJ5IG9uZQ0KKzFHSDBBVTc6IElUUEpDT1JFOkFMTCAtIEV2YWwgLSBWZXJpZnlFcnJvciBpbiBzY3JhcGJvb2sgcGFnZQ0KKzFHSDJSNjI6IElUUEpDT1JFOldJTjIwMDAgLSBUeXBvIGluIHByb2dyZXNzIG1lc3NhZ2UNCisxR0dZTDMyOiBJVFBKQ09SRTpBTEwgLSBEZWZhdWx0IHN1cGVydHlwZXMgYXJlIG5vdCB2aXNpYmxlIHdoZW4gcXVhbGlmaWVkDQorMUdERkpLMDogSVZKSURUOldJTjIwMDAgLSBVc2luZyAnc3luY2hyb25pemVkJyBwcm9kdWNlcyBpbnZhbGlkIGV4Y2VwdGlvbiB0YWJsZSB2YWx1ZXMgaW4gY2xhc3MsIGNhdXNlcyAiSWxsZWdhbCBleGNlcHRpb24gdGFibGUgcmFuZ2UiIGV4Y2VwdGlvbiwgVkFKIDMuNSsgDQorMUdHQUs2RzogSVRQSkNPUkU6QUxMIC0gSW5jb3JyZWN0IGphdmFkb2MgY29tbWVudCBpbiBKYXZhRWxlbWVudCANCisxR0Y5TDNLOiBJVFBEVUk6QUxMIC0gRXZhbCAtIFByaXZhdGUgYXJyYXkgcmVzb2x1dGlvbiBmYWlsdXJlIA0KKzFHRjhLSFg6IElUUEpVSTpBTEwgLSBJbnZhbGlkIHByb2plY3QgYnVpbGQgcGF0aCBzaG91bGQgYmUgd2FybmluZywgbm90IGVycm9yIA0KKzFHRjdKSUg6IElUUEpDT1JFOkFMTCAtIEV4Y2VwdGlvbiB3aGVuIHJlbW92aW5nIG5ldHdvcmsgZHJpdmUgDQorMUdFWUJMOTogSVRQSlVJOldJTk5UIC0gQWRkaW5nIHNvdXJjZSBmb2xkZXJzIG9uIENQIGlzIHZlcnkgY29uZnVzaW5nIA0KKzFHRUpBT1Q6IElUUEpVSTpXSU5OVCAtIEpSRSBTb3VyY2UgYXR0YWNobWVudCBzZXQgdG8gcGF0aCB0byBkb2VzIG5vdCBleGlzdCANCisxR0VIWk5COiBJVFBKVUk6V0lOTlQgLSBzbW9rZSAxMTQ6IGZvcm1hdHRlciBpbnNlcnRzIGV4dHJhIHRhYiBpbiBmaXJzdCBsaW5lIA0KKzFHQ1paVDQ6IElUUEpDT1JFOkZhdWx0LXRvbGVyYW5jZSAtIG1pc3NpbmcgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjb3VsZCBzdGlsbCBhbnN3ZXIgdGhlIGFsbG9jYXRlZCB0eXBlIA0KKzFHQVU5NlA6IElUUEpDT1JFOldJTk5UIC0gRENSIC0gSk0gLSBKYXZhUHJvamVjdCBzaG91bGQgcHJvdmlkZSBhIGNsYXNzIHBhdGggdmFsaWRhdGlvbiBtZXRob2QgDQorMUc3QTFUTDogSVRQSkNPUkU6V0lOTlQgLSBEQ1IgLSBKTSAtIFJ1bGVzIGZvciBjbGFzc3BhdGggbm90IHNwZWNpZmllZCANCisxRlZWV1pUOiBJVFBKQ09SRTpBTEwgLSBKTSAtIElCaW5hcnlUeXBlIHNob3VsZCBpbXBsZW1lbnQgZ2V0U291cmNlRmlsZU5hbWUoKSANCisNCiANCiBQUnMgRml4ZWQgaW4gMS4wTkwgc3RyZWFtIChzaW5jZSAwLjkpDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIDFHR0NZRVU6IElUUEpDT1JFOkFMTCAtIFVzaW5nIEFudCBmb3IgYnVpbGQgc2tpcCBmaWxlcw0KLTFHSDMyMTg6IElUUEpVSTpXSU4gLSBtbmVtb25pYyBwcm9ibGVtcw0KKzFHSDMyMTg6IElUUEpVSTpXSU4gLSBtbnVlbW9uaWMgcHJvYmxlbXMNCiAxR0dMTFVHOiBJVFBKQ09SRTpXSU5OVCAtIEBkZXByZWNhdGVkIGRvZXMgbm90IHdvcmsgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSBUQUIgDQogMUdHOFQ4SDogSVRQSkNPUkU6QUxMIC0gSkNLMS4zYSAtIGRhc2cwNDIwMyAtIGRlZmluaXRlbHkgYXNzaWduZWQgdmFsdWUgYmVmb3JlIHRoZSB0aGlyZCBvcGVyYW5kIG9mIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvciA/IDogDQogMUdHOFQ1NjogSVRQSkNPUkU6QUxMIC0gSkNLMS4zYSAtIGRhc2cwNDEwMyAtIGRlZmluaXRlbHkgYXNzaWduZWQgdmFsdWUgYmVmb3JlIHRoZSBzZWNvbmQgb3BlcmFuZCBvZiB0aGUgY29uZGl0aW9uYWwgb3BlcmF0b3IgPyA6IA0KQEAgLTI5LDQgKzcwLDEyOCBAQAogMUdGOVkwMTogSVRQQ09SRTpXSU4yMDAwIC0gTlBFIHdoZW4gZGVsZXRpbmcgZXZlcnl0aGluZyBpbiBhIGphdmEgZmlsZSBhbmQgc2F2aW5nIGl0LiANCiAxRzJGMURUOiBJVFBKQ09SRTpXSU5OVCAtIEVycm9yIG1lc3NhZ2VzIG5vbiBOTFMgZm9yIEphdmFNb2RlbFN0YXR1DQogMUdHQ1FaMzogSVRQSkNPUkU6QUxMIC0gTkwgcHJvYmxlbXMgaW4geG1sIGZpbCAgDQotMUdGSVJTTjogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc3BhdGggLSBTaG91bGQgYWxsb3cgbmVzdGluZyBpbiBiaW5hcnkgb3V0cHV0IHdoZW4gbm8gc291cmNlIGZvbGRlciBpbiBvbiBDUCANCisxR0ZJUlNOOiBJVFBKQ09SRTpXSU5OVCAtIENsYXNzcGF0aCAtIFNob3VsZCBhbGxvdyBuZXN0aW5nIGluIGJpbmFyeSBvdXRwdXQgd2hlbiBubyBzb3VyY2UgZm9sZGVyIGluIG9uIENQDQorDQorDQorUFJzIENsb3NlZCBpbiB0aGlzIFJlbGVhc2UNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorMUdHUkNHWjogSVRQSlVJOldJTjIwMDAgLSBDYW4ndCByZW5hbWUvY29weS9tb3ZlL2RlbGV0ZSBkZWZhdWx0IHBhY2thZ2UNCisxR0RSWEhQOiBJVFBEVUk6V0lOTlQgLSBOUEUgaW5zcGVjdGluZyBsb2NhbCB2YXINCisxRzdSQU81OiBJVFBKQ09SRTpBTEwgLSBKYXZhIE1vZGVsIENvcmUgVGVzdHM6IEphdmFQcm9qZWN0VGVzdHM+PnRlc3RQcm9qZWN0Q2xvc2UoKSBoYXMgYmVlbiByZW1vdmVkDQorMUdGN1BaVzogSVRQSkNPUkU6V0lOTlQgLSBFdmFsdWF0aW9uIC0gV2Fsa2JhY2sgcmVwb3J0aW5nIGVycm9yIG9uIGxvY2FsIHZhcmlhYmxlIHR5cGUgDQorMUdHTE5PUTogSVRQSkNPUkU6V0lOTlQgLSBAZGVwcmVjYXRlZCBkb2VzIG5vdCB3b3JrIGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgVEFCIC0gdXNlIGEgc3BhY2UgaW5zdGVhZC4gDQorMUcyOTVGRTogSVRQSkNPUkU6QUxMIC0gSW1wcm92ZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgbWFuYWdlbWVudCBmb3IgamF2YSBwcm9qZWN0IA0KKzFHRlEzRkQ6IElUUEpVSTpXSU5OVCAtIE5vbiBqYXZhIHJlc291cmNlcyBkbyBub3Qgc2hvdyB1cCB1bmRlciBkZWZhdWx0IHBhY2thZ2UsIGJ1dCBkbyB1bmRlciBvdGhlciBwYWNrYWdlcyANCisxR0ZCSlM5OiBJVFBKVUk6QUxMIC0gVW5ib3VuZCB2YXJpYWJsZSBwYXRoIHRhc2sgbm90IHJlbW92ZWQgDQorMUdGMkxBNzogSVRQSkNPUkU6V0lOTlQgLSBBZGRpbmcgY2xhc3NwYXRoIHZhcmlhYmxlIHRyaWdnZXJzIG1hbnkgYnVpbGRzPyANCisxR0VBSEcxOiBJVFBKQ09SRTpXSU4yMDAwIC0gUG9zaXRpb25zIG9mIHR5cGUgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMgDQorMUdENTdZWTogSVRQSkNPUkU6V0lOTlQgLSBVbmhhbmRsZWQgZXhjZXB0aW9uIGluIHN0YW5kYWxvbmUgY29tcGlsZXIgDQorMUdCUExBUDogSVRQSlVJOldJTk5UIC0gY3JlYXRlIGNsYXNzL3BhY2thZ2Ugbm90IGFsbG93ZWQgd2l0aCB1bWxhdXQgDQorMUc4MkNFWDogSVRQSkNPUkU6QWRkaW5nIGV2YWx1YXRpb24gc3VwcG9ydCBpbiBkZWJ1Z2dlciANCisxRzRHRUxBOiBJVFBKQ09SRTpXSU5OVCAtIE5QRTogYWZ0ZXIgcmVzdGFydGluZyBhIGNyYXNoZWQgd29ya2JlbmNoIA0KKzFHM0ZWNFM6IElUUEpDT1JFOldJTiAtIERPTUV4Y2VwdGlvbiB3aGVuIHJlbmFtaW5nIGNvbnN0cnVjdG9yIA0KKzFHMEswT0k6IElUUENPUkU6QUxMIC0gVG9vIG1hbnkgSUNvbXBpbGF0aW9uVW5pdHMgDQorMUZSVE42NzogSVRQSkNPUkU6QUxMIC0gSk0gLSBDb2RlQXNzaXN0L1R5cGVIaWVyYXJjaHkgb3B0aW1pemF0aW9uIA0KKzFGSk9RU0g6IExGQ09NOldJTk5UIC0gdXNhZ2Ugb2Ygc3RyaWN0ZnAgbW9kaWZpZXIgDQorMUZGWURHRDogTEZDT006QUxMIC0gV2VpcmQgYmVoYXZpb3Igb24gaW5jb3JyZWN0IHNvdXJjZSANCisxRVROWUQyOiBJVkpJRFQ6QUlYIC0gRm9ybWF0IGNvZGUgd2l0aCAiRXhwZXJtaW5lbnQgd2l0aCBDb2RlIiANCisxRVRBTTM4OiBJVkpJRFQ6QUlYIC0gQ29kZSBGb3JtYXR0ZXIgZG9lcyBub3QgcHV0IENSIGFmdGVyIGNvbW1lbnQgZW5kIA0KKzFHRTkwNk86IElUUEpDT1JFOkFMTCAtIEhhdmluZyB0cm91YmxlIGdldHRpbmcgcHJvamVjdHMgdG8gYnVpbGQgcHJvcGVybHkgLSBwcm9qZWN0IHByb3BlcnRpZXMgbm90aW5nIGdldHRpbmcgc2V0IGNvcnJlY3RseSANCisxR0U2VjVXOiBJVFBKQ09SRTpXSU5OVCAtIFByb2JsZW1zIHNhdmluZyB3b3Jrc3BhY2UgDQorMUdEWENZNzogSVRQSkNPUkU6V0lOMjAwMCAtIEFkZGluZyBhIHByb2plY3QgdG8gYnVpbGQgcGF0aCBkb2Vzbid0IHRyaWdnZXIgYnVpbGQgaW4gZGVwZW5kZW50cyANCisxR0FNNFJJOiBJVFBKQ09SRTpXSU5OVCAtIEVycm9ycyBkaWQgbm90IGdvIGF3YXkgYWZ0ZXIgYWRkaW5nIGphcnMgdG8gYnVpbGRwYXRoIA0KKzFHQUpCT0I6IElUUEpVSTpXSU5OVCAtIENvZGUgQXNzaXN0IGNvbnRpbnVlcyBhZnRlciBlbnRlcmluZyBibGFuayANCisxRzRDTFpNOiBJVFBKVUk6V0lOTlQgLSAnSW1wb3J0IFNlbGVjdGlvbicgLSBTZXQgbm90IGZvdW5kIA0KKzFHNDdIV1U6IElUUEpVSTpXSU5OVCAtIE1ldGhvZCBTdHViIEdlbmVyYXRpb246IEVycm9yIG9uIG1ldGhvZHMgdGhyb3dpbmcgRXhjZXB0aW9ucyANCisxRzNIMjFaOiBJVFBKQ09SRTpBTEwgLSBQYWNrYWdlIGZyYWdtZW50IHJlb3JnYW5pemF0aW9uIHByb2JsZW1zIA0KKzFGV0NEWU46IElUUEpVSTpXSU5OVCAtIHJlc291cmNlcyBwcmVtYXR1cmVseSBtYWRlIGxvY2FsIA0KKzFGV0FQR0o6IElUUEpDT1JFOkFMTCAtIFN5bmNocm9uaXphdGlvbiBpcyBjb25mdXNpbmcgd2l0aCBKYXZhIGJ1aWxkZXIgDQorMUZXOE1BSTogSVRQQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgZG9lcyBub3QgcmVjb21waWxlIGFsbCB0aGUgY2xhc3NlcyANCisxRlc2SlFHOiBJVFBVSTpXSU5OVCAtIEpvaW5pbmcgYSB0ZWFtIG1heSBoYXZlIGluY29ycmVjdCBjbGFzc3BhdGggDQorMUdFQVgzUjogSVRQSkNPUkU6V0lOMjAwMCAtIGJhZCBlcnJvciBtZXNzYWdlIGZvciBhbWJpZ3VvdXMgcmVmZXJlbmNlcyANCisxR0RKMVFVOiBJVFBKQ09SRTpXSU5OVCAtIE5QRSBidWlsZGluZyBwcm9qZWN0IA0KKzFHRDBNTFM6IElUUEpDT1JFOkFMTCAtIFN0YWNrIHRyYWNlcyBpbiBsb2cgb2YgdW5rbm93biBvcmlnaW4gDQorMUcwVVlPUTogSVRQSkNPUkU6QUxMIC0gRGlmZmVyZW50IHRleHQgcmFuZ2UgZGVmaW5pdGlvbnMgDQorMUdGSjc2NDogSVRQSkNPUkU6QUxMIC0gSW5jb25wYXRpYmxlIGNvbmRpdGlvbmFsIG9wZXJhbmQgdHlwZXMgDQorMUdGQkZWNzogSVRQSkNPUkU6V0lOTlQgLSBSZXNvdXJjZSBjb3B5IC0gc2hvdWxkIG5vdCBjb3B5IG5lc3RlZCBpbnRlcm5hbCBKQVJzIA0KKzFHRjlPVzc6IElUUEpDT1JFOkFMTCAtIEJ1aWxkIHNpbGVudGx5IGZhaWxzIGZvciByZWFwcGVhcmluZyBkZWxldGVkIGNsYXNzZXMgDQorMUdFT1k0MTogSVRQSkNPUkU6V0lOTlQgLSBEZWx0YVByb2Nlc3NvciAtIGNyZWF0ZUVsZW1lbnRzIHNlZW1zIGJvZ3VzIA0KKzFHRU5ZM0k6IElUUEpVSTpXSU5OVCAtIFJlbmFtZSBSZWZhY3RvcmluZyBpbnRyb2R1Y2VkIGNvbXBpbGUgZXJyb3JzIA0KKzFHRUpDMDg6IElUUEpDT1JFOldJTjIwMDAgLSBBc3NlcnRpb24gZmFpbGVkIGluIGJ1aWxkZXIgDQorMUdFSTFTUzogSVRQSkNPUkU6QUxMIC0gLmphdmEgZmlsZSBvdXRzaWRlIG9mIHRoZSBjbGFzc3BhdGggc2hvdWxkIGJlIGEgY29tcGlsYXRpb24gdW5pdCANCisxR0U2UEdZOiBJVFBKVUk6QUxMIC0gV3JvbmcgY2xhc3MgZXZlcnl3aGVyZSANCisxR0UyVVVOOiBJVFBEVUk6SW5kZXhPdXRPZkJvdW5kcyBkdXJpbmcgZXZhbD8gDQorMUdFMjVWRTogSVRQSlVJOldJTjIwMDAgLSBDYW5ub3Qgc2VhcmNoIG9uIHRleHQgc2VsZWN0aW9uIA0KKzFHRFhEN1U6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIG5vdCB3b3JraW5nIGZvciBwcm9qZWN0cyANCisxR0RYNUUzOiBJVFBKQ09SRTpXSU5OVCAtIEFzc2VydGlvbiBmYWlsZWQgd2hlbiByZW5hbWUgSmF2YSBQcm9qZWN0IA0KKzFHRFRUN0I6IElUUEpDT1JFOldJTjIwMDAgLSBDbGFzc3BhdGggZXh0ZW5zaW9uIGluIGphciBtYW5pZmVzdCBub3QgcmVzcGVjdGVkIA0KKzFHRE1NQko6IElUUERVSTpXSU5OVCAtIFN0YWNrIHRyYWNlIG9uIGluc3BlY3QgDQorMUdES0xCNjogSVRQRFVJOkxpbnV4IC0gSW5zcGVjdCBmcm9tIGVkaXRvciBicm9rZW4gaW4gbGludXggDQorMUdESjNCSjogSVRQSkNPUkU6V0lOTlQgLSBFcnJvciB3aGlsZSB0eXBpbmcgaW4gZWRpdG9yIA0KKzFHRElVTVE6IElUUEpDT1JFOldJTk5UIC0gQnVpbGQgdGltZSBhbm9tYWx5IHdoZW4gZG9pbmcgaW5jcmVtZW50YWwgYnVpbGRzIA0KKzFHREc5NzE6IElUUEpDT1JFOldJTjIwMDAgLSBDbGFzc3BhdGggY2hhbmdlcyBhcmVuJ3QgaG9ub3JlZCBieSB0aGUgYnVpbGRlciANCisxR0REV0ZNOiBJVFBKQ09SRTpXSU5OVCAtIEJ1aWxkZXIgbGVhdmluZyBib2d1cyBlcnJvcnMgYWZ0ZXIgYXV0by1idWlsZCArIGhhbmQgYnVpbGQgDQorMUdEQkwxQjogSVRQSkNPUkU6V0lOMjAwMCAtIFRocm93YWJsZSB0eXBlIGhpZXJhcmNoeSBjYWxjdWxhdGlvbiBpcyBzbG93IA0KKzFHRDRLWTI6IElUUEpDT1JFOldJTk5UIC0gRmFsc2UgY29tcGlsZSBlcnJvcnMgbm90IGdvaW5nIGF3YXkgd2hlbiBidWlsZGluZyBieSBoYW5kIA0KKzFHQ1RHNjU6IElUUEpVSTpXSU4yMDAwIC0gQ2xhc3NwYXRoIGZpbGUgaXMgY29waWVkIHRvIGJpbiANCisxR0NSOU1UOiBJVFBKQ09SRTpXSU5OVCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBjcmVhdGluZyBhIHRleHQgZmlsZSANCisxR0NQNkxSOiBJVFBKVUk6V0lOTlQgLSBVc2VyIG11c3QgZ2V0IGZlZWRiYWNrIGlmIC5jbGFzc3BhdGggZmlsZSBpcyBtYW5pcHVsYXRlZCANCisxR0NORkMyOiBJVFBKQ09SRTpBTEwgLSBBcnJheUluZGVPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBDb2RlQXNzaXN0IA0KKzFHQ04yTjQ6IElUUEpVSTpXSU4yMDAwIC0gV2Fsa2JhY2sgd2hpbGUgb3JnYW5pemluZyBpbXBvcnRzIA0KKzFHQ0ZaUEE6IElUUEpDT1JFOldJTk5UIC0gQ291bGQgU291cmNlUmFuZ2UgYmUgcHVibGljIEFQST8gDQorMUdDRk5RUjogSVRQSkNPUkU6V0lOTlQgLSBIb3cgc2hvdWxkIHRoZSBwYXRoIGluIElUeXBlTmFtZVJlcXVlc3RvciBiZSB1c2VkPyANCisxR0NCUTJFOiBJVFBKQ09SRTpXSU5OVCAtIGhvdyB0byBlZmZpY2llbnRseSBmaW5kIG1ldGhvZHMgYWxvbmcgJ3RoZSByaXBwbGUnPyANCisxR0JSTFNWOiBJVFBKQ09SRTpXSU4yMDAwIC0gUXVlc3Rpb246IGhvdyB0byBJIGZpbmQgYW4gaW5uZXIgdHlwZSANCisxR0JBTE4xOiBJVFBKVUk6SW5jb3JyZWN0IHNvdXJjZSBmb3IgY3JlYXRlZCBjbGFzcyANCisxR0FVVVE5OiBJVFBKQ09SRTpXSU5OVCAtIEphdmFCdWlsZGVyIGRvZXNuJ3QgaGFuZGxlIGludGVybmFsIGV4Y2VwdGlvbnMgZHVyaW5nIGZ1bGwgYnVpbGQgDQorMUdBUDFRQzogSVRQSkNPUkU6V0lOTlQgLSBKYXZhUHJvamVjdC5jb25maWd1cmUgY3JlYXRlcyBpbnZhbGlkIG91dHB1dCBwYXRoIA0KKzFHQU1MMk86IElUUEpDT1JFOldJTk5UIC0gTlBFIGR1cmluZyBzdGFydC11cCANCisxR0FMWjlOOiBJVFBKQ09SRTpXSU5OVCAtIENvbXBpbGVyIHdvcmsgYmVpbmcgZG9uZSBvbiBlbXB0eSBwcm9qZWN0cyANCisxR0FKODJNOiBJVFBKVUk6V0lOTlQgLSB3YWxrYmFjayB3aGVuIGRlbGV0ZSBhIGphciBmcm9tIGEgamF2YSBwcm9qZWN0IA0KKzFHQUg3S0g6IElUUEpDT1JFOldJTk5UIC0gUmVvcGVuZWQgcHJvamVjdHMgc2hvdyB0aGUgYmluIGZvbGRlciBhcyBhIHBhY2thZ2UgDQorMUc4NjcwNDogSVRQSlVJOldJTk5UIC0gRHJhcCduRHJvcCBkb2Vzbid0IGdpdmUgb3BlcmF0aW9uIHByb2dyZXNzIA0KKzFHODQwQkU6IElUUEpVSTpXSU5OVCAtIGNvZGUgYXNzaXN0IC0gb25seSBzb21lIGtleXdvcmRzIGFyZSByZWNvZ25pemVkIA0KKzFHODJEMTc6IElUUEpDT1JFOldJTk5UIC0gZ2V0SmF2YU1vZGVsKElXb3Jrc3BhY2UpIGxvb2tzIGxpa2UgYW4gYWNjZXNzb3IgYnV0IGl0IGRvZXMgY3JlYXRpb24gDQorMUc1OEgxNDogSVRQSkNPUkU6V0lOOTggLSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBidWlsZGluZyBhIGJpZyB3b3JrYmVuY2ggDQorMUc0VzJYQjogSVRQSkNPUkU6V0lOOTggLSBDb2RlQXNzaXN0IHNob3VsZCBub3QgYWx3YXlzIHJlcG9ydCBhbiBlcnJvciB3aGVuIG5vIGNvbXBsZXRpb24gd2FzIGZvdW5kIA0KKzFHNFUxQ1o6IElUUEpDT1JFOldJTk5UIC0gSmF2YURDRHVwbGljYXRlSW5uZXJDbGFzc05hbWUgdGVzdCBpcyBmYWlsaW5nIA0KKzFHNEVOUUk6IElUUEpVSTpXSU4gLSBOZXdJbnRlcmZhY2Ugd2l6YXJkIGFkZHMgd3JvbmcgaW1wb3J0IGZvciBpbm5lciB0eXBlcyANCisxRzRDS1ZHOiBJVFBKQ09SRTpXSU4gLSBDYW4ndCBwYXRjaCBjbGFzc2VzIGluIGphciANCisxRzQyNlc2OiBJVFBKQ09SRTpXSU5OVCAtIFZlcmlmeUVycm9yIHJ1bm5pbmcganJlIEVjbGlwc2UgMDEwIHdpdGggdGhlIElCTSAxLjMgVk0gDQorMUc0MUdINzogSVRQSkNPUkU6V0lOTlQgLSBhZGRpbmcgYSBwcm9qZWN0IGludm9rZXMgYSByZWNvbXBpbGUgDQorMUczVDBPTzogSVRQSkNPUkU6V0lOTlQgLSBJbnZpc2libGUgY2xhc3MgaW4gYWxsIHBvc3NpYmxlIHN1cGVyIGNsYXNzZXMgDQorMUczTUtXVDogSVRQSkNPUkU6V0lOIC0gV291bGQgbGlrZSBtb3JlIHByb2dyZXNzIG9uIGphdmEgcmVvcmcgb3BlcmF0aW9ucyANCisxRzNEUDVaOiBJVFBKQ09SRTpXSU4gLSBJUGFja2FnZUZyYWdtZW50LmRlbGV0ZSgpIGRvZXNuJ3QgZGVsZXRlIHJlc291cmNlcyANCisxRzMxQTAzOiBJVFBKQ09SRTpXSU45OCAtIEJ1aWxkaW5nIHZzLiBwYWNrYWdpbmcgDQorMUcyTlc2VjogSVRQSlVJOldJTjIwMDAgLSBPcGVuIG9uIHNlbGVjdGlvbiBkb2Vzbid0IHdvcmsgZm9yIGlubmVyIGNsYXNzZXMgDQorMUcxNE04RTogSVRQQ09NOldJTk5UIC0gV3JvbmcgY29tcGxldGlvbiB3aGVuIHBhY2thZ2UgbmFtZSBjb2xsaWRlcyB3aXRoIGEgY2xhc3MgbmFtZSANCisxRzAzR1dKOiBJVFBKQ09SRTpBTEwgLSBUeXBlSGllcmFyY2h5IHVwZGF0ZSB0dW5pbmcgDQorMUZZRUg3UjogSVRQSkNPUkU6V0lOTlQgLSBDb3JlRXhjZXB0aW9uIHJ1bm5pbmcgV29ya2luZ0NvcHlUZXN0cyB3aXRoIGF1dG9idWlsZCBvbiANCisxRlk5NFhBOiBJVFBKQ09SRTpXSU5OVCAtIEpNIC0gdGVzdFdvcmtpbmdDb3B5R2VuZXJhbCgpIHRlc3RzIHJhbmRvbWx5IGZhaWwgDQorMUZYT0FTMzogSVRQSkNPUkU6QUxMIC0gSkRPTSAtIHJlbW92ZSBkZXByZWNhdGVkIG1ldGhvZCAjZmluZE5vZGUgDQorMUZXWUtCMjogSVRQSkNPUkU6V0lOOTggLSBGZWF0dXJlOiBXaGVuIEkgb3BlbiBhIGNsYXNzIGZpbGUgZm9yIGEgbWVtYmVyIHR5cGUuLi4gDQorMUZXWDczUzogSVRQSkNPUkU6V0lOTlQgLSBKYXZhIEJ1aWxkZXIgZXJyb3Igd2hlbiBzYXZpbmcgaHRtbCBmaWxlIA0KKzFGV1dVMjg6IElUUEpDT1JFOldJTjk4IC0gQ2Fubm90IGFjY2VzcyBjb21waWxhdGlvbiB1bml0IC0gUmVhc29uOiBKYXZhIEltYWdlIEJ1aWxkZXIgDQorMUZXVVo5SjogSVRQSkNPUkU6V0lOTlQgLSBBZGQgYXV0b2J1aWxkaW5nIG9wdGlvbiB0byB0ZXN0IHN1aXRlIA0KKzFGV1VYVEg6IElUUEpDT1JFOldJTk5UIC0gSmF2YSBJbWFnZSBCdWlsZGVyIGVycm9yIG1lc3NhZ2Ugbm8gaGVscCANCisxRldUNUNQOiBJVFBKQ09SRTpBTEwgLSBEaXNhYmxlIHRpbWVzdGFtcHMgYXNzZXJ0aW9uIGZhaWxlZCANCisxRldTVDdLOiBJVFBKQ09SRTpXSU5OVCAtIFNDRU5BUklPIEIzIC0gZXJyb3Igc2F2aW5nIGpzcCANCisxRldOTEw0OiBJVFBKQ09SRTpXSU4yMDAwIC0gIkVkaXRpbmciIGludGVybmFsIGphciByZXN1bHRzIGluIEltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uIA0KKzFGV04yNFc6IElUUFNSQ0VESVQ6V0lOIC0gR2V0IGVycm9yIG1lc3NhZ2UgaWYgY2xhc3Mgbm90IHNhdmVkIC0gdGFzayBsaXN0IG91dCBvZiBzeW5jIA0KKzFGV0hXR0s6IElUUEpDT1JFOkFMTCAtIGphdmFkb2MgLSB3YXJuaW5ncyBkdXJpbmcgamF2YWRvYyBnZW5lcmF0aW9uIA0KKzFGVzZNM1U6IElUUEpDT1JFOldJTjk4IC0gSkRPTSBjYW5ub3QgcmVwcm9kdWNlICJpbXBvcnQgamF2YS4gbGFuZy4gKjsiIA0KKzFGVlU3TzI6IElUUEpDT1JFOldJTk5UIC0gSkRPTSBjYW5ub3QgaGFuZGxlICJpbXBvcnQgamF2YS5sYW5nLiogIiANCisxRlZSVzJBOiBJVFBKQ09SRTpXSU45OCAtIFNvdXJjZSB0ZXh0IHN0aWxsIGFjY2Vzc2libGUgYWZ0ZXIgbWFudWFsbHkgZGVsZXRpbmcgZmlsZSANCisxRlZMNTlQOiBJVFBKVUk6V0lOTlQgLSBkb3VibGUgY2xpY2tpbmcgb24gdGFzayBkb2VzIG5vdCBnbyB0byByaWdodCBwbGFjZSBpbiBzb3VyY2UgDQorMUZWSUkxUDogSVRQSkNPUkU6QUxMIC0gSkRPTSAtIEltcG9ydCBuYW1lcyByZXBvcnRlZCBieSBwYXJzZXIgZG8gbm90IGNvbnRhaW4gJy4qJyANCisxRlVOUFZHOiBJVFBKQ09SRTpBTEwgLSBKYXZhRENDaGFuZ2VGcm9tRnVsbHlRdWFsaWZpZWRUb0ltcG9ydFRlc3QxIGlzIGZhaWxpbmcgDQorMUZVNFA0VTogSVRQSkNPUkU6QUxMIC0gSk0gLSBmYWN0b3J5IHNob3VsZCB0aHJvdyBkZXRhaWxlZCBleGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhbiBlbGVtZW50IA0KKzFGVDc4WTc6IElUUEpDT1JFOkFMTCAtIEpNIC0gUmVmZXJlbmNlIGluZm8gaXMgc2xvdyANCisxRlNaWFNYOiBJVFBDT006V0lOTlQgLSBEbyB3ZSBuZWVkIEZpZWxkRW5kUG9zaXRpb24/IA0KKzFGUktDM1Q6IElUUEpDT1JFOkFMTCAtIEpNIC0gSW5jcmVtZW50YWwgUmVjb25jaWxlciANCisxRlJLNlM3OiBJVFBKQ09SRTpBTEwgLSBKTSAtIGhvb2sgZm9yIGJ1aWxkZXIgdG8gZ2V0L3B1dCBiaW5hcnkgdHlwZXMgDQorMUZQQ01BTjogSVRQSkNPUkU6QUxMIC0gSk0gLSBWYWxpZGF0aW5nIFNhdmUgT3BlcmF0aW9uIA0KKzFHRkJDT1U6IElUUEpDT1JFOldJTk5UIC0gQ29kZUNvbXBsZXRpb24gLSBDb2RlIGFzc2lzdCBmYWlscyBpbiBhIG1ldGhvZCB3aXRoIGFuIGluY29ycmVjdCByZXR1cm4gdHlwZQ0KKzFHRjFWSFk6IElUUEpDT1JFOkFMTCAtIEpNIC0gdmFsaWRhdGVGaWVsZE5hbWUvUGFja2FnZU5hbWUgc2hvdWxkIHdhcm4gaWYgdXBwZXJjYXNlDQorMUdFTU5FODogSVRQSkNPUkU6V0lOMjAwMCAtIEpNIC0gSkRUIERlbHRhUHJvY2Vzc29yIGlzIHZlcnkgZWFnZXINCisxRlZYSlBaOiBJVFBKQ09SRTpXSU4yMDAwIC0gbWlub3ItIHJldmlldyBlcnJvciBtZXNzYWdlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvbkVuZ2luZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKaW5kZXggZmU4YjJlMC4uZjViMGYwNCAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKQEAgLTI0LDcgKzI0LDEwIEBACiAgKiBJdCBjb250YWlucyB0d28gcHVibGljIEFQSXMgdXNlZCB0byBjYWxsIENvZGVBc3Npc3Qgb24gYSBnaXZlbiBzb3VyY2Ugd2l0aA0KICAqIGEgZ2l2ZW4gZW52aXJvbm1lbnQsIGFzc2lzdGluZyBwb3NpdGlvbiBhbmQgc3RvcmFnZSAoYW5kIHBvc3NpYmx5IG9wdGlvbnMpLg0KICAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wbGV0aW9uRW5naW5lIGV4dGVuZHMgRW5naW5lIGltcGxlbWVudHMgSVNlYXJjaFJlcXVlc3RvciwgVHlwZUNvbnN0YW50cyB7DQorcHVibGljIGZpbmFsIGNsYXNzIENvbXBsZXRpb25FbmdpbmUNCisJZXh0ZW5kcyBFbmdpbmUNCisJaW1wbGVtZW50cyBJU2VhcmNoUmVxdWVzdG9yLCBUeXBlQ29uc3RhbnRzIHsNCisJQ29tcGxldGlvbk9wdGlvbnMgb3B0aW9uczsNCiAJQ29tcGxldGlvblBhcnNlciBwYXJzZXI7DQogCUlTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudDsNCiAJSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yOw0KQEAgLTMzLDc3MyArMzYsNjk2IEBACiAJY2hhcltdIHNvdXJjZTsNCiAJYm9vbGVhbiByZXNvbHZpbmdJbXBvcnRzID0gZmFsc2U7DQogCWJvb2xlYW4gaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gZmFsc2U7DQotCWludCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbjsNCisJaW50IHN0YXJ0UG9zaXRpb24sIGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiwgZW5kUG9zaXRpb247DQogCUhhc2h0YWJsZU9mT2JqZWN0IGtub3duUGtncyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7DQotLyoNCi0Jc3RhdGljIGZpbmFsIGNoYXJbXVtdIG1haW5EZWNsYXJhdGlvbnMgPQ0KLQkJbmV3IGNoYXJbXVtdIHsNCi0JCQkicGFja2FnZSIudG9DaGFyQXJyYXkoKSwNCi0JCQkiaW1wb3J0Ii50b0NoYXJBcnJheSgpLA0KLQkJCSJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKSwNCi0JCQkiZmluYWwiLnRvQ2hhckFycmF5KCksDQotCQkJInB1YmxpYyIudG9DaGFyQXJyYXkoKSwNCi0JCQkiY2xhc3MiLnRvQ2hhckFycmF5KCksDQotCQkJImludGVyZmFjZSIudG9DaGFyQXJyYXkoKX07DQorCS8qDQorCQlzdGF0aWMgZmluYWwgY2hhcltdW10gbWFpbkRlY2xhcmF0aW9ucyA9DQorCQkJbmV3IGNoYXJbXVtdIHsNCisJCQkJInBhY2thZ2UiLnRvQ2hhckFycmF5KCksDQorCQkJCSJpbXBvcnQiLnRvQ2hhckFycmF5KCksDQorCQkJCSJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKSwNCisJCQkJImZpbmFsIi50b0NoYXJBcnJheSgpLA0KKwkJCQkicHVibGljIi50b0NoYXJBcnJheSgpLA0KKwkJCQkiY2xhc3MiLnRvQ2hhckFycmF5KCksDQorCQkJCSJpbnRlcmZhY2UiLnRvQ2hhckFycmF5KCl9Ow0KKwkNCisJCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBtb2RpZmllcnMgPSAvLyBtYXkgd2FudCBmaWVsZCwgbWV0aG9kLCB0eXBlICYgbWVtYmVyIHR5cGUgbW9kaWZpZXJzDQorCQkJbmV3IGNoYXJbXVtdIHsNCisJCQkJImFic3RyYWN0Ii50b0NoYXJBcnJheSgpLA0KKwkJCQkiZmluYWwiLnRvQ2hhckFycmF5KCksDQorCQkJCSJuYXRpdmUiLnRvQ2hhckFycmF5KCksDQorCQkJCSJwdWJsaWMiLnRvQ2hhckFycmF5KCksDQorCQkJCSJwcm90ZWN0ZWQiLnRvQ2hhckFycmF5KCksDQorCQkJCSJwcml2YXRlIi50b0NoYXJBcnJheSgpLA0KKwkJCQkic3RhdGljIi50b0NoYXJBcnJheSgpLA0KKwkJCQkic3RyaWN0ZnAiLnRvQ2hhckFycmF5KCksDQorCQkJCSJzeW5jaHJvbml6ZWQiLnRvQ2hhckFycmF5KCksDQorCQkJCSJ0cmFuc2llbnQiLnRvQ2hhckFycmF5KCksDQorCQkJCSJ2b2xhdGlsZSIudG9DaGFyQXJyYXkoKX07DQorCSovDQorCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBiYXNlVHlwZXMgPSBuZXcgY2hhcltdW10geyAiYm9vbGVhbiIgLy8kTk9OLU5MUy0xJA0KKwkJDQorCQkudG9DaGFyQXJyYXkoKSwgImJ5dGUiIC8vJE5PTi1OTFMtMSQNCisJCQ0KKwkJLnRvQ2hhckFycmF5KCksICJjaGFyIiAvLyROT04tTkxTLTEkDQorCQkNCisJCS50b0NoYXJBcnJheSgpLCAiZG91YmxlIiAvLyROT04tTkxTLTEkDQorCQkNCisJCS50b0NoYXJBcnJheSgpLCAiZmxvYXQiIC8vJE5PTi1OTFMtMSQNCisJCQ0KKwkJLnRvQ2hhckFycmF5KCksICJpbnQiIC8vJE5PTi1OTFMtMSQNCisJCQ0KKwkJLnRvQ2hhckFycmF5KCksICJsb25nIiAvLyROT04tTkxTLTEkDQorCQkNCisJCS50b0NoYXJBcnJheSgpLCAic2hvcnQiIC8vJE5PTi1OTFMtMSQNCisJCQ0KKwkJLnRvQ2hhckFycmF5KCksICJ2b2lkIiAvLyROT04tTkxTLTEkDQorCQkNCisJCS50b0NoYXJBcnJheSgpfTsNCiANCi0Jc3RhdGljIGZpbmFsIGNoYXJbXVtdIG1vZGlmaWVycyA9IC8vIG1heSB3YW50IGZpZWxkLCBtZXRob2QsIHR5cGUgJiBtZW1iZXIgdHlwZSBtb2RpZmllcnMNCi0JCW5ldyBjaGFyW11bXSB7DQotCQkJImFic3RyYWN0Ii50b0NoYXJBcnJheSgpLA0KLQkJCSJmaW5hbCIudG9DaGFyQXJyYXkoKSwNCi0JCQkibmF0aXZlIi50b0NoYXJBcnJheSgpLA0KLQkJCSJwdWJsaWMiLnRvQ2hhckFycmF5KCksDQotCQkJInByb3RlY3RlZCIudG9DaGFyQXJyYXkoKSwNCi0JCQkicHJpdmF0ZSIudG9DaGFyQXJyYXkoKSwNCi0JCQkic3RhdGljIi50b0NoYXJBcnJheSgpLA0KLQkJCSJzdHJpY3RmcCIudG9DaGFyQXJyYXkoKSwNCi0JCQkic3luY2hyb25pemVkIi50b0NoYXJBcnJheSgpLA0KLQkJCSJ0cmFuc2llbnQiLnRvQ2hhckFycmF5KCksDQotCQkJInZvbGF0aWxlIi50b0NoYXJBcnJheSgpfTsNCi0qLw0KLQlzdGF0aWMgZmluYWwgY2hhcltdW10gYmFzZVR5cGVzID0gDQotCQluZXcgY2hhcltdW10gew0KLQkJCSJib29sZWFuIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwNCi0JCQkiYnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksDQotCQkJImNoYXIiLypub25OTFMqLy50b0NoYXJBcnJheSgpLA0KLQkJCSJkb3VibGUiLypub25OTFMqLy50b0NoYXJBcnJheSgpLA0KLQkJCSJmbG9hdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksDQotCQkJImludCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksDQotCQkJImxvbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpLA0KLQkJCSJzaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksDQotCQkJInZvaWQiLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsgDQorCXN0YXRpYyBmaW5hbCBjaGFyW10gY2xhc3NGaWVsZCA9ICJjbGFzcyIgIC8vJE5PTi1OTFMtMSQNCisJLnRvQ2hhckFycmF5KCk7DQorCXN0YXRpYyBmaW5hbCBjaGFyW10gbGVuZ3RoRmllbGQgPSAibGVuZ3RoIiAgLy8kTk9OLU5MUy0xJA0KKwkudG9DaGFyQXJyYXkoKTsNCisJc3RhdGljIGZpbmFsIGNoYXJbXSBUSElTID0gInRoaXMiICAvLyROT04tTkxTLTEkDQorCS50b0NoYXJBcnJheSgpOw0KKwkvKioNCisJICogVGhlIENvbXBsZXRpb25FbmdpbmUgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyBzb3VyY2UgY29tcGxldGlvbnMuDQorCSAqDQorCSAqIEl0IHJlcXVpcmVzIGEgc2VhcmNoYWJsZSBuYW1lIGVudmlyb25tZW50LCB3aGljaCBzdXBwb3J0cyBzb21lDQorCSAqIHNwZWNpZmljIHNlYXJjaCBBUElzLCBhbmQgYSByZXF1ZXN0b3IgdG8gZmVlZCBiYWNrIHRoZSByZXN1bHRzIHRvIGEgVUkuDQorCSAqDQorCSAqICBAcGFyYW0gZW52aXJvbm1lbnQgY29tLmlibS5jb2RlYXNzaXN0LmphdmEuYXBpLklTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50DQorCSAqICAgICAgdXNlZCB0byByZXNvbHZlIHR5cGUvcGFja2FnZSByZWZlcmVuY2VzIGFuZCBzZWFyY2ggZm9yIHR5cGVzL3BhY2thZ2VzDQorCSAqICAgICAgYmFzZWQgb24gcGFydGlhbCBuYW1lcy4NCisJICoNCisJICogIEBwYXJhbSByZXF1ZXN0b3IgY29tLmlibS5jb2RlYXNzaXN0LmphdmEuYXBpLklDb21wbGV0aW9uUmVxdWVzdG9yDQorCSAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZSANCisJICogICAgICBpcyBhc3NvY2lhdGVkIHdpdGggYSByZXF1ZXN0b3IgYWJsZSB0byBhY2NlcHQgYWxsIHBvc3NpYmxlIGNvbXBsZXRpb25zLg0KKwkgKg0KKwkgKiAgQHBhcmFtIG9wdGlvbnMgY29tLmlibS5jb21waWxlci5qYXZhLmFwaS5Db25maWd1cmFibGVPcHRpb25zDQorCSAqCQlzZXQgb2Ygb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY29kZSBhc3Npc3QgZW5naW5lLg0KKwkgKi8NCiANCi0Jc3RhdGljIGZpbmFsIGNoYXJbXSBjbGFzc0ZpZWxkID0gImNsYXNzIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0Jc3RhdGljIGZpbmFsIGNoYXJbXSBsZW5ndGhGaWVsZCA9ICJsZW5ndGgiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLS8qKg0KLSAqIFRoZSBDb21wbGV0aW9uRW5naW5lIGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgc291cmNlIGNvbXBsZXRpb25zLg0KLSAqDQotICogSXQgcmVxdWlyZXMgYSBzZWFyY2hhYmxlIG5hbWUgZW52aXJvbm1lbnQsIHdoaWNoIHN1cHBvcnRzIHNvbWUNCi0gKiBzcGVjaWZpYyBzZWFyY2ggQVBJcywgYW5kIGEgcmVxdWVzdG9yIHRvIGZlZWQgYmFjayB0aGUgcmVzdWx0cyB0byBhIFVJLg0KLSAqDQotICogIEBwYXJhbSBlbnZpcm9ubWVudCBjb20uaWJtLmNvZGVhc3Npc3QuamF2YS5hcGkuSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQNCi0gKiAgICAgIHVzZWQgdG8gcmVzb2x2ZSB0eXBlL3BhY2thZ2UgcmVmZXJlbmNlcyBhbmQgc2VhcmNoIGZvciB0eXBlcy9wYWNrYWdlcw0KLSAqICAgICAgYmFzZWQgb24gcGFydGlhbCBuYW1lcy4NCi0gKg0KLSAqICBAcGFyYW0gcmVxdWVzdG9yIGNvbS5pYm0uY29kZWFzc2lzdC5qYXZhLmFwaS5JQ29tcGxldGlvblJlcXVlc3Rvcg0KLSAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZSANCi0gKiAgICAgIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlcXVlc3RvciBhYmxlIHRvIGFjY2VwdCBhbGwgcG9zc2libGUgY29tcGxldGlvbnMuDQotICoNCi0gKiAgQHBhcmFtIG9wdGlvbnMgY29tLmlibS5jb21waWxlci5qYXZhLmFwaS5Db25maWd1cmFibGVPcHRpb25zDQotICoJCXNldCBvZiBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjb2RlIGFzc2lzdCBlbmdpbmUuDQotICovDQorCXB1YmxpYyBDb21wbGV0aW9uRW5naW5lKA0KKwkJSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50LA0KKwkJSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLA0KKwkJQ29uZmlndXJhYmxlT3B0aW9uW10gc2V0dGluZ3MpIHsNCiANCi1wdWJsaWMgQ29tcGxldGlvbkVuZ2luZSgNCi0JSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50LCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIENvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzKSB7DQorCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsNCisJCXRoaXMubmFtZUVudmlyb25tZW50ID0gbmFtZUVudmlyb25tZW50Ow0KIA0KLQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsNCi0JdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuYW1lRW52aXJvbm1lbnQ7DQotDQotCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7DQotCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPQ0KLQkJbmV3IFByb2JsZW1SZXBvcnRlcigNCi0JCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwNCi0JCQlvcHRpb25zLA0KLQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpIHsNCi0JCQkJcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQpIHsNCi0JCQkJCWlmIChwcm9ibGVtLmdldElEKCkgIT0gUHJvYmxlbUlycml0YW50cy5Vbm1hdGNoZWRCcmFja2V0KSB7DQotCQkJCQkJdW5pdFJlc3VsdC5yZWNvcmQocHJvYmxlbSk7DQotCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5hY2NlcHRFcnJvcihwcm9ibGVtKTsNCi0JCQkJCX0NCisJCW9wdGlvbnMgPSBuZXcgQ29tcGxldGlvbk9wdGlvbnMoc2V0dGluZ3MpOw0KKwkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOw0KKwkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9DQorCQkJbmV3IFByb2JsZW1SZXBvcnRlcigNCisJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksDQorCQkJCWNvbXBpbGVyT3B0aW9ucywNCisJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSkgew0KKwkJCXB1YmxpYyB2b2lkIHJlY29yZChJUHJvYmxlbSBwcm9ibGVtLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7DQorCQkJCWlmIChwcm9ibGVtLmdldElEKCkgIT0gUHJvYmxlbUlycml0YW50cy5Vbm1hdGNoZWRCcmFja2V0KSB7DQorCQkJCQl1bml0UmVzdWx0LnJlY29yZChwcm9ibGVtKTsNCisJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuYWNjZXB0RXJyb3IocHJvYmxlbSk7DQogCQkJCX0NCi0JCQl9Ow0KLQ0KLQl0aGlzLnBhcnNlciA9IG5ldyBDb21wbGV0aW9uUGFyc2VyKHByb2JsZW1SZXBvcnRlcik7DQotCXRoaXMubG9va3VwRW52aXJvbm1lbnQgPSBuZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpOw0KLX0NCi0vKioNCi0gKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgY2xhc3MuDQotICoNCi0gKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KLSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQotICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4NCi0gKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgaW50IG1vZGlmaWVycykgew0KLQljaGFyW10gY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCAnLicpOw0KLQlpZiAocmVzb2x2aW5nSW1wb3J0cykgew0KLQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7JzsnfSk7DQotCX0gZWxzZSBpZiAoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgew0KLQkJaWYgKG11c3RRdWFsaWZ5VHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlTmFtZSksIGNvbXBsZXRpb25OYW1lKSkgew0KLQkgCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkNCi0JCQkJaWYgKHVuaXRTY29wZSAhPSBudWxsICYmIHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gTm9DaGFyQ2hhcikNCi0JCQkJCXJldHVybjsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQNCi0JCX0gZWxzZSB7DQotCQkJY29tcGxldGlvbk5hbWUgPSBjbGFzc05hbWU7DQotCQl9DQotCX0NCi0NCi0JcmVxdWVzdG9yLmFjY2VwdENsYXNzKA0KLQkJcGFja2FnZU5hbWUsDQotCQljbGFzc05hbWUsDQotCQljb21wbGV0aW9uTmFtZSwNCi0JCW1vZGlmaWVycywNCi0JCXN0YXJ0UG9zaXRpb24sDQotCQllbmRQb3NpdGlvbik7DQotfQ0KLS8qKg0KLSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBpbnRlcmZhY2UuDQotICoNCi0gKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KLSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQotICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5JIi4NCi0gKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBpbnRlcmZhY2VOYW1lLCBpbnQgbW9kaWZpZXJzKSB7DQotCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBpbnRlcmZhY2VOYW1lLCAnLicpOw0KLQlpZiAocmVzb2x2aW5nSW1wb3J0cykgew0KLQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7JzsnfSk7DQotCX0gZWxzZSBpZiAoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgew0KLQkJaWYgKG11c3RRdWFsaWZ5VHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlTmFtZSksIGNvbXBsZXRpb25OYW1lKSkgew0KLQkgCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkNCi0JCQkJaWYgKHVuaXRTY29wZSAhPSBudWxsICYmIHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gTm9DaGFyQ2hhcikNCi0JCQkJCXJldHVybjsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQNCi0JCX0gZWxzZSB7DQotCQkJY29tcGxldGlvbk5hbWUgPSBpbnRlcmZhY2VOYW1lOw0KLQkJfQ0KLQl9DQotDQotCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoDQotCQlwYWNrYWdlTmFtZSwNCi0JCWludGVyZmFjZU5hbWUsDQotCQljb21wbGV0aW9uTmFtZSwNCi0JCW1vZGlmaWVycywNCi0JCXN0YXJ0UG9zaXRpb24sDQotCQllbmRQb3NpdGlvbik7DQotfQ0KLS8qKg0KLSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBwYWNrYWdlLg0KLSAqDQotICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCi0gKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KLSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuDQotICovDQotcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpIHsNCi0JaWYgKHRoaXMua25vd25Qa2dzLmNvbnRhaW5zS2V5KHBhY2thZ2VOYW1lKSkgcmV0dXJuOw0KLQl0aGlzLmtub3duUGtncy5wdXQocGFja2FnZU5hbWUsIHRoaXMpOw0KLQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgNCi0JCXBhY2thZ2VOYW1lLA0KLQkJcmVzb2x2aW5nSW1wb3J0cyA/IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBuZXcgY2hhcltdIHsnLicsICcqJywgJzsnfSkgOiBwYWNrYWdlTmFtZSwNCi0JCXN0YXJ0UG9zaXRpb24sDQotCQllbmRQb3NpdGlvbik7DQotfQ0KLS8qKg0KLSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyB0eXBlLg0KLSAqDQotICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCi0gKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KLSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuDQotICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKSB7DQotCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgJy4nKTsNCi0JaWYgKHJlc29sdmluZ0ltcG9ydHMpIHsNCi0JCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY29tcGxldGlvbk5hbWUsIG5ldyBjaGFyW10geyc7J30pOw0KLQl9IGVsc2UgaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsNCi0JCWlmIChtdXN0UXVhbGlmeVR5cGUoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcGFja2FnZU5hbWUpLCBjb21wbGV0aW9uTmFtZSkpIHsNCi0JIAkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoID09IDApDQotCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IE5vQ2hhckNoYXIpDQotCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0DQotCQl9IGVsc2Ugew0KLQkJCWNvbXBsZXRpb25OYW1lID0gdHlwZU5hbWU7DQotCQl9DQotCX0NCi0NCi0JcmVxdWVzdG9yLmFjY2VwdFR5cGUoDQotCQlwYWNrYWdlTmFtZSwNCi0JCXR5cGVOYW1lLA0KLQkJY29tcGxldGlvbk5hbWUsDQotCQlzdGFydFBvc2l0aW9uLA0KLQkJZW5kUG9zaXRpb24pOw0KLX0NCi1wcml2YXRlIHZvaWQgY29tcGxldGUoQXN0Tm9kZSBhc3ROb2RlLCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7DQotCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlRW5kKTsgLy8gZGVmYXVsdHMuLi4gc29tZSBub2RlcyB3aWxsIGNoYW5nZSB0aGVzZQ0KLQ0KLQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkVHlwZSkgew0KLQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0NCi0JCQkoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgKChDb21wbGV0aW9uT25GaWVsZFR5cGUpIGFzdE5vZGUpLnR5cGU7DQotCQljaGFyW10gdG9rZW4gPSB0eXBlLnRva2VuOw0KLQkJc2V0U291cmNlUmFuZ2UodHlwZS5zb3VyY2VTdGFydCwgdHlwZS5zb3VyY2VFbmQpOw0KLS8vCQlmaW5kS2V5d29yZHModG9rZW4sIG1vZGlmaWVycywgc2NvcGUpOyAvLyBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBmaWVsZCwgbWV0aG9kIG9yIG1lbWJlciB0eXBlDQotCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOw0KLQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQotCQljaGFyW10gdG9rZW4gPSAoKENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UpIGFzdE5vZGUpLnRva2VuOw0KLQkJZmluZFZhcmlhYmxlc0FuZE1ldGhvZHModG9rZW4sIHNjb3BlKTsNCi0JCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRva2VuLCBzY29wZSk7IC8vIGNhbiBiZSB0aGUgc3RhcnQgb2YgYSBxdWFsaWZpZWQgdHlwZSBuYW1lDQotCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIHsNCi0JCWNoYXJbXSB0b2tlbiA9ICgoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZSkudG9rZW47DQotCQlpZiAocXVhbGlmaWVkQmluZGluZyA9PSBudWxsKQ0KLQkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRva2VuLCBzY29wZSk7IC8vIGNhbiBiZSB0aGUgc3RhcnQgb2YgYSBxdWFsaWZpZWQgdHlwZSBuYW1lDQotCQllbHNlDQotCQkJZmluZE1lbWJlclR5cGVzKHRva2VuLCAoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOw0KLQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7DQotCQlpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOw0KLQkJQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPSAoQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgYXN0Tm9kZTsNCi0JCWNoYXJbXSB0b2tlbiA9IHJlZi5jb21wbGV0aW9uSWRlbnRpZmllcjsNCi0JCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdOw0KLQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBWYXJpYWJsZUJpbmRpbmcpIHsNCi0JCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7DQotCQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gKChWYXJpYWJsZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcpLnR5cGU7DQotCQkJaWYgKHJlY2VpdmVyVHlwZSAhPSBudWxsKQ0KLQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcyh0b2tlbiwgcmVjZWl2ZXJUeXBlLCBzY29wZSk7DQotCQl9IGVsc2UgaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZzsNCi0JCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7DQotCQkJZmluZE1lbWJlclR5cGVzKHRva2VuLCByZWNlaXZlclR5cGUsIHNjb3BlKTsNCi0JCQlmaW5kQ2xhc3NGaWVsZCh0b2tlbiwgKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsNCi0JCQlmaW5kRmllbGRzKHRva2VuLCByZWNlaXZlclR5cGUsIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCksIHRydWUpOw0KLQkJCWZpbmRNZXRob2RzKHRva2VuLCBudWxsLCByZWNlaXZlclR5cGUsIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCksIHRydWUsIGZhbHNlKTsNCi0JCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7DQotCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsgLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXINCi0JCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0b2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsNCi0JCX0NCi0JfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgew0KLQkJaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsNCi0JCUNvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcmVmID0gKENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIGFzdE5vZGU7DQotCQljaGFyW10gdG9rZW4gPSByZWYuY29tcGxldGlvbklkZW50aWZpZXI7DQotCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnRva2Vucy5sZW5ndGhdOyAvLyBnZXQgdGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcg0KLQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7DQotCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOw0KLQkJCWZpbmRNZW1iZXJUeXBlcyh0b2tlbiwgKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsNCi0JCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7DQotCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsgLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXINCi0JCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0b2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsNCi0JCX0NCi0JfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSB7DQotCQlDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MgYWNjZXNzID0gKENvbXBsZXRpb25Pbk1lbWJlckFjY2VzcykgYXN0Tm9kZTsNCi0JCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gYWNjZXNzLm5hbWVTb3VyY2VQb3NpdGlvbjsNCi0JCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsNCi0JCWZpbmRGaWVsZHNBbmRNZXRob2RzKGFjY2Vzcy50b2tlbiwgKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7DQotCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kKSB7DQotCQlDb21wbGV0aW9uT25NZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChDb21wbGV0aW9uT25NZXNzYWdlU2VuZCkgYXN0Tm9kZTsNCi0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBjb21wdXRlVHlwZXMobWVzc2FnZVNlbmQuYXJndW1lbnRzLCAoQmxvY2tTY29wZSkgc2NvcGUpOw0KLQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkNCi0JCQlmaW5kTWVzc2FnZVNlbmRzKG1lc3NhZ2VTZW5kLnNlbGVjdG9yLCBhcmdUeXBlcywgc2NvcGUpOw0KLQkJZWxzZQ0KLQkJCWZpbmRNZXRob2RzKG1lc3NhZ2VTZW5kLnNlbGVjdG9yLCBhcmdUeXBlcywgKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCksIGZhbHNlLCB0cnVlKTsNCi0JfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsNCi0JCUNvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IChDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgYXN0Tm9kZTsNCi0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBjb21wdXRlVHlwZXMoY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cywgKEJsb2NrU2NvcGUpIHNjb3BlKTsNCi0JCWZpbmRDb25zdHJ1Y3RvcnMoKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIGFyZ1R5cGVzLCBzY29wZSk7DQotCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB7DQotCQlDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY0V4cHJlc3Npb24gPSAoQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7DQotCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0gY29tcHV0ZVR5cGVzKGFsbG9jRXhwcmVzc2lvbi5hcmd1bWVudHMsIChCbG9ja1Njb3BlKSBzY29wZSk7DQotCQlmaW5kQ29uc3RydWN0b3JzKChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBhcmdUeXBlcywgc2NvcGUpOw0KLQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MpIHsNCi0JCWNoYXJbXSB0b2tlbiA9ICgoQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKSBhc3ROb2RlKS5jb21wbGV0aW9uSWRlbnRpZmllcjsNCi0JCWZpbmRDbGFzc0ZpZWxkKHRva2VuLCAoVHlwZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcpOw0KLQl9DQotfQ0KLS8qKg0KLSAqIEFzayB0aGUgZW5naW5lIHRvIGNvbXB1dGUgYSBjb21wbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24NCi0gKiBvZiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4NCi0gKg0KLSAqICBAcmV0dXJuIHZvaWQNCi0gKiAgICAgIGNvbXBsZXRpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3Rvci4NCi0gKg0KLSAqICBAcGFyYW0gdW5pdCBjb20uaWJtLmNvbXBpbGVyLmphdmEuYXBpLmVudi5JQ29tcGlsYXRpb25Vbml0DQotICogICAgICB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuDQotICoNCi0gKiAgQHBhcmFtIGNvbXBsZXRpb25Qb3NpdGlvbiBpbnQNCi0gKiAgICAgIGEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgY29tcGxldGlvbiBpcyB0YWtpbmcgcGxhY2UuIA0KLSAqICAgICAgVGhpcyBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc291cmNlIHByb3ZpZGVkLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGNvbXBsZXRlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgaW50IGNvbXBsZXRpb25Qb3NpdGlvbikgew0KLQl0cnkgew0KLQkJaW50IGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiA9IGNvbXBsZXRpb25Qb3NpdGlvbiAtIDE7IC8vIGZvciBub3cgdW50aWwgd2UgY2FuIGNoYW5nZSB0aGUgVUkuDQotCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMSwgMSk7DQotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCByZXN1bHQsIGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7DQotDQotLy8JCWJvb2xlYW4gY29tcGxldGlvbk5vZGVGb3VuZCA9IGZhbHNlOw0KLQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgew0KLQkJCS8vIHNjYW4gdGhlIHBhY2thZ2UgJiBpbXBvcnQgc3RhdGVtZW50cyBmaXJzdA0KLQkJCWlmIChwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSkgew0KLQkJCQlmaW5kUGFja2FnZXMoKENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UpIHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UpOw0KLQkJCQlyZXR1cm47DQogCQkJfQ0KLQkJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBwYXJzZWRVbml0LmltcG9ydHM7DQotCQkJaWYgKGltcG9ydHMgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IGltcG9ydHNbaV07DQotCQkJCQlpZiAoaW1wb3J0UmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKSB7DQotCQkJCQkJZmluZEltcG9ydHMoKENvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZSkgaW1wb3J0UmVmZXJlbmNlKTsNCi0JCQkJCQlyZXR1cm47DQotCQkJCQl9DQorCQl9Ow0KKw0KKwkJdGhpcy5wYXJzZXIgPQ0KKwkJCW5ldyBDb21wbGV0aW9uUGFyc2VyKHByb2JsZW1SZXBvcnRlciwgY29tcGlsZXJPcHRpb25zLmdldEFzc2VydE1vZGUoKSk7DQorCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0NCisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgY29tcGlsZXJPcHRpb25zLCBwcm9ibGVtUmVwb3J0ZXIsIG5hbWVFbnZpcm9ubWVudCk7DQorCX0NCisJLyoqDQorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBjbGFzcy4NCisJICoNCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCisJICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4NCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgaW50IG1vZGlmaWVycykgew0KKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIGNsYXNzTmFtZSwgJy4nKTsNCisJCWlmIChyZXNvbHZpbmdJbXBvcnRzKSB7DQorCQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7ICc7JyB9KTsNCisJCX0gZWxzZQ0KKwkJCWlmICghaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7DQorCQkJCWlmIChtdXN0UXVhbGlmeVR5cGUoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcGFja2FnZU5hbWUpLCBjb21wbGV0aW9uTmFtZSkpIHsNCisJCQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQ0KKwkJCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IE5vQ2hhckNoYXIpDQorCQkJCQkJCXJldHVybjsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQNCisJCQkJfSBlbHNlIHsNCisJCQkJCWNvbXBsZXRpb25OYW1lID0gY2xhc3NOYW1lOw0KIAkJCQl9DQogCQkJfQ0KIA0KLQkJCWlmIChwYXJzZWRVbml0LnR5cGVzICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOw0KLQkJCQkJaWYgKCh1bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAhPSBudWxsKSB7DQorCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoDQorCQkJcGFja2FnZU5hbWUsDQorCQkJY2xhc3NOYW1lLA0KKwkJCWNvbXBsZXRpb25OYW1lLA0KKwkJCW1vZGlmaWVycywNCisJCQlzdGFydFBvc2l0aW9uLA0KKwkJCWVuZFBvc2l0aW9uKTsNCisJfQ0KKwkvKioNCisJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IGludGVyZmFjZS4NCisJICoNCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCisJICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5JIi4NCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZSgNCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwNCisJCWNoYXJbXSBpbnRlcmZhY2VOYW1lLA0KKwkJaW50IG1vZGlmaWVycykgew0KKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsICcuJyk7DQorCQlpZiAocmVzb2x2aW5nSW1wb3J0cykgew0KKwkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY29tcGxldGlvbk5hbWUsIG5ldyBjaGFyW10geyAnOycgfSk7DQorCQl9IGVsc2UNCisJCQlpZiAoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgew0KKwkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHBhY2thZ2VOYW1lKSwgY29tcGxldGlvbk5hbWUpKSB7DQorCQkJCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkNCisJCQkJCQlpZiAodW5pdFNjb3BlICE9IG51bGwgJiYgdW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBOb0NoYXJDaGFyKQ0KKwkJCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0DQorCQkJCX0gZWxzZSB7DQorCQkJCQljb21wbGV0aW9uTmFtZSA9IGludGVyZmFjZU5hbWU7DQorCQkJCX0NCisJCQl9DQorDQorCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKA0KKwkJCXBhY2thZ2VOYW1lLA0KKwkJCWludGVyZmFjZU5hbWUsDQorCQkJY29tcGxldGlvbk5hbWUsDQorCQkJbW9kaWZpZXJzLA0KKwkJCXN0YXJ0UG9zaXRpb24sDQorCQkJZW5kUG9zaXRpb24pOw0KKwl9DQorCS8qKg0KKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgcGFja2FnZS4NCisJICoNCisJICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKSB7DQorCQlpZiAodGhpcy5rbm93blBrZ3MuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKQ0KKwkJCXJldHVybjsNCisJCXRoaXMua25vd25Qa2dzLnB1dChwYWNrYWdlTmFtZSwgdGhpcyk7DQorCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgNCisJCQlwYWNrYWdlTmFtZSwNCisJCQlyZXNvbHZpbmdJbXBvcnRzDQorCQkJCT8gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIG5ldyBjaGFyW10geyAnLicsICcqJywgJzsnIH0pDQorCQkJCTogcGFja2FnZU5hbWUsDQorCQkJc3RhcnRQb3NpdGlvbiwNCisJCQllbmRQb3NpdGlvbik7DQorCX0NCisJLyoqDQorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyB0eXBlLg0KKwkgKg0KKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSkgew0KKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOw0KKwkJaWYgKHJlc29sdmluZ0ltcG9ydHMpIHsNCisJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNvbXBsZXRpb25OYW1lLCBuZXcgY2hhcltdIHsgJzsnIH0pOw0KKwkJfSBlbHNlDQorCQkJaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsNCisJCQkJaWYgKG11c3RRdWFsaWZ5VHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlTmFtZSksIGNvbXBsZXRpb25OYW1lKSkgew0KKwkJCQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoID09IDApDQorCQkJCQkJaWYgKHVuaXRTY29wZSAhPSBudWxsICYmIHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gTm9DaGFyQ2hhcikNCisJCQkJCQkJcmV0dXJuOyAvLyBpZ25vcmUgdHlwZXMgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIGZyb20gb3V0c2lkZSBpdA0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJY29tcGxldGlvbk5hbWUgPSB0eXBlTmFtZTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKA0KKwkJCXBhY2thZ2VOYW1lLA0KKwkJCXR5cGVOYW1lLA0KKwkJCWNvbXBsZXRpb25OYW1lLA0KKwkJCXN0YXJ0UG9zaXRpb24sDQorCQkJZW5kUG9zaXRpb24pOw0KKwl9DQorCXByaXZhdGUgdm9pZCBjb21wbGV0ZShBc3ROb2RlIGFzdE5vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsNCisJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlRW5kKTsNCisJCS8vIGRlZmF1bHRzLi4uIHNvbWUgbm9kZXMgd2lsbCBjaGFuZ2UgdGhlc2UNCisJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uRmllbGRUeXBlKSB7DQorCQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0NCisJCQkJKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpICgoQ29tcGxldGlvbk9uRmllbGRUeXBlKSBhc3ROb2RlKS50eXBlOw0KKwkJCWNoYXJbXSB0b2tlbiA9IHR5cGUudG9rZW47DQorCQkJc2V0U291cmNlUmFuZ2UodHlwZS5zb3VyY2VTdGFydCwgdHlwZS5zb3VyY2VFbmQpOw0KKwkJCS8vCQlmaW5kS2V5d29yZHModG9rZW4sIG1vZGlmaWVycywgc2NvcGUpOyAvLyBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBmaWVsZCwgbWV0aG9kIG9yIG1lbWJlciB0eXBlDQorCQkJZmluZFR5cGVzQW5kUGFja2FnZXModG9rZW4sIHNjb3BlKTsNCisJCX0gZWxzZQ0KKwkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgew0KKwkJCQljaGFyW10gdG9rZW4gPSAoKENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UpIGFzdE5vZGUpLnRva2VuOw0KKwkJCQlmaW5kVmFyaWFibGVzQW5kTWV0aG9kcygNCisJCQkJCXRva2VuLA0KKwkJCQkJc2NvcGUsDQorCQkJCQkoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgYXN0Tm9kZSwNCisJCQkJCXNjb3BlKTsNCisJCQkJZmluZFR5cGVzQW5kUGFja2FnZXModG9rZW4sIHNjb3BlKTsNCisJCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUNCisJCQl9IGVsc2UNCisJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSB7DQorCQkJCQljaGFyW10gdG9rZW4gPSAoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIGFzdE5vZGUpLnRva2VuOw0KKwkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkNCisJCQkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOw0KKwkJCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUNCisJCQkJCWVsc2UNCisJCQkJCQlmaW5kTWVtYmVyVHlwZXMoDQorCQkJCQkJCXRva2VuLA0KKwkJCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywNCisJCQkJCQkJc2NvcGUsDQorCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSk7DQorCQkJCX0gZWxzZQ0KKwkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7DQorCQkJCQkJaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsNCisJCQkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9DQorCQkJCQkJCShDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBhc3ROb2RlOw0KKwkJCQkJCWNoYXJbXSB0b2tlbiA9IHJlZi5jb21wbGV0aW9uSWRlbnRpZmllcjsNCisJCQkJCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnNvdXJjZVBvc2l0aW9ucy5sZW5ndGggLSAxXTsNCisJCQkJCQlpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykgew0KKwkJCQkJCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7DQorCQkJCQkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9ICgoVmFyaWFibGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKS50eXBlOw0KKwkJCQkJCQlpZiAocmVjZWl2ZXJUeXBlICE9IG51bGwpDQorCQkJCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcyh0b2tlbiwgcmVjZWl2ZXJUeXBlLCBzY29wZSwgcmVmLHNjb3BlKTsNCisJCQkJCQl9IGVsc2UNCisJCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7DQorCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOw0KKwkJCQkJCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOw0KKwkJCQkJCQkJZmluZE1lbWJlclR5cGVzKHRva2VuLCByZWNlaXZlclR5cGUsIHNjb3BlLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOw0KKwkJCQkJCQkJZmluZENsYXNzRmllbGQodG9rZW4sIChUeXBlQmluZGluZykgcXVhbGlmaWVkQmluZGluZyk7DQorCQkJCQkJCQlmaW5kRmllbGRzKA0KKwkJCQkJCQkJCXRva2VuLA0KKwkJCQkJCQkJCXJlY2VpdmVyVHlwZSwNCisJCQkJCQkJCQlzY29wZSwNCisJCQkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksDQorCQkJCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLA0KKwkJCQkJCQkJCXRydWUsDQorCQkJCQkJCQkJcmVmLA0KKwkJCQkJCQkJCXNjb3BlKTsNCisJCQkJCQkJCWZpbmRNZXRob2RzKA0KKwkJCQkJCQkJCXRva2VuLA0KKwkJCQkJCQkJCW51bGwsDQorCQkJCQkJCQkJcmVjZWl2ZXJUeXBlLA0KKwkJCQkJCQkJCXNjb3BlLA0KKwkJCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwNCisJCQkJCQkJCQl0cnVlLA0KKwkJCQkJCQkJCWZhbHNlLA0KKwkJCQkJCQkJCXJlZik7DQorCQkJCQkJCX0gZWxzZQ0KKwkJCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgew0KKwkJCQkJCQkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7DQorCQkJCQkJCQkJLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXINCisJCQkJCQkJCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0b2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsNCisJCQkJCQkJCX0NCisJCQkJCX0gZWxzZQ0KKwkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgew0KKwkJCQkJCQlpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOw0KKwkJCQkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHJlZiA9DQorCQkJCQkJCQkoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZTsNCisJCQkJCQkJY2hhcltdIHRva2VuID0gcmVmLmNvbXBsZXRpb25JZGVudGlmaWVyOw0KKwkJCQkJCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnRva2Vucy5sZW5ndGhdOw0KKwkJCQkJCQkvLyBnZXQgdGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcg0KKwkJCQkJCQlpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsNCisJCQkJCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsNCisJCQkJCQkJCWZpbmRNZW1iZXJUeXBlcygNCisJCQkJCQkJCQl0b2tlbiwNCisJCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywNCisJCQkJCQkJCQlzY29wZSwNCisJCQkJCQkJCQlzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOw0KKwkJCQkJCQl9IGVsc2UNCisJCQkJCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsNCisJCQkJCQkJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOw0KKwkJCQkJCQkJCS8vIHJlcGxhY2UgdG8gdGhlIGVuZCBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyDQorCQkJCQkJCQkJZmluZFR5cGVzQW5kU3VicGFja2FnZXModG9rZW4sIChQYWNrYWdlQmluZGluZykgcXVhbGlmaWVkQmluZGluZyk7DQorCQkJCQkJCQl9DQorCQkJCQkJfSBlbHNlDQorCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSB7DQorCQkJCQkJCQlDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MgYWNjZXNzID0gKENvbXBsZXRpb25Pbk1lbWJlckFjY2VzcykgYXN0Tm9kZTsNCisJCQkJCQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gYWNjZXNzLm5hbWVTb3VyY2VQb3NpdGlvbjsNCisJCQkJCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsNCisJCQkJCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzKA0KKwkJCQkJCQkJCWFjY2Vzcy50b2tlbiwNCisJCQkJCQkJCQkoVHlwZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsDQorCQkJCQkJCQkJc2NvcGUsDQorCQkJCQkJCQkJYWNjZXNzLA0KKwkJCQkJCQkJCXNjb3BlKTsNCisJCQkJCQkJfSBlbHNlDQorCQkJCQkJCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kKSB7DQorCQkJCQkJCQkJQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQpIGFzdE5vZGU7DQorCQkJCQkJCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9DQorCQkJCQkJCQkJCWNvbXB1dGVUeXBlcyhtZXNzYWdlU2VuZC5hcmd1bWVudHMsIChCbG9ja1Njb3BlKSBzY29wZSk7DQorCQkJCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkNCisJCQkJCQkJCQkJZmluZE1lc3NhZ2VTZW5kcyhtZXNzYWdlU2VuZC5zZWxlY3RvciwgYXJnVHlwZXMsIHNjb3BlLCBtZXNzYWdlU2VuZCk7DQorCQkJCQkJCQkJZWxzZQ0KKwkJCQkJCQkJCQlmaW5kTWV0aG9kcygNCisJCQkJCQkJCQkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLA0KKwkJCQkJCQkJCQkJYXJnVHlwZXMsDQorCQkJCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywNCisJCQkJCQkJCQkJCXNjb3BlLA0KKwkJCQkJCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLA0KKwkJCQkJCQkJCQkJZmFsc2UsDQorCQkJCQkJCQkJCQl0cnVlLA0KKwkJCQkJCQkJCQkJbWVzc2FnZVNlbmQpOw0KKwkJCQkJCQkJfSBlbHNlDQorCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgew0KKwkJCQkJCQkJCQlDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwgPQ0KKwkJCQkJCQkJCQkJKENvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBhc3ROb2RlOw0KKwkJCQkJCQkJCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0NCisJCQkJCQkJCQkJCWNvbXB1dGVUeXBlcyhjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzLCAoQmxvY2tTY29wZSkgc2NvcGUpOw0KKwkJCQkJCQkJCQlmaW5kQ29uc3RydWN0b3JzKA0KKwkJCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsDQorCQkJCQkJCQkJCQlhcmdUeXBlcywNCisJCQkJCQkJCQkJCXNjb3BlLA0KKwkJCQkJCQkJCQkJY29uc3RydWN0b3JDYWxsKTsNCisJCQkJCQkJCQl9IGVsc2UNCisJCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgew0KKwkJCQkJCQkJCQkJQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NFeHByZXNzaW9uID0NCisJCQkJCQkJCQkJCQkoQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7DQorCQkJCQkJCQkJCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0NCisJCQkJCQkJCQkJCQljb21wdXRlVHlwZXMoYWxsb2NFeHByZXNzaW9uLmFyZ3VtZW50cywgKEJsb2NrU2NvcGUpIHNjb3BlKTsNCisJCQkJCQkJCQkJCWZpbmRDb25zdHJ1Y3RvcnMoDQorCQkJCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsDQorCQkJCQkJCQkJCQkJYXJnVHlwZXMsDQorCQkJCQkJCQkJCQkJc2NvcGUsDQorCQkJCQkJCQkJCQkJYWxsb2NFeHByZXNzaW9uKTsNCisJCQkJCQkJCQkJfSBlbHNlDQorCQkJCQkJCQkJCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcykgew0KKwkJCQkJCQkJCQkJCWNoYXJbXSB0b2tlbiA9ICgoQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKSBhc3ROb2RlKS5jb21wbGV0aW9uSWRlbnRpZmllcjsNCisJCQkJCQkJCQkJCQlmaW5kQ2xhc3NGaWVsZCh0b2tlbiwgKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsNCisJCQkJCQkJCQkJCX0NCisJfQ0KKwkvKioNCisJICogQXNrIHRoZSBlbmdpbmUgdG8gY29tcHV0ZSBhIGNvbXBsZXRpb24gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbg0KKwkgKiBvZiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4NCisJICoNCisJICogIEByZXR1cm4gdm9pZA0KKwkgKiAgICAgIGNvbXBsZXRpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3Rvci4NCisJICoNCisJICogIEBwYXJhbSB1bml0IGNvbS5pYm0uY29tcGlsZXIuamF2YS5hcGkuZW52LklDb21waWxhdGlvblVuaXQNCisJICogICAgICB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuDQorCSAqDQorCSAqICBAcGFyYW0gY29tcGxldGlvblBvc2l0aW9uIGludA0KKwkgKiAgICAgIGEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgY29tcGxldGlvbiBpcyB0YWtpbmcgcGxhY2UuIA0KKwkgKiAgICAgIFRoaXMgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBwcm92aWRlZC4NCisJICovDQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgaW50IGNvbXBsZXRpb25Qb3NpdGlvbikgew0KKwkJdHJ5IHsNCisJCQlhY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gPSBjb21wbGV0aW9uUG9zaXRpb24gLSAxOw0KKwkJCS8vIGZvciBub3cgdW50aWwgd2UgY2FuIGNoYW5nZSB0aGUgVUkuDQorCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDEsIDEpOw0KKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPQ0KKwkJCQlwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHJlc3VsdCwgYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsNCisNCisJCQkvLwkJYm9vbGVhbiBjb21wbGV0aW9uTm9kZUZvdW5kID0gZmFsc2U7DQorCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgew0KKwkJCQkvLyBzY2FuIHRoZSBwYWNrYWdlICYgaW1wb3J0IHN0YXRlbWVudHMgZmlyc3QNCisJCQkJaWYgKHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlKSB7DQorCQkJCQlmaW5kUGFja2FnZXMoKENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UpIHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UpOw0KKwkJCQkJcmV0dXJuOw0KKwkJCQl9DQorCQkJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBwYXJzZWRVbml0LmltcG9ydHM7DQorCQkJCWlmIChpbXBvcnRzICE9IG51bGwpIHsNCisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IGltcG9ydHNbaV07DQorCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZSkgew0KKwkJCQkJCQlmaW5kSW1wb3J0cygoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKSBpbXBvcnRSZWZlcmVuY2UpOw0KKwkJCQkJCQlyZXR1cm47DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCWlmIChwYXJzZWRVbml0LnR5cGVzICE9IG51bGwpIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7DQorCQkJCQkJaWYgKCh1bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAhPSBudWxsKSB7DQogCQkJCQkJCXNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0Q29udGVudHMoKTsNCiAJCQkJCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgdHJ1ZSk7DQogCQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7DQogCQkJCQkJCXBhcnNlTWV0aG9kKHBhcnNlZFVuaXQsIGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7DQogCQkJCQkJCXBhcnNlZFVuaXQucmVzb2x2ZSgpOw0KLQkJCQkJfQ0KLQkJCQl9IGNhdGNoIChDb21wbGV0aW9uTm9kZUZvdW5kIGUpIHsNCi0vLwkJCQkJY29tcGxldGlvbk5vZGVGb3VuZCA9IHRydWU7DQotCQkJCQlpZiAoZS5hc3ROb2RlICE9IG51bGwpIC8vIGlmIG51bGwgdGhlbiB3ZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIGNvbXBsZXRpb24gbm9kZQ0KLQkJCQkJCWNvbXBsZXRlKGUuYXN0Tm9kZSwgZS5xdWFsaWZpZWRCaW5kaW5nLCBlLnNjb3BlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0vKiBJZ25vcmUgcGFja2FnZSwgaW1wb3J0LCBjbGFzcyAmIGludGVyZmFjZSBrZXl3b3JkcyBmb3Igbm93Li4uDQotCQlpZiAoIWNvbXBsZXRpb25Ob2RlRm91bmQpIHsNCi0JCQlpZiAocGFyc2VkVW5pdCA9PSBudWxsIHx8IHBhcnNlZFVuaXQudHlwZXMgPT0gbnVsbCkgew0KLQkJCQkvLyB0aGlzIGlzIG5vdCBnb29kIGVub3VnaC4uLiBjYW4gc3RpbGwgYmUgdHJ5aW5nIHRvIGRlZmluZSBhIHNlY29uZCB0eXBlDQotCQkJCUNvbXBsZXRpb25TY2FubmVyIHNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpIHBhcnNlci5zY2FubmVyOw0KLQkJCQlzZXRTb3VyY2VSYW5nZShzY2FubmVyLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCwgc2Nhbm5lci5jb21wbGV0ZWRJZGVudGlmaWVyRW5kKTsNCi0JCQkJZmluZEtleXdvcmRzKHNjYW5uZXIuY29tcGxldGlvbklkZW50aWZpZXIsIG1haW5EZWNsYXJhdGlvbnMsIG51bGwpOw0KLQkJCX0NCi0JCQkvLyBjdXJyZW50bHkgaGF2ZSBubyB3YXkgdG8ga25vdyBpZiBleHRlbmRzL2ltcGxlbWVudHMgYXJlIHBvc3NpYmxlIGtleXdvcmRzDQotCQl9DQotKi8JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vIHdvcmstYXJvdW5kIGludGVybmFsIGZhaWx1cmUgLSAxR0VNRjZEDQotCX0gY2F0Y2ggKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKSB7IC8vIG1heSBldmVudHVhbGx5IHJlcG9ydCBhIHVzZWZ1bGwgZXJyb3INCi0JfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7IC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBmb3Igbm93IHNpbmNlIGl0IHR5cGljYWxseSBtZWFucyB3ZSBjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0DQotCX0gZmluYWxseSB7DQotCQlyZXNldCgpOw0KLQl9DQotfQ0KLXByaXZhdGUgVHlwZUJpbmRpbmdbXSBjb21wdXRlVHlwZXMoRXhwcmVzc2lvbltdIGFyZ3VtZW50cywgQmxvY2tTY29wZSBzY29wZSkgew0KLQlpZiAoYXJndW1lbnRzID09IG51bGwpIHJldHVybiBudWxsOw0KLQ0KLQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQotCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbYXJnc0xlbmd0aF07DQotCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspDQotCQlhcmdUeXBlc1thXSA9IGFyZ3VtZW50c1thXS5yZXNvbHZlVHlwZShzY29wZSk7DQotCXJldHVybiBhcmdUeXBlczsNCi19DQotcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpZWxkKGNoYXJbXSB0b2tlbiwgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7DQotCWlmICh0b2tlbiA9PSBudWxsKSByZXR1cm47DQotDQotCWlmICh0b2tlbi5sZW5ndGggPD0gY2xhc3NGaWVsZC5sZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGNsYXNzRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKSkNCi0JCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgNCi0JCQlOb0NoYXIsDQotCQkJTm9DaGFyLA0KLQkJCWNsYXNzRmllbGQsDQotCQkJTm9DaGFyLA0KLQkJCU5vQ2hhciwNCi0JCQljbGFzc0ZpZWxkLA0KLQkJCUNvbXBpbGVyTW9kaWZpZXJzLkFjY1N0YXRpYyB8IENvbXBpbGVyTW9kaWZpZXJzLkFjY1B1YmxpYywNCi0JCQlzdGFydFBvc2l0aW9uLA0KLQkJCWVuZFBvc2l0aW9uKTsNCi19DQotcHJpdmF0ZSB2b2lkIGZpbmRDb25zdHJ1Y3RvcnMoUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwgVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywgU2NvcGUgc2NvcGUpIHsNCi0JLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlDQotCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUubWV0aG9kcygpOw0KLQlpbnQgbWluQXJnTGVuZ3RoID0gYXJnVHlwZXMgPT0gbnVsbCA/IDAgOiBhcmdUeXBlcy5sZW5ndGg7DQotCW5leHQgOiBmb3IgKGludCBmID0gbWV0aG9kcy5sZW5ndGg7IC0tZiA+PSAwOykgew0KLQkJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IG1ldGhvZHNbZl07DQotCQlpZiAoY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcigpKSB7DQotCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IucGFyYW1ldGVyczsNCi0JCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsNCi0JCQlpZiAobWluQXJnTGVuZ3RoID4gcGFyYW1MZW5ndGgpIGNvbnRpbnVlIG5leHQ7DQotCQkJZm9yIChpbnQgYSA9IG1pbkFyZ0xlbmd0aDsgLS1hID49IDA7KQ0KLQkJCQlpZiAoYXJnVHlwZXNbYV0gIT0gbnVsbCkgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5DQotCQkJCQlpZiAoIXNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShhcmdUeXBlc1thXSwgY29uc3RydWN0b3IucGFyYW1ldGVyc1thXSkpIGNvbnRpbnVlIG5leHQ7DQotDQotCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107DQotCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7DQotCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBwYXJhbWV0ZXJzW2ldOw0KLQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7DQotCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOw0KLQkJCX0NCi0JCQljaGFyW10gY29tcGxldGlvbiA9IFR5cGVDb25zdGFudHMuTm9DaGFyOyAvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzDQotCQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGggPD0gZW5kUG9zaXRpb24gfHwgc291cmNlW2VuZFBvc2l0aW9uXSAhPSAnKScpDQotCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsnKSd9Ow0KLQkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2QoDQotCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQotCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwNCi0JCQkJY3VycmVudFR5cGUuc291cmNlTmFtZSgpLA0KLQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsDQotCQkJCXBhcmFtZXRlclR5cGVOYW1lcywNCi0JCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXIsDQotCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyLA0KLQkJCQljb21wbGV0aW9uLA0KLQkJCQljb25zdHJ1Y3Rvci5tb2RpZmllcnMsDQotCQkJCWVuZFBvc2l0aW9uLA0KLQkJCQllbmRQb3NpdGlvbik7DQotCQl9DQotCX0NCi19DQotLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZEZpZWxkcyhjaGFyW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4pDQotDQotcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHMoDQotCWNoYXJbXSBmaWVsZE5hbWUsDQotCUZpZWxkQmluZGluZ1tdIGZpZWxkcywNCi0JU2NvcGUgc2NvcGUsDQotCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwNCi0JYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzKSB7DQotDQotCS8vIEluaGVyaXRlZCBmaWVsZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQNCi0JLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlDQotDQotCWludCBmaWVsZExlbmd0aCA9IGZpZWxkTmFtZS5sZW5ndGg7DQotCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7DQotCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbZl07DQotCQlpZiAob25seVN0YXRpY0ZpZWxkcyAmJiAhZmllbGQuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsNCi0JCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0Ow0KLQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhmaWVsZE5hbWUsIGZpZWxkLm5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKSkgY29udGludWUgbmV4dDsNCi0NCi0JCWZvciAoaW50IGkgPSBmaWVsZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsNCi0JCQlGaWVsZEJpbmRpbmcgb3RoZXJGaWVsZCA9IChGaWVsZEJpbmRpbmcpIGZpZWxkc0ZvdW5kLmVsZW1lbnRBdChpKTsNCi0JCQlpZiAoZmllbGQgPT0gb3RoZXJGaWVsZCkgY29udGludWUgbmV4dDsNCi0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQubmFtZSwgb3RoZXJGaWVsZC5uYW1lLCB0cnVlKSkgew0KLQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2Yob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcykpIGNvbnRpbnVlIG5leHQ7DQotCQkJCWlmIChvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpDQotCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzLCB0cnVlKSkgY29udGludWUgbmV4dDsNCi0JCQl9DQotCQl9DQotDQotCQlmaWVsZHNGb3VuZC5hZGQoZmllbGQpOw0KLQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkKA0KLQkJCWZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQotCQkJZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KLQkJCWZpZWxkLm5hbWUsDQotCQkJZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KLQkJCWZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KLQkJCWZpZWxkLm5hbWUsIC8vIG1heSBpbmNsdWRlIHNvbWUgcXVhbGlmaWNhdGlvbiB0byByZXNvbHZlIGFtYmlndWl0aWVzDQotCQkJZmllbGQubW9kaWZpZXJzLA0KLQkJCXN0YXJ0UG9zaXRpb24sDQotCQkJZW5kUG9zaXRpb24pOw0KLQl9DQotfQ0KLXByaXZhdGUgdm9pZCBmaW5kRmllbGRzKA0KLQljaGFyW10gZmllbGROYW1lLA0KLQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCi0JU2NvcGUgc2NvcGUsDQotCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwNCi0JYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzKSB7DQotDQotCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkgcmV0dXJuOw0KLQ0KLQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOw0KLQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7DQotCWludCBsYXN0UG9zaXRpb24gPSAtMTsNCi0JZG8gew0KLQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCi0JCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQotCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpDQotCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCi0JCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQotCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQotCQl9DQotDQotCQlmaW5kRmllbGRzKGZpZWxkTmFtZSwgY3VycmVudFR5cGUuZmllbGRzKCksIHNjb3BlLCBmaWVsZHNGb3VuZCwgb25seVN0YXRpY0ZpZWxkcyk7DQotCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsNCi0JfSB3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCk7DQotDQotCWlmIChpbnRlcmZhY2VzVG9WaXNpdCAhPSBudWxsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQotCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsNCi0JCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQotCQkJCWlmICgoYW5JbnRlcmZhY2UudGFnQml0cyAmIFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeyAvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkDQotCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZDsNCi0NCi0JCQkJCWZpbmRGaWVsZHMoZmllbGROYW1lLCBhbkludGVyZmFjZS5maWVsZHMoKSwgc2NvcGUsIGZpZWxkc0ZvdW5kLCBvbmx5U3RhdGljRmllbGRzKTsNCi0NCi0JCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2Uuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsNCi0JCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCisJCQkJCQl9DQorCQkJCQl9IGNhdGNoIChDb21wbGV0aW9uTm9kZUZvdW5kIGUpIHsNCisJCQkJCQkvLwkJCQkJY29tcGxldGlvbk5vZGVGb3VuZCA9IHRydWU7DQorCQkJCQkJaWYgKGUuYXN0Tm9kZSAhPSBudWxsKQ0KKwkJCQkJCQkvLyBpZiBudWxsIHRoZW4gd2UgZm91bmQgYSBwcm9ibGVtIGluIHRoZSBjb21wbGV0aW9uIG5vZGUNCisJCQkJCQkJY29tcGxldGUoZS5hc3ROb2RlLCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUpOw0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJfQ0KLQkJfQ0KIA0KLQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24NCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCi0JCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykNCi0JCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5UYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQorCQkJLyogSWdub3JlIHBhY2thZ2UsIGltcG9ydCwgY2xhc3MgJiBpbnRlcmZhY2Uga2V5d29yZHMgZm9yIG5vdy4uLg0KKwkJCQkJaWYgKCFjb21wbGV0aW9uTm9kZUZvdW5kKSB7DQorCQkJCQkJaWYgKHBhcnNlZFVuaXQgPT0gbnVsbCB8fCBwYXJzZWRVbml0LnR5cGVzID09IG51bGwpIHsNCisJCQkJCQkJLy8gdGhpcyBpcyBub3QgZ29vZCBlbm91Z2guLi4gY2FuIHN0aWxsIGJlIHRyeWluZyB0byBkZWZpbmUgYSBzZWNvbmQgdHlwZQ0KKwkJCQkJCQlDb21wbGV0aW9uU2Nhbm5lciBzY2FubmVyID0gKENvbXBsZXRpb25TY2FubmVyKSBwYXJzZXIuc2Nhbm5lcjsNCisJCQkJCQkJc2V0U291cmNlUmFuZ2Uoc2Nhbm5lci5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQsIHNjYW5uZXIuY29tcGxldGVkSWRlbnRpZmllckVuZCk7DQorCQkJCQkJCWZpbmRLZXl3b3JkcyhzY2FubmVyLmNvbXBsZXRpb25JZGVudGlmaWVyLCBtYWluRGVjbGFyYXRpb25zLCBudWxsKTsNCisJCQkJCQl9DQorCQkJCQkJLy8gY3VycmVudGx5IGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgZXh0ZW5kcy9pbXBsZW1lbnRzIGFyZSBwb3NzaWJsZSBrZXl3b3Jkcw0KKwkJCQkJfQ0KKwkJCSovDQorCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gd29yay1hcm91bmQgaW50ZXJuYWwgZmFpbHVyZSAtIDFHRU1GNkQNCisJCX0gY2F0Y2ggKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKSB7IC8vIG1heSBldmVudHVhbGx5IHJlcG9ydCBhIHVzZWZ1bGwgZXJyb3INCisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeyAvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24gZm9yIG5vdyBzaW5jZSBpdCB0eXBpY2FsbHkgbWVhbnMgd2UgY2Fubm90IGZpbmQgamF2YS5sYW5nLk9iamVjdA0KKwkJfSBmaW5hbGx5IHsNCisJCQlyZXNldCgpOw0KIAkJfQ0KIAl9DQotfQ0KLXByaXZhdGUgdm9pZCBmaW5kRmllbGRzQW5kTWV0aG9kcyhjaGFyW10gdG9rZW4sIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgU2NvcGUgc2NvcGUpIHsNCi0JaWYgKHRva2VuID09IG51bGwpIHJldHVybjsNCisJcHJpdmF0ZSBUeXBlQmluZGluZ1tdIGNvbXB1dGVUeXBlcyhFeHByZXNzaW9uW10gYXJndW1lbnRzLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQorCQlpZiAoYXJndW1lbnRzID09IG51bGwpDQorCQkJcmV0dXJuIG51bGw7DQogDQotCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKSByZXR1cm47IC8vIG5vdGhpbmcgZWxzZSBpcyBwb3NzaWJsZSB3aXRoIGJhc2UgdHlwZXMNCi0JaWYgKHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKSB7DQotCQlpZiAodG9rZW4ubGVuZ3RoIDw9IGxlbmd0aEZpZWxkLmxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbGVuZ3RoRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKSkNCisJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsNCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbYXJnc0xlbmd0aF07DQorCQlmb3IgKGludCBhID0gYXJnc0xlbmd0aDsgLS1hID49IDA7KQ0KKwkJCWFyZ1R5cGVzW2FdID0gYXJndW1lbnRzW2FdLnJlc29sdmVUeXBlKHNjb3BlKTsNCisJCXJldHVybiBhcmdUeXBlczsNCisJfQ0KKwlwcml2YXRlIHZvaWQgZmluZENsYXNzRmllbGQoY2hhcltdIHRva2VuLCBUeXBlQmluZGluZyByZWNlaXZlclR5cGUpIHsNCisJCWlmICh0b2tlbiA9PSBudWxsKQ0KKwkJCXJldHVybjsNCisNCisJCWlmICh0b2tlbi5sZW5ndGggPD0gY2xhc3NGaWVsZC5sZW5ndGgNCisJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgY2xhc3NGaWVsZCwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8NCisJCQkpKQ0KIAkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgNCiAJCQkJTm9DaGFyLA0KIAkJCQlOb0NoYXIsDQotCQkJCWxlbmd0aEZpZWxkLA0KKwkJCQljbGFzc0ZpZWxkLA0KIAkJCQlOb0NoYXIsDQogCQkJCU5vQ2hhciwNCi0JCQkJbGVuZ3RoRmllbGQsDQotCQkJCUNvbXBpbGVyTW9kaWZpZXJzLkFjY1B1YmxpYywNCisJCQkJY2xhc3NGaWVsZCwNCisJCQkJQ29tcGlsZXJNb2RpZmllcnMuQWNjU3RhdGljIHwgQ29tcGlsZXJNb2RpZmllcnMuQWNjUHVibGljLA0KIAkJCQlzdGFydFBvc2l0aW9uLA0KIAkJCQllbmRQb3NpdGlvbik7DQotDQotCQlyZWNlaXZlclR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOw0KIAl9DQorCXByaXZhdGUgdm9pZCBmaW5kQ29uc3RydWN0b3JzKA0KKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwNCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsDQorCQlTY29wZSBzY29wZSwNCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7DQorCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUNCisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUubWV0aG9kcygpOw0KKwkJaW50IG1pbkFyZ0xlbmd0aCA9IGFyZ1R5cGVzID09IG51bGwgPyAwIDogYXJnVHlwZXMubGVuZ3RoOw0KKwkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7DQorCQkJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IG1ldGhvZHNbZl07DQorCQkJaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IoKSkgew0KKwkJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHlTZW5zaXRpdmUoKQ0KKwkJCQkJJiYgIWNvbnN0cnVjdG9yLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCBzY29wZSkpDQorCQkJCQljb250aW51ZSBuZXh0Ow0KIA0KLQlmaW5kRmllbGRzKHRva2VuLCAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlLCBzY29wZSwgbmV3IE9iamVjdFZlY3RvcigpLCBmYWxzZSk7DQotCWZpbmRNZXRob2RzKHRva2VuLCBudWxsLCAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlLCBzY29wZSwgbmV3IE9iamVjdFZlY3RvcigpLCBmYWxzZSwgZmFsc2UpOw0KLX0NCi1wcml2YXRlIHZvaWQgZmluZEltcG9ydHMoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSkgew0KLQljaGFyW10gaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UudG9rZW5zLCAnLicpOw0KLQlpZiAoaW1wb3J0TmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQlyZXNvbHZpbmdJbXBvcnRzID0gdHJ1ZTsNCi0Jc2V0U291cmNlUmFuZ2UoaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCBpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOyAvLyB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIC4qOw0KLQluYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKGltcG9ydE5hbWUsIHRoaXMpOw0KLQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKGltcG9ydE5hbWUsIHRoaXMpOw0KLX0NCi0vLyB3aGF0IGFib3V0IG9uRGVtYW5kIHR5cGVzPyBJZ25vcmUgdGhlbSBzaW5jZSBpdCBkb2VzIG5vdCBoYXBwZW4hDQotLy8gaW1wb3J0IHAxLnAyLkEuKjsNCi1wcml2YXRlIHZvaWQgZmluZEtleXdvcmRzKGNoYXJbXSBrZXl3b3JkLCBjaGFyW11bXSBjaG9pY2VzLCBTY29wZSBzY29wZSkgew0KLQlpbnQgbGVuZ3RoID0ga2V5d29yZC5sZW5ndGg7DQotCWlmIChsZW5ndGggPiAwKQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQ0KLQkJCWlmIChsZW5ndGggPD0gY2hvaWNlc1tpXS5sZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoa2V5d29yZCwgY2hvaWNlc1tpXSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pKQ0KLQkJCQlyZXF1ZXN0b3IuYWNjZXB0S2V5d29yZChjaG9pY2VzW2ldLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7DQotfQ0KLS8vIEhlbHBlciBtZXRob2QgZm9yIGZpbmRNZW1iZXJUeXBlcyhjaGFyW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlKQ0KKwkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzOw0KKwkJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsNCisJCQkJaWYgKG1pbkFyZ0xlbmd0aCA+IHBhcmFtTGVuZ3RoKQ0KKwkJCQkJY29udGludWUgbmV4dDsNCisJCQkJZm9yIChpbnQgYSA9IG1pbkFyZ0xlbmd0aDsgLS1hID49IDA7KQ0KKwkJCQkJaWYgKGFyZ1R5cGVzW2FdICE9IG51bGwpIC8vIGNhbiBiZSBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBwcm9wZXJseQ0KKwkJCQkJCWlmICghc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGFyZ1R5cGVzW2FdLCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2FdKSkNCisJCQkJCQkJY29udGludWUgbmV4dDsNCiANCi1wcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKGNoYXJbXSB0eXBlTmFtZSwgUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzLCBPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCkgew0KLQ0KLQkvLyBJbmhlcml0ZWQgbWVtYmVyIHR5cGVzIHdoaWNoIGFyZSBoaWRkZW4gYnkgc3ViY2xhc3NlcyBhcmUgZmlsdGVyZWQgb3V0DQotCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQ0KLQ0KLQlpbnQgdHlwZUxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsNCi0JbmV4dCA6IGZvciAoaW50IG0gPSBtZW1iZXJUeXBlcy5sZW5ndGg7IC0tbSA+PSAwOykgew0KLQkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbbV07DQotLy8JCWlmICghd2FudENsYXNzZXMgJiYgbWVtYmVyVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7DQotLy8JCWlmICghd2FudEludGVyZmFjZXMgJiYgbWVtYmVyVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0Ow0KLQkJaWYgKHR5cGVMZW5ndGggPiBtZW1iZXJUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0Ow0KLQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0eXBlTmFtZSwgbWVtYmVyVHlwZS5zb3VyY2VOYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIGNvbnRpbnVlIG5leHQ7DQotDQotCQlmb3IgKGludCBpID0gdHlwZXNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsNCi0JCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChpKTsNCi0JCQlpZiAobWVtYmVyVHlwZSA9PSBvdGhlclR5cGUpIGNvbnRpbnVlIG5leHQ7DQotCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1lbWJlclR5cGUuc291cmNlTmFtZSwgb3RoZXJUeXBlLnNvdXJjZU5hbWUsIHRydWUpKSB7DQotCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc1N1cGVyY2xhc3NPZihvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpKSkgY29udGludWUgbmV4dDsNCi0JCQkJaWYgKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkNCi0JCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCksIHRydWUpKSBjb250aW51ZSBuZXh0Ow0KKwkJCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBuZXcgY2hhcltwYXJhbUxlbmd0aF1bXTsNCisJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107DQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgew0KKwkJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IHBhcmFtZXRlcnNbaV07DQorCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7DQorCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsNCisJCQkJfQ0KKwkJCQljaGFyW10gY29tcGxldGlvbiA9IFR5cGVDb25zdGFudHMuTm9DaGFyOw0KKwkJCQkvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzDQorCQkJCWlmIChzb3VyY2UgPT0gbnVsbA0KKwkJCQkJfHwgc291cmNlLmxlbmd0aCA8PSBlbmRQb3NpdGlvbg0KKwkJCQkJfHwgc291cmNlW2VuZFBvc2l0aW9uXSAhPSAnKScpDQorCQkJCQljb21wbGV0aW9uID0gbmV3IGNoYXJbXSB7ICcpJyB9Ow0KKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKA0KKwkJCQkJY3VycmVudFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCisJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwNCisJCQkJCWN1cnJlbnRUeXBlLnNvdXJjZU5hbWUoKSwNCisJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lcywNCisJCQkJCXBhcmFtZXRlclR5cGVOYW1lcywNCisJCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyLA0KKwkJCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXIsDQorCQkJCQljb21wbGV0aW9uLA0KKwkJCQkJY29uc3RydWN0b3IubW9kaWZpZXJzLA0KKwkJCQkJZW5kUG9zaXRpb24sDQorCQkJCQllbmRQb3NpdGlvbik7DQogCQkJfQ0KIAkJfQ0KLQ0KLQkJdHlwZXNGb3VuZC5hZGQobWVtYmVyVHlwZSk7DQotCQlpZiAobWVtYmVyVHlwZS5pc0NsYXNzKCkpDQotCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKA0KLQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQotCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KLQkJCQltZW1iZXJUeXBlLnNvdXJjZU5hbWUoKSwNCi0JCQkJbWVtYmVyVHlwZS5tb2RpZmllcnMsDQotCQkJCXN0YXJ0UG9zaXRpb24sDQotCQkJCWVuZFBvc2l0aW9uKTsNCi0JCWVsc2UNCi0JCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKA0KLQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQotCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KLQkJCQltZW1iZXJUeXBlLnNvdXJjZU5hbWUoKSwNCi0JCQkJbWVtYmVyVHlwZS5tb2RpZmllcnMsDQotCQkJCXN0YXJ0UG9zaXRpb24sDQotCQkJCWVuZFBvc2l0aW9uKTsNCiAJfQ0KLX0NCi1wcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKGNoYXJbXSB0eXBlTmFtZSwgUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwgU2NvcGUgc2NvcGUpIHsNCi0JaWYgKHR5cGVOYW1lID09IG51bGwpIHJldHVybjsNCi0JaWYgKGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpID09IG51bGwpIHJldHVybjsgLy8gd2UncmUgdHJ5aW5nIHRvIGZpbmQgYSBzdXBlcnR5cGUNCisJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZEZpZWxkcyhjaGFyW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4pDQogDQotCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KLQlpZiAoaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlIHx8IHR5cGVOYW1lLmxlbmd0aCA9PSAwKSB7IC8vIGRvIG5vdCBzZWFyY2ggdXAgdGhlIGhpZXJhcmNoeQ0KLQkJZmluZE1lbWJlclR5cGVzKHR5cGVOYW1lLCBjdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpLCB0eXBlc0ZvdW5kKTsNCi0JCXJldHVybjsNCi0JfQ0KKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygNCisJCWNoYXJbXSBmaWVsZE5hbWUsDQorCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMsDQorCQlTY29wZSBzY29wZSwNCisJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwNCisJCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwNCisJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywNCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLA0KKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsDQorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUpIHsNCiANCi0JUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOw0KLQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQotCWRvIHsNCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQ0KLQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107DQotCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCi0JCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOw0KLQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KLQkJfQ0KKwkJLy8gSW5oZXJpdGVkIGZpZWxkcyB3aGljaCBhcmUgaGlkZGVuIGJ5IHN1YmNsYXNzZXMgYXJlIGZpbHRlcmVkIG91dA0KKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlDQogDQotCQlmaW5kTWVtYmVyVHlwZXModHlwZU5hbWUsIGN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCksIHR5cGVzRm91bmQpOw0KLQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7DQotCX0gd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpOw0KKwkJaW50IGZpZWxkTGVuZ3RoID0gZmllbGROYW1lLmxlbmd0aDsNCisJCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7DQorCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOw0KKwkJCWlmIChvbmx5U3RhdGljRmllbGRzICYmICFmaWVsZC5pc1N0YXRpYygpKQ0KKwkJCQljb250aW51ZSBuZXh0Ow0KKwkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKQ0KKwkJCQljb250aW51ZSBuZXh0Ow0KKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoZmllbGROYW1lLCBmaWVsZC5uYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLw0KKwkJCQkpKQ0KKwkJCQljb250aW51ZSBuZXh0Ow0KIA0KLQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsNCi0JCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KLQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7DQotCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzW2pdOw0KLQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQpID09IDApIHsgLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZA0KLQkJCQkJYW5JbnRlcmZhY2UudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQorCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5U2Vuc2l0aXZlKCkNCisJCQkJJiYgIWZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkNCisJCQkJY29udGludWUgbmV4dDsNCiANCi0JCQkJCWZpbmRNZW1iZXJUeXBlcyh0eXBlTmFtZSwgYW5JbnRlcmZhY2UubWVtYmVyVHlwZXMoKSwgdHlwZXNGb3VuZCk7DQotDQotCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOw0KLQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCi0JCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQotCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQotCQkJCQl9DQorCQkJZm9yIChpbnQgaSA9IGZpZWxkc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgew0KKwkJCQlGaWVsZEJpbmRpbmcgb3RoZXJGaWVsZCA9IChGaWVsZEJpbmRpbmcpIGZpZWxkc0ZvdW5kLmVsZW1lbnRBdChpKTsNCisJCQkJaWYgKGZpZWxkID09IG90aGVyRmllbGQpDQorCQkJCQljb250aW51ZSBuZXh0Ow0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQubmFtZSwgb3RoZXJGaWVsZC5uYW1lLCB0cnVlKSkgew0KKwkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MpKQ0KKwkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQ0KKwkJCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQ0KKwkJCQkJCQljb250aW51ZSBuZXh0Ow0KIAkJCQl9DQogCQkJfQ0KLQkJfQ0KIA0KLQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24NCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCi0JCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykNCi0JCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5UYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQotCQl9DQotCX0NCi19DQotcHJpdmF0ZSB2b2lkIGZpbmRNZXNzYWdlU2VuZHMoY2hhcltdIHRva2VuLCBUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLCBTY29wZSBzY29wZSkgew0KLQlpZiAodG9rZW4gPT0gbnVsbCkgcmV0dXJuOw0KKwkJCWZpZWxkc0ZvdW5kLmFkZChmaWVsZCk7DQogDQotCWJvb2xlYW4gc3RhdGljc09ubHkgPSBmYWxzZTsgLy8gbmVlZCB0byBrbm93IGlmIHdlJ3JlIGluIGEgc3RhdGljIGNvbnRleHQgKG9yIGluc2lkZSBhIGNvbnN0cnVjdG9yKQ0KLQlpbnQgdG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7DQotCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQotCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kDQotCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsNCi0JCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6DQotCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpDQotCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsNCi0JCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6DQotCQkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBzY29wZTsNCi0JCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQkJCQlmaW5kTWV0aG9kcyh0b2tlbiwgYXJnVHlwZXMsIGVuY2xvc2luZ1R5cGUsIGNsYXNzU2NvcGUsIG1ldGhvZHNGb3VuZCwgc3RhdGljc09ubHksIHRydWUpOw0KLQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6DQotCQkJCWJyZWFrIGRvbmU7DQotCQl9DQotCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCi0JfQ0KLX0NCi0vLyBIZWxwZXIgbWV0aG9kIGZvciBmaW5kTWV0aG9kcyhjaGFyW10sIFR5cGVCaW5kaW5nW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4sIGJvb2xlYW4pDQotDQotcHJpdmF0ZSB2b2lkIGZpbmRNZXRob2RzKA0KLQljaGFyW10gbWV0aG9kTmFtZSwNCi0JVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywNCi0JTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsDQotCVNjb3BlIHNjb3BlLA0KLQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLA0KLS8vCWJvb2xlYW4gbm9Wb2lkUmV0dXJuVHlwZSwgaG93IGRvIHlvdSBrbm93Pw0KLQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLA0KLQlib29sZWFuIGV4YWN0TWF0Y2gpIHsNCi0NCi0JLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQNCi0JLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlDQotDQotCWludCBtZXRob2RMZW5ndGggPSBtZXRob2ROYW1lLmxlbmd0aDsNCi0JaW50IG1pbkFyZ0xlbmd0aCA9IGFyZ1R5cGVzID09IG51bGwgPyAwIDogYXJnVHlwZXMubGVuZ3RoOw0KLQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsNCi0JCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsNCi0JCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0Ow0KLS8vCQlpZiAobm9Wb2lkUmV0dXJuVHlwZSAmJiBtZXRob2QucmV0dXJuVHlwZSA9PSBCYXNlVHlwZXMuVm9pZEJpbmRpbmcpIGNvbnRpbnVlIG5leHQ7DQotCQlpZiAob25seVN0YXRpY01ldGhvZHMgJiYgIW1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0Ow0KLQkJaWYgKGV4YWN0TWF0Y2gpIHsNCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pKSBjb250aW51ZSBuZXh0Ow0KLQkJfSBlbHNlIHsNCi0JCQlpZiAobWV0aG9kTGVuZ3RoID4gbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCkgY29udGludWUgbmV4dDsNCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pKSBjb250aW51ZSBuZXh0Ow0KLQkJfQ0KLQkJaWYgKG1pbkFyZ0xlbmd0aCA+IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCkgY29udGludWUgbmV4dDsNCi0JCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOykNCi0JCQlpZiAoYXJnVHlwZXNbYV0gIT0gbnVsbCkgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5DQotCQkJCWlmICghc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGFyZ1R5cGVzW2FdLCBtZXRob2QucGFyYW1ldGVyc1thXSkpIGNvbnRpbnVlIG5leHQ7DQotDQotCQlmb3IgKGludCBpID0gbWV0aG9kc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgew0KLQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsNCi0JCQlpZiAobWV0aG9kID09IG90aGVyTWV0aG9kKSBjb250aW51ZSBuZXh0Ow0KLQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIG90aGVyTWV0aG9kLnNlbGVjdG9yLCB0cnVlKSAmJiBtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKG90aGVyTWV0aG9kKSkgew0KLQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkgY29udGludWUgbmV4dDsNCi0JCQkJaWYgKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpDQotCQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKSBjb250aW51ZSBuZXh0Ow0KKwkJCWZvciAoaW50IGwgPSBsb2NhbHNGb3VuZC5zaXplOyAtLWwgPj0gMDspIHsNCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGxvY2Fsc0ZvdW5kLmVsZW1lbnRBdChsKTsNCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkLm5hbWUsIGxvY2FsLm5hbWUsIHRydWUpKSB7DQorCQkJCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkLm5hbWU7DQorCQkJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmcgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7DQorCQkJCQlpZiAoZmllbGQuaXNTdGF0aWMoKSkgew0KKwkJCQkJCWNoYXJbXSBuYW1lID0gZW5jbG9zaW5nLmNvbXBvdW5kTmFtZVtlbmNsb3NpbmcuY29tcG91bmROYW1lLmxlbmd0aC0xXTsNCisJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZSAsY29tcGxldGlvbiwnLicpOw0KKwkJCQkJfSBlbHNlIHs7DQorCQkJCQkJaWYoZW5jbG9zaW5nID09IGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpew0KKwkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoVEhJUyxjb21wbGV0aW9uLCcuJyk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJY2hhcltdIG5hbWUgPSBlbmNsb3NpbmcuY29tcG91bmROYW1lW2VuY2xvc2luZy5jb21wb3VuZE5hbWUubGVuZ3RoLTFdOw0KKwkJCQkJCQlpZighZW5jbG9zaW5nLmlzTmVzdGVkVHlwZSgpKXsNCisJCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUSElTLGNvbXBsZXRpb24sJy4nKTsNCisJCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLGNvbXBsZXRpb24sJy4nKTsNCisJCQkJCQkJfSBlbHNlIGlmICghZW5jbG9zaW5nLmlzQW5vbnltb3VzVHlwZSgpKXsNCisJCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUSElTLGNvbXBsZXRpb24sJy4nKTsNCisJCQkJCQkJCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyQnLG5hbWUpOw0KKwkJCQkJCQkJY2hhcltdIHNob3J0TmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSxpbmRleCsxLG5hbWUubGVuZ3RoKTsNCisJCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChzaG9ydE5hbWUsY29tcGxldGlvbiwnLicpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJcmVxdWVzdG9yDQorCQkJCQkJLmFjY2VwdEZpZWxkKA0KKwkJCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KKwkJCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksDQorCQkJCQkJCWZpZWxkLm5hbWUsDQorCQkJCQkJCWZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCisJCQkJCQkJZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksDQorCQkJCQkJCWNvbXBsZXRpb24sDQorCQkJCQkvLyBtYXkgaW5jbHVkZSBzb21lIHF1YWxpZmljYXRpb24gdG8gcmVzb2x2ZSBhbWJpZ3VpdGllcw0KKwkJCQkJZmllbGQubW9kaWZpZXJzLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7DQorCQkJCQljb250aW51ZSBuZXh0Ow0KKwkJCQl9DQogCQkJfQ0KLQkJfQ0KIA0KLQkJbWV0aG9kc0ZvdW5kLmFkZChtZXRob2QpOw0KLQkJaW50IGxlbmd0aCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsNCi0JCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsNCi0JCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCQlUeXBlQmluZGluZyB0eXBlID0gbWV0aG9kLnBhcmFtZXRlcnNbaV07DQotCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOw0KLQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOw0KKwkJCXJlcXVlc3Rvcg0KKwkJCQkuYWNjZXB0RmllbGQoDQorCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KKwkJCQkJZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KKwkJCQkJZmllbGQubmFtZSwNCisJCQkJCWZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCisJCQkJCWZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KKwkJCQkJZmllbGQubmFtZSwNCisJCQkvLyBtYXkgaW5jbHVkZSBzb21lIHF1YWxpZmljYXRpb24gdG8gcmVzb2x2ZSBhbWJpZ3VpdGllcw0KKwkJCWZpZWxkLm1vZGlmaWVycywgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOw0KIAkJfQ0KLQkJY2hhcltdIGNvbXBsZXRpb24gPSBUeXBlQ29uc3RhbnRzLk5vQ2hhcjsgLy8gbm90aGluZyB0byBpbnNlcnQgLSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBzZWxlY3RvciAmIGFyZ3VtZW50cw0KLQkJaWYgKCFleGFjdE1hdGNoKSB7DQotCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGggPiBlbmRQb3NpdGlvbiAmJiBzb3VyY2VbZW5kUG9zaXRpb25dID09ICcoJykNCi0JCQkJY29tcGxldGlvbiA9IG1ldGhvZC5zZWxlY3RvcjsNCi0JCQllbHNlDQotCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2Quc2VsZWN0b3IsIG5ldyBjaGFyW10geycoJywgJyknfSk7DQotCQl9DQotCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKA0KLQkJCW1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KLQkJCW1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksDQotCQkJbWV0aG9kLnNlbGVjdG9yLA0KLQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lcywNCi0JCQlwYXJhbWV0ZXJUeXBlTmFtZXMsDQotCQkJbWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCi0JCQltZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksDQotCQkJY29tcGxldGlvbiwNCi0JCQltZXRob2QubW9kaWZpZXJzLA0KLQkJCXN0YXJ0UG9zaXRpb24sDQotCQkJZW5kUG9zaXRpb24pOw0KIAl9DQotfQ0KLXByaXZhdGUgdm9pZCBmaW5kTWV0aG9kcygNCi0JY2hhcltdIHNlbGVjdG9yLA0KLQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLA0KLQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCi0JU2NvcGUgc2NvcGUsDQotCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsDQotCWJvb2xlYW4gb25seVN0YXRpY01ldGhvZHMsDQotCWJvb2xlYW4gZXhhY3RNYXRjaCkgew0KKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygNCisJCWNoYXJbXSBmaWVsZE5hbWUsDQorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCVNjb3BlIHNjb3BlLA0KKwkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLA0KKwkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kLA0KKwkJYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzLA0KKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsDQorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUpIHsNCiANCi0JaWYgKHNlbGVjdG9yID09IG51bGwpIHJldHVybjsNCisJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkNCisJCQlyZXR1cm47DQogDQotCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7DQotCWlmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpKSB7DQotCQlmaW5kTWV0aG9kcyhzZWxlY3RvciwgYXJnVHlwZXMsIGN1cnJlbnRUeXBlLm1ldGhvZHMoKSwgc2NvcGUsIG1ldGhvZHNGb3VuZCwgb25seVN0YXRpY01ldGhvZHMsIGV4YWN0TWF0Y2gpOw0KKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsNCisJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsNCisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsNCisJCWRvIHsNCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQ0KKwkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOw0KKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KKwkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwNCisJCQkJCQkwLA0KKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkwLA0KKwkJCQkJCWxhc3RQb3NpdGlvbik7DQorCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KKwkJCX0NCiANCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCi0JCQlpbnQgbGFzdFBvc2l0aW9uID0gMDsNCi0JCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCi0JCQkNCisJCQlmaW5kRmllbGRzKA0KKwkJCQlmaWVsZE5hbWUsDQorCQkJCWN1cnJlbnRUeXBlLmZpZWxkcygpLA0KKwkJCQlzY29wZSwNCisJCQkJZmllbGRzRm91bmQsDQorCQkJCWxvY2Fsc0ZvdW5kLA0KKwkJCQlvbmx5U3RhdGljRmllbGRzLA0KKwkJCQlyZWNlaXZlclR5cGUsDQorCQkJCWludm9jYXRpb25TaXRlLA0KKwkJCQlpbnZvY2F0aW9uU2NvcGUpOw0KKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOw0KKwkJfSB3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCk7DQorDQorCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KIAkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQogCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQogCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7DQotCQkJCQljdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal07DQotCQkJCQlpZiAoKGN1cnJlbnRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQpID09IDApIHsgLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZA0KLQkJCQkJCWN1cnJlbnRUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkOw0KKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQorCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQpID09IDApIHsNCisJCQkJCQkvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkDQorCQkJCQkJYW5JbnRlcmZhY2UudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQogDQotCQkJCQkJZmluZE1ldGhvZHMoc2VsZWN0b3IsIGFyZ1R5cGVzLCBjdXJyZW50VHlwZS5tZXRob2RzKCksIHNjb3BlLCBtZXRob2RzRm91bmQsIG9ubHlTdGF0aWNNZXRob2RzLCBleGFjdE1hdGNoKTsNCisJCQkJCQlmaW5kRmllbGRzKA0KKwkJCQkJCQlmaWVsZE5hbWUsDQorCQkJCQkJCWFuSW50ZXJmYWNlLmZpZWxkcygpLA0KKwkJCQkJCQlzY29wZSwNCisJCQkJCQkJZmllbGRzRm91bmQsDQorCQkJCQkJCWxvY2Fsc0ZvdW5kLA0KKwkJCQkJCQlvbmx5U3RhdGljRmllbGRzLA0KKwkJCQkJCQlyZWNlaXZlclR5cGUsDQorCQkJCQkJCWludm9jYXRpb25TaXRlLA0KKwkJCQkJCQlpbnZvY2F0aW9uU2NvcGUpOw0KIA0KLQkJCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOw0KIAkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQogCQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQorCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LA0KKwkJCQkJCQkJCTAsDQorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLA0KKwkJCQkJCQkJCTAsDQorCQkJCQkJCQkJbGFzdFBvc2l0aW9uKTsNCiAJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQogCQkJCQkJfQ0KIAkJCQkJfQ0KQEAgLTgxMywxOTEgKzczOSw3MjEgQEAKIAkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5UYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQogCQkJfQ0KIAkJfQ0KLQkJY3VycmVudFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOw0KIAl9DQorCXByaXZhdGUgdm9pZCBmaW5kRmllbGRzQW5kTWV0aG9kcygNCisJCWNoYXJbXSB0b2tlbiwNCisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCVNjb3BlIHNjb3BlLA0KKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsDQorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUpIHsNCisJCWlmICh0b2tlbiA9PSBudWxsKQ0KKwkJCXJldHVybjsNCiANCi0Jd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsNCi0JCWZpbmRNZXRob2RzKHNlbGVjdG9yLCBhcmdUeXBlcywgY3VycmVudFR5cGUubWV0aG9kcygpLCBzY29wZSwgbWV0aG9kc0ZvdW5kLCBvbmx5U3RhdGljTWV0aG9kcywgZXhhY3RNYXRjaCk7DQotCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsNCisJCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQ0KKwkJCXJldHVybjsgLy8gbm90aGluZyBlbHNlIGlzIHBvc3NpYmxlIHdpdGggYmFzZSB0eXBlcw0KKwkJaWYgKHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKSB7DQorCQkJaWYgKHRva2VuLmxlbmd0aCA8PSBsZW5ndGhGaWVsZC5sZW5ndGgNCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGxlbmd0aEZpZWxkLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLw0KKwkJCQkpKQ0KKwkJCQlyZXF1ZXN0b3IuYWNjZXB0RmllbGQoDQorCQkJCQlOb0NoYXIsDQorCQkJCQlOb0NoYXIsDQorCQkJCQlsZW5ndGhGaWVsZCwNCisJCQkJCU5vQ2hhciwNCisJCQkJCU5vQ2hhciwNCisJCQkJCWxlbmd0aEZpZWxkLA0KKwkJCQkJQ29tcGlsZXJNb2RpZmllcnMuQWNjUHVibGljLA0KKwkJCQkJc3RhcnRQb3NpdGlvbiwNCisJCQkJCWVuZFBvc2l0aW9uKTsNCisNCisJCQlyZWNlaXZlclR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOw0KKwkJfQ0KKw0KKwkJZmluZEZpZWxkcygNCisJCQl0b2tlbiwNCisJCQkoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlLA0KKwkJCXNjb3BlLA0KKwkJCW5ldyBPYmplY3RWZWN0b3IoKSwNCisJCQluZXcgT2JqZWN0VmVjdG9yKCksDQorCQkJZmFsc2UsDQorCQkJaW52b2NhdGlvblNpdGUsDQorCQkJaW52b2NhdGlvblNjb3BlKTsNCisJCWZpbmRNZXRob2RzKA0KKwkJCXRva2VuLA0KKwkJCW51bGwsDQorCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSwNCisJCQlzY29wZSwNCisJCQluZXcgT2JqZWN0VmVjdG9yKCksDQorCQkJZmFsc2UsDQorCQkJZmFsc2UsDQorCQkJaW52b2NhdGlvblNpdGUpOw0KIAl9DQotfQ0KLXByaXZhdGUgdm9pZCBmaW5kTmVzdGVkVHlwZXMoY2hhcltdIHR5cGVOYW1lLCBSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLCBTY29wZSBzY29wZSkgew0KLQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgcmV0dXJuOw0KKwlwcml2YXRlIHZvaWQgZmluZEltcG9ydHMoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSkgew0KKwkJY2hhcltdIGltcG9ydE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLnRva2VucywgJy4nKTsNCisJCWlmIChpbXBvcnROYW1lLmxlbmd0aCA9PSAwKQ0KKwkJCXJldHVybjsNCisJCXJlc29sdmluZ0ltcG9ydHMgPSB0cnVlOw0KKwkJc2V0U291cmNlUmFuZ2UoDQorCQkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LA0KKwkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7DQorCQkvLyB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIC4qOw0KKwkJbmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyhpbXBvcnROYW1lLCB0aGlzKTsNCisJCW5hbWVFbnZpcm9ubWVudC5maW5kVHlwZXMoaW1wb3J0TmFtZSwgdGhpcyk7DQorCX0NCisJLy8gd2hhdCBhYm91dCBvbkRlbWFuZCB0eXBlcz8gSWdub3JlIHRoZW0gc2luY2UgaXQgZG9lcyBub3QgaGFwcGVuIQ0KKwkvLyBpbXBvcnQgcDEucDIuQS4qOw0KKwlwcml2YXRlIHZvaWQgZmluZEtleXdvcmRzKGNoYXJbXSBrZXl3b3JkLCBjaGFyW11bXSBjaG9pY2VzLCBTY29wZSBzY29wZSkgew0KKwkJaW50IGxlbmd0aCA9IGtleXdvcmQubGVuZ3RoOw0KKwkJaWYgKGxlbmd0aCA+IDApDQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQ0KKwkJCQlpZiAobGVuZ3RoIDw9IGNob2ljZXNbaV0ubGVuZ3RoDQorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhrZXl3b3JkLCBjaG9pY2VzW2ldLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLw0KKwkJCQkJKSkNCisJCQkJCXJlcXVlc3Rvci5hY2NlcHRLZXl3b3JkKGNob2ljZXNbaV0sIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsNCisJfQ0KKwkvLyBIZWxwZXIgbWV0aG9kIGZvciBmaW5kTWVtYmVyVHlwZXMoY2hhcltdLCBSZWZlcmVuY2VCaW5kaW5nLCBTY29wZSkNCiANCi0JaW50IHR5cGVMZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7DQotCXdoaWxlIChzY29wZSAhPSBudWxsKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQNCi0JCXN3aXRjaCAoc2NvcGUua2luZCkgew0KLQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoNCi0JCQljYXNlIFNjb3BlLkJMT0NLX1NDT1BFIDoNCi0JCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHNjb3BlOw0KLQkJCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGJsb2NrU2NvcGUuc2NvcGVJbmRleDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJCQlpZiAoYmxvY2tTY29wZS5zdWJzY29wZXNbaV0gaW5zdGFuY2VvZiBDbGFzc1Njb3BlKSB7DQotCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gKChDbGFzc1Njb3BlKSBibG9ja1Njb3BlLnN1YnNjb3Blc1tpXSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQkJCQkJCWlmICghbG9jYWxUeXBlLmlzQW5vbnltb3VzVHlwZSgpKSB7DQotCQkJCQkJCWlmICh0eXBlTGVuZ3RoID4gbG9jYWxUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0Ow0KLQkJCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHR5cGVOYW1lLCBsb2NhbFR5cGUuc291cmNlTmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pKSBjb250aW51ZSBuZXh0Ow0KKwlwcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKA0KKwkJY2hhcltdIHR5cGVOYW1lLA0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzLA0KKwkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQsDQorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCVNvdXJjZVR5cGVCaW5kaW5nIGludm9jYXRpb25UeXBlKSB7DQogDQotCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcygNCi0JCQkJCQkJCWxvY2FsVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KLQkJCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUsDQotCQkJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSwNCi0JCQkJCQkJCWxvY2FsVHlwZS5tb2RpZmllcnMsDQotCQkJCQkJCQlzdGFydFBvc2l0aW9uLA0KLQkJCQkJCQkJZW5kUG9zaXRpb24pOw0KKwkJLy8gSW5oZXJpdGVkIG1lbWJlciB0eXBlcyB3aGljaCBhcmUgaGlkZGVuIGJ5IHN1YmNsYXNzZXMgYXJlIGZpbHRlcmVkIG91dA0KKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlDQorDQorCQlpbnQgdHlwZUxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsNCisJCW5leHQgOiBmb3IgKGludCBtID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLW0gPj0gMDspIHsNCisJCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1ttXTsNCisJCQkvLwkJaWYgKCF3YW50Q2xhc3NlcyAmJiBtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgY29udGludWUgbmV4dDsNCisJCQkvLwkJaWYgKCF3YW50SW50ZXJmYWNlcyAmJiBtZW1iZXJUeXBlLmlzSW50ZXJmYWNlKCkpIGNvbnRpbnVlIG5leHQ7DQorCQkJaWYgKHR5cGVMZW5ndGggPiBtZW1iZXJUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQ0KKwkJCQljb250aW51ZSBuZXh0Ow0KKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSwgZmFsc2UNCisJCQkJLyogaWdub3JlIGNhc2UgKi8NCisJCQkJKSkNCisJCQkJY29udGludWUgbmV4dDsNCisNCisJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHlTZW5zaXRpdmUoKQ0KKwkJCQkmJiAhbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25UeXBlKSkNCisJCQkJY29udGludWUgbmV4dDsNCisNCisJCQlmb3IgKGludCBpID0gdHlwZXNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsNCisJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZXNGb3VuZC5lbGVtZW50QXQoaSk7DQorCQkJCWlmIChtZW1iZXJUeXBlID09IG90aGVyVHlwZSkNCisJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZW1iZXJUeXBlLnNvdXJjZU5hbWUsIG90aGVyVHlwZS5zb3VyY2VOYW1lLCB0cnVlKSkgew0KKwkJCQkJaWYgKG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzU3VwZXJjbGFzc09mKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkpKQ0KKwkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCQlpZiAob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc0ludGVyZmFjZSgpKQ0KKwkJCQkJCWlmIChtZW1iZXJUeXBlDQorCQkJCQkJCS5lbmNsb3NpbmdUeXBlKCkNCisJCQkJCQkJLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkpDQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCX0NCisJCQl9DQorDQorCQkJdHlwZXNGb3VuZC5hZGQobWVtYmVyVHlwZSk7DQorCQkJaWYgKG1lbWJlclR5cGUuaXNDbGFzcygpKQ0KKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoDQorCQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQorCQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwNCisJCQkJCW1lbWJlclR5cGUuc291cmNlTmFtZSgpLA0KKwkJCQkJbWVtYmVyVHlwZS5tb2RpZmllcnMsDQorCQkJCQlzdGFydFBvc2l0aW9uLA0KKwkJCQkJZW5kUG9zaXRpb24pOw0KKwkJCWVsc2UNCisJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgNCisJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCisJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KKwkJCQkJbWVtYmVyVHlwZS5zb3VyY2VOYW1lKCksDQorCQkJCQltZW1iZXJUeXBlLm1vZGlmaWVycywNCisJCQkJCXN0YXJ0UG9zaXRpb24sDQorCQkJCQllbmRQb3NpdGlvbik7DQorCQl9DQorCX0NCisJcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygNCisJCWNoYXJbXSB0eXBlTmFtZSwNCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLA0KKwkJU2NvcGUgc2NvcGUsDQorCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlSW52b2NhdGlvbikgew0KKw0KKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsNCisJCWlmICh0eXBlTmFtZSA9PSBudWxsKQ0KKwkJCXJldHVybjsNCisJCWlmIChjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKSA9PSBudWxsKQ0KKwkJCXJldHVybjsgLy8gd2UncmUgdHJ5aW5nIHRvIGZpbmQgYSBzdXBlcnR5cGUNCisNCisJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KKwkJaWYgKGluc2lkZVF1YWxpZmllZFJlZmVyZW5jZQ0KKwkJCXx8IHR5cGVOYW1lLmxlbmd0aCA9PSAwKSB7IC8vIGRvIG5vdCBzZWFyY2ggdXAgdGhlIGhpZXJhcmNoeQ0KKwkJCWZpbmRNZW1iZXJUeXBlcygNCisJCQkJdHlwZU5hbWUsDQorCQkJCWN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCksDQorCQkJCXR5cGVzRm91bmQsDQorCQkJCXJlY2VpdmVyVHlwZSwNCisJCQkJdHlwZUludm9jYXRpb24pOw0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsNCisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsNCisJCWRvIHsNCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQ0KKwkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOw0KKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KKwkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwNCisJCQkJCQkwLA0KKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkwLA0KKwkJCQkJCWxhc3RQb3NpdGlvbik7DQorCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KKwkJCX0NCisNCisJCQlmaW5kTWVtYmVyVHlwZXMoDQorCQkJCXR5cGVOYW1lLA0KKwkJCQljdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpLA0KKwkJCQl0eXBlc0ZvdW5kLA0KKwkJCQlyZWNlaXZlclR5cGUsDQorCQkJCXR5cGVJbnZvY2F0aW9uKTsNCisJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsNCisJCX0gd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpOw0KKw0KKwkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQorCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQpID09IDApIHsNCisJCQkJCQkvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkDQorCQkJCQkJYW5JbnRlcmZhY2UudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQorDQorCQkJCQkJZmluZE1lbWJlclR5cGVzKA0KKwkJCQkJCQl0eXBlTmFtZSwNCisJCQkJCQkJYW5JbnRlcmZhY2UubWVtYmVyVHlwZXMoKSwNCisJCQkJCQkJdHlwZXNGb3VuZCwNCisJCQkJCQkJcmVjZWl2ZXJUeXBlLA0KKwkJCQkJCQl0eXBlSW52b2NhdGlvbik7DQorDQorCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KKwkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwNCisJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCWxhc3RQb3NpdGlvbik7DQorCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KIAkJCQkJCX0NCiAJCQkJCX0NCiAJCQkJfQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoNCi0JCQkJZmluZE1lbWJlclR5cGVzKHR5cGVOYW1lLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIHNjb3BlKTsNCi0JCQkJaWYgKHR5cGVMZW5ndGggPT0gMCkgcmV0dXJuOyAvLyBkbyBub3Qgc2VhcmNoIG91dHNpZGUgdGhlIGNsYXNzIHNjb3BlIGlmIG5vIHByZWZpeCB3YXMgcHJvdmlkZWQNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoNCi0JCQkJcmV0dXJuOw0KKwkJCX0NCisNCisJCQkvLyBiaXQgcmVpbml0aWFsaXphdGlvbg0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQorCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQorCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQ0KKwkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5UYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQorCQkJfQ0KIAkJfQ0KLQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQogCX0NCi19DQotcHJpdmF0ZSB2b2lkIGZpbmRQYWNrYWdlcyhDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlIHBhY2thZ2VTdGF0ZW1lbnQpIHsNCi0JY2hhcltdIHBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VTdGF0ZW1lbnQudG9rZW5zLCAnLicpOw0KLQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHJldHVybjsNCisJcHJpdmF0ZSB2b2lkIGZpbmRNZXNzYWdlU2VuZHMoDQorCQljaGFyW10gdG9rZW4sDQorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLA0KKwkJU2NvcGUgc2NvcGUsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KKwkJaWYgKHRva2VuID09IG51bGwpDQorCQkJcmV0dXJuOw0KIA0KLQlzZXRTb3VyY2VSYW5nZShwYWNrYWdlU3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBwYWNrYWdlU3RhdGVtZW50LnNvdXJjZUVuZCk7DQotCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMoQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYWNrYWdlTmFtZSksIHRoaXMpOw0KLX0NCi1wcml2YXRlIHZvaWQgZmluZFR5cGVzQW5kUGFja2FnZXMoY2hhcltdIHRva2VuLCBTY29wZSBzY29wZSkgew0KLQlpZiAodG9rZW4gPT0gbnVsbCkgcmV0dXJuOw0KKwkJYm9vbGVhbiBzdGF0aWNzT25seSA9IGZhbHNlOw0KKwkJLy8gbmVlZCB0byBrbm93IGlmIHdlJ3JlIGluIGEgc3RhdGljIGNvbnRleHQgKG9yIGluc2lkZSBhIGNvbnN0cnVjdG9yKQ0KKwkJaW50IHRva2VuTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOw0KKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsNCisJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kDQorCQkJc3dpdGNoIChzY29wZS5raW5kKSB7DQorCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoNCisJCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpDQorCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7DQorCQkJCQlzdGF0aWNzT25seSB8PSBtZXRob2RTY29wZS5pc1N0YXRpYyB8IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOw0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOg0KKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIHNjb3BlOw0KKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KKwkJCQkJZmluZE1ldGhvZHMoDQorCQkJCQkJdG9rZW4sDQorCQkJCQkJYXJnVHlwZXMsDQorCQkJCQkJZW5jbG9zaW5nVHlwZSwNCisJCQkJCQljbGFzc1Njb3BlLA0KKwkJCQkJCW1ldGhvZHNGb3VuZCwNCisJCQkJCQlzdGF0aWNzT25seSwNCisJCQkJCQl0cnVlLA0KKwkJCQkJCWludm9jYXRpb25TaXRlKTsNCisJCQkJCXN0YXRpY3NPbmx5IHw9IGVuY2xvc2luZ1R5cGUuaXNTdGF0aWMoKTsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOg0KKwkJCQkJYnJlYWsgZG9uZTsNCisJCQl9DQorCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQorCQl9DQorCX0NCisJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1ldGhvZHMoY2hhcltdLCBUeXBlQmluZGluZ1tdLCBSZWZlcmVuY2VCaW5kaW5nLCBTY29wZSwgT2JqZWN0VmVjdG9yLCBib29sZWFuLCBib29sZWFuKQ0KIA0KLQlpZiAoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpICE9IG51bGwpDQotCQlmaW5kTmVzdGVkVHlwZXModG9rZW4sIHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgc2NvcGUpOw0KKwlwcml2YXRlIHZvaWQgZmluZE1ldGhvZHMoDQorCQljaGFyW10gbWV0aG9kTmFtZSwNCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsDQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywNCisJCVNjb3BlIHNjb3BlLA0KKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwNCisJLy8JYm9vbGVhbiBub1ZvaWRSZXR1cm5UeXBlLCBob3cgZG8geW91IGtub3c/DQorCWJvb2xlYW4gb25seVN0YXRpY01ldGhvZHMsDQorCQlib29sZWFuIGV4YWN0TWF0Y2gsDQorCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KIA0KLQlpZiAodW5pdFNjb3BlICE9IG51bGwpIHsNCi0JCWludCB0eXBlTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOw0KLQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9IHVuaXRTY29wZS50b3BMZXZlbFR5cGVzOw0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHR5cGVzW2ldOw0KLQkJCWlmICh0eXBlTGVuZ3RoID4gc291cmNlVHlwZS5zb3VyY2VOYW1lLmxlbmd0aCkgY29udGludWU7DQotCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgc291cmNlVHlwZS5zb3VyY2VOYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIGNvbnRpbnVlOw0KKwkJLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQNCisJCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQ0KIA0KLQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKA0KLQkJCQlzb3VyY2VUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQotCQkJCXNvdXJjZVR5cGUuc291cmNlTmFtZSgpLA0KLQkJCQlzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKSwNCisJCWludCBtZXRob2RMZW5ndGggPSBtZXRob2ROYW1lLmxlbmd0aDsNCisJCWludCBtaW5BcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsNCisJCW5leHQgOiBmb3IgKGludCBmID0gbWV0aG9kcy5sZW5ndGg7IC0tZiA+PSAwOykgew0KKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsNCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCisJCQkJY29udGludWUgbmV4dDsNCisJCQkvLwkJaWYgKG5vVm9pZFJldHVyblR5cGUgJiYgbWV0aG9kLnJldHVyblR5cGUgPT0gQmFzZVR5cGVzLlZvaWRCaW5kaW5nKSBjb250aW51ZSBuZXh0Ow0KKwkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiAhbWV0aG9kLmlzU3RhdGljKCkpDQorCQkJCWNvbnRpbnVlIG5leHQ7DQorDQorCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5U2Vuc2l0aXZlKCkNCisJCQkJJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpDQorCQkJCWNvbnRpbnVlIG5leHQ7DQorDQorCQkJaWYgKGV4YWN0TWF0Y2gpIHsNCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovDQorCQkJCQkpKQ0KKwkJCQkJY29udGludWUgbmV4dDsNCisJCQl9IGVsc2Ugew0KKwkJCQlpZiAobWV0aG9kTGVuZ3RoID4gbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCkNCisJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZQ0KKwkJCQkJLyogaWdub3JlIGNhc2UgKi8NCisJCQkJCSkpDQorCQkJCQljb250aW51ZSBuZXh0Ow0KKwkJCX0NCisJCQlpZiAobWluQXJnTGVuZ3RoID4gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKQ0KKwkJCQljb250aW51ZSBuZXh0Ow0KKwkJCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOykNCisJCQkJaWYgKGFyZ1R5cGVzW2FdICE9IG51bGwpIC8vIGNhbiBiZSBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBwcm9wZXJseQ0KKwkJCQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoYXJnVHlwZXNbYV0sIG1ldGhvZC5wYXJhbWV0ZXJzW2FdKSkNCisJCQkJCQljb250aW51ZSBuZXh0Ow0KKw0KKwkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7DQorCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsNCisJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCkNCisJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIG90aGVyTWV0aG9kLnNlbGVjdG9yLCB0cnVlKQ0KKwkJCQkJJiYgbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChvdGhlck1ldGhvZCkpIHsNCisJCQkJCWlmIChtZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2Yob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MpKQ0KKwkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCQlpZiAob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkNCisJCQkJCQlpZiAobWV0aG9kDQorCQkJCQkJCS5kZWNsYXJpbmdDbGFzcw0KKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShvdGhlck1ldGhvZC5kZWNsYXJpbmdDbGFzcywgdHJ1ZSkpDQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCX0NCisJCQl9DQorDQorCQkJbWV0aG9kc0ZvdW5kLmFkZChtZXRob2QpOw0KKwkJCWludCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7DQorCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOw0KKwkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1tpXTsNCisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOw0KKwkJCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsNCisJCQl9DQorCQkJY2hhcltdIGNvbXBsZXRpb24gPSBUeXBlQ29uc3RhbnRzLk5vQ2hhcjsNCisJCQkvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzDQorCQkJaWYgKCFleGFjdE1hdGNoKSB7DQorCQkJCWlmIChzb3VyY2UgIT0gbnVsbA0KKwkJCQkJJiYgc291cmNlLmxlbmd0aCA+IGVuZFBvc2l0aW9uDQorCQkJCQkmJiBzb3VyY2VbZW5kUG9zaXRpb25dID09ICcoJykNCisJCQkJCWNvbXBsZXRpb24gPSBtZXRob2Quc2VsZWN0b3I7DQorCQkJCWVsc2UNCisJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2Quc2VsZWN0b3IsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsNCisJCQl9DQorCQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZCgNCisJCQkJbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQorCQkJCW1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksDQorCQkJCW1ldGhvZC5zZWxlY3RvciwNCisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLA0KKwkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMsDQorCQkJCW1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksDQorCQkJCW1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwNCisJCQkJY29tcGxldGlvbiwNCisJCQkJbWV0aG9kLm1vZGlmaWVycywNCiAJCQkJc3RhcnRQb3NpdGlvbiwNCiAJCQkJZW5kUG9zaXRpb24pOw0KIAkJfQ0KIAl9DQorCXByaXZhdGUgdm9pZCBmaW5kTWV0aG9kcygNCisJCWNoYXJbXSBzZWxlY3RvciwNCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsDQorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCVNjb3BlIHNjb3BlLA0KKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwNCisJCWJvb2xlYW4gb25seVN0YXRpY01ldGhvZHMsDQorCQlib29sZWFuIGV4YWN0TWF0Y2gsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KIA0KLQlpZiAodG9rZW4ubGVuZ3RoID09IDApIHJldHVybjsNCi0JZmluZEtleXdvcmRzKHRva2VuLCBiYXNlVHlwZXMsIHNjb3BlKTsNCi0JbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyh0b2tlbiwgdGhpcyk7DQotCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXModG9rZW4sIHRoaXMpOw0KLX0NCi1wcml2YXRlIHZvaWQgZmluZFR5cGVzQW5kU3VicGFja2FnZXMoY2hhcltdIHRva2VuLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KLQljaGFyW10gcXVhbGlmaWVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUsIHRva2VuLCAnLicpOw0KLQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGggPT0gMCkgew0KLQkJaW50IGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOw0KLQkJU3lzdGVtLmFycmF5Y29weShxdWFsaWZpZWROYW1lLCAwLCBxdWFsaWZpZWROYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7DQotCQlxdWFsaWZpZWROYW1lW2xlbmd0aF0gPSAnLic7DQotCX0NCi0JbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyhxdWFsaWZpZWROYW1lLCB0aGlzKTsNCi0JbmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyhxdWFsaWZpZWROYW1lLCB0aGlzKTsNCi19DQotcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKGNoYXJbXSB0b2tlbiwgU2NvcGUgc2NvcGUpIHsNCi0JaWYgKHRva2VuID09IG51bGwpIHJldHVybjsNCisJCWlmIChzZWxlY3RvciA9PSBudWxsKQ0KKwkJCXJldHVybjsNCiANCi0JLy8gU2hvdWxkIGxvY2FsIHZhcmlhYmxlcyBoaWRlIGZpZWxkcyBmcm9tIHRoZSByZWNlaXZlciB0eXBlIG9yIGFueSBvZiBpdHMgZW5jbG9zaW5nIHR5cGVzPw0KLQkvLyB3ZSBrbm93IGl0cyBhbiBpbXBsaWNpdCBmaWVsZC9tZXRob2QgYWNjZXNzLi4uIHNlZSBCbG9ja1Njb3BlIGdldEJpbmRpbmcvZ2V0SW1wbGljaXRNZXRob2QNCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7DQorCQlpZiAoY3VycmVudFR5cGUuaXNJbnRlcmZhY2UoKSkgew0KKwkJCWZpbmRNZXRob2RzKA0KKwkJCQlzZWxlY3RvciwNCisJCQkJYXJnVHlwZXMsDQorCQkJCWN1cnJlbnRUeXBlLm1ldGhvZHMoKSwNCisJCQkJc2NvcGUsDQorCQkJCW1ldGhvZHNGb3VuZCwNCisJCQkJb25seVN0YXRpY01ldGhvZHMsDQorCQkJCWV4YWN0TWF0Y2gsDQorCQkJCXJlY2VpdmVyVHlwZSwNCisJCQkJaW52b2NhdGlvblNpdGUpOw0KIA0KLQlib29sZWFuIHN0YXRpY3NPbmx5ID0gZmFsc2U7IC8vIG5lZWQgdG8ga25vdyBpZiB3ZSdyZSBpbiBhIHN0YXRpYyBjb250ZXh0IChvciBpbnNpZGUgYSBjb25zdHJ1Y3RvcikNCi0JY2hhcltdW10gZm91bmQgPSBudWxsOw0KLQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQotCWludCB0b2tlbkxlbmd0aCA9IHRva2VuLmxlbmd0aDsNCi0JT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KLQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KLQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZA0KLQkJc3dpdGNoIChzY29wZS5raW5kKSB7DQotCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOg0KLQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQ0KLQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7DQotCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7DQotCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6DQotCQkJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSA9IChCbG9ja1Njb3BlKSBzY29wZTsNCi0JCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLmxvY2Fscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBibG9ja1Njb3BlLmxvY2Fsc1tpXTsNCi0JCQkJCWlmIChsb2NhbCA9PSBudWxsKSBicmVhayBuZXh0Ow0KLQkJCQkJaWYgKHRva2VuTGVuZ3RoID4gbG9jYWwubmFtZS5sZW5ndGgpIGNvbnRpbnVlIG5leHQ7DQotCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBsb2NhbC5uYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIGNvbnRpbnVlIG5leHQ7DQotCQkJCQlpZiAobG9jYWwuaXNTZWNyZXQoKSkgY29udGludWUgbmV4dDsNCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCisJCQkJaW50IGxhc3RQb3NpdGlvbiA9IDA7DQorCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KIA0KLQkJCQkJaWYgKGZvdW5kID09IG51bGwpIHsNCi0JCQkJCQlmb3VuZCA9IG5ldyBjaGFyWzVdW107DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgZm91bmQubGVuZ3RoOyBmKyspIHsNCi0JCQkJCQkJY2hhcltdIG5hbWUgPSBmb3VuZFtmXTsNCi0JCQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgYnJlYWs7DQotCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhuYW1lLCBsb2NhbC5uYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIGNvbnRpbnVlIG5leHQ7DQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KKwkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsNCisJCQkJCQljdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal07DQorCQkJCQkJaWYgKChjdXJyZW50VHlwZS50YWdCaXRzICYgVGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7DQorCQkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQNCisJCQkJCQkJY3VycmVudFR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7DQorDQorCQkJCQkJCWZpbmRNZXRob2RzKA0KKwkJCQkJCQkJc2VsZWN0b3IsDQorCQkJCQkJCQlhcmdUeXBlcywNCisJCQkJCQkJCWN1cnJlbnRUeXBlLm1ldGhvZHMoKSwNCisJCQkJCQkJCXNjb3BlLA0KKwkJCQkJCQkJbWV0aG9kc0ZvdW5kLA0KKwkJCQkJCQkJb25seVN0YXRpY01ldGhvZHMsDQorCQkJCQkJCQlleGFjdE1hdGNoLA0KKwkJCQkJCQkJcmVjZWl2ZXJUeXBlLA0KKwkJCQkJCQkJaW52b2NhdGlvblNpdGUpOw0KKw0KKwkJCQkJCQlpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQorCQkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KKwkJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LA0KKwkJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sDQorCQkJCQkJCQkJCTAsDQorCQkJCQkJCQkJCWxhc3RQb3NpdGlvbik7DQorCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCisJCQkJCQkJfQ0KIAkJCQkJCX0NCiAJCQkJCX0NCi0JCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBmb3VuZC5sZW5ndGgpDQotCQkJCQkJU3lzdGVtLmFycmF5Y29weShmb3VuZCwgMCwgZm91bmQgPSBuZXcgY2hhcltsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOw0KLQkJCQkJZm91bmRbbGFzdFBvc2l0aW9uXSA9IGxvY2FsLm5hbWU7DQotDQotCQkJCQlyZXF1ZXN0b3IuYWNjZXB0TG9jYWxWYXJpYWJsZSgNCi0JCQkJCQlsb2NhbC5uYW1lLA0KLQkJCQkJCU5vQ2hhciwNCi0JCQkJCQlsb2NhbC50eXBlID09IG51bGwgPyBsb2NhbC5kZWNsYXJhdGlvbi50eXBlLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSA6IGxvY2FsLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLA0KLQkJCQkJCWxvY2FsLm1vZGlmaWVycywNCi0JCQkJCQlzdGFydFBvc2l0aW9uLA0KLQkJCQkJCWVuZFBvc2l0aW9uKTsNCiAJCQkJfQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoNCi0JCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIHNjb3BlOw0KLQkJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotLyoJCQkJaWYgKHRva2VuTGVuZ3RoID09IDApIHsgLy8gb25seSBzZWFyY2ggaW5zaWRlIHRoZSB0eXBlIGl0c2VsZiBpZiBubyBwcmVmaXggd2FzIHByb3ZpZGVkDQotCQkJCQlmaW5kRmllbGRzKHRva2VuLCBlbmNsb3NpbmdUeXBlLmZpZWxkcygpLCBjbGFzc1Njb3BlLCBmaWVsZHNGb3VuZCwgc3RhdGljc09ubHkpOw0KLQkJCQkJZmluZE1ldGhvZHModG9rZW4sIGVuY2xvc2luZ1R5cGUubWV0aG9kcygpLCBjbGFzc1Njb3BlLCBtZXRob2RzRm91bmQsIHN0YXRpY3NPbmx5LCBmYWxzZSk7DQotCQkJCQlicmVhayBkb25lOw0KLQkJCQl9IGVsc2UgeyAqLw0KLQkJCQkJZmluZEZpZWxkcyh0b2tlbiwgZW5jbG9zaW5nVHlwZSwgY2xhc3NTY29wZSwgZmllbGRzRm91bmQsIHN0YXRpY3NPbmx5KTsNCi0JCQkJCWZpbmRNZXRob2RzKHRva2VuLCBudWxsLCBlbmNsb3NpbmdUeXBlLCBjbGFzc1Njb3BlLCBtZXRob2RzRm91bmQsIHN0YXRpY3NPbmx5LCBmYWxzZSk7DQotCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7DQotLy8JCQkJfQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOg0KLQkJCQlicmVhayBkb25lOw0KLQkJfQ0KLQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQotCX0NCi19DQotcHVibGljIEFzc2lzdFBhcnNlciBnZXRQYXJzZXIoKXsNCi0JcmV0dXJuIHBhcnNlcjsNCi19DQotcHJpdmF0ZSBib29sZWFuIG11c3RRdWFsaWZ5VHlwZShjaGFyW11bXSBwYWNrYWdlTmFtZSwgY2hhcltdIHJlYWRhYmxlVHlwZU5hbWUpIHsNCi0JLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGVzIGRlZmluZWQgaW50byB0aGUgY3VycmVudCBDVSB5ZXQuDQotCWlmICh1bml0U2NvcGUgPT0gbnVsbCkNCi0JCXJldHVybiB0cnVlOw0KLQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSwgcGFja2FnZU5hbWUpKQ0KLQkJcmV0dXJuIGZhbHNlOw0KIA0KLQlJbXBvcnRCaW5kaW5nW10gaW1wb3J0cyA9IHVuaXRTY29wZS5pbXBvcnRzOw0KLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJaWYgKGltcG9ydHNbaV0ub25EZW1hbmQpIHsNCi0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW1wb3J0c1tpXS5jb21wb3VuZE5hbWUsIHBhY2thZ2VOYW1lKSkNCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBob3cgZG8geW91IG1hdGNoIHAxLnAyLkEuKiA/DQotCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGltcG9ydHNbaV0ucmVhZGFibGVOYW1lKCksIHJlYWRhYmxlVHlwZU5hbWUpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkvLyBiaXQgcmVpbml0aWFsaXphdGlvbg0KKwkJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KKwkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCisJCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQ0KKwkJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyAmPSB+VGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWN1cnJlbnRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsNCisJCX0NCisNCisJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7DQorCQkJZmluZE1ldGhvZHMoDQorCQkJCXNlbGVjdG9yLA0KKwkJCQlhcmdUeXBlcywNCisJCQkJY3VycmVudFR5cGUubWV0aG9kcygpLA0KKwkJCQlzY29wZSwNCisJCQkJbWV0aG9kc0ZvdW5kLA0KKwkJCQlvbmx5U3RhdGljTWV0aG9kcywNCisJCQkJZXhhY3RNYXRjaCwNCisJCQkJcmVjZWl2ZXJUeXBlLA0KKwkJCQlpbnZvY2F0aW9uU2l0ZSk7DQorCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7DQogCQl9DQogCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgew0KLQlzdXBlci5yZXNldCgpOw0KLQl0aGlzLmtub3duUGtncyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7DQotfQ0KLXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsNCi0JdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnQ7DQotCXRoaXMuZW5kUG9zaXRpb24gPSBlbmQgKyAxOyAvLyBBZGQgMSBmb3Igbm93DQotfQ0KLX0NCisJcHJpdmF0ZSB2b2lkIGZpbmROZXN0ZWRUeXBlcygNCisJCWNoYXJbXSB0eXBlTmFtZSwNCisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlLA0KKwkJU2NvcGUgc2NvcGUpIHsNCisJCWlmICh0eXBlTmFtZSA9PSBudWxsKQ0KKwkJCXJldHVybjsNCisNCisJCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOw0KKwkJd2hpbGUgKHNjb3BlICE9IG51bGwpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZA0KKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgew0KKwkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6DQorCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOg0KKwkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHNjb3BlOw0KKwkJCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLnNjb3BlSW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCQkJCWlmIChibG9ja1Njb3BlLnN1YnNjb3Blc1tpXSBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsNCisJCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0NCisJCQkJCQkJCSgoQ2xhc3NTY29wZSkgYmxvY2tTY29wZS5zdWJzY29wZXNbaV0pLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCQkJCQkJaWYgKCFsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsNCisJCQkJCQkJCWlmICh0eXBlTGVuZ3RoID4gbG9jYWxUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQ0KKwkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHR5cGVOYW1lLCBsb2NhbFR5cGUuc291cmNlTmFtZSwgZmFsc2UNCisJCQkJCQkJCQkvKiBpZ25vcmUgY2FzZSAqLw0KKwkJCQkJCQkJCSkpDQorCQkJCQkJCQkJY29udGludWUgbmV4dDsNCisNCisJCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcygNCisJCQkJCQkJCQlsb2NhbFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwNCisJCQkJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSwNCisJCQkJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSwNCisJCQkJCQkJCQlsb2NhbFR5cGUubW9kaWZpZXJzLA0KKwkJCQkJCQkJCXN0YXJ0UG9zaXRpb24sDQorCQkJCQkJCQkJZW5kUG9zaXRpb24pOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOg0KKwkJCQkJZmluZE1lbWJlclR5cGVzKHR5cGVOYW1lLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIHNjb3BlLCBjdXJyZW50VHlwZSk7DQorCQkJCQlpZiAodHlwZUxlbmd0aCA9PSAwKQ0KKwkJCQkJCXJldHVybjsgLy8gZG8gbm90IHNlYXJjaCBvdXRzaWRlIHRoZSBjbGFzcyBzY29wZSBpZiBubyBwcmVmaXggd2FzIHByb3ZpZGVkDQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoNCisJCQkJCXJldHVybjsNCisJCQl9DQorCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQorCQl9DQorCX0NCisJcHJpdmF0ZSB2b2lkIGZpbmRQYWNrYWdlcyhDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlIHBhY2thZ2VTdGF0ZW1lbnQpIHsNCisJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlU3RhdGVtZW50LnRva2VucywgJy4nKTsNCisJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkNCisJCQlyZXR1cm47DQorDQorCQlzZXRTb3VyY2VSYW5nZShwYWNrYWdlU3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBwYWNrYWdlU3RhdGVtZW50LnNvdXJjZUVuZCk7DQorCQluYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGFja2FnZU5hbWUpLCB0aGlzKTsNCisJfQ0KKwlwcml2YXRlIHZvaWQgZmluZFR5cGVzQW5kUGFja2FnZXMoY2hhcltdIHRva2VuLCBTY29wZSBzY29wZSkgew0KKwkJaWYgKHRva2VuID09IG51bGwpDQorCQkJcmV0dXJuOw0KKw0KKwkJaWYgKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBudWxsKQ0KKwkJCWZpbmROZXN0ZWRUeXBlcyh0b2tlbiwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBzY29wZSk7DQorDQorCQlpZiAodW5pdFNjb3BlICE9IG51bGwpIHsNCisJCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsNCisJCQlTb3VyY2VUeXBlQmluZGluZ1tdIHR5cGVzID0gdW5pdFNjb3BlLnRvcExldmVsVHlwZXM7DQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0eXBlc1tpXTsNCisJCQkJaWYgKHR5cGVMZW5ndGggPiBzb3VyY2VUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQ0KKwkJCQkJY29udGludWU7DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSwgZmFsc2UNCisJCQkJCS8qIGlnbm9yZSBjYXNlICovDQorCQkJCQkpKQ0KKwkJCQkJY29udGludWU7DQorDQorCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKA0KKwkJCQkJc291cmNlVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLA0KKwkJCQkJc291cmNlVHlwZS5zb3VyY2VOYW1lKCksDQorCQkJCQlzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKSwNCisJCQkJCXN0YXJ0UG9zaXRpb24sDQorCQkJCQllbmRQb3NpdGlvbik7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKHRva2VuLmxlbmd0aCA9PSAwKQ0KKwkJCXJldHVybjsNCisJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgYmFzZVR5cGVzLCBzY29wZSk7DQorCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHRva2VuLCB0aGlzKTsNCisJCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXModG9rZW4sIHRoaXMpOw0KKwl9DQorCXByaXZhdGUgdm9pZCBmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcygNCisJCWNoYXJbXSB0b2tlbiwNCisJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQorCQljaGFyW10gcXVhbGlmaWVkTmFtZSA9DQorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgdG9rZW4sICcuJyk7DQorCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGggPT0gMCkgew0KKwkJCWludCBsZW5ndGggPSBxdWFsaWZpZWROYW1lLmxlbmd0aDsNCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQlxdWFsaWZpZWROYW1lLA0KKwkJCQkwLA0KKwkJCQlxdWFsaWZpZWROYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sDQorCQkJCTAsDQorCQkJCWxlbmd0aCk7DQorCQkJcXVhbGlmaWVkTmFtZVtsZW5ndGhdID0gJy4nOw0KKwkJfQ0KKwkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyhxdWFsaWZpZWROYW1lLCB0aGlzKTsNCisJCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMocXVhbGlmaWVkTmFtZSwgdGhpcyk7DQorCX0NCisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKA0KKwkJY2hhcltdIHRva2VuLA0KKwkJU2NvcGUgc2NvcGUsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwNCisJCVNjb3BlIGludm9jYXRpb25TY29wZSkgew0KKwkJaWYgKHRva2VuID09IG51bGwpDQorCQkJcmV0dXJuOw0KKw0KKwkJLy8gU2hvdWxkIGxvY2FsIHZhcmlhYmxlcyBoaWRlIGZpZWxkcyBmcm9tIHRoZSByZWNlaXZlciB0eXBlIG9yIGFueSBvZiBpdHMgZW5jbG9zaW5nIHR5cGVzPw0KKwkJLy8gd2Uga25vdyBpdHMgYW4gaW1wbGljaXQgZmllbGQvbWV0aG9kIGFjY2Vzcy4uLiBzZWUgQmxvY2tTY29wZSBnZXRCaW5kaW5nL2dldEltcGxpY2l0TWV0aG9kDQorDQorCQlib29sZWFuIHN0YXRpY3NPbmx5ID0gZmFsc2U7DQorCQkvLyBuZWVkIHRvIGtub3cgaWYgd2UncmUgaW4gYSBzdGF0aWMgY29udGV4dCAob3IgaW5zaWRlIGEgY29uc3RydWN0b3IpDQorCQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQorCQlpbnQgdG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7DQorDQorCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQorCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KKwkJDQorCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsNCisJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kDQorCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgew0KKwkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6DQorCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQ0KKwkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsNCisJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7DQorCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOg0KKwkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIGN1cnJlbnRTY29wZTsNCisJCQkJCW5leHQgOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmxvY2tTY29wZS5sb2NhbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCisJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IGJsb2NrU2NvcGUubG9jYWxzW2ldOw0KKwkJCQkJCWlmIChsb2NhbCA9PSBudWxsKQ0KKwkJCQkJCQlicmVhayBuZXh0Ow0KKwkJCQkJCWlmICh0b2tlbkxlbmd0aCA+IGxvY2FsLm5hbWUubGVuZ3RoKQ0KKwkJCQkJCQljb250aW51ZSBuZXh0Ow0KKwkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGxvY2FsLm5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovDQorCQkJCQkJCSkpDQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7DQorCQkJCQkJaWYgKGxvY2FsLmlzU2VjcmV0KCkpDQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7DQorDQorCQkJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBsb2NhbHNGb3VuZC5zaXplOyBmKyspIHsNCisJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgb3RoZXJMb2NhbCA9DQorCQkJCQkJCQkoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGxvY2Fsc0ZvdW5kLmVsZW1lbnRBdChmKTsNCisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG90aGVyTG9jYWwubmFtZSwgbG9jYWwubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8NCisJCQkJCQkJCSkpDQorCQkJCQkJCQljb250aW51ZSBuZXh0Ow0KKwkJCQkJCX0NCisJCQkJCQlsb2NhbHNGb3VuZC5hZGQobG9jYWwpOw0KKw0KKwkJCQkJCXJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKA0KKwkJCQkJCQlsb2NhbC5uYW1lLA0KKwkJCQkJCQlOb0NoYXIsDQorCQkJCQkJCWxvY2FsLnR5cGUgPT0gbnVsbA0KKwkJCQkJCQkJPyBsb2NhbC5kZWNsYXJhdGlvbi50eXBlLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKQ0KKwkJCQkJCQkJOiBsb2NhbC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwNCisJCQkJCQkJbG9jYWwubW9kaWZpZXJzLA0KKwkJCQkJCQlzdGFydFBvc2l0aW9uLA0KKwkJCQkJCQllbmRQb3NpdGlvbik7DQorCQkJCQl9DQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoNCisJCQkJCWJyZWFrIGRvbmU7DQorCQkJfQ0KKwkJCWN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS5wYXJlbnQ7DQorCQl9DQorCQkNCisJCWN1cnJlbnRTY29wZSA9IHNjb3BlOw0KKwkJZG9uZSA6IHdoaWxlICh0cnVlKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQNCisJCQlzd2l0Y2ggKGN1cnJlbnRTY29wZS5raW5kKSB7DQorCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOg0KKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsNCisJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCQkJCS8qCQkJCWlmICh0b2tlbkxlbmd0aCA9PSAwKSB7IC8vIG9ubHkgc2VhcmNoIGluc2lkZSB0aGUgdHlwZSBpdHNlbGYgaWYgbm8gcHJlZml4IHdhcyBwcm92aWRlZA0KKwkJCQkJCQkJCQlmaW5kRmllbGRzKHRva2VuLCBlbmNsb3NpbmdUeXBlLmZpZWxkcygpLCBjbGFzc1Njb3BlLCBmaWVsZHNGb3VuZCwgc3RhdGljc09ubHkpOw0KKwkJCQkJCQkJCQlmaW5kTWV0aG9kcyh0b2tlbiwgZW5jbG9zaW5nVHlwZS5tZXRob2RzKCksIGNsYXNzU2NvcGUsIG1ldGhvZHNGb3VuZCwgc3RhdGljc09ubHksIGZhbHNlKTsNCisJCQkJCQkJCQkJYnJlYWsgZG9uZTsNCisJCQkJCQkJCQl9IGVsc2UgeyAqLw0KKwkJCQkJZmluZEZpZWxkcygNCisJCQkJCQl0b2tlbiwNCisJCQkJCQllbmNsb3NpbmdUeXBlLA0KKwkJCQkJCWNsYXNzU2NvcGUsDQorCQkJCQkJZmllbGRzRm91bmQsDQorCQkJCQkJbG9jYWxzRm91bmQsDQorCQkJCQkJc3RhdGljc09ubHksDQorCQkJCQkJaW52b2NhdGlvblNpdGUsDQorCQkJCQkJaW52b2NhdGlvblNjb3BlKTsNCisJCQkJCWZpbmRNZXRob2RzKA0KKwkJCQkJCXRva2VuLA0KKwkJCQkJCW51bGwsDQorCQkJCQkJZW5jbG9zaW5nVHlwZSwNCisJCQkJCQljbGFzc1Njb3BlLA0KKwkJCQkJCW1ldGhvZHNGb3VuZCwNCisJCQkJCQlzdGF0aWNzT25seSwNCisJCQkJCQlmYWxzZSwNCisJCQkJCQlpbnZvY2F0aW9uU2l0ZSk7DQorCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7DQorCQkJCQkvLwkJCQl9DQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoNCisJCQkJCWJyZWFrIGRvbmU7DQorCQkJfQ0KKwkJCWN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS5wYXJlbnQ7DQorCQl9DQorCX0NCisJcHVibGljIEFzc2lzdFBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorCXByaXZhdGUgYm9vbGVhbiBtdXN0UXVhbGlmeVR5cGUoDQorCQljaGFyW11bXSBwYWNrYWdlTmFtZSwNCisJCWNoYXJbXSByZWFkYWJsZVR5cGVOYW1lKSB7DQorCQkvLyBJZiB0aGVyZSBhcmUgbm8gdHlwZXMgZGVmaW5lZCBpbnRvIHRoZSBjdXJyZW50IENVIHlldC4NCisJCWlmICh1bml0U2NvcGUgPT0gbnVsbCkNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lLCBwYWNrYWdlTmFtZSkpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJSW1wb3J0QmluZGluZ1tdIGltcG9ydHMgPSB1bml0U2NvcGUuaW1wb3J0czsNCisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJaWYgKGltcG9ydHNbaV0ub25EZW1hbmQpIHsNCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGltcG9ydHNbaV0uY29tcG91bmROYW1lLCBwYWNrYWdlTmFtZSkpDQorCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGhvdyBkbyB5b3UgbWF0Y2ggcDEucDIuQS4qID8NCisJCQl9IGVsc2UNCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGltcG9ydHNbaV0ucmVhZGFibGVOYW1lKCksIHJlYWRhYmxlVHlwZU5hbWUpKSB7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgew0KKwkJc3VwZXIucmVzZXQoKTsNCisJCXRoaXMua25vd25Qa2dzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsNCisJfQ0KKwlwcml2YXRlIHZvaWQgc2V0U291cmNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7DQorCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBzdGFydDsNCisJCWlmIChvcHRpb25zLmNoZWNrRW50aXJlV29yZFJlcGxhY2VtZW50KCkpIHsNCisJCQl0aGlzLmVuZFBvc2l0aW9uID0gZW5kICsgMTsgLy8gQWRkIDEgZm9yIG5vdw0KKwkJfSBlbHNlIHsNCisJCQl0aGlzLmVuZFBvc2l0aW9uID0gYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uICsgMTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhbGwgdGhlIG9wdGlvbnMgb2YgdGhlIENvbXBsZXRpb24gRW5naW5lIHRvIGJlIHNob3duIGJ5IHRoZSBVSQ0KKwkgKg0KKwkgKiBAcGFyYW0gbG9jYWxlIGphdmEudXRpbC5Mb2NhbGUNCisJICogQHJldHVybiBjb20uaWJtLmNvbXBpbGVyLmphdmEuQ29uZmlndXJhYmxlT3B0aW9uW10NCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0RGVmYXVsdE9wdGlvbnMoTG9jYWxlIGxvY2FsZSkgew0KKwkJU3RyaW5nW10gaWRzID0NCisJCQlDb25maWd1cmFibGVPcHRpb24uZ2V0SURzKENvbXBsZXRpb25FbmdpbmUuY2xhc3MuZ2V0TmFtZSgpLCBsb2NhbGUpOw0KKw0KKwkJQ29uZmlndXJhYmxlT3B0aW9uW10gcmVzdWx0ID0gbmV3IENvbmZpZ3VyYWJsZU9wdGlvbltpZHMubGVuZ3RoXTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7DQorCQkJcmVzdWx0W2ldID0gbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihpZHNbaV0sIGxvY2FsZSk7DQorCQl9DQorDQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKaW5kZXggNDY0MzJjNC4uMzY0MzIyZSAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKQEAgLTEzLDM5ICsxMyw0MyBAQAogICogdG8gdGhlIHJhdyBuYW1lIGVudmlyb25tZW50IHJlc3VsdHMgYmVmb3JlIGFuc3dlcmluZyB0aGVtIHRvIHRoZSBVSS4NCiAgKi8NCiBwdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hSZXF1ZXN0b3Igew0KLS8qKg0KLSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBjbGFzcy4NCi0gKg0KLSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06DQotICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCi0gKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KLSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuDQotICovDQotcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBtb2RpZmllcnMpOw0KLS8qKg0KLSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBpbnRlcmZhY2UuDQotICoNCi0gKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KLSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQotICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5JIi4NCi0gKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IG1vZGlmaWVycyk7DQotLyoqDQotICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHBhY2thZ2UuDQotICoNCi0gKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KLSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQotICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSk7DQotLyoqDQotICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHR5cGUuDQotICoNCi0gKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KLSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQotICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4NCi0gKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpOw0KLX0NCisJDQorCS8qKg0KKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgY2xhc3MuDQorCSAqDQorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06DQorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuDQorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IG1vZGlmaWVycyk7DQorDQorCS8qKg0KKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgaW50ZXJmYWNlLg0KKwkgKg0KKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLkkiLg0KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgbW9kaWZpZXJzKTsNCisNCisJLyoqDQorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBwYWNrYWdlLg0KKwkgKg0KKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpOw0KKw0KKwkvKioNCisJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHR5cGUuDQorCSAqDQorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06DQorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuDQorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9TZWxlY3Rpb25FbmdpbmUuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvU2VsZWN0aW9uRW5naW5lLmphdmEKaW5kZXggODA4Yzc3NC4uMTVmYWRiYSAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9TZWxlY3Rpb25FbmdpbmUuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAJCQkJfQ0KIAkJCX07DQogDQotCXRoaXMucGFyc2VyID0gbmV3IFNlbGVjdGlvblBhcnNlcihwcm9ibGVtUmVwb3J0ZXIpOw0KKwl0aGlzLnBhcnNlciA9IG5ldyBTZWxlY3Rpb25QYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBvcHRpb25zLmdldEFzc2VydE1vZGUoKSk7DQogCXRoaXMubG9va3VwRW52aXJvbm1lbnQgPSBuZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpOw0KIH0NCiAvKioNCkBAIC0zNjYsMTEgKzM2NiwxMiBAQAogCQkvLyBjb21wdXRlIHBhcnNlIHRyZWUgZm9yIHRoaXMgbW9zdCBvdXRlciB0eXBlDQogCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQob3V0ZXJUeXBlLmdldEZpbGVOYW1lKCksIDEsIDEpOw0KIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IA0KLQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoDQotCQkJCW91dGVyVHlwZSwNCisJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KCAgDQorCQkJCW5ldyBJU291cmNlVHlwZVtde291dGVyVHlwZX0sIA0KIAkJCQlmYWxzZSwgLy8gZG9uJ3QgbmVlZCBmaWVsZCBhbmQgbWV0aG9kcw0KKwkJCQl0cnVlLCAvLyBieSBkZWZhdWx0IGdldCBtZW1iZXIgdHlwZXMNCiAJCQkJdGhpcy5wYXJzZXIucHJvYmxlbVJlcG9ydGVyKCksDQotCQkJCXJlc3VsdCk7DQorCQkJCXJlc3VsdCk7IA0KIA0KIAkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCAmJiBwYXJzZWRVbml0LnR5cGVzICE9IG51bGwpIHsNCiAJCQkvLyBmaW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSB0eXBlDQpAQCAtNDAwLDcgKzQwMSw3IEBACiAJCQkJCQkJc2VsZWN0aW9uSWRlbnRpZmllciwNCiAJCQkJCQkJbmV3IGxvbmdbcHJldmlvdXNJZGVudGlmaWVycy5sZW5ndGggKyAxXSk7DQogCQkJCX0NCi0JCQkJZmllbGQubmFtZSA9ICI8ZmFrZUZpZWxkPiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCQkJCWZpZWxkLm5hbWUgPSAiPGZha2VGaWVsZD4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJdHlwZURlY2wuZmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bXSB7ZmllbGR9Ow0KIA0KIAkJCQkvLyBidWlsZCBiaW5kaW5ncw0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCmluZGV4IDc5ZTZmMDguLjc0MjEwMDYgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQpAQCAtNDEsMTEgKzQxLDExIEBACiAJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRhcmdldFR5cGUsIHNjb3BlKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQotCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczoiLypub25OTFMqLyk7DQorCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczoiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXN1bHQuYXBwZW5kKHR5cGUudG9TdHJpbmcoKSk7DQotCXJlc3VsdC5hcHBlbmQoIi4iLypub25OTFMqLyk7DQorCXJlc3VsdC5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXN1bHQuYXBwZW5kKGNvbXBsZXRpb25JZGVudGlmaWVyKTsNCi0JcmVzdWx0LmFwcGVuZCgiPiIvKm5vbk5MUyovKTsNCisJcmVzdWx0LmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4Y2VwdGlvblJlZmVyZW5jZS5qYXZhCmluZGV4IDZiMTRkNWEuLmZkZGY0NDEgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UuamF2YQpAQCAtMzYsNiArMzYsNiBAQAogCXN1cGVyKHNvdXJjZSwgcG9zKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgew0KLQlyZXR1cm4gIjxDb21wbGV0ZU9uRXhjZXB0aW9uOiIvKm5vbk5MUyovICsgbmV3IFN0cmluZyh0b2tlbikgKyAiPiIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIjxDb21wbGV0ZU9uRXhjZXB0aW9uOiIgKyBuZXcgU3RyaW5nKHRva2VuKSArICI+IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKaW5kZXggMzNhMmE2YS4uNDdkNjJkNSAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQpAQCAtNDgsMjMgKzQ4LDIzIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7DQogCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7DQotCXMgKz0gIjxDb21wbGV0ZU9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6Ii8qbm9uTkxTKi87DQorCXMgKz0gIjxDb21wbGV0ZU9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6IjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsKQ0KLQkJcyA9IHMgKyBxdWFsaWZpY2F0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIi4iLypub25OTFMqLzsNCisJCXMgPSBzICsgcXVhbGlmaWNhdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoYWNjZXNzTW9kZSA9PSBUaGlzKSB7DQotCQlzID0gcyArICJ0aGlzKCIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAidGhpcygiOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlzID0gcyArICJzdXBlcigiLypub25OTFMqLzsNCisJCXMgPSBzICsgInN1cGVyKCI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogCQkJcyArPSBhcmd1bWVudHNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCk7DQogCQkJaWYgKGkgIT0gYXJndW1lbnRzLmxlbmd0aCAtIDEpIHsNCi0JCQkJcyArPSAiLCAiLypub25OTFMqLzsNCisJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfTsNCiAJfQ0KLQlzICs9ICIpPiIvKm5vbk5MUyovOw0KKwlzICs9ICIpPiI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQppbmRleCAzM2E5OWExLi5kNzFkN2I3IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKQEAgLTM2LDE0ICszNiwxNCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgew0KIA0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7DQotCWJ1ZmZlci4JYXBwZW5kKCI8Q29tcGxldGVPbkltcG9ydDoiLypub25OTFMqLyk7DQorCWJ1ZmZlci4JYXBwZW5kKCI8Q29tcGxldGVPbkltcG9ydDoiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCI+Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzLmphdmEKaW5kZXggNTUwOThkMC4uMGQzZDA2MyAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lbWJlckFjY2Vzcy5qYXZhCkBAIC00Myw4ICs0Myw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpew0KIAkvKiBzbG93IGNvZGUgKi8NCiAJDQotCXJldHVybiAJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOiIvKm5vbk5MUyovIA0KKwlyZXR1cm4gCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczoiICAvLyROT04tTkxTLTEkDQogCQkJKyBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24oKSANCi0JCQkrICI+Ii8qbm9uTkxTKi87DQorCQkJKyAiPiI7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YQppbmRleCBiYjk0MTllLi4zYzkxZmQxIDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXNzYWdlU2VuZC5qYXZhCkBAIC00NSwxOSArNDUsMTkgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgew0KIAkvKnNsb3cgY29kZSovDQogDQotCVN0cmluZyBzID0gIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6Ii8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6IjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAocmVjZWl2ZXIgIT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpDQotCQlzID0gcyArIHJlY2VpdmVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIi4iLypub25OTFMqLzsNCi0JcyA9IHMgKyBuZXcgU3RyaW5nKHNlbGVjdG9yKSArICIoIi8qbm9uTkxTKi87DQorCQlzID0gcyArIHJlY2VpdmVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIi4iOyAvLyROT04tTkxTLTEkDQorCXMgPSBzICsgbmV3IFN0cmluZyhzZWxlY3RvcikgKyAiKCI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KIAkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOw0KIAkJCWlmIChpICE9IGFyZ3VtZW50cy5sZW5ndGggLSAxKSB7DQotCQkJCXMgKz0gIiwgIi8qbm9uTkxTKi87DQorCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX07DQogCX0NCi0JcyA9IHMgKyAiKT4iLypub25OTFMqLzsNCisJcyA9IHMgKyAiKT4iOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQppbmRleCAxZjdlMzEzLi43YzNhZjA0IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQpAQCAtMzQsMTQgKzM0LDE0IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgew0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7DQotCWJ1ZmZlci4JYXBwZW5kKCI8Q29tcGxldGVPblBhY2thZ2U6Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuCWFwcGVuZCgiPENvbXBsZXRlT25QYWNrYWdlOiIpOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7DQogCQlpZiAoaSA8ICh0b2tlbnMubGVuZ3RoIC0gMSkpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCIuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggNjNiMjBkNS4uYWJhN2Q3MyAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtNTYsOCArNTYsOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgew0KIAlyZXR1cm4gDQogCQkoKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkgPyANCi0JCQkiPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjoiLypub25OTFMqLyA6IA0KLQkJCSI8Q29tcGxldGVPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOiIvKm5vbk5MUyovKSArIA0KLQkJc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKHRhYikgKyAiPiIvKm5vbk5MUyovOw0KKwkJCSI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOiIgOiAgLy8kTk9OLU5MUy0xJA0KKwkJCSI8Q29tcGxldGVPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOiIpICsgIC8vJE5PTi1OTFMtMSQNCisJCXN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpICsgIj4iOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEV4Y2VwdGlvblJlZmVyZW5jZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2UuamF2YQppbmRleCA0ZDAyZDQ1Li5lNTVmMDUyIDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEV4Y2VwdGlvblJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKQEAgLTM5LDEyICszOSwxMiBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgew0KIA0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWZmZXIuIGFwcGVuZCgiPENvbXBsZXRlT25FeGNlcHRpb246Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuIGFwcGVuZCgiPENvbXBsZXRlT25FeGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIi4iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KLQlidWZmZXIuYXBwZW5kKGNvbXBsZXRpb25JZGVudGlmaWVyKS5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggZGYyZWY0Ni4uMDM2ZDNmMyAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKQEAgLTYxLDEyICs2MSwxMiBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgew0KIA0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPENvbXBsZXRlT25OYW1lOiIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIjxDb21wbGV0ZU9uTmFtZToiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KLQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgiPiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZChjb21wbGV0aW9uSWRlbnRpZmllcikuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCBkMWEyOWJkLi42NWViNDI3IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtNDksMTIgKzQ5LDEyIEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7DQogDQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1ZmZlci5hcHBlbmQoIjxDb21wbGV0ZU9uVHlwZToiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIjxDb21wbGV0ZU9uVHlwZToiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KLQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgiPiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZChjb21wbGV0aW9uSWRlbnRpZmllcikuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQppbmRleCA3MWNjMzk0Li5kYjhmMDhmIDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMzYsNiArMzYsNiBAQAogCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHNjb3BlKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQotCXJldHVybiAiPENvbXBsZXRlT25OYW1lOiIvKm5vbk5MUyovICsgc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiPiIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIjxDb21wbGV0ZU9uTmFtZToiICsgc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiPiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQppbmRleCBmOWM0YzZkLi5iNzViYmU1IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtNDIsNiArNDIsNiBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpew0KIA0KLQlyZXR1cm4gIjxDb21wbGV0ZU9uVHlwZToiLypub25OTFMqLyArIG5ldyBTdHJpbmcodG9rZW4pICsgIj4iLypub25OTFMqLyA7DQorCXJldHVybiAiPENvbXBsZXRlT25UeXBlOiIgKyBuZXcgU3RyaW5nKHRva2VuKSArICI+IiA7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uUGFyc2VyLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQppbmRleCA2MmEzYjkxLi40NmUzMjEyIDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQpAQCAtNzAsOCArNzAsMTMgQEAKIAkvLyBpdCBpcyBwb3BlZCB3aGVuIGEgYmxvY2sgaXMgZXhpdGVkIA0KIAlpbnQgYmxvY2tJbnZvY2F0aW9uUHRyOw0KIAlpbnRbXSBibG9ja0ludm9jYXRpb25TdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOw0KKwkNCisvKiogQGRlcHJlY2F0ZWQgLSBzaG91bGQgdXNlIGNvbnN0cnVjdG9yIHdpdGggYXNzZXJ0TW9kZSAqLw0KIHB1YmxpYyBDb21wbGV0aW9uUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsNCi0Jc3VwZXIocHJvYmxlbVJlcG9ydGVyKTsNCisJdGhpcyhwcm9ibGVtUmVwb3J0ZXIsIGZhbHNlLypubyBhc3NlcnRpb24gYnkgZGVmYXVsdCovKTsNCit9DQorcHVibGljIENvbXBsZXRpb25QYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgYm9vbGVhbiBhc3NlcnRNb2RlKSB7DQorCXN1cGVyKHByb2JsZW1SZXBvcnRlciwgYXNzZXJ0TW9kZSk7DQogfQ0KIHB1YmxpYyBjaGFyW10gYXNzaXN0SWRlbnRpZmllcigpew0KIAlyZXR1cm4gKChDb21wbGV0aW9uU2Nhbm5lcilzY2FubmVyKS5jb21wbGV0aW9uSWRlbnRpZmllcjsNCkBAIC0zMTIsNiArMzE3LDExIEBACiAJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQ7DQogCQkJCQlicmVhazsNCiAJCQkJY2FzZSBOQU1FX1JFQ0VJVkVSOg0KKwkJCQkJLy8gcmVtb3ZlIHNwZWNpYWwgZmxhZ3MgZm9yIHByaW1pdGl2ZSB0eXBlcw0KKwkJCQkJd2hpbGUgKHRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+PSAwICYmIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gPCAwKSB7DQorCQkJCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07DQorCQkJCQl9DQorCQkJCQ0KIAkJCQkJLy8gcmVtb3ZlIHNlbGVjdG9yIA0KIAkJCQkJdGhpcy5pZGVudGlmaWVyUHRyLS07IA0KIAkJCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXS0tOw0KQEAgLTg2MCw3ICs4NzAsNyBAQAogCXRoaXMuYmxvY2tJbnZvY2F0aW9uUHRyID0gLTE7DQogfQ0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7DQotCXRoaXMuc2Nhbm5lciA9IG5ldyBDb21wbGV0aW9uU2Nhbm5lcigpOw0KKwl0aGlzLnNjYW5uZXIgPSBuZXcgQ29tcGxldGlvblNjYW5uZXIodGhpcy5hc3NlcnRNb2RlKTsNCiB9DQogLyoqDQogICogUmV0dXJucyB3aGV0aGVyIHdlIGFyZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluc2lkZSBhIGZpZWxkIGluaXRpYWxpemVyLg0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YQppbmRleCAyYWMwOTEwLi5jZGNhOTMwIDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25TY2FubmVyLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uU2Nhbm5lci5qYXZhCkBAIC0yOSw4ICsyOSw4IEBACiAJcHVibGljIGludCBjb21wbGV0ZWRJZGVudGlmaWVyRW5kID0gLTE7DQogDQogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVtcHR5Q29tcGxldGlvbklkZW50aWZpZXIgPSB7fTsNCi1wdWJsaWMgQ29tcGxldGlvblNjYW5uZXIoKSB7DQotCXN1cGVyKCk7DQorcHVibGljIENvbXBsZXRpb25TY2FubmVyKGJvb2xlYW4gYXNzZXJ0TW9kZSkgew0KKwlzdXBlcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBhc3NlcnRNb2RlKTsNCiB9DQogLyogDQogICogVHJ1bmNhdGUgdGhlIGN1cnJlbnQgaWRlbnRpZmllciBpZiBpdCBpcyBjb250YWluaW5nIHRoZSBjdXJzb3IgbG9jYXRpb24uIFNpbmNlIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkDQpAQCAtNjQ2LDcgKzY0Niw3IEBACiAJCQkJCWlmIChhdEVuZCgpKQ0KIAkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7DQogCQkJCQkvL3RoZSBhdEVuZCBtYXkgbm90IGJlIDxjdXJyZW50UG9zaXRpb24gPT0gc291cmNlLmxlbmd0aD4gaWYgc291cmNlIGlzIG9ubHkgc29tZSBwYXJ0IG9mIGEgcmVhbCAoZXh0ZXJuYWwpIHN0cmVhbQ0KLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigiQ3RybC1aIi8qbm9uTkxTKi8pOw0KKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigiQ3RybC1aIik7IC8vJE5PTi1OTFMtMSQNCiANCiAJCQkJZGVmYXVsdCA6DQogCQkJCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjdXJyZW50Q2hhcmFjdGVyKSkNCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0ludmFsaWRDdXJzb3JMb2NhdGlvbi5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9JbnZhbGlkQ3Vyc29yTG9jYXRpb24uamF2YQppbmRleCA1NDNkMzE4Li5hZGI2ZGU5IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0ludmFsaWRDdXJzb3JMb2NhdGlvbi5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvSW52YWxpZEN1cnNvckxvY2F0aW9uLmphdmEKQEAgLTE0LDEwICsxNCwxMCBAQAogCXB1YmxpYyBTdHJpbmcgaXJyaXRhbnQ7DQogDQogCS8qIFBvc3NpYmxlIGlycml0YW50cyAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DT01QTEVUSU9OX0lOU0lERV9VTklDT0RFID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIFVuaWNvZGUiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfQ09NTUVOVCA9ICJObyBDb21wbGV0aW9uIEluc2lkZSBDb21tZW50Ii8qbm9uTkxTKi87ICAgICANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfU1RSSU5HID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIFN0cmluZyIvKm5vbk5MUyovOyAgICAgICANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfTlVNQkVSID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIE51bWJlciIvKm5vbk5MUyovOyAgICAgICANCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfVU5JQ09ERSA9ICJObyBDb21wbGV0aW9uIEluc2lkZSBVbmljb2RlIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DT01QTEVUSU9OX0lOU0lERV9DT01NRU5UID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIENvbW1lbnQiOyAgICAgIC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfU1RSSU5HID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIFN0cmluZyI7ICAgICAgICAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0NPTVBMRVRJT05fSU5TSURFX05VTUJFUiA9ICJObyBDb21wbGV0aW9uIEluc2lkZSBOdW1iZXIiOyAgICAgICAgLy8kTk9OLU5MUy0xJA0KICAgICANCiBwdWJsaWMgSW52YWxpZEN1cnNvckxvY2F0aW9uKFN0cmluZyBpcnJpdGFudCl7DQogCXRoaXMuaXJyaXRhbnQgPSBpcnJpdGFudDsNCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEKaW5kZXggMWU5M2MxYi4uOTJlY2E1NyAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YQpAQCAtNTIsOCArNTIsOCBAQAogCS8vICBhbmQgaXQgaXMgcG9wZWQgd2hlbiB0aGUgdHlwZSBpcyBleGl0ZWQpDQogCXByb3RlY3RlZCBpbnQgaW5NZXRob2RQdHI7DQogCXByb3RlY3RlZCBib29sZWFuW10gaW5NZXRob2RTdGFjayA9IG5ldyBib29sZWFuW1N0YWNrSW5jcmVtZW50XTsNCi1wdWJsaWMgQXNzaXN0UGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsNCi0Jc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBmYWxzZSk7DQorcHVibGljIEFzc2lzdFBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIGFzc2VydE1vZGUpIHsNCisJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBmYWxzZSwgYXNzZXJ0TW9kZSk7DQogfQ0KIHB1YmxpYyBhYnN0cmFjdCBjaGFyW10gYXNzaXN0SWRlbnRpZmllcigpOw0KIHB1YmxpYyBpbnQgYm9keUVuZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCl7DQpAQCAtOTAsNyArOTAsOCBAQAogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0Ow0KIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5maWVsZHMubGVuZ3RoOyBpKyspew0KIAkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdHlwZS5maWVsZHNbaV07CQkJCQkNCi0JCQkJaWYgKGZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gc2Nhbm5lci5pbml0aWFsUG9zaXRpb24NCisJCQkJaWYgKCFmaWVsZC5pc0ZpZWxkKCkNCisJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uDQogCQkJCQkJJiYgc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQNCiAJCQkJCQkmJiBzY2FubmVyLmVvZlBvc2l0aW9uIDw9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kKzEpew0KIAkJCQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRJbml0aWFsaXplcigoSW5pdGlhbGl6ZXIpIGZpZWxkLCBudWxsLCAxLCB0aGlzKTsNCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvRW5naW5lLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvRW5naW5lLmphdmEKaW5kZXggMmU5NDlkOS4uZDZjODBlZSAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0VuZ2luZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9FbmdpbmUuamF2YQpAQCAtMTYsMTAyICsxNiwxMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOw0KIA0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBJVHlwZVJlcXVlc3RvciB7DQorDQogCXB1YmxpYyBMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudDsNCi0vKioNCi0gKiBBZGQgYW4gYWRkaXRpb25hbCBiaW5hcnkgdHlwZQ0KLSAqLw0KIA0KLXB1YmxpYyB2b2lkIGFjY2VwdChJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KLQlsb29rdXBFbnZpcm9ubWVudC5jcmVhdGVCaW5hcnlUeXBlRnJvbShiaW5hcnlUeXBlLCBwYWNrYWdlQmluZGluZyk7DQotfQ0KLS8qKg0KLSAqIEFkZCBhbiBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uIHVuaXQuDQotICovDQotDQotcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgew0KLQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMSwgMSk7DQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSB0aGlzLmdldFBhcnNlcigpLmRpZXRQYXJzZShzb3VyY2VVbml0LCByZXN1bHQpOw0KLQ0KLQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsNCi0JbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgdHJ1ZSk7DQotfQ0KLS8qKg0KLSAqIEFkZCBhbiBhZGRpdGlvbmFsIHNvdXJjZSB0eXBlDQotICovDQotDQotcHVibGljIHZvaWQgYWNjZXB0KElTb3VyY2VUeXBlIHNvdXJjZVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQotCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlLmdldEZpbGVOYW1lKCksIDEsIDEpOyAvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzDQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQ0KLQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLCB0cnVlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7DQotDQotCWlmICh1bml0ICE9IG51bGwpIHsNCi0JCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOw0KLQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7DQorCS8qKg0KKwkgKiBBZGQgYW4gYWRkaXRpb25hbCBiaW5hcnkgdHlwZQ0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0KElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQorCQlsb29rdXBFbnZpcm9ubWVudC5jcmVhdGVCaW5hcnlUeXBlRnJvbShiaW5hcnlUeXBlLCBwYWNrYWdlQmluZGluZyk7DQogCX0NCi19DQotLyoqDQotICogQW5zd2VyIGFuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLg0KLSAqIFRoZSBkZXNjcmlwdGlvbnMgbWF5IGJlIGNoYW5nZWQgYW5kIHBhc3NlZCBiYWNrIHRvIGEgZGlmZmVyZW50DQotICogY29tcGlsZXIuDQotICoNCi0gKiAgQHJldHVybiBDb25maWd1cmFibGVPcHRpb25bXSAtIGFycmF5IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zDQotICovDQotcHVibGljIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQotCXJldHVybiBDb21waWxlci5nZXREZWZhdWx0T3B0aW9ucyhsb2NhbGUpOw0KLX0NCi1wdWJsaWMgYWJzdHJhY3QgQXNzaXN0UGFyc2VyIGdldFBhcnNlcigpOw0KLXByb3RlY3RlZCB2b2lkIHBhcnNlTWV0aG9kKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsIGludCBwb3NpdGlvbikgew0KLQlmb3IgKGludCBpID0gdW5pdC50eXBlcy5sZW5ndGg7IC0taSA+PSAwOykgew0KLQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSB1bml0LnR5cGVzW2ldOw0KLQkJaWYgKHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uICYmIHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPj0gcG9zaXRpb24pIHsNCi0JCQlnZXRQYXJzZXIoKS5zY2FubmVyLnNldFNvdXJjZUJ1ZmZlcih1bml0LmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRDb250ZW50cygpKTsNCi0JCQlwYXJzZU1ldGhvZCh0eXBlLCB1bml0LCBwb3NpdGlvbik7DQotCQkJcmV0dXJuOw0KKw0KKwkvKioNCisJICogQWRkIGFuIGFkZGl0aW9uYWwgY29tcGlsYXRpb24gdW5pdC4NCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHsNCisJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAxLCAxKTsNCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPQ0KKwkJCXRoaXMuZ2V0UGFyc2VyKCkuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHJlc3VsdCk7DQorDQorCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsNCisJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBBZGQgYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMgKHRoZSBmaXJzdCBvbmUgaXMgdGhlIHJlcXVlc3RlZCB0eXBlLCB0aGUgcmVzdCBpcyBmb3JtZWQgYnkgdGhlDQorCSAqIHNlY29uZGFyeSB0eXBlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQpLg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0KElTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQorCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPQ0KKwkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlc1swXS5nZXRGaWxlTmFtZSgpLCAxLCAxKTsNCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQ0KKwkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoDQorCQkJCXNvdXJjZVR5cGVzLA0KKwkJCQl0cnVlLA0KKwkJCQl0cnVlLA0KKwkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsDQorCQkJCXJlc3VsdCk7DQorDQorCQlpZiAodW5pdCAhPSBudWxsKSB7DQorCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7DQorCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7DQogCQl9DQogCX0NCi19DQotcHJpdmF0ZSB2b2lkIHBhcnNlTWV0aG9kKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBpbnQgcG9zaXRpb24pIHsNCi0JLy9tZW1iZXJzDQotCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZS5tZW1iZXJUeXBlczsNCi0JaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsNCi0JCWZvciAoaW50IGkgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykgew0KLQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbaV07DQotCQkJaWYgKG1lbWJlclR5cGUuYm9keVN0YXJ0ID4gcG9zaXRpb24pIGNvbnRpbnVlOw0KLQkJCWlmIChtZW1iZXJUeXBlLmRlY2xhcmF0aW9uU291cmNlRW5kID49IHBvc2l0aW9uKSB7DQotCQkJCXBhcnNlTWV0aG9kKG1lbWJlclR5cGUsIHVuaXQsIHBvc2l0aW9uKTsNCisNCisJLyoqDQorCSAqIEFuc3dlciBhbiBhcnJheSBvZiBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucy4NCisJICogVGhlIGRlc2NyaXB0aW9ucyBtYXkgYmUgY2hhbmdlZCBhbmQgcGFzc2VkIGJhY2sgdG8gYSBkaWZmZXJlbnQNCisJICogY29tcGlsZXIuDQorCSAqDQorCSAqICBAcmV0dXJuIENvbmZpZ3VyYWJsZU9wdGlvbltdIC0gYXJyYXkgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0RGVmYXVsdE9wdGlvbnMoTG9jYWxlIGxvY2FsZSkgew0KKwkJcmV0dXJuIENvbXBpbGVyLmdldERlZmF1bHRPcHRpb25zKGxvY2FsZSk7DQorCX0NCisJcHVibGljIGFic3RyYWN0IEFzc2lzdFBhcnNlciBnZXRQYXJzZXIoKTsNCisJcHJvdGVjdGVkIHZvaWQgcGFyc2VNZXRob2QoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IHBvc2l0aW9uKSB7DQorCQlmb3IgKGludCBpID0gdW5pdC50eXBlcy5sZW5ndGg7IC0taSA+PSAwOykgew0KKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gdW5pdC50eXBlc1tpXTsNCisJCQlpZiAodHlwZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDwgcG9zaXRpb24NCisJCQkJJiYgdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA+PSBwb3NpdGlvbikgew0KKwkJCQlnZXRQYXJzZXIoKS5zY2FubmVyLnNldFNvdXJjZUJ1ZmZlcigNCisJCQkJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldENvbnRlbnRzKCkpOw0KKwkJCQlwYXJzZU1ldGhvZCh0eXBlLCB1bml0LCBwb3NpdGlvbik7DQogCQkJCXJldHVybjsNCiAJCQl9DQogCQl9DQogCX0NCiANCi0JLy9tZXRob2RzDQotCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZS5tZXRob2RzOw0KLQlpZiAobWV0aG9kcyAhPSBudWxsKSB7DQotCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykgew0KLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsNCi0JCQlpZiAobWV0aG9kLmJvZHlTdGFydCA+IHBvc2l0aW9uKSBjb250aW51ZTsNCi0JCQlpZiAobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID49IHBvc2l0aW9uKSB7DQotCQkJCWdldFBhcnNlcigpLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKG1ldGhvZCwgdW5pdCk7DQotCQkJCXJldHVybjsNCisJcHJpdmF0ZSB2b2lkIHBhcnNlTWV0aG9kKA0KKwkJVHlwZURlY2xhcmF0aW9uIHR5cGUsDQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LA0KKwkJaW50IHBvc2l0aW9uKSB7DQorCQkvL21lbWJlcnMNCisJCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZS5tZW1iZXJUeXBlczsNCisJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgLS1pID49IDA7KSB7DQorCQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbaV07DQorCQkJCWlmIChtZW1iZXJUeXBlLmJvZHlTdGFydCA+IHBvc2l0aW9uKQ0KKwkJCQkJY29udGludWU7DQorCQkJCWlmIChtZW1iZXJUeXBlLmRlY2xhcmF0aW9uU291cmNlRW5kID49IHBvc2l0aW9uKSB7DQorCQkJCQlwYXJzZU1ldGhvZChtZW1iZXJUeXBlLCB1bml0LCBwb3NpdGlvbik7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQkvL21ldGhvZHMNCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZS5tZXRob2RzOw0KKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgLS1pID49IDA7KSB7DQorCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsNCisJCQkJaWYgKG1ldGhvZC5ib2R5U3RhcnQgPiBwb3NpdGlvbikNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQlpZiAobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID49IHBvc2l0aW9uKSB7DQorCQkJCQlnZXRQYXJzZXIoKS5wYXJzZUJsb2NrU3RhdGVtZW50cyhtZXRob2QsIHVuaXQpOw0KKwkJCQkJcmV0dXJuOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJLy9pbml0aWFsaXplcnMNCisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlLmZpZWxkczsNCisJCWlmIChmaWVsZHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyAtLWkgPj0gMDspIHsNCisJCQkJaWYgKCEoZmllbGRzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpKQ0KKwkJCQkJY29udGludWU7DQorCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBmaWVsZHNbaV07DQorCQkJCWlmIChpbml0aWFsaXplci5ib2R5U3RhcnQgPiBwb3NpdGlvbikNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQlpZiAoaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPj0gcG9zaXRpb24pIHsNCisJCQkJCWdldFBhcnNlcigpLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKGluaXRpYWxpemVyLCB0eXBlLCB1bml0KTsNCisJCQkJCXJldHVybjsNCisJCQkJfQ0KIAkJCX0NCiAJCX0NCiAJfQ0KIA0KLQkvL2luaXRpYWxpemVycw0KLQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZS5maWVsZHM7DQotCWlmIChmaWVsZHMgIT0gbnVsbCkgew0KLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IC0taSA+PSAwOykgew0KLQkJCWlmICghKGZpZWxkc1tpXSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSkgY29udGludWU7DQotCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGZpZWxkc1tpXTsNCi0JCQlpZiAoaW5pdGlhbGl6ZXIuYm9keVN0YXJ0ID4gcG9zaXRpb24pIGNvbnRpbnVlOw0KLQkJCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZD49IHBvc2l0aW9uKSB7DQotCQkJCWdldFBhcnNlcigpLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKGluaXRpYWxpemVyLCB0eXBlLCB1bml0KTsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7DQorCQlsb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOw0KIAl9DQotfQ0KLXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgew0KLQlsb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOw0KLX0NCi19DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvb3B0aW9ucy5wcm9wZXJ0aWVzIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9vcHRpb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjI3NDUuLjAwMDAwMDAKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9vcHRpb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zaG93LnN1cGVySGllcmFyY2h5T3ZlcnJpZGRlbkRlY2xhcmF0aW9ucy5udW1iZXI9MQ0KLXNob3cuc3VwZXJIaWVyYXJjaHlPdmVycmlkZGVuRGVjbGFyYXRpb25zLmNhdGVnb3J5PVNob3cNCi1zaG93LnN1cGVySGllcmFyY2h5T3ZlcnJpZGRlbkRlY2xhcmF0aW9ucy5uYW1lPVNob3cgc3VwZXIgaGllcmFyY2h5IG92ZXJyaWRkZW4gbWV0aG9kcyBvciBmaWVsZHMNCi1zaG93LnN1cGVySGllcmFyY2h5T3ZlcnJpZGRlbkRlY2xhcmF0aW9ucy5wb3NzaWJsZVZhbHVlcz0yfFllc3xObw0KLXNob3cuc3VwZXJIaWVyYXJjaHlPdmVycmlkZGVuRGVjbGFyYXRpb25zLmRlc2NyaXB0aW9uPVNob3cgYW55IG1ldGhvZCBvciBmaWVsZCBkZWNsYXJlZCBpbnRvIHRoZSBzdXBlciBoaWVyYXJjaHkgZXZlbiBpZiBvdmVycmlkZGVuIGJ5IGEgbW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9uLg0KLQ0KLXNob3cuZW5jbG9zaW5nSGllcmFyY2h5T3ZlcnJpZGRlbkRlY2xhcmF0aW9ucy5udW1iZXI9Mg0KLXNob3cuZW5jbG9zaW5nSGllcmFyY2h5T3ZlcnJpZGRlbkRlY2xhcmF0aW9ucy5jYXRlZ29yeT1TaG93DQotc2hvdy5lbmNsb3NpbmdIaWVyYXJjaHlPdmVycmlkZGVuRGVjbGFyYXRpb25zLm5hbWU9U2hvdyBlbnNsb3NpbmcgaGllcmFyY2h5IG92ZXJyaWRkZW4gbWV0aG9kcyBvciBmaWVsZHMNCi1zaG93LmVuY2xvc2luZ0hpZXJhcmNoeU92ZXJyaWRkZW5EZWNsYXJhdGlvbnMucG9zc2libGVWYWx1ZXM9MnxZZXN8Tm8NCi1zaG93LmVuY2xvc2luZ0hpZXJhcmNoeU92ZXJyaWRkZW5EZWNsYXJhdGlvbnMuZGVzY3JpcHRpb249U2hvdyBhbnkgbWV0aG9kIG9yIGZpZWxkIGRlY2xhcmVkIGludG8gdGhlIGVuY2xvc2luZyBoaWVyYXJjaHkgZXZlbiBpZiBvdmVycmlkZGVuIGJ5IGEgbW9yZSBlbmNsb3NlZCB2ZXJzaW9uLg0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQppbmRleCBjMTI5ZjMyLi5mMDkyZjI1IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCkBAIC00MCwyMyArNDAsMjMgQEAKIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsNCiAJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsNCi0JcyArPSAiPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6Ii8qbm9uTkxTKi87DQorCXMgKz0gIjxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOiI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkNCi0JCXMgPSBzICsgcXVhbGlmaWNhdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIi8qbm9uTkxTKi87DQorCQlzID0gcyArIHF1YWxpZmljYXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGFjY2Vzc01vZGUgPT0gVGhpcykgew0KLQkJcyA9IHMgKyAidGhpcygiLypub25OTFMqLzsNCisJCXMgPSBzICsgInRoaXMoIjsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJcyA9IHMgKyAic3VwZXIoIi8qbm9uTkxTKi87DQorCQlzID0gcyArICJzdXBlcigiOyAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KIAkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOw0KIAkJCWlmIChpICE9IGFyZ3VtZW50cy5sZW5ndGggLSAxKSB7DQotCQkJCXMgKz0gIiwgIi8qbm9uTkxTKi87DQorCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX07DQogCX0NCi0JcyArPSAiKT4iLypub25OTFMqLzsNCisJcyArPSAiKT4iOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZS5qYXZhCmluZGV4IDQ3Njg4ZjcuLjI2N2ZmYzUgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlLmphdmEKQEAgLTQxLDggKzQxLDggQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7DQogCS8qIHNsb3cgY29kZSAqLw0KIAkNCi0JcmV0dXJuIAkiPFNlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2U6Ii8qbm9uTkxTKi8gDQorCXJldHVybiAJIjxTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlOiIgIC8vJE5PTi1OTFMtMSQNCiAJCQkrIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpIA0KLQkJCSsgIj4iLypub25OTFMqLzsNCisJCQkrICI+IjsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKaW5kZXggZmEyOWIzMS4uZmNiMjIyYiAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0zMywxNCArMzMsMTQgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYiwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsNCiANCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOw0KLQlidWZmZXIuCWFwcGVuZCgiPFNlbGVjdE9uSW1wb3J0OiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLglhcHBlbmQoIjxTZWxlY3RPbkltcG9ydDoiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCI+Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhCmluZGV4IDI2MmRmZGIuLmVkNjg1YmQgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTWVzc2FnZVNlbmQuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kLmphdmEKQEAgLTM4LDE5ICszOCwxOSBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQogCS8qc2xvdyBjb2RlKi8NCiANCi0JU3RyaW5nIHMgPSAiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6Ii8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIjxTZWxlY3RPbk1lc3NhZ2VTZW5kOiI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHJlY2VpdmVyICE9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KQ0KLQkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIi8qbm9uTkxTKi87DQotCXMgPSBzICsgbmV3IFN0cmluZyhzZWxlY3RvcikgKyAiKCIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIjsgLy8kTk9OLU5MUy0xJA0KKwlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiOyAvLyROT04tTkxTLTEkDQogCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsNCiAJCQlzICs9IGFyZ3VtZW50c1tpXS50b1N0cmluZ0V4cHJlc3Npb24oKTsNCiAJCQlpZiAoaSAhPSBhcmd1bWVudHMubGVuZ3RoIC0gMSkgew0KLQkJCQlzICs9ICIsICIvKm5vbk5MUyovOw0KKwkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQl9Ow0KIAl9DQotCXMgPSBzICsgIik+Ii8qbm9uTkxTKi87DQorCXMgPSBzICsgIik+IjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKaW5kZXggNTg0NjBkMy4uZmJlNTg4NiAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKQEAgLTMxLDE0ICszMSwxNCBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYiwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOw0KLQlidWZmZXIuCWFwcGVuZCgiPFNlbGVjdE9uUGFja2FnZToiLypub25OTFMqLyk7DQorCWJ1ZmZlci4JYXBwZW5kKCI8U2VsZWN0T25QYWNrYWdlOiIpOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7DQogCQlpZiAoaSA8ICh0b2tlbnMubGVuZ3RoIC0gMSkpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCIuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggZjU5MGE3ZC4uNGMzNmNjZSAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtNTcsOCArNTcsOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgew0KIAlyZXR1cm4gDQogCQkoKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkgPyANCi0JCQkiPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246Ii8qbm9uTkxTKi8gOiANCi0JCQkiPFNlbGVjdE9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246Ii8qbm9uTkxTKi8pICsgDQotCQlzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSArICI+Ii8qbm9uTkxTKi87DQorCQkJIjxTZWxlY3RPbkFsbG9jYXRpb25FeHByZXNzaW9uOiIgOiAgLy8kTk9OLU5MUy0xJA0KKwkJCSI8U2VsZWN0T25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjoiKSArICAvLyROT04tTkxTLTEkDQorCQlzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSArICI+IjsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQppbmRleCBkNmNkNDRmLi5hMjMzYjE4IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtNTYsMTMgKzU2LDEzIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQogDQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCI8U2VsZWN0T25OYW1lOiIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIjxTZWxlY3RPbk5hbWU6Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgIT0gbGVuZ3RoIC0gMSkNCi0JCQlidWZmZXIuYXBwZW5kKCIuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKaW5kZXggZDRjOTEzOC4uNjA3MzdiMCAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtNDUsOSArNDUsOSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7DQogCQ0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPFNlbGVjdE9uUXVhbGlmaWVkU3VwZXI6Ii8qbm9uTkxTKi8pOw0KKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPFNlbGVjdE9uUXVhbGlmaWVkU3VwZXI6Iik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZ0V4cHJlc3Npb24oKSk7DQotCWJ1ZmZlci5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IGZiOTRlMjkuLjBjYTU1YzcgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC00MiwxMyArNDIsMTMgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpIHsNCiANCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JYnVmZmVyLmFwcGVuZCgiPFNlbGVjdE9uVHlwZToiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIjxTZWxlY3RPblR5cGU6Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgIT0gbGVuZ3RoIC0gMSkNCi0JCQlidWZmZXIuYXBwZW5kKCIuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIj4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IGY3OWE0ZjYuLjYyNzRjMTIgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC00Nyw2ICs0Nyw2IEBACiAJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQotCXJldHVybiAiPFNlbGVjdE9uTmFtZToiLypub25OTFMqLyArIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIj4iLypub25OTFMqLzsNCisJcmV0dXJuICI8U2VsZWN0T25OYW1lOiIgKyBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24oKSArICI+IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDI1NjMyOTEuLjVhMWM1MWIgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC00Niw2ICs0Niw2IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7DQogDQotCXJldHVybiAiPFNlbGVjdE9uVHlwZToiLypub25OTFMqLyArIG5ldyBTdHJpbmcodG9rZW4pICsgIj4iLypub25OTFMqLyA7DQorCXJldHVybiAiPFNlbGVjdE9uVHlwZToiICsgbmV3IFN0cmluZyh0b2tlbikgKyAiPiIgOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YQppbmRleCBlYTY0NTBhLi4yOGY5ZjU1IDEwMDY0NAotLS0gYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblN1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TdXBlclJlZmVyZW5jZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsNCiANCi0JcmV0dXJuICI8U2VsZWN0T25TdXBlcjoiLypub25OTFMqLytzdXBlci50b1N0cmluZ0V4cHJlc3Npb24oKSsiPiIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIjxTZWxlY3RPblN1cGVyOiIrc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKCkrIj4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YSBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCmluZGV4IDI3NTJlOGQuLjJlNTU0NWUgMTAwNjQ0Ci0tLSBhL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCkBAIC0zMCw5ICszMCwxNCBAQAogCXB1YmxpYyBpbnQgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZDsNCiAJcHVibGljIEFzdE5vZGUgc2VsZWN0aW9uTm9kZTsNCiANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU1VQRVIgPSAic3VwZXIiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTVVBFUiA9ICJzdXBlciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKw0KKy8qKiBAZGVwcmVjYXRlZCAtIHNob3VsZCB1c2UgY29uc3RydWN0b3Igd2l0aCBhc3NlcnRNb2RlICovDQogcHVibGljIFNlbGVjdGlvblBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKSB7DQotCXN1cGVyKHByb2JsZW1SZXBvcnRlcik7DQorCXRoaXMocHJvYmxlbVJlcG9ydGVyLCBmYWxzZS8qbm8gYXNzZXJ0aW9uIGJ5IGRlZmF1bHQqLyk7DQorfQkNCitwdWJsaWMgU2VsZWN0aW9uUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIsIGJvb2xlYW4gYXNzZXJ0TW9kZSkgew0KKwlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIGFzc2VydE1vZGUpOw0KIH0NCiBwdWJsaWMgY2hhcltdIGFzc2lzdElkZW50aWZpZXIoKXsNCiAJcmV0dXJuICgoU2VsZWN0aW9uU2Nhbm5lcilzY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOw0KQEAgLTQxNyw3ICs0MjIsNyBAQAogCXJldHVybiByZWZlcmVuY2U7DQogfQ0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7DQotCXRoaXMuc2Nhbm5lciA9IG5ldyBTZWxlY3Rpb25TY2FubmVyKCk7DQorCXRoaXMuc2Nhbm5lciA9IG5ldyBTZWxlY3Rpb25TY2FubmVyKHRoaXMuYXNzZXJ0TW9kZSk7DQogfQ0KIHByb3RlY3RlZCBNZXNzYWdlU2VuZCBuZXdNZXNzYWdlU2VuZCgpIHsNCiAJLy8gJygnIEFyZ3VtZW50TGlzdG9wdCAnKScNCmRpZmYgLS1naXQgYS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25TY2FubmVyLmphdmEgYi9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25TY2FubmVyLmphdmEKaW5kZXggZTk4YmIxZC4uODA1NDFlNCAxMDA2NDQKLS0tIGEvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhCisrKyBiL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblNjYW5uZXIuamF2YQpAQCAtMjEsNiArMjEsMTEgQEAKICAqIG9uIGFuIGlkZW50aWZpZXIgcHJlZml4Lg0KICAqDQogICovDQorIA0KK3B1YmxpYyBTZWxlY3Rpb25TY2FubmVyKGJvb2xlYW4gYXNzZXJ0TW9kZSkgew0KKwlzdXBlcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBhc3NlcnRNb2RlKTsNCit9DQorDQogcHVibGljIGNoYXJbXSBnZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpIHsNCiANCiAJaWYgKHNlbGVjdGlvbklkZW50aWZpZXIgPT0gbnVsbCl7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0Fic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQppbmRleCBjYWVmMjkxLi41NTNlOTBlIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtNDgsNiArNDgsOCBAQAogCX0NCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCX0NCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgew0KKwl9DQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgew0KIAl9DQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrIGJsb2NrLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQpAQCAtMjU4LDYgKzI2MCw5IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCQlyZXR1cm4gdHJ1ZTsNCiAJfQ0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsNCiAJCXJldHVybiB0cnVlOw0KIAl9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZS5qYXZhCmluZGV4IDhiNWI5OGEuLmMwOTA2NzkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9DbGFzc0ZpbGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEKQEAgLTQsNiArNCwxNyBAQAogICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICAqLw0KK2ltcG9ydCBqYXZhLmlvLio7DQoraW1wb3J0IGphdmEudXRpbC4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCisNCiAvKioNCiAgKiBSZXByZXNlbnRzIGEgY2xhc3MgZmlsZSB3cmFwcGVyIG9uIGJ5dGVzLCBpdCBpcyBhd2FyZSBvZiBpdHMgYWN0dWFsDQogICogdHlwZSBuYW1lLg0KQEAgLTIxLDI5ICszMiwyMCBAQAogICogCQlBbnN3ZXIgYSBzbWFsbGVyIGJ5dGUgZm9ybWF0LCB3aGljaCBpcyBvbmx5IGNvbnRhaW5zIHNvbWUgc3RydWN0dXJhbCANCiAgKiAgICAgIGluZm9ybWF0aW9uLiBUaG9zZSBieXRlcyBhcmUgZGVjb2RhYmxlIHdpdGggYSByZWd1bGFyIGNsYXNzIGZpbGUgcmVhZGVyLCANCiAgKiAgICAgIHN1Y2ggYXMgRGlldENsYXNzRmlsZVJlYWRlcg0KLSAqLyANCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQotDQotDQotcHVibGljIGNsYXNzIENsYXNzRmlsZSBpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21waWxlck1vZGlmaWVycywgVHlwZUNvbnN0YW50cywgVHlwZUlkcyB7DQorICovDQorcHVibGljIGNsYXNzIENsYXNzRmlsZQ0KKwlpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21waWxlck1vZGlmaWVycywgVHlwZUNvbnN0YW50cywgVHlwZUlkcyB7DQogCXB1YmxpYyBTb3VyY2VUeXBlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nOw0KIAlwdWJsaWMgQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbDsNCi0JcHVibGljIENsYXNzRmlsZSBlbmNsb3NpbmdDbGFzc0ZpbGU7IC8vIHVzZWQgdG8gZ2VuZXJhdGUgcHJpdmF0ZSBhY2Nlc3MgbWV0aG9kcw0KKwlwdWJsaWMgQ2xhc3NGaWxlIGVuY2xvc2luZ0NsYXNzRmlsZTsNCisJLy8gdXNlZCB0byBnZW5lcmF0ZSBwcml2YXRlIGFjY2VzcyBtZXRob2RzDQogCXB1YmxpYyBpbnQgcHJvZHVjZURlYnVnQXR0cmlidXRlczsNCiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBpbm5lckNsYXNzZXNCaW5kaW5nczsNCiAJcHVibGljIGludCBudW1iZXJPZklubmVyQ2xhc3NlczsNCi0JcHVibGljIGJ5dGVbXSBoZWFkZXI7IC8vIHRoZSBoZWFkZXIgY29udGFpbnMgYWxsIHRoZSBieXRlcyB0aWxsIHRoZSBlbmQgb2YgdGhlIGNvbnN0YW50IHBvb2wNCi0JcHVibGljIGJ5dGVbXSBjb250ZW50czsgLy8gdGhhdCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSAuY2xhc3MgZmlsZQ0KKwlwdWJsaWMgYnl0ZVtdIGhlYWRlcjsNCisJLy8gdGhlIGhlYWRlciBjb250YWlucyBhbGwgdGhlIGJ5dGVzIHRpbGwgdGhlIGVuZCBvZiB0aGUgY29uc3RhbnQgcG9vbA0KKwlwdWJsaWMgYnl0ZVtdIGNvbnRlbnRzOw0KKwkvLyB0aGF0IGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIC5jbGFzcyBmaWxlDQogCXB1YmxpYyBpbnQgaGVhZGVyT2Zmc2V0Ow0KIAlwdWJsaWMgaW50IGNvbnRlbnRzT2Zmc2V0Ow0KIAlwdWJsaWMgaW50IGNvbnN0YW50UG9vbE9mZnNldDsNCkBAIC01NCwzODUgKzU2LDkxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfSEVBREVSX1NJWkUgPSAxMDAwOw0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNSRU1FTlRfU0laRSA9IDEwMDA7DQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOTkVSX0NMQVNTRVNfU0laRSA9IDU7DQotCXByb3RlY3RlZCBDaGFyQXJyYXlDYWNoZSBuYW1lVXNhZ2U7DQorCXByb3RlY3RlZCBIYXNodGFibGVPZlR5cGUgbmFtZVVzYWdlOw0KIAlwdWJsaWMgQ29kZVN0cmVhbSBjb2RlU3RyZWFtOw0KLQlwcm90ZWN0ZWQgaW50IHByb2JsZW1MaW5lOyAvLyB1c2VkIHRvIGNyZWF0ZSBsaW5lIG51bWJlciBhdHRyaWJ1dGVzIGZvciBwcm9ibGVtIG1ldGhvZHMNCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4NCi0gKi8NCi1wdWJsaWMgQ2xhc3NGaWxlKCkge30NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4NCi0gKg0KLSAqIEBwYXJhbSBhVHlwZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nDQotICogQHBhcmFtIGVuY2xvc2luZ0NsYXNzRmlsZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlDQotICogQHBhcmFtIGNyZWF0aW5nUHJvYmxlbVR5cGUgPENPREU+Ym9vbGVhbjwvQ09ERT4NCi0gKi8NCi1wdWJsaWMgQ2xhc3NGaWxlKFNvdXJjZVR5cGVCaW5kaW5nIGFUeXBlLCBDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlLCBib29sZWFuIGNyZWF0aW5nUHJvYmxlbVR5cGUpIHsNCi0JcmVmZXJlbmNlQmluZGluZyA9IGFUeXBlOw0KLQloZWFkZXIgPSBuZXcgYnl0ZVtJTklUSUFMX0hFQURFUl9TSVpFXTsNCi0JLy8gZ2VuZXJhdGUgdGhlIG1hZ2ljIG51bWJlcnMgaW5zaWRlIHRoZSBoZWFkZXINCi0JaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IChieXRlKSAoMHhDQUZFQkFCRUwgPj4gMjQpOw0KLQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAxNik7DQotCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDgpOw0KLQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAwKTsNCi0JaWYgKCgoU291cmNlVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpLnNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPT0gQ29tcGlsZXJPcHRpb25zLkpESzFfMikgew0KLQkJLy8gQ29tcGF0aWJsZSB3aXRoIEpESyAxLjINCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOyAvLyBtaW5vclZlcnNpb24gPSAwIG1lYW5zIHdlIGp1c3QgbmVlZCB0byBvZmZzZXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGJ5IDINCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOw0KLQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7DQotCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gNDY7DQotCX0gZWxzZSB7DQotCQkvLyBDb21wYXRpYmxlIHdpdGggSkRLIDEuMQ0KLQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7DQotCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMzsNCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOw0KLQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDQ1Ow0KLQl9DQotCWNvbnN0YW50UG9vbE9mZnNldCA9IGhlYWRlck9mZnNldDsNCi0JaGVhZGVyT2Zmc2V0ICs9IDI7DQotCWNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2wodGhpcyk7DQotCWludCBhY2Nlc3NGbGFncyA9IGFUeXBlLmdldEFjY2Vzc0ZsYWdzKCkgfCBBY2NTdXBlcjsNCi0JaWYgKGFUeXBlLmlzTmVzdGVkVHlwZSgpKSB7DQotCQlpZiAoYVR5cGUuaXNTdGF0aWMoKSkgew0KLQkJCS8vIGNsZWFyIEFjY19TdGF0aWMNCi0JCQlhY2Nlc3NGbGFncyAmPSB+QWNjU3RhdGljOw0KLQkJfQ0KLQkJaWYgKGFUeXBlLmlzUHJpdmF0ZSgpKSB7DQotCQkJLy8gY2xlYXIgQWNjX1ByaXZhdGUgYW5kIEFjY19QdWJsaWMNCi0JCQlhY2Nlc3NGbGFncyAmPSB+IChBY2NQcml2YXRlIHwgQWNjUHVibGljKTsNCi0JCX0NCi0JCWlmIChhVHlwZS5pc1Byb3RlY3RlZCgpKSB7DQotCQkJLy8gY2xlYXIgQWNjX1Byb3RlY3RlZCBhbmQgc2V0IEFjY19QdWJsaWMNCi0JCQlhY2Nlc3NGbGFncyAmPSB+QWNjUHJvdGVjdGVkOw0KLQkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1B1YmxpYzsNCi0JCX0NCi0JfQ0KLQkvLyBjbGVhciBhbGwgYml0cyB0aGF0IGFyZSBpbGxlZ2FsIGZvciBhIGNsYXNzIG9yIGFuIGludGVyZmFjZQ0KLQlhY2Nlc3NGbGFncyAmPSB+KEFjY1N0cmljdGZwIHwgQWNjUHJvdGVjdGVkIHwgQWNjUHJpdmF0ZSB8IEFjY1N0YXRpYyB8IEFjY1N5bmNocm9uaXplZCB8IEFjY05hdGl2ZSk7DQorCXByb3RlY3RlZCBpbnQgcHJvYmxlbUxpbmU7CS8vIHVzZWQgdG8gY3JlYXRlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZXMgZm9yIHByb2JsZW0gbWV0aG9kcw0KIA0KLQl0aGlzLmVuY2xvc2luZ0NsYXNzRmlsZSA9IGVuY2xvc2luZ0NsYXNzRmlsZTsNCi0JLy8gaW5uZXJjbGFzc2VzIGdldCB0aGVpciBuYW1lcyBjb21wdXRlZCBhdCBjb2RlIGdlbiB0aW1lDQotCWlmIChhVHlwZS5pc0xvY2FsVHlwZSgpKSB7DQotCQkoKExvY2FsVHlwZUJpbmRpbmcpIGFUeXBlKS5jb25zdGFudFBvb2xOYW1lKGNvbXB1dGVDb25zdGFudFBvb2xOYW1lKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkpOw0KLQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gYVR5cGUubWVtYmVyVHlwZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCSgoTG9jYWxUeXBlQmluZGluZykgbWVtYmVyVHlwZXNbaV0pLmNvbnN0YW50UG9vbE5hbWUoY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKSk7DQotCQl9DQotCX0NCi0JY29udGVudHMgPSBuZXcgYnl0ZVtJTklUSUFMX0NPTlRFTlRTX1NJWkVdOw0KLQkvLyBub3cgd2UgY29udGludWUgdG8gZ2VuZXJhdGUgdGhlIGJ5dGVzIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsNCi0JaW50IGNsYXNzTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhVHlwZSk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc05hbWVJbmRleCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY2xhc3NOYW1lSW5kZXg7DQotCWludCBzdXBlcmNsYXNzTmFtZUluZGV4Ow0KLQlpZiAoYVR5cGUuaXNJbnRlcmZhY2UoKSkgew0KLQkJc3VwZXJjbGFzc05hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdCgpOw0KLQl9IGVsc2Ugew0KLQkJc3VwZXJjbGFzc05hbWVJbmRleCA9IChhVHlwZS5zdXBlcmNsYXNzID09IG51bGwgPyAwIDogY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhVHlwZS5zdXBlcmNsYXNzKSk7DQotCX0NCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN1cGVyY2xhc3NOYW1lSW5kZXggPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN1cGVyY2xhc3NOYW1lSW5kZXg7DQotCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXNCaW5kaW5nID0gYVR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQotCWludCBpbnRlcmZhY2VzQ291bnQgPSBzdXBlckludGVyZmFjZXNCaW5kaW5nLmxlbmd0aDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGludGVyZmFjZXNDb3VudCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZXJmYWNlc0NvdW50Ow0KLQlpZiAoc3VwZXJJbnRlcmZhY2VzQmluZGluZyAhPSBudWxsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXNDb3VudDsgaSsrKSB7DQotCQkJaW50IGludGVyZmFjZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChzdXBlckludGVyZmFjZXNCaW5kaW5nW2ldKTsNCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZXJmYWNlSW5kZXggPj4gOCk7DQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZXJmYWNlSW5kZXg7DQotCQl9DQotCX0NCi0JcHJvZHVjZURlYnVnQXR0cmlidXRlcyA9ICgoU291cmNlVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpLnNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzOw0KLQlpbm5lckNsYXNzZXNCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW0lOTkVSX0NMQVNTRVNfU0laRV07DQotCXRoaXMuY3JlYXRpbmdQcm9ibGVtVHlwZSA9IGNyZWF0aW5nUHJvYmxlbVR5cGU7DQotCWNvZGVTdHJlYW0gPSBuZXcgQ29kZVN0cmVhbSh0aGlzKTsNCi0NCi0JLy8gcmV0cmlldmUgdGhlIGVuY2xvc2luZyBvbmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgb25lIG1hdGNoaW5nIHRoZSBwcm9wYWdhdGVkIGZsb3cgaW5mbw0KLQkvLyAxRkY5WkJVOiBMRkNPTTpBTEwgLSBMb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzIGJ1c3RlZCAoU2FuaXR5IGNoZWNrKQ0KLQlDbGFzc0ZpbGUgb3V0ZXJtb3N0Q2xhc3NGaWxlID0gdGhpcy5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKTsNCi0JaWYgKHRoaXMgPT0gb3V0ZXJtb3N0Q2xhc3NGaWxlKSB7DQotCQljb2RlU3RyZWFtLm1heEZpZWxkQ291bnQgPSBhVHlwZS5zY29wZS5yZWZlcmVuY2VUeXBlKCkubWF4RmllbGRDb3VudDsNCi0JfSBlbHNlIHsNCi0JCWNvZGVTdHJlYW0ubWF4RmllbGRDb3VudCA9IG91dGVybW9zdENsYXNzRmlsZS5jb2RlU3RyZWFtLm1heEZpZWxkQ291bnQ7DQotCX0NCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBtZXRob2QuDQotICoNCi0gKiBAcGFyYW0gbWV0aG9kIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbg0KLSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5NZXRob2RCaW5kaW5nDQotICovDQotcHVibGljIHZvaWQgYWRkQWJzdHJhY3RNZXRob2QoDQotCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLA0KLQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsNCi0NCi0JLy8gZm9yY2UgdGhlIG1vZGlmaWVycyB0byBiZSBwdWJsaWMgYW5kIGFic3RyYWN0DQotCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gQWNjUHVibGljIHwgQWNjQWJzdHJhY3Q7DQotCQ0KLQl0aGlzLmdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsNCi0JaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7DQotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSB0aGlzLmdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsNCi0JdGhpcy5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZSBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSByZWNlaXZlci4NCi0gKiBGb3IgYSBjbGFzcyB0aGV5IGNvdWxkIGJlOg0KLSAqIC0gc291cmNlIGZpbGUgYXR0cmlidXRlDQotICogLSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZQ0KLSAqIC0gZGVwcmVjYXRlZCBhdHRyaWJ1dGUNCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKCkgew0KLQkvLyB1cGRhdGUgdGhlIG1ldGhvZCBjb3VudA0KLQljb250ZW50c1ttZXRob2RDb3VudE9mZnNldCsrXSA9IChieXRlKSAobWV0aG9kQ291bnQgPj4gOCk7DQotCWNvbnRlbnRzW21ldGhvZENvdW50T2Zmc2V0XSA9IChieXRlKSBtZXRob2RDb3VudDsNCi0JDQotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOw0KLQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgc3RvcmUgdGhlIGN1cnJlbnQgb2Zmc2V0DQotCWludCBhdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JY29udGVudHNPZmZzZXQgKz0gMjsNCi0NCi0JLy8gc291cmNlIGF0dHJpYnV0ZQ0KLQlpZiAoKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBDb21waWxlck9wdGlvbnMuU291cmNlKSAhPSAwKSB7DQotCQlTdHJpbmcgZnVsbEZpbGVOYW1lID0gbmV3IFN0cmluZyhyZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmdldEZpbGVOYW1lKCkpOw0KLQkJZnVsbEZpbGVOYW1lID0gZnVsbEZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsNCi0JCWludCBsYXN0SW5kZXggPSBmdWxsRmlsZU5hbWUubGFzdEluZGV4T2YoJy8nKTsNCi0JCWlmIChsYXN0SW5kZXggIT0gLTEpIHsNCi0JCQlmdWxsRmlsZU5hbWUgPSBmdWxsRmlsZU5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEsIGZ1bGxGaWxlTmFtZS5sZW5ndGgoKSk7DQotCQl9DQotCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nDQotCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZw0KLQkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KLQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQl9DQotCQlpbnQgc291cmNlQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Tb3VyY2VOYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzb3VyY2VBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzb3VyY2VBdHRyaWJ1dGVOYW1lSW5kZXg7DQotCQkvLyBUaGUgbGVuZ3RoIG9mIGEgc291cmNlIGZpbGUgYXR0cmlidXRlIGlzIDIuIFRoaXMgaXMgYSBmaXhlZC1sZW5ndGgNCi0JCS8vIGF0dHJpYnV0ZQ0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAyOw0KLQkJLy8gd3JpdGUgdGhlIHNvdXJjZSBmaWxlIG5hbWUNCi0JCWludCBmaWxlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmdWxsRmlsZU5hbWUudG9DaGFyQXJyYXkoKSk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmlsZU5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGZpbGVOYW1lSW5kZXg7DQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4NCisJICovDQorCXB1YmxpYyBDbGFzc0ZpbGUoKSB7DQogCX0NCiANCi0JLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUNCi0JaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsNCi0JCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBpbmZvIGNvcnJlc3BvbmRpbmcNCi0JCS8vIHRvIHRoZSBAZmllbGRCaW5kaW5nDQotCQlpbnQgY29udGVudHNMZW5ndGg7DQotCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4NCisJICoNCisJICogQHBhcmFtIGFUeXBlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmcNCisJICogQHBhcmFtIGVuY2xvc2luZ0NsYXNzRmlsZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlDQorCSAqIEBwYXJhbSBjcmVhdGluZ1Byb2JsZW1UeXBlIDxDT0RFPmJvb2xlYW48L0NPREU+DQorCSAqLw0KKwlwdWJsaWMgQ2xhc3NGaWxlKA0KKwkJU291cmNlVHlwZUJpbmRpbmcgYVR5cGUsDQorCQlDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlLA0KKwkJYm9vbGVhbiBjcmVhdGluZ1Byb2JsZW1UeXBlKSB7DQorCQlyZWZlcmVuY2VCaW5kaW5nID0gYVR5cGU7DQorCQloZWFkZXIgPSBuZXcgYnl0ZVtJTklUSUFMX0hFQURFUl9TSVpFXTsNCisJCS8vIGdlbmVyYXRlIHRoZSBtYWdpYyBudW1iZXJzIGluc2lkZSB0aGUgaGVhZGVyDQorCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAyNCk7DQorCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAxNik7DQorCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiA4KTsNCisJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDApOw0KKwkJaWYgKCgoU291cmNlVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpDQorCQkJLnNjb3BlDQorCQkJLmVudmlyb25tZW50KCkNCisJCQkub3B0aW9ucw0KKwkJCS50YXJnZXRKREsNCisJCQk9PSBDb21waWxlck9wdGlvbnMuSkRLMV8yKSB7DQorCQkJLy8gQ29tcGF0aWJsZSB3aXRoIEpESyAxLjINCisJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsNCisJCQkvLyBtaW5vclZlcnNpb24gPSAwIG1lYW5zIHdlIGp1c3QgbmVlZCB0byBvZmZzZXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGJ5IDINCisJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsNCisJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsNCisJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gNDY7DQorCQl9IGVsc2Ugew0KKwkJCS8vIENvbXBhdGlibGUgd2l0aCBKREsgMS4xDQorCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7DQorCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDM7DQorCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7DQorCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDQ1Ow0KIAkJfQ0KLQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkRlcHJlY2F0ZWROYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsNCi0JCS8vIHRoZSBsZW5ndGggb2YgYSBkZXByZWNhdGVkIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQotCX0NCi0NCi0JLy8gSW5uZXIgY2xhc3MgYXR0cmlidXRlDQotCWlmIChudW1iZXJPZklubmVyQ2xhc3NlcyAhPSAwKSB7DQotCQkvLyBHZW5lcmF0ZSB0aGUgaW5uZXIgY2xhc3MgYXR0cmlidXRlDQotCQlpbnQgY29udGVudHNMZW5ndGg7DQotCQlpbnQgZXhTaXplOw0KLQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgKGV4U2l6ZSA9ICg4ICogbnVtYmVyT2ZJbm5lckNsYXNzZXMgKyA4KSkgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgKGV4U2l6ZSA+PSBJTkNSRU1FTlRfU0laRSA/IGV4U2l6ZSA6IElOQ1JFTUVOVF9TSVpFKV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQl9DQotCQkvLyBOb3cgd2Ugbm93IHRoZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcw0KLQkJLy8gYXR0cmlidXRlIG5hbWUNCi0JCWludCBhdHRyaWJ1dGVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLklubmVyQ2xhc3NOYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7DQotCQlpbnQgdmFsdWUgPSAobnVtYmVyT2ZJbm5lckNsYXNzZXMgPDwgMykgKyAyOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZklubmVyQ2xhc3NlcyA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mSW5uZXJDbGFzc2VzOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZklubmVyQ2xhc3NlczsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZyBpbm5lckNsYXNzID0gaW5uZXJDbGFzc2VzQmluZGluZ3NbaV07DQotCQkJaW50IGFjY2Vzc0ZsYWdzID0gaW5uZXJDbGFzcy5nZXRBY2Nlc3NGbGFncygpOw0KLQkJCWludCBpbm5lckNsYXNzSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3MpOw0KLQkJCS8vIGlubmVyIGNsYXNzIGluZGV4DQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGlubmVyQ2xhc3NJbmRleCA+PiA4KTsNCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbm5lckNsYXNzSW5kZXg7DQotCQkJLy8gb3V0ZXIgY2xhc3MgaW5kZXg6IGFub255bW91cyBhbmQgbG9jYWwgaGF2ZSBubyBvdXRlciBjbGFzcyBpbmRleA0KLQkJCWlmIChpbm5lckNsYXNzLmlzTWVtYmVyVHlwZSgpKSB7DQotCQkJCS8vIG1lbWJlciBvciBtZW1iZXIgb2YgbG9jYWwNCi0JCQkJaW50IG91dGVyQ2xhc3NJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoaW5uZXJDbGFzcy5lbmNsb3NpbmdUeXBlKCkpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob3V0ZXJDbGFzc0luZGV4ID4+IDgpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvdXRlckNsYXNzSW5kZXg7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgbm90IGEgbWVtYmVyIHR5cGUNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQljb25zdGFudFBvb2xPZmZzZXQgPSBoZWFkZXJPZmZzZXQ7DQorCQloZWFkZXJPZmZzZXQgKz0gMjsNCisJCWNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2wodGhpcyk7DQorCQlpbnQgYWNjZXNzRmxhZ3MgPSBhVHlwZS5nZXRBY2Nlc3NGbGFncygpIHwgQWNjU3VwZXI7DQorCQlpZiAoYVR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsNCisJCQlpZiAoYVR5cGUuaXNTdGF0aWMoKSkgew0KKwkJCQkvLyBjbGVhciBBY2NfU3RhdGljDQorCQkJCWFjY2Vzc0ZsYWdzICY9IH5BY2NTdGF0aWM7DQogCQkJfQ0KLQkJCS8vIG5hbWUgaW5kZXgNCi0JCQlpZiAoIWlubmVyQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpIHsNCi0JCQkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoaW5uZXJDbGFzcy5zb3VyY2VOYW1lKCkpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgYW4gYW5vbnltb3VzIHR5cGUNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCQkJfQkJCQkNCi0JCQkvLyBhY2Nlc3MgZmxhZw0KLQkJCWlmIChpbm5lckNsYXNzLmlzQW5vbnltb3VzVHlwZSgpKSB7DQotCQkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1ByaXZhdGU7DQotCQkJfSBlbHNlDQotCQkJCWlmIChpbm5lckNsYXNzLmlzTG9jYWxUeXBlKCkgJiYgIWlubmVyQ2xhc3MuaXNNZW1iZXJUeXBlKCkpIHsNCi0JCQkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1ByaXZhdGU7DQotCQkJCX0NCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYWNjZXNzRmxhZ3MgPj4gOCk7DQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7DQorCQkJaWYgKGFUeXBlLmlzUHJpdmF0ZSgpKSB7DQorCQkJCS8vIGNsZWFyIEFjY19Qcml2YXRlIGFuZCBBY2NfUHVibGljDQorCQkJCWFjY2Vzc0ZsYWdzICY9IH4oQWNjUHJpdmF0ZSB8IEFjY1B1YmxpYyk7DQorCQkJfQ0KKwkJCWlmIChhVHlwZS5pc1Byb3RlY3RlZCgpKSB7DQorCQkJCS8vIGNsZWFyIEFjY19Qcm90ZWN0ZWQgYW5kIHNldCBBY2NfUHVibGljDQorCQkJCWFjY2Vzc0ZsYWdzICY9IH5BY2NQcm90ZWN0ZWQ7DQorCQkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1B1YmxpYzsNCisJCQl9DQogCQl9DQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCi0JfQ0KLQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQotCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOw0KLQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisJCS8vIGNsZWFyIGFsbCBiaXRzIHRoYXQgYXJlIGlsbGVnYWwgZm9yIGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlDQorCQlhY2Nlc3NGbGFncw0KKwkJCSY9IH4oDQorCQkJCUFjY1N0cmljdGZwDQorCQkJCQl8IEFjY1Byb3RlY3RlZA0KKwkJCQkJfCBBY2NQcml2YXRlDQorCQkJCQl8IEFjY1N0YXRpYw0KKwkJCQkJfCBBY2NTeW5jaHJvbml6ZWQNCisJCQkJCXwgQWNjTmF0aXZlKTsNCiANCi0JLy8gcmVzeW5jaHJvbml6ZSBhbGwgb2Zmc2V0cyBvZiB0aGUgY2xhc3NmaWxlDQotCWhlYWRlciA9IGNvbnN0YW50UG9vbC5wb29sQ29udGVudDsNCi0JaGVhZGVyT2Zmc2V0ID0gY29uc3RhbnRQb29sLmN1cnJlbnRPZmZzZXQ7DQotCWludCBjb25zdGFudFBvb2xDb3VudCA9IGNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXg7DQotCWhlYWRlcltjb25zdGFudFBvb2xPZmZzZXQrK10gPSAoYnl0ZSkgKGNvbnN0YW50UG9vbENvdW50ID4+IDgpOw0KLQloZWFkZXJbY29uc3RhbnRQb29sT2Zmc2V0XSA9IChieXRlKSBjb25zdGFudFBvb2xDb3VudDsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGUgYWxsIHRoZSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZCBpbmZvcyB0aGF0IGNvcnJlcG9uZCB0bw0KLSAqIHRoZSBhYnN0cmFjdCBtZXRob2RzIGluaGVyaXRlZCBmcm9tIHN1cGVyaW50ZXJmYWNlcy4NCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCkgeyAvLyBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMNCi0JTWV0aG9kQmluZGluZ1tdIGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSByZWZlcmVuY2VCaW5kaW5nLmdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsNCi0JZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCi0JCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihkZWZhdWx0QWJzdHJhY3RNZXRob2RzW2ldKTsNCi0JCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXSk7DQotCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOw0KKwkJdGhpcy5lbmNsb3NpbmdDbGFzc0ZpbGUgPSBlbmNsb3NpbmdDbGFzc0ZpbGU7DQorCQkvLyBpbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWVzIGNvbXB1dGVkIGF0IGNvZGUgZ2VuIHRpbWUNCisJCWlmIChhVHlwZS5pc0xvY2FsVHlwZSgpKSB7DQorCQkJKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkuY29uc3RhbnRQb29sTmFtZSgNCisJCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIGFUeXBlKSk7DQorCQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gYVR5cGUubWVtYmVyVHlwZXMoKTsNCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJKChMb2NhbFR5cGVCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkuY29uc3RhbnRQb29sTmFtZSgNCisJCQkJCWNvbXB1dGVDb25zdGFudFBvb2xOYW1lKChMb2NhbFR5cGVCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkpOw0KKwkJCX0NCisJCX0NCisJCWNvbnRlbnRzID0gbmV3IGJ5dGVbSU5JVElBTF9DT05URU5UU19TSVpFXTsNCisJCS8vIG5vdyB3ZSBjb250aW51ZSB0byBnZW5lcmF0ZSB0aGUgYnl0ZXMgaW5zaWRlIHRoZSBjb250ZW50cyBhcnJheQ0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7DQorCQlpbnQgY2xhc3NOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFUeXBlKTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc05hbWVJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzTmFtZUluZGV4Ow0KKwkJaW50IHN1cGVyY2xhc3NOYW1lSW5kZXg7DQorCQlpZiAoYVR5cGUuaXNJbnRlcmZhY2UoKSkgew0KKwkJCXN1cGVyY2xhc3NOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdPYmplY3QoKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXJjbGFzc05hbWVJbmRleCA9DQorCQkJCShhVHlwZS5zdXBlcmNsYXNzID09IG51bGwgPyAwIDogY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhVHlwZS5zdXBlcmNsYXNzKSk7DQorCQl9DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3VwZXJjbGFzc05hbWVJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN1cGVyY2xhc3NOYW1lSW5kZXg7DQorCQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzQmluZGluZyA9IGFUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJaW50IGludGVyZmFjZXNDb3VudCA9IHN1cGVySW50ZXJmYWNlc0JpbmRpbmcubGVuZ3RoOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGludGVyZmFjZXNDb3VudCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVyZmFjZXNDb3VudDsNCisJCWlmIChzdXBlckludGVyZmFjZXNCaW5kaW5nICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXNDb3VudDsgaSsrKSB7DQorCQkJCWludCBpbnRlcmZhY2VJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3VwZXJJbnRlcmZhY2VzQmluZGluZ1tpXSk7DQorCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlcmZhY2VJbmRleCA+PiA4KTsNCisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZXJmYWNlSW5kZXg7DQorCQkJfQ0KKwkJfQ0KKwkJcHJvZHVjZURlYnVnQXR0cmlidXRlcyA9DQorCQkJKChTb3VyY2VUeXBlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykNCisJCQkJLnNjb3BlDQorCQkJCS5lbnZpcm9ubWVudCgpDQorCQkJCS5vcHRpb25zDQorCQkJCS5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzOw0KKwkJaW5uZXJDbGFzc2VzQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tJTk5FUl9DTEFTU0VTX1NJWkVdOw0KKwkJdGhpcy5jcmVhdGluZ1Byb2JsZW1UeXBlID0gY3JlYXRpbmdQcm9ibGVtVHlwZTsNCisJCWNvZGVTdHJlYW0gPSBuZXcgQ29kZVN0cmVhbSh0aGlzKTsNCisNCisJCS8vIHJldHJpZXZlIHRoZSBlbmNsb3Npbmcgb25lIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG9uZSBtYXRjaGluZyB0aGUgcHJvcGFnYXRlZCBmbG93IGluZm8NCisJCS8vIDFGRjlaQlU6IExGQ09NOkFMTCAtIExvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMgYnVzdGVkIChTYW5pdHkgY2hlY2spDQorCQlDbGFzc0ZpbGUgb3V0ZXJtb3N0Q2xhc3NGaWxlID0gdGhpcy5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKTsNCisJCWlmICh0aGlzID09IG91dGVybW9zdENsYXNzRmlsZSkgew0KKwkJCWNvZGVTdHJlYW0ubWF4RmllbGRDb3VudCA9IGFUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5tYXhGaWVsZENvdW50Ow0KKwkJfSBlbHNlIHsNCisJCQljb2RlU3RyZWFtLm1heEZpZWxkQ291bnQgPSBvdXRlcm1vc3RDbGFzc0ZpbGUuY29kZVN0cmVhbS5tYXhGaWVsZENvdW50Ow0KKwkJfQ0KIAl9DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhpcyBtZXRob2RzIGdlbmVyYXRlcyB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBiaW5kaW5nIHBhc3NlZCBsaWtlIGEgcGFyYW1ldGVyDQotICogQHBhcmFtIGZpZWxkQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZw0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZEZpZWxkSW5mbyhGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7DQotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOw0KLQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nDQotCS8vIHRvIHRoZSBAZmllbGRCaW5kaW5nDQotCWludCBjb250ZW50c0xlbmd0aDsNCi0JaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMzAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBtZXRob2QuDQorCSAqDQorCSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uDQorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5NZXRob2RCaW5kaW5nDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRBYnN0cmFjdE1ldGhvZCgNCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLA0KKwkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQorDQorCQkvLyBmb3JjZSB0aGUgbW9kaWZpZXJzIHRvIGJlIHB1YmxpYyBhbmQgYWJzdHJhY3QNCisJCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gQWNjUHVibGljIHwgQWNjQWJzdHJhY3Q7DQorDQorCQl0aGlzLmdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsNCisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0Ow0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IHRoaXMuZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKG1ldGhvZEJpbmRpbmcpOw0KKwkJdGhpcy5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOw0KIAl9DQotCS8vIEdlbmVyYXRlIHR3byBhdHRyaWJ1dGU6IGNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgYW5kIFN5bnRoZXRpY0F0dHJpYnV0ZQ0KLQkvLyBOb3cgd2UgY2FuIGdlbmVyYXRlIGFsbCBlbnRyaWVzIGludG8gdGhlIGJ5dGUgYXJyYXkNCi0JLy8gRmlyc3QgdGhlIGFjY2Vzc0ZsYWdzDQotCWludCBhY2Nlc3NGbGFncyA9IGZpZWxkQmluZGluZy5nZXRBY2Nlc3NGbGFncygpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYWNjZXNzRmxhZ3MgPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOw0KLQkvLyBUaGVuIHRoZSBuYW1lSW5kZXgNCi0JaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLm5hbWUpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCS8vIFRoZW4gdGhlIGRlc2NyaXB0b3JJbmRleA0KLQlpbnQgZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcudHlwZS5zaWduYXR1cmUoKSk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCi0JLy8gbGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQotCWludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KLQljb250ZW50c09mZnNldCArPSAyOw0KLQkvLyA0LjcuMiBvbmx5IHN0YXRpYyBjb25zdGFudCBmaWVsZHMgZ2V0IGEgQ29uc3RhbnRBdHRyaWJ1dGUNCi0JaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpIA0KLQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCANCi0JCSYmIGZpZWxkQmluZGluZy5jb25zdGFudC50eXBlSUQoKSAhPSBUX251bGwpIHsNCi0JCS8vIE5vdyB3ZSBnZW5lcmF0ZSB0aGUgY29uc3RhbnQgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkQmluZGluZw0KLQkJaW50IGNvbnN0YW50VmFsdWVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNvbnN0YW50VmFsdWVOYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29uc3RhbnRWYWx1ZU5hbWVJbmRleDsNCi0JCS8vIFRoZSBhdHRyaWJ1dGUgbGVuZ3RoID0gMiBpbiBjYXNlIG9mIGEgY29uc3RhbnRWYWx1ZSBhdHRyaWJ1dGUNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KLQkJLy8gTmVlZCB0byBhZGQgdGhlIGNvbnN0YW50X3ZhbHVlX2luZGV4DQotCQlzd2l0Y2ggKGZpZWxkQmluZGluZy5jb25zdGFudC50eXBlSUQoKSkgew0KLQkJCWNhc2UgVF9ib29sZWFuIDoNCi0JCQkJaW50IGJvb2xlYW5WYWx1ZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPyAxIDogMCk7DQotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChib29sZWFuVmFsdWVJbmRleCA+PiA4KTsNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYm9vbGVhblZhbHVlSW5kZXg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgVF9ieXRlIDoNCi0JCQljYXNlIFRfY2hhciA6DQotCQkJY2FzZSBUX2ludCA6DQotCQkJY2FzZSBUX3Nob3J0IDoNCi0JCQkJaW50IGludGVnZXJWYWx1ZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcuY29uc3RhbnQuaW50VmFsdWUoKSk7DQotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZWdlclZhbHVlSW5kZXg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgVF9mbG9hdCA6DQotCQkJCWludCBmbG9hdFZhbHVlSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5mbG9hdFZhbHVlKCkpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmxvYXRWYWx1ZUluZGV4ID4+IDgpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmbG9hdFZhbHVlSW5kZXg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgVF9kb3VibGUgOg0KLQkJCQlpbnQgZG91YmxlVmFsdWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLmNvbnN0YW50LmRvdWJsZVZhbHVlKCkpOw0KLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZG91YmxlVmFsdWVJbmRleCA+PiA4KTsNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZG91YmxlVmFsdWVJbmRleDsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBUX2xvbmcgOg0KLQkJCQlpbnQgbG9uZ1ZhbHVlSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5sb25nVmFsdWUoKSk7DQotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb25nVmFsdWVJbmRleCA+PiA4KTsNCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9uZ1ZhbHVlSW5kZXg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgVF9TdHJpbmcgOg0KLQkJCQlpbnQgc3RyaW5nVmFsdWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoKChTdHJpbmdDb25zdGFudCkgZmllbGRCaW5kaW5nLmNvbnN0YW50KS5zdHJpbmdWYWx1ZSgpKTsNCi0JCQkJaWYgKHN0cmluZ1ZhbHVlSW5kZXggPT0gLTEpIHsNCi0JCQkJCWlmICghY3JlYXRpbmdQcm9ibGVtVHlwZSkgew0KLQkJCQkJCS8vIHJlcG9ydCBhbiBlcnJvciBhbmQgYWJvcnQ6IHdpbGwgbGVhZCB0byBhIHByb2JsZW0gdHlwZSBjbGFzc2ZpbGUgY3JlYXRpb24NCi0JCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gcmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb250ZXh0Ow0KLQkJCQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsNCi0JCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGREZWNscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCQkJCQlpZiAoZmllbGREZWNsc1tpXS5iaW5kaW5nID09IGZpZWxkQmluZGluZykgew0KLQkJCQkJCQkJLy8gcHJvYmxlbSBzaG91bGQgYWJvcnQNCi0JCQkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdHJpbmdDb25zdGFudElzRXhjZWVkaW5nVXRmOExpbWl0KGZpZWxkRGVjbHNbaV0pOw0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhpcyBtZXRob2RzIGdlbmVyYXRlIGFsbCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHJlY2VpdmVyLg0KKwkgKiBGb3IgYSBjbGFzcyB0aGV5IGNvdWxkIGJlOg0KKwkgKiAtIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZQ0KKwkgKiAtIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlDQorCSAqIC0gZGVwcmVjYXRlZCBhdHRyaWJ1dGUNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoKSB7DQorCQkvLyB1cGRhdGUgdGhlIG1ldGhvZCBjb3VudA0KKwkJY29udGVudHNbbWV0aG9kQ291bnRPZmZzZXQrK10gPSAoYnl0ZSkgKG1ldGhvZENvdW50ID4+IDgpOw0KKwkJY29udGVudHNbbWV0aG9kQ291bnRPZmZzZXRdID0gKGJ5dGUpIG1ldGhvZENvdW50Ow0KKw0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQorCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgc3RvcmUgdGhlIGN1cnJlbnQgb2Zmc2V0DQorCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQljb250ZW50c09mZnNldCArPSAyOw0KKw0KKwkJLy8gc291cmNlIGF0dHJpYnV0ZQ0KKwkJaWYgKChwcm9kdWNlRGVidWdBdHRyaWJ1dGVzICYgQ29tcGlsZXJPcHRpb25zLlNvdXJjZSkgIT0gMCkgew0KKwkJCVN0cmluZyBmdWxsRmlsZU5hbWUgPQ0KKwkJCQluZXcgU3RyaW5nKHJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuZ2V0RmlsZU5hbWUoKSk7DQorCQkJZnVsbEZpbGVOYW1lID0gZnVsbEZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsNCisJCQlpbnQgbGFzdEluZGV4ID0gZnVsbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcvJyk7DQorCQkJaWYgKGxhc3RJbmRleCAhPSAtMSkgew0KKwkJCQlmdWxsRmlsZU5hbWUgPSBmdWxsRmlsZU5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEsIGZ1bGxGaWxlTmFtZS5sZW5ndGgoKSk7DQorCQkJfQ0KKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBpbmZvIGNvcnJlc3BvbmRpbmcNCisJCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZw0KKwkJCWludCBjb250ZW50c0xlbmd0aDsNCisJCQlpZiAoY29udGVudHNPZmZzZXQgKyA4ID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWludCBzb3VyY2VBdHRyaWJ1dGVOYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlNvdXJjZU5hbWUpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzb3VyY2VBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc291cmNlQXR0cmlidXRlTmFtZUluZGV4Ow0KKwkJCS8vIFRoZSBsZW5ndGggb2YgYSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUgaXMgMi4gVGhpcyBpcyBhIGZpeGVkLWxlbmd0aA0KKwkJCS8vIGF0dHJpYnV0ZQ0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCisJCQkvLyB3cml0ZSB0aGUgc291cmNlIGZpbGUgbmFtZQ0KKwkJCWludCBmaWxlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmdWxsRmlsZU5hbWUudG9DaGFyQXJyYXkoKSk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZpbGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmlsZU5hbWVJbmRleDsNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCX0NCisJCS8vIERlcHJlY2F0ZWQgYXR0cmlidXRlDQorCQlpZiAocmVmZXJlbmNlQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgew0KKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBpbmZvIGNvcnJlc3BvbmRpbmcNCisJCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZw0KKwkJCWludCBjb250ZW50c0xlbmd0aDsNCisJCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWludCBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsNCisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQl9DQorCQkvLyBJbm5lciBjbGFzcyBhdHRyaWJ1dGUNCisJCWlmIChudW1iZXJPZklubmVyQ2xhc3NlcyAhPSAwKSB7DQorCQkJLy8gR2VuZXJhdGUgdGhlIGlubmVyIGNsYXNzIGF0dHJpYnV0ZQ0KKwkJCWludCBjb250ZW50c0xlbmd0aDsNCisJCQlpbnQgZXhTaXplOw0KKwkJCWlmIChjb250ZW50c09mZnNldCArIChleFNpemUgPSAoOCAqIG51bWJlck9mSW5uZXJDbGFzc2VzICsgOCkpDQorCQkJCT49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9DQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGgNCisJCQkJCQkJKyAoZXhTaXplID49IElOQ1JFTUVOVF9TSVpFID8gZXhTaXplIDogSU5DUkVNRU5UX1NJWkUpXSksDQorCQkJCQkwLA0KKwkJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJCX0NCisJCQkvLyBOb3cgd2Ugbm93IHRoZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcw0KKwkJCS8vIGF0dHJpYnV0ZSBuYW1lDQorCQkJaW50IGF0dHJpYnV0ZU5hbWVJbmRleCA9DQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuSW5uZXJDbGFzc05hbWUpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTmFtZUluZGV4Ow0KKwkJCWludCB2YWx1ZSA9IChudW1iZXJPZklubmVyQ2xhc3NlcyA8PCAzKSArIDI7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZJbm5lckNsYXNzZXMgPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZJbm5lckNsYXNzZXM7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZklubmVyQ2xhc3NlczsgaSsrKSB7DQorCQkJCVJlZmVyZW5jZUJpbmRpbmcgaW5uZXJDbGFzcyA9IGlubmVyQ2xhc3Nlc0JpbmRpbmdzW2ldOw0KKwkJCQlpbnQgYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzLmdldEFjY2Vzc0ZsYWdzKCk7DQorCQkJCWludCBpbm5lckNsYXNzSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3MpOw0KKwkJCQkvLyBpbm5lciBjbGFzcyBpbmRleA0KKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5uZXJDbGFzc0luZGV4ID4+IDgpOw0KKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbm5lckNsYXNzSW5kZXg7DQorCQkJCS8vIG91dGVyIGNsYXNzIGluZGV4OiBhbm9ueW1vdXMgYW5kIGxvY2FsIGhhdmUgbm8gb3V0ZXIgY2xhc3MgaW5kZXgNCisJCQkJaWYgKGlubmVyQ2xhc3MuaXNNZW1iZXJUeXBlKCkpIHsNCisJCQkJCS8vIG1lbWJlciBvciBtZW1iZXIgb2YgbG9jYWwNCisJCQkJCWludCBvdXRlckNsYXNzSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3MuZW5jbG9zaW5nVHlwZSgpKTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvdXRlckNsYXNzSW5kZXggPj4gOCk7DQorCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvdXRlckNsYXNzSW5kZXg7DQorCQkJCX0gZWxzZSB7DQorCQkJCQkvLyBlcXVhbHMgdG8gMCBpZiB0aGUgaW5uZXJDbGFzcyBpcyBub3QgYSBtZW1iZXIgdHlwZQ0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCQl9DQorCQkJCS8vIG5hbWUgaW5kZXgNCisJCQkJaWYgKCFpbm5lckNsYXNzLmlzQW5vbnltb3VzVHlwZSgpKSB7DQorCQkJCQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChpbm5lckNsYXNzLnNvdXJjZU5hbWUoKSk7DQorCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgYW4gYW5vbnltb3VzIHR5cGUNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQkJfQ0KKwkJCQkvLyBhY2Nlc3MgZmxhZw0KKwkJCQlpZiAoaW5uZXJDbGFzcy5pc0Fub255bW91c1R5cGUoKSkgew0KKwkJCQkJYWNjZXNzRmxhZ3MgfD0gQWNjUHJpdmF0ZTsNCisJCQkJfSBlbHNlDQorCQkJCQlpZiAoaW5uZXJDbGFzcy5pc0xvY2FsVHlwZSgpICYmICFpbm5lckNsYXNzLmlzTWVtYmVyVHlwZSgpKSB7DQorCQkJCQkJYWNjZXNzRmxhZ3MgfD0gQWNjUHJpdmF0ZTsNCisJCQkJCX0NCisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOw0KKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsNCisJCQl9DQorCQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQl9DQorCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQorCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCisJCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KKw0KKwkJLy8gcmVzeW5jaHJvbml6ZSBhbGwgb2Zmc2V0cyBvZiB0aGUgY2xhc3NmaWxlDQorCQloZWFkZXIgPSBjb25zdGFudFBvb2wucG9vbENvbnRlbnQ7DQorCQloZWFkZXJPZmZzZXQgPSBjb25zdGFudFBvb2wuY3VycmVudE9mZnNldDsNCisJCWludCBjb25zdGFudFBvb2xDb3VudCA9IGNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXg7DQorCQloZWFkZXJbY29uc3RhbnRQb29sT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFBvb2xDb3VudCA+PiA4KTsNCisJCWhlYWRlcltjb25zdGFudFBvb2xPZmZzZXRdID0gKGJ5dGUpIGNvbnN0YW50UG9vbENvdW50Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGUgYWxsIHRoZSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZCBpbmZvcyB0aGF0IGNvcnJlcG9uZCB0bw0KKwkgKiB0aGUgYWJzdHJhY3QgbWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBzdXBlcmludGVyZmFjZXMuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCkgeyAvLyBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMNCisJCU1ldGhvZEJpbmRpbmdbXSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzID0NCisJCQlyZWZlcmVuY2VCaW5kaW5nLmdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsNCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorCQkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOw0KKwkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCisJCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOw0KKwkJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZXMgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgYmluZGluZyBwYXNzZWQgbGlrZSBhIHBhcmFtZXRlcg0KKwkgKiBAcGFyYW0gZmllbGRCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRGaWVsZEluZm8oRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgew0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQorCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nDQorCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZw0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMzAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCS8vIEdlbmVyYXRlIHR3byBhdHRyaWJ1dGU6IGNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgYW5kIFN5bnRoZXRpY0F0dHJpYnV0ZQ0KKwkJLy8gTm93IHdlIGNhbiBnZW5lcmF0ZSBhbGwgZW50cmllcyBpbnRvIHRoZSBieXRlIGFycmF5DQorCQkvLyBGaXJzdCB0aGUgYWNjZXNzRmxhZ3MNCisJCWludCBhY2Nlc3NGbGFncyA9IGZpZWxkQmluZGluZy5nZXRBY2Nlc3NGbGFncygpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7DQorCQkvLyBUaGVuIHRoZSBuYW1lSW5kZXgNCisJCWludCBuYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5uYW1lKTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQorCQkvLyBUaGVuIHRoZSBkZXNjcmlwdG9ySW5kZXgNCisJCWludCBkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy50eXBlLnNpZ25hdHVyZSgpKTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQorCQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMNCisJCWludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KKwkJY29udGVudHNPZmZzZXQgKz0gMjsNCisJCS8vIDQuNy4yIG9ubHkgc3RhdGljIGNvbnN0YW50IGZpZWxkcyBnZXQgYSBDb25zdGFudEF0dHJpYnV0ZQ0KKwkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpDQorCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudA0KKwkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudC50eXBlSUQoKSAhPSBUX251bGwpIHsNCisJCQkvLyBOb3cgd2UgZ2VuZXJhdGUgdGhlIGNvbnN0YW50IGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZEJpbmRpbmcNCisJCQlpbnQgY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA9DQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29uc3RhbnRWYWx1ZU5hbWUpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvbnN0YW50VmFsdWVOYW1lSW5kZXg7DQorCQkJLy8gVGhlIGF0dHJpYnV0ZSBsZW5ndGggPSAyIGluIGNhc2Ugb2YgYSBjb25zdGFudFZhbHVlIGF0dHJpYnV0ZQ0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCQkvLyBOZWVkIHRvIGFkZCB0aGUgY29uc3RhbnRfdmFsdWVfaW5kZXgNCisJCQlzd2l0Y2ggKGZpZWxkQmluZGluZy5jb25zdGFudC50eXBlSUQoKSkgew0KKwkJCQljYXNlIFRfYm9vbGVhbiA6DQorCQkJCQlpbnQgYm9vbGVhblZhbHVlSW5kZXggPQ0KKwkJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID8gMSA6IDApOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGJvb2xlYW5WYWx1ZUluZGV4ID4+IDgpOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYm9vbGVhblZhbHVlSW5kZXg7DQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBUX2J5dGUgOg0KKwkJCQljYXNlIFRfY2hhciA6DQorCQkJCWNhc2UgVF9pbnQgOg0KKwkJCQljYXNlIFRfc2hvcnQgOg0KKwkJCQkJaW50IGludGVnZXJWYWx1ZUluZGV4ID0NCisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5pbnRWYWx1ZSgpKTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4Ow0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgVF9mbG9hdCA6DQorCQkJCQlpbnQgZmxvYXRWYWx1ZUluZGV4ID0NCisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5mbG9hdFZhbHVlKCkpOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZsb2F0VmFsdWVJbmRleCA+PiA4KTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGZsb2F0VmFsdWVJbmRleDsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIFRfZG91YmxlIDoNCisJCQkJCWludCBkb3VibGVWYWx1ZUluZGV4ID0NCisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5kb3VibGVWYWx1ZSgpKTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkb3VibGVWYWx1ZUluZGV4ID4+IDgpOw0KKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZG91YmxlVmFsdWVJbmRleDsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIFRfbG9uZyA6DQorCQkJCQlpbnQgbG9uZ1ZhbHVlSW5kZXggPQ0KKwkJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLmNvbnN0YW50LmxvbmdWYWx1ZSgpKTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb25nVmFsdWVJbmRleCA+PiA4KTsNCisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvbmdWYWx1ZUluZGV4Ow0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgVF9TdHJpbmcgOg0KKwkJCQkJaW50IHN0cmluZ1ZhbHVlSW5kZXggPQ0KKwkJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoDQorCQkJCQkJCSgoU3RyaW5nQ29uc3RhbnQpIGZpZWxkQmluZGluZy5jb25zdGFudCkuc3RyaW5nVmFsdWUoKSk7DQorCQkJCQlpZiAoc3RyaW5nVmFsdWVJbmRleCA9PSAtMSkgew0KKwkJCQkJCWlmICghY3JlYXRpbmdQcm9ibGVtVHlwZSkgew0KKwkJCQkJCQkvLyByZXBvcnQgYW4gZXJyb3IgYW5kIGFib3J0OiB3aWxsIGxlYWQgdG8gYSBwcm9ibGVtIHR5cGUgY2xhc3NmaWxlIGNyZWF0aW9uDQorCQkJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSByZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7DQorCQkJCQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsNCisJCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJCQkJCWlmIChmaWVsZERlY2xzW2ldLmJpbmRpbmcgPT0gZmllbGRCaW5kaW5nKSB7DQorCQkJCQkJCQkJLy8gcHJvYmxlbSBzaG91bGQgYWJvcnQNCisJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RyaW5nQ29uc3RhbnRJc0V4Y2VlZGluZ1V0ZjhMaW1pdCgNCisJCQkJCQkJCQkJZmllbGREZWNsc1tpXSk7DQorCQkJCQkJCQl9DQogCQkJCQkJCX0NCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQkvLyBhbHJlYWR5IGluc2lkZSBhIHByb2JsZW0gdHlwZSBjcmVhdGlvbiA6IG5vIGNvbnN0YW50IGZvciB0aGlzIGZpZWxkDQorCQkJCQkJCWNvbnRlbnRzT2Zmc2V0ID0gZmllbGRBdHRyaWJ1dGVPZmZzZXQgKyAyOw0KKwkJCQkJCQkvLyArMiBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgdHdvIGJ5dGUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbnVtYmVyDQorCQkJCQkJCWF0dHJpYnV0ZU51bWJlci0tOw0KIAkJCQkJCX0NCiAJCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gYWxyZWFkeSBpbnNpZGUgYSBwcm9ibGVtIHR5cGUgY3JlYXRpb24gOiBubyBjb25zdGFudCBmb3IgdGhpcyBmaWVsZA0KLQkJCQkJCWNvbnRlbnRzT2Zmc2V0ID0gZmllbGRBdHRyaWJ1dGVPZmZzZXQgKyAyOyAvLyArMiBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgdHdvIGJ5dGUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbnVtYmVyDQotCQkJCQkJYXR0cmlidXRlTnVtYmVyLS07DQorCQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ1ZhbHVlSW5kZXggPj4gOCk7DQorCQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RyaW5nVmFsdWVJbmRleDsNCiAJCQkJCX0NCi0JCQkJfSBlbHNlIHsNCi0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdHJpbmdWYWx1ZUluZGV4ID4+IDgpOw0KLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RyaW5nVmFsdWVJbmRleDsNCi0JCQkJfQ0KKwkJCX0NCisJCX0NCisJCWlmIChmaWVsZEJpbmRpbmcuaXNTeW50aGV0aWMoKSkgew0KKwkJCWludCBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4Ow0KKwkJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwDQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkJfQ0KKwkJaWYgKGZpZWxkQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgew0KKwkJCWludCBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsNCisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQl9DQorCQljb250ZW50c1tmaWVsZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOw0KKwkJY29udGVudHNbZmllbGRBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisJfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhpcyBtZXRob2RzIGdlbmVyYXRlIGFsbCB0aGUgZmllbGRzIGluZm9zIGZvciB0aGUgcmVjZWl2ZXIuDQorCSAqIFRoaXMgaW5jbHVkZXM6DQorCSAqIC0gYSBmaWVsZCBpbmZvIGZvciBlYWNoIGRlZmluZWQgZmllbGQgb2YgdGhhdCBjbGFzcw0KKwkgKiAtIGEgZmllbGQgaW5mbyBmb3IgZWFjaCBzeW50aGV0aWMgZmllbGQgKGUuZy4gdGhpcyQwKQ0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkRmllbGRJbmZvcygpIHsNCisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gcmVmZXJlbmNlQmluZGluZzsNCisJCUZpZWxkQmluZGluZ1tdIHN5bnRoZXRpY0ZpZWxkcyA9IGN1cnJlbnRCaW5kaW5nLnN5bnRoZXRpY0ZpZWxkcygpOw0KKwkJaW50IGZpZWxkQ291bnQgPQ0KKwkJCWN1cnJlbnRCaW5kaW5nLmZpZWxkQ291bnQoKQ0KKwkJCQkrIChzeW50aGV0aWNGaWVsZHMgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNGaWVsZHMubGVuZ3RoKTsNCisNCisJCS8vIHdyaXRlIHRoZSBudW1iZXIgb2YgZmllbGRzDQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmllbGRDb3VudCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGZpZWxkQ291bnQ7DQorDQorCQlGaWVsZEJpbmRpbmdbXSBmaWVsZEJpbmRpbmdzID0gY3VycmVudEJpbmRpbmcuZmllbGRzKCk7DQorCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRCaW5kaW5ncy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KKwkJCWFkZEZpZWxkSW5mbyhmaWVsZEJpbmRpbmdzW2ldKTsNCisJCX0NCisJCWlmIChzeW50aGV0aWNGaWVsZHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNGaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJYWRkRmllbGRJbmZvKHN5bnRoZXRpY0ZpZWxkc1tpXSk7DQorCQkJfQ0KIAkJfQ0KIAl9DQotCWlmIChmaWVsZEJpbmRpbmcuaXNTeW50aGV0aWMoKSkgew0KLQkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3ludGhldGljTmFtZSk7DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGlzIG1ldGhvZHMgc3RvcmVzIHRoZSBiaW5kaW5ncyBmb3IgZWFjaCBpbm5lciBjbGFzcy4gVGhleSB3aWxsIGJlIHVzZWQgdG8ga25vdyB3aGljaCBlbnRyaWVzDQorCSAqIGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGUgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGVzLg0KKwkgKiBAcGFyYW0gcmVmZXJlbmNlQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcgDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRJbm5lckNsYXNzZXMoUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nKSB7DQorCQkvLyBjaGVjayBmaXJzdCBpZiB0aGF0IHJlZmVyZW5jZSBiaW5kaW5nIGlzIHRoZXJlDQorCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mSW5uZXJDbGFzc2VzOyBpKyspIHsNCisJCQlpZiAoaW5uZXJDbGFzc2VzQmluZGluZ3NbaV0gPT0gcmVmZXJlbmNlQmluZGluZykNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJaW50IGxlbmd0aCA9IGlubmVyQ2xhc3Nlc0JpbmRpbmdzLmxlbmd0aDsNCisJCWlmIChudW1iZXJPZklubmVyQ2xhc3NlcyA9PSBsZW5ndGgpIHsNCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQlpbm5lckNsYXNzZXNCaW5kaW5ncywNCisJCQkJMCwNCisJCQkJKGlubmVyQ2xhc3Nlc0JpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoICogMl0pLA0KKwkJCQkwLA0KKwkJCQlsZW5ndGgpOw0KKwkJfQ0KKwkJaW5uZXJDbGFzc2VzQmluZGluZ3NbbnVtYmVyT2ZJbm5lckNsYXNzZXMrK10gPSByZWZlcmVuY2VCaW5kaW5nOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIGNsaW5pdCBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2dndXMgbWV0aG9kLg0KKwkgKg0KKwkgKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10NCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1DbGluaXQoSVByb2JsZW1bXSBwcm9ibGVtcykgew0KKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyRm9yQ2xpbml0KCk7DQorCQkvLyBsZWF2ZSB0d28gc3BhY2VzIGZvciB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMNCisJCWNvbnRlbnRzT2Zmc2V0IC09IDI7DQorCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQljb250ZW50c09mZnNldCArPSAyOw0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bnNFeGNlcHRpb25zOw0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQorCQlpbnQgY29udGVudHNMZW5ndGg7DQorDQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQorCQljb2RlU3RyZWFtLnJlc2V0Rm9yUHJvYmxlbUNsaW5pdCh0aGlzKTsNCisJCVN0cmluZyBwcm9ibGVtU3RyaW5nID0gIiIgOyAvLyROT04tTkxTLTEkDQorCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgew0KKwkJCWludCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7DQorCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjUpOw0KKwkJCWludCBjb3VudCA9IDA7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKwkJCQlJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07DQorCQkJCWlmICgocHJvYmxlbSAhPSBudWxsKSAmJiAocHJvYmxlbS5pc0Vycm9yKCkpKSB7DQorCQkJCQlidWZmZXIuYXBwZW5kKCJcdCIgICtwcm9ibGVtLmdldE1lc3NhZ2UoKSArICJcbiIgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCQljb3VudCsrOw0KKwkJCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsNCisJCQkJCQlwcm9ibGVtTGluZSA9IHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpOw0KKwkJCQkJfQ0KKwkJCQkJcHJvYmxlbXNbaV0gPSBudWxsOw0KKwkJCQl9DQorCQkJfSAvLyBpbnNlcnQgdGhlIHRvcCBsaW5lIGFmdGVyd2FyZHMsIG9uY2Uga25vd2luZyBob3cgbWFueSBwcm9ibGVtcyB3ZSBoYXZlIHRvIGNvbnNpZGVyDQorCQkJaWYgKGNvdW50ID4gMSkgew0KKwkJCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zIiApKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0gZWxzZSB7DQorCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbSIgKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQkJcHJvYmxlbVN0cmluZyA9IGJ1ZmZlci50b1N0cmluZygpOw0KKwkJfQ0KKw0KKwkJLy8gcmV0dXJuIGNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChjb21wLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsICIiKQ0KKwkJaW50W10gZXhjZXB0aW9uSGFuZGxlciA9DQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKA0KKwkJCQlyZWZlcmVuY2VCaW5kaW5nDQorCQkJCQkuc2NvcGUNCisJCQkJCS5wcm9ibGVtUmVwb3J0ZXIoKQ0KKwkJCQkJLm9wdGlvbnMNCisJCQkJCS5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwNCisJCQkJcHJvYmxlbVN0cmluZyk7DQorCQlhdHRyaWJ1dGVOdW1iZXIrKzsgLy8gY29kZSBhdHRyaWJ1dGUNCisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdCgNCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LA0KKwkJCWV4Y2VwdGlvbkhhbmRsZXIsDQorCQkJcmVmZXJlbmNlQmluZGluZw0KKwkJCQkuc2NvcGUNCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpDQorCQkJCS5jb21waWxhdGlvblJlc3VsdA0KKwkJCQkubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7DQorCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCisJCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBjb25zdHJ1Y3Rvci4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24NCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcNCisJICogQHBhcmFtIHByb2JsZW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVtdDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRQcm9ibGVtQ29uc3RydWN0b3IoDQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwNCisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywNCisJCUlQcm9ibGVtW10gcHJvYmxlbXMpIHsNCisNCisJCS8vIGFsd2F5cyBjbGVhciB0aGUgc3RyaWN0ZnAvbmF0aXZlL2Fic3RyYWN0IGJpdCBmb3IgYSBwcm9ibGVtIG1ldGhvZA0KKwkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgJj0gfihBY2NTdHJpY3RmcCB8IEFjY05hdGl2ZSB8IEFjY0Fic3RyYWN0KTsNCisNCisJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsNCisJCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDEgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMTsgLy8gQ29kZSBhdHRyaWJ1dGUNCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsNCisJCWZpbmFsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSBtZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7DQorCQljb2RlU3RyZWFtLnJlc2V0KG1ldGhvZCwgdGhpcyk7DQorCQlTdHJpbmcgcHJvYmxlbVN0cmluZyA9ICIiIDsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsNCisJCQlpbnQgbWF4ID0gcHJvYmxlbXMubGVuZ3RoOw0KKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDI1KTsNCisJCQlpbnQgY291bnQgPSAwOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOw0KKwkJCQlpZiAoKHByb2JsZW0gIT0gbnVsbCkgJiYgKHByb2JsZW0uaXNFcnJvcigpKSkgew0KKwkJCQkJYnVmZmVyLmFwcGVuZCgiXHQiICArcHJvYmxlbS5nZXRNZXNzYWdlKCkgKyAiXG4iICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkJY291bnQrKzsNCisJCQkJCWlmIChwcm9ibGVtTGluZSA9PSAwKSB7DQorCQkJCQkJcHJvYmxlbUxpbmUgPSBwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0gLy8gaW5zZXJ0IHRoZSB0b3AgbGluZSBhZnRlcndhcmRzLCBvbmNlIGtub3dpbmcgaG93IG1hbnkgcHJvYmxlbXMgd2UgaGF2ZSB0byBjb25zaWRlcg0KKwkJCWlmIChjb3VudCA+IDEpIHsNCisJCQkJYnVmZmVyLmluc2VydCgwLCBVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtcyIgKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9IGVsc2Ugew0KKwkJCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW0iICkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsNCisJCX0NCisNCisJCS8vIHJldHVybiBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoY29tcC5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCAiIikNCisJCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIgPQ0KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgNCisJCQkJcHJvYmxlbVJlcG9ydGVyLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsDQorCQkJCXByb2JsZW1TdHJpbmcpOw0KKwkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgNCisJCQltZXRob2QsDQorCQkJbWV0aG9kQmluZGluZywNCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LA0KKwkJCWV4Y2VwdGlvbkhhbmRsZXIsDQorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykNCisJCQkJLnNjb3BlDQorCQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQ0KKwkJCQkuY29tcGlsYXRpb25SZXN1bHQNCisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBjb25zdHJ1Y3Rvci4NCisJICogUmVzZXQgdGhlIHBvc2l0aW9uIGluc2lkZSB0aGUgY29udGVudHMgYnl0ZSBhcnJheSB0byB0aGUgc2F2ZWRPZmZzZXQuDQorCSAqDQorCSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uDQorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5NZXRob2RCaW5kaW5nDQorCSAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1bXQ0KKwkgKiBAcGFyYW0gc2F2ZWRPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkUHJvYmxlbUNvbnN0cnVjdG9yKA0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsDQorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsDQorCQlJUHJvYmxlbVtdIHByb2JsZW1zLA0KKwkJaW50IHNhdmVkT2Zmc2V0KSB7DQorCQkvLyB3ZSBuZWVkIHRvIG1vdmUgYmFjayB0aGUgY29udGVudHNPZmZzZXQgdG8gdGhlIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZA0KKwkJY29udGVudHNPZmZzZXQgPSBzYXZlZE9mZnNldDsNCisJCW1ldGhvZENvdW50LS07IC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXRob2QgdGhhdCBjYXVzZXMgdGhlIHByb2JsZW0NCisJCWFkZFByb2JsZW1Db25zdHJ1Y3RvcihtZXRob2QsIG1ldGhvZEJpbmRpbmcsIHByb2JsZW1zKTsNCisJfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2dndXMgbWV0aG9kLg0KKwkgKg0KKwkgKiBAcGFyYW0gbWV0aG9kIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbg0KKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuTWV0aG9kQmluZGluZw0KKwkgKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10NCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1NZXRob2QoDQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwNCisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywNCisJCUlQcm9ibGVtW10gcHJvYmxlbXMpIHsNCisJCWlmIChtZXRob2RCaW5kaW5nLmlzQWJzdHJhY3QoKSAmJiBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCisJCQltZXRob2QuYWJvcnQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5BYm9ydFR5cGUpOw0KKwkJfQ0KKwkJLy8gYWx3YXlzIGNsZWFyIHRoZSBzdHJpY3RmcC9uYXRpdmUvYWJzdHJhY3QgYml0IGZvciBhIHByb2JsZW0gbWV0aG9kDQorCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyAmPSB+KEFjY1N0cmljdGZwIHwgQWNjTmF0aXZlIHwgQWNjQWJzdHJhY3QpOw0KKw0KKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOw0KKwkJLy8gbGVhdmUgdHdvIHNwYWNlcyBmb3IgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQorCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQljb250ZW50c09mZnNldCArPSAyOw0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bnNFeGNlcHRpb25zOw0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQorCQlpbnQgY29udGVudHNMZW5ndGg7DQorDQorCQlpZiAoKHRocm93bnNFeGNlcHRpb25zID0gbWV0aG9kQmluZGluZy50aHJvd25FeGNlcHRpb25zKSAhPSBOb0V4Y2VwdGlvbnMpIHsNCisJCQkvLyBUaGUgbWV0aG9kIGhhcyBhIHRocm93IGNsYXVzZS4gU28gd2UgbmVlZCB0byBhZGQgYW4gZXhjZXB0aW9uIGF0dHJpYnV0ZQ0KKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBleGNlcHRpb24gYXR0cmlidXRlDQorCQkJaW50IGxlbmd0aCA9IHRocm93bnNFeGNlcHRpb25zLmxlbmd0aDsNCisJCQlpZiAoY29udGVudHNPZmZzZXQgKyAoOCArIGxlbmd0aCAqIDIpID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9DQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBNYXRoLm1heChJTkNSRU1FTlRfU0laRSwgKDggKyBsZW5ndGggKiAyKSldKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWludCBleGNlcHRpb25OYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkV4Y2VwdGlvbnNOYW1lKTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uTmFtZUluZGV4ID4+IDgpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbk5hbWVJbmRleDsNCisJCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyIGluIGNhc2Ugb2YgYSBleGNlcHRpb24gYXR0cmlidXRlDQorCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCisJCQkJaW50IGV4Y2VwdGlvbkluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCh0aHJvd25zRXhjZXB0aW9uc1tpXSk7DQorCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25JbmRleCA+PiA4KTsNCisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSW5kZXg7DQorCQkJfQ0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkJfQ0KKw0KKwkJLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUNCisJCS8vIENoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZQ0KKwkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNiA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJMCwNCisJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJfQ0KKwkJaWYgKG1ldGhvZEJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsNCisJCQlpbnQgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA9DQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRGVwcmVjYXRlZE5hbWUpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXg7DQorCQkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwDQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKw0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkJfQ0KKw0KKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCisJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOw0KKwkJZmluYWwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IG1ldGhvZC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKTsNCisJCWNvZGVTdHJlYW0ucmVzZXQobWV0aG9kLCB0aGlzKTsNCisJCVN0cmluZyBwcm9ibGVtU3RyaW5nID0gIiIgOyAvLyROT04tTkxTLTEkDQorCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgew0KKwkJCWludCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7DQorCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjUpOw0KKwkJCWludCBjb3VudCA9IDA7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKwkJCQlJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07DQorCQkJCWlmICgocHJvYmxlbSAhPSBudWxsKQ0KKwkJCQkJJiYgKHByb2JsZW0uaXNFcnJvcigpKQ0KKwkJCQkJJiYgKHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSA+PSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkNCisJCQkJCSYmIChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIDw9IG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCkpIHsNCisJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IiAgK3Byb2JsZW0uZ2V0TWVzc2FnZSgpICsgIlxuIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJCWNvdW50Kys7DQorCQkJCQlpZiAocHJvYmxlbUxpbmUgPT0gMCkgew0KKwkJCQkJCXByb2JsZW1MaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7DQorCQkJCQl9DQorCQkJCQlwcm9ibGVtc1tpXSA9IG51bGw7DQorCQkJCX0NCisJCQl9IC8vIGluc2VydCB0aGUgdG9wIGxpbmUgYWZ0ZXJ3YXJkcywgb25jZSBrbm93aW5nIGhvdyBtYW55IHByb2JsZW1zIHdlIGhhdmUgdG8gY29uc2lkZXINCisJCQlpZiAoY291bnQgPiAxKSB7DQorCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbXMiICkpOyAvLyROT04tTkxTLTEkDQorCQkJfSBlbHNlIHsNCisJCQkJYnVmZmVyLmluc2VydCgwLCBVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtIiApKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCQlwcm9ibGVtU3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7DQorCQl9DQorDQorCQkvLyByZXR1cm4gY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKGNvbXAub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgIiIpDQorCQlpbnRbXSBleGNlcHRpb25IYW5kbGVyID0NCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoDQorCQkJCXByb2JsZW1SZXBvcnRlci5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLA0KKwkJCQlwcm9ibGVtU3RyaW5nKTsNCisJCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBjb2RlIGF0dHJpYnV0ZQ0KKwkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgNCisJCQltZXRob2QsDQorCQkJbWV0aG9kQmluZGluZywNCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LA0KKwkJCWV4Y2VwdGlvbkhhbmRsZXIsDQorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykNCisJCQkJLnNjb3BlDQorCQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQ0KKwkJCQkuY29tcGlsYXRpb25SZXN1bHQNCisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOw0KKwkJY29udGVudHNbYXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQorCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisJfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2dndXMgbWV0aG9kLg0KKwkgKiBSZXNldCB0aGUgcG9zaXRpb24gaW5zaWRlIHRoZSBjb250ZW50cyBieXRlIGFycmF5IHRvIHRoZSBzYXZlZE9mZnNldC4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24NCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcNCisJICogQHBhcmFtIHByb2JsZW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVtdDQorCSAqIEBwYXJhbSBzYXZlZE9mZnNldCA8Q09ERT5pbnQ8L0NPREU+DQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRQcm9ibGVtTWV0aG9kKA0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsDQorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsDQorCQlJUHJvYmxlbVtdIHByb2JsZW1zLA0KKwkJaW50IHNhdmVkT2Zmc2V0KSB7DQorCQkvLyB3ZSBuZWVkIHRvIG1vdmUgYmFjayB0aGUgY29udGVudHNPZmZzZXQgdG8gdGhlIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZA0KKwkJY29udGVudHNPZmZzZXQgPSBzYXZlZE9mZnNldDsNCisJCW1ldGhvZENvdW50LS07IC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXRob2QgdGhhdCBjYXVzZXMgdGhlIHByb2JsZW0NCisJCWFkZFByb2JsZW1NZXRob2QobWV0aG9kLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtcyk7DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhbGwgdGhlIHNwZWNpYWwgbWV0aG9kIGluZm9zLg0KKwkgKiBUaGV5IGFyZToNCisJICogLSBzeW50aGV0aWMgYWNjZXNzIG1ldGhvZHMNCisJICogLSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFNwZWNpYWxNZXRob2RzKCkgew0KKwkJLy8gYWRkIGFsbCBtZXRob2RzIChkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMgYW5kIHN5bnRoZXRpYykNCisNCisJCS8vIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcw0KKwkJU291cmNlVHlwZUJpbmRpbmcgY3VycmVudEJpbmRpbmcgPSByZWZlcmVuY2VCaW5kaW5nOw0KKwkJTWV0aG9kQmluZGluZ1tdIGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPQ0KKwkJCWN1cnJlbnRCaW5kaW5nLmdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsNCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorCQkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOw0KKwkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCisJCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOw0KKwkJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7DQorCQl9DQorCQkvLyBhZGQgc3ludGhldGljIG1ldGhvZHMgaW5mb3MNCisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNBY2Nlc3NNZXRob2RzID0NCisJCQljdXJyZW50QmluZGluZy5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7DQorCQlpZiAoc3ludGhldGljQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FjY2Vzc01ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhY2Nlc3NNZXRob2RCaW5kaW5nID0gc3ludGhldGljQWNjZXNzTWV0aG9kc1tpXTsNCisJCQkJc3dpdGNoIChhY2Nlc3NNZXRob2RCaW5kaW5nLmFjY2Vzc1R5cGUpIHsNCisJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5GaWVsZFJlYWRBY2Nlc3MgOg0KKwkJCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiByZWFkaW5nIGFjY2VzcyB0bw0KKwkJCQkJCS8vIGEgcHJpdmF0ZSBmaWVsZA0KKwkJCQkJCWFkZFN5bnRoZXRpY0ZpZWxkUmVhZEFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5GaWVsZFdyaXRlQWNjZXNzIDoNCisJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gd3JpdGluZyBhY2Nlc3MgdG8NCisJCQkJCQkvLyBhIHByaXZhdGUgZmllbGQNCisJCQkJCQlhZGRTeW50aGV0aWNGaWVsZFdyaXRlQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLk1ldGhvZEFjY2VzcyA6DQorCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIGFjY2VzcyB0byBhIHByaXZhdGUgbWV0aG9kDQorCQkJCQkJYWRkU3ludGhldGljTWV0aG9kQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLkNvbnN0cnVjdG9yQWNjZXNzIDoNCisJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QNCisJCQkJCQlhZGRTeW50aGV0aWNDb25zdHJ1Y3RvckFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBzeW50aGV0aWMgbWV0aG9kIHRoYXQNCisJICogZ2VuZXJhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBjb25zdHJ1Y3Rvci4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yQWNjZXNzTWV0aG9kKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgew0KKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOw0KKwkJLy8gV2Uga25vdyB0aGF0IHdlIHdvbid0IGdldCBtb3JlIHRoYW4gMiBhdHRyaWJ1dGU6IHRoZSBjb2RlIGF0dHJpYnV0ZSArIHN5bnRoZXRpYyBhdHRyaWJ1dGUNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCisJCS8vIENvZGUgYXR0cmlidXRlDQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQorCQljb2RlU3RyZWFtLmluaXQodGhpcyk7DQorCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckNvbnN0cnVjdG9yQWNjZXNzKG1ldGhvZEJpbmRpbmcpOw0KKwkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yU3ludGhldGljQWNjZXNzTWV0aG9kKA0KKwkJCW1ldGhvZEJpbmRpbmcsDQorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwNCisJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKQ0KKwkJCQkuc2NvcGUNCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpDQorCQkJCS5jb21waWxhdGlvblJlc3VsdA0KKwkJCQkubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7DQorCQkvLyBhZGQgdGhlIHN5bnRoZXRpYyBhdHRyaWJ1dGUNCisJCWludCBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPQ0KKwkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3ludGhldGljTmFtZSk7DQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KIAkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4Ow0KIAkJLy8gdGhlIGxlbmd0aCBvZiBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCkBAIC00NDAsOTc3ICs5NzAsNDQ0IEBACiAJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCiAJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCiAJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KIAl9DQotCWlmIChmaWVsZEJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsNCi0JCWludCBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXg7DQotCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0DQorCSAqIGdlbmVyYXRlIGFuIHJlYWQgYWNjZXNzIHRvIGEgcHJpdmF0ZSBmaWVsZC4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0ZpZWxkUmVhZEFjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsNCisJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsNCisJCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDIgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUgKyBzeW50aGV0aWMgYXR0cmlidXRlDQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7DQorCQkvLyBDb2RlIGF0dHJpYnV0ZQ0KKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCisJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOw0KKwkJY29kZVN0cmVhbS5pbml0KHRoaXMpOw0KKwkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFJlYWRBY2Nlc3MobWV0aG9kQmluZGluZyk7DQorCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QoDQorCQkJbWV0aG9kQmluZGluZywNCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LA0KKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpDQorCQkJCS5zY29wZQ0KKwkJCQkucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkNCisJCQkJLmNvbXBpbGF0aW9uUmVzdWx0DQorCQkJCS5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsNCisJCS8vIGFkZCB0aGUgc3ludGhldGljIGF0dHJpYnV0ZQ0KKwkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9DQorCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7DQorCQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KIAkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KIAkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KIAkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KIAkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQotCX0NCi0JY29udGVudHNbZmllbGRBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCi0JY29udGVudHNbZmllbGRBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGUgYWxsIHRoZSBmaWVsZHMgaW5mb3MgZm9yIHRoZSByZWNlaXZlci4NCi0gKiBUaGlzIGluY2x1ZGVzOg0KLSAqIC0gYSBmaWVsZCBpbmZvIGZvciBlYWNoIGRlZmluZWQgZmllbGQgb2YgdGhhdCBjbGFzcw0KLSAqIC0gYSBmaWVsZCBpbmZvIGZvciBlYWNoIHN5bnRoZXRpYyBmaWVsZCAoZS5nLiB0aGlzJDApDQotICovDQotcHVibGljIHZvaWQgYWRkRmllbGRJbmZvcygpIHsNCi0JU291cmNlVHlwZUJpbmRpbmcgY3VycmVudEJpbmRpbmcgPSByZWZlcmVuY2VCaW5kaW5nOw0KLQlGaWVsZEJpbmRpbmdbXSBzeW50aGV0aWNGaWVsZHMgPSBjdXJyZW50QmluZGluZy5zeW50aGV0aWNGaWVsZHMoKTsNCi0JaW50IGZpZWxkQ291bnQgPSBjdXJyZW50QmluZGluZy5maWVsZENvdW50KCkgKyAoc3ludGhldGljRmllbGRzID09IG51bGwgPyAwIDogc3ludGhldGljRmllbGRzLmxlbmd0aCk7DQotDQotCS8vIHdyaXRlIHRoZSBudW1iZXIgb2YgZmllbGRzDQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWVsZENvdW50ID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmaWVsZENvdW50Ow0KLQ0KLQlGaWVsZEJpbmRpbmdbXSBmaWVsZEJpbmRpbmdzID0gY3VycmVudEJpbmRpbmcuZmllbGRzKCk7DQotCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZEJpbmRpbmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQlhZGRGaWVsZEluZm8oZmllbGRCaW5kaW5nc1tpXSk7DQotCX0NCi0JaWYgKHN5bnRoZXRpY0ZpZWxkcyAhPSBudWxsKSB7DQotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljRmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQkJYWRkRmllbGRJbmZvKHN5bnRoZXRpY0ZpZWxkc1tpXSk7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGlzIG1ldGhvZHMgc3RvcmVzIHRoZSBiaW5kaW5ncyBmb3IgZWFjaCBpbm5lciBjbGFzcy4gVGhleSB3aWxsIGJlIHVzZWQgdG8ga25vdyB3aGljaCBlbnRyaWVzDQotICogaGF2ZSB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZXMuDQotICogQHBhcmFtIHJlZmVyZW5jZUJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nIA0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZElubmVyQ2xhc3NlcyhSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcpIHsNCi0JLy8gY2hlY2sgZmlyc3QgaWYgdGhhdCByZWZlcmVuY2UgYmluZGluZyBpcyB0aGVyZQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mSW5uZXJDbGFzc2VzOyBpKyspIHsNCi0JCWlmIChpbm5lckNsYXNzZXNCaW5kaW5nc1tpXSA9PSByZWZlcmVuY2VCaW5kaW5nKQ0KLQkJCXJldHVybjsNCi0JfQ0KLQlpbnQgbGVuZ3RoID0gaW5uZXJDbGFzc2VzQmluZGluZ3MubGVuZ3RoOw0KLQlpZiAobnVtYmVyT2ZJbm5lckNsYXNzZXMgPT0gbGVuZ3RoKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGlubmVyQ2xhc3Nlc0JpbmRpbmdzLCAwLCAoaW5uZXJDbGFzc2VzQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGggKiAyXSksIDAsIGxlbmd0aCk7DQotCX0NCi0JaW5uZXJDbGFzc2VzQmluZGluZ3NbbnVtYmVyT2ZJbm5lckNsYXNzZXMrK10gPSByZWZlcmVuY2VCaW5kaW5nOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gY2xpbml0IG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBtZXRob2QuDQotICoNCi0gKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10NCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGRQcm9ibGVtQ2xpbml0KElQcm9ibGVtW10gcHJvYmxlbXMpIHsNCi0JZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyRm9yQ2xpbml0KCk7DQotCS8vIGxlYXZlIHR3byBzcGFjZXMgZm9yIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KLQljb250ZW50c09mZnNldCAtPSAyOw0KLQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQotCWNvbnRlbnRzT2Zmc2V0ICs9IDI7DQotCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25zRXhjZXB0aW9uczsNCi0JaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQotCWludCBjb250ZW50c0xlbmd0aDsNCi0NCi0JaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQotCWNvZGVTdHJlYW0ucmVzZXRGb3JQcm9ibGVtQ2xpbml0KHRoaXMpOw0KLQlTdHJpbmcgcHJvYmxlbVN0cmluZyA9ICIiLypub25OTFMqLzsNCi0JaWYgKHByb2JsZW1zICE9IG51bGwpIHsNCi0JCWludCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7DQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyNSk7DQotCQlpbnQgY291bnQgPSAwOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KLQkJCUlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsNCi0JCQlpZiAoKHByb2JsZW0gIT0gbnVsbCkgJiYgKHByb2JsZW0uaXNFcnJvcigpKSkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIvKm5vbk5MUyovICsgcHJvYmxlbS5nZXRNZXNzYWdlKCkgKyAiXG4iLypub25OTFMqLyk7DQotCQkJCWNvdW50Kys7DQotCQkJCWlmIChwcm9ibGVtTGluZSA9PSAwKSB7DQotCQkJCQlwcm9ibGVtTGluZSA9IHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpOw0KLQkJCQl9DQotCQkJCXByb2JsZW1zW2ldID0gbnVsbDsNCi0JCQl9DQotCQl9IC8vIGluc2VydCB0aGUgdG9wIGxpbmUgYWZ0ZXJ3YXJkcywgb25jZSBrbm93aW5nIGhvdyBtYW55IHByb2JsZW1zIHdlIGhhdmUgdG8gY29uc2lkZXINCi0JCWlmIChjb3VudCA+IDEpIHsNCi0JCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zIi8qbm9uTkxTKi8pKTsNCi0JCX0gZWxzZSB7DQotCQkJYnVmZmVyLmluc2VydCgwLCBVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtIi8qbm9uTkxTKi8pKTsNCi0JCX0NCi0JCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsNCiAJfQ0KIA0KLQkvLyByZXR1cm4gY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKGNvbXAub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgIiIpDQotCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIgPSBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QocmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCBwcm9ibGVtU3RyaW5nKTsNCi0JYXR0cmlidXRlTnVtYmVyKys7IC8vIGNvZGUgYXR0cmlidXRlDQotCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdCgNCi0JCWNvZGVBdHRyaWJ1dGVPZmZzZXQsDQotCQlleGNlcHRpb25IYW5kbGVyLA0KLQkJcmVmZXJlbmNlQmluZGluZw0KLQkJCS5zY29wZQ0KLQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQ0KLQkJCS5jb21waWxhdGlvblJlc3VsdA0KLQkJCS5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsNCi0JY29udGVudHNbYXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQotCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIGNvbnN0cnVjdG9yLg0KLSAqDQotICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24NCi0gKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuTWV0aG9kQmluZGluZw0KLSAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1bXQ0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZFByb2JsZW1Db25zdHJ1Y3RvcigNCi0JQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIA0KLQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsIA0KLQlJUHJvYmxlbVtdIHByb2JsZW1zKSB7DQotDQotCS8vIGFsd2F5cyBjbGVhciB0aGUgc3RyaWN0ZnAvbmF0aXZlL2Fic3RyYWN0IGJpdCBmb3IgYSBwcm9ibGVtIG1ldGhvZA0KLQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyAmPSB+KEFjY1N0cmljdGZwIHwgQWNjTmF0aXZlIHwgQWNjQWJzdHJhY3QpOw0KLQkJDQotCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsgDQotCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDEgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDE7IC8vIENvZGUgYXR0cmlidXRlDQotCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQotCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOw0KLQlmaW5hbCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbWV0aG9kLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpOw0KLQljb2RlU3RyZWFtLnJlc2V0KG1ldGhvZCwgdGhpcyk7DQotCVN0cmluZyBwcm9ibGVtU3RyaW5nID0gIiIvKm5vbk5MUyovOw0KLQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgew0KLQkJaW50IG1heCA9IHByb2JsZW1zLmxlbmd0aDsNCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDI1KTsNCi0JCWludCBjb3VudCA9IDA7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7DQotCQkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOw0KLQkJCWlmICgocHJvYmxlbSAhPSBudWxsKSAmJiAocHJvYmxlbS5pc0Vycm9yKCkpKSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Ii8qbm9uTkxTKi8gKyBwcm9ibGVtLmdldE1lc3NhZ2UoKSArICJcbiIvKm5vbk5MUyovKTsNCi0JCQkJY291bnQrKzsNCi0JCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsNCi0JCQkJCXByb2JsZW1MaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9IC8vIGluc2VydCB0aGUgdG9wIGxpbmUgYWZ0ZXJ3YXJkcywgb25jZSBrbm93aW5nIGhvdyBtYW55IHByb2JsZW1zIHdlIGhhdmUgdG8gY29uc2lkZXINCi0JCWlmIChjb3VudCA+IDEpIHsNCi0JCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zIi8qbm9uTkxTKi8pKTsNCi0JCX0gZWxzZSB7DQotCQkJYnVmZmVyLmluc2VydCgwLCBVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtIi8qbm9uTkxTKi8pKTsNCi0JCX0NCi0JCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JLy8gcmV0dXJuIGNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChjb21wLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsICIiKQ0KLQlpbnRbXSBleGNlcHRpb25IYW5kbGVyID0gDQotCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoDQotCQkJcHJvYmxlbVJlcG9ydGVyLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsIA0KLQkJCXByb2JsZW1TdHJpbmcpOw0KLQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKA0KLQkJbWV0aG9kLA0KLQkJbWV0aG9kQmluZGluZywgDQotCQljb2RlQXR0cmlidXRlT2Zmc2V0LCANCi0JCWV4Y2VwdGlvbkhhbmRsZXIsIA0KLQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykNCi0JCQkuc2NvcGUNCi0JCQkucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkNCi0JCQkuY29tcGlsYXRpb25SZXN1bHQNCi0JCQkubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7IA0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIGNvbnN0cnVjdG9yLg0KLSAqIFJlc2V0IHRoZSBwb3NpdGlvbiBpbnNpZGUgdGhlIGNvbnRlbnRzIGJ5dGUgYXJyYXkgdG8gdGhlIHNhdmVkT2Zmc2V0Lg0KLSAqDQotICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24NCi0gKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuTWV0aG9kQmluZGluZw0KLSAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1bXQ0KLSAqIEBwYXJhbSBzYXZlZE9mZnNldCA8Q09ERT5pbnQ8L0NPREU+DQotICovDQotcHVibGljIHZvaWQgYWRkUHJvYmxlbUNvbnN0cnVjdG9yKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsSVByb2JsZW1bXSBwcm9ibGVtcywgaW50IHNhdmVkT2Zmc2V0KSB7DQotCS8vIHdlIG5lZWQgdG8gbW92ZSBiYWNrIHRoZSBjb250ZW50c09mZnNldCB0byB0aGUgdmFsdWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kDQotCWNvbnRlbnRzT2Zmc2V0ID0gc2F2ZWRPZmZzZXQ7DQotCW1ldGhvZENvdW50LS07IC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXRob2QgdGhhdCBjYXVzZXMgdGhlIHByb2JsZW0NCi0JYWRkUHJvYmxlbUNvbnN0cnVjdG9yKG1ldGhvZCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXMpOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIG1ldGhvZC4NCi0gKg0KLSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcNCi0gKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10NCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGRQcm9ibGVtTWV0aG9kKA0KLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgDQotCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgDQotCUlQcm9ibGVtW10gcHJvYmxlbXMpIHsNCi0JaWYgKG1ldGhvZEJpbmRpbmcuaXNBYnN0cmFjdCgpICYmIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgew0KLQkJbWV0aG9kLmFib3J0KEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uQWJvcnRUeXBlKTsNCi0JfQkNCi0JLy8gYWx3YXlzIGNsZWFyIHRoZSBzdHJpY3RmcC9uYXRpdmUvYWJzdHJhY3QgYml0IGZvciBhIHByb2JsZW0gbWV0aG9kDQotCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzICY9IH4oQWNjU3RyaWN0ZnAgfCBBY2NOYXRpdmUgfCBBY2NBYnN0cmFjdCk7DQotCQ0KLQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7DQotCS8vIGxlYXZlIHR3byBzcGFjZXMgZm9yIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KLQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQotCWNvbnRlbnRzT2Zmc2V0ICs9IDI7DQotCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25zRXhjZXB0aW9uczsNCi0JaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQotCWludCBjb250ZW50c0xlbmd0aDsNCi0JDQotCWlmICgodGhyb3duc0V4Y2VwdGlvbnMgPSBtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IE5vRXhjZXB0aW9ucykgew0KLQkJLy8gVGhlIG1ldGhvZCBoYXMgYSB0aHJvdyBjbGF1c2UuIFNvIHdlIG5lZWQgdG8gYWRkIGFuIGV4Y2VwdGlvbiBhdHRyaWJ1dGUNCi0JCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBleGNlcHRpb24gYXR0cmlidXRlDQotCQlpbnQgbGVuZ3RoID0gdGhyb3duc0V4Y2VwdGlvbnMubGVuZ3RoOw0KLQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgKDggKyBsZW5ndGggKiAyKSA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBNYXRoLm1heChJTkNSRU1FTlRfU0laRSwgKDggKyBsZW5ndGggKiAyKSldKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQkJfQ0KLQkJaW50IGV4Y2VwdGlvbk5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRXhjZXB0aW9uc05hbWUpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbk5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbk5hbWVJbmRleDsNCi0JCS8vIFRoZSBhdHRyaWJ1dGUgbGVuZ3RoID0gbGVuZ3RoICogMiArIDIgaW4gY2FzZSBvZiBhIGV4Y2VwdGlvbiBhdHRyaWJ1dGUNCi0JCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsZW5ndGggKiAyICsgMjsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCQlpbnQgZXhjZXB0aW9uSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHRocm93bnNFeGNlcHRpb25zW2ldKTsNCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uSW5kZXggPj4gOCk7DQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSW5kZXg7DQotCQl9DQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCi0JfQ0KLQ0KLQkvLyBEZXByZWNhdGVkIGF0dHJpYnV0ZQ0KLQkvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUNCi0JaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNiA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQlpZiAobWV0aG9kQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgew0KLQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkRlcHJlY2F0ZWROYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsNCi0JCS8vIHRoZSBsZW5ndGggb2YgYSBkZXByZWNhdGVkIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBzeW50aGV0aWMgbWV0aG9kIHRoYXQNCisJICogZ2VuZXJhdGUgYW4gd3JpdGUgYWNjZXNzIHRvIGEgcHJpdmF0ZSBmaWVsZC4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0ZpZWxkV3JpdGVBY2Nlc3NNZXRob2QoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQorCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7DQorCQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAyIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlICsgc3ludGhldGljIGF0dHJpYnV0ZQ0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAyOw0KKwkJLy8gQ29kZSBhdHRyaWJ1dGUNCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsNCisJCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsNCisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRmllbGRXcml0ZUFjY2VzcyhtZXRob2RCaW5kaW5nKTsNCisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY0FjY2Vzc01ldGhvZCgNCisJCQltZXRob2RCaW5kaW5nLA0KKwkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsDQorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykNCisJCQkJLnNjb3BlDQorCQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQ0KKwkJCQkuY29tcGlsYXRpb25SZXN1bHQNCisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOw0KKwkJLy8gYWRkIHRoZSBzeW50aGV0aWMgYXR0cmlidXRlDQorCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsNCisJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwDQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotDQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCi0JfQ0KLQkNCi0JaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQotCWZpbmFsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSBtZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7DQotCWNvZGVTdHJlYW0ucmVzZXQobWV0aG9kLCB0aGlzKTsNCi0JU3RyaW5nIHByb2JsZW1TdHJpbmcgPSAiIi8qbm9uTkxTKi87DQotCWlmIChwcm9ibGVtcyAhPSBudWxsKSB7DQotCQlpbnQgbWF4ID0gcHJvYmxlbXMubGVuZ3RoOw0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjUpOw0KLQkJaW50IGNvdW50ID0gMDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCi0JCQlJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07DQotCQkJaWYgKChwcm9ibGVtICE9IG51bGwpDQotCQkJCSYmIChwcm9ibGVtLmlzRXJyb3IoKSkNCi0JCQkJJiYgKHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSA+PSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkNCi0JCQkJJiYgKHByb2JsZW0uZ2V0U291cmNlRW5kKCkgPD0gbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kKSkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIvKm5vbk5MUyovICsgcHJvYmxlbS5nZXRNZXNzYWdlKCkgKyAiXG4iLypub25OTFMqLyk7DQotCQkJCWNvdW50Kys7DQotCQkJCWlmIChwcm9ibGVtTGluZSA9PSAwKSB7DQotCQkJCQlwcm9ibGVtTGluZSA9IHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpOw0KLQkJCQl9DQotCQkJCXByb2JsZW1zW2ldID0gbnVsbDsNCi0JCQl9DQotCQl9IC8vIGluc2VydCB0aGUgdG9wIGxpbmUgYWZ0ZXJ3YXJkcywgb25jZSBrbm93aW5nIGhvdyBtYW55IHByb2JsZW1zIHdlIGhhdmUgdG8gY29uc2lkZXINCi0JCWlmIChjb3VudCA+IDEpIHsNCi0JCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zIi8qbm9uTkxTKi8pKTsNCi0JCX0gZWxzZSB7DQotCQkJYnVmZmVyLmluc2VydCgwLCBVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtIi8qbm9uTkxTKi8pKTsNCi0JCX0NCi0JCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsNCiAJfQ0KIA0KLQkvLyByZXR1cm4gY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKGNvbXAub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgIiIpDQotCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIgPSANCi0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgNCi0JCQlwcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgDQotCQkJcHJvYmxlbVN0cmluZyk7DQotCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBjb2RlIGF0dHJpYnV0ZQ0KLQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKA0KLQkJbWV0aG9kLCANCi0JCW1ldGhvZEJpbmRpbmcsIA0KLQkJY29kZUF0dHJpYnV0ZU9mZnNldCwgDQotCQlleGNlcHRpb25IYW5kbGVyLCANCi0JCSgoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpDQotCQkJLnNjb3BlDQotCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpDQotCQkJLmNvbXBpbGF0aW9uUmVzdWx0DQotCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOw0KLQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCi0JY29udGVudHNbYXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIG1ldGhvZC4NCi0gKiBSZXNldCB0aGUgcG9zaXRpb24gaW5zaWRlIHRoZSBjb250ZW50cyBieXRlIGFycmF5IHRvIHRoZSBzYXZlZE9mZnNldC4NCi0gKg0KLSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcNCi0gKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10NCi0gKiBAcGFyYW0gc2F2ZWRPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZFByb2JsZW1NZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyxJUHJvYmxlbVtdIHByb2JsZW1zLCBpbnQgc2F2ZWRPZmZzZXQpIHsNCi0JLy8gd2UgbmVlZCB0byBtb3ZlIGJhY2sgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QNCi0JY29udGVudHNPZmZzZXQgPSBzYXZlZE9mZnNldDsNCi0JbWV0aG9kQ291bnQtLTsgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG1ldGhvZCB0aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQ0KLQlhZGRQcm9ibGVtTWV0aG9kKG1ldGhvZCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXMpOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhbGwgdGhlIHNwZWNpYWwgbWV0aG9kIGluZm9zLg0KLSAqIFRoZXkgYXJlOg0KLSAqIC0gc3ludGhldGljIGFjY2VzcyBtZXRob2RzDQotICogLSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMNCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGRTcGVjaWFsTWV0aG9kcygpIHsNCi0JLy8gYWRkIGFsbCBtZXRob2RzIChkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMgYW5kIHN5bnRoZXRpYykNCi0NCi0JLy8gZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzDQotCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gcmVmZXJlbmNlQmluZGluZzsNCi0JTWV0aG9kQmluZGluZ1tdIGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBjdXJyZW50QmluZGluZy5nZXREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCk7DQotCWZvciAoaW50IGkgPSAwLCBtYXggPSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIoZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXSk7DQotCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQotCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOw0KLQkJY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0DQorCSAqIGdlbmVyYXRlIGFuIGFjY2VzcyB0byBhIHByaXZhdGUgbWV0aG9kLg0KKwkgKg0KKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZw0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU3ludGhldGljTWV0aG9kQWNjZXNzTWV0aG9kKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgew0KKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOw0KKwkJLy8gV2Uga25vdyB0aGF0IHdlIHdvbid0IGdldCBtb3JlIHRoYW4gMiBhdHRyaWJ1dGU6IHRoZSBjb2RlIGF0dHJpYnV0ZSArIHN5bnRoZXRpYyBhdHRyaWJ1dGUNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCisJCS8vIENvZGUgYXR0cmlidXRlDQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQorCQljb2RlU3RyZWFtLmluaXQodGhpcyk7DQorCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvck1ldGhvZEFjY2VzcyhtZXRob2RCaW5kaW5nKTsNCisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY0FjY2Vzc01ldGhvZCgNCisJCQltZXRob2RCaW5kaW5nLA0KKwkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsDQorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykNCisJCQkJLnNjb3BlDQorCQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQ0KKwkJCQkuY29tcGlsYXRpb25SZXN1bHQNCisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOw0KKwkJLy8gYWRkIHRoZSBzeW50aGV0aWMgYXR0cmlidXRlDQorCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsNCisJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwDQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQogCX0NCiANCi0JLy8gYWRkIHN5bnRoZXRpYyBtZXRob2RzIGluZm9zDQotCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNBY2Nlc3NNZXRob2RzID0gY3VycmVudEJpbmRpbmcuc3ludGhldGljQWNjZXNzTWV0aG9kcygpOw0KLQlpZiAoc3ludGhldGljQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7DQotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWNjZXNzTWV0aG9kQmluZGluZyA9IHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV07DQotCQkJc3dpdGNoIChhY2Nlc3NNZXRob2RCaW5kaW5nLmFjY2Vzc1R5cGUpIHsNCi0JCQkJY2FzZSBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLkZpZWxkUmVhZEFjY2VzcyA6DQotCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gcmVhZGluZyBhY2Nlc3MgdG8NCi0JCQkJCS8vIGEgcHJpdmF0ZSBmaWVsZA0KLQkJCQkJYWRkU3ludGhldGljRmllbGRSZWFkQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5GaWVsZFdyaXRlQWNjZXNzIDoNCi0JCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiB3cml0aW5nIGFjY2VzcyB0bw0KLQkJCQkJLy8gYSBwcml2YXRlIGZpZWxkDQotCQkJCQlhZGRTeW50aGV0aWNGaWVsZFdyaXRlQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5NZXRob2RBY2Nlc3MgOg0KLQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIGFjY2VzcyB0byBhIHByaXZhdGUgbWV0aG9kDQotCQkJCQlhZGRTeW50aGV0aWNNZXRob2RBY2Nlc3NNZXRob2Qoc3ludGhldGljQWNjZXNzTWV0aG9kc1tpXSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLkNvbnN0cnVjdG9yQWNjZXNzIDoNCi0JCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiBhY2Nlc3MgdG8gYSBwcml2YXRlIG1ldGhvZA0KLQkJCQkJYWRkU3ludGhldGljQ29uc3RydWN0b3JBY2Nlc3NNZXRob2Qoc3ludGhldGljQWNjZXNzTWV0aG9kc1tpXSk7DQotCQkJfQ0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogQnVpbGQgYWxsIHRoZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZXMgbmFtZXMNCisJICogaW50byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLg0KKwkgKg0KKwkgKiBvdXRwdXRQYXRoIGlzIGZvcm1lZCBsaWtlOg0KKwkgKgkgICBjOlx0ZW1wXCB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBmaWxlIHNlcGFyYXRvcg0KKwkgKiByZWxhdGl2ZUZpbGVOYW1lIGlzIGZvcm1lZCBsaWtlOg0KKwkgKiAgICAgamF2YVxsYW5nXFN0cmluZy5jbGFzcyAqDQorCSAqIA0KKwkgKiBAcGFyYW0gb3V0cHV0UGF0aCBqYXZhLmxhbmcuU3RyaW5nDQorCSAqIEBwYXJhbSByZWxhdGl2ZUZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcNCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEFsbERpcmVjdG9yaWVzSW50bygNCisJCVN0cmluZyBvdXRwdXRQYXRoLA0KKwkJU3RyaW5nIHJlbGF0aXZlRmlsZU5hbWUpDQorCQl0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJY2hhciBmaWxlU2VwYXJhdG9yQ2hhciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsNCisJCVN0cmluZyBmaWxlU2VwYXJhdG9yID0gRmlsZS5zZXBhcmF0b3I7DQorCQlGaWxlIGY7DQorCQkvLyBGaXJzdCB3ZSBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0UGF0aCBleGlzdHMNCisJCW91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnJlcGxhY2UoJy8nLCBmaWxlU2VwYXJhdG9yQ2hhcik7DQorCQkvLyBUbyBiZSBhYmxlIHRvIHBhc3MgdGhlIG1rZGlycygpIG1ldGhvZCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZXh0cmEgZmlsZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgb3V0RGlyIG5hbWUNCisJCWlmIChvdXRwdXRQYXRoLmVuZHNXaXRoKGZpbGVTZXBhcmF0b3IpKSB7DQorCQkJb3V0cHV0UGF0aCA9IG91dHB1dFBhdGguc3Vic3RyaW5nKDAsIG91dHB1dFBhdGgubGVuZ3RoKCkgLSAxKTsNCiAJCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0DQotICogZ2VuZXJhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBjb25zdHJ1Y3Rvci4NCi0gKg0KLSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nDQotICovDQotcHVibGljIHZvaWQgYWRkU3ludGhldGljQ29uc3RydWN0b3JBY2Nlc3NNZXRob2QoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQotCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsNCi0JLy8gV2Uga25vdyB0aGF0IHdlIHdvbid0IGdldCBtb3JlIHRoYW4gMiBhdHRyaWJ1dGU6IHRoZSBjb2RlIGF0dHJpYnV0ZSArIHN5bnRoZXRpYyBhdHRyaWJ1dGUNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7CQ0KLQkvLyBDb2RlIGF0dHJpYnV0ZQ0KLQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0Ow0KLQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsNCi0JY29kZVN0cmVhbS5pbml0KHRoaXMpOw0KLQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckNvbnN0cnVjdG9yQWNjZXNzKG1ldGhvZEJpbmRpbmcpOw0KLQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QobWV0aG9kQmluZGluZywgY29kZUF0dHJpYnV0ZU9mZnNldCwgKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7DQotCS8vIGFkZCB0aGUgc3ludGhldGljIGF0dHJpYnV0ZQ0KLQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4Ow0KLQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBzeW50aGV0aWMgbWV0aG9kIHRoYXQNCi0gKiBnZW5lcmF0ZSBhbiByZWFkIGFjY2VzcyB0byBhIHByaXZhdGUgZmllbGQuDQotICoNCi0gKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZw0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0ZpZWxkUmVhZEFjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsNCi0JZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOw0KLQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAyIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlICsgc3ludGhldGljIGF0dHJpYnV0ZQ0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsNCi0JLy8gQ29kZSBhdHRyaWJ1dGUNCi0JaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQotCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsNCi0JY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFJlYWRBY2Nlc3MobWV0aG9kQmluZGluZyk7DQotCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY0FjY2Vzc01ldGhvZChtZXRob2RCaW5kaW5nLCBjb2RlQXR0cmlidXRlT2Zmc2V0LCAoKFNvdXJjZVR5cGVCaW5kaW5nKSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsNCi0JLy8gYWRkIHRoZSBzeW50aGV0aWMgYXR0cmlidXRlDQotCWludCBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7DQotCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwDQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsJDQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBzeW50aGV0aWMgbWV0aG9kIHRoYXQNCi0gKiBnZW5lcmF0ZSBhbiB3cml0ZSBhY2Nlc3MgdG8gYSBwcml2YXRlIGZpZWxkLg0KLSAqDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGRTeW50aGV0aWNGaWVsZFdyaXRlQWNjZXNzTWV0aG9kKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgew0KLQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7DQotCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDIgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUgKyBzeW50aGV0aWMgYXR0cmlidXRlDQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAyOwkNCi0JLy8gQ29kZSBhdHRyaWJ1dGUNCi0JaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7DQotCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsNCi0JY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFdyaXRlQWNjZXNzKG1ldGhvZEJpbmRpbmcpOw0KLQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QobWV0aG9kQmluZGluZywgY29kZUF0dHJpYnV0ZU9mZnNldCwgKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7DQotCS8vIGFkZCB0aGUgc3ludGhldGljIGF0dHJpYnV0ZQ0KLQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4Ow0KLQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0DQotICogZ2VuZXJhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QuDQotICoNCi0gKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZw0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY01ldGhvZEFjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsNCi0JZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOw0KLQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAyIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlICsgc3ludGhldGljIGF0dHJpYnV0ZQ0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsJDQotCS8vIENvZGUgYXR0cmlidXRlDQotCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQotCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOw0KLQljb2RlU3RyZWFtLmluaXQodGhpcyk7DQotCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yTWV0aG9kQWNjZXNzKG1ldGhvZEJpbmRpbmcpOw0KLQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QobWV0aG9kQmluZGluZywgY29kZUF0dHJpYnV0ZU9mZnNldCwgKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7DQotCS8vIGFkZCB0aGUgc3ludGhldGljIGF0dHJpYnV0ZQ0KLQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4Ow0KLQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIEJ1aWxkIGFsbCB0aGUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhY2thZ2VzIG5hbWVzDQotICogaW50byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLg0KLSAqDQotICogb3V0cHV0UGF0aCBpcyBmb3JtZWQgbGlrZToNCi0gKgkgICBjOlx0ZW1wXCB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBmaWxlIHNlcGFyYXRvcg0KLSAqIHJlbGF0aXZlRmlsZU5hbWUgaXMgZm9ybWVkIGxpa2U6DQotICogICAgIGphdmFcbGFuZ1xTdHJpbmcuY2xhc3MgKg0KLSAqIA0KLSAqIEBwYXJhbSBvdXRwdXRQYXRoIGphdmEubGFuZy5TdHJpbmcNCi0gKiBAcGFyYW0gcmVsYXRpdmVGaWxlTmFtZSBqYXZhLmxhbmcuU3RyaW5nDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRBbGxEaXJlY3Rvcmllc0ludG8oU3RyaW5nIG91dHB1dFBhdGgsIFN0cmluZyByZWxhdGl2ZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQljaGFyIGZpbGVTZXBhcmF0b3JDaGFyID0gRmlsZS5zZXBhcmF0b3JDaGFyOw0KLQlTdHJpbmcgZmlsZVNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yOw0KLQlGaWxlIGY7DQotCS8vIEZpcnN0IHdlIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXRQYXRoIGV4aXN0cw0KLQlvdXRwdXRQYXRoID0gb3V0cHV0UGF0aC5yZXBsYWNlKCcvJywgZmlsZVNlcGFyYXRvckNoYXIpOw0KLQkvLyBUbyBiZSBhYmxlIHRvIHBhc3MgdGhlIG1rZGlycygpIG1ldGhvZCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZXh0cmEgZmlsZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgb3V0RGlyIG5hbWUNCi0JaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsNCi0JCW91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnN1YnN0cmluZygwLCBvdXRwdXRQYXRoLmxlbmd0aCgpIC0gMSk7DQotCX0NCi0JZiA9IG5ldyBGaWxlKG91dHB1dFBhdGgpOw0KLQlpZiAoZi5leGlzdHMoKSkgew0KLQkJaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJvdXRwdXQuaXNGaWxlIi8qbm9uTkxTKi8sZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOw0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoIm91dHB1dC5pc0ZpbGVOb3REaXJlY3RvcnkiLypub25OTFMqLykpOw0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJLy8gd2UgaGF2ZSB0byBjcmVhdGUgdGhhdCBkaXJlY3RvcnkNCi0JCWlmICghZi5ta2RpcnMoKSkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoIm91dHB1dC5kaXJOYW1lIi8qbm9uTkxTKi8sZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOw0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoIm91dHB1dC5ub3RWYWxpZEFsbCIvKm5vbk5MUyovKSk7DQotCQl9DQotCX0NCi0JU3RyaW5nQnVmZmVyIG91dERpciA9IG5ldyBTdHJpbmdCdWZmZXIob3V0cHV0UGF0aCk7DQotCW91dERpci5hcHBlbmQoZmlsZVNlcGFyYXRvcik7DQotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlbGF0aXZlRmlsZU5hbWUsIGZpbGVTZXBhcmF0b3IpOw0KLQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQlmID0gbmV3IEZpbGUob3V0RGlyLmFwcGVuZCh0b2tlbikuYXBwZW5kKGZpbGVTZXBhcmF0b3IpLnRvU3RyaW5nKCkpOw0KKwkJZiA9IG5ldyBGaWxlKG91dHB1dFBhdGgpOw0KIAkJaWYgKGYuZXhpc3RzKCkpIHsNCi0JCQkvLyBUaGUgb3V0RGlyIGFscmVhZHkgZXhpc3RzLCBzbyB3ZSBwcm9jZWVkIHRoZSBuZXh0IGVudHJ5DQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvdXREaXI6ICIgKyBvdXREaXIgKyAiIGFscmVhZHkgZXhpc3RzLiIpOw0KKwkJCWlmICghZi5pc0RpcmVjdG9yeSgpKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoIm91dHB1dC5pc0ZpbGUiICwgZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkDQorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoIm91dHB1dC5pc0ZpbGVOb3REaXJlY3RvcnkiICkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KIAkJfSBlbHNlIHsNCi0JCQkvLyBOZWVkIHRvIGFkZCB0aGUgb3V0RGlyDQotCQkJaWYgKCFmLm1rZGlyKCkpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgib3V0cHV0LmZpbGVOYW1lIi8qbm9uTkxTKi8sZi5nZXROYW1lKCkpKTsNCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgib3V0cHV0Lm5vdFZhbGlkIi8qbm9uTkxTKi8pKTsNCisJCQkvLyB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGF0IGRpcmVjdG9yeQ0KKwkJCWlmICghZi5ta2RpcnMoKSkgew0KKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJvdXRwdXQuZGlyTmFtZSIgLCBmLmdldEFic29sdXRlUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgib3V0cHV0Lm5vdFZhbGlkQWxsIiApKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCi0JCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KLQl9DQotCS8vIHRva2VuIGNvbnRhaW5zIHRoZSBsYXN0IG9uZQ0KLQlyZXR1cm4gb3V0RGlyLmFwcGVuZCh0b2tlbikudG9TdHJpbmcoKTsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGF0IG1ldGhvZCBjb21wbGV0ZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZSBieSBzZXR0aW5nDQotICogLSB0aGUgYXR0cmlidXRlX2xlbmd0aA0KLSAqIC0gbWF4X3N0YWNrDQotICogLSBtYXhfbG9jYWxzDQotICogLSBjb2RlX2xlbmd0aA0KLSAqIC0gZXhjZXB0aW9uIHRhYmxlDQotICogLSBhbmQgZGVidWcgYXR0cmlidXRlcyBpZiBuZWNlc3NhcnkuDQotICoNCi0gKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtDQotICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KLSAqLw0KLXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29kZUF0dHJpYnV0ZShpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCkgew0KLQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCi0JYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07DQotCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7DQotCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUNCi0JLy8gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlQXR0cmlidXRlDQotCS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldA0KLQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLg0KLQlpbnQgY29udGVudHNMZW5ndGg7DQotCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247DQotCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7DQotCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24pOw0KLQl9DQotCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMjAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCX0NCi0JaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsNCi0JaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTJdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTNdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOw0KLQ0KLQkvLyB3cml0ZSB0aGUgZXhjZXB0aW9uIHRhYmxlDQotCWludCBleGNlcHRpb25IYW5kbGVyc051bWJlciA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXI7DQotCUV4Y2VwdGlvbkxhYmVsW10gZXhjZXB0aW9uSGFuZGxlcnMgPSBjb2RlU3RyZWFtLmV4Y2VwdGlvbkhhbmRsZXJzOw0KLQlpbnQgZXhTaXplOw0KLQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIChleFNpemUgPSAoZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXIgKiA4ICsgMikpID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgKGV4U2l6ZSA+IElOQ1JFTUVOVF9TSVpFID8gZXhTaXplIDogSU5DUkVNRU5UX1NJWkUpXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIA0KLQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24NCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25IYW5kbGVyc051bWJlciA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOyBpKyspIHsNCi0JCUV4Y2VwdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyc1tpXTsNCi0JCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXIuc3RhcnQ7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0ID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0Ow0KLQkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXIuZW5kOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5kOw0KLQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkhhbmRsZXIucG9zaXRpb247DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7DQotCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsNCi0JCQkvLyBhbnkgZXhjZXB0aW9uIGhhbmRsZXINCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQl9IGVsc2Ugew0KLQkJCWludCBuYW1lSW5kZXg7DQotCQkJaWYgKGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZykgew0KLQkJCQkvKiByZXByZXNlbnRzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIHNlZSBjbGFzcyBsaXRlcmFsIGFjY2VzcyovDQotCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsNCisJCVN0cmluZ0J1ZmZlciBvdXREaXIgPSBuZXcgU3RyaW5nQnVmZmVyKG91dHB1dFBhdGgpOw0KKwkJb3V0RGlyLmFwcGVuZChmaWxlU2VwYXJhdG9yKTsNCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPQ0KKwkJCW5ldyBTdHJpbmdUb2tlbml6ZXIocmVsYXRpdmVGaWxlTmFtZSwgZmlsZVNlcGFyYXRvcik7DQorCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQorCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KKwkJCWYgPSBuZXcgRmlsZShvdXREaXIuYXBwZW5kKHRva2VuKS5hcHBlbmQoZmlsZVNlcGFyYXRvcikudG9TdHJpbmcoKSk7DQorCQkJaWYgKGYuZXhpc3RzKCkpIHsNCisJCQkJLy8gVGhlIG91dERpciBhbHJlYWR5IGV4aXN0cywgc28gd2UgcHJvY2VlZCB0aGUgbmV4dCBlbnRyeQ0KKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm91dERpcjogIiArIG91dERpciArICIgYWxyZWFkeSBleGlzdHMuIik7DQogCQkJfSBlbHNlIHsNCi0JCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUpOw0KKwkJCQkvLyBOZWVkIHRvIGFkZCB0aGUgb3V0RGlyDQorCQkJCWlmICghZi5ta2RpcigpKSB7DQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJvdXRwdXQuZmlsZU5hbWUiICwgZi5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgib3V0cHV0Lm5vdFZhbGlkIiApKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9DQogCQkJfQ0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQorCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQogCQl9DQorCQkvLyB0b2tlbiBjb250YWlucyB0aGUgbGFzdCBvbmUNCisJCXJldHVybiBvdXREaXIuYXBwZW5kKHRva2VuKS50b1N0cmluZygpOw0KIAl9DQogDQotCS8vIGRlYnVnIGF0dHJpYnV0ZXMNCi0JaW50IGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsNCi0JLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aA0KLQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7DQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGF0IG1ldGhvZCBjb21wbGV0ZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZSBieSBzZXR0aW5nDQorCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCisJICogLSBtYXhfc3RhY2sNCisJICogLSBtYXhfbG9jYWxzDQorCSAqIC0gY29kZV9sZW5ndGgNCisJICogLSBleGNlcHRpb24gdGFibGUNCisJICogLSBhbmQgZGVidWcgYXR0cmlidXRlcyBpZiBuZWNlc3NhcnkuDQorCSAqDQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0NCisJICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KKwkgKi8NCisJcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlKGludCBjb2RlQXR0cmlidXRlT2Zmc2V0KSB7DQorCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCisJCWJ5dGVbXSBsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOw0KKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSBjb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsNCisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUNCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQ0KKwkJLy8gVGhhdCBtZWFucyB0aGF0IHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoIHlvdSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSB2YWx1ZSBvZiBjb2RlQXR0cmlidXRlT2Zmc2V0DQorCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLg0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJaW50IGNvZGVfbGVuZ3RoID0gY29kZVN0cmVhbS5wb3NpdGlvbjsNCisJCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7DQorCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdCgNCisJCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbik7DQorCQl9DQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7DQorCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQogDQotCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCi0JaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykgew0KLQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSANCi0JCSAqIEJ1aWxkIHRoZSBwYWlycyBvZjoNCi0JCSAqIAkoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQ0KLQkJICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlDQotCQkgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQ0KLQkJICovDQotCQkvKiogT0xEIENPREUNCi0JCQkJaW50W11bXSBwY1RvU291cmNlTWFwVGFibGU7DQotCQlpbnQgcHJldmlvdXNMaW5lTnVtYmVyOw0KLQkJaW50W10gZmxhdFRhYmxlOw0KLQkJaW50IGluZGV4Ow0KLQkJaW50IHN0YXJ0TGluZUluZGV4ZXNbXSA9IGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9uczsNCi0JCWludCBtYXggPSBzdGFydExpbmVJbmRleGVzLmxlbmd0aDsNCi0JCSovIA0KLQkJaW50W10gcGNUb1NvdXJjZU1hcFRhYmxlOw0KLQkJaWYgKCgocGNUb1NvdXJjZU1hcFRhYmxlID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwKSAhPSBudWxsKSAmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZSAhPSAwKSkgew0KLQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsNCi0JCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUNCisJCWludCBleGNlcHRpb25IYW5kbGVyc051bWJlciA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXI7DQorCQlFeGNlcHRpb25MYWJlbFtdIGV4Y2VwdGlvbkhhbmRsZXJzID0gY29kZVN0cmVhbS5leGNlcHRpb25IYW5kbGVyczsNCisJCWludCBleFNpemU7DQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIChleFNpemUgPSAoZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXIgKiA4ICsgMikpDQorCQkJPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShsb2NhbENvbnRlbnRzID0NCisJCQkJCWNvbnRlbnRzID0NCisJCQkJCQluZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIChleFNpemUgPiBJTkNSRU1FTlRfU0laRSA/IGV4U2l6ZSA6IElOQ1JFTUVOVF9TSVpFKV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIA0KKwkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uDQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25IYW5kbGVyc051bWJlcjsgaSsrKSB7DQorCQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXJzW2ldOw0KKwkJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXIuc3RhcnQ7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnQ7DQorCQkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXIuZW5kOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZW5kID4+IDgpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQorCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkhhbmRsZXIucG9zaXRpb247DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCisJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsNCisJCQkJLy8gYW55IGV4Y2VwdGlvbiBoYW5kbGVyDQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJfSBlbHNlIHsNCisJCQkJaW50IG5hbWVJbmRleDsNCisJCQkJaWYgKGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZykgew0KKwkJCQkJLyogcmVwcmVzZW50cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBzZWUgY2xhc3MgbGl0ZXJhbCBhY2Nlc3MqLw0KKwkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUpOw0KKwkJCQl9DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KIAkJCX0NCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7DQotCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7DQotCQkJaW50IGxpbmVOdW1iZXJUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQotCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OyAvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbGluZV9udW1iZXJfdGFibGVfbGVuZ3RoDQorCQl9DQorCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzDQorCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsNCisJCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCisNCisJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsNCisJCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIA0KKwkJCSAqIEJ1aWxkIHRoZSBwYWlycyBvZjoNCisJCQkgKiAJKGJ5dGVjb2RlUEMgbGluZU51bWJlcikNCisJCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUNCisJCQkgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQ0KKwkJCSAqLw0KIAkJCS8qKiBPTEQgQ09ERQ0KLQkJCXByZXZpb3VzTGluZU51bWJlciA9IDA7DQotDQotCQkJLy8gU2VlbXMgbGlrZSBkbyB3b3VsZCBiZSBiZXR0ZXIsIGJ1dCB0aGlzIHByZXNlcnZlcyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IuDQotDQotCQkJZmxhdFRhYmxlID0gbmV3IGludFtjb2RlX2xlbmd0aF07DQotCQkJZm9yIChpbnQgaSA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgLSAxOyBpID49IDA7IGktLSkgew0KLQkJCQkvLyBlbnRyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToNCi0JCQkJLy8gcG9zaXRpb24gMTogc3RhcnRQQw0KLQkJCQkvLyBwb3NpdGlvbiAyOiBlbmRQQw0KLQkJCQkvLyBwb3NpdGlvbiAzOiBzb3VyY2VTdGFydA0KLQkJCQkvLyBwb3NpdGlvbiA0OiBzb3VyY2VFbmQNCi0JCQkJLy8gQ29tcHV0ZSB0aGUgbGluZSBudW1iZXIgZm9yIGEgZ2l2ZW4gc291cmNlIHBvc2l0aW9uDQotCQkJCWluZGV4ID0gc2VhcmNoTGluZU51bWJlcihzdGFydExpbmVJbmRleGVzLCBwY1RvU291cmNlTWFwVGFibGVbaV1bMl0pOw0KLQkJCQlmb3IgKGludCBqID0gcGNUb1NvdXJjZU1hcFRhYmxlW2ldWzBdOyBqIDwgcGNUb1NvdXJjZU1hcFRhYmxlW2ldWzFdOyBqKyspDQotCQkJCQlmbGF0VGFibGVbal0gPSBpbmRleDsNCi0JCQl9DQotCQkJcHJldmlvdXNMaW5lTnVtYmVyID0gLTE7DQotCQkJDQorCQkJCQlpbnRbXVtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsNCisJCQlpbnQgcHJldmlvdXNMaW5lTnVtYmVyOw0KKwkJCWludFtdIGZsYXRUYWJsZTsNCisJCQlpbnQgaW5kZXg7DQorCQkJaW50IHN0YXJ0TGluZUluZGV4ZXNbXSA9IGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9uczsNCisJCQlpbnQgbWF4ID0gc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGg7DQogCQkJKi8NCi0JCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsNCi0JCQlpbnQgbGVuZ3RoID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZTsNCi0JCQkvKiogT0xEIENPREUNCi0JCQkJaW50IGxlbmd0aCA9IGZsYXRUYWJsZS5sZW5ndGg7DQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJCQlpZiAoZmxhdFRhYmxlW2ldICE9IHByZXZpb3VzTGluZU51bWJlcikgew0KLQkJCQkJcHJldmlvdXNMaW5lTnVtYmVyID0gZmxhdFRhYmxlW2ldOw0KKwkJCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsNCisJCQlpZiAoKChwY1RvU291cmNlTWFwVGFibGUgPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXApICE9IG51bGwpDQorCQkJCSYmIChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7DQorCQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0NCisJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7DQorCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJY29udGVudHMsDQorCQkJCQkJMCwNCisJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCTAsDQorCQkJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJCQl9DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7DQorCQkJCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7DQorCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgNCisJCQkJLyoqIE9MRCBDT0RFDQorCQkJCXByZXZpb3VzTGluZU51bWJlciA9IDA7DQorCQkJCQ0KKwkJCQkvLyBTZWVtcyBsaWtlIGRvIHdvdWxkIGJlIGJldHRlciwgYnV0IHRoaXMgcHJlc2VydmVzIHRoZSBleGlzdGluZyBiZWhhdmlvci4NCisJCQkJDQorCQkJCWZsYXRUYWJsZSA9IG5ldyBpbnRbY29kZV9sZW5ndGhdOw0KKwkJCQlmb3IgKGludCBpID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorCQkJCQkvLyBlbnRyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToNCisJCQkJCS8vIHBvc2l0aW9uIDE6IHN0YXJ0UEMNCisJCQkJCS8vIHBvc2l0aW9uIDI6IGVuZFBDDQorCQkJCQkvLyBwb3NpdGlvbiAzOiBzb3VyY2VTdGFydA0KKwkJCQkJLy8gcG9zaXRpb24gNDogc291cmNlRW5kDQorCQkJCQkvLyBDb21wdXRlIHRoZSBsaW5lIG51bWJlciBmb3IgYSBnaXZlbiBzb3VyY2UgcG9zaXRpb24NCisJCQkJCWluZGV4ID0gc2VhcmNoTGluZU51bWJlcihzdGFydExpbmVJbmRleGVzLCBwY1RvU291cmNlTWFwVGFibGVbaV1bMl0pOw0KKwkJCQkJZm9yIChpbnQgaiA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpXVswXTsgaiA8IHBjVG9Tb3VyY2VNYXBUYWJsZVtpXVsxXTsgaisrKQ0KKwkJCQkJCWZsYXRUYWJsZVtqXSA9IGluZGV4Ow0KKwkJCQl9DQorCQkJCXByZXZpb3VzTGluZU51bWJlciA9IC0xOw0KKwkJCQkNCisJCQkJKi8NCisJCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQorCQkJCWludCBsZW5ndGggPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplOw0KKwkJCQkvKiogT0xEIENPREUNCisJCQkJCWludCBsZW5ndGggPSBmbGF0VGFibGUubGVuZ3RoOw0KKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJCQlpZiAoZmxhdFRhYmxlW2ldICE9IHByZXZpb3VzTGluZU51bWJlcikgew0KKwkJCQkJCXByZXZpb3VzTGluZU51bWJlciA9IGZsYXRUYWJsZVtpXTsNCisJCQkJCQkvLyB3cml0ZSB0aGUgZW50cnkNCisJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCisJCQkJCQl9DQorCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpID4+IDgpOw0KKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpOw0KKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocHJldmlvdXNMaW5lTnVtYmVyID4+IDgpOw0KKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwcmV2aW91c0xpbmVOdW1iZXI7DQorCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJKi8NCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7DQogCQkJCQkvLyB3cml0ZSB0aGUgZW50cnkNCiAJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQorCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJY29udGVudHMsDQorCQkJCQkJCTAsDQorCQkJCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCQkJCTAsDQorCQkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCiAJCQkJCX0NCi0JCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaSA+PiA4KTsNCi0JCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwcmV2aW91c0xpbmVOdW1iZXIgPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcHJldmlvdXNMaW5lTnVtYmVyOw0KKwkJCQkJaW50IHBjID0gcGNUb1NvdXJjZU1hcFRhYmxlW2krK107DQorCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHBjID4+IDgpOw0KKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHBjOw0KKwkJCQkJaW50IGxpbmVOdW1iZXIgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsNCisJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlciA+PiA4KTsNCisJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyOw0KIAkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQogCQkJCX0NCi0JCQl9DQotCQkJKi8JCQkNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDspIHsNCi0JCQkJLy8gd3JpdGUgdGhlIGVudHJ5DQotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JCQkJfQ0KLQkJCQlpbnQgcGMgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsNCi0JCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwYyA+PiA4KTsNCi0JCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHBjOw0KLQkJCQlpbnQgbGluZU51bWJlciA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOw0KLQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXIgPj4gOCk7DQotCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyOw0KLQkJCQludW1iZXJPZkVudHJpZXMrKzsNCi0JCQl9DQotCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlDQotCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMjQpOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMTYpOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7DQotCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlckF0dHJfbGVuZ3RoOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7DQotCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KLQkJCWF0dHJpYnV0ZU51bWJlcisrOw0KLQkJfQ0KLQl9DQotDQotDQotDQotCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQ0KLQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZXMpIHsNCi0JCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQotCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQotCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQkJfQ0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7DQotCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7IC8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgNCi0JCWludCBuYW1lSW5kZXg7DQotCQlpbnQgZGVzY3JpcHRvckluZGV4Ow0KLQkJaWYgKCFjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsNCi0JCQludW1iZXJPZkVudHJpZXMrKzsNCi0JCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQkJfQ0KLQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDANCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCi0JCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRoaXMpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2lnbmF0dXJlKCkpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQotCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDANCi0JCX0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpKyspIHsNCi0JCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gY29kZVN0cmVhbS5sb2NhbHNbaV07DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgew0KLQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsNCi0JCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOw0KLQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgeyAvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aA0KLQkJCQkJaW50IGN1cnJlbnRMZW5ndGg7DQotCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsNCi0JCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKFV0aWwuYmluZCgiYWJvcnQuaW52YWxpZEF0dHJpYnV0ZSIvKm5vbk5MUyovLG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIChBc3ROb2RlKSBsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLm1ldGhvZFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCk7DQotCQkJCQl9DQotCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JCQkJCX0NCi0JCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkNCi0JCQkJCW51bWJlck9mRW50cmllcysrOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0UEM7DQotCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOw0KLQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KLQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuc2lnbmF0dXJlKCkpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4Ow0KLQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsNCi0JCQkJfQ0KKwkJCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUNCisJCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDI0KTsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiAxNik7DQorCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7DQorCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJBdHRyX2xlbmd0aDsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KKwkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCiAJCQl9DQogCQl9DQotCQlpbnQgdmFsdWUgPSBudW1iZXJPZkVudHJpZXMgKiAxMCArIDI7DQotCQlsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgKz0gMjsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsNCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KLQl9DQotCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMNCi0JLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGxvY2FsQ29udGVudHMgYXJyYXkNCi0JaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQl9DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCi0NCi0JLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoDQotCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsNCi0JY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoYXQgbWV0aG9kIGNvbXBsZXRlcyB0aGUgY3JlYXRpb24gb2YgdGhlIGNvZGUgYXR0cmlidXRlIGJ5IHNldHRpbmcNCi0gKiAtIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQotICogLSBtYXhfc3RhY2sNCi0gKiAtIG1heF9sb2NhbHMNCi0gKiAtIGNvZGVfbGVuZ3RoDQotICogLSBleGNlcHRpb24gdGFibGUNCi0gKiAtIGFuZCBkZWJ1ZyBhdHRyaWJ1dGVzIGlmIG5lY2Vzc2FyeS4NCi0gKg0KLSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0NCi0gKiBAcGFyYW0gY29kZUF0dHJpYnV0ZU9mZnNldCA8Q09ERT5pbnQ8L0NPREU+DQotICovDQotcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlRm9yQ2xpbml0KGludCBjb2RlQXR0cmlidXRlT2Zmc2V0KSB7DQotCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCi0JYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07DQotCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7DQotCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBjb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlDQotCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQ0KLQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQNCi0JLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4NCi0JaW50IGNvbnRlbnRzTGVuZ3RoOw0KLQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KLQlpZiAoY29kZV9sZW5ndGggPiA2NTUzNSkgew0KLQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdChjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQotCX0NCi0JaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOw0KLQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQotDQotCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUNCi0JaW50IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID0gY29kZVN0cmVhbS5leGNlcHRpb25IYW5kbGVyc051bWJlcjsNCi0JRXhjZXB0aW9uTGFiZWxbXSBleGNlcHRpb25IYW5kbGVycyA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnM7DQotCWludCBleFNpemU7DQotCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgKGV4U2l6ZSA9IChleGNlcHRpb25IYW5kbGVyc051bWJlciAqIDggKyAyKSkgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyAoZXhTaXplID4gSU5DUkVNRU5UX1NJWkUgPyBleFNpemUgOiBJTkNSRU1FTlRfU0laRSldKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQl9DQotCS8vIHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiB0YWJsZSwgc28gd2UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgY3VycmVudCBvZmZzZXQgYW5kIG1vdmUgDQotCS8vIG9uIHRoZSBhdHRyaWJ1dGUgZ2VuZXJhdGlvbg0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXI7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXI7IGkrKykgew0KLQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXJzW2ldOw0KLQkJaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlci5zdGFydDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhcnQgPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnQ7DQotCQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlci5lbmQ7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVuZCA+PiA4KTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQotCQlpbnQgaGFuZGxlclBDID0gZXhjZXB0aW9uSGFuZGxlci5wb3NpdGlvbjsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaGFuZGxlclBDID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCi0JCWlmIChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgew0KLQkJCS8vIGFueSBleGNlcHRpb24gaGFuZGxlcg0KLQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCi0JCX0gZWxzZSB7DQotCQkJaW50IG5hbWVJbmRleDsNCi0JCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IFR5cGVCaW5kaW5nLk51bGxCaW5kaW5nKSB7DQotCQkJCS8qIHJlcHJlc2VudHMgZGVub3RlIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIHNlZSBjbGFzcyBsaXRlcmFsIGFjY2VzcyovDQotCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSk7DQotCQkJfQ0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCQl9DQotCX0NCi0NCi0JLy8gZGVidWcgYXR0cmlidXRlcw0KLQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOw0KLQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQotCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCi0NCi0JLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQ0KLQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKSB7DQotCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIA0KLQkJICogQnVpbGQgdGhlIHBhaXJzIG9mOg0KLQkJICogCShieXRlY29kZVBDIGxpbmVOdW1iZXIpDQotCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUNCi0JCSAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtDQotCQkgKi8NCi0JCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsNCi0JCWlmICgoKHBjVG9Tb3VyY2VNYXBUYWJsZSA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCkgIT0gbnVsbCkgJiYgKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgIT0gMCkpIHsNCi0JCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7DQotCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQkJfQ0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsNCi0JCQlpbnQgbGluZU51bWJlclRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCi0JCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7IC8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgNCisJCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQ0KKwkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQorCQkJaW50IGxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQogCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQotCQkJaW50IGxlbmd0aCA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemU7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7DQotCQkJCS8vIHdyaXRlIHRoZSBlbnRyeQ0KLQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQkJCX0NCi0JCQkJaW50IHBjID0gcGNUb1NvdXJjZU1hcFRhYmxlW2krK107DQotCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocGMgPj4gOCk7DQotCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwYzsNCi0JCQkJaW50IGxpbmVOdW1iZXIgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsNCi0JCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyID4+IDgpOw0KLQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlcjsNCi0JCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQotCQkJfQ0KLQkJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQ0KLQkJCWludCBsaW5lTnVtYmVyQXR0cl9sZW5ndGggPSBudW1iZXJPZkVudHJpZXMgKiA0ICsgMjsNCi0JCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDI0KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDE2KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJBdHRyX2xlbmd0aDsNCi0JCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOw0KLQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsNCi0JCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCi0JCX0NCi0JfQ0KLQ0KLQ0KLQ0KLQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCi0JaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQotCQlpbnQgbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCi0JCWludCBudW1iZXJPZkVudHJpZXMgPSAwOw0KLQkJLy8JCWNvZGVBdHRyaWJ1dGUuYWRkTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlKHRoaXMpOw0KLQkJaWYgKChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXAgIT0gbnVsbCkgJiYgKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgIT0gMCkpIHsNCi0JCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQorCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOw0KIAkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKwkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJY29udGVudHMsDQorCQkJCQkwLA0KKwkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQogCQkJfQ0KIAkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9jYWxWYXJpYWJsZU5hbWVJbmRleCA+PiA4KTsNCiAJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9jYWxWYXJpYWJsZU5hbWVJbmRleDsNCi0JCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7IC8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgNCisJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7DQorCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxvY2FsX3ZhcmlhYmxlX3RhYmxlX2xlbmd0aA0KIAkJCWludCBuYW1lSW5kZXg7DQogCQkJaW50IGRlc2NyaXB0b3JJbmRleDsNCisJCQlpZiAoIWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgew0KKwkJCQludW1iZXJPZkVudHJpZXMrKzsNCisJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJY29udGVudHMsDQorCQkJCQkJMCwNCisJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCTAsDQorCQkJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJCQl9DQorCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDANCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOw0KKwkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRoaXMpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCisJCQkJZGVzY3JpcHRvckluZGV4ID0NCisJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoDQorCQkJCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNpZ25hdHVyZSgpKTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQorCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gdGhlIHJlc29sdmVkIHBvc2l0aW9uIGZvciB0aGlzIGlzIGFsd2F5cyAwDQorCQkJfQ0KIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpKyspIHsNCiAJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGNvZGVTdHJlYW0ubG9jYWxzW2ldOw0KIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7DQogCQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsNCi0JCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbIChqIDw8IDEpICsgMV07DQorCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07DQogCQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgeyAvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aA0KIAkJCQkJCWludCBjdXJyZW50TGVuZ3RoOw0KIAkJCQkJCWlmIChlbmRQQyA9PSAtMSkgew0KLQkJCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKFV0aWwuYmluZCgiYWJvcnQuaW52YWxpZEF0dHJpYnV0ZSIvKm5vbk5MUyovLG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIChBc3ROb2RlKSBsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLm1ldGhvZFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCk7DQorCQkJCQkJCWxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoDQorCQkJCQkJCQlVdGlsLmJpbmQoImFib3J0LmludmFsaWRBdHRyaWJ1dGUiICwgbmV3IFN0cmluZyhsb2NhbFZhcmlhYmxlLm5hbWUpKSwgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQkJKEFzdE5vZGUpIGxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KTsNCiAJCQkJCQl9DQogCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCQkJY29udGVudHMsDQorCQkJCQkJCQkwLA0KKwkJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCQkJCTAsDQorCQkJCQkJCQljb250ZW50c0xlbmd0aCk7DQogCQkJCQkJfQ0KIAkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkNCiAJCQkJCQludW1iZXJPZkVudHJpZXMrKzsNCkBAIC0xNDQxLDI3MSArMTQzOCw2MTYgQEAKIAkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7DQogCQkJYXR0cmlidXRlTnVtYmVyKys7DQogCQl9DQotCX0NCi0JLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KLQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkNCi0JaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQl9DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCi0JLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoDQotCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsNCi0JY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoYXQgbWV0aG9kIGNvbXBsZXRlcyB0aGUgY3JlYXRpb24gb2YgdGhlIGNvZGUgYXR0cmlidXRlIGJ5IHNldHRpbmcNCi0gKiAtIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQotICogLSBtYXhfc3RhY2sNCi0gKiAtIG1heF9sb2NhbHMNCi0gKiAtIGNvZGVfbGVuZ3RoDQotICogLSBleGNlcHRpb24gdGFibGUNCi0gKiAtIGFuZCBkZWJ1ZyBhdHRyaWJ1dGVzIGlmIG5lY2Vzc2FyeS4NCi0gKg0KLSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0NCi0gKiBAcGFyYW0gY29kZUF0dHJpYnV0ZU9mZnNldCA8Q09ERT5pbnQ8L0NPREU+DQotICogQHBhcmFtIGV4Y2VwdGlvbkhhbmRsZXIgaW50W10NCi0gKiBAcGFyYW0gc3RhcnRJbmRleGVzIGludFtdDQotICovDQotcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlRm9yQ2xpbml0KGludCBjb2RlQXR0cmlidXRlT2Zmc2V0LCBpbnRbXSBleGNlcHRpb25IYW5kbGVyLCBpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQotCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCi0JYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07DQotCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7DQotCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBjb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlDQotCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQ0KLQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQNCi0JLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4NCi0JaW50IGNvbnRlbnRzTGVuZ3RoOw0KLQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KLQlpZiAoY29kZV9sZW5ndGggPiA2NTUzNSkgew0KLQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdChjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQotCX0NCi0JaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOw0KLQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQotDQotCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsNCi0JaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlclswXTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0Ow0KLQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlclsxXTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7DQotCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQotCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25IYW5kbGVyWzJdOw0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCi0JaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0V4Y2VwdGlvbigpOw0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCi0JDQotCS8vIGRlYnVnIGF0dHJpYnV0ZXMNCi0JaW50IGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsgLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aA0KLQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCi0NCi0JLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQ0KLQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKSB7DQotCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIA0KLQkJICAgICogQnVpbGQgdGhlIHBhaXJzIG9mOg0KLQkJICAgICogKGJ5dGVjb2RlUEMgbGluZU51bWJlcikNCi0JCSAgICAqIGFjY29yZGluZyB0byB0aGUgdGFibGUgb2Ygc3RhcnQgbGluZSBpbmRleGVzIGFuZCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZQ0KLQkJICAgICogY29udGFpbmVkIGludG8gdGhlIGNvZGVzdHJlYW0NCi0JCSAgICAqLw0KLQkJaW50IGluZGV4ID0gMCwgbWF4ID0gc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGg7DQotCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDY7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsNCi0JCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMA0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHByb2JsZW1MaW5lOw0KLQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlDQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCi0JfQ0KLQ0KLQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCi0JaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQotCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQotCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KKwkJLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGxvY2FsQ29udGVudHMgYXJyYXkNCisJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMg0KKwkJCT49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQogCQl9DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9jYWxWYXJpYWJsZU5hbWVJbmRleDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDI7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KLQl9DQotCQ0KLQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQotCS8vIGVuc3VyZSBmaXJzdCB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW5zaWRlIHRoZSBjb250ZW50cyBhcnJheQ0KLQlpZiAoY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCArIDIgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCX0NCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KLQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgNCi0JaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOw0KLQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZw0KLSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCi0gKiAtIG1heF9zdGFjaw0KLSAqIC0gbWF4X2xvY2Fscw0KLSAqIC0gY29kZV9sZW5ndGgNCi0gKiAtIGV4Y2VwdGlvbiB0YWJsZQ0KLSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5Lg0KLSAqDQotICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQ0KLSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4NCi0gKiBAcGFyYW0gZXhjZXB0aW9uSGFuZGxlciBpbnRbXSANCi0gKi8NCi1wdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBNZXRob2RCaW5kaW5nIGJpbmRpbmcsIGludCBjb2RlQXR0cmlidXRlT2Zmc2V0LCBpbnRbXSBleGNlcHRpb25IYW5kbGVyLCBpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQotCS8vIHJlaW5pdGlhbGl6ZSB0aGUgbG9jYWxDb250ZW50cyB3aXRoIHRoZSBieXRlIG1vZGlmaWVkIGJ5IHRoZSBjb2RlIHN0cmVhbQ0KLQlieXRlW10gbG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gY29kZVN0cmVhbS5iQ29kZVN0cmVhbTsNCi0JaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSBjb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsNCi0JLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGxvY2FsQ29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldC8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uDQotCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4Ow0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7DQotCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOw0KLQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTFdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAxNik7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCi0JLy8gd3JpdGUgdGhlIGV4Y2VwdGlvbiB0YWJsZQ0KLQlpbnQgY29udGVudHNMZW5ndGg7DQotCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCX0NCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsNCi0JaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlclswXTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0Ow0KLQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlclsxXTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7DQotCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQotCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25IYW5kbGVyWzJdOw0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCi0JaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0V4Y2VwdGlvbigpOw0KLQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsgLy8gZGVidWcgYXR0cmlidXRlcw0KLQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQotCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQ0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCiANCi0JaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykgew0KLQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSANCi0JCSAgICAqIEJ1aWxkIHRoZSBwYWlycyBvZjoNCi0JCSAgICAqIChieXRlY29kZVBDIGxpbmVOdW1iZXIpDQotCQkgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUNCi0JCSAgICAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtDQotCQkgICAgKi8NCi0JCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4Ow0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOw0KLQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsNCi0JCQlwcm9ibGVtTGluZSA9IHNlYXJjaExpbmVOdW1iZXIoc3RhcnRMaW5lSW5kZXhlcywgYmluZGluZy5zb3VyY2VTdGFydCgpKTsNCi0JCX0NCi0JCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMA0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHByb2JsZW1MaW5lOw0KLQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlDQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCS8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGxlbmd0aA0KKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDNdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDE2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsNCisJCWNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCiAJfQ0KIA0KLQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCi0JaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQotCQkvLyBjb21wdXRlIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kDQotCQlpbnQgYXJnU2l6ZTsNCi0JCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQotCQkvLwkJY29kZUF0dHJpYnV0ZS5hZGRMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUodGhpcyk7DQotCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQotCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZw0KKwkgKiAtIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQorCSAqIC0gbWF4X3N0YWNrDQorCSAqIC0gbWF4X2xvY2Fscw0KKwkgKiAtIGNvZGVfbGVuZ3RoDQorCSAqIC0gZXhjZXB0aW9uIHRhYmxlDQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5Lg0KKwkgKg0KKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtDQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4NCisJICovDQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdChpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCkgew0KKwkJLy8gcmVpbml0aWFsaXplIHRoZSBjb250ZW50cyB3aXRoIHRoZSBieXRlIG1vZGlmaWVkIGJ5IHRoZSBjb2RlIHN0cmVhbQ0KKwkJYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07DQorCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0Ow0KKwkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGNvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUNCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQ0KKwkJLy8gVGhhdCBtZWFucyB0aGF0IHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoIHlvdSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSB2YWx1ZSBvZiBjb2RlQXR0cmlidXRlT2Zmc2V0DQorCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLg0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJaW50IGNvZGVfbGVuZ3RoID0gY29kZVN0cmVhbS5wb3NpdGlvbjsNCisJCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7DQorCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdCgNCisJCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOw0KIAkJfQ0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7DQotCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7IC8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgNCi0JCWludCBkZXNjcmlwdG9ySW5kZXg7DQotCQlpZiAoIWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgew0KLQkJCW51bWJlck9mRW50cmllcysrOw0KLQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMjAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4Ow0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsNCisJCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTJdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCisNCisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUNCisJCWludCBleGNlcHRpb25IYW5kbGVyc051bWJlciA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXI7DQorCQlFeGNlcHRpb25MYWJlbFtdIGV4Y2VwdGlvbkhhbmRsZXJzID0gY29kZVN0cmVhbS5leGNlcHRpb25IYW5kbGVyczsNCisJCWludCBleFNpemU7DQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIChleFNpemUgPSAoZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXIgKiA4ICsgMikpDQorCQkJPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShsb2NhbENvbnRlbnRzID0NCisJCQkJCWNvbnRlbnRzID0NCisJCQkJCQluZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIChleFNpemUgPiBJTkNSRU1FTlRfU0laRSA/IGV4U2l6ZSA6IElOQ1JFTUVOVF9TSVpFKV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIA0KKwkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uDQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25IYW5kbGVyc051bWJlcjsgaSsrKSB7DQorCQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXJzW2ldOw0KKwkJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXIuc3RhcnQ7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnQ7DQorCQkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXIuZW5kOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZW5kID4+IDgpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQorCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkhhbmRsZXIucG9zaXRpb247DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCisJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsNCisJCQkJLy8gYW55IGV4Y2VwdGlvbiBoYW5kbGVyDQorCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCisJCQl9IGVsc2Ugew0KKwkJCQlpbnQgbmFtZUluZGV4Ow0KKwkJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IFR5cGVCaW5kaW5nLk51bGxCaW5kaW5nKSB7DQorCQkJCQkvKiByZXByZXNlbnRzIGRlbm90ZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBzZWUgY2xhc3MgbGl0ZXJhbCBhY2Nlc3MqLw0KKwkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUpOw0KKwkJCQl9DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KIAkJCX0NCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQotCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UaGlzKTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KLQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNpZ25hdHVyZSgpKTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsNCi0JCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4Ow0KLQkJCS8vIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhpcyBpcyBhbHdheXMgMA0KLQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCiAJCX0NCi0JCWlmIChiaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOw0KLQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKSkgew0KLQkJCQlOZXN0ZWRUeXBlQmluZGluZyBtZXRob2REZWNsYXJpbmdDbGFzcyA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7DQotCQkJCWFyZ1NpemUgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNBcmd1bWVudHNPZmZzZXQ7DQotCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50czsNCi0JCQkJaWYgKChzeW50aGV0aWNBcmd1bWVudHMgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKSkgIT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGUgPSBzeW50aGV0aWNBcmd1bWVudHNbaV07DQorCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzDQorCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsNCisJCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCisNCisJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsNCisJCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIA0KKwkJCSAqIEJ1aWxkIHRoZSBwYWlycyBvZjoNCisJCQkgKiAJKGJ5dGVjb2RlUEMgbGluZU51bWJlcikNCisJCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUNCisJCQkgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQ0KKwkJCSAqLw0KKwkJCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsNCisJCQlpZiAoKChwY1RvU291cmNlTWFwVGFibGUgPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXApICE9IG51bGwpDQorCQkJCSYmIChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7DQorCQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0NCisJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7DQorCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJY29udGVudHMsDQorCQkJCQkJMCwNCisJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCTAsDQorCQkJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJCQl9DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7DQorCQkJCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7DQorCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgNCisJCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQorCQkJCWludCBsZW5ndGggPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplOw0KKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDspIHsNCisJCQkJCS8vIHdyaXRlIHRoZSBlbnRyeQ0KKwkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJCWNvbnRlbnRzLA0KKwkJCQkJCQkwLA0KKwkJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCQkwLA0KKwkJCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJCQl9DQorCQkJCQlpbnQgcGMgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsNCisJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocGMgPj4gOCk7DQorCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcGM7DQorCQkJCQlpbnQgbGluZU51bWJlciA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOw0KKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyID4+IDgpOw0KKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXI7DQorCQkJCQludW1iZXJPZkVudHJpZXMrKzsNCisJCQkJfQ0KKwkJCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUNCisJCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDI0KTsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiAxNik7DQorCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7DQorCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJBdHRyX2xlbmd0aDsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KKwkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCQl9DQorCQl9DQorCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykgew0KKwkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KKwkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOw0KKwkJCS8vCQljb2RlQXR0cmlidXRlLmFkZExvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZSh0aGlzKTsNCisJCQlpZiAoKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCAhPSBudWxsKQ0KKwkJCQkmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZSAhPSAwKSkgew0KKwkJCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9DQorCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOw0KKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCWNvbnRlbnRzLA0KKwkJCQkJCTAsDQorCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCQkwLA0KKwkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCQkJfQ0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4Ow0KKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7DQorCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgNCisJCQkJaW50IG5hbWVJbmRleDsNCisJCQkJaW50IGRlc2NyaXB0b3JJbmRleDsNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkrKykgew0KKwkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGNvZGVTdHJlYW0ubG9jYWxzW2ldOw0KKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgew0KKwkJCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOw0KKwkJCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsNCisJCQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgeyAvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aA0KKwkJCQkJCQlpbnQgY3VycmVudExlbmd0aDsNCisJCQkJCQkJaWYgKGVuZFBDID09IC0xKSB7DQorCQkJCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKA0KKwkJCQkJCQkJCVV0aWwuYmluZCgiYWJvcnQuaW52YWxpZEF0dHJpYnV0ZSIgLCBuZXcgU3RyaW5nKGxvY2FsVmFyaWFibGUubmFtZSkpLCAvLyROT04tTkxTLTEkDQorCQkJCQkJCQkJKEFzdE5vZGUpIGxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJCQljb250ZW50cywNCisJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCQkJCQkJMCwNCisJCQkJCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJCQkJCX0NCisJCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQ0KKwkJCQkJCQludW1iZXJPZkVudHJpZXMrKzsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOw0KKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsNCisJCQkJCQkJaW50IGxlbmd0aCA9IGVuZFBDIC0gc3RhcnRQQzsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7DQorCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS5uYW1lKTsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQorCQkJCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS50eXBlLnNpZ25hdHVyZSgpKTsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQorCQkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOw0KKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlpbnQgdmFsdWUgPSBudW1iZXJPZkVudHJpZXMgKiAxMCArIDI7DQorCQkJCWxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCArPSAyOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KKwkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCQl9DQorCQl9DQorCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzDQorCQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkNCisJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMg0KKwkJCT49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoDQorCQlpbnQgY29kZUF0dHJpYnV0ZUxlbmd0aCA9IGxvY2FsQ29udGVudHNPZmZzZXQgLSAoY29kZUF0dHJpYnV0ZU9mZnNldCArIDYpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNF0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOw0KKwkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGF0IG1ldGhvZCBjb21wbGV0ZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZSBieSBzZXR0aW5nDQorCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCisJICogLSBtYXhfc3RhY2sNCisJICogLSBtYXhfbG9jYWxzDQorCSAqIC0gY29kZV9sZW5ndGgNCisJICogLSBleGNlcHRpb24gdGFibGUNCisJICogLSBhbmQgZGVidWcgYXR0cmlidXRlcyBpZiBuZWNlc3NhcnkuDQorCSAqDQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0NCisJICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KKwkgKiBAcGFyYW0gZXhjZXB0aW9uSGFuZGxlciBpbnRbXQ0KKwkgKiBAcGFyYW0gc3RhcnRJbmRleGVzIGludFtdDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JDbGluaXQoDQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwNCisJCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIsDQorCQlpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQorCQkvLyByZWluaXRpYWxpemUgdGhlIGNvbnRlbnRzIHdpdGggdGhlIGJ5dGUgbW9kaWZpZWQgYnkgdGhlIGNvZGUgc3RyZWFtDQorCQlieXRlW10gbG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gY29kZVN0cmVhbS5iQ29kZVN0cmVhbTsNCisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7DQorCQkvLyBjb2RlQXR0cmlidXRlT2Zmc2V0IGlzIHRoZSBwb3NpdGlvbiBpbnNpZGUgY29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZQ0KKwkJLy8gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlQXR0cmlidXRlDQorCQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQNCisJCS8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uDQorCQlpbnQgY29udGVudHNMZW5ndGg7DQorCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KKwkJaWYgKGNvZGVfbGVuZ3RoID4gNjU1MzUpIHsNCisJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KA0KKwkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQorCQl9DQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7DQorCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQorDQorCQkvLyB3cml0ZSB0aGUgZXhjZXB0aW9uIHRhYmxlDQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsNCisJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXJbMF07DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0ID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0Ow0KKwkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXJbMV07DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVuZCA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7DQorCQlpbnQgaGFuZGxlclBDID0gZXhjZXB0aW9uSGFuZGxlclsyXTsNCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaGFuZGxlclBDID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsNCisJCWludCBuYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdFeGNlcHRpb24oKTsNCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCisNCisJCS8vIGRlYnVnIGF0dHJpYnV0ZXMNCisJCWludCBjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQorCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCisNCisJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsNCisJCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIA0KKwkJCSAgICAqIEJ1aWxkIHRoZSBwYWlycyBvZjoNCisJCQkgICAgKiAoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQ0KKwkJCSAgICAqIGFjY29yZGluZyB0byB0aGUgdGFibGUgb2Ygc3RhcnQgbGluZSBpbmRleGVzIGFuZCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZQ0KKwkJCSAgICAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtDQorCQkJICAgICovDQorCQkJaW50IGluZGV4ID0gMCwgbWF4ID0gc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGg7DQorCQkJaW50IGxpbmVOdW1iZXJOYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSA2Ow0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsNCisJCQkvLyBmaXJzdCBlbnRyeSBhdCBwYyA9IDANCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwcm9ibGVtTGluZSA+PiA4KTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcHJvYmxlbUxpbmU7DQorCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlDQorCQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQl9DQorCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykgew0KKwkJCWludCBsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVGFibGVOYW1lKTsNCisJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQljb250ZW50cywNCisJCQkJCTAsDQorCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJMCwNCisJCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCQl9DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4Ow0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDI7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkJfQ0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KKwkJLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGNvbnRlbnRzIGFycmF5DQorCQlpZiAoY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCArIDINCisJCQk+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQljb250ZW50cywNCisJCQkJMCwNCisJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJMCwNCisJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJfQ0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisJCS8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGxlbmd0aA0KKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDNdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDE2KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsNCisJCWNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCisJfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZw0KKwkgKiAtIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoDQorCSAqIC0gbWF4X3N0YWNrDQorCSAqIC0gbWF4X2xvY2Fscw0KKwkgKiAtIGNvZGVfbGVuZ3RoDQorCSAqIC0gZXhjZXB0aW9uIHRhYmxlDQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5Lg0KKwkgKg0KKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtDQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4NCisJICogQHBhcmFtIGV4Y2VwdGlvbkhhbmRsZXIgaW50W10gDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKA0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsDQorCQlNZXRob2RCaW5kaW5nIGJpbmRpbmcsDQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwNCisJCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIsDQorCQlpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQorCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCisJCWJ5dGVbXSBsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOw0KKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSBjb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsNCisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUvLyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVBdHRyaWJ1dGUvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLg0KKwkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOw0KKwkJaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsNCisJCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTJdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUNCisJCWludCBjb250ZW50c0xlbmd0aDsNCisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOw0KKwkJaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlclswXTsNCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhcnQgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnQ7DQorCQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlclsxXTsNCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZW5kID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVuZDsNCisJCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25IYW5kbGVyWzJdOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaGFuZGxlclBDOw0KKwkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0V4Y2VwdGlvbigpOw0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQorCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OyAvLyBkZWJ1ZyBhdHRyaWJ1dGVzDQorCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsgLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aA0KKwkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlDQorDQorCQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKSB7DQorCQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSANCisJCQkgICAgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6DQorCQkJICAgICogKGJ5dGVjb2RlUEMgbGluZU51bWJlcikNCisJCQkgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUNCisJCQkgICAgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQ0KKwkJCSAgICAqLw0KKwkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDE7DQorCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsNCisJCQkJcHJvYmxlbUxpbmUgPSBzZWFyY2hMaW5lTnVtYmVyKHN0YXJ0TGluZUluZGV4ZXMsIGJpbmRpbmcuc291cmNlU3RhcnQoKSk7DQorCQkJfQ0KKwkJCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMA0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwcm9ibGVtTGluZTsNCisJCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCX0NCisJCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQ0KKwkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQorCQkJLy8gY29tcHV0ZSB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZA0KKwkJCWludCBhcmdTaXplOw0KKwkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KKwkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOw0KKwkJCS8vCQljb2RlQXR0cmlidXRlLmFkZExvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZSh0aGlzKTsNCisJCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9DQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQorCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KKwkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJY29udGVudHMsDQorCQkJCQkwLA0KKwkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9jYWxWYXJpYWJsZU5hbWVJbmRleCA+PiA4KTsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9jYWxWYXJpYWJsZU5hbWVJbmRleDsNCisJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7DQorCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxvY2FsX3ZhcmlhYmxlX3RhYmxlX2xlbmd0aA0KKwkJCWludCBkZXNjcmlwdG9ySW5kZXg7DQorCQkJaWYgKCFjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsNCisJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQorCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCWNvbnRlbnRzLA0KKwkJCQkJCTAsDQorCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCQkwLA0KKwkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCQkJfQ0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQorCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVGhpcyk7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KKwkJCQlkZXNjcmlwdG9ySW5kZXggPQ0KKwkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgNCisJCQkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2lnbmF0dXJlKCkpOw0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsNCisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCisJCQkJLy8gdGhlIHJlc29sdmVkIHBvc2l0aW9uIGZvciB0aGlzIGlzIGFsd2F5cyAwDQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJfQ0KKwkJCWlmIChiaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgew0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsNCisJCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7DQorCQkJCQlOZXN0ZWRUeXBlQmluZGluZyBtZXRob2REZWNsYXJpbmdDbGFzcyA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7DQorCQkJCQlhcmdTaXplID0gbWV0aG9kRGVjbGFyaW5nQ2xhc3Muc3ludGhldGljQXJndW1lbnRzT2Zmc2V0Ow0KKwkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzOw0KKwkJCQkJaWYgKChzeW50aGV0aWNBcmd1bWVudHMgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKSkNCisJCQkJCQkhPSBudWxsKSB7DQorCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KKwkJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gc3ludGhldGljQXJndW1lbnRzW2ldOw0KKwkJCQkJCQlpbnQgY3VycmVudExlbmd0aDsNCisJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJCQkJY29udGVudHMsDQorCQkJCQkJCQkJMCwNCisJCQkJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCQkJCTAsDQorCQkJCQkJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJCQkJCQl9DQorCQkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkNCisJCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCisJCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOw0KKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCisJCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuc2lnbmF0dXJlKCkpOw0KKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCisJCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247DQorCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsNCisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHJlc29sdmVkUG9zaXRpb247DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJYXJnU2l6ZSA9IDE7DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlhcmdTaXplID0gYmluZGluZy5pc1N0YXRpYygpID8gMCA6IDE7DQorCQkJfQ0KKwkJCWlmIChtZXRob2QuYmluZGluZyAhPSBudWxsKSB7DQorCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZC5iaW5kaW5nLnBhcmFtZXRlcnM7DQorCQkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kLmFyZ3VtZW50czsNCisJCQkJaWYgKChwYXJhbWV0ZXJzICE9IG51bGwpICYmIChhcmd1bWVudHMgIT0gbnVsbCkpIHsNCisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorCQkJCQkJVHlwZUJpbmRpbmcgYXJndW1lbnRCaW5kaW5nID0gcGFyYW1ldGVyc1tpXTsNCiAJCQkJCQlpbnQgY3VycmVudExlbmd0aDsNCiAJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgew0KLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJCQljb250ZW50cywNCisJCQkJCQkJCTAsDQorCQkJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkJCQkJMCwNCisJCQkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCiAJCQkJCQl9DQogCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQ0KIAkJCQkJCW51bWJlck9mRW50cmllcysrOw0KQEAgLTE3MTMsNzIyICsyMDU1LDgwOCBAQAogCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCiAJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KIAkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb2RlX2xlbmd0aDsNCi0JCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7DQorCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhcmd1bWVudHNbaV0ubmFtZSk7DQogCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQogCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCi0JCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUudHlwZS5zaWduYXR1cmUoKSk7DQorCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhcmd1bWVudEJpbmRpbmcuc2lnbmF0dXJlKCkpOw0KIAkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOw0KIAkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQotCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247DQorCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBhcmdTaXplOw0KKwkJCQkJCWlmICgoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkxvbmdCaW5kaW5nKQ0KKwkJCQkJCQl8fCAoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkRvdWJsZUJpbmRpbmcpKQ0KKwkJCQkJCQlhcmdTaXplICs9IDI7DQorCQkJCQkJZWxzZQ0KKwkJCQkJCQlhcmdTaXplKys7DQogCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOw0KIAkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOw0KIAkJCQkJfQ0KIAkJCQl9DQorCQkJfQ0KKwkJCWludCB2YWx1ZSA9IG51bWJlck9mRW50cmllcyAqIDEwICsgMjsNCisJCQlsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgKz0gMjsNCisJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOw0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7DQorCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCX0NCisJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgbG9jYWxDb250ZW50cyBhcnJheQ0KKwkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyDQorCQkJPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOw0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7DQorCQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgNCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAyXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7DQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsNCisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDVdID0gKGJ5dGUpIGNvZGVBdHRyaWJ1dGVMZW5ndGg7DQorCQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoYXQgbWV0aG9kIGNvbXBsZXRlcyB0aGUgY3JlYXRpb24gb2YgdGhlIGNvZGUgYXR0cmlidXRlIGJ5IHNldHRpbmcNCisJICogLSB0aGUgYXR0cmlidXRlX2xlbmd0aA0KKwkgKiAtIG1heF9zdGFjaw0KKwkgKiAtIG1heF9sb2NhbHMNCisJICogLSBjb2RlX2xlbmd0aA0KKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQ0KKwkgKiAtIGFuZCBkZWJ1ZyBhdHRyaWJ1dGVzIGlmIG5lY2Vzc2FyeS4NCisJICoNCisJICogQHBhcmFtIGJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nDQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0NCisJICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KKwkgKi8NCisJcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlRm9yU3ludGhldGljQWNjZXNzTWV0aG9kKA0KKwkJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBiaW5kaW5nLA0KKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsDQorCQlpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQorCQkvLyByZWluaXRpYWxpemUgdGhlIGNvbnRlbnRzIHdpdGggdGhlIGJ5dGUgbW9kaWZpZWQgYnkgdGhlIGNvZGUgc3RyZWFtDQorCQljb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07DQorCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0Ow0KKwkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGNvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUNCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQ0KKwkJLy8gVGhhdCBtZWFucyB0aGF0IHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoIHlvdSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSB2YWx1ZSBvZiBjb2RlQXR0cmlidXRlT2Zmc2V0DQorCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLg0KKwkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7DQorCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsNCisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7DQorCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7DQorCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQorCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTNdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOw0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJaWYgKChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNDApID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQljb250ZW50cywNCisJCQkJMCwNCisJCQkJKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIA0KKwkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uDQorCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7DQorCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzDQorCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsNCisJCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsNCisNCisJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUNCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsNCisJCQlpbnQgaW5kZXggPSAwLCBtYXggPSBzdGFydExpbmVJbmRleGVzLmxlbmd0aDsNCisJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9DQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCisJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7DQorCQkJaW50IGxpbmVOdW1iZXJUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2Ow0KKwkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgNCisJCQkvLyBTZWVtcyBsaWtlIGRvIHdvdWxkIGJlIGJldHRlciwgYnV0IHRoaXMgcHJlc2VydmVzIHRoZSBleGlzdGluZyBiZWhhdmlvci4NCisJCQlpbmRleCA9IHNlYXJjaExpbmVOdW1iZXIoc3RhcnRMaW5lSW5kZXhlcywgYmluZGluZy5zb3VyY2VTdGFydCk7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleDsNCisJCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUNCisJCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSA2Ow0KKwkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMTsNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCX0NCisJCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQ0KKwkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7DQorCQkJaW50IGxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQorCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOw0KKwkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4Ow0KKwkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsNCisJCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbG9jYWxfdmFyaWFibGVfdGFibGVfbGVuZ3RoDQorCQkJaW50IG5hbWVJbmRleDsNCisJCQlpbnQgZGVzY3JpcHRvckluZGV4Ow0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpKyspIHsNCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGNvZGVTdHJlYW0ubG9jYWxzW2ldOw0KKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7DQorCQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsNCisJCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsNCisJCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7IC8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoDQorCQkJCQkJaW50IGN1cnJlbnRMZW5ndGg7DQorCQkJCQkJaWYgKGVuZFBDID09IC0xKSB7DQorCQkJCQkJCWxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoDQorCQkJCQkJCQlVdGlsLmJpbmQoImFib3J0LmludmFsaWRBdHRyaWJ1dGUiICwgbmV3IFN0cmluZyhsb2NhbFZhcmlhYmxlLm5hbWUpKSwgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQkJKEFzdE5vZGUpIGxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KTsNCisJCQkJCQl9DQorCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJCWNvbnRlbnRzLA0KKwkJCQkJCQkJMCwNCisJCQkJCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJCQkJCTAsDQorCQkJCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJCQkJfQ0KKwkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkNCisJCQkJCQludW1iZXJPZkVudHJpZXMrKzsNCisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOw0KKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsNCisJCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOw0KKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsNCisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsNCisJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7DQorCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KKwkJCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS50eXBlLnNpZ25hdHVyZSgpKTsNCisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQorCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7DQorCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247DQorCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsNCisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHJlc29sdmVkUG9zaXRpb247DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOw0KKwkJCWxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCArPSAyOw0KKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOw0KKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOw0KKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7DQorCQkJY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOw0KKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOw0KKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkJfQ0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KKwkJLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGNvbnRlbnRzIGFycmF5DQorCQlpZiAoY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCArIDIgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisNCisJCS8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGxlbmd0aA0KKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsNCisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAyXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7DQorCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDVdID0gKGJ5dGUpIGNvZGVBdHRyaWJ1dGVMZW5ndGg7DQorCQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBpbmZvIGJ5IHNldHRpbmcgdXAgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGF0IHRoZSByaWdodCBvZmZzZXQuDQorCSAqDQorCSAqIEBwYXJhbSBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KKwkgKiBAcGFyYW0gYXR0cmlidXRlTnVtYmVyIDxDT0RFPmludDwvQ09ERT4gDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1ldGhvZEluZm8oDQorCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LA0KKwkJaW50IGF0dHJpYnV0ZU51bWJlcikgew0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KKwkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7DQorCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsNCisJfQ0KKw0KKwkvKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBJbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWUgY29tcHV0ZWQgYXMgdGhleSBhcmUgZ2VuZXJhdGVkLCBzaW5jZSBzb21lIG1heSBub3QNCisJICogYmUgYWN0dWFsbHkgb3V0cHV0ZWQgaWYgc2l0dGluZyBpbnNpZGUgdW5yZWFjaGFibGUgY29kZS4NCisJICoNCisJICogQHBhcmFtIGxvY2FsVHlwZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVHlwZUJpbmRpbmcNCisJICovDQorCXB1YmxpYyBjaGFyW10gY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUpIHsNCisJCWlmIChsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gbG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoKTsNCisJCX0NCisJCS8vIGRlbGVnYXRlcyB0byB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBjbGFzc2ZpbGUsIHNpbmNlIGl0IGlzIHRoZSBvbmx5IG9uZSB3aXRoIGEgZ2xvYmFsIHZpc2lvbiBvZiBpdHMgaW5uZXJ0eXBlcy4NCisJCWlmIChlbmNsb3NpbmdDbGFzc0ZpbGUgIT0gbnVsbCkgew0KKwkJCXJldHVybiB0aGlzLm91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpLmNvbXB1dGVDb25zdGFudFBvb2xOYW1lKGxvY2FsVHlwZSk7DQorCQl9DQorCQlpZiAobmFtZVVzYWdlID09IG51bGwpDQorCQkJbmFtZVVzYWdlID0gbmV3IEhhc2h0YWJsZU9mVHlwZSgpOw0KKw0KKwkJLy8gZW5zdXJlIHRoZXJlIGlzIG5vdCBhbHJlYWR5IHN1Y2ggYSBsb2NhbCB0eXBlIG5hbWUgZGVmaW5lZCBieSB0aGUgdXNlcg0KKwkJaW50IGluZGV4ID0gMDsNCisJCWNoYXJbXSBjYW5kaWRhdGVOYW1lOw0KKwkJd2hpbGUodHJ1ZSkgew0KKwkJCWlmIChsb2NhbFR5cGUuaXNNZW1iZXJUeXBlKCkpew0KKwkJCQlpZiAoaW5kZXggPT0gMCl7DQorCQkJCQljYW5kaWRhdGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoDQorCQkJCQkJbG9jYWxUeXBlLmVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCksDQorCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUsDQorCQkJCQkJJyQnKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCS8vIGluIGNhc2Ugb2YgY29sbGlzaW9uLCB0aGVuIG1lbWJlciBuYW1lIGdldHMgZXh0cmEgJDEgaW5zZXJ0ZWQNCisJCQkJCS8vIGUuZy4gY2xhc3MgWCB7IHsgY2xhc3MgTHt9IG5ldyBYKCl7IGNsYXNzIEx7fSB9IH0gfQ0KKwkJCQkJY2FuZGlkYXRlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KA0KKwkJCQkJCWxvY2FsVHlwZS5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpLA0KKwkJCQkJCSckJywNCisJCQkJCQlTdHJpbmcudmFsdWVPZihpbmRleCkudG9DaGFyQXJyYXkoKSwNCisJCQkJCQknJCcsDQorCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUpOw0KKwkJCQl9DQorCQkJfSBlbHNlIGlmIChsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpew0KKwkJCQkJY2FuZGlkYXRlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KA0KKwkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLA0KKwkJCQkJCVN0cmluZy52YWx1ZU9mKGluZGV4KzEpLnRvQ2hhckFycmF5KCksDQorCQkJCQkJJyQnKTsNCiAJCQl9IGVsc2Ugew0KLQkJCQlhcmdTaXplID0gMTsNCisJCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgNCisJCQkJCQlyZWZlcmVuY2VCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwNCisJCQkJCQknJCcsDQorCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5kZXgrMSkudG9DaGFyQXJyYXkoKSwNCisJCQkJCQknJCcsDQorCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUpOw0KKwkJCX0JCQkJCQkNCisJCQlpZiAobmFtZVVzYWdlLmdldChjYW5kaWRhdGVOYW1lKSAhPSBudWxsKSB7DQorCQkJCWluZGV4ICsrOw0KKwkJCX0gZWxzZSB7DQorCQkJCW5hbWVVc2FnZS5wdXQoY2FuZGlkYXRlTmFtZSwgbG9jYWxUeXBlKTsNCisJCQkJYnJlYWs7DQogCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGNhbmRpZGF0ZU5hbWU7DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFJlcXVlc3QgdGhlIGNyZWF0aW9uIG9mIGEgQ2xhc3NGaWxlIGNvbXBhdGlibGUgcmVwcmVzZW50YXRpb24gb2YgYSBwcm9ibGVtYXRpYyB0eXBlDQorCSAqDQorCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24NCisJICogQHBhcmFtIHVuaXRSZXN1bHQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uVW5pdFJlc3VsdA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVByb2JsZW1UeXBlKA0KKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwNCisJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQpIHsNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7DQorCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gbmV3IENsYXNzRmlsZSh0eXBlQmluZGluZywgbnVsbCwgdHJ1ZSk7DQorDQorCQkvLyBpbm5lciBhdHRyaWJ1dGVzDQorCQlpZiAodHlwZUJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpDQorCQkJY2xhc3NGaWxlLnJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKHR5cGVCaW5kaW5nKTsNCisNCisJCS8vIGFkZCBpdHMgZmllbGRzDQorCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSB0eXBlQmluZGluZy5maWVsZHM7DQorCQlpZiAoKGZpZWxkcyAhPSBudWxsKSAmJiAoZmllbGRzICE9IE5vRmllbGRzKSkgew0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJaWYgKGZpZWxkc1tpXS5jb25zdGFudCA9PSBudWxsKSB7DQorCQkJCQlGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZHNbaV0sIGZhbHNlLCBudWxsLCAwKTsNCisJCQkJfQ0KKwkJCX0NCisJCQljbGFzc0ZpbGUuYWRkRmllbGRJbmZvcygpOw0KIAkJfSBlbHNlIHsNCi0JCQlhcmdTaXplID0gYmluZGluZy5pc1N0YXRpYygpID8gMCA6IDE7DQorCQkJLy8gd2UgaGF2ZSB0byBzZXQgdGhlIG51bWJlciBvZiBmaWVsZHMgdG8gYmUgZXF1YWxzIHRvIDANCisJCQljbGFzc0ZpbGUuY29udGVudHNbY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljbGFzc0ZpbGUuY29udGVudHNbY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsNCiAJCX0NCi0JCWlmIChtZXRob2QuYmluZGluZyAhPSBudWxsKSB7DQotCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmJpbmRpbmcucGFyYW1ldGVyczsNCi0JCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZC5hcmd1bWVudHM7DQotCQkJaWYgKChwYXJhbWV0ZXJzICE9IG51bGwpICYmIChhcmd1bWVudHMgIT0gbnVsbCkpIHsNCi0JCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCi0JCQkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50QmluZGluZyA9IHBhcmFtZXRlcnNbaV07DQotCQkJCQlpbnQgY3VycmVudExlbmd0aDsNCi0JCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7DQotCQkJCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQ0KLQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7DQotCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFyZ3VtZW50c1tpXS5uYW1lKTsNCi0JCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCi0JCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoYXJndW1lbnRCaW5kaW5nLnNpZ25hdHVyZSgpKTsNCi0JCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOw0KLQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCi0JCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gYXJnU2l6ZTsNCi0JCQkJCWlmICgoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkxvbmdCaW5kaW5nKSB8fCAoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkRvdWJsZUJpbmRpbmcpKQ0KLQkJCQkJCWFyZ1NpemUgKz0gMjsNCi0JCQkJCWVsc2UNCi0JCQkJCQlhcmdTaXplKys7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7DQotCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsNCi0JCQkJfQ0KLQkJCX0NCisJCS8vIGxlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBtZXRob2RDb3VudA0KKwkJY2xhc3NGaWxlLnNldEZvck1ldGhvZEluZm9zKCk7DQorCQkvLyBhZGQgaXRzIHVzZXIgZGVmaW5lZCBtZXRob2RzDQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLm1ldGhvZHM7DQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7DQorCQlpbnQgbWF4TWV0aG9kRGVjbCA9IG1ldGhvZERlY2xhcmF0aW9ucyA9PSBudWxsID8gMCA6IG1ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGg7DQorCQlpbnQgcHJvYmxlbXNMZW5ndGg7DQorCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gdW5pdFJlc3VsdC5nZXRQcm9ibGVtcygpOw0KKwkJaWYgKHByb2JsZW1zID09IG51bGwpIHsNCisJCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVswXTsNCiAJCX0NCi0JCWludCB2YWx1ZSA9IG51bWJlck9mRW50cmllcyAqIDEwICsgMjsNCi0JCWxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCArPSAyOw0KLQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsNCi0JCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7DQotCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQotCX0NCi0NCi0JLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcy8vIGVuc3VyZSBmaXJzdCB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW5zaWRlIHRoZSBsb2NhbENvbnRlbnRzIGFycmF5DQotCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMiA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7DQotCS8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGxlbmd0aA0KLQlpbnQgY29kZUF0dHJpYnV0ZUxlbmd0aCA9IGxvY2FsQ29udGVudHNPZmZzZXQgLSAoY29kZUF0dHJpYnV0ZU9mZnNldCArIDYpOw0KLQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAyXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDNdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDE2KTsNCi0JbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNF0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gOCk7DQotCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDVdID0gKGJ5dGUpIGNvZGVBdHRyaWJ1dGVMZW5ndGg7DQotCWNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGF0IG1ldGhvZCBjb21wbGV0ZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZSBieSBzZXR0aW5nDQotICogLSB0aGUgYXR0cmlidXRlX2xlbmd0aA0KLSAqIC0gbWF4X3N0YWNrDQotICogLSBtYXhfbG9jYWxzDQotICogLSBjb2RlX2xlbmd0aA0KLSAqIC0gZXhjZXB0aW9uIHRhYmxlDQotICogLSBhbmQgZGVidWcgYXR0cmlidXRlcyBpZiBuZWNlc3NhcnkuDQotICoNCi0gKiBAcGFyYW0gYmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCi0gKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtDQotICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPg0KLSAqLw0KLXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY0FjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGJpbmRpbmcsIGludCBjb2RlQXR0cmlidXRlT2Zmc2V0LCBpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7DQotCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0NCi0JY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOw0KLQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0Ow0KLQkvLyBjb2RlQXR0cmlidXRlT2Zmc2V0IGlzIHRoZSBwb3NpdGlvbiBpbnNpZGUgY29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZQ0KLQkvLyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVBdHRyaWJ1dGUNCi0JLy8gVGhhdCBtZWFucyB0aGF0IHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoIHlvdSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSB2YWx1ZSBvZiBjb2RlQXR0cmlidXRlT2Zmc2V0DQotCS8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uDQotCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4Ow0KLQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsNCi0JaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOw0KLQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsNCi0JaW50IGNvZGVfbGVuZ3RoID0gY29kZVN0cmVhbS5wb3NpdGlvbjsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOw0KLQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTFdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAxNik7DQotCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOw0KLQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTNdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOw0KLQlpbnQgY29udGVudHNMZW5ndGg7DQotCWlmICgobG9jYWxDb250ZW50c09mZnNldCArIDQwKSA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIA0KLQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24NCi0JbG9jYWxDb250ZW50c09mZnNldCArPSAyOw0KLQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzDQotCWludCBjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsNCi0JaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQotCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgNCi0JbG9jYWxDb250ZW50c09mZnNldCArPSAyOw0KLQ0KLQkvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlDQotCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsNCi0JCWludCBpbmRleCA9IDAsIG1heCA9IHN0YXJ0TGluZUluZGV4ZXMubGVuZ3RoOw0KLQkJaW50IGxpbmVOdW1iZXJOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOw0KLQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsNCi0JCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OyAvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbGluZV9udW1iZXJfdGFibGVfbGVuZ3RoDQotCQkvLyBTZWVtcyBsaWtlIGRvIHdvdWxkIGJlIGJldHRlciwgYnV0IHRoaXMgcHJlc2VydmVzIHRoZSBleGlzdGluZyBiZWhhdmlvci4NCi0JCWluZGV4ID0gc2VhcmNoTGluZU51bWJlcihzdGFydExpbmVJbmRleGVzLCBiaW5kaW5nLnNvdXJjZVN0YXJ0KTsNCi0JCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7DQotCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7DQotCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUNCi0JCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7DQotCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDY7DQotCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMTsNCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KLQl9DQotDQotCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQ0KLQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZXMpIHsNCi0JCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7DQotCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7DQotCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPiAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCQl9DQotCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOw0KLQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4Ow0KLQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OyAvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbG9jYWxfdmFyaWFibGVfdGFibGVfbGVuZ3RoDQotCQlpbnQgbmFtZUluZGV4Ow0KLQkJaW50IGRlc2NyaXB0b3JJbmRleDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpKyspIHsNCi0JCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gY29kZVN0cmVhbS5sb2NhbHNbaV07DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgew0KLQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsNCi0JCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOw0KLQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgeyAvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aA0KLQkJCQkJaW50IGN1cnJlbnRMZW5ndGg7DQotCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsNCi0JCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKFV0aWwuYmluZCgiYWJvcnQuaW52YWxpZEF0dHJpYnV0ZSIvKm5vbk5MUyovLG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIChBc3ROb2RlKSBsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLm1ldGhvZFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCk7DQotCQkJCQl9DQotCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID4gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQ0KLQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7DQotCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOw0KLQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydFBDOw0KLQkJCQkJaW50IGxlbmd0aCA9IGVuZFBDIC0gc3RhcnRQQzsNCi0JCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsNCi0JCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOw0KLQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOw0KLQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUudHlwZS5zaWduYXR1cmUoKSk7DQotCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQotCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCi0JCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOw0KLQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsNCi0JCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWludCB2YWx1ZSA9IG51bWJlck9mRW50cmllcyAqIDEwICsgMjsNCi0JCWxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCArPSAyOw0KLQkJY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7DQotCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsNCi0JCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7DQotCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7DQotCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsNCi0JCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOw0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQotCX0NCi0NCi0JLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KLQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkNCi0JaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KLQl9DQotCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOw0KLQ0KLQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgNCi0JaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDNdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDE2KTsNCi0JY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KLQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsNCi0JY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0Ow0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBpbmZvIGJ5IHNldHRpbmcgdXAgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGF0IHRoZSByaWdodCBvZmZzZXQuDQotICoNCi0gKiBAcGFyYW0gbWV0aG9kQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4NCi0gKiBAcGFyYW0gYXR0cmlidXRlTnVtYmVyIDxDT0RFPmludDwvQ09ERT4gDQotICovDQotcHVibGljIHZvaWQgY29tcGxldGVNZXRob2RJbmZvKGludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGludCBhdHRyaWJ1dGVOdW1iZXIpIHsNCi0JLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcw0KLQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsNCi0JY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7DQotfQ0KLS8qDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBJbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWUgY29tcHV0ZWQgYXMgdGhleSBhcmUgZ2VuZXJhdGVkLCBzaW5jZSBzb21lIG1heSBub3QNCi0gKiBiZSBhY3R1YWxseSBvdXRwdXRlZCBpZiBzaXR0aW5nIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlLg0KLSAqDQotICogQHBhcmFtIGxvY2FsVHlwZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVHlwZUJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgY2hhcltdIGNvbXB1dGVDb25zdGFudFBvb2xOYW1lKExvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlKSB7DQotCWlmIChsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpICE9IG51bGwpIHsNCi0JCXJldHVybiBsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpOw0KLQl9DQotDQotCS8vIGRlbGVnYXRlcyB0byB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBjbGFzc2ZpbGUsIHNpbmNlIGl0IGlzIHRoZSBvbmx5IG9uZSB3aXRoIGEgZ2xvYmFsIHZpc2lvbiBvZiBpdHMgaW5uZXJ0eXBlcy4NCi0JaWYgKGVuY2xvc2luZ0NsYXNzRmlsZSAhPSBudWxsKSB7DQotCQlyZXR1cm4gdGhpcy5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKS5jb21wdXRlQ29uc3RhbnRQb29sTmFtZShsb2NhbFR5cGUpOw0KLQl9DQotDQotCWlmIChuYW1lVXNhZ2UgPT0gbnVsbCkgew0KLQkJbmFtZVVzYWdlID0gbmV3IENoYXJBcnJheUNhY2hlKCk7DQotCX0NCi0JaWYgKGxvY2FsVHlwZS5pc01lbWJlclR5cGUoKSkgeyAvLyBjYXRjaGVzIG1lbWJlciB0eXBlcyBvZiBsb2NhbCB0eXBlcw0KLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KA0KLQkJCWxvY2FsVHlwZS5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpLA0KLQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lLA0KLQkJCSckJyk7DQotCX0gZWxzZSB7DQotCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSAgKGNoYXJbXVtdKSByZWZlcmVuY2VCaW5kaW5nLmNvbXBvdW5kTmFtZS5jbG9uZSgpOw0KLQkJaW50IGxhc3QgPSBjb21wb3VuZE5hbWUubGVuZ3RoIC0gMTsNCi0JCVN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZChjb21wb3VuZE5hbWVbbGFzdF0pOw0KLQkJLy8gcmV0cmlldmUgdGhlIG51bWJlciBvZiB1c2Ugb2YgdGhlIGNvbWJpbmF0aW9uDQotCQljaGFyW10gc2ltcGxlTmFtZSA9IGxvY2FsVHlwZS5zb3VyY2VOYW1lOw0KLQkJLy9pZiAoc2ltcGxlTmFtZSA9PSBudWxsKSBzaW1wbGVOYW1lID0gbmV3IGNoYXJbXXt9OyAvLyBmb3IgYW5vbnltb3VzDQotCQlpbnQgbmFtZUNvdW50ID0gbmFtZVVzYWdlLmdldChzaW1wbGVOYW1lKTsgLy8gLTEgaWYgbm90IGZvdW5kDQotCQluYW1lQ291bnQgPSAgbmFtZUNvdW50ID09IC0xID8gMSA6IG5hbWVDb3VudCArIDE7DQotCQluYW1lQnVmZmVyLmFwcGVuZCgnJCcpLmFwcGVuZChuYW1lQ291bnQpOw0KLQkJbmFtZVVzYWdlLnB1dChzaW1wbGVOYW1lLCBuYW1lQ291bnQpOw0KLQkJaWYgKCFsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsgLy8gbmFtZWQgbG9jYWwgdHlwZQ0KLQkJCW5hbWVCdWZmZXIuYXBwZW5kKCckJykuYXBwZW5kKHNpbXBsZU5hbWUpOw0KLQkJfQ0KLQkJY29tcG91bmROYW1lW2xhc3RdID0gbmFtZUJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7DQotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy8nKTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFJlcXVlc3QgdGhlIGNyZWF0aW9uIG9mIGEgQ2xhc3NGaWxlIGNvbXBhdGlibGUgcmVwcmVzZW50YXRpb24gb2YgYSBwcm9ibGVtYXRpYyB0eXBlDQotICoNCi0gKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uDQotICogQHBhcmFtIHVuaXRSZXN1bHQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uVW5pdFJlc3VsdA0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7DQotCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7DQotCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBuZXcgQ2xhc3NGaWxlKHR5cGVCaW5kaW5nLCBudWxsLCB0cnVlKTsNCi0NCi0JLy8gaW5uZXIgYXR0cmlidXRlcw0KLQlpZiAodHlwZUJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpDQotCQljbGFzc0ZpbGUucmVjb3JkRW5jbG9zaW5nVHlwZUF0dHJpYnV0ZXModHlwZUJpbmRpbmcpOw0KLQ0KLQkvLyBhZGQgaXRzIGZpZWxkcw0KLQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSB0eXBlQmluZGluZy5maWVsZHM7DQotCWlmICgoZmllbGRzICE9IG51bGwpICYmIChmaWVsZHMgIT0gTm9GaWVsZHMpKSB7DQotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQkJaWYgKGZpZWxkc1tpXS5jb25zdGFudCA9PSBudWxsKSB7DQotCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkc1tpXSwgZmFsc2UsIG51bGwsIDApOw0KLQkJCX0NCi0JCX0NCi0JCWNsYXNzRmlsZS5hZGRGaWVsZEluZm9zKCk7DQotCX0gZWxzZSB7DQotCQkvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0byBiZSBlcXVhbHMgdG8gMA0KLQkJY2xhc3NGaWxlLmNvbnRlbnRzW2NsYXNzRmlsZS5jb250ZW50c09mZnNldCsrXSA9IDA7DQotCQljbGFzc0ZpbGUuY29udGVudHNbY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JfQ0KLQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbWV0aG9kQ291bnQNCi0JY2xhc3NGaWxlLnNldEZvck1ldGhvZEluZm9zKCk7DQotCS8vIGFkZCBpdHMgdXNlciBkZWZpbmVkIG1ldGhvZHMNCi0JTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSB0eXBlQmluZGluZy5tZXRob2RzOw0KLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7DQotCWludCBtYXhNZXRob2REZWNsID0gbWV0aG9kRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogbWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aDsNCi0JaW50IHByb2JsZW1zTGVuZ3RoOw0KLQlJUHJvYmxlbVtdIHByb2JsZW1zID0gdW5pdFJlc3VsdC5nZXRQcm9ibGVtcygpOw0KLQlpZiAocHJvYmxlbXMgPT0gbnVsbCkgew0KLQkJcHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bMF07DQotCX0NCi0JSVByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgSVByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOw0KLQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsNCi0JaWYgKG1ldGhvZHMgIT0gbnVsbCkgew0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsNCi0JCQkvLyB3ZSBjYW5ub3QgY3JlYXRlIHByb2JsZW0gbWV0aG9kcyBmb3IgYW4gaW50ZXJmYWNlLiBTbyB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgY2xpbml0DQotCQkJLy8gd2hpY2ggc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBwcm9ibGVtDQotCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1DbGluaXQocHJvYmxlbXNDb3B5KTsNCi0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc7DQotCQkJCWlmICgobWV0aG9kQmluZGluZyA9IG1ldGhvZHNbaV0pICE9IG51bGwpIHsNCi0JCQkJCS8vIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGRlY2xhcmF0aW9uDQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heE1ldGhvZERlY2w7IGorKykgew0KLQkJCQkJCWlmICgobWV0aG9kRGVjbGFyYXRpb25zW2pdICE9IG51bGwpICYmIChtZXRob2REZWNsYXJhdGlvbnNbal0uYmluZGluZyA9PSBtZXRob2RzW2ldKSkgew0KLQkJCQkJCQlpZiAoIW1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKSB7DQotCQkJCQkJCQljbGFzc0ZpbGUuYWRkQWJzdHJhY3RNZXRob2QobWV0aG9kRGVjbGFyYXRpb25zW2pdLCBtZXRob2RCaW5kaW5nKTsNCisJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsNCisJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOw0KKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgew0KKwkJCWlmICh0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7DQorCQkJCS8vIHdlIGNhbm5vdCBjcmVhdGUgcHJvYmxlbSBtZXRob2RzIGZvciBhbiBpbnRlcmZhY2UuIFNvIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBjbGluaXQNCisJCQkJLy8gd2hpY2ggc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBwcm9ibGVtDQorCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ2xpbml0KHByb2JsZW1zQ29weSk7DQorCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc7DQorCQkJCQlpZiAoKG1ldGhvZEJpbmRpbmcgPSBtZXRob2RzW2ldKSAhPSBudWxsKSB7DQorCQkJCQkJLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZGVjbGFyYXRpb24NCisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heE1ldGhvZERlY2w7IGorKykgew0KKwkJCQkJCQlpZiAoKG1ldGhvZERlY2xhcmF0aW9uc1tqXSAhPSBudWxsKQ0KKwkJCQkJCQkJJiYgKG1ldGhvZERlY2xhcmF0aW9uc1tqXS5iaW5kaW5nID09IG1ldGhvZHNbaV0pKSB7DQorCQkJCQkJCQlpZiAoIW1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKSB7DQorCQkJCQkJCQkJY2xhc3NGaWxlLmFkZEFic3RyYWN0TWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uc1tqXSwgbWV0aG9kQmluZGluZyk7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlicmVhazsNCiAJCQkJCQkJfQ0KLQkJCQkJCQlicmVhazsNCiAJCQkJCQl9DQogCQkJCQl9DQogCQkJCX0NCi0JCQl9CQkJDQotCQl9IGVsc2Ugew0KLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsNCi0JCQkJaWYgKChtZXRob2RCaW5kaW5nID0gbWV0aG9kc1tpXSkgIT0gbnVsbCkgew0KLQkJCQkJLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZGVjbGFyYXRpb24NCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4TWV0aG9kRGVjbDsgaisrKSB7DQotCQkJCQkJaWYgKChtZXRob2REZWNsYXJhdGlvbnNbal0gIT0gbnVsbCkgJiYgKG1ldGhvZERlY2xhcmF0aW9uc1tqXS5iaW5kaW5nID09IG1ldGhvZHNbaV0pKSB7DQotCQkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbDsNCi0JCQkJCQkJaWYgKChtZXRob2REZWNsID0gbWV0aG9kRGVjbGFyYXRpb25zW2pdKS5pc0NvbnN0cnVjdG9yKCkpIHsNCi0JCQkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IobWV0aG9kRGVjbCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXNDb3B5KTsNCi0JCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKG1ldGhvZERlY2wsIG1ldGhvZEJpbmRpbmcsIHByb2JsZW1zQ29weSk7DQorCQkJfSBlbHNlIHsNCisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsNCisJCQkJCWlmICgobWV0aG9kQmluZGluZyA9IG1ldGhvZHNbaV0pICE9IG51bGwpIHsNCisJCQkJCQkvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBkZWNsYXJhdGlvbg0KKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4TWV0aG9kRGVjbDsgaisrKSB7DQorCQkJCQkJCWlmICgobWV0aG9kRGVjbGFyYXRpb25zW2pdICE9IG51bGwpDQorCQkJCQkJCQkmJiAobWV0aG9kRGVjbGFyYXRpb25zW2pdLmJpbmRpbmcgPT0gbWV0aG9kc1tpXSkpIHsNCisJCQkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbDsNCisJCQkJCQkJCWlmICgobWV0aG9kRGVjbCA9IG1ldGhvZERlY2xhcmF0aW9uc1tqXSkuaXNDb25zdHJ1Y3RvcigpKSB7DQorCQkJCQkJCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1Db25zdHJ1Y3RvcihtZXRob2REZWNsLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtc0NvcHkpOw0KKwkJCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbU1ldGhvZChtZXRob2REZWNsLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtc0NvcHkpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJYnJlYWs7DQogCQkJCQkJCX0NCi0JCQkJCQkJYnJlYWs7DQogCQkJCQkJfQ0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJfQ0KKwkJCS8vIGFkZCBhYnN0cmFjdCBtZXRob2RzDQorCQkJY2xhc3NGaWxlLmFkZERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsNCiAJCX0NCi0JCS8vIGFkZCBhYnN0cmFjdCBtZXRob2RzDQotCQljbGFzc0ZpbGUuYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOw0KLQl9DQotCS8vIHByb3BhZ2F0ZSBnZW5lcmF0aW9uIG9mIChwcm9ibGVtKSBtZW1iZXIgdHlwZXMNCi0JaWYgKHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyAhPSBudWxsKSB7DQotCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSB0eXBlRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQ7DQotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGUgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV07DQotCQkJaWYgKG1lbWJlclR5cGUuYmluZGluZyAhPSBudWxsKSB7DQotCQkJCWNsYXNzRmlsZS5yZWNvcmROZXN0ZWRNZW1iZXJBdHRyaWJ1dGUobWVtYmVyVHlwZS5iaW5kaW5nKTsNCi0JCQkJQ2xhc3NGaWxlLmNyZWF0ZVByb2JsZW1UeXBlKG1lbWJlclR5cGUsIHVuaXRSZXN1bHQpOw0KKwkJLy8gcHJvcGFnYXRlIGdlbmVyYXRpb24gb2YgKHByb2JsZW0pIG1lbWJlciB0eXBlcw0KKwkJaWYgKHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyAhPSBudWxsKSB7DQorCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0NCisJCQkJdHlwZURlY2xhcmF0aW9uLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0Ow0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGUgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV07DQorCQkJCWlmIChtZW1iZXJUeXBlLmJpbmRpbmcgIT0gbnVsbCkgew0KKwkJCQkJY2xhc3NGaWxlLnJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShtZW1iZXJUeXBlLmJpbmRpbmcpOw0KKwkJCQkJQ2xhc3NGaWxlLmNyZWF0ZVByb2JsZW1UeXBlKG1lbWJlclR5cGUsIHVuaXRSZXN1bHQpOw0KKwkJCQl9DQogCQkJfQ0KIAkJfQ0KKwkJY2xhc3NGaWxlLmFkZEF0dHJpYnV0ZXMoKTsNCisJCXVuaXRSZXN1bHQucmVjb3JkKHR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwgY2xhc3NGaWxlKTsNCiAJfQ0KLQljbGFzc0ZpbGUuYWRkQXR0cmlidXRlcygpOw0KLQl1bml0UmVzdWx0LnJlY29yZCh0eXBlQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCksIGNsYXNzRmlsZSk7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhpcyBtZXRob2RzIHJldHVybnMgYSBjaGFyW10gcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlY2VpdmVyDQotICoNCi0gKiBAcmV0dXJuIGNoYXJbXQ0KLSAqLw0KLXB1YmxpYyBjaGFyW10gZmlsZU5hbWUoKSB7DQotCXJldHVybiBjb25zdGFudFBvb2wuVVRGOENhY2hlLnJldHVybktleUZvcigxKTsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGhlYWRlciBvZiBhIGNvZGUgYXR0cmlidXRlLg0KLSAqIC0gdGhlIGluZGV4IGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbCBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lIChpLmUuIENvZGUpDQotICogLSBsZWF2ZSBzb21lIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoKDQpLCBtYXhfc3RhY2soMiksIG1heF9sb2NhbHMoMiksIGNvZGVfbGVuZ3RoKDQpLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpIHsNCi0JaW50IGNvbnRlbnRzTGVuZ3RoOw0KLQlpZiAoY29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksIDAsIGNvbnRlbnRzTGVuZ3RoKTsNCi0JfQ0KLQlpbnQgY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29uc3RhbnRWYWx1ZU5hbWVJbmRleDsNCi0JLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGgoNCksIG1heF9zdGFjaygyKSwgbWF4X2xvY2FscygyKSwgY29kZV9sZW5ndGgoNCkNCi0JY29udGVudHNPZmZzZXQgKz0gMTI7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhhdCBtZXRob2QgZ2VuZXJhdGVzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgY29kZSBhdHRyaWJ1dGUuDQotICogVGhleSBjb3VsZCBiZToNCi0gKiAtIGFuIGV4Y2VwdGlvbiBhdHRyaWJ1dGUgZm9yIGVhY2ggdHJ5L2NhdGNoIGZvdW5kIGluc2lkZSB0aGUgbWV0aG9kDQotICogLSBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlDQotICogLSBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgZm9yIHN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kcw0KLSAqDQotICogSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY3JlYXRlZCBmb3IgdGhlIGNvZGUgYXR0cmlidXRlLg0KLSAqDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nDQotICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+DQotICovDQotcHVibGljIGludCBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQotCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9udW1iZXINCi0JY29udGVudHNPZmZzZXQgKz0gMjsNCi0JLy8gbm93IHdlIGNhbiBoYW5kbGUgYWxsIHRoZSBhdHRyaWJ1dGUgZm9yIHRoYXQgbWV0aG9kIGluZm86DQotCS8vIGl0IGNvdWxkIGJlOg0KLQkvLyAtIGEgQ29kZUF0dHJpYnV0ZQ0KLQkvLyAtIGEgRXhjZXB0aW9uQXR0cmlidXRlDQotCS8vIC0gYSBEZXByZWNhdGVkQXR0cmlidXRlDQotCS8vIC0gYSBTeW50aGV0aWNBdHRyaWJ1dGUNCiANCi0JLy8gRXhjZXB0aW9uIGF0dHJpYnV0ZQ0KLQlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duc0V4Y2VwdGlvbnM7DQotCWludCBjb250ZW50c0xlbmd0aDsNCi0JaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQotCWlmICgodGhyb3duc0V4Y2VwdGlvbnMgPSBtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IE5vRXhjZXB0aW9ucykgew0KLQkJLy8gVGhlIG1ldGhvZCBoYXMgYSB0aHJvdyBjbGF1c2UuIFNvIHdlIG5lZWQgdG8gYWRkIGFuIGV4Y2VwdGlvbiBhdHRyaWJ1dGUNCi0JCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBleGNlcHRpb24gYXR0cmlidXRlDQotCQlpbnQgbGVuZ3RoID0gdGhyb3duc0V4Y2VwdGlvbnMubGVuZ3RoOw0KLQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgKDggKyBsZW5ndGggKiAyKSA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBNYXRoLm1heChJTkNSRU1FTlRfU0laRSwgKDggKyBsZW5ndGggKiAyKSldKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhpcyBtZXRob2RzIHJldHVybnMgYSBjaGFyW10gcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlY2VpdmVyDQorCSAqDQorCSAqIEByZXR1cm4gY2hhcltdDQorCSAqLw0KKwlwdWJsaWMgY2hhcltdIGZpbGVOYW1lKCkgew0KKwkJcmV0dXJuIGNvbnN0YW50UG9vbC5VVEY4Q2FjaGUucmV0dXJuS2V5Rm9yKDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGhlYWRlciBvZiBhIGNvZGUgYXR0cmlidXRlLg0KKwkgKiAtIHRoZSBpbmRleCBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZSAoaS5lLiBDb2RlKQ0KKwkgKiAtIGxlYXZlIHNvbWUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGgoNCksIG1heF9zdGFjaygyKSwgbWF4X2xvY2FscygyKSwgY29kZV9sZW5ndGgoNCkuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKSB7DQorCQlpbnQgY29udGVudHNMZW5ndGg7DQorCQlpZiAoY29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJMCwNCisJCQkJY29udGVudHNMZW5ndGgpOw0KIAkJfQ0KLQkJaW50IGV4Y2VwdGlvbk5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRXhjZXB0aW9uc05hbWUpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbk5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbk5hbWVJbmRleDsNCi0JCS8vIFRoZSBhdHRyaWJ1dGUgbGVuZ3RoID0gbGVuZ3RoICogMiArIDIgaW4gY2FzZSBvZiBhIGV4Y2VwdGlvbiBhdHRyaWJ1dGUNCi0JCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsZW5ndGggKiAyICsgMjsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCQlpbnQgZXhjZXB0aW9uSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHRocm93bnNFeGNlcHRpb25zW2ldKTsNCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uSW5kZXggPj4gOCk7DQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSW5kZXg7DQorCQlpbnQgY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA9DQorCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db2RlTmFtZSk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvbnN0YW50VmFsdWVOYW1lSW5kZXg7DQorCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCg0KSwgbWF4X3N0YWNrKDIpLCBtYXhfbG9jYWxzKDIpLCBjb2RlX2xlbmd0aCg0KQ0KKwkJY29udGVudHNPZmZzZXQgKz0gMTI7DQorCX0NCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoYXQgbWV0aG9kIGdlbmVyYXRlcyB0aGUgYXR0cmlidXRlcyBvZiBhIGNvZGUgYXR0cmlidXRlLg0KKwkgKiBUaGV5IGNvdWxkIGJlOg0KKwkgKiAtIGFuIGV4Y2VwdGlvbiBhdHRyaWJ1dGUgZm9yIGVhY2ggdHJ5L2NhdGNoIGZvdW5kIGluc2lkZSB0aGUgbWV0aG9kDQorCSAqIC0gYSBkZXByZWNhdGVkIGF0dHJpYnV0ZQ0KKwkgKiAtIGEgc3ludGhldGljIGF0dHJpYnV0ZSBmb3Igc3ludGhldGljIGFjY2VzcyBtZXRob2RzDQorCSAqDQorCSAqIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGNyZWF0ZWQgZm9yIHRoZSBjb2RlIGF0dHJpYnV0ZS4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nDQorCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPg0KKwkgKi8NCisJcHVibGljIGludCBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQorCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbnVtYmVyDQorCQljb250ZW50c09mZnNldCArPSAyOw0KKwkJLy8gbm93IHdlIGNhbiBoYW5kbGUgYWxsIHRoZSBhdHRyaWJ1dGUgZm9yIHRoYXQgbWV0aG9kIGluZm86DQorCQkvLyBpdCBjb3VsZCBiZToNCisJCS8vIC0gYSBDb2RlQXR0cmlidXRlDQorCQkvLyAtIGEgRXhjZXB0aW9uQXR0cmlidXRlDQorCQkvLyAtIGEgRGVwcmVjYXRlZEF0dHJpYnV0ZQ0KKwkJLy8gLSBhIFN5bnRoZXRpY0F0dHJpYnV0ZQ0KKw0KKwkJLy8gRXhjZXB0aW9uIGF0dHJpYnV0ZQ0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bnNFeGNlcHRpb25zOw0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7DQorCQlpZiAoKHRocm93bnNFeGNlcHRpb25zID0gbWV0aG9kQmluZGluZy50aHJvd25FeGNlcHRpb25zKSAhPSBOb0V4Y2VwdGlvbnMpIHsNCisJCQkvLyBUaGUgbWV0aG9kIGhhcyBhIHRocm93IGNsYXVzZS4gU28gd2UgbmVlZCB0byBhZGQgYW4gZXhjZXB0aW9uIGF0dHJpYnV0ZQ0KKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBleGNlcHRpb24gYXR0cmlidXRlDQorCQkJaW50IGxlbmd0aCA9IHRocm93bnNFeGNlcHRpb25zLmxlbmd0aDsNCisJCQlpZiAoY29udGVudHNPZmZzZXQgKyAoOCArIGxlbmd0aCAqIDIpID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWNvbnRlbnRzLA0KKwkJCQkJMCwNCisJCQkJCShjb250ZW50cyA9DQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBNYXRoLm1heChJTkNSRU1FTlRfU0laRSwgKDggKyBsZW5ndGggKiAyKSldKSwNCisJCQkJCTAsDQorCQkJCQljb250ZW50c0xlbmd0aCk7DQorCQkJfQ0KKwkJCWludCBleGNlcHRpb25OYW1lSW5kZXggPQ0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkV4Y2VwdGlvbnNOYW1lKTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uTmFtZUluZGV4ID4+IDgpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbk5hbWVJbmRleDsNCisJCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyIGluIGNhc2Ugb2YgYSBleGNlcHRpb24gYXR0cmlidXRlDQorCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCisJCQkJaW50IGV4Y2VwdGlvbkluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCh0aHJvd25zRXhjZXB0aW9uc1tpXSk7DQorCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25JbmRleCA+PiA4KTsNCisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSW5kZXg7DQorCQkJfQ0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOw0KIAkJfQ0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQkvLyBEZXByZWNhdGVkIGF0dHJpYnV0ZQ0KKwkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlDQorCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQljb250ZW50cywNCisJCQkJMCwNCisJCQkJKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLA0KKwkJCQkwLA0KKwkJCQljb250ZW50c0xlbmd0aCk7DQorCQl9DQorCQlpZiAobWV0aG9kQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgew0KKwkJCWludCBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsNCisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorDQorCQkJYXR0cmlidXRlTnVtYmVyKys7DQorCQl9DQorCQkvLyBTeW50aGV0aWMgYXR0cmlidXRlDQorCQkvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUNCisJCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWlmIChtZXRob2RCaW5kaW5nLmlzU3ludGhldGljKCkpIHsNCisJCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0NCisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsNCisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisNCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsNCisJCX0NCisJCXJldHVybiBhdHRyaWJ1dGVOdW1iZXI7DQogCX0NCiANCi0JLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUNCi0JLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlDQotCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQotCX0NCi0JaWYgKG1ldGhvZEJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsNCi0JCWludCBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXg7DQotCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDANCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCi0NCi0JCWF0dHJpYnV0ZU51bWJlcisrOw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhhdCBtZXRob2QgZ2VuZXJhdGVzIHRoZSBoZWFkZXIgb2YgYSBtZXRob2QgaW5mbzoNCisJICogVGhlIGhlYWRlciBjb25zaXN0cyBpbjoNCisJICogLSB0aGUgYWNjZXNzIGZsYWdzDQorCSAqIC0gdGhlIG5hbWUgaW5kZXggb2YgdGhlIG1ldGhvZCBuYW1lIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbA0KKwkgKiAtIHRoZSBkZXNjcmlwdG9yIGluZGV4IG9mIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wuDQorCSAqDQorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZw0KKwkgKi8NCisJcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgew0KKwkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIG1ldGhvZCBpbmZvIGNvcnJlc3BvbmRpbmcNCisJCS8vIHRvIHRoZSBAbWV0aG9kQmluZGluZw0KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOw0KKwkJbWV0aG9kQ291bnQrKzsgLy8gYWRkIG9uZSBtb3JlIG1ldGhvZA0KKwkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWNvbnRlbnRzLA0KKwkJCQkwLA0KKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksDQorCQkJCTAsDQorCQkJCWNvbnRlbnRzTGVuZ3RoKTsNCisJCX0NCisJCWludCBhY2Nlc3NGbGFncyA9IG1ldGhvZEJpbmRpbmcuZ2V0QWNjZXNzRmxhZ3MoKTsNCisJCWlmIChtZXRob2RCaW5kaW5nLmlzUmVxdWlyZWRUb0NsZWFyUHJpdmF0ZU1vZGlmaWVyKCkpIHsNCisJCQlhY2Nlc3NGbGFncyAmPSB+QWNjUHJpdmF0ZTsNCisJCX0NCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOw0KKwkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZy5zZWxlY3Rvcik7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KKwkJaW50IGRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4Ow0KIAl9DQogDQotCS8vIFN5bnRoZXRpYyBhdHRyaWJ1dGUNCi0JLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlDQotCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIG1ldGhvZCBpbmZvIGhlYWRlciBvZiBhIGNsaW5pdDoNCisJICogVGhlIGhlYWRlciBjb25zaXN0cyBpbjoNCisJICogLSB0aGUgYWNjZXNzIGZsYWdzIChhbHdheXMgZGVmYXVsdCBhY2Nlc3MgKyBzdGF0aWMpDQorCSAqIC0gdGhlIG5hbWUgaW5kZXggb2YgdGhlIG1ldGhvZCBuYW1lIChhbHdheXMgPGNsaW5pdD4pIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbCANCisJICogLSB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGUgc2lnbmF0dXJlIChhbHdheXMgKClWKSBvZiB0aGUgbWV0aG9kIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbC4NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXJGb3JDbGluaXQoKSB7DQorCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgbWV0aG9kIGluZm8gY29ycmVzcG9uZGluZw0KKwkJLy8gdG8gdGhlIEBtZXRob2RCaW5kaW5nDQorCQlpbnQgY29udGVudHNMZW5ndGg7DQorCQltZXRob2RDb3VudCsrOyAvLyBhZGQgb25lIG1vcmUgbWV0aG9kDQorCQlpZiAoY29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJY29udGVudHMsDQorCQkJCTAsDQorCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwNCisJCQkJMCwNCisJCQkJY29udGVudHNMZW5ndGgpOw0KKwkJfQ0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKChBY2NEZWZhdWx0IHwgQWNjU3RhdGljKSA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChBY2NEZWZhdWx0IHwgQWNjU3RhdGljKTsNCisJCWludCBuYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkNsaW5pdCk7DQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4Ow0KKwkJaW50IGRlc2NyaXB0b3JJbmRleCA9DQorCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5DbGluaXRTaWduYXR1cmUpOw0KKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCisJCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDEgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsNCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMTsNCiAJfQ0KLQlpZiAobWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpKSB7DQotCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsNCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7DQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7DQotCQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMA0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOw0KIA0KLQkJYXR0cmlidXRlTnVtYmVyKys7DQorCS8qKg0KKwkgKiBFWFRFUk5BTCBBUEkNCisJICogQW5zd2VyIHRoZSBhY3R1YWwgYnl0ZXMgb2YgdGhlIGNsYXNzIGZpbGUNCisJICoNCisJICogVGhpcyBtZXRob2QgZW5jb2RlcyB0aGUgcmVjZWl2ZXIgc3RydWN0dXJlIGludG8gYSBieXRlIGFycmF5IHdoaWNoIGlzIHRoZSBjb250ZW50IG9mIHRoZSBjbGFzc2ZpbGUuDQorCSAqIFJldHVybnMgdGhlIGJ5dGUgYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBlbmNvZGVkIHN0cnVjdHVyZSBvZiB0aGUgcmVjZWl2ZXIuDQorCSAqDQorCSAqIEByZXR1cm4gYnl0ZVtdDQorCSAqLw0KKwlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgew0KKwkJYnl0ZVtdIGZ1bGxDb250ZW50cyA9IG5ldyBieXRlW2hlYWRlck9mZnNldCArIGNvbnRlbnRzT2Zmc2V0XTsNCisJCVN5c3RlbS5hcnJheWNvcHkoaGVhZGVyLCAwLCBmdWxsQ29udGVudHMsIDAsIGhlYWRlck9mZnNldCk7DQorCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCBmdWxsQ29udGVudHMsIGhlYWRlck9mZnNldCwgY29udGVudHNPZmZzZXQpOw0KKwkJcmV0dXJuIGZ1bGxDb250ZW50czsNCiAJfQ0KLQlyZXR1cm4gYXR0cmlidXRlTnVtYmVyOw0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoYXQgbWV0aG9kIGdlbmVyYXRlcyB0aGUgaGVhZGVyIG9mIGEgbWV0aG9kIGluZm86DQotICogVGhlIGhlYWRlciBjb25zaXN0cyBpbjoNCi0gKiAtIHRoZSBhY2Nlc3MgZmxhZ3MNCi0gKiAtIHRoZSBuYW1lIGluZGV4IG9mIHRoZSBtZXRob2QgbmFtZSBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wNCi0gKiAtIHRoZSBkZXNjcmlwdG9yIGluZGV4IG9mIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wuDQotICoNCi0gKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7DQotCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBtZXRob2QgaW5mbyBjb3JyZXNwb25kaW5nDQotCS8vIHRvIHRoZSBAbWV0aG9kQmluZGluZw0KLQlpbnQgY29udGVudHNMZW5ndGg7DQotCW1ldGhvZENvdW50Kys7IC8vIGFkZCBvbmUgbW9yZSBtZXRob2QNCi0JaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgew0KLQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLCAwLCBjb250ZW50c0xlbmd0aCk7DQorDQorCS8qKg0KKwkgKiBFWFRFUk5BTCBBUEkNCisJICogQW5zd2VyIHRoZSBjb21wb3VuZCBuYW1lIG9mIHRoZSBjbGFzcyBmaWxlLg0KKwkgKiBAcmV0dXJuIGNoYXJbXVtdDQorCSAqIGUuZy4ge3tqYXZhfSwge3V0aWx9LCB7SGFzaHRhYmxlfX0uDQorCSAqLw0KKwlwdWJsaWMgY2hhcltdW10gZ2V0Q29tcG91bmROYW1lKCkgew0KKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIGZpbGVOYW1lKCkpOw0KIAl9DQotCWludCBhY2Nlc3NGbGFncyA9IG1ldGhvZEJpbmRpbmcuZ2V0QWNjZXNzRmxhZ3MoKTsNCi0JaWYgKG1ldGhvZEJpbmRpbmcuaXNSZXF1aXJlZFRvQ2xlYXJQcml2YXRlTW9kaWZpZXIoKSkgew0KLQkJYWNjZXNzRmxhZ3MgJj0gfkFjY1ByaXZhdGU7DQorDQorCS8qKg0KKwkgKiBFWFRFUk5BTCBBUEkNCisJICogQW5zd2VyIGEgc21hbGxlciBieXRlIGZvcm1hdCwgd2hpY2ggaXMgb25seSBjb250YWlucyBzb21lIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24uDQorCSAqDQorCSAqIFRob3NlIGJ5dGVzIGFyZSBkZWNvZGFibGUgd2l0aCBhIHJlZ3VsYXIgY2xhc3MgZmlsZSByZWFkZXIsIHN1Y2ggYXM6DQorCSAqIERpZXRDbGFzc0ZpbGVSZWFkZXINCisJICovDQorCXB1YmxpYyBieXRlW10gZ2V0UmVkdWNlZEJ5dGVzKCkgew0KKwkJcmV0dXJuIGdldEJ5dGVzKCk7IC8vIG1pZ2h0IGJlIGltcHJvdmVkDQogCX0NCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsNCi0JaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZy5zZWxlY3Rvcik7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsNCi0JaW50IGRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIG1ldGhvZCBpbmZvIGhlYWRlciBvZiBhIGNsaW5pdDoNCi0gKiBUaGUgaGVhZGVyIGNvbnNpc3RzIGluOg0KLSAqIC0gdGhlIGFjY2VzcyBmbGFncyAoYWx3YXlzIGRlZmF1bHQgYWNjZXNzICsgc3RhdGljKQ0KLSAqIC0gdGhlIG5hbWUgaW5kZXggb2YgdGhlIG1ldGhvZCBuYW1lIChhbHdheXMgPGNsaW5pdD4pIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbCANCi0gKiAtIHRoZSBkZXNjcmlwdG9yIGluZGV4IG9mIHRoZSBzaWduYXR1cmUgKGFsd2F5cyAoKVYpIG9mIHRoZSBtZXRob2QgaW5zaWRlIHRoZSBjb25zdGFudCBwb29sLg0KLSAqDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nDQotICovDQotcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyRm9yQ2xpbml0KCkgew0KLQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgbWV0aG9kIGluZm8gY29ycmVzcG9uZGluZw0KLQkvLyB0byB0aGUgQG1ldGhvZEJpbmRpbmcNCi0JaW50IGNvbnRlbnRzTGVuZ3RoOw0KLQltZXRob2RDb3VudCsrOyAvLyBhZGQgb25lIG1vcmUgbWV0aG9kDQotCWlmIChjb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwgMCwgY29udGVudHNMZW5ndGgpOw0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogUmV0dXJucyB0aGUgbW9zdCBlbmNsb3NpbmcgY2xhc3NmaWxlIG9mIHRoZSByZWNlaXZlci4gVGhpcyBpcyB1c2VkIGtub3cgdG8gc3RvcmUgdGhlIGNvbnN0YW50IHBvb2wgbmFtZQ0KKwkgKiBmb3IgYWxsIGlubmVyIHR5cGVzIG9mIHRoZSByZWNlaXZlci4NCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5DbGFzc0ZpbGUNCisJICovDQorCXB1YmxpYyBDbGFzc0ZpbGUgb3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCkgew0KKwkJQ2xhc3NGaWxlIGN1cnJlbnQgPSB0aGlzOw0KKwkJd2hpbGUgKGN1cnJlbnQuZW5jbG9zaW5nQ2xhc3NGaWxlICE9IG51bGwpDQorCQkJY3VycmVudCA9IGN1cnJlbnQuZW5jbG9zaW5nQ2xhc3NGaWxlOw0KKwkJcmV0dXJuIGN1cnJlbnQ7DQogCX0NCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKChBY2NEZWZhdWx0IHwgQWNjU3RhdGljKSA+PiA4KTsNCi0JY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKEFjY0RlZmF1bHQgfCBBY2NTdGF0aWMpOw0KLQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5DbGluaXQpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOw0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7DQotCWludCBkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkNsaW5pdFNpZ25hdHVyZSk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsNCi0JLy8gV2Uga25vdyB0aGF0IHdlIHdvbid0IGdldCBtb3JlIHRoYW4gMSBhdHRyaWJ1dGU6IHRoZSBjb2RlIGF0dHJpYnV0ZQ0KLQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7DQotCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMTsNCi19DQotLyoqDQotICogRVhURVJOQUwgQVBJDQotICogQW5zd2VyIHRoZSBhY3R1YWwgYnl0ZXMgb2YgdGhlIGNsYXNzIGZpbGUNCi0gKg0KLSAqIFRoaXMgbWV0aG9kIGVuY29kZXMgdGhlIHJlY2VpdmVyIHN0cnVjdHVyZSBpbnRvIGEgYnl0ZSBhcnJheSB3aGljaCBpcyB0aGUgY29udGVudCBvZiB0aGUgY2xhc3NmaWxlLg0KLSAqIFJldHVybnMgdGhlIGJ5dGUgYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBlbmNvZGVkIHN0cnVjdHVyZSBvZiB0aGUgcmVjZWl2ZXIuDQotICoNCi0gKiBAcmV0dXJuIGJ5dGVbXQ0KLSAqLw0KLXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7DQotCWJ5dGVbXSBmdWxsQ29udGVudHMgPSBuZXcgYnl0ZVtoZWFkZXJPZmZzZXQgKyBjb250ZW50c09mZnNldF07DQotCVN5c3RlbS5hcnJheWNvcHkoaGVhZGVyLCAwLCBmdWxsQ29udGVudHMsIDAsIGhlYWRlck9mZnNldCk7DQotCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIGZ1bGxDb250ZW50cywgaGVhZGVyT2Zmc2V0LCBjb250ZW50c09mZnNldCk7DQotCXJldHVybiBmdWxsQ29udGVudHM7DQotfQ0KLS8qKg0KLSAqIEVYVEVSTkFMIEFQSQ0KLSAqIEFuc3dlciB0aGUgY29tcG91bmQgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZS4NCi0gKiBAcmV0dXJuIGNoYXJbXVtdDQotICogZS5nLiB7e2phdmF9LCB7dXRpbH0sIHtIYXNodGFibGV9fS4NCi0gKi8NCi1wdWJsaWMgY2hhcltdW10gZ2V0Q29tcG91bmROYW1lKCkgew0KLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgZmlsZU5hbWUoKSk7DQotfQ0KLS8qKg0KLSAqIEVYVEVSTkFMIEFQSQ0KLSAqIEFuc3dlciBhIHNtYWxsZXIgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIG9ubHkgY29udGFpbnMgc29tZSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uLg0KLSAqDQotICogVGhvc2UgYnl0ZXMgYXJlIGRlY29kYWJsZSB3aXRoIGEgcmVndWxhciBjbGFzcyBmaWxlIHJlYWRlciwgc3VjaCBhczoNCi0gKiBEaWV0Q2xhc3NGaWxlUmVhZGVyDQotICovDQotIA0KLXB1YmxpYyBieXRlW10gZ2V0UmVkdWNlZEJ5dGVzKCkgew0KLQlyZXR1cm4gZ2V0Qnl0ZXMoKTsgLy8gbWlnaHQgYmUgaW1wcm92ZWQNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBSZXR1cm5zIHRoZSBtb3N0IGVuY2xvc2luZyBjbGFzc2ZpbGUgb2YgdGhlIHJlY2VpdmVyLiBUaGlzIGlzIHVzZWQga25vdyB0byBzdG9yZSB0aGUgY29uc3RhbnQgcG9vbCBuYW1lDQotICogZm9yIGFsbCBpbm5lciB0eXBlcyBvZiB0aGUgcmVjZWl2ZXIuDQotICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5DbGFzc0ZpbGUNCi0gKi8NCi1wdWJsaWMgQ2xhc3NGaWxlIG91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpIHsNCi0JQ2xhc3NGaWxlIGN1cnJlbnQgPSB0aGlzOw0KLQl3aGlsZSAoY3VycmVudC5lbmNsb3NpbmdDbGFzc0ZpbGUgIT0gbnVsbCkNCi0JCWN1cnJlbnQgPSBjdXJyZW50LmVuY2xvc2luZ0NsYXNzRmlsZTsNCi0JcmV0dXJuIGN1cnJlbnQ7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGEgbmV3IGlubmVyIGNsYXNzLiBJdCBjaGVja3MgdGhhdCB0aGUgYmluZGluZyBAYmluZGluZyBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW5zaWRlIHRoZQ0KLSAqIGNvbGxlY3Rpb24gb2YgaW5uZXIgY2xhc3Nlcy4gQWRkIGFsbCB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGZpdCB0byB0aGUgc3BlY2lmaWNhdGlvbnMuDQotICoNCi0gKiBAcGFyYW0gYmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCByZWNvcmRFbmNsb3NpbmdUeXBlQXR0cmlidXRlcyhSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsNCi0JLy8gYWRkIGFsbCB0aGUgZW5jbG9zaW5nIHR5cGVzDQotCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlZmVyZW5jZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOw0KLQlpbnQgZGVwdGggPSAwOw0KLQl3aGlsZSAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7DQotCQlkZXB0aCsrOw0KLQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpOw0KLQl9DQotCWVuY2xvc2luZ1R5cGUgPSByZWZlcmVuY2VCaW5kaW5nOw0KLQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGVzW107DQotCWlmIChkZXB0aCA+PSAyKSB7DQotCQllbmNsb3NpbmdUeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2RlcHRoXTsNCi0JCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQotCQkJZW5jbG9zaW5nVHlwZXNbaV0gPSBlbmNsb3NpbmdUeXBlOw0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGEgbmV3IGlubmVyIGNsYXNzLiBJdCBjaGVja3MgdGhhdCB0aGUgYmluZGluZyBAYmluZGluZyBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW5zaWRlIHRoZQ0KKwkgKiBjb2xsZWN0aW9uIG9mIGlubmVyIGNsYXNzZXMuIEFkZCBhbGwgdGhlIG5lY2Vzc2FyeSBjbGFzc2VzIGluIHRoZSByaWdodCBvcmRlciB0byBmaXQgdG8gdGhlIHNwZWNpZmljYXRpb25zLg0KKwkgKg0KKwkgKiBAcGFyYW0gYmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcNCisJICovDQorCXB1YmxpYyB2b2lkIHJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZykgew0KKwkJLy8gYWRkIGFsbCB0aGUgZW5jbG9zaW5nIHR5cGVzDQorCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSByZWZlcmVuY2VCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsNCisJCWludCBkZXB0aCA9IDA7DQorCQl3aGlsZSAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7DQorCQkJZGVwdGgrKzsNCiAJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCk7DQogCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsNCi0JCQlhZGRJbm5lckNsYXNzZXMoZW5jbG9zaW5nVHlwZXNbaV0pOw0KKwkJZW5jbG9zaW5nVHlwZSA9IHJlZmVyZW5jZUJpbmRpbmc7DQorCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGVzW107DQorCQlpZiAoZGVwdGggPj0gMikgew0KKwkJCWVuY2xvc2luZ1R5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbZGVwdGhdOw0KKwkJCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQorCQkJCWVuY2xvc2luZ1R5cGVzW2ldID0gZW5jbG9zaW5nVHlwZTsNCisJCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpOw0KKwkJCX0NCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsNCisJCQkJYWRkSW5uZXJDbGFzc2VzKGVuY2xvc2luZ1R5cGVzW2ldKTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCWFkZElubmVyQ2xhc3NlcyhyZWZlcmVuY2VCaW5kaW5nKTsNCiAJCX0NCi0JfSBlbHNlIHsNCi0JCWFkZElubmVyQ2xhc3NlcyhyZWZlcmVuY2VCaW5kaW5nKTsNCiAJfQ0KLX0NCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UtT05MWQ0KLSAqIFRoaXMgaXMgdXNlZCB0byBzdG9yZSBhIG5ldyBpbm5lciBjbGFzcy4gSXQgY2hlY2tzIHRoYXQgdGhlIGJpbmRpbmcgQGJpbmRpbmcgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluc2lkZSB0aGUNCi0gKiBjb2xsZWN0aW9uIG9mIGlubmVyIGNsYXNzZXMuIEFkZCBhbGwgdGhlIG5lY2Vzc2FyeSBjbGFzc2VzIGluIHRoZSByaWdodCBvcmRlciB0byBmaXQgdG8gdGhlIHNwZWNpZmljYXRpb25zLg0KLSAqDQotICogQHBhcmFtIGJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nDQotICovDQotcHVibGljIHZvaWQgcmVjb3JkTmVzdGVkTG9jYWxBdHRyaWJ1dGUoUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nKSB7DQotCS8vIGFkZCBhbGwgdGhlIGVuY2xvc2luZyB0eXBlcw0KLQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSByZWZlcmVuY2VCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsNCi0JaW50IGRlcHRoID0gMDsNCi0Jd2hpbGUgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgew0KLQkJZGVwdGgrKzsNCi0JCWVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLmVuY2xvc2luZ1R5cGUoKTsNCi0JfQ0KLQllbmNsb3NpbmdUeXBlID0gcmVmZXJlbmNlQmluZGluZzsNCi0JUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlc1tdOw0KLQlpZiAoZGVwdGggPj0gMikgew0KLQkJZW5jbG9zaW5nVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tkZXB0aF07DQotCQlmb3IgKGludCBpID0gZGVwdGggLSAxOyBpID49IDA7IGktLSkgew0KLQkJCWVuY2xvc2luZ1R5cGVzW2ldID0gZW5jbG9zaW5nVHlwZTsNCisNCisJLyoqDQorCSAqIElOVEVSTkFMIFVTRS1PTkxZDQorCSAqIFRoaXMgaXMgdXNlZCB0byBzdG9yZSBhIG5ldyBpbm5lciBjbGFzcy4gSXQgY2hlY2tzIHRoYXQgdGhlIGJpbmRpbmcgQGJpbmRpbmcgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluc2lkZSB0aGUNCisJICogY29sbGVjdGlvbiBvZiBpbm5lciBjbGFzc2VzLiBBZGQgYWxsIHRoZSBuZWNlc3NhcnkgY2xhc3NlcyBpbiB0aGUgcmlnaHQgb3JkZXIgdG8gZml0IHRvIHRoZSBzcGVjaWZpY2F0aW9ucy4NCisJICoNCisJICogQHBhcmFtIGJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWNvcmROZXN0ZWRMb2NhbEF0dHJpYnV0ZShSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsNCisJCS8vIGFkZCBhbGwgdGhlIGVuY2xvc2luZyB0eXBlcw0KKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gcmVmZXJlbmNlQmluZGluZy5lbmNsb3NpbmdUeXBlKCk7DQorCQlpbnQgZGVwdGggPSAwOw0KKwkJd2hpbGUgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgew0KKwkJCWRlcHRoKys7DQogCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpOw0KIAkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQ0KLQkJCWFkZElubmVyQ2xhc3NlcyhlbmNsb3NpbmdUeXBlc1tpXSk7DQotCX0gZWxzZSB7DQorCQllbmNsb3NpbmdUeXBlID0gcmVmZXJlbmNlQmluZGluZzsNCisJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZXNbXTsNCisJCWlmIChkZXB0aCA+PSAyKSB7DQorCQkJZW5jbG9zaW5nVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tkZXB0aF07DQorCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisJCQkJZW5jbG9zaW5nVHlwZXNbaV0gPSBlbmNsb3NpbmdUeXBlOw0KKwkJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCk7DQorCQkJfQ0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykNCisJCQkJYWRkSW5uZXJDbGFzc2VzKGVuY2xvc2luZ1R5cGVzW2ldKTsNCisJCX0gZWxzZSB7DQorCQkJYWRkSW5uZXJDbGFzc2VzKGJpbmRpbmcpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBJTlRFUk5BTCBVU0UtT05MWQ0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYSBuZXcgaW5uZXIgY2xhc3MuIEl0IGNoZWNrcyB0aGF0IHRoZSBiaW5kaW5nIEBiaW5kaW5nIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbnNpZGUgdGhlDQorCSAqIGNvbGxlY3Rpb24gb2YgaW5uZXIgY2xhc3Nlcy4gQWRkIGFsbCB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGZpdCB0byB0aGUgc3BlY2lmaWNhdGlvbnMuDQorCSAqDQorCSAqIEBwYXJhbSBiaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZw0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVjb3JkTmVzdGVkTWVtYmVyQXR0cmlidXRlKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZykgew0KIAkJYWRkSW5uZXJDbGFzc2VzKGJpbmRpbmcpOw0KIAl9DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGEgbmV3IGlubmVyIGNsYXNzLiBJdCBjaGVja3MgdGhhdCB0aGUgYmluZGluZyBAYmluZGluZyBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW5zaWRlIHRoZQ0KLSAqIGNvbGxlY3Rpb24gb2YgaW5uZXIgY2xhc3Nlcy4gQWRkIGFsbCB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGZpdCB0byB0aGUgc3BlY2lmaWNhdGlvbnMuDQotICoNCi0gKiBAcGFyYW0gYmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCByZWNvcmROZXN0ZWRNZW1iZXJBdHRyaWJ1dGUoUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nKSB7DQotCWFkZElubmVyQ2xhc3NlcyhiaW5kaW5nKTsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBTZWFyY2ggdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbg0KLSAqDQotICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCi0gKi8NCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hMaW5lTnVtYmVyKGludFtdIHN0YXJ0TGluZUluZGV4ZXMsIGludCBwb3NpdGlvbikgew0KLQkvLyB0aGlzIGNvZGUgaXMgY29tcGxldGVseSB1c2VsZXNzLCBidXQgaXQgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gdGhhbg0KLQkvLyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtSGFuZGxlci5zZWFyY2hMaW5lTnVtYmVyKGludFtdLCBpbnQpDQotCS8vIGlmIChzdGFydExpbmVJbmRleGVzID09IG51bGwpDQotCS8vCXJldHVybiAxOw0KLQlpbnQgbGVuZ3RoID0gc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGg7DQotCWlmIChsZW5ndGggPT0gMCkNCi0JCXJldHVybiAxOw0KLQlpbnQgZyA9IDAsIGQgPSBsZW5ndGggLSAxOw0KLQlpbnQgbSA9IDA7DQotCXdoaWxlIChnIDw9IGQpIHsNCi0JCW0gPSAoZyArIGQpIC8yOw0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogU2VhcmNoIHRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24NCisJICoNCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaExpbmVOdW1iZXIoDQorCQlpbnRbXSBzdGFydExpbmVJbmRleGVzLA0KKwkJaW50IHBvc2l0aW9uKSB7DQorCQkvLyB0aGlzIGNvZGUgaXMgY29tcGxldGVseSB1c2VsZXNzLCBidXQgaXQgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gdGhhbg0KKwkJLy8gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbUhhbmRsZXIuc2VhcmNoTGluZU51bWJlcihpbnRbXSwgaW50KQ0KKwkJLy8gaWYgKHN0YXJ0TGluZUluZGV4ZXMgPT0gbnVsbCkNCisJCS8vCXJldHVybiAxOw0KKwkJaW50IGxlbmd0aCA9IHN0YXJ0TGluZUluZGV4ZXMubGVuZ3RoOw0KKwkJaWYgKGxlbmd0aCA9PSAwKQ0KKwkJCXJldHVybiAxOw0KKwkJaW50IGcgPSAwLCBkID0gbGVuZ3RoIC0gMTsNCisJCWludCBtID0gMDsNCisJCXdoaWxlIChnIDw9IGQpIHsNCisJCQltID0gKGcgKyBkKSAvIDI7DQorCQkJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgew0KKwkJCQlkID0gbSAtIDE7DQorCQkJfSBlbHNlDQorCQkJCWlmIChwb3NpdGlvbiA+IHN0YXJ0TGluZUluZGV4ZXNbbV0pIHsNCisJCQkJCWcgPSBtICsgMTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXJldHVybiBtICsgMTsNCisJCQkJfQ0KKwkJfQ0KIAkJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgew0KLQkJCWQgPSBtLTE7DQotCQl9IGVsc2UgaWYgKHBvc2l0aW9uID4gc3RhcnRMaW5lSW5kZXhlc1ttXSkgew0KLQkJCWcgPSBtKzE7DQotCQl9IGVsc2Ugew0KIAkJCXJldHVybiBtICsgMTsNCiAJCX0NCisJCXJldHVybiBtICsgMjsNCiAJfQ0KLQlpZiAocG9zaXRpb24gPCBzdGFydExpbmVJbmRleGVzW21dKSB7DQotCQlyZXR1cm4gbSsxOw0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogVGhpcyBtZXRob2RzIGxlYXZlcyB0aGUgc3BhY2UgZm9yIG1ldGhvZCBjb3VudHMgcmVjb3JkaW5nLg0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Rm9yTWV0aG9kSW5mb3MoKSB7DQorCQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbWV0aG9kQ291bnQNCisJCW1ldGhvZENvdW50T2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7DQorCQljb250ZW50c09mZnNldCArPSAyOw0KIAl9DQotCXJldHVybiBtKzI7DQotfQ0KLS8qKg0KLSAqIElOVEVSTkFMIFVTRS1PTkxZDQotICogVGhpcyBtZXRob2RzIGxlYXZlcyB0aGUgc3BhY2UgZm9yIG1ldGhvZCBjb3VudHMgcmVjb3JkaW5nLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldEZvck1ldGhvZEluZm9zKCkgew0KLQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbWV0aG9kQ291bnQNCi0JbWV0aG9kQ291bnRPZmZzZXQgPSBjb250ZW50c09mZnNldDsNCi0JY29udGVudHNPZmZzZXQgKz0gMjsNCi19DQotLyoqDQotICogSU5URVJOQUwgVVNFLU9OTFkNCi0gKiBvdXRwdXRQYXRoIGlzIGZvcm1lZCBsaWtlOg0KLSAqCSAgIGM6XHRlbXBcIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGZpbGUgc2VwYXJhdG9yDQotICogcmVsYXRpdmVGaWxlTmFtZSBpcyBmb3JtZWQgbGlrZToNCi0gKiAgICAgamF2YVxsYW5nXFN0cmluZy5jbGFzcw0KLSAqIEBwYXJhbSBmaWxlTmFtZSBqYXZhLmxhbmcuU3RyaW5nDQotICogQHBhcmFtIGNvbnRlbnQgYnl0ZVtdDQotICovDQotcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9EaXNrKFN0cmluZyBvdXRwdXRQYXRoLCBTdHJpbmcgcmVsYXRpdmVGaWxlTmFtZSwgYnl0ZVtdIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlTdHJpbmcgZmlsZU5hbWU7DQotCUZpbGUgZmlsZTsNCi0JRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlID0gbmV3IEZpbGUoKGZpbGVOYW1lID0gYnVpbGRBbGxEaXJlY3Rvcmllc0ludG8ob3V0cHV0UGF0aCwgcmVsYXRpdmVGaWxlTmFtZSkpKSk7DQotCW91dHB1dC53cml0ZShjb250ZW50cyk7DQotCW91dHB1dC5mbHVzaCgpOw0KLQlvdXRwdXQuY2xvc2UoKTsNCi19DQotfQ0KKw0KKwkvKioNCisJICogSU5URVJOQUwgVVNFLU9OTFkNCisJICogb3V0cHV0UGF0aCBpcyBmb3JtZWQgbGlrZToNCisJICoJICAgYzpcdGVtcFwgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgZmlsZSBzZXBhcmF0b3INCisJICogcmVsYXRpdmVGaWxlTmFtZSBpcyBmb3JtZWQgbGlrZToNCisJICogICAgIGphdmFcbGFuZ1xTdHJpbmcuY2xhc3MNCisJICogQHBhcmFtIGZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcNCisJICogQHBhcmFtIGNvbnRlbnQgYnl0ZVtdDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0Rpc2soDQorCQlTdHJpbmcgb3V0cHV0UGF0aCwNCisJCVN0cmluZyByZWxhdGl2ZUZpbGVOYW1lLA0KKwkJYnl0ZVtdIGNvbnRlbnRzKQ0KKwkJdGhyb3dzIElPRXhjZXB0aW9uIHsNCisJCVN0cmluZyBmaWxlTmFtZTsNCisJCUZpbGUgZmlsZTsNCisJCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0NCisJCQluZXcgRmlsZU91dHB1dFN0cmVhbSgNCisJCQkJZmlsZSA9DQorCQkJCQluZXcgRmlsZSgoZmlsZU5hbWUgPSBidWlsZEFsbERpcmVjdG9yaWVzSW50byhvdXRwdXRQYXRoLCByZWxhdGl2ZUZpbGVOYW1lKSkpKTsNCisJCW91dHB1dC53cml0ZShjb250ZW50cyk7DQorCQlvdXRwdXQuZmx1c2goKTsNCisJCW91dHB1dC5jbG9zZSgpOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKaW5kZXggZjdjZjQ1ZS4uN2M3MDhmYyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKQEAgLTE4LDExICsxOCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC4qOw0KIA0KIHB1YmxpYyBjbGFzcyBDb21waWxlciBpbXBsZW1lbnRzIElUeXBlUmVxdWVzdG9yLCBQcm9ibGVtU2V2ZXJpdGllcyB7DQotCXB1YmxpYyBQYXJzZXIgcGFyc2VyOwkNCisJcHVibGljIFBhcnNlciBwYXJzZXI7DQogCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3I7DQogCXB1YmxpYyBDb21waWxlck9wdGlvbnMgb3B0aW9uczsNCiAJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7DQotCQ0KKw0KIAkvLyBtYW5hZ2VtZW50IG9mIHVuaXQgdG8gYmUgcHJvY2Vzc2VkDQogCS8vcHVibGljIENvbXBpbGF0aW9uVW5pdFJlc3VsdCBjdXJyZW50Q29tcGlsYXRpb25Vbml0UmVzdWx0Ow0KIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHVuaXRzVG9Qcm9jZXNzOw0KQEAgLTMyLDQwNyArMzIsNDgxIEBACiAJcHVibGljIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50Ow0KIA0KIAkvLyBPTkNFIFNUQUJJTElaRUQsIFRIRVNFIFNIT1VMRCBSRVRVUk4gVE8gQSBGSU5BTCBGSUVMRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsgDQotCXB1YmxpYyBpbnQgcGFyc2VUaHJlc2hvbGQgPSAtMTsgLy8gbnVtYmVyIG9mIGluaXRpYWwgdW5pdHMgcGFyc2VkIGF0IG9uY2UgKC0xOiBub25lKQ0KLS8qKg0KLSAqIEFuc3dlciBhIG5ldyBjb21waWxlciB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgb3B0aW9ucy4NCi0gKiBUaGUgZW52aXJvbm1lbnQgYW5kIG9wdGlvbnMgd2lsbCBiZSBpbiBlZmZlY3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcGlsZXIuDQotICogV2hlbiB0aGUgY29tcGlsZXIgaXMgcnVuLCBjb21waWxhdGlvbiByZXN1bHRzIGFyZSBzZW50IHRvIHRoZSBnaXZlbiByZXF1ZXN0b3IuDQotICoNCi0gKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuZW52LklOYW1lRW52aXJvbm1lbnQNCi0gKiAgICAgIEVudmlyb25tZW50IHVzZWQgYnkgdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlc29sdmUgdHlwZSBhbmQgcGFja2FnZQ0KLSAqICAgICAgbmFtZXMuIFRoZSBuYW1lIGVudmlyb25tZW50IGltcGxlbWVudHMgdGhlIGFjdHVhbCBjb25uZWN0aW9uIG9mIHRoZSBjb21waWxlcg0KLSAqICAgICAgdG8gdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gaW4gYmF0Y2ggbW9kZSB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBwZXJmb3JtaW5nDQotICogICAgICBwdXJlIGZpbGUgYWNjZXNzZXMsIHJldXNlIHByZXZpb3VzIGJ1aWxkIHN0YXRlIG9yIGNvbm5lY3Rpb24gdG8gcmVwb3NpdG9yaWVzKS4NCi0gKiAgICAgIE5vdGU6IHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFjdHVhbCBjbGFzc3BhdGgNCi0gKiAgICAgICAgICAgIHJ1bGVzLg0KLSAqDQotICogIEBwYXJhbSBwb2xpY3kgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklFcnJvckhhbmRsaW5nUG9saWN5DQotICogICAgICBDb25maWd1cmFibGUgcGFydCBmb3IgcHJvYmxlbSBoYW5kbGluZywgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIGNsaWVudCB0bw0KLSAqICAgICAgc3BlY2lmeSB0aGUgcnVsZXMgZm9yIGhhbmRsaW5nIHByb2JsZW1zIChzdG9wIG9uIGZpcnN0IGVycm9yIG9yIGFjY3VtdWxhdGUNCi0gKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cNCi0gKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuDQotICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzDQotICogICAgICANCi0gKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLklDb21waWxlclJlcXVlc3Rvcg0KLSAqICAgICAgQ29tcG9uZW50IHdoaWNoIHdpbGwgcmVjZWl2ZSBhbmQgcGVyc2lzdCBhbGwgY29tcGlsYXRpb24gcmVzdWx0cyBhbmQgaXMgaW50ZW5kZWQNCi0gKiAgICAgIHRvIGNvbnN1bWUgdGhlbSBhcyB0aGV5IGFyZSBwcm9kdWNlZC4gVHlwaWNhbGx5LCBpbiBhIGJhdGNoIGNvbXBpbGVyLCBpdCBpcyANCi0gKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQotICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuQ29tcGlsYXRpb25SZXN1bHQNCi0gKg0KLSAqICBAcGFyYW0gcHJvYmxlbUZhY3Rvcnkgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklQcm9ibGVtRmFjdG9yeQ0KLSAqICAgICAgRmFjdG9yeSB1c2VkIGluc2lkZSB0aGUgY29tcGlsZXIgdG8gY3JlYXRlIHByb2JsZW0gZGVzY3JpcHRvcnMuIEl0IGFsbG93cyB0aGUNCi0gKiAgICAgIGNvbXBpbGVyIGNsaWVudCB0byBzdXBwbHkgaXRzIG93biByZXByZXNlbnRhdGlvbiBvZiBjb21waWxhdGlvbiBwcm9ibGVtcyBpbg0KLSAqICAgICAgb3JkZXIgdG8gYXZvaWQgb2JqZWN0IGNvbnZlcnNpb25zLiBOb3RlIHRoYXQgdGhlIGZhY3RvcnkgaXMgbm90IHN1cHBvc2VkDQotICogICAgICB0byBhY2N1bXVsYXRlIHRoZSBjcmVhdGVkIHByb2JsZW1zLCB0aGUgY29tcGlsZXIgd2lsbCBnYXRoZXIgdGhlbSBhbGwgYW5kIGhhbmQNCi0gKiAgICAgIHRoZW0gYmFjayBhcyBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdC4NCi0gKi8NCi1wdWJsaWMgQ29tcGlsZXIoDQotCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIA0KLQlJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3ksIA0KLQlDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncywgDQotCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsIA0KLQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7DQorCXB1YmxpYyBpbnQgcGFyc2VUaHJlc2hvbGQgPSAtMTsNCisJLy8gbnVtYmVyIG9mIGluaXRpYWwgdW5pdHMgcGFyc2VkIGF0IG9uY2UgKC0xOiBub25lKQ0KKwkvKioNCisJICogQW5zd2VyIGEgbmV3IGNvbXBpbGVyIHVzaW5nIHRoZSBnaXZlbiBuYW1lIGVudmlyb25tZW50IGFuZCBjb21waWxlciBvcHRpb25zLg0KKwkgKiBUaGUgZW52aXJvbm1lbnQgYW5kIG9wdGlvbnMgd2lsbCBiZSBpbiBlZmZlY3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcGlsZXIuDQorCSAqIFdoZW4gdGhlIGNvbXBpbGVyIGlzIHJ1biwgY29tcGlsYXRpb24gcmVzdWx0cyBhcmUgc2VudCB0byB0aGUgZ2l2ZW4gcmVxdWVzdG9yLg0KKwkgKg0KKwkgKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuZW52LklOYW1lRW52aXJvbm1lbnQNCisJICogICAgICBFbnZpcm9ubWVudCB1c2VkIGJ5IHRoZSBjb21waWxlciBpbiBvcmRlciB0byByZXNvbHZlIHR5cGUgYW5kIHBhY2thZ2UNCisJICogICAgICBuYW1lcy4gVGhlIG5hbWUgZW52aXJvbm1lbnQgaW1wbGVtZW50cyB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gb2YgdGhlIGNvbXBpbGVyDQorCSAqICAgICAgdG8gdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gaW4gYmF0Y2ggbW9kZSB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBwZXJmb3JtaW5nDQorCSAqICAgICAgcHVyZSBmaWxlIGFjY2Vzc2VzLCByZXVzZSBwcmV2aW91cyBidWlsZCBzdGF0ZSBvciBjb25uZWN0aW9uIHRvIHJlcG9zaXRvcmllcykuDQorCSAqICAgICAgTm90ZTogdGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgYWN0dWFsIGNsYXNzcGF0aA0KKwkgKiAgICAgICAgICAgIHJ1bGVzLg0KKwkgKg0KKwkgKiAgQHBhcmFtIHBvbGljeSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uSUVycm9ySGFuZGxpbmdQb2xpY3kNCisJICogICAgICBDb25maWd1cmFibGUgcGFydCBmb3IgcHJvYmxlbSBoYW5kbGluZywgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIGNsaWVudCB0bw0KKwkgKiAgICAgIHNwZWNpZnkgdGhlIHJ1bGVzIGZvciBoYW5kbGluZyBwcm9ibGVtcyAoc3RvcCBvbiBmaXJzdCBlcnJvciBvciBhY2N1bXVsYXRlDQorCSAqICAgICAgdGhlbSBhbGwpIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHBlcmZvcm0gc29tZSBhY3Rpb25zIHN1Y2ggYXMgb3BlbmluZyBhIGRpYWxvZw0KKwkgKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuDQorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcw0KKwkgKiAgICAgIA0KKwkgKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLklDb21waWxlclJlcXVlc3Rvcg0KKwkgKiAgICAgIENvbXBvbmVudCB3aGljaCB3aWxsIHJlY2VpdmUgYW5kIHBlcnNpc3QgYWxsIGNvbXBpbGF0aW9uIHJlc3VsdHMgYW5kIGlzIGludGVuZGVkDQorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIA0KKwkgKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLkNvbXBpbGF0aW9uUmVzdWx0DQorCSAqDQorCSAqICBAcGFyYW0gcHJvYmxlbUZhY3Rvcnkgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklQcm9ibGVtRmFjdG9yeQ0KKwkgKiAgICAgIEZhY3RvcnkgdXNlZCBpbnNpZGUgdGhlIGNvbXBpbGVyIHRvIGNyZWF0ZSBwcm9ibGVtIGRlc2NyaXB0b3JzLiBJdCBhbGxvd3MgdGhlDQorCSAqICAgICAgY29tcGlsZXIgY2xpZW50IHRvIHN1cHBseSBpdHMgb3duIHJlcHJlc2VudGF0aW9uIG9mIGNvbXBpbGF0aW9uIHByb2JsZW1zIGluDQorCSAqICAgICAgb3JkZXIgdG8gYXZvaWQgb2JqZWN0IGNvbnZlcnNpb25zLiBOb3RlIHRoYXQgdGhlIGZhY3RvcnkgaXMgbm90IHN1cHBvc2VkDQorCSAqICAgICAgdG8gYWNjdW11bGF0ZSB0aGUgY3JlYXRlZCBwcm9ibGVtcywgdGhlIGNvbXBpbGVyIHdpbGwgZ2F0aGVyIHRoZW0gYWxsIGFuZCBoYW5kDQorCSAqICAgICAgdGhlbSBiYWNrIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0Lg0KKwkgKi8NCisJcHVibGljIENvbXBpbGVyKA0KKwkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwNCisJCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzLA0KKwkJSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwNCisJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgew0KIA0KLQkvLyBjcmVhdGUgYSBwcm9ibGVtIGhhbmRsZXIgZ2l2ZW4gYSBoYW5kbGluZyBwb2xpY3kNCi0JdGhpcy5vcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7DQotCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOw0KLQl0aGlzLnByb2JsZW1SZXBvcnRlciA9IA0KLQkJbmV3IFByb2JsZW1SZXBvcnRlcigNCi0JCQlwb2xpY3ksIA0KLQkJCXRoaXMub3B0aW9ucywgDQotCQkJcHJvYmxlbUZhY3RvcnkpOw0KLQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0gbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIG9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgZW52aXJvbm1lbnQpOw0KLQl0aGlzLnBhcnNlciA9IA0KLQkJbmV3IFBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIHRoaXMub3B0aW9ucy5wYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzKTsgDQotfQ0KLS8qKg0KLSAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlDQotICovDQotDQotcHVibGljIHZvaWQgYWNjZXB0KElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQotCWxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsNCi19DQotLyoqDQotICogQWRkIGFuIGFkZGl0aW9uYWwgY29tcGlsYXRpb24gdW5pdCBpbnRvIHRoZSBsb29wDQotICogIC0+ICBidWlsZCBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9ucywgdGhlaXIgYmluZGluZ3MgYW5kIHJlY29yZCB0aGVpciByZXN1bHRzLg0KLSAqLw0KLQ0KLXB1YmxpYyB2b2lkIGFjY2VwdChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHsNCi0JLy8gU3dpdGNoIHRoZSBjdXJyZW50IHBvbGljeSBhbmQgY29tcGlsYXRpb24gcmVzdWx0IGZvciB0aGlzIHVuaXQgdG8gdGhlIHJlcXVlc3RlZCBvbmUuDQotCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPSANCi0JCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCB0b3RhbFVuaXRzLCB0b3RhbFVuaXRzKTsgDQotCXRyeSB7DQotCQkvLyBkaWV0IHBhcnNpbmcgZm9yIGxhcmdlIGNvbGxlY3Rpb24gb2YgdW5pdA0KLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdDsNCi0JCWlmICh0b3RhbFVuaXRzIDwgcGFyc2VUaHJlc2hvbGQpIHsNCi0JCQlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXQsIHVuaXRSZXN1bHQpOw0KLQkJfSBlbHNlIHsNCi0JCQlwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsNCi0JCX0NCi0NCi0JCWlmIChvcHRpb25zLnZlcmJvc2UpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJjb21waWxhdGlvbi5yZXF1ZXN0Ii8qbm9uTkxTKi8sbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKHRvdGFsVW5pdHMgKyAxKSxTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSksbmV3IFN0cmluZyhzb3VyY2VVbml0LmdldEZpbGVOYW1lKCkpfSkpOyANCi0JCX0NCi0NCi0JCS8vIGluaXRpYWwgdHlwZSBiaW5kaW5nIGNyZWF0aW9uDQotCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsNCi0JCXRoaXMuYWRkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVVuaXQsIHBhcnNlZFVuaXQpOw0KLQ0KLQkJLy8gYmluZGluZyByZXNvbHV0aW9uDQotCQlsb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsNCi0JfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgew0KLQkJLy8gYXQgdGhpcyBwb2ludCwgY3VycmVudENvbXBpbGF0aW9uVW5pdFJlc3VsdCBtYXkgbm90IGJlIHNvdXJjZVVuaXQsIGJ1dCBzb21lIG90aGVyDQotCQkvLyBvbmUgcmVxdWVzdGVkIGZ1cnRoZXIgYWxvbmcgdG8gcmVzb2x2ZSBzb3VyY2VVbml0Lg0KLQkJaWYgKHVuaXRSZXN1bHQuY29tcGlsYXRpb25Vbml0ID09IHNvdXJjZVVuaXQpIHsgLy8gb25seSByZXBvcnQgb25jZQ0KLQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdFJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOw0KLQkJfSBlbHNlIHsNCi0JCQl0aHJvdyBlOyAvLyB3YW50IHRvIGFib3J0IGVuY2xvc2luZyByZXF1ZXN0IHRvIGNvbXBpbGUNCi0JCX0NCisJCS8vIGNyZWF0ZSBhIHByb2JsZW0gaGFuZGxlciBnaXZlbiBhIGhhbmRsaW5nIHBvbGljeQ0KKwkJdGhpcy5vcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7DQorCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsNCisJCXRoaXMucHJvYmxlbVJlcG9ydGVyID0NCisJCQluZXcgUHJvYmxlbVJlcG9ydGVyKHBvbGljeSwgdGhpcy5vcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7DQorCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0NCisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBlbnZpcm9ubWVudCk7DQorCQl0aGlzLnBhcnNlciA9DQorCQkJbmV3IFBhcnNlcigNCisJCQkJcHJvYmxlbVJlcG9ydGVyLCANCisJCQkJdGhpcy5vcHRpb25zLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMsIA0KKwkJCQl0aGlzLm9wdGlvbnMuZ2V0QXNzZXJ0TW9kZSgpKTsNCiAJfQ0KLX0NCi0vKioNCi0gKiBBZGQgYW4gYWRkaXRpb25hbCBzb3VyY2UgdHlwZQ0KLSAqLw0KKwkNCisJLyoqDQorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCisJCWxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsNCisJfQ0KIA0KLXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZSBzb3VyY2VUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KLQlwcm9ibGVtUmVwb3J0ZXIuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoVXRpbC5iaW5kKCJhYm9ydC5hZ2FpbnN0U291cmNlTW9kZWwgIi8qbm9uTkxTKi8sU3RyaW5nLnZhbHVlT2Yoc291cmNlVHlwZS5nZXROYW1lKCkpLFN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGUuZ2V0RmlsZU5hbWUoKSkpKTsNCi19DQotcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgew0KLQ0KLQkvLyBhcHBlbmQgdGhlIHVuaXQgdG8gdGhlIGxpc3Qgb2Ygb25lcyB0byBwcm9jZXNzIGxhdGVyIG9uDQotCWludCBzaXplID0gdW5pdHNUb1Byb2Nlc3MubGVuZ3RoOw0KLQlpZiAodG90YWxVbml0cyA9PSBzaXplKQkvLyB3aGVuIGdyb3dpbmcgcmVwb3NpdGlvbiB1bml0cyBzdGFydGluZyBhdCBwb3NpdGlvbiAwDQotCQlTeXN0ZW0uYXJyYXljb3B5KHVuaXRzVG9Qcm9jZXNzLCAwLCAodW5pdHNUb1Byb2Nlc3MgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bc2l6ZSAqIDJdKSwgMCwgdG90YWxVbml0cyk7DQotCXVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMrK10gPSBwYXJzZWRVbml0Ow0KLX0NCi0vKioNCi0gKiBBZGQgdGhlIGluaXRpYWwgc2V0IG9mIGNvbXBpbGF0aW9uIHVuaXRzIGludG8gdGhlIGxvb3ANCi0gKiAgLT4gIGJ1aWxkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb25zLCB0aGVpciBiaW5kaW5ncyBhbmQgcmVjb3JkIHRoZWlyIHJlc3VsdHMuDQotICovDQotcHJvdGVjdGVkIHZvaWQgYmVnaW5Ub0NvbXBpbGUoSUNvbXBpbGF0aW9uVW5pdFtdIHNvdXJjZVVuaXRzKSB7DQotCWludCBtYXhVbml0cyA9IHNvdXJjZVVuaXRzLmxlbmd0aDsNCi0JdG90YWxVbml0cyA9IDA7IA0KLQl1bml0c1RvUHJvY2VzcyA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvblttYXhVbml0c107DQotDQotCS8vIFN3aXRjaCB0aGUgY3VycmVudCBwb2xpY3kgYW5kIGNvbXBpbGF0aW9uIHJlc3VsdCBmb3IgdGhpcyB1bml0IHRvIHRoZSByZXF1ZXN0ZWQgb25lLg0KLQlmb3IgKGludCBpID0gMDsgaSA8IG1heFVuaXRzOyBpKyspIHsNCi0JCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7DQotCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXRzW2ldLCBpLCBtYXhVbml0cyk7DQorCS8qKg0KKwkgKiBBZGQgYW4gYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0IGludG8gdGhlIGxvb3ANCisJICogIC0+ICBidWlsZCBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9ucywgdGhlaXIgYmluZGluZ3MgYW5kIHJlY29yZCB0aGVpciByZXN1bHRzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgew0KKwkJLy8gU3dpdGNoIHRoZSBjdXJyZW50IHBvbGljeSBhbmQgY29tcGlsYXRpb24gcmVzdWx0IGZvciB0aGlzIHVuaXQgdG8gdGhlIHJlcXVlc3RlZCBvbmUuDQorCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0NCisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgdG90YWxVbml0cywgdG90YWxVbml0cyk7DQogCQl0cnkgew0KLQkJCS8vIGRpZXQgcGFyc2luZyBmb3IgbGFyZ2UgY29sbGVjdGlvbiBvZiB1bml0cw0KLQkJCWlmICh0b3RhbFVuaXRzIDwgcGFyc2VUaHJlc2hvbGQpDQotCQkJewlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXRzW2ldLCB1bml0UmVzdWx0KTt9DQotCQkJZWxzZQ0KLQkJCXsJcGFyc2VkVW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdHNbaV0sIHVuaXRSZXN1bHQpO30NCi0JCQlpZiAob3B0aW9ucy52ZXJib3NlKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnJlcXVlc3QiLypub25OTFMqLyxuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YoaSsxKSxTdHJpbmcudmFsdWVPZihtYXhVbml0cyksbmV3IFN0cmluZyhzb3VyY2VVbml0c1tpXS5nZXRGaWxlTmFtZSgpKX0pKTsNCisJCQkvLyBkaWV0IHBhcnNpbmcgZm9yIGxhcmdlIGNvbGxlY3Rpb24gb2YgdW5pdA0KKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7DQorCQkJaWYgKHRvdGFsVW5pdHMgPCBwYXJzZVRocmVzaG9sZCkgew0KKwkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXQsIHVuaXRSZXN1bHQpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXBhcnNlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHVuaXRSZXN1bHQpOw0KIAkJCX0NCisNCisJCQlpZiAob3B0aW9ucy52ZXJib3NlKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigNCisJCQkJCVV0aWwuYmluZCgNCisJCQkJCQkiY29tcGlsYXRpb24ucmVxdWVzdCIgLCAvLyROT04tTkxTLTEkDQorCQkJCQkJbmV3IFN0cmluZ1tdIHsNCisJCQkJCQkJU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cyArIDEpLA0KKwkJCQkJCQlTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSksDQorCQkJCQkJCW5ldyBTdHJpbmcoc291cmNlVW5pdC5nZXRGaWxlTmFtZSgpKX0pKTsNCisJCQl9DQorDQogCQkJLy8gaW5pdGlhbCB0eXBlIGJpbmRpbmcgY3JlYXRpb24NCiAJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsNCi0JCQl0aGlzLmFkZENvbXBpbGF0aW9uVW5pdChzb3VyY2VVbml0c1tpXSwgcGFyc2VkVW5pdCk7DQotCQkvL30gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsNCi0JCS8vCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdFJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlzb3VyY2VVbml0c1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBob2xkIG9udG8gdGhlIHVuaXQNCi0JCX0NCi0JfQ0KLQkvLyBiaW5kaW5nIHJlc29sdXRpb24NCi0JbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsNCi19DQotLyoqDQotICogR2VuZXJhbCBBUEkNCi0gKiAtPiBjb21waWxlIGVhY2ggb2Ygc3VwcGxpZWQgZmlsZXMNCi0gKiAtPiByZWNvbXBpbGUgYW55IHJlcXVpcmVkIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlIGFuIGluY29tcGxldGUgcHJpbmNpcGxlIHN0cnVjdHVyZQ0KLSAqLw0KKwkJCXRoaXMuYWRkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVVuaXQsIHBhcnNlZFVuaXQpOw0KIA0KLXB1YmxpYyB2b2lkIGNvbXBpbGUoSUNvbXBpbGF0aW9uVW5pdFtdIHNvdXJjZVVuaXRzKSB7DQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOw0KLQlpbnQgaSA9IDA7DQotCXRyeSB7DQotCQkvLyBidWlsZCBhbmQgcmVjb3JkIHBhcnNlZCB1bml0cw0KLQ0KLQkJYmVnaW5Ub0NvbXBpbGUoc291cmNlVW5pdHMpOw0KLQ0KLQkJLy8gcHJvY2VzcyBhbGwgdW5pdHMgKHNvbWUgbW9yZSBjb3VsZCBiZSBpbmplY3RlZCBpbiB0aGUgbG9vcCBieSB0aGUgbG9va3VwIGVudmlyb25tZW50KQ0KLQkJZm9yICg7IGkgPCB0b3RhbFVuaXRzOyBpKyspIHsNCi0JCQl1bml0ID0gdW5pdHNUb1Byb2Nlc3NbaV07DQotCQkJdHJ5IHsNCi0JCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiY29tcGlsYXRpb24ucHJvY2VzcyIvKm5vbk5MUyovLG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihpICsgMSksU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cyksbmV3IFN0cmluZyh1bml0c1RvUHJvY2Vzc1tpXS5nZXRGaWxlTmFtZSgpKX0pKTsgDQotCQkJCXByb2Nlc3ModW5pdCwgaSk7DQotCQkJfSBmaW5hbGx5IHsNCi0JCQkJLy8gY2xlYW51cCBjb21waWxhdGlvbiB1bml0IHJlc3VsdA0KLQkJCQl1bml0LmNsZWFuVXAoKTsNCi0JCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkgDQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJjb21waWxhdGlvbi5kb25lIi8qbm9uTkxTKi8sbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGkgKyAxKSxTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzKSxuZXcgU3RyaW5nKHVuaXRzVG9Qcm9jZXNzW2ldLmdldEZpbGVOYW1lKCkpfSkpOyAgDQorCQkJLy8gYmluZGluZyByZXNvbHV0aW9uDQorCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7DQorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7DQorCQkJLy8gYXQgdGhpcyBwb2ludCwgY3VycmVudENvbXBpbGF0aW9uVW5pdFJlc3VsdCBtYXkgbm90IGJlIHNvdXJjZVVuaXQsIGJ1dCBzb21lIG90aGVyDQorCQkJLy8gb25lIHJlcXVlc3RlZCBmdXJ0aGVyIGFsb25nIHRvIHJlc29sdmUgc291cmNlVW5pdC4NCisJCQlpZiAodW5pdFJlc3VsdC5jb21waWxhdGlvblVuaXQgPT0gc291cmNlVW5pdCkgeyAvLyBvbmx5IHJlcG9ydCBvbmNlDQorCQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdFJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXRocm93IGU7IC8vIHdhbnQgdG8gYWJvcnQgZW5jbG9zaW5nIHJlcXVlc3QgdG8gY29tcGlsZQ0KIAkJCX0NCi0JCQl1bml0c1RvUHJvY2Vzc1tpXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uDQotCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7DQotCQl9DQotCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgew0KLQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0KTsNCi0JfSBjYXRjaCAoRXJyb3IgZSkgew0KLQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0LCBudWxsKTsNCi0JCXRocm93IGU7IC8vIHJldGhyb3cNCi0JfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQotCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOw0KLQkJdGhyb3cgZTsgLy8gcmV0aHJvdw0KLQl9IGZpbmFsbHkgew0KLQkJdGhpcy5yZXNldCgpOw0KLQl9DQotCWlmIChvcHRpb25zLnZlcmJvc2UpIHsNCi0JCWlmICh0b3RhbFVuaXRzID4gMSkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImNvbXBpbGF0aW9uLnVuaXRzIi8qbm9uTkxTKi8sU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cykpKTsNCi0JCX0gZWxzZSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5pdCIvKm5vbk5MUyovLFN0cmluZy52YWx1ZU9mKHRvdGFsVW5pdHMpKSk7DQogCQl9DQogCX0NCi19DQotLyoqDQotICogQW5zd2VyIGFuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLg0KLSAqIFRoZSBkZXNjcmlwdGlvbnMgbWF5IGJlIGNoYW5nZWQgYW5kIHBhc3NlZCBiYWNrIHRvIGEgZGlmZmVyZW50DQotICogY29tcGlsZXIuDQotICoNCi0gKiAgQHJldHVybiBDb25maWd1cmFibGVPcHRpb25bXSAtIGFycmF5IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zDQotICovDQotcHVibGljIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQotCXJldHVybiBuZXcgQ29tcGlsZXJPcHRpb25zKCkuZ2V0Q29uZmlndXJhYmxlT3B0aW9ucyhsb2NhbGUpOw0KLX0NCi1wcm90ZWN0ZWQgdm9pZCBnZXRNZXRob2RCb2RpZXMoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IHBsYWNlKSB7DQotCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZA0KLQkNCi0JaWYgKHVuaXQuaWdub3JlTWV0aG9kQm9kaWVzKSB7DQotCQl1bml0Lmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsNCi0JCXJldHVybjsgLy8gaWYgaW5pdGlhbCBkaWV0IHBhcnNlIGRpZCBub3Qgd29yaywgbm8gbmVlZCB0byBkaWcgaW50byBtZXRob2QgYm9kaWVzLg0KKw0KKwkvKioNCisJICogQWRkIGFkZGl0aW9uYWwgc291cmNlIHR5cGVzDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCisJCXByb2JsZW1SZXBvcnRlci5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigNCisJCQlVdGlsLmJpbmQoDQorCQkJCSJhYm9ydC5hZ2FpbnN0U291cmNlTW9kZWwgIiAsIC8vJE5PTi1OTFMtMSQNCisJCQkJU3RyaW5nLnZhbHVlT2Yoc291cmNlVHlwZXNbMF0uZ2V0TmFtZSgpKSwNCisJCQkJU3RyaW5nLnZhbHVlT2Yoc291cmNlVHlwZXNbMF0uZ2V0RmlsZU5hbWUoKSkpKTsNCiAJfQ0KLQkNCi0JaWYgKHBsYWNlIDwgcGFyc2VUaHJlc2hvbGQpDQotCQlyZXR1cm47IC8vd29yayBhbHJlYWR5IGRvbmUgLi4uDQogDQotCS8vcmVhbCBwYXJzZSBvZiB0aGUgbWV0aG9kLi4uLg0KLQlwYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2VCdWZmZXIodW5pdC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSk7DQotCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsNCi0JCWZvciAoaW50IGkgPSB1bml0LnR5cGVzLmxlbmd0aDsgLS1pID49IDA7KQ0KLQkJCXVuaXQudHlwZXNbaV0ucGFyc2VNZXRob2QocGFyc2VyLCB1bml0KTsNCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsYXRpb25Vbml0KA0KKwkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LA0KKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgew0KKw0KKwkJLy8gYXBwZW5kIHRoZSB1bml0IHRvIHRoZSBsaXN0IG9mIG9uZXMgdG8gcHJvY2VzcyBsYXRlciBvbg0KKwkJaW50IHNpemUgPSB1bml0c1RvUHJvY2Vzcy5sZW5ndGg7DQorCQlpZiAodG90YWxVbml0cyA9PSBzaXplKQ0KKwkJCS8vIHdoZW4gZ3Jvd2luZyByZXBvc2l0aW9uIHVuaXRzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDANCisJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQl1bml0c1RvUHJvY2VzcywNCisJCQkJMCwNCisJCQkJKHVuaXRzVG9Qcm9jZXNzID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW3NpemUgKiAyXSksDQorCQkJCTAsDQorCQkJCXRvdGFsVW5pdHMpOw0KKwkJdW5pdHNUb1Byb2Nlc3NbdG90YWxVbml0cysrXSA9IHBhcnNlZFVuaXQ7DQogCX0NCi19DQotLyoNCi0gKiBDb21waWxlciBjcmFzaCByZWNvdmVyeSBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb25zDQotICovDQotcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oVGhyb3dhYmxlIGludGVybmFsRXhjZXB0aW9uLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBDb21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsNCiANCi0JLyogZHVtcCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBjb25zb2xlICovDQotCWludGVybmFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyANCi0JCQ0KLQkvKiBmaW5kIGEgY29tcGlsYXRpb24gcmVzdWx0ICovDQotCWlmICgodW5pdCAhPSBudWxsKSkgLy8gYmFzaW5nIHJlc3VsdCB1cG9uIHRoZSBjdXJyZW50IHVuaXQgaWYgYXZhaWxhYmxlDQotCQlyZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OyAvLyBjdXJyZW50IHVuaXQgYmVpbmcgcHJvY2Vzc2VkID8NCi0JaWYgKChyZXN1bHQgPT0gbnVsbCkgJiYgKHVuaXRzVG9Qcm9jZXNzICE9IG51bGwpICYmICh0b3RhbFVuaXRzID4gMCkpDQotCQlyZXN1bHQgPSB1bml0c1RvUHJvY2Vzc1t0b3RhbFVuaXRzIC0gMV0uY29tcGlsYXRpb25SZXN1bHQ7IC8vIGxhc3QgdW5pdCBpbiBiZWdpblRvQ29tcGlsZSA/DQotCQkNCi0JaWYgKHJlc3VsdCAhPSBudWxsKSB7DQotCQkvKiBjcmVhdGUgYW5kIHJlY29yZCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gKi8NCi0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsNCi0JCWludGVybmFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOw0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHN0cmluZ1dyaXRlci5nZXRCdWZmZXIoKTsNCisJLyoqDQorCSAqIEFkZCB0aGUgaW5pdGlhbCBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgaW50byB0aGUgbG9vcA0KKwkgKiAgLT4gIGJ1aWxkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb25zLCB0aGVpciBiaW5kaW5ncyBhbmQgcmVjb3JkIHRoZWlyIHJlc3VsdHMuDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBiZWdpblRvQ29tcGlsZShJQ29tcGlsYXRpb25Vbml0W10gc291cmNlVW5pdHMpIHsNCisJCWludCBtYXhVbml0cyA9IHNvdXJjZVVuaXRzLmxlbmd0aDsNCisJCXRvdGFsVW5pdHMgPSAwOw0KKwkJdW5pdHNUb1Byb2Nlc3MgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bbWF4VW5pdHNdOw0KIA0KLQkJcmVzdWx0LnJlY29yZCgNCi0JCQlwcm9ibGVtUmVwb3J0ZXIuY3JlYXRlUHJvYmxlbSgNCi0JCQkJcmVzdWx0LmdldEZpbGVOYW1lKCksIA0KLQkJCQlQcm9ibGVtSXJyaXRhbnRzLlVuY2xhc3NpZmllZFByb2JsZW0sIA0KLQkJCQluZXcgU3RyaW5nW10ge1V0aWwuYmluZCgiY29tcGlsYXRpb24uaW50ZXJuYWxFcnJvciIvKm5vbk5MUyovKSsiXG4iLypub25OTFMqLyArIGJ1ZmZlci50b1N0cmluZygpfSwNCi0JCQkJRXJyb3IsIC8vIHNldmVyaXR5DQorCQkvLyBTd2l0Y2ggdGhlIGN1cnJlbnQgcG9saWN5IGFuZCBjb21waWxhdGlvbiByZXN1bHQgZm9yIHRoaXMgdW5pdCB0byB0aGUgcmVxdWVzdGVkIG9uZS4NCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4VW5pdHM7IGkrKykgew0KKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7DQorCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9DQorCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0c1tpXSwgaSwgbWF4VW5pdHMpOw0KKwkJCXRyeSB7DQorCQkJCS8vIGRpZXQgcGFyc2luZyBmb3IgbGFyZ2UgY29sbGVjdGlvbiBvZiB1bml0cw0KKwkJCQlpZiAodG90YWxVbml0cyA8IHBhcnNlVGhyZXNob2xkKSB7DQorCQkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXRzW2ldLCB1bml0UmVzdWx0KTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXBhcnNlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXRzW2ldLCB1bml0UmVzdWx0KTsNCisJCQkJfQ0KKwkJCQlpZiAob3B0aW9ucy52ZXJib3NlKSB7DQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oDQorCQkJCQkJVXRpbC5iaW5kKA0KKwkJCQkJCQkiY29tcGlsYXRpb24ucmVxdWVzdCIgLCAvLyROT04tTkxTLTEkDQorCQkJCQkJCW5ldyBTdHJpbmdbXSB7DQorCQkJCQkJCQlTdHJpbmcudmFsdWVPZihpICsgMSksDQorCQkJCQkJCQlTdHJpbmcudmFsdWVPZihtYXhVbml0cyksDQorCQkJCQkJCQluZXcgU3RyaW5nKHNvdXJjZVVuaXRzW2ldLmdldEZpbGVOYW1lKCkpfSkpOw0KKwkJCQl9DQorCQkJCS8vIGluaXRpYWwgdHlwZSBiaW5kaW5nIGNyZWF0aW9uDQorCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOw0KKwkJCQl0aGlzLmFkZENvbXBpbGF0aW9uVW5pdChzb3VyY2VVbml0c1tpXSwgcGFyc2VkVW5pdCk7DQorCQkJCS8vfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgew0KKwkJCQkvLwlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXRSZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsNCisJCQl9IGZpbmFsbHkgew0KKwkJCQlzb3VyY2VVbml0c1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBob2xkIG9udG8gdGhlIHVuaXQNCisJCQl9DQorCQl9DQorCQkvLyBiaW5kaW5nIHJlc29sdXRpb24NCisJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEdlbmVyYWwgQVBJDQorCSAqIC0+IGNvbXBpbGUgZWFjaCBvZiBzdXBwbGllZCBmaWxlcw0KKwkgKiAtPiByZWNvbXBpbGUgYW55IHJlcXVpcmVkIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlIGFuIGluY29tcGxldGUgcHJpbmNpcGxlIHN0cnVjdHVyZQ0KKwkgKi8NCisJcHVibGljIHZvaWQgY29tcGlsZShJQ29tcGlsYXRpb25Vbml0W10gc291cmNlVW5pdHMpIHsNCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOw0KKwkJaW50IGkgPSAwOw0KKwkJdHJ5IHsNCisJCQkvLyBidWlsZCBhbmQgcmVjb3JkIHBhcnNlZCB1bml0cw0KKw0KKwkJCWJlZ2luVG9Db21waWxlKHNvdXJjZVVuaXRzKTsNCisNCisJCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpDQorCQkJZm9yICg7IGkgPCB0b3RhbFVuaXRzOyBpKyspIHsNCisJCQkJdW5pdCA9IHVuaXRzVG9Qcm9jZXNzW2ldOw0KKwkJCQl0cnkgew0KKwkJCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkNCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oDQorCQkJCQkJCVV0aWwuYmluZCgNCisJCQkJCQkJCSJjb21waWxhdGlvbi5wcm9jZXNzIiAsIC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJCW5ldyBTdHJpbmdbXSB7DQorCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoaSArIDEpLA0KKwkJCQkJCQkJCVN0cmluZy52YWx1ZU9mKHRvdGFsVW5pdHMpLA0KKwkJCQkJCQkJCW5ldyBTdHJpbmcodW5pdHNUb1Byb2Nlc3NbaV0uZ2V0RmlsZU5hbWUoKSl9KSk7DQorCQkJCQlwcm9jZXNzKHVuaXQsIGkpOw0KKwkJCQl9IGZpbmFsbHkgew0KKwkJCQkJLy8gY2xlYW51cCBjb21waWxhdGlvbiB1bml0IHJlc3VsdA0KKwkJCQkJdW5pdC5jbGVhblVwKCk7DQorCQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQ0KKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImNvbXBpbGF0aW9uLmRvbmUiLCAvLyROT04tTkxTLTEkDQorCQkJCQluZXcgU3RyaW5nW10gew0KKwkJCQkJCVN0cmluZy52YWx1ZU9mKGkgKyAxKSwNCisJCQkJCQlTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzKSwNCisJCQkJCQluZXcgU3RyaW5nKHVuaXRzVG9Qcm9jZXNzW2ldLmdldEZpbGVOYW1lKCkpfSkpOw0KKwkJCQl9DQorCQkJCXVuaXRzVG9Qcm9jZXNzW2ldID0gbnVsbDsgLy8gcmVsZWFzZSByZWZlcmVuY2UgdG8gcHJvY2Vzc2VkIHVuaXQgZGVjbGFyYXRpb24NCisJCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7DQorCQkJfQ0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQorCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0KTsNCisJCX0gY2F0Y2ggKEVycm9yIGUpIHsNCisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOw0KKwkJCXRocm93IGU7IC8vIHJldGhyb3cNCisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KKwkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCwgbnVsbCk7DQorCQkJdGhyb3cgZTsgLy8gcmV0aHJvdw0KKwkJfSBmaW5hbGx5IHsNCisJCQl0aGlzLnJlc2V0KCk7DQorCQl9DQorCQlpZiAob3B0aW9ucy52ZXJib3NlKSB7DQorCQkJaWYgKHRvdGFsVW5pdHMgPiAxKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigNCisJCQkJCVV0aWwuYmluZCgiY29tcGlsYXRpb24udW5pdHMiICwgU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cykpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0gZWxzZSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigNCisJCQkJCVV0aWwuYmluZCgiY29tcGlsYXRpb24udW5pdCIgLCBTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzKSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIGdldE1ldGhvZEJvZGllcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBpbnQgcGxhY2UpIHsNCisJCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZA0KKw0KKwkJaWYgKHVuaXQuaWdub3JlTWV0aG9kQm9kaWVzKSB7DQorCQkJdW5pdC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7DQorCQkJcmV0dXJuOw0KKwkJCS8vIGlmIGluaXRpYWwgZGlldCBwYXJzZSBkaWQgbm90IHdvcmssIG5vIG5lZWQgdG8gZGlnIGludG8gbWV0aG9kIGJvZGllcy4NCisJCX0NCisNCisJCWlmIChwbGFjZSA8IHBhcnNlVGhyZXNob2xkKQ0KKwkJCXJldHVybjsgLy93b3JrIGFscmVhZHkgZG9uZSAuLi4NCisNCisJCS8vcmVhbCBwYXJzZSBvZiB0aGUgbWV0aG9kLi4uLg0KKwkJcGFyc2VyLnNjYW5uZXIuc2V0U291cmNlQnVmZmVyKA0KKwkJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldENvbnRlbnRzKCkpOw0KKwkJaWYgKHVuaXQudHlwZXMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSB1bml0LnR5cGVzLmxlbmd0aDsgLS1pID49IDA7KQ0KKwkJCQl1bml0LnR5cGVzW2ldLnBhcnNlTWV0aG9kKHBhcnNlciwgdW5pdCk7DQorCQl9DQorCX0NCisNCisJLyoNCisJICogQ29tcGlsZXIgY3Jhc2ggcmVjb3ZlcnkgaW4gY2FzZSBvZiB1bmV4cGVjdGVkIHJ1bnRpbWUgZXhjZXB0aW9ucw0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oDQorCQlUaHJvd2FibGUgaW50ZXJuYWxFeGNlcHRpb24sDQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LA0KKwkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KSB7DQorDQorCQkvKiBkdW1wIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGNvbnNvbGUgKi8NCisJCWludGVybmFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOw0KKw0KKwkJLyogZmluZCBhIGNvbXBpbGF0aW9uIHJlc3VsdCAqLw0KKwkJaWYgKCh1bml0ICE9IG51bGwpKSAvLyBiYXNpbmcgcmVzdWx0IHVwb24gdGhlIGN1cnJlbnQgdW5pdCBpZiBhdmFpbGFibGUNCisJCQlyZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OyAvLyBjdXJyZW50IHVuaXQgYmVpbmcgcHJvY2Vzc2VkID8NCisJCWlmICgocmVzdWx0ID09IG51bGwpICYmICh1bml0c1RvUHJvY2VzcyAhPSBudWxsKSAmJiAodG90YWxVbml0cyA+IDApKQ0KKwkJCXJlc3VsdCA9IHVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsNCisJCS8vIGxhc3QgdW5pdCBpbiBiZWdpblRvQ29tcGlsZSA/DQorDQorCQlpZiAocmVzdWx0ICE9IG51bGwpIHsNCisJCQkvKiBjcmVhdGUgYW5kIHJlY29yZCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gKi8NCisJCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKwkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOw0KKwkJCWludGVybmFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOw0KKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCk7DQorDQorCQkJcmVzdWx0DQorCQkJCS5yZWNvcmQoDQorCQkJCQlwcm9ibGVtUmVwb3J0ZXINCisJCQkJCS5jcmVhdGVQcm9ibGVtKA0KKwkJCQkJCXJlc3VsdC5nZXRGaWxlTmFtZSgpLA0KKwkJCQkJCVByb2JsZW1JcnJpdGFudHMuVW5jbGFzc2lmaWVkUHJvYmxlbSwNCisJCQkJCQluZXcgU3RyaW5nW10gew0KKwkJCQkJCQlVdGlsLmJpbmQoImNvbXBpbGF0aW9uLmludGVybmFsRXJyb3IiICkgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQkJKyAiXG4iICAvLyROT04tTkxTLTEkDQorCQkJCQkJCQkrIGJ1ZmZlci50b1N0cmluZygpfSwNCisJCQkJCQlFcnJvciwNCisJCQkvLyBzZXZlcml0eQ0KKwkJCTAsIC8vIHNvdXJjZSBzdGFydA0KKwkJCTAsIC8vIHNvdXJjZSBlbmQNCisJCQkwKSk7IC8vIGxpbmUgbnVtYmVyCQkNCisNCisJCQkvKiBoYW5kIGJhY2sgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdCAqLw0KKwkJCWlmICghcmVzdWx0Lmhhc0JlZW5BY2NlcHRlZCkgew0KKwkJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKg0KKwkgKiBDb21waWxlciByZWNvdmVyeSBpbiBjYXNlIG9mIGludGVybmFsIEFib3J0Q29tcGlsYXRpb24gZXZlbnQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludGVybmFsRXhjZXB0aW9uKA0KKwkJQWJvcnRDb21waWxhdGlvbiBhYm9ydEV4Y2VwdGlvbiwNCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsNCisNCisJCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBTaWxlbnRBYm9ydDogc2lsZW50bHkgY2FuY2VsbGluZyB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyAqLw0KKwkJaWYgKGFib3J0RXhjZXB0aW9uLmlzU2lsZW50KSB7DQorCQkJaWYgKGFib3J0RXhjZXB0aW9uLnNpbGVudEV4Y2VwdGlvbiA9PSBudWxsKSB7DQorCQkJCXJldHVybjsNCisJCQl9IGVsc2Ugew0KKwkJCQl0aHJvdyBhYm9ydEV4Y2VwdGlvbi5zaWxlbnRFeGNlcHRpb247DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyogdW5jb21tZW50IGZvbGxvd2luZyBsaW5lIHRvIHNlZSB3aGVyZSB0aGUgYWJvcnQgY2FtZSBmcm9tICovDQorCQkvLyBhYm9ydEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsgDQorDQorCQkvLyBFeGNlcHRpb24gbWF5IHRlbGwgd2hpY2ggY29tcGlsYXRpb24gcmVzdWx0IGl0IGlzIHJlbGF0ZWQsIGFuZCB3aGljaCBwcm9ibGVtIGNhdXNlZCBpdA0KKwkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gYWJvcnRFeGNlcHRpb24uY29tcGlsYXRpb25SZXN1bHQ7DQorCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdCAhPSBudWxsKSkNCisJCQlyZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OyAvLyBjdXJyZW50IHVuaXQgYmVpbmcgcHJvY2Vzc2VkID8NCisJCWlmICgocmVzdWx0ID09IG51bGwpICYmICh1bml0c1RvUHJvY2VzcyAhPSBudWxsKSAmJiAodG90YWxVbml0cyA+IDApKQ0KKwkJCXJlc3VsdCA9IHVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsNCisJCS8vIGxhc3QgdW5pdCBpbiBiZWdpblRvQ29tcGlsZSA/DQorCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5oYXNCZWVuQWNjZXB0ZWQpIHsNCisJCQkvKiBkaXN0YW50IHByb2JsZW0gd2hpY2ggY291bGQgbm90IGJlIHJlcG9ydGVkIGJhY2sgdGhlcmUgKi8NCisJCQlpZiAoYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkICE9IDApIHsNCisJCQkJcmVzdWx0DQorCQkJCQkucmVjb3JkKA0KKwkJCQkJCXByb2JsZW1SZXBvcnRlcg0KKwkJCQkJCS5jcmVhdGVQcm9ibGVtKA0KKwkJCQkJCQlyZXN1bHQuZ2V0RmlsZU5hbWUoKSwNCisJCQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkLA0KKwkJCQkJCQlhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtQXJndW1lbnRzLA0KKwkJCQkJCQlFcnJvciwNCisJCQkJLy8gc2V2ZXJpdHkNCiAJCQkJMCwgLy8gc291cmNlIHN0YXJ0DQogCQkJCTAsIC8vIHNvdXJjZSBlbmQNCi0JCQkJMCkpOyAvLyBsaW5lIG51bWJlcgkJDQotDQotCQkvKiBoYW5kIGJhY2sgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdCAqLw0KLQkJaWYgKCFyZXN1bHQuaGFzQmVlbkFjY2VwdGVkKSB7DQotCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdChyZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsNCisJCQkJMCkpOyAvLyBsaW5lIG51bWJlcg0KKwkJCX0gZWxzZSB7DQorCQkJCS8qIGRpc3RhbnQgaW50ZXJuYWwgZXhjZXB0aW9uIHdoaWNoIGNvdWxkIG5vdCBiZSByZXBvcnRlZCBiYWNrIHRoZXJlICovDQorCQkJCWlmIChhYm9ydEV4Y2VwdGlvbi5leGNlcHRpb24gIT0gbnVsbCkgew0KKwkJCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihhYm9ydEV4Y2VwdGlvbi5leGNlcHRpb24sIG51bGwsIHJlc3VsdCk7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQl9DQorCQkJLyogaGFuZCBiYWNrIHRoZSBjb21waWxhdGlvbiByZXN1bHQgKi8NCisJCQlpZiAoIXJlc3VsdC5oYXNCZWVuQWNjZXB0ZWQpIHsNCisJCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdChyZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCS8qDQorCQkJaWYgKGFib3J0RXhjZXB0aW9uLnByb2JsZW1JZCAhPSAwKXsgDQorCQkJCUlQcm9ibGVtIHByb2JsZW0gPQ0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyLmNyZWF0ZVByb2JsZW0oDQorCQkJCQkJIj8/PyIudG9DaGFyQXJyYXkoKSwNCisJCQkJCQlhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQsIA0KKwkJCQkJCWFib3J0RXhjZXB0aW9uLnByb2JsZW1Bcmd1bWVudHMsIA0KKwkJCQkJCUVycm9yLCAvLyBzZXZlcml0eQ0KKwkJCQkJCTAsIC8vIHNvdXJjZSBzdGFydA0KKwkJCQkJCTAsIC8vIHNvdXJjZSBlbmQNCisJCQkJCQkwKTsgLy8gbGluZSBudW1iZXINCisJCQkJU3lzdGVtLm91dC5wcmludGxuKHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsNCisJCQl9DQorCQkJKi8NCisJCQlhYm9ydEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsNCiAJCX0NCiAJfQ0KLX0NCi0vKg0KLSAqIENvbXBpbGVyIHJlY292ZXJ5IGluIGNhc2Ugb2YgaW50ZXJuYWwgQWJvcnRDb21waWxhdGlvbiBldmVudA0KLSAqLw0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUludGVybmFsRXhjZXB0aW9uKEFib3J0Q29tcGlsYXRpb24gYWJvcnRFeGNlcHRpb24sIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpew0KIA0KLQkvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgU2lsZW50QWJvcnQ6IHNpbGVudGx5IGNhbmNlbGxpbmcgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgKi8NCi0JaWYgKGFib3J0RXhjZXB0aW9uLmlzU2lsZW50KXsNCi0JCWlmIChhYm9ydEV4Y2VwdGlvbi5zaWxlbnRFeGNlcHRpb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0gZWxzZSB7DQotCQkJdGhyb3cgYWJvcnRFeGNlcHRpb24uc2lsZW50RXhjZXB0aW9uOw0KKwkvKioNCisJICogUHJvY2VzcyBhIGNvbXBpbGF0aW9uIHVuaXQgYWxyZWFkeSBwYXJzZWQgYW5kIGJ1aWxkLg0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IGkpIHsNCisNCisJCWdldE1ldGhvZEJvZGllcyh1bml0LCBpKTsNCisNCisJCS8vIGZhdWx0IGluIGZpZWxkcyAmIG1ldGhvZHMNCisJCWlmICh1bml0LnNjb3BlICE9IG51bGwpDQorCQkJdW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsNCisNCisJCS8vIHZlcmlmeSBpbmhlcml0ZWQgbWV0aG9kcw0KKwkJaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkNCisJCQl1bml0LnNjb3BlLnZlcmlmeU1ldGhvZHMobG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKSk7DQorDQorCQkvLyB0eXBlIGNoZWNraW5nDQorCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KKwkJdW5pdC5yZXNvbHZlKCk7DQorDQorCQkvLyBmbG93IGFuYWx5c2lzDQorCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisJCXVuaXQuYW5hbHlzZUNvZGUoKTsNCisNCisJCS8vIGNvZGUgZ2VuZXJhdGlvbg0KKwkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorCQl1bml0LmdlbmVyYXRlQ29kZSgpOw0KKw0KKwkJLy8gcmVmZXJlbmNlIGluZm8NCisJCWlmIChvcHRpb25zLnByb2R1Y2VSZWZlcmVuY2VJbmZvICYmIHVuaXQuc2NvcGUgIT0gbnVsbCkNCisJCQl1bml0LnNjb3BlLnN0b3JlRGVwZW5kZW5jeUluZm8oKTsNCisNCisJCS8vIHJlZnJlc2ggdGhlIHRvdGFsIG51bWJlciBvZiB1bml0cyBrbm93biBhdCB0aGlzIHN0YWdlDQorCQl1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRvdGFsVW5pdHNLbm93biA9IHRvdGFsVW5pdHM7DQorCX0NCisJcHVibGljIHZvaWQgcmVzZXQoKSB7DQorCQlsb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOw0KKwkJcGFyc2VyLnNjYW5uZXIuc291cmNlID0gbnVsbDsNCisJCXVuaXRzVG9Qcm9jZXNzID0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmUNCisJICovDQorCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXNvbHZlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgew0KKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7DQorCQl0cnkgew0KKwkJCS8vIGJ1aWxkIGFuZCByZWNvcmQgcGFyc2VkIHVuaXRzDQorCQkJcGFyc2VUaHJlc2hvbGQgPSAxOyAvLyB3aWxsIHJlcXVlc3QgYSBmdWxsIHBhcnNlDQorCQkJYmVnaW5Ub0NvbXBpbGUobmV3IElDb21waWxhdGlvblVuaXRbXSB7IHNvdXJjZVVuaXQgfSk7DQorCQkJLy8gcHJvY2VzcyBhbGwgdW5pdHMgKHNvbWUgbW9yZSBjb3VsZCBiZSBpbmplY3RlZCBpbiB0aGUgbG9vcCBieSB0aGUgbG9va3VwIGVudmlyb25tZW50KQ0KKwkJCXVuaXQgPSB1bml0c1RvUHJvY2Vzc1swXTsNCisJCQkvL2dldE1ldGhvZEJvZGllcyh1bml0LGkpOw0KKwkJCWlmICh1bml0LnNjb3BlICE9IG51bGwpIHsNCisJCQkJLy8gZmF1bHQgaW4gZmllbGRzICYgbWV0aG9kcw0KKwkJCQl1bml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOw0KKwkJCQkvLyB0eXBlIGNoZWNraW5nDQorCQkJCXVuaXQucmVzb2x2ZSgpOw0KKwkJCX0NCisJCQl1bml0c1RvUHJvY2Vzc1swXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uDQorCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7DQorCQkJcmV0dXJuIHVuaXQ7DQorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsNCisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQpOw0KKwkJCXJldHVybiB1bml0ID09IG51bGwgPyB1bml0c1RvUHJvY2Vzc1swXSA6IHVuaXQ7DQorCQl9IGNhdGNoIChFcnJvciBlKSB7DQorCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0LCBudWxsKTsNCisJCQl0aHJvdyBlOyAvLyByZXRocm93DQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsNCisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOw0KKwkJCXRocm93IGU7IC8vIHJldGhyb3cNCisJCX0gZmluYWxseSB7DQorCQkJLy8gTm8gcmVzZXQgaXMgcGVyZm9ybWVkIHRoZXJlIGFueW1vcmUgc2luY2UsDQorCQkJLy8gd2l0aGluIHRoZSBDb2RlQXNzaXN0IChvciByZWxhdGVkIHRvb2xzKSwNCisJCQkvLyB0aGUgY29tcGlsZXIgbWF5IGJlIGNhbGxlZCAqYWZ0ZXIqIGEgY2FsbA0KKwkJCS8vIHRvIHRoaXMgcmVzb2x2ZSguLi4pIG1ldGhvZC4gQW5kIHN1Y2ggYSBjYWxsDQorCQkJLy8gbmVlZHMgdG8gaGF2ZSBhIGNvbXBpbGVyIHdpdGggYSBub24tZW1wdHkNCisJCQkvLyBlbnZpcm9ubWVudC4NCisJCQkvLyB0aGlzLnJlc2V0KCk7DQogCQl9DQogCX0NCiAJDQotCS8qIHVuY29tbWVudCBmb2xsb3dpbmcgbGluZSB0byBzZWUgd2hlcmUgdGhlIGFib3J0IGNhbWUgZnJvbSAqLw0KLQkvLyBhYm9ydEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsgDQorCS8qKg0KKwkgKiBSZXR1cm5zIGFsbCB0aGUgb3B0aW9ucyBvZiB0aGUgY29tcGlsZXIgdG8gYmUgc2hvd24gYnkgdGhlIFVJDQorCSAqDQorCSAqIEBwYXJhbSBsb2NhbGUgamF2YS51dGlsLkxvY2FsZQ0KKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25maWd1cmFibGVPcHRpb25bXQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQorCQlTdHJpbmdbXSBpZHMgPSBDb25maWd1cmFibGVPcHRpb24uZ2V0SURzKENvbXBpbGVyLmNsYXNzLmdldE5hbWUoKSxsb2NhbGUpOw0KKwkNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbltdIHJlc3VsdCA9IG5ldyBDb25maWd1cmFibGVPcHRpb25baWRzLmxlbmd0aF07DQorCQlmb3IoaW50IGkgPSAwIDsgaSA8IGlkcy5sZW5ndGggOyBpKyspew0KKwkJCXJlc3VsdFtpXSA9IG5ldyBDb25maWd1cmFibGVPcHRpb24oaWRzW2ldLGxvY2FsZSk7DQorCQl9DQogCQkNCi0JLy8gRXhjZXB0aW9uIG1heSB0ZWxsIHdoaWNoIGNvbXBpbGF0aW9uIHJlc3VsdCBpdCBpcyByZWxhdGVkLCBhbmQgd2hpY2ggcHJvYmxlbSBjYXVzZWQgaXQNCi0JQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gYWJvcnRFeGNlcHRpb24uY29tcGlsYXRpb25SZXN1bHQ7IA0KLQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdCAhPSBudWxsKSkgcmVzdWx0ID0gdW5pdC5jb21waWxhdGlvblJlc3VsdDsgLy8gY3VycmVudCB1bml0IGJlaW5nIHByb2Nlc3NlZCA/DQotCWlmICgocmVzdWx0ID09IG51bGwpICYmICh1bml0c1RvUHJvY2VzcyAhPSBudWxsKSAmJiAodG90YWxVbml0cyA+IDApKSByZXN1bHQgPSB1bml0c1RvUHJvY2Vzc1t0b3RhbFVuaXRzIC0gMV0uY29tcGlsYXRpb25SZXN1bHQ7IC8vIGxhc3QgdW5pdCBpbiBiZWdpblRvQ29tcGlsZSA/DQotCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0Lmhhc0JlZW5BY2NlcHRlZCl7DQotCQkvKiBkaXN0YW50IHByb2JsZW0gd2hpY2ggY291bGQgbm90IGJlIHJlcG9ydGVkIGJhY2sgdGhlcmUgKi8NCi0JCWlmIChhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQgIT0gMCl7IA0KLQkJCXJlc3VsdC5yZWNvcmQoDQotCQkJCXByb2JsZW1SZXBvcnRlci5jcmVhdGVQcm9ibGVtKA0KLQkJCQkJcmVzdWx0LmdldEZpbGVOYW1lKCksDQotCQkJCQlhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQsIA0KLQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUFyZ3VtZW50cywgDQotCQkJCQlFcnJvciwgLy8gc2V2ZXJpdHkNCi0JCQkJCTAsIC8vIHNvdXJjZSBzdGFydA0KLQkJCQkJMCwgLy8gc291cmNlIGVuZA0KLQkJCQkJMCkpOyAvLyBsaW5lIG51bWJlcg0KLQkJfSBlbHNlIHsNCi0JCQkvKiBkaXN0YW50IGludGVybmFsIGV4Y2VwdGlvbiB3aGljaCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQgYmFjayB0aGVyZSAqLw0KLQkJCWlmIChhYm9ydEV4Y2VwdGlvbi5leGNlcHRpb24gIT0gbnVsbCl7DQotCQkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oYWJvcnRFeGNlcHRpb24uZXhjZXB0aW9uLCAJbnVsbCwgcmVzdWx0KTsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCS8qIGhhbmQgYmFjayB0aGUgY29tcGlsYXRpb24gcmVzdWx0ICovDQotCQlpZiAoIXJlc3VsdC5oYXNCZWVuQWNjZXB0ZWQpIHsgDQotCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdChyZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCS8qDQotCQlpZiAoYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkICE9IDApeyANCi0JCQlJUHJvYmxlbSBwcm9ibGVtID0NCi0JCQkJcHJvYmxlbVJlcG9ydGVyLmNyZWF0ZVByb2JsZW0oDQotCQkJCQkiPz8/Ii50b0NoYXJBcnJheSgpLA0KLQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkLCANCi0JCQkJCWFib3J0RXhjZXB0aW9uLnByb2JsZW1Bcmd1bWVudHMsIA0KLQkJCQkJRXJyb3IsIC8vIHNldmVyaXR5DQotCQkJCQkwLCAvLyBzb3VyY2Ugc3RhcnQNCi0JCQkJCTAsIC8vIHNvdXJjZSBlbmQNCi0JCQkJCTApOyAvLyBsaW5lIG51bWJlcg0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9ibGVtLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkqLw0KLQkJYWJvcnRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KIAl9DQotfQ0KLS8qKg0KLSAqIFByb2Nlc3MgYSBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgcGFyc2VkIGFuZCBidWlsZC4NCi0gKi8NCi1wcml2YXRlIHZvaWQgcHJvY2VzcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LGludCBpKSB7DQotDQotCWdldE1ldGhvZEJvZGllcyh1bml0LGkpOw0KLQ0KLQkvLyBmYXVsdCBpbiBmaWVsZHMgJiBtZXRob2RzDQotCWlmICh1bml0LnNjb3BlICE9IG51bGwpDQotCQl1bml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOw0KLQ0KLQkvLyB2ZXJpZnkgaW5oZXJpdGVkIG1ldGhvZHMNCi0JaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkNCi0JCXVuaXQuc2NvcGUudmVyaWZ5TWV0aG9kcyhsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsNCi0NCi0JLy8gdHlwZSBjaGVja2luZw0KLQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQl1bml0LnJlc29sdmUoKTsNCi0NCi0JLy8gZmxvdyBhbmFseXNpcw0KLQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0JdW5pdC5hbmFseXNlQ29kZSgpOw0KLQ0KLQkvLyBjb2RlIGdlbmVyYXRpb24NCi0Jc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotCXVuaXQuZ2VuZXJhdGVDb2RlKCk7DQotDQotCS8vIHJlZmVyZW5jZSBpbmZvDQotCWlmIChvcHRpb25zLnByb2R1Y2VSZWZlcmVuY2VJbmZvICYmIHVuaXQuc2NvcGUgIT0gbnVsbCkNCi0JCXVuaXQuc2NvcGUuc3RvcmVEZXBlbmRlbmN5SW5mbygpOw0KLQ0KLQkvLyByZWZyZXNoIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pdHMga25vd24gYXQgdGhpcyBzdGFnZQ0KLQl1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRvdGFsVW5pdHNLbm93biA9IHRvdGFsVW5pdHM7DQotfQ0KLXB1YmxpYyB2b2lkIHJlc2V0KCl7DQotCWxvb2t1cEVudmlyb25tZW50LnJlc2V0KCk7DQotCXBhcnNlci5zY2FubmVyLnNvdXJjZSA9IG51bGw7DQotCXVuaXRzVG9Qcm9jZXNzCSA9IG51bGw7DQotfQ0KLS8qKg0KLSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBjb21waWxhdGlvbiB1bml0IG1pbmltYWxseSBmb3IgY29kZSBhc3Npc3QgZW5naW5lDQotICovDQotDQotcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlc29sdmUoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KSB7DQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOw0KLQl0cnkgew0KLQkJLy8gYnVpbGQgYW5kIHJlY29yZCBwYXJzZWQgdW5pdHMNCi0JCXBhcnNlVGhyZXNob2xkID0gMTsgLy8gd2lsbCByZXF1ZXN0IGEgZnVsbCBwYXJzZQ0KLQkJYmVnaW5Ub0NvbXBpbGUobmV3IElDb21waWxhdGlvblVuaXRbXSB7IHNvdXJjZVVuaXQgfSk7DQotCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpDQotCQl1bml0ID0gdW5pdHNUb1Byb2Nlc3NbMF07DQotCQkvL2dldE1ldGhvZEJvZGllcyh1bml0LGkpOw0KLQkJaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkgew0KLQkJCS8vIGZhdWx0IGluIGZpZWxkcyAmIG1ldGhvZHMNCi0JCQl1bml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOw0KLQkJCS8vIHR5cGUgY2hlY2tpbmcNCi0JCQl1bml0LnJlc29sdmUoKTsNCi0JCX0NCi0JCXVuaXRzVG9Qcm9jZXNzWzBdID0gbnVsbDsgLy8gcmVsZWFzZSByZWZlcmVuY2UgdG8gcHJvY2Vzc2VkIHVuaXQgZGVjbGFyYXRpb24NCi0JCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOw0KLQkJcmV0dXJuIHVuaXQ7DQotCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgew0KLQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0KTsNCi0JCXJldHVybiB1bml0ID09IG51bGwgPyB1bml0c1RvUHJvY2Vzc1swXSA6IHVuaXQ7DQotCX0gY2F0Y2ggKEVycm9yIGUpIHsNCi0JCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCwgbnVsbCk7DQotCQl0aHJvdyBlOyAvLyByZXRocm93DQotCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KLQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0LCBudWxsKTsNCi0JCXRocm93IGU7IC8vIHJldGhyb3cNCi0JfSBmaW5hbGx5IHsNCi0JCS8vIE5vIHJlc2V0IGlzIHBlcmZvcm1lZCB0aGVyZSBhbnltb3JlIHNpbmNlLA0KLQkJLy8gd2l0aGluIHRoZSBDb2RlQXNzaXN0IChvciByZWxhdGVkIHRvb2xzKSwNCi0JCS8vIHRoZSBjb21waWxlciBtYXkgYmUgY2FsbGVkICphZnRlciogYSBjYWxsDQotCQkvLyB0byB0aGlzIHJlc29sdmUoLi4uKSBtZXRob2QuIEFuZCBzdWNoIGEgY2FsbA0KLQkJLy8gbmVlZHMgdG8gaGF2ZSBhIGNvbXBpbGVyIHdpdGggYSBub24tZW1wdHkNCi0JCS8vIGVudmlyb25tZW50Lg0KLQkJLy8gdGhpcy5yZXNldCgpOw0KLQl9DQotfQ0KLX0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbmZpZ3VyYWJsZU9wdGlvbi5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbmZpZ3VyYWJsZU9wdGlvbi5qYXZhCmluZGV4IGU4YjI3YjkuLjYzMjI1MGEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29uZmlndXJhYmxlT3B0aW9uLmphdmEKQEAgLTcsMjA2ICs3LDUwMiBAQAogLyoqDQogICogR2VuZXJpYyBvcHRpb24gZGVzY3JpcHRpb24sIHdoaWNoIGNhbiBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IGZyb20gdGhlDQogICogY29tcG9uZW50IGl0IGJlbG9uZ3MgdG8uDQorICogDQorICogRmlsZSB0byBtb2RpZnkgd2hlbiBhZGRpbmcgYW4gb3B0aW9uIDoNCisgKiBBZGQgb3B0aW9uIGluIG9wdGlvbiBmaWxlIG9mIGNvbXBvbmVudA0KKyAqIE1vZGlmeSBzZXRPcHRpb24gbWV0aG9kIG9mIGNvbXBvbmVudCBvcHRpb24gY2xhc3MNCisgKiANCisgKiBPcHRpb24gZmlsZSBzeW50YXgNCisgKiA8Y29kZT4NCisgKiBjb20uZm9vLkJhci5vcHRpb25PbmUuY2F0ZWdvcnk9Q2F0ZWdvcnkgT25lDQorICogY29tLmZvby5CYXIub3B0aW9uT25lLm5hbWU9T3B0aW9uIE9uZQ0KKyAqIGNvbS5mb28uQmFyLm9wdGlvbk9uZS5wb3NzaWJsZVZhbHVlcz0yfFZhbHVlIDF8VmFsdWUgMg0KKyAqIGNvbS5mb28uQmFyLm9wdGlvbk9uZS5kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiBvZiBPcHRpb24gT25lDQorICogY29tLmZvby5CYXIub3B0aW9uT25lLmRlZmF1bHQ9MA0KKyAqIA0KKyAqIGNvbS5mb28uQmFyLm9wdGlvblR3by5jYXRlZ29yeT1DYXRlZ29yeSBPbmUNCisgKiBjb20uZm9vLkJhci5vcHRpb25Ud28ubmFtZT1PcHRpb24gVHdvDQorICogY29tLmZvby5CYXIub3B0aW9uVHdvLnBvc3NpYmxlVmFsdWVzPS0xfHN0cmluZw0KKyAqIGNvbS5mb28uQmFyLm9wdGlvblR3by5kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiBvZiBPcHRpb24gVHdvDQorICogY29tLmZvby5CYXIub3B0aW9uVHdvLmRlZmF1bHQ9VmFsdWUNCisgKiAgDQorICogY29tLmZvby5CYXIub3B0aW9uVGhyZWUuY2F0ZWdvcnk9Q2F0ZWdvcnkgVHdvDQorICogY29tLmZvby5CYXIub3B0aW9uVGhyZWUubmFtZT1PcHRpb24gVGhyZWUNCisgKiBjb20uZm9vLkJhci5vcHRpb25UaHJlZS5wb3NzaWJsZVZhbHVlcz0tMXxpbnR8MHxubw0KKyAqIGNvbS5mb28uQmFyLm9wdGlvblRocmVlLmRlc2NyaXB0aW9uPURlc2NyaXB0aW9uIG9mIE9wdGlvbiBUaHJlZQ0KKyAqIGNvbS5mb28uQmFyLm9wdGlvblRocmVlLmRlZmF1bHQ9NA0KKyAqIDwvY29kZT4NCisgKiANCisgKiBwb3NzaWJsZVZhbHVlcyB2YWx1ZXMgOg0KKyAqIC0gQSBwb3NpdGl2ZSBudW1iZXIgYW5kIHRoZSBsaXN0IG9mIHRoZSB2YWx1ZQ0KKyAqIC0gVmFsdWUgLTEgZm9sbG93aW5nIGJ5IHR5cGUuIElmIHR5cGUgaXMgYSBudW1iZXINCisgKiB0aGVyZSBpcyBtaW4gYW5kIG1heCB2YWx1ZSAod2l0aCB2YWx1ZSBubyBpZiB0aGVyZSBpcyBubyBtYXggb3IgbWluDQorICogDQorICogZS5nLg0KKyAqIDJ8VmFsdWUgMXxWYWx1ZSAyDQorICogM3xWYWx1ZSAxfFZhbHVlIDJ8VmFsdWUgMw0KKyAqIC0xfHN0cmluZw0KKyAqIC0xfGludHwwfDIwDQorICogLTF8aW50fG5vfDIwDQorICogLTF8aW50fC0xMHxubw0KKyAqIC0xfGludHxub3xubw0KKyAqIC0xfGludA0KKyAqIC0xfGZsb2F0fDAuMHwyMC4wDQorICogLTF8ZmxvYXR8bm98MjAuMA0KKyAqIC0xfGZsb2F0fC0xMC4wfG5vDQorICogLTF8ZmxvYXR8bm98bm8NCisgKiAtMXxmbG9hdA0KKyAqIA0KICAqLw0KLQ0KIGltcG9ydCBqYXZhLnV0aWwuKjsNCiANCiBwdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlT3B0aW9uIHsNCi0JcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50TmFtZTsNCi0JcHJpdmF0ZSBpbnQgaWQ7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVNDUkVURSA9ICJkaXNjcmV0ZSI7IC8vJE5PTi1OTFMtMSQNCisJDQorCS8vIHNwZWNpYWwgdmFsdWUgZm9yIDxwb3NzaWJsZVZhbHVlcz4gaW5kaWNhdGluZyB0aGF0IA0KKwkvLyB0aGUgPGN1cnJlbnRWYWx1ZUluZGV4PiBpcyB0aGUgYWN0dWFsIHZhbHVlDQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gTm9EaXNjcmV0ZVZhbHVlID0ge307DQogDQorCXByaXZhdGUgU3RyaW5nIGlkOw0KKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCisJcHJpdmF0ZSBpbnQgdmFsdWVJbmRleCA9IC0xOw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7DQorCXByaXZhdGUgaW50IGRlZmF1bHRWYWx1ZUluZGV4ID0gLTE7DQogCXByaXZhdGUgU3RyaW5nIGNhdGVnb3J5Ow0KIAlwcml2YXRlIFN0cmluZyBuYW1lOw0KIAlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0JcHJpdmF0ZSBpbnQgY3VycmVudFZhbHVlSW5kZXg7DQotCXByaXZhdGUgaW50IGRlZmF1bHRWYWx1ZUluZGV4Ow0KIAlwcml2YXRlIFN0cmluZ1tdIHBvc3NpYmxlVmFsdWVzOw0KKwlwcml2YXRlIGludCBvcmRlcjsNCisJDQorCXByaXZhdGUgU3RyaW5nIHR5cGU7DQorCXByaXZhdGUgYm9vbGVhbiBtYXhFeGlzdGluZyA9IGZhbHNlOw0KKwlwcml2YXRlIGJvb2xlYW4gbWluRXhpc3RpbmcgPSBmYWxzZTsNCisJcHJpdmF0ZSBpbnQgbWF4SW50Ow0KKwlwcml2YXRlIGludCBtaW5JbnQ7DQorCXByaXZhdGUgZmxvYXQgbWF4RmxvYXQ7DQorCXByaXZhdGUgZmxvYXQgbWluRmxvYXQ7DQorCQ0KKwkNCisJcHJpdmF0ZSBMb2NhbGUgbG9jOw0KIA0KLQkvLyBzcGVjaWFsIHZhbHVlIGZvciA8cG9zc2libGVWYWx1ZXM+IGluZGljYXRpbmcgdGhhdCANCi0JLy8gdGhlIDxjdXJyZW50VmFsdWVJbmRleD4gaXMgdGhlIGFjdHVhbCB2YWx1ZQ0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIE5vRGlzY3JldGVWYWx1ZSA9IHt9OyANCi0vKioNCi0gKiBJTlRFUk5BTCBVU0UgT05MWQ0KLSAqDQotICogSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFjY29yZGluZyB0byBhIHNwZWNpZmljIGxvY2FsZQ0KLSAqDQotICogQHBhcmFtIGxvYyBqYXZhLnV0aWwuTG9jYWxlDQotICovDQotcHVibGljIENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JU3RyaW5nIGNvbXBvbmVudE5hbWUsIA0KLQlTdHJpbmcgb3B0aW9uTmFtZSwgDQotCUxvY2FsZSBsb2MsIA0KLQlpbnQgY3VycmVudFZhbHVlSW5kZXgpIHsNCisJcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50TmFtZTsNCisJcHJpdmF0ZSBTdHJpbmcgbWlzc2luZzsNCiANCi0JdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsNCi0JdGhpcy5jdXJyZW50VmFsdWVJbmRleCA9IGN1cnJlbnRWYWx1ZUluZGV4Ow0KLQkJDQotCVJlc291cmNlQnVuZGxlIHJlc291cmNlID0gbnVsbDsNCi0JdHJ5IHsNCi0JCVN0cmluZyBsb2NhdGlvbiA9IGNvbXBvbmVudE5hbWUuc3Vic3RyaW5nKDAsIGNvbXBvbmVudE5hbWUubGFzdEluZGV4T2YoJy4nKSk7DQotCQlyZXNvdXJjZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShsb2NhdGlvbiArICIub3B0aW9ucyIvKm5vbk5MUyovLCBsb2MpOyANCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCi0JCWNhdGVnb3J5ID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIvKm5vbk5MUyovICsgY29tcG9uZW50TmFtZSArICIgb3B0aW9ucyIvKm5vbk5MUyovOw0KLQkJbmFtZSA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiLypub25OTFMqLyArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiLypub25OTFMqLzsNCi0JCWRlc2NyaXB0aW9uID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIvKm5vbk5MUyovICsgY29tcG9uZW50TmFtZSArICIgb3B0aW9ucyIvKm5vbk5MUyovOw0KLQkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOw0KLQkJaWQgPSAtMTsNCi0JfQ0KLQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuOw0KLQl0cnkgew0KLQkJaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5udW1iZXIiLypub25OTFMqLykpOyANCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCi0JCWlkID0gLTE7DQotCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQlpZCA9IC0xOw0KLQl9DQotCXRyeSB7DQotCQljYXRlZ29yeSA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5jYXRlZ29yeSIvKm5vbk5MUyovKTsgDQotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotCQljYXRlZ29yeSA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiLypub25OTFMqLyArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiLypub25OTFMqLzsNCi0JfQ0KLQl0cnkgew0KLQkJbmFtZSA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5uYW1lIi8qbm9uTkxTKi8pOyANCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCi0JCW5hbWUgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIi8qbm9uTkxTKi8gKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIi8qbm9uTkxTKi87DQotCX0NCi0JdHJ5IHsNCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5wb3NzaWJsZVZhbHVlcyIvKm5vbk5MUyovKSwgInwiLypub25OTFMqLyk7DQotCQlpbnQgbnVtYmVyT2ZWYWx1ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7DQotCQlpZihudW1iZXJPZlZhbHVlcyA9PSAtMSl7DQorCXB1YmxpYyBDb25maWd1cmFibGVPcHRpb24oU3RyaW5nIGlkLCBMb2NhbGUgbG9jKSB7DQorCQl0aGlzLmlkID0gaWQ7DQorCQl0aGlzLnZhbHVlID0gdmFsdWU7DQorCQl0aGlzLmxvYyA9IGxvYzsNCisNCisJCXRoaXMuY29tcG9uZW50TmFtZSA9IGlkLnN1YnN0cmluZygwLGlkLmxhc3RJbmRleE9mKCcuJykpOw0KKw0KKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsNCisJCW1pc3NpbmcgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIiArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJCXRyeSB7DQorCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGNvbXBvbmVudE5hbWUsbG9jKTsgDQorCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KKwkJCWlkID0gbWlzc2luZzsNCisJCQlkZWZhdWx0VmFsdWUgPSBtaXNzaW5nOw0KKwkJCWNhdGVnb3J5ID0gbWlzc2luZzsNCisJCQluYW1lID0gbWlzc2luZzsNCisJCQlkZXNjcmlwdGlvbiA9IG1pc3Npbmc7DQogCQkJcG9zc2libGVWYWx1ZXMgPSBOb0Rpc2NyZXRlVmFsdWU7DQotCQl9IGVsc2Ugew0KLQkJCXBvc3NpYmxlVmFsdWVzID0gbmV3IFN0cmluZ1tudW1iZXJPZlZhbHVlc107DQotCQkJaW50IGluZGV4ID0gMDsNCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KLQkJCQlwb3NzaWJsZVZhbHVlc1tpbmRleF0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCQkJCWluZGV4Kys7DQorCQl9DQorCQlpZiAoYnVuZGxlID09IG51bGwpIHJldHVybjsNCisJCXRyeXsNCisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0NCisJCQkJbmV3IFN0cmluZ1Rva2VuaXplcigNCisJCQkJCWJ1bmRsZS5nZXRTdHJpbmcoaWQgKyAiLnBvc3NpYmxlVmFsdWVzIiksIC8vJE5PTi1OTFMtMSQNCisJCQkJCSJ8Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlpbnQgbnVtYmVyT2ZWYWx1ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7DQorCQkJaWYgKG51bWJlck9mVmFsdWVzID09IC0xKSB7DQorCQkJCS8vIHRoZSBwb3NzaWJsZSB2YWx1ZSBhcmUgbm90IGRpc2NyZXRlDQorCQkJCXBvc3NpYmxlVmFsdWVzID0gTm9EaXNjcmV0ZVZhbHVlOw0KKwkJCQkNCisJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KKwkJCQl0eXBlID0gdG9rZW47DQorCQkJCWlmKHRva2VuLmVxdWFscyhTVFJJTkcpKXsNCisNCisJCQkJfQ0KKwkJCQllbHNlIGlmKHRva2VuLmVxdWFscyhJTlQpICYmIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpew0KKwkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQorCQkJCQlpZighdG9rZW4uZXF1YWxzKCJubyIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCW1pbkV4aXN0aW5nID0gdHJ1ZTsNCisJCQkJCQltaW5JbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuKTsNCisJCQkJCX0NCisJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KKwkJCQkJaWYoIXRva2VuLmVxdWFscygibm8iKSl7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQltYXhFeGlzdGluZyA9IHRydWU7DQorCQkJCQkJbWF4SW50ID0gSW50ZWdlci5wYXJzZUludCh0b2tlbik7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSBpZih0b2tlbi5lcXVhbHMoRkxPQVQpICYmIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpew0KKwkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQorCQkJCQlpZighdG9rZW4uZXF1YWxzKCJubyIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCW1pbkV4aXN0aW5nID0gdHJ1ZTsNCisJCQkJCQltaW5GbG9hdCA9IEZsb2F0LnBhcnNlRmxvYXQodG9rZW4pOw0KKwkJCQkJfQ0KKwkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQorCQkJCQlpZighdG9rZW4uZXF1YWxzKCJubyIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCW1heEV4aXN0aW5nID0gdHJ1ZTsNCisJCQkJCQltYXhGbG9hdCA9IEZsb2F0LnBhcnNlRmxvYXQodG9rZW4pOw0KKwkJCQkJfQ0KKwkJCQl9CQkJDQorCQkJfSBlbHNlIHsNCisJCQkJLy8gcG9zc2libGUgdmFsdWUgYXJlIGRpc2NyZXRlDQorCQkJCXR5cGUgPSBESVNDUkVURTsNCisJCQkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nW251bWJlck9mVmFsdWVzXTsNCisJCQkJaW50IGluZGV4ID0gMDsNCisJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCisJCQkJCXBvc3NpYmxlVmFsdWVzW2luZGV4XSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsNCisJCQkJCWluZGV4Kys7DQorCQkJCX0NCisJCQl9DQorCQkJDQorCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KKwkJCXBvc3NpYmxlVmFsdWVzID0gTm9EaXNjcmV0ZVZhbHVlOw0KKwkJCXR5cGUgPSBtaXNzaW5nOw0KKwkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7DQorCQkJcG9zc2libGVWYWx1ZXMgPSBOb0Rpc2NyZXRlVmFsdWU7DQorCQkJdHlwZSA9IG1pc3Npbmc7DQorCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCXBvc3NpYmxlVmFsdWVzID0gTm9EaXNjcmV0ZVZhbHVlOw0KKwkJCXR5cGUgPSBtaXNzaW5nOw0KKwkJfQ0KKwkJdHJ5ew0KKwkJCWlmKHBvc3NpYmxlVmFsdWVzID09IE5vRGlzY3JldGVWYWx1ZSl7DQorCQkJCWRlZmF1bHRWYWx1ZSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQgKyAiLmRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCQllbHNlew0KKwkJCQlkZWZhdWx0VmFsdWVJbmRleCA9IEludGVnZXIucGFyc2VJbnQoYnVuZGxlLmdldFN0cmluZyhpZCArICIuZGVmYXVsdCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQorCQkJZGVmYXVsdFZhbHVlID0gbWlzc2luZzsNCisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQorCQkJZGVmYXVsdFZhbHVlSW5kZXggPSAtMTsNCisJCX0NCisJCXRyeXsNCisJCQlvcmRlciA9IEludGVnZXIucGFyc2VJbnQoYnVuZGxlLmdldFN0cmluZyhpZCArICIub3JkZXIiKSk7IC8vJE5PTi1OTFMtMSQNCisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQorCQkJb3JkZXIgPSAtMTsNCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQorCQkJb3JkZXIgPSAtMTsNCisJCX0NCisJCXRyeXsNCisJCQljYXRlZ29yeSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQgKyAiLmNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQNCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQorCQkJY2F0ZWdvcnkgPSBtaXNzaW5nOw0KKwkJfQ0KKwkJdHJ5ew0KKwkJCW5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKGlkICsgIi5uYW1lIik7IC8vJE5PTi1OTFMtMSQNCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQorCQkJbmFtZSA9IG1pc3Npbmc7DQorCQl9DQorCQl0cnl7DQorCQkJZGVzY3JpcHRpb24gPSBidW5kbGUuZ2V0U3RyaW5nKGlkICsgIi5kZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkDQorCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KKwkJCWRlc2NyaXB0aW9uID0gbWlzc2luZzsNCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSogSW50ZXJuYWwgSUQgd2hpY2ggYWxsb3dzIHRoZSBjb25maWd1cmFibGUgY29tcG9uZW50IHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBvcHRpb24uDQorCSoNCisJKiBAcmV0dXJuIFN0cmluZw0KKwkqLw0KKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgew0KKwkJcmV0dXJuIGlkOw0KKwl9DQorCQ0KKwkvKioNCisJKiBBbnN3ZXIgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoaXMgcGFydGljdWxhciBvcHRpb24uDQorCSoNCisJKiBAcmV0dXJuIFN0cmluZw0KKwkqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgew0KKwkJaWYocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsNCisJCQlpZiAodmFsdWUgPT0gbnVsbCkNCisJCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOw0KKwkJCXJldHVybiB2YWx1ZTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCWlmICh2YWx1ZUluZGV4ID09IC0xKQ0KKwkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7DQorCQkJcmV0dXJuIHBvc3NpYmxlVmFsdWVzW3ZhbHVlSW5kZXhdOw0KKwkJfQ0KKwl9DQorCQ0KKwkvKioNCisJKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoaXMgcGFydGljdWxhciBvcHRpb24uDQorCSoNCisJKiBAcGFyYW0gdmFsdWUgU3RyaW5nDQorCSovDQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgew0KKwkJaWYocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsNCisJCQl0aGlzLnZhbHVlID0gdmFsdWU7DQorCQl9DQorCQllbHNlew0KKwkJCWZvcihpbnQgaSA9IDAgOyBpIDwgcG9zc2libGVWYWx1ZXMubGVuZ3RoIDsgaSsrKXsNCisJCQkJaWYocG9zc2libGVWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSl7DQorCQkJCQl0aGlzLnZhbHVlSW5kZXggPSBpOw0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCiAJCQl9DQogCQl9DQotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotCQlwb3NzaWJsZVZhbHVlcyA9IG5ldyBTdHJpbmdbMF07DQotCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgew0KLQkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOw0KLQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOw0KIAl9DQotCXRyeSB7DQotCQlkZXNjcmlwdGlvbiA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5kZXNjcmlwdGlvbiIvKm5vbk5MUyovKTsgDQotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotCQlkZXNjcmlwdGlvbiA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiLypub25OTFMqLyArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiLypub25OTFMqLzsNCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgY2F0ZWdvcnkgb2YgdGhlIHJlY2VpdmVyLg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7DQotCXJldHVybiBjYXRlZ29yeTsNCi19DQotLyoqDQotICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY29tcG9uZW50IG93bmVyICh0eXBpY2FsbHkgdGhlIHF1YWxpZmllZA0KLSAqCXR5cGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaXQgY29ycmVzcG9uZHMgdG8pLg0KLSAqDQotICogZS5nLiAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5Db21waWxlciINCi0gKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsNCi0JcmV0dXJuIGNvbXBvbmVudE5hbWU7DQotfQ0KLS8qKg0KLSAqIEFuc3dlciB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGlzDQotICogcGFydGljdWxhciBvcHRpb24uDQotICoNCi0gKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlDQotICogYWN0dWFsIHZhbHVlIChlLmcuIG1heCBsaW5lIGxlbmdodCBzZXQgdG8gODApLg0KLSAqDQotICogQHJldHVybiBpbnQNCi0gKi8NCi1wdWJsaWMgaW50IGdldEN1cnJlbnRWYWx1ZUluZGV4KCkgew0KLQlyZXR1cm4gY3VycmVudFZhbHVlSW5kZXg7DQotfQ0KLS8qKg0KLSAqIEFuc3dlciB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGlzDQotICogcGFydGljdWxhciBvcHRpb24uDQotICoNCi0gKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlDQotICogYWN0dWFsIHZhbHVlIChlLmcuIG1heCBsaW5lIGxlbmdodCBzZXQgdG8gODApLg0KLSAqDQotICogQHJldHVybiBpbnQNCi0gKi8NCi1wdWJsaWMgaW50IGdldERlZmF1bHRWYWx1ZUluZGV4KCkgew0KLQlyZXR1cm4gZGVmYXVsdFZhbHVlSW5kZXg7DQotfQ0KLS8qKg0KLSAqIFJldHVybiBhbiBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLg0KLSAqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0JcmV0dXJuIGRlc2NyaXB0aW9uOw0KLX0NCi0vKioNCi0gKiBJbnRlcm5hbCBJRCB3aGljaCBhbGxvd3MgdGhlIGNvbmZpZ3VyYWJsZSBjb21wb25lbnQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbi4NCi0gKg0KLSAqIEByZXR1cm4gaW50DQotICovDQotcHVibGljIGludCBnZXRJRCgpIHsNCi0JcmV0dXJuIGlkOw0KLX0NCi0vKioNCi0gKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGUgcmVjZWl2ZXIuDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQlyZXR1cm4gbmFtZTsNCi19DQotLyoqDQotICogUmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHJlY2VpdmVyLg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdDQotICovDQotcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKCkgew0KLQlyZXR1cm4gcG9zc2libGVWYWx1ZXM7DQotfQ0KLS8qKg0KLSAqIENoYW5nZSB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGlzDQotICogcGFydGljdWxhciBvcHRpb24uDQotICoNCi0gKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlDQotICogYWN0dWFsIHZhbHVlIChlLmcuIG1heCBsaW5lIGxlbmdodCBzZXQgdG8gODApLg0KLSAqDQotICogQHJldHVybiBpbnQNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZUluZGV4KGludCBuZXdJbmRleCkgew0KLQljdXJyZW50VmFsdWVJbmRleCA9IG5ld0luZGV4Ow0KLX0NCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWZmZXIuYXBwZW5kKCJDb25maWd1cmFibGUgb3B0aW9uIGZvciAiLypub25OTFMqLyk7DQotCWJ1ZmZlci5hcHBlbmQodGhpcy5jb21wb25lbnROYW1lKS5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KLQlidWZmZXIuYXBwZW5kKCItIGNhdGVnb3J5OgkJCSIvKm5vbk5MUyovKS5hcHBlbmQodGhpcy5jYXRlZ29yeSkuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCi0JYnVmZmVyLmFwcGVuZCgiLSBuYW1lOgkJCQkiLypub25OTFMqLykuYXBwZW5kKHRoaXMubmFtZSkuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCi0JLyogZGlzcGxheSBjdXJyZW50IHZhbHVlICovDQotCWJ1ZmZlci5hcHBlbmQoIi0gY3VycmVudCB2YWx1ZToJIi8qbm9uTkxTKi8pOw0KLQlpZiAocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsNCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy5jdXJyZW50VmFsdWVJbmRleCk7DQotCX0gZWxzZSB7DQotCQlidWZmZXIuYXBwZW5kKHRoaXMucG9zc2libGVWYWx1ZXNbdGhpcy5jdXJyZW50VmFsdWVJbmRleF0pOw0KLQl9DQotCWJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KIAkNCi0JLyogZGlzcGxheSBwb3NzaWJsZSB2YWx1ZXMgKi8NCi0JaWYgKHBvc3NpYmxlVmFsdWVzICE9IE5vRGlzY3JldGVWYWx1ZSl7DQotCQlidWZmZXIuYXBwZW5kKCItIHBvc3NpYmxlIHZhbHVlczoJWyIvKm5vbk5MUyovKTsNCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwb3NzaWJsZVZhbHVlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCWlmIChpICE9IDApDQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KLQkJCWJ1ZmZlci5hcHBlbmQocG9zc2libGVWYWx1ZXNbaV0pOw0KLQkJfQ0KLQkJYnVmZmVyLmFwcGVuZCgiXVxuIi8qbm9uTkxTKi8pOw0KLQkJYnVmZmVyLmFwcGVuZCgiLSBjdXJyLiB2YWwuIGluZGV4OgkiLypub25OTFMqLykuYXBwZW5kKGN1cnJlbnRWYWx1ZUluZGV4KS5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkvKioNCisJICogR2V0cyB0aGUgdmFsdWVJbmRleA0KKwkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQNCisJICovDQorCXB1YmxpYyBpbnQgZ2V0VmFsdWVJbmRleCgpIHsNCisJCWlmKHBvc3NpYmxlVmFsdWVzID09IE5vRGlzY3JldGVWYWx1ZSkNCisJCQlyZXR1cm4gLTE7DQorCQlpZiAodmFsdWVJbmRleCA9PSAtMSkNCisJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlSW5kZXgoKTsNCisJCXJldHVybiB2YWx1ZUluZGV4Ow0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIi0gZGVzY3JpcHRpb246CQkiLypub25OTFMqLykuYXBwZW5kKGRlc2NyaXB0aW9uKS5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQotfQ0KLX0NCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlSW5kZXgNCisJICogQHBhcmFtIHZhbHVlSW5kZXggVGhlIHZhbHVlSW5kZXggdG8gc2V0DQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZUluZGV4KGludCB2YWx1ZUluZGV4KSB7DQorCQlpZih2YWx1ZUluZGV4IDwgMCB8fCB2YWx1ZUluZGV4ID49IHBvc3NpYmxlVmFsdWVzLmxlbmd0aCl7DQorCQkJdGhpcy52YWx1ZUluZGV4ID0gLTE7DQorCQl9DQorCQllbHNlIHsNCisJCQl0aGlzLnZhbHVlSW5kZXggPSB2YWx1ZUluZGV4Ow0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkqIEFuc3dlciB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbi4NCisJKg0KKwkqIEByZXR1cm4gU3RyaW5nDQorCSovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgew0KKwkJaWYocG9zc2libGVWYWx1ZXMgIT0gTm9EaXNjcmV0ZVZhbHVlKXsNCisJCQlpZihkZWZhdWx0VmFsdWVJbmRleCA9PSAtMSkNCisJCQkJcmV0dXJuIG1pc3Npbmc7DQorCQkJcmV0dXJuIHBvc3NpYmxlVmFsdWVzW2RlZmF1bHRWYWx1ZUluZGV4XTsNCisJCX0NCisJCXJldHVybiBkZWZhdWx0VmFsdWU7DQorCX0NCisJDQorCS8qKg0KKwkqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbi4NCisJKg0KKwkqIEBwYXJhbSB2YWx1ZSBTdHJpbmcNCisJKi8NCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsJCQ0KKwkJaWYocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsNCisJCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsNCisJCX0NCisJCWVsc2V7DQorCQkJZm9yKGludCBpID0gMCA7IGkgPCBwb3NzaWJsZVZhbHVlcy5sZW5ndGggOyBpKyspew0KKwkJCQlpZihwb3NzaWJsZVZhbHVlc1tpXS5lcXVhbHMoZGVmYXVsdFZhbHVlKSl7DQorCQkJCQl0aGlzLmRlZmF1bHRWYWx1ZUluZGV4ID0gaTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoKXsNCisJCXZhbHVlID0gbnVsbDsNCisJCXZhbHVlSW5kZXggPSAtMTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEdldHMgdGhlIGRlZmF1bHRWYWx1ZUluZGV4DQorCSAqIEByZXR1cm4gUmV0dXJucyBhIGludA0KKwkgKi8NCisJcHVibGljIGludCBnZXREZWZhdWx0VmFsdWVJbmRleCgpIHsNCisJCWlmKHBvc3NpYmxlVmFsdWVzID09IE5vRGlzY3JldGVWYWx1ZSkNCisJCQlyZXR1cm4gLTE7DQorCQkNCisJCXJldHVybiBkZWZhdWx0VmFsdWVJbmRleDsNCisJfQ0KKwkvKioNCisJICogU2V0cyB0aGUgZGVmYXVsdFZhbHVlSW5kZXgNCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZUluZGV4IFRoZSBkZWZhdWx0VmFsdWVJbmRleCB0byBzZXQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZUluZGV4KGludCBkZWZhdWx0VmFsdWVJbmRleCkgew0KKwkJaWYoZGVmYXVsdFZhbHVlSW5kZXggPCAwIHx8IGRlZmF1bHRWYWx1ZUluZGV4ID49IHBvc3NpYmxlVmFsdWVzLmxlbmd0aCl7DQorCQkJdGhpcy5kZWZhdWx0VmFsdWVJbmRleCA9IC0xOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdGhpcy5kZWZhdWx0VmFsdWVJbmRleCA9IGRlZmF1bHRWYWx1ZUluZGV4Ow0KKwkJfQ0KKwl9DQorCS8qKg0KKyAJKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgY2F0ZWdvcnkgb2YgdGhlIHJlY2VpdmVyLg0KKyAJKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCisgCSovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7DQorCQlyZXR1cm4gY2F0ZWdvcnk7DQorCX0NCisNCisJLyoqDQorCSogUmV0dXJuIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyLg0KKwkqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KKwkqLw0KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorCQlyZXR1cm4gbmFtZTsNCisJfQ0KKwkNCisJLyoqDQorCSogUmV0dXJuIGFuIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuDQorCSoNCisJKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCisJKi8NCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCisJCXJldHVybiBkZXNjcmlwdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJKiBSZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWxpemVkIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgcmVjZWl2ZXIuDQorCSoNCisJKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQ0KKwkqLw0KKwlwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoKSB7DQorCQlyZXR1cm4gcG9zc2libGVWYWx1ZXM7DQorCX0NCisNCisJLyoqDQorCSogUmV0dXJuIGEgU3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY29tcG9uZW50IG93bmVyICh0eXBpY2FsbHkgdGhlIHF1YWxpZmllZA0KKwkqCXR5cGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaXQgY29ycmVzcG9uZHMgdG8pLg0KKwkqDQorCSogZS5nLiAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5Db21waWxlciINCisJKg0KKwkqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KKwkqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKSB7DQorCQlyZXR1cm4gY29tcG9uZW50TmFtZTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEdldHMgdGhlIHR5cGUNCisJICogQHJldHVybiBSZXR1cm5zIGEgaW50DQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQorCQlyZXR1cm4gdHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0cyB0aGUgbWF4DQorCSAqIEByZXR1cm4gUmV0dXJucyBhIE51bWJlcg0KKwkgKi8NCisJcHVibGljIE51bWJlciBnZXRNYXgoKSB7DQorCQlpZihwb3NzaWJsZVZhbHVlcyA9PSBOb0Rpc2NyZXRlVmFsdWUpew0KKwkJCWlmKHR5cGUuZXF1YWxzKElOVCkpew0KKwkJCQlpZihtYXhFeGlzdGluZyl7DQorCQkJCQlyZXR1cm4gbmV3IEludGVnZXIobWF4SW50KTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCXJldHVybiBuZXcgSW50ZWdlcihJbnRlZ2VyLk1BWF9WQUxVRSk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZih0eXBlLmVxdWFscyhGTE9BVCkpew0KKwkJCQlpZihtYXhFeGlzdGluZyl7DQorCQkJCQlyZXR1cm4gbmV3IEZsb2F0KG1heEZsb2F0KTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCXJldHVybiBuZXcgRmxvYXQoRmxvYXQuTUFYX1ZBTFVFKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHZXRzIHRoZSBtaW4NCisJICogQHJldHVybiBSZXR1cm5zIGEgTnVtYmVyDQorCSAqLw0KKwlwdWJsaWMgTnVtYmVyIGdldE1pbigpIHsNCisJCWlmKHBvc3NpYmxlVmFsdWVzID09IE5vRGlzY3JldGVWYWx1ZSl7DQorCQkJaWYodHlwZS5lcXVhbHMoSU5UKSl7DQorCQkJCWlmKG1pbkV4aXN0aW5nKXsNCisJCQkJCXJldHVybiBuZXcgSW50ZWdlcihtaW5JbnQpOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEludGVnZXIuTUlOX1ZBTFVFKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKHR5cGUuZXF1YWxzKEZMT0FUKSl7DQorCQkJCWlmKG1pbkV4aXN0aW5nKXsNCisJCQkJCXJldHVybiBuZXcgRmxvYXQobWluRmxvYXQpOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJcmV0dXJuIG5ldyBGbG9hdChGbG9hdC5NSU5fVkFMVUUpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKwkJYnVmZmVyLmFwcGVuZCgiQ29uZmlndXJhYmxlIG9wdGlvbiBmb3IgIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQodGhpcy5jb21wb25lbnROYW1lKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIi0gY2F0ZWdvcnk6CQkJIikuYXBwZW5kKHRoaXMuY2F0ZWdvcnkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCItIG5hbWU6CQkJCSIpLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCQkvKiBkaXNwbGF5IGN1cnJlbnQgdmFsdWUgKi8NCisJCWJ1ZmZlci5hcHBlbmQoIi0gY3VycmVudCB2YWx1ZToJICAgICIpLmFwcGVuZCh0aGlzLnZhbHVlKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KKwkJLyogZGlzcGxheSBwb3NzaWJsZSB2YWx1ZXMgKi8NCisJCWlmIChwb3NzaWJsZVZhbHVlcyAhPSBOb0Rpc2NyZXRlVmFsdWUpew0KKwkJCWJ1ZmZlci5hcHBlbmQoIi0gcG9zc2libGUgdmFsdWVzOglbIik7IC8vJE5PTi1OTFMtMSQNCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcG9zc2libGVWYWx1ZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJaWYgKGkgIT0gMCkNCisJCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJYnVmZmVyLmFwcGVuZChwb3NzaWJsZVZhbHVlc1tpXSk7DQorCQkJfQ0KKwkJCWJ1ZmZlci5hcHBlbmQoIl1cbiIpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlidWZmZXIuYXBwZW5kKCItIGRlc2NyaXB0aW9uOgkJIikuYXBwZW5kKGRlc2NyaXB0aW9uKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KKwl9DQorCQ0KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldElEcyhTdHJpbmcgY29tcG9uZW50TmFtZSxMb2NhbGUgbG9jYWxlKXsNCisJCXRyeSB7DQorCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGNvbXBvbmVudE5hbWUsbG9jYWxlKTsNCisJCQlFbnVtZXJhdGlvbiBidW5kbGVLZXlzID0gYnVuZGxlLmdldEtleXMoKTsNCisJCQkNCisJCQlTdHJpbmcgcGFydGlhbFJlc3VsdFtdID0gbmV3IFN0cmluZ1sxMDBdOw0KKwkJCWludCByZXN1bHRDb3VudCA9IDA7DQorDQorCQkJd2hpbGUoYnVuZGxlS2V5cy5oYXNNb3JlRWxlbWVudHMoKSl7DQorCQkJCVN0cmluZyBidW5kbGVLZXkgPSAoU3RyaW5nKWJ1bmRsZUtleXMubmV4dEVsZW1lbnQoKTsNCisJCQkJaWYoYnVuZGxlS2V5LmVuZHNXaXRoKCJvcmRlciIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJaW50IG9yZGVyOw0KKwkJCQkJdHJ5ew0KKwkJCQkJCW9yZGVyID0gSW50ZWdlci5wYXJzZUludChidW5kbGUuZ2V0U3RyaW5nKGJ1bmRsZUtleSkpOw0KKwkJCQkJDQorCQkJCQkJU3RyaW5nIGlkID0gYnVuZGxlS2V5LnN1YnN0cmluZygwLGJ1bmRsZUtleS5sYXN0SW5kZXhPZignLicpKTsNCisJCQkJCQlpbnQgbGVuZ3RoID0gcGFydGlhbFJlc3VsdC5sZW5ndGg7DQorCQkJCQkJaWYobGVuZ3RoIDw9IG9yZGVyKQ0KKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcnRpYWxSZXN1bHQsMCxwYXJ0aWFsUmVzdWx0ID0gbmV3IFN0cmluZ1tvcmRlcisxXSwwLGxlbmd0aCk7DQorCQkJCQkJcGFydGlhbFJlc3VsdFtvcmRlcl09IGlkOw0KKwkJCQkJCXJlc3VsdENvdW50Kys7DQorCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCQkJCS8vaWYgb3JkZXIgY2FuIG5vdCBiZSByZWFkLCBvcHRpb24gaXMgbm90IGFkZA0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcmVzdWx0Q291bnRdOw0KKwkJCXJlc3VsdENvdW50ID0gMDsNCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgcGFydGlhbFJlc3VsdC5sZW5ndGg7aSsrKXsNCisJCQkJaWYocGFydGlhbFJlc3VsdFtpXSE9IG51bGwpew0KKwkJCQkJcmVzdWx0W3Jlc3VsdENvdW50KytdPXBhcnRpYWxSZXN1bHRbaV07DQorCQkJCQkNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCQ0KKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCisJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsNCisJCX0NCisJfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEKaW5kZXggZDQ5Y2Q1Yy4uODllMzRiNSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Eb2N1bWVudEVsZW1lbnRQYXJzZXIuamF2YQpAQCAtMjcsNiArMjcsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCisNCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCiAgDQogcHVibGljIGNsYXNzIERvY3VtZW50RWxlbWVudFBhcnNlciBleHRlbmRzIFBhcnNlciB7DQogCUlEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yOw0KQEAgLTQ0LDE4ICs0NiwyNyBAQAogCWludCBpbnRBcnJheVB0cjsNCiBwdWJsaWMgRG9jdW1lbnRFbGVtZW50UGFyc2VyKA0KIAlmaW5hbCBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvciwgDQotCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgew0KKwlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksDQorCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7DQogCXN1cGVyKG5ldyBQcm9ibGVtUmVwb3J0ZXIoDQogCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksIA0KLQkJbmV3IENvbXBpbGVyT3B0aW9ucygpLCANCisJCW9wdGlvbnMsIA0KIAkJcHJvYmxlbUZhY3RvcnkpIHsNCiAJCXB1YmxpYyB2b2lkIHJlY29yZChJUHJvYmxlbSBwcm9ibGVtLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7DQogCQkJcmVxdWVzdG9yLmFjY2VwdFByb2JsZW0ocHJvYmxlbSk7DQogCQl9DQotCX0sIGZhbHNlKTsNCisJfSwNCisJZmFsc2UsDQorCW9wdGlvbnMuZ2V0QXNzZXJ0TW9kZSgpKTsNCiAJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7DQogCWludEFycmF5U3RhY2sgPSBuZXcgaW50WzMwXVtdOw0KIH0NCisNCitwdWJsaWMgRG9jdW1lbnRFbGVtZW50UGFyc2VyKA0KKwlmaW5hbCBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvciwgDQorCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgew0KKwkJdGhpcyhyZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBuZXcgQ29tcGlsZXJPcHRpb25zKENvbXBpbGVyLmdldERlZmF1bHRPcHRpb25zKExvY2FsZS5nZXREZWZhdWx0KCkpKSk7DQorfQ0KIC8qKg0KICAqDQogICogSU5URVJOQUwgVVNFLU9OTFkNCkBAIC0xMjU5LDcgKzEyNzAsNyBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1ZmZlci5hcHBlbmQoImludEFycmF5UHRyID0gIi8qbm9uTkxTKi8gKyBpbnRBcnJheVB0ciArICJcbiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiaW50QXJyYXlQdHIgPSAiICsgaW50QXJyYXlQdHIgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7DQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0hpZXJhcmNoeVJlc29sdmVyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQppbmRleCAwZmYyMjVmLi4xNWFmMzE2IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSGllcmFyY2h5UmVzb2x2ZXIuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQogDQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQorDQogcHVibGljIGNsYXNzIEhpZXJhcmNoeVJlc29sdmVyIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3Igew0KIAlJSGllcmFyY2h5UmVxdWVzdG9yIHJlcXVlc3RvcjsNCiAJTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQ7DQpAQCAtMzIsNiArMzQsOCBAQAogCXByaXZhdGUgaW50IHR5cGVJbmRleDsNCiAJcHJpdmF0ZSBJR2VuZXJpY1R5cGVbXSB0eXBlTW9kZWxzOw0KIAlwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmdbXSB0eXBlQmluZGluZ3M7DQorCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBmb2N1c1R5cGU7DQorCQ0KIHB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcigNCiAJSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQsDQogCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwNCkBAIC03MiwyOCArNzYsMzIgQEAKIHB1YmxpYyB2b2lkIGFjY2VwdChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHsNCiAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBhY2NlcHQgY29tcGlsYXRpb24gdW5pdHMgaW5zaWRlIHRoZSBIaWVyYXJjaHlSZXNvbHZlci4iKTsNCiAJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKA0KLQkJbmV3IFN0cmluZ0J1ZmZlcihVdGlsLmJpbmQoImFjY2VwdC5jYW5ub3QiLypub25OTFMqLykpDQorCQluZXcgU3RyaW5nQnVmZmVyKFV0aWwuYmluZCgiYWNjZXB0LmNhbm5vdCIpKSAvLyROT04tTkxTLTEkDQogCQkJLmFwcGVuZChzb3VyY2VVbml0LmdldEZpbGVOYW1lKCkpDQogCQkJLnRvU3RyaW5nKCkpOw0KIH0NCiAvKioNCi0gKiBBZGQgYW4gYWRkaXRpb25hbCBzb3VyY2UgdHlwZQ0KKyAqIEFkZCBhZGRpdGlvbmFsIHNvdXJjZSB0eXBlcw0KICAqLw0KIA0KLXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZSBzb3VyY2VUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KLQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxKTsNCitwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCisJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGVzWzBdLmdldEZpbGVOYW1lKCksIDEsIDEpOw0KIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0NCi0JCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoc291cmNlVHlwZSwgZmFsc2UsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsNCisJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoc291cmNlVHlwZXMsIGZhbHNlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7DQogDQogCWlmICh1bml0ICE9IG51bGwpIHsNCiAJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOw0KLQkJcmVtZW1iZXJXaXRoTWVtYmVyVHlwZXMoc291cmNlVHlwZSwgdW5pdC50eXBlc1swXS5iaW5kaW5nKTsNCisJCXJlbWVtYmVyV2l0aE1lbWJlclR5cGVzKHNvdXJjZVR5cGVzWzBdLCB1bml0LnR5cGVzWzBdLmJpbmRpbmcpOw0KIA0KIAkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgZmFsc2UpOw0KIAl9DQogfQ0KIHByaXZhdGUgdm9pZCByZW1lbWJlcihJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7DQogCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSByZXR1cm47DQorCQ0KKwlpZiAoIXN1Yk9yU3VwZXJPZkZvY3VzKHR5cGVCaW5kaW5nKSkgew0KKwkJcmV0dXJuOyAvLyBpZ25vcmUgdHlwZXMgb3V0c2lkZSBvZiBoaWVyYXJjaHkNCisJfQ0KIA0KIAlpZiAoKyt0eXBlSW5kZXggPT0gdHlwZU1vZGVscy5sZW5ndGgpIHsNCiAJCVN5c3RlbS5hcnJheWNvcHkodHlwZU1vZGVscywgMCwgdHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbdHlwZUluZGV4ICogMl0sIDAsIHR5cGVJbmRleCk7DQpAQCAtMjI1LDExICsyMzMsMTEgQEAKIAkJaW50IHN1cHBsaWVkTGVuZ3RoID0gc3VwcGxpZWRUeXBlcyA9PSBudWxsID8gMCA6IHN1cHBsaWVkVHlwZXMubGVuZ3RoOw0KIAkJaW50IHNvdXJjZUxlbmd0aCA9IHNvdXJjZVVuaXRzID09IG51bGwgPyAwIDogc291cmNlVW5pdHMubGVuZ3RoOw0KIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bXSB1bml0cyA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltzdXBwbGllZExlbmd0aCArIHNvdXJjZUxlbmd0aF07DQotCQlpbnQgY291bnQgPSAtMTsNCisJCQ0KKwkJLy8gYnVpbGQgdHlwZSBiaW5kaW5ncw0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBwbGllZExlbmd0aDsgaSsrKSB7DQogCQkJaWYgKHN1cHBsaWVkVHlwZXNbaV0uaXNCaW5hcnlUeXBlKCkpIHsNCiAJCQkJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChJQmluYXJ5VHlwZSkgc3VwcGxpZWRUeXBlc1tpXTsNCi0JCQkJc3VwcGxpZWRUeXBlc1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBuZWVkZWQgcGFzcyB0aGlzIHBvaW50DQogCQkJCXRyeSB7DQogCQkJCQlyZW1lbWJlcihiaW5hcnlUeXBlLCBsb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSwgZmFsc2UpKTsNCiAJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQpAQCAtMjM4LDE4ICsyNDYsMTMgQEAKIAkJCX0gZWxzZSB7DQogCQkJCS8vIG11c3Qgc3RhcnQgd2l0aCB0aGUgdG9wIGxldmVsIHR5cGUNCiAJCQkJSVNvdXJjZVR5cGUgdG9wTGV2ZWxUeXBlID0gKElTb3VyY2VUeXBlKSBzdXBwbGllZFR5cGVzW2ldOw0KLQkJCQlzdXBwbGllZFR5cGVzW2ldID0gbnVsbDsgLy8gbm8gbG9uZ2VyIG5lZWRlZCBwYXNzIHRoaXMgcG9pbnQJCQkJDQogCQkJCXdoaWxlICh0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpDQogCQkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOw0KIAkJCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQodG9wTGV2ZWxUeXBlLmdldEZpbGVOYW1lKCksIGksIHN1cHBsaWVkTGVuZ3RoKTsNCi0JCQkJdW5pdHNbKytjb3VudF0gPSBTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KHRvcExldmVsVHlwZSwgZmFsc2UsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsNCi0NCi0JCQkJaWYgKHVuaXRzW2NvdW50XSA9PSBudWxsKSB7DQotCQkJCQljb3VudC0tOw0KLQkJCQl9IGVsc2Ugew0KKwkJCQl1bml0c1tpXSA9IFNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQobmV3IElTb3VyY2VUeXBlW117dG9wTGV2ZWxUeXBlfSwgZmFsc2UsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsNCisJCQkJaWYgKHVuaXRzW2ldICE9IG51bGwpIHsNCiAJCQkJCXRyeSB7DQotCQkJCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdHNbY291bnRdKTsNCi0JCQkJCQlyZW1lbWJlcldpdGhNZW1iZXJUeXBlcyh0b3BMZXZlbFR5cGUsIHVuaXRzW2NvdW50XS50eXBlc1swXS5iaW5kaW5nKTsNCisJCQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0c1tpXSk7DQogCQkJCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsNCiAJCQkJCQkvLyBjbGFzc3BhdGggcHJvYmxlbSBmb3IgdGhpcyB0eXBlOiBpZ25vcmUNCiAJCQkJCX0NCkBAIC0yNTgsMjEgKzI2MSw0NyBAQAogCQl9DQogCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKXsNCiAJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBzb3VyY2VVbml0c1tpXTsNCi0JCQlzb3VyY2VVbml0c1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBuZWVkZWQgcGFzcyB0aGlzIHBvaW50DQogCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCBzdXBwbGllZExlbmd0aCtpLCBzdXBwbGllZExlbmd0aCtzb3VyY2VMZW5ndGgpOyANCi0JCQlQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIpOw0KKwkJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhDb21waWxlci5nZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUuZ2V0RGVmYXVsdCgpKSk7DQorCQkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCBmYWxzZSwgb3B0aW9ucy5nZXRBc3NlcnRNb2RlKCkpOw0KIAkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHVuaXRSZXN1bHQpOw0KIAkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwpIHsNCi0JCQkJdW5pdHNbKytjb3VudF0gPSBwYXJzZWRVbml0Ow0KLQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0c1tjb3VudF0pOw0KKwkJCQl1bml0c1tzdXBwbGllZExlbmd0aCtpXSA9IHBhcnNlZFVuaXQ7DQorCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOw0KKwkJCX0NCisJCX0NCisJCQ0KKwkJLy8gY29tcGxldGUgdHlwZSBiaW5kaW5ncyAoaWUuIGNvbm5lY3Qgc3VwZXIgdHlwZXMpIGFuZCByZW1lbWJlciB0aGVtDQorCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cHBsaWVkTGVuZ3RoOyBpKyspIHsNCisJCQlpZiAoIXN1cHBsaWVkVHlwZXNbaV0uaXNCaW5hcnlUeXBlKCkpIHsgLy8gbm90ZSB0aGF0IGJpbmFyeSB0eXBlcyBoYXZlIGFscmVhZHkgYmVlbiByZW1lbWJlcmVkIGFib3ZlDQorCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSB1bml0c1tpXTsNCisJCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgew0KKwkJCQkJLy8gbXVzdCBzdGFydCB3aXRoIHRoZSB0b3AgbGV2ZWwgdHlwZQ0KKwkJCQkJSVNvdXJjZVR5cGUgdG9wTGV2ZWxUeXBlID0gKElTb3VyY2VUeXBlKSBzdXBwbGllZFR5cGVzW2ldOw0KKwkJCQkJc3VwcGxpZWRUeXBlc1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBuZWVkZWQgcGFzcyB0aGlzIHBvaW50CQkJCQ0KKwkJCQkJd2hpbGUgKHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkNCisJCQkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlsb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBmYWxzZSk7DQorCQkJCQkJcmVtZW1iZXJXaXRoTWVtYmVyVHlwZXModG9wTGV2ZWxUeXBlLCBwYXJzZWRVbml0LnR5cGVzWzBdLmJpbmRpbmcpOw0KKwkJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQorCQkJCQkJLy8gY2xhc3NwYXRoIHByb2JsZW0gZm9yIHRoaXMgdHlwZTogaWdub3JlDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKSB7DQorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHVuaXRzW3N1cHBsaWVkTGVuZ3RoK2ldOw0KKwkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwpIHsNCisJCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgZmFsc2UpOw0KIAkJCQlpbnQgdHlwZUNvdW50ID0gcGFyc2VkVW5pdC50eXBlcyA9PSBudWxsID8gMCA6IHBhcnNlZFVuaXQudHlwZXMubGVuZ3RoOw0KKwkJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBzb3VyY2VVbml0c1tpXTsNCisJCQkJc291cmNlVW5pdHNbaV0gPSBudWxsOyAvLyBubyBsb25nZXIgbmVlZGVkIHBhc3MgdGhpcyBwb2ludA0KIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVDb3VudDsgaisrKXsNCiAJCQkJCXJlbWVtYmVyV2l0aE1lbWJlclR5cGVzKHBhcnNlZFVuaXQudHlwZXNbal0sIG51bGwsIHNvdXJjZVVuaXQpOw0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykNCi0JCQlsb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0c1tpXSwgZmFsc2UpOw0KIA0KIAkJcmVwb3J0SGllcmFyY2h5KCk7DQogCQkNCkBAIC0yOTksNyArMzI4LDcgQEAKIAkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOw0KIAkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh0b3BMZXZlbFR5cGUuZ2V0RmlsZU5hbWUoKSwgMSwgMSk7DQogCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9DQotCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQodG9wTGV2ZWxUeXBlLCBmYWxzZSwgdHJ1ZSwgbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCByZXN1bHQpOw0KKwkJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KG5ldyBJU291cmNlVHlwZVtde3RvcExldmVsVHlwZX0sIGZhbHNlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7DQogDQogCQkJaWYgKHVuaXQgIT0gbnVsbCkgew0KIAkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0KTsNCkBAIC0zMTQsNCArMzQzLDMwIEBACiAJCXJlc2V0KCk7DQogCX0NCiB9DQorLyoqDQorICogU2V0IHRoZSBmb2N1cyB0eXBlIChpZS4gdGhlIHR5cGUgdGhhdCB0aGlzIHJlc29sdmVyIGlzIGNvbXB1dGluZyB0aGUgaGllcmFyY2ggZm9yLg0KKyAqLw0KK3B1YmxpYyB2b2lkIHNldEZvY3VzVHlwZShjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsNCisJaWYgKGNvbXBvdW5kTmFtZSA9PSBudWxsIHx8IHRoaXMubG9va3VwRW52aXJvbm1lbnQgPT0gbnVsbCkgcmV0dXJuOw0KKwl0aGlzLmZvY3VzVHlwZSA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuYXNrRm9yVHlwZShjb21wb3VuZE5hbWUpOw0KKwkNCit9DQorcHJpdmF0ZSBib29sZWFuIHN1Yk9yU3VwZXJPZkZvY3VzKFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsNCisJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBhY2NlcHQgYWxsIHR5cGVzIChjYXNlIG9mIGhpZXJhcmNoeSBpbiBhIHJlZ2lvbikNCisJaWYgKHRoaXMuc3ViVHlwZU9mVHlwZSh0aGlzLmZvY3VzVHlwZSwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsNCisJaWYgKHRoaXMuc3ViVHlwZU9mVHlwZSh0eXBlQmluZGluZywgdGhpcy5mb2N1c1R5cGUpKSByZXR1cm4gdHJ1ZTsNCisJcmV0dXJuIGZhbHNlOw0KK30NCitwcml2YXRlIGJvb2xlYW4gc3ViVHlwZU9mVHlwZShSZWZlcmVuY2VCaW5kaW5nIHN1YlR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsNCisJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgc3ViVHlwZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorCWlmIChzdWJUeXBlID09IHR5cGVCaW5kaW5nKSByZXR1cm4gdHJ1ZTsNCisJaWYgKHRoaXMuc3ViVHlwZU9mVHlwZShzdWJUeXBlLnN1cGVyY2xhc3MoKSwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsNCisJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IHN1YlR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQorCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgew0KKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUoc3VwZXJJbnRlcmZhY2VzW2ldLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOw0KKwkJfSANCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvci5qYXZhCmluZGV4IGNlZTI3NjQuLmE0N2YyNzMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvci5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiAJdm9pZCBlbmRWaXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7DQogCXZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7DQogCXZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSk7DQorCXZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7DQogCXZvaWQgZW5kVmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsNCiAJdm9pZCBlbmRWaXNpdChCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOw0KIAl2b2lkIGVuZFZpc2l0KEJsb2NrIGJsb2NrLCBCbG9ja1Njb3BlIHNjb3BlKTsNCkBAIC05OCw2ICs5OSw3IEBACiAJYm9vbGVhbiB2aXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7DQogCWJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7DQogCWJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSk7DQorCWJvb2xlYW4gdmlzaXQoQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7DQogCWJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsNCiAJYm9vbGVhbiB2aXNpdChCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOw0KIAlib29sZWFuIHZpc2l0KEJsb2NrIGJsb2NrLCBCbG9ja1Njb3BlIHNjb3BlKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRQYXJzZXIuamF2YQppbmRleCA0NTI5MDU2Li45YTEzMGZiIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UGFyc2VyLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQogDQogcHVibGljIGNsYXNzIFNvdXJjZUVsZW1lbnRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgew0KIAlJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3I7DQpAQCAtNDIsMjYgKzQzLDM2IEBACiAJcHJpdmF0ZSBjaGFyW11bXSB0eXBlTmFtZXM7DQogCXByaXZhdGUgY2hhcltdW10gc3VwZXJUeXBlTmFtZXM7DQogCXByaXZhdGUgaW50IG5lc3RlZFR5cGVJbmRleDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEpBVkFfTEFOR19PQkpFQ1QgPSAiamF2YS5sYW5nLk9iamVjdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBKQVZBX0xBTkdfT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgU291cmNlRWxlbWVudFBhcnNlcigNCiAJZmluYWwgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCANCi0JSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7DQorCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwNCisJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsNCiAJLy8gd2Ugd2FudCB0byBub3RpZnkgYWxsIHN5bnRheCBlcnJvciB3aXRoIHRoZSBhY2NlcHRQcm9ibGVtIEFQSQ0KIAkvLyBUbyBkbyBzbywgd2UgZGVmaW5lIHRoZSByZWNvcmQgbWV0aG9kIG9mIHRoZSBQcm9ibGVtUmVwb3J0ZXINCiAJc3VwZXIobmV3IFByb2JsZW1SZXBvcnRlcigNCi0JCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKSwgDQotCQluZXcgQ29tcGlsZXJPcHRpb25zKCksIA0KKwkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLA0KKwkJb3B0aW9ucywgDQogCQlwcm9ibGVtRmFjdG9yeSkgew0KIAkJcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQpIHsNCiAJCQl1bml0UmVzdWx0LnJlY29yZChwcm9ibGVtKTsNCiAJCQlyZXF1ZXN0b3IuYWNjZXB0UHJvYmxlbShwcm9ibGVtKTsNCiAJCX0NCi0JfSwgZmFsc2UpOw0KKwl9LA0KKwlmYWxzZSwNCisJb3B0aW9ucy5nZXRBc3NlcnRNb2RlKCkpOw0KIAl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsNCiAJdHlwZU5hbWVzID0gbmV3IGNoYXJbNF1bXTsNCiAJc3VwZXJUeXBlTmFtZXMgPSBuZXcgY2hhcls0XVtdOw0KIAluZXN0ZWRUeXBlSW5kZXggPSAwOw0KIH0NCisNCitwdWJsaWMgU291cmNlRWxlbWVudFBhcnNlcigNCisJZmluYWwgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCANCisJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7DQorCQl0aGlzKHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnksIG5ldyBDb21waWxlck9wdGlvbnMoQ29tcGlsZXIuZ2V0RGVmYXVsdE9wdGlvbnMoTG9jYWxlLmdldERlZmF1bHQoKSkpKTsNCit9DQorDQogcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7DQogDQogCWJvb2xlYW4gcHJldmlvdXNGbGFnID0gcmVwb3J0UmVmZXJlbmNlSW5mbzsNCkBAIC04MjQsNyArODM1LDcgQEAKIA0KIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IA0KIAkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoDQotCQkJCXNvdXJjZVR5cGUsIA0KKwkJCQluZXcgSVNvdXJjZVR5cGVbXXtzb3VyY2VUeXBlfSwgDQogCQkJCWZhbHNlLA0KIAkJCQlmYWxzZSwgDQogCQkJCXByb2JsZW1SZXBvcnRlcigpLCANCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhCmluZGV4IDE0ZTY4MDAuLmQ4NjdjMDkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAJcHVibGljIGJvb2xlYW4gaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSBmYWxzZTsNCiAJcHVibGljIGJvb2xlYW4gbmVlZEZyZWVSZXR1cm4gPSBmYWxzZTsNCiAJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIHNlY3JldFJldHVyblZhbHVlOw0KLQlzdGF0aWMgZmluYWwgY2hhcltdIFNlY3JldExvY2FsRGVjbGFyYXRpb25OYW1lID0gIiByZXR1cm5WYWx1ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCXN0YXRpYyBmaW5hbCBjaGFyW10gU2VjcmV0TG9jYWxEZWNsYXJhdGlvbk5hbWUgPSAiIHJldHVyblZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogDQogCXB1YmxpYyBpbnQgYm9keVN0YXJ0Ow0KIAlwdWJsaWMgaW50IGJvZHlFbmQgPSAtMTsNCkBAIC0yNDksNyArMjQ5LDcgQEAKIHB1YmxpYyBTdHJpbmcgcmV0dXJuVHlwZVRvU3RyaW5nKGludCB0YWIpIHsNCiAJLypzbG93IGNvZGUgKi8NCiANCi0JcmV0dXJuICIiLypub25OTFMqLzsNCisJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyB2b2lkIHRhZ0FzSGF2aW5nRXJyb3JzKCkgew0KIAlpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7DQpAQCAtMjY0LDIxICsyNjQsMjEgQEAKIA0KIAlzICs9IHJldHVyblR5cGVUb1N0cmluZygwKTsNCiANCi0JcyArPSBuZXcgU3RyaW5nKHNlbGVjdG9yKSArICIoIi8qbm9uTkxTKi87DQorCXMgKz0gbmV3IFN0cmluZyhzZWxlY3RvcikgKyAiKCI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KIAkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nKDApOw0KIAkJCWlmIChpICE9IChhcmd1bWVudHMubGVuZ3RoIC0gMSkpDQotCQkJCXMgPSBzICsgIiwgIi8qbm9uTkxTKi87DQorCQkJCXMgPSBzICsgIiwgIjsgLy8kTk9OLU5MUy0xJA0KIAkJfTsNCiAJfTsNCi0JcyArPSAiKSIvKm5vbk5MUyovOw0KKwlzICs9ICIpIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7DQotCQlzICs9ICIgdGhyb3dzICIvKm5vbk5MUyovOw0KKwkJcyArPSAiIHRocm93cyAiOyAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAJCQlzICs9IHRocm93bkV4Y2VwdGlvbnNbaV0udG9TdHJpbmcoMCk7DQogCQkJaWYgKGkgIT0gKHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoIC0gMSkpDQotCQkJCXMgPSBzICsgIiwgIi8qbm9uTkxTKi87DQorCQkJCXMgPSBzICsgIiwgIjsgLy8kTk9OLU5MUy0xJA0KIAkJfTsNCiAJfTsNCiANCkBAIC0yODksMTggKzI4OSwxOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ1N0YXRlbWVudHMoaW50IHRhYikgew0KIAkvKiBzbG93IGNvZGUgKi8NCiANCi0JaWYgKGlzQWJzdHJhY3QoKSB8fCAodGhpcy5tb2RpZmllcnMgJiBBY2NTZW1pY29sb25Cb2R5KSAhPSAwKSByZXR1cm4gIjsiLypub25OTFMqLzsNCisJaWYgKGlzQWJzdHJhY3QoKSB8fCAodGhpcy5tb2RpZmllcnMgJiBBY2NTZW1pY29sb25Cb2R5KSAhPSAwKSByZXR1cm4gIjsiOyAvLyROT04tTkxTLTEkDQogCQ0KLQlTdHJpbmcgcyA9ICIgeyIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICIgeyI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKXsNCi0JCQlzID0gcyArICJcbiIvKm5vbk5MUyovICsgc3RhdGVtZW50c1tpXS50b1N0cmluZyh0YWIpOw0KKwkJCXMgPSBzICsgIlxuIiArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWlmICghKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBCbG9jaykpew0KLQkJCQlzICs9ICI7Ii8qbm9uTkxTKi87DQorCQkJCXMgKz0gIjsiOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfQ0KIAl9DQotCXMgKz0gIlxuIi8qbm9uTkxTKi8gKyB0YWJTdHJpbmcodGFiID09IDAgPyAwIDogdGFiIC0gMSkgKyAifSIvKm5vbk5MUyovOw0KKwlzICs9ICJcbiIgKyB0YWJTdHJpbmcodGFiID09IDAgPyAwIDogdGFiIC0gMSkgKyAifSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKaW5kZXggODUzOTQzMS4uMGYyYjI0YiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0yMSw3ICsyMSw3IEBACiBwdWJsaWMgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKCl7fQ0KIHB1YmxpYyBTdHJpbmcgbmFtZSgpew0KIA0KLQlyZXR1cm4gImFub255bW91cyBzdG9yYWdlIGJveCIvKm5vbk5MUyovOyB9DQorCXJldHVybiAiYW5vbnltb3VzIHN0b3JhZ2UgYm94IjsgfSAvLyROT04tTkxTLTEkDQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7DQogCS8qc2xvdyBjb2RlKi8NCiANCkBAIC0yOSw5ICsyOSw5IEBACiAJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KSB7DQogCQlzICs9IG1vZGlmaWVyc1N0cmluZyhtb2RpZmllcnMpOw0KIAl9DQotCXMgKz0gdHlwZS50b1N0cmluZygwKSArICIgIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKG5hbWUoKSk7DQorCXMgKz0gdHlwZS50b1N0cmluZygwKSArICIgIiArIG5ldyBTdHJpbmcobmFtZSgpKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkNCi0JCXMgKz0gIiA9ICIvKm5vbk5MUyovICsgaW5pdGlhbGl6YXRpb24udG9TdHJpbmdFeHByZXNzaW9uKHRhYik7DQorCQlzICs9ICIgPSAiICsgaW5pdGlhbGl6YXRpb24udG9TdHJpbmdFeHByZXNzaW9uKHRhYik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggNGFlNGI1NC4uOTI2MWZkNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMTM5LDIxICsxMzksMjEgQEAKIAkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IGFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpDQogCQkJCWFyZ0hhc0Vycm9yID0gdHJ1ZTsNCiAJCWlmIChhcmdIYXNFcnJvcikNCi0JCQlyZXR1cm4gbnVsbDsNCisJCQlyZXR1cm4gdHlwZUJpbmRpbmc7DQogCX0NCiAJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpDQogCQlyZXR1cm4gbnVsbDsNCiANCiAJaWYgKCF0eXBlQmluZGluZy5jYW5CZUluc3RhbnRpYXRlZCgpKSB7DQogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnN0YW50aWF0ZSh0eXBlLCB0eXBlQmluZGluZyk7DQotCQlyZXR1cm4gbnVsbDsNCisJCXJldHVybiB0eXBlQmluZGluZzsNCiAJfQ0KIAlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmc7DQogCWlmICghKGJpbmRpbmcgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihhbGxvY2F0ZWRUeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKSkuaXNWYWxpZEJpbmRpbmcoKSkgew0KIAkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkNCiAJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGVkVHlwZTsNCiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsNCi0JCXJldHVybiBudWxsOw0KKwkJcmV0dXJuIHR5cGVCaW5kaW5nOw0KIAl9DQogCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQoYmluZGluZywgc2NvcGUpKQ0KIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZE1ldGhvZChiaW5kaW5nLCB0aGlzKTsNCkBAIC0xNzIsMTcgKzE3MiwxNyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQogCS8qIHNsb3cgY29kZSAqLw0KIA0KLQlTdHJpbmcgcyA9ICJuZXcgIi8qbm9uTkxTKi8gKyB0eXBlLnRvU3RyaW5nKDApOw0KKwlTdHJpbmcgcyA9ICJuZXcgIiArIHR5cGUudG9TdHJpbmcoMCk7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGFyZ3VtZW50cyA9PSBudWxsKQ0KLQkJcyA9IHMgKyAiKCkiLypub25OTFMqLyA7DQorCQlzID0gcyArICIoKSIgOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JewlzID0gcyArICIoIi8qbm9uTkxTKi87DQorCXsJcyA9IHMgKyAiKCI7IC8vJE5PTi1OTFMtMSQNCiAJCWZvciAoaW50IGkgPSAwIDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggOyBpKyspDQogCQl7CXMgPSBzICsgYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOw0KIAkJCWlmIChpID09IChhcmd1bWVudHMubGVuZ3RoLTEpKQ0KLQkJCQlzID0gcyArICIpIi8qbm9uTkxTKi8gOw0KKwkJCQlzID0gcyArICIpIiA7IC8vJE5PTi1OTFMtMSQNCiAJCQllbHNlDQotCQkJCXMgPSBzICsgIiwgIi8qbm9uTkxTKi87IH07fTsNCisJCQkJcyA9IHMgKyAiLCAiOyB9O307IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHMgO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCBhYWE4ZWU2Li42MjA2N2NhIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAJLy9BZGQgdG8gbWV0aG9kJ3NldCwgdGhlIGRlZmF1bHQgY29uc3R1Y3RvciB0aGF0IGp1c3QgcmVjYWxsIHRoZQ0KIAkvL3N1cGVyIGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzDQogDQotCVN0cmluZyBiYXNlTmFtZSA9ICIkYW5vbnltb3VzIi8qbm9uTkxTKi87DQorCVN0cmluZyBiYXNlTmFtZSA9ICIkYW5vbnltb3VzIjsgLy8kTk9OLU5MUy0xJA0KIAlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcucGFyYW1ldGVyczsNCiAJaW50IGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOw0KIAkvL3RoZSBjb25zdHJ1Y3Rvcg0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJndW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJndW1lbnQuamF2YQppbmRleCAwYjNhN2NiLi5kNzgwNDhkIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bcmd1bWVudC5qYXZhCkBAIC00MiwxNCArNDIsMTQgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYil7DQogCS8qIHNsb3cgY29kZSAqLw0KIAkNCi0JU3RyaW5nIHMgPSAiIi8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KXsNCiAJCXMgKz0gbW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycyk7DQogCX0NCiAJaWYgKHR5cGUgPT0gbnVsbCl7DQotCQlzICs9ICI8bm8gdHlwZT4gIi8qbm9uTkxTKi87DQorCQlzICs9ICI8bm8gdHlwZT4gIjsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJcyArPSB0eXBlLnRvU3RyaW5nKHRhYikgKyAiICIvKm5vbk5MUyovOw0KKwkJcyArPSB0eXBlLnRvU3RyaW5nKHRhYikgKyAiICI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlzICs9IG5ldyBTdHJpbmcobmFtZSk7DQogCXJldHVybiBzOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggZDUwNjkxZC4uMDE5NmRhYiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTEzNCwxMiArMTM0LDEyIEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsNCiAJLyogc2xvdyBjb2RlICovDQogDQotCVN0cmluZyBzID0gIm5ldyAiLypub25OTFMqLyArIHR5cGUudG9TdHJpbmcoMCk7DQorCVN0cmluZyBzID0gIm5ldyAiICsgdHlwZS50b1N0cmluZygwKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMCA7IGkgPCBkaW1lbnNpb25zLmxlbmd0aCA7IGkrKykNCiAJewlpZiAoZGltZW5zaW9uc1tpXSA9PSBudWxsKQ0KLQkJCXMgPSBzICsgIltdIi8qbm9uTkxTKi87DQorCQkJcyA9IHMgKyAiW10iOyAvLyROT04tTkxTLTEkDQogCQllbHNlDQotCQkJcyA9IHMgKyAiWyIvKm5vbk5MUyovICsgZGltZW5zaW9uc1tpXS50b1N0cmluZ0V4cHJlc3Npb24oKSArICJdIi8qbm9uTkxTKi8gO30NCisJCQlzID0gcyArICJbIiArIGRpbWVuc2lvbnNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiXSIgO30gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCWlmIChpbml0aWFsaXplciAhPSBudWxsKQ0KIAkJcyA9IHMgKyBpbml0aWFsaXplci50b1N0cmluZ0V4cHJlc3Npb24oKTsNCiAJcmV0dXJuIHM7fQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUluaXRpYWxpemVyLmphdmEKaW5kZXggM2EyNGZiMS4uODNhYzMwNiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUluaXRpYWxpemVyLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUluaXRpYWxpemVyLmphdmEKQEAgLTEzOSwxNSArMTM5LDE1IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsNCiAJLyogc2xvdyBjb2RlICovDQogDQotCVN0cmluZyBzID0gInsiLypub25OTFMqLyA7DQorCVN0cmluZyBzID0gInsiIDsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkNCiAJeyAJaW50IGogPSAyMCA7IA0KIAkJZm9yIChpbnQgaSA9IDAgOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoIDsgaSsrKQ0KLQkJewlzID0gcyArIGV4cHJlc3Npb25zW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiwiLypub25OTFMqLyA7DQorCQl7CXMgPSBzICsgZXhwcmVzc2lvbnNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLCIgOyAvLyROT04tTkxTLTEkDQogCQkJaiAtLSA7DQogCQkJaWYgKGogPT0gMCkNCi0JCQl7CXMgPSBzICsgIlxuICAgICAgICAgICAgICAgICIvKm5vbk5MUyovOyBqID0gMjA7fX19Ow0KLQlzID0gcyArICJ9Ii8qbm9uTkxTKi87DQorCQkJewlzID0gcyArICJcbiAgICAgICAgICAgICAgICAiOyBqID0gMjA7fX19OyAvLyROT04tTkxTLTEkDQorCXMgPSBzICsgIn0iOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDc1NTM2OTAuLjBlZmMxMDcgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMzAsOSArMzAsOSBAQAogCS8qIHNsb3cgc3BlZWQgKi8NCiANCiAJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSAgOw0KLQlpZiAoZGltZW5zaW9ucyA9PSAxICkgcmV0dXJuIHMgKyAiW10iLypub25OTFMqLyA7DQorCWlmIChkaW1lbnNpb25zID09IDEgKSByZXR1cm4gcyArICJbXSIgOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGk9MSA7IGkgPD0gZGltZW5zaW9ucyA7IGkrKykNCi0JCXMgPSBzICsgIltdIi8qbm9uTkxTKi8gOw0KKwkJcyA9IHMgKyAiW10iIDsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gcyA7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEKaW5kZXggZTM0OTFhMC4uODUzMmM4YyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlSZWZlcmVuY2UuamF2YQpAQCAtMTIyLDkgKzEyMiw5IEBACiAJLyogc2xvdyBjb2RlICovDQogCQ0KIAlyZXR1cm4gCXJlY2VpdmVyLnRvU3RyaW5nRXhwcmVzc2lvbigpDQotCQkJKyAiWyIvKm5vbk5MUyovIA0KKwkJCSsgIlsiICAvLyROT04tTkxTLTEkDQogCQkJKyBwb3NpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKQ0KLQkJCSsgIl0iLypub25OTFMqLyA7fQ0KKwkJCSsgIl0iIDt9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KIAkJcmVjZWl2ZXIudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDY3NzYyNDUuLjY3YjNhMTEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMzUsOSArMzUsOSBAQAogCS8qIHNsb3cgc3BlZWQgKi8NCiANCiAJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSAgOw0KLQlpZiAoZGltZW5zaW9ucyA9PSAxICkgcmV0dXJuIHMgKyAiW10iLypub25OTFMqLyA7DQorCWlmIChkaW1lbnNpb25zID09IDEgKSByZXR1cm4gcyArICJbXSIgOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGk9MSA7IGkgPD0gZGltZW5zaW9ucyA7IGkrKykNCi0JCXMgPSBzICsgIltdIi8qbm9uTkxTKi8gOw0KKwkJcyA9IHMgKyAiW10iIDsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gcyA7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fzc2lnbm1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCmluZGV4IDFkMTQyYzkuLmUzZDg5YWEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCkBAIC0xMDEsMTUgKzEwMSwxNSBAQAogDQogCS8vc3ViY2xhc3MgcmVkZWZpbmUgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpDQogCQ0KLQlyZXR1cm4JIigiLypub25OTFMqLyArIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSArICIpIi8qbm9uTkxTKi87IH0NCisJcmV0dXJuCSIoIiArIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSArICIpIjsgfSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSB7DQogDQotCXJldHVybiAJbGhzLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiAiLypub25OTFMqLyArDQotCQkJIj0iLypub25OTFMqLyArIA0KKwlyZXR1cm4gCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIiArIC8vJE5PTi1OTFMtMSQNCisJCQkiPSIgKyAgLy8kTk9OLU5MUy0xJA0KIAkJCQ0KIAkJCSggKGV4cHJlc3Npb24uY29uc3RhbnQgIT0gbnVsbCApICYmIChleHByZXNzaW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgPw0KLQkJCSAJIiAvKmNzdDoiLypub25OTFMqLytleHByZXNzaW9uLmNvbnN0YW50LnRvU3RyaW5nKCkrIiovICIvKm5vbk5MUyovIDoNCi0JCQkgCSIgIi8qbm9uTkxTKi8gKSArDQorCQkJIAkiIC8qY3N0OiIrZXhwcmVzc2lvbi5jb25zdGFudC50b1N0cmluZygpKyIqLyAiIDogLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJIAkiICIgKSArIC8vJE5PTi1OTFMtMSQNCiAJCQkJDQogCQkJZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSA7IH0NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FzdE5vZGUuamF2YQppbmRleCBjN2NlNDhmLi44YjFiYjY1IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FzdE5vZGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FzdE5vZGUuamF2YQpAQCAtNjMsMjcgKzYzLDI3IEBACiB9DQogcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZpZXJzU3RyaW5nKGludCBtb2RpZmllcnMpIHsNCiAJDQotCVN0cmluZyBzID0gIiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkDQogCWlmICgobW9kaWZpZXJzICYgQWNjUHVibGljKSAhPSAwKQ0KLQkJcyA9IHMgKyAicHVibGljICIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAicHVibGljICI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKChtb2RpZmllcnMgJiBBY2NQcml2YXRlKSAhPSAwKQ0KLQkJcyA9IHMgKyAicHJpdmF0ZSAiLypub25OTFMqLzsNCisJCXMgPSBzICsgInByaXZhdGUgIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoKG1vZGlmaWVycyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkNCi0JCXMgPSBzICsgInByb3RlY3RlZCAiLypub25OTFMqLzsNCisJCXMgPSBzICsgInByb3RlY3RlZCAiOyAvLyROT04tTkxTLTEkDQogCWlmICgobW9kaWZpZXJzICYgQWNjU3RhdGljKSAhPSAwKQ0KLQkJcyA9IHMgKyAic3RhdGljICIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAic3RhdGljICI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKChtb2RpZmllcnMgJiBBY2NGaW5hbCkgIT0gMCkNCi0JCXMgPSBzICsgImZpbmFsICIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAiZmluYWwgIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoKG1vZGlmaWVycyAmIEFjY1N5bmNocm9uaXplZCkgIT0gMCkNCi0JCXMgPSBzICsgInN5bmNocm9uaXplZCAiLypub25OTFMqLzsNCisJCXMgPSBzICsgInN5bmNocm9uaXplZCAiOyAvLyROT04tTkxTLTEkDQogCWlmICgobW9kaWZpZXJzICYgQWNjVm9sYXRpbGUpICE9IDApDQotCQlzID0gcyArICJ2b2xhdGlsZSAiLypub25OTFMqLzsNCisJCXMgPSBzICsgInZvbGF0aWxlICI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKChtb2RpZmllcnMgJiBBY2NUcmFuc2llbnQpICE9IDApDQotCQlzID0gcyArICJ0cmFuc2llbnQgIi8qbm9uTkxTKi87DQorCQlzID0gcyArICJ0cmFuc2llbnQgIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoKG1vZGlmaWVycyAmIEFjY05hdGl2ZSkgIT0gMCkNCi0JCXMgPSBzICsgIm5hdGl2ZSAiLypub25OTFMqLzsNCisJCXMgPSBzICsgIm5hdGl2ZSAiOyAvLyROT04tTkxTLTEkDQogCWlmICgobW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApDQotCQlzID0gcyArICJhYnN0cmFjdCAiLypub25OTFMqLzsNCisJCXMgPSBzICsgImFic3RyYWN0ICI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIC8qKiBARGVwcmVjYXRlZA0KQEAgLTk3LDggKzk3LDggQEAKIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYlN0cmluZyhpbnQgdGFiKXsNCiAJLypzbG93IGNvZGUqLw0KIA0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLyA7DQotCWZvciAoaW50IGkgPSB0YWIgOyBpID4gMCA7IGktLSkgcyA9IHMgKyAiICAiLypub25OTFMqLyA7DQorCVN0cmluZyBzID0gIiIgOyAvLyROT04tTkxTLTEkDQorCWZvciAoaW50IGkgPSB0YWIgOyBpID4gMCA7IGktLSkgcyA9IHMgKyAiICAiIDsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczt9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJLyogbG93IHNwZWVkICovDQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJLyogbG93IHNwZWVkICovDQogDQogCS8qSWYgcmVhY2ggaGVyZSBmZXRjaHMgdGhlIGRlZmF1bHQgZGlzcGxheSovDQotCXJldHVybiAiKioqKiIvKm5vbk5MUyovKyBzdXBlci50b1N0cmluZygpKyAiKioqKiIvKm5vbk5MUyovO30NCisJcmV0dXJuICIqKioqIisgc3VwZXIudG9TdHJpbmcoKSsgIioqKioiO30gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSl7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JpbmFyeUV4cHJlc3Npb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhCmluZGV4IGMzZDc3MmIuLmMzM2I2NjMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0xNDAyLDggKzE0MDIsOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCl7DQogCS8qIHNsb3cgY29kZSovDQogCQ0KLQlyZXR1cm4JbGVmdC50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIi8qbm9uTkxTKi8gKw0KLQkJCW9wZXJhdG9yVG9TdHJpbmcoKSArICIgIi8qbm9uTkxTKi8gKw0KKwlyZXR1cm4JbGVmdC50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIiArIC8vJE5PTi1OTFMtMSQNCisJCQlvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyAvLyROT04tTkxTLTEkDQogCQkJcmlnaHQudG9TdHJpbmdFeHByZXNzaW9uKCkgOyB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Jsb2NrLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Jsb2NrLmphdmEKaW5kZXggMjQ0M2YyYi4uNjhhZjc1MyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CbG9jay5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YQpAQCAtODYsOSArODYsOSBAQAogDQogCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7DQogCWlmICh0aGlzLnN0YXRlbWVudHMgPT0gbnVsbCkgew0KLQkJcyArPSAie1xuIi8qbm9uTkxTKi87DQorCQlzICs9ICJ7XG4iOyAvLyROT04tTkxTLTEkDQogCQlzICs9IHRhYlN0cmluZyh0YWIpOw0KLQkJcyArPSAifSIvKm5vbk5MUyovOw0KKwkJcyArPSAifSI7IC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiBzOw0KIAl9DQogDQpAQCAtOTYsMjIgKzk2LDIyIEBACiAJLy8JCQkJPyAiIHsgLy8gLS0tc2NvcGUgbmVlZGVkIGZvciAiK1N0cmluZy52YWx1ZU9mKGV4cGxpY2l0RGVjbGFyYXRpb25zKSArIiBsb2NhbHMtLS0tLS0tLS0tLS0gXG4iDQogCS8vCQkJCTogInsvLyAtLS1OTyBzY29wZSBuZWVkZWQtLS0tLS0gXG4iKSA7DQogDQotCXMgKz0gIntcbiIvKm5vbk5MUyovOw0KKwlzICs9ICJ7XG4iOyAvLyROT04tTkxTLTEkDQogCXMgKz0gdGhpcy50b1N0cmluZ1N0YXRlbWVudHModGFiKTsNCiAJcyArPSB0YWJTdHJpbmcodGFiKTsNCi0JcyArPSAifSIvKm5vbk5MUyovOw0KKwlzICs9ICJ9IjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ1N0YXRlbWVudHMoaW50IHRhYikgew0KIAkvKiBzbG93IGNvZGUgKi8NCi0gCWlmICh0aGlzLnN0YXRlbWVudHMgPT0gbnVsbCkgcmV0dXJuICIiLypub25OTFMqLzsNCisgCWlmICh0aGlzLnN0YXRlbWVudHMgPT0gbnVsbCkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZChzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsNCiAJCWlmIChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgQmxvY2spew0KLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0gZWxzZSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiO1xuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIjtcbiIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX07DQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyZWFrLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyZWFrLmphdmEKaW5kZXggMWExNzg2ZS4uN2JkMGQ3ZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVhay5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJlYWsuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCS8qIHNsb3cgY29kZSAqLw0KIA0KIAlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpIDsNCi0JcyA9IHMgKyAiYnJlYWsgIi8qbm9uTkxTKi87DQorCXMgPSBzICsgImJyZWFrICI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGxhYmVsICE9IG51bGwgKQ0KIAkJcyA9IHMgKyBuZXcgU3RyaW5nKGxhYmVsKSA7DQogCXJldHVybiBzOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKaW5kZXggZmFkZWE1YS4uMDlmYWJiNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKQEAgLTI3LDcgKzI3LDggQEAKIAkJY3VycmVudFNjb3BlLnJlZmVyZW5jZVR5cGUoKS5yZWNvcmRSZWZlcmVuY2VUbyhiaW5kaW5nKTsNCiAJfQ0KIAkqLw0KLQkNCisJaWYgKGNvbnN0YW50RXhwcmVzc2lvbi5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQpIA0KKwkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhc2VFeHByZXNzaW9uTXVzdEJlQ29uc3RhbnQoY29uc3RhbnRFeHByZXNzaW9uKTsNCiAJcmV0dXJuIGZsb3dJbmZvOw0KIH0NCiAvKioNCkBAIC01Myw4ICs1NCw2IEBACiAJLy8gYWRkIGludG8gdGhlIGNvbGxlY3Rpb24gb2YgY2FzZXMgb2YgdGhlIGFzc29jaWF0ZWQgc3dpdGNoIHN0YXRlbWVudA0KIAlzd2l0Y2hTdGF0ZW1lbnQuY2FzZXNbc3dpdGNoU3RhdGVtZW50LmNhc2VDb3VudCsrXSA9IHRoaXM7DQogCVR5cGVCaW5kaW5nIGNhc2VUYiA9IGNvbnN0YW50RXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7DQotCWlmIChjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSANCi0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhc2VFeHByZXNzaW9uTXVzdEJlQ29uc3RhbnQoY29uc3RhbnRFeHByZXNzaW9uKTsNCiAJaWYgKGNhc2VUYiA9PSBudWxsIHx8IHRlc3RUYiA9PSBudWxsKQ0KIAkJcmV0dXJuIG51bGw7DQogCWlmIChjb25zdGFudEV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShjYXNlVGIsIHRlc3RUYikpDQpAQCAtNjgsNyArNjcsNyBAQAogCS8qIHNsb3cgY29kZSAqLw0KIA0KIAlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOw0KLQlzID0gcyArICJjYXNlICIvKm5vbk5MUyovICsgY29uc3RhbnRFeHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiA6ICIvKm5vbk5MUyovIDsNCisJcyA9IHMgKyAiY2FzZSAiICsgY29uc3RhbnRFeHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiA6ICIgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJcmV0dXJuIHM7fQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzdEV4cHJlc3Npb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzdEV4cHJlc3Npb24uamF2YQppbmRleCA2Y2VhYThkLi41NTk3MTM4IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc3RFeHByZXNzaW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhCkBAIC0yMzQsNyArMjM0LDcgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7DQogCS8qc2xvdyBjb2RlKi8NCiAJDQotCXJldHVybiAiKCIvKm5vbk5MUyovICsgdHlwZS50b1N0cmluZygwKSsgIikgIi8qbm9uTkxTKi8gKw0KKwlyZXR1cm4gIigiICsgdHlwZS50b1N0cmluZygwKSsgIikgIiArIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCWV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCkgOyB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKaW5kZXggNDUyMTQ0Ni4uOWI3ZDMzMyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCkBAIC01OSw4ICs1OSw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpew0KIAkvKnNsb3cgY29kZSovDQogCQ0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLzsNCi0JcyA9IHMgKyB0eXBlLnRvU3RyaW5nKDApICsgIi5jbGFzcyIvKm5vbk5MUyovIDsNCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KKwlzID0gcyArIHR5cGUudG9TdHJpbmcoMCkgKyAiLmNsYXNzIiA7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7fQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsaW5pdC5qYXZhCmluZGV4IGE4ZmY5ZWMuLmIwNzcxZDggMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGluaXQuamF2YQpAQCAtMTQsMTM2ICsxNCwxOTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOw0KIA0KIHB1YmxpYyBjbGFzcyBDbGluaXQgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gQ29uc3RhbnRQb29sTmFtZSA9ICI8Y2xpbml0PiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotcHVibGljIENsaW5pdCgpIHsNCi0JbW9kaWZpZXJzID0gMDsNCi0Jc2VsZWN0b3IgPSBDb25zdGFudFBvb2xOYW1lOw0KLX0NCi1wdWJsaWMgdm9pZCBhbmFseXNlQ29kZShDbGFzc1Njb3BlIGNsYXNzU2NvcGUsIEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgc3RhdGljSW5pdGlhbGl6ZXJGbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pew0KKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBDb25zdGFudFBvb2xOYW1lID0gIjxjbGluaXQ+IiAudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwlwcml2YXRlIEZpZWxkQmluZGluZyBhc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcgPSBudWxsOw0KKwlwcml2YXRlIEZpZWxkQmluZGluZyBjbGFzc0xpdGVyYWxTeW50aGV0aWNGaWVsZCA9IG51bGw7DQorDQorCXB1YmxpYyBDbGluaXQoKSB7DQorCQltb2RpZmllcnMgPSAwOw0KKwkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2xOYW1lOw0KKwl9DQogCQ0KLQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pDQotCQlyZXR1cm47DQotCXRyeSB7DQotCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGNsaW5pdENvbnRleHQgPSBuZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgNCi0JCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LnBhcmVudCwgDQotCQkJdGhpcywgDQotCQkJTm9FeGNlcHRpb25zLCANCi0JCQlzY29wZSwNCi0JCQlGbG93SW5mby5EZWFkRW5kKTsNCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoDQorCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUsDQorCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IHN0YXRpY0luaXRpYWxpemVyRmxvd0NvbnRleHQsDQorCQlGbG93SW5mbyBmbG93SW5mbykgew0KIA0KLQkJLy8gY2hlY2sgZm9yIG1pc3NpbmcgcmV0dXJuaW5nIHBhdGgNCi0JCW5lZWRGcmVlUmV0dXJuID0gISgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpOw0KKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQ0KKwkJCXJldHVybjsNCisJCXRyeSB7DQorCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBjbGluaXRDb250ZXh0ID0NCisJCQkJbmV3IEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQoDQorCQkJCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LnBhcmVudCwNCisJCQkJCXRoaXMsDQorCQkJCQlOb0V4Y2VwdGlvbnMsDQorCQkJCQlzY29wZSwNCisJCQkJCUZsb3dJbmZvLkRlYWRFbmQpOw0KIA0KLQkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMNCi0JCWZsb3dJbmZvID0gZmxvd0luZm8ubWVyZ2VkV2l0aChzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmluaXRzT25SZXR1cm4pOw0KLQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmZpZWxkcygpOw0KLQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsNCi0JCQlGaWVsZEJpbmRpbmcgZmllbGQ7DQotCQkJaWYgKChmaWVsZCA9IGZpZWxkc1tpXSkuaXNTdGF0aWMoKQ0KLQkJCQkmJiBmaWVsZC5pc0ZpbmFsKCkNCi0JCQkJJiYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZHNbaV0pKSkgew0KLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkLCBzY29wZS5yZWZlcmVuY2VUeXBlKCkuZGVjbGFyYXRpb25PZihmaWVsZCkpOyAvLyBjYW4gY29tcGxhaW4gYWdhaW5zdCB0aGUgZmllbGQgZGVjbCwgc2luY2Ugb25seSBvbmUgPGNsaW5pdD4NCi0JCQl9DQotCQl9DQotCQkvLyBjaGVjayBzdGF0aWMgaW5pdGlhbGl6ZXJzIHRocm93biBleGNlcHRpb25zDQotCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmNoZWNrSW5pdGlhbGl6ZXJFeGNlcHRpb25zKHNjb3BlLCBjbGluaXRDb250ZXh0LCBmbG93SW5mbyk7DQotCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsNCi0JCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOwkJDQotCX0NCi19DQotLyoqDQotICogQnl0ZWNvZGUgZ2VuZXJhdGlvbiBmb3IgYSA8Y2xpbml0PiBtZXRob2QNCi0gKg0KLSAqIEBwYXJhbSBjbGFzc1Njb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZQ0KLSAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlDQotICovDQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgew0KLQlpbnQgY2xpbml0T2Zmc2V0ID0gMDsNCi0JaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7DQotCQkvLyBzaG91bGQgbmV2ZXIgaGF2ZSB0byBhZGQgYW55IDxjbGluaXQ+IHByb2JsZW0gbWV0aG9kDQotCQlyZXR1cm47DQotCX0NCi0JdHJ5IHsNCi0JCWNsaW5pdE9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsNCi0JCUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wgPSBjbGFzc0ZpbGUuY29uc3RhbnRQb29sOw0KLQkJaW50IGNvbnN0YW50UG9vbE9mZnNldCA9IGNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0Ow0KLQkJaW50IGNvbnN0YW50UG9vbEluZGV4ID0gY29uc3RhbnRQb29sLmN1cnJlbnRJbmRleDsNCi0JCWNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXJGb3JDbGluaXQoKTsNCi0JCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0Ow0KLQkJY2xhc3NGaWxlLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOw0KLQkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtID0gY2xhc3NGaWxlLmNvZGVTdHJlYW07DQotCQljb2RlU3RyZWFtLnJlc2V0KHRoaXMsIGNsYXNzRmlsZSk7DQotCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dDsNCisJCQkvLyBjaGVjayBmb3IgbWlzc2luZyByZXR1cm5pbmcgcGF0aA0KKwkJCW5lZWRGcmVlUmV0dXJuID0NCisJCQkJISgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpOw0KIA0KLQkJLy8gaW5pdGlhbGl6ZSBsb2NhbCBwb3NpdGlvbnMgLSBpbmNsdWRpbmcgaW5pdGlhbGl6ZXIgc2NvcGUuDQotCQlzY29wZS5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucygwLCBjb2RlU3RyZWFtKTsgLy8gc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkNCi0JCU1ldGhvZFNjb3BlIHN0YXRpY0luaXRpYWxpemVyU2NvcGUgPSBkZWNsYXJpbmdUeXBlLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7DQotCQlzdGF0aWNJbml0aWFsaXplclNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKDAsIGNvZGVTdHJlYW0pOyAvLyBvZmZzZXQgYnkgdGhlIGFyZ3VtZW50IHNpemUNCi0NCi0JCS8vIGdlbmVyYXRlIGluaXRpYWxpemVycw0KLQkJaWYgKGRlY2xhcmluZ1R5cGUuZmllbGRzICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZGVjbGFyaW5nVHlwZS5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCi0JCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2w7DQotCQkJCWlmICgoZmllbGREZWNsID0gZGVjbGFyaW5nVHlwZS5maWVsZHNbaV0pLmlzU3RhdGljKCkpIHsNCi0JCQkJCWZpZWxkRGVjbC5nZW5lcmF0ZUNvZGUoc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwgY29kZVN0cmVhbSk7DQorCQkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMNCisJCQlmbG93SW5mbyA9IGZsb3dJbmZvLm1lcmdlZFdpdGgoc3RhdGljSW5pdGlhbGl6ZXJGbG93Q29udGV4dC5pbml0c09uUmV0dXJuKTsNCisJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZmllbGRzKCk7DQorCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsNCisJCQkJRmllbGRCaW5kaW5nIGZpZWxkOw0KKwkJCQlpZiAoKGZpZWxkID0gZmllbGRzW2ldKS5pc1N0YXRpYygpDQorCQkJCQkmJiBmaWVsZC5pc0ZpbmFsKCkNCisJCQkJCSYmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRzW2ldKSkpIHsNCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoDQorCQkJCQkJZmllbGQsDQorCQkJCQkJc2NvcGUucmVmZXJlbmNlVHlwZSgpLmRlY2xhcmF0aW9uT2YoZmllbGQpKTsNCisJCQkJCS8vIGNhbiBjb21wbGFpbiBhZ2FpbnN0IHRoZSBmaWVsZCBkZWNsLCBzaW5jZSBvbmx5IG9uZSA8Y2xpbml0Pg0KIAkJCQl9DQogCQkJfQ0KKwkJCS8vIGNoZWNrIHN0YXRpYyBpbml0aWFsaXplcnMgdGhyb3duIGV4Y2VwdGlvbnMNCisJCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmNoZWNrSW5pdGlhbGl6ZXJFeGNlcHRpb25zKA0KKwkJCQlzY29wZSwNCisJCQkJY2xpbml0Q29udGV4dCwNCisJCQkJZmxvd0luZm8pOw0KKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgew0KKwkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOw0KIAkJfQ0KLQkJaWYgKGNvZGVTdHJlYW0ucG9zaXRpb24gPT0gMCkgew0KLQkJCS8vIGRvIG5vdCBuZWVkIHRvIG91dHB1dCBhIENsaW5pdCBpZiBubyBieXRlY29kZXMNCi0JCQkvLyBzbyB3ZSByZXNldCB0aGUgb2Zmc2V0IGluc2lkZSB0aGUgYnl0ZSBhcnJheSBjb250ZW50cy4NCi0JCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBjbGluaXRPZmZzZXQ7DQotCQkJLy8gbGlrZSB3ZSBkb24ndCBhZGRkIGEgbWV0aG9kIHdlIG5lZWQgdG8gdW5kbyB0aGUgaW5jcmVtZW50IG9uIHRoZSBtZXRob2QgY291bnQNCi0JCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsNCi0JCQkvLyByZXNldCB0aGUgY29uc3RhbnQgcG9vbCB0byBpdHMgc3RhdGUgYmVmb3JlIHRoZSBjbGluaXQNCi0JCQljb25zdGFudFBvb2wucmVzZXRGb3JDbGluaXQoY29uc3RhbnRQb29sSW5kZXgsIGNvbnN0YW50UG9vbE9mZnNldCk7DQotCQl9IGVsc2Ugew0KLQkJCWlmIChuZWVkRnJlZVJldHVybikgew0KLQkJCQlpbnQgb2xkUG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KLQkJCQljb2RlU3RyZWFtLnJldHVybl8oKTsNCi0JCQkJY29kZVN0cmVhbS51cGRhdGVMb2NhbFZhcmlhYmxlc0F0dHJpYnV0ZShvbGRQb3NpdGlvbik7DQotCQkJfQ0KLQkJCS8vIFJlY29yZCB0aGUgZW5kIG9mIHRoZSBjbGluaXQ6IHBvaW50IHRvIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MNCi0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oMCwgZGVjbGFyaW5nVHlwZSk7DQotCQkJY2xhc3NGaWxlLmNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdChjb2RlQXR0cmlidXRlT2Zmc2V0KTsNCi0JCX0NCi0JfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgew0KLQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyDQotCQkvLyB0aGUgY2xpbml0IHJlZmVyZW5jZUNvbnRleHQgaXMgdGhlIHR5cGUgZGVjbGFyYXRpb24NCi0JCS8vIEFsbCBjbGluaXQgcHJvYmxlbXMgd2lsbCBiZSByZXBvcnRlZCBhZ2FpbnN0IHRoZSB0eXBlOiBBYm9ydFR5cGUgaW5zdGVhZCBvZiBBYm9ydE1ldGhvZA0KLQkJLy8gcmVzZXQgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY2xpbml0IGNvZGUNCi0JCS8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIG1ldGhvZCBpbmZvIGFzIHdlbGwuDQotCQkvLyBUaGlzIGlzIGRvbmUgaW4gdGhlIGFkZFByb2JsZW1NZXRob2QgYW5kIGFkZFByb2JsZW1Db25zdHJ1Y3RvciBmb3Igb3RoZXINCi0JCS8vIGNhc2VzLg0KLQkJY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0ID0gY2xpbml0T2Zmc2V0Ow0KLQkJY2xhc3NGaWxlLm1ldGhvZENvdW50LS07CQ0KIAl9DQotfQ0KLXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgew0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpew0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7DQotCXJldHVybiB0cnVlOw0KLX0NCi1wdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoUGFyc2VyIHBhcnNlciwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCl7DQotCS8vdGhlIGNsaW5pdCBpcyBmaWxsZWQgYnkgaGFuZCAuLi4uIA0KLX0NCi1wdWJsaWMgdm9pZCByZXNvbHZlKENsYXNzU2NvcGUgc2NvcGUpIHsNCi0JdGhpcy5zY29wZSA9IG5ldyBNZXRob2RTY29wZShzY29wZSwgc2NvcGUucmVmZXJlbmNlQ29udGV4dCwgdHJ1ZSk7DQotfQ0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYil7DQotCS8qIHNsb3cgY29kZSAqLw0KKwkNCisJLyoqDQorCSAqIEJ5dGVjb2RlIGdlbmVyYXRpb24gZm9yIGEgPGNsaW5pdD4gbWV0aG9kDQorCSAqDQorCSAqIEBwYXJhbSBjbGFzc1Njb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZQ0KKwkgKiBAcGFyYW0gY2xhc3NGaWxlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNsYXNzRmlsZQ0KKwkgKi8NCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgew0KKwkJaW50IGNsaW5pdE9mZnNldCA9IDA7DQorCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsNCisJCQkvLyBzaG91bGQgbmV2ZXIgaGF2ZSB0byBhZGQgYW55IDxjbGluaXQ+IHByb2JsZW0gbWV0aG9kDQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJdHJ5IHsNCisJCQljbGluaXRPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7DQorCQkJQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCA9IGNsYXNzRmlsZS5jb25zdGFudFBvb2w7DQorCQkJaW50IGNvbnN0YW50UG9vbE9mZnNldCA9IGNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0Ow0KKwkJCWludCBjb25zdGFudFBvb2xJbmRleCA9IGNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXg7DQorCQkJY2xhc3NGaWxlLmdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlckZvckNsaW5pdCgpOw0KKwkJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0Ow0KKwkJCWNsYXNzRmlsZS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsNCisJCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0gPSBjbGFzc0ZpbGUuY29kZVN0cmVhbTsNCisJCQl0aGlzLnJlc29sdmUoY2xhc3NTY29wZSk7DQogDQotCVN0cmluZyBzID0gIiIvKm5vbk5MUyovIDsNCi0JcyA9IHMgKyB0YWJTdHJpbmcodGFiKTsNCi0JcyA9IHMgKyAiPGNsaW5pdD4oKSIvKm5vbk5MUyovIDsNCi0JcyA9IHMgKyB0b1N0cmluZ1N0YXRlbWVudHModGFiICsgMSk7DQotCXJldHVybiBzIDt9DQotcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7DQotCXZpc2l0b3IudmlzaXQodGhpcywgY2xhc3NTY29wZSk7DQotCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgY2xhc3NTY29wZSk7DQotfQ0KLX0NCisJCQljb2RlU3RyZWFtLnJlc2V0KHRoaXMsIGNsYXNzRmlsZSk7DQorCQkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQ7DQorDQorCQkJLy8gaW5pdGlhbGl6ZSBsb2NhbCBwb3NpdGlvbnMgLSBpbmNsdWRpbmcgaW5pdGlhbGl6ZXIgc2NvcGUuDQorCQkJc2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoMCwgY29kZVN0cmVhbSk7IC8vIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5DQorCQkJTWV0aG9kU2NvcGUgc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IGRlY2xhcmluZ1R5cGUuc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsNCisJCQlzdGF0aWNJbml0aWFsaXplclNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKDAsIGNvZGVTdHJlYW0pOw0KKwkJCS8vIG9mZnNldCBieSB0aGUgYXJndW1lbnQgc2l6ZQ0KKw0KKwkJCS8vIDEuNCBmZWF0dXJlDQorCQkJLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgYW55IG90aGVyIGluaXRpYWxpemF0aW9uDQorCQkJaWYgKHRoaXMuYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nICE9IG51bGwpIHsNCisJCQkJLy8gZ2VuZXJhdGUgY29kZSByZWxhdGVkIHRvIHRoZSBhY3RpdmF0aW9uIG9mIGFzc2VydGlvbiBmb3IgdGhpcyBjbGFzcw0KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ2xhc3NMaXRlcmFsQWNjZXNzRm9yVHlwZSgNCisJCQkJCWNsYXNzU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLA0KKwkJCQkJY2xhc3NMaXRlcmFsU3ludGhldGljRmllbGQpOw0KKwkJCQljb2RlU3RyZWFtLmludm9rZUphdmFMYW5nQ2xhc3NEZXNpcmVkQXNzZXJ0aW9uU3RhdHVzKCk7DQorCQkJCUxhYmVsIGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7DQorCQkJCWNvZGVTdHJlYW0uaWZuZShmYWxzZUxhYmVsKTsNCisJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOw0KKwkJCQlMYWJlbCBqdW1wTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7DQorCQkJCWNvZGVTdHJlYW0uZ290b18oanVtcExhYmVsKTsNCisJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOw0KKwkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7DQorCQkJCWp1bXBMYWJlbC5wbGFjZSgpOw0KKwkJCQljb2RlU3RyZWFtLnB1dHN0YXRpYyh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyk7DQorCQkJfQ0KKwkJCS8vIGdlbmVyYXRlIGluaXRpYWxpemVycw0KKwkJCWlmIChkZWNsYXJpbmdUeXBlLmZpZWxkcyAhPSBudWxsKSB7DQorCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBkZWNsYXJpbmdUeXBlLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KKwkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2w7DQorCQkJCQlpZiAoKGZpZWxkRGVjbCA9IGRlY2xhcmluZ1R5cGUuZmllbGRzW2ldKS5pc1N0YXRpYygpKSB7DQorCQkJCQkJZmllbGREZWNsLmdlbmVyYXRlQ29kZShzdGF0aWNJbml0aWFsaXplclNjb3BlLCBjb2RlU3RyZWFtKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAoY29kZVN0cmVhbS5wb3NpdGlvbiA9PSAwKSB7DQorCQkJCS8vIGRvIG5vdCBuZWVkIHRvIG91dHB1dCBhIENsaW5pdCBpZiBubyBieXRlY29kZXMNCisJCQkJLy8gc28gd2UgcmVzZXQgdGhlIG9mZnNldCBpbnNpZGUgdGhlIGJ5dGUgYXJyYXkgY29udGVudHMuDQorCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsNCisJCQkJLy8gbGlrZSB3ZSBkb24ndCBhZGRkIGEgbWV0aG9kIHdlIG5lZWQgdG8gdW5kbyB0aGUgaW5jcmVtZW50IG9uIHRoZSBtZXRob2QgY291bnQNCisJCQkJY2xhc3NGaWxlLm1ldGhvZENvdW50LS07DQorCQkJCS8vIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIGNsaW5pdA0KKwkJCQljb25zdGFudFBvb2wucmVzZXRGb3JDbGluaXQoY29uc3RhbnRQb29sSW5kZXgsIGNvbnN0YW50UG9vbE9mZnNldCk7DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKG5lZWRGcmVlUmV0dXJuKSB7DQorCQkJCQlpbnQgb2xkUG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KKwkJCQkJY29kZVN0cmVhbS5yZXR1cm5fKCk7DQorCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxvY2FsVmFyaWFibGVzQXR0cmlidXRlKG9sZFBvc2l0aW9uKTsNCisJCQkJfQ0KKwkJCQkvLyBSZWNvcmQgdGhlIGVuZCBvZiB0aGUgY2xpbml0OiBwb2ludCB0byB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzDQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbSgwLCBkZWNsYXJpbmdUeXBlKTsNCisJCQkJY2xhc3NGaWxlLmNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdChjb2RlQXR0cmlidXRlT2Zmc2V0KTsNCisJCQl9DQorCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7DQorCQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyDQorCQkJLy8gdGhlIGNsaW5pdCByZWZlcmVuY2VDb250ZXh0IGlzIHRoZSB0eXBlIGRlY2xhcmF0aW9uDQorCQkJLy8gQWxsIGNsaW5pdCBwcm9ibGVtcyB3aWxsIGJlIHJlcG9ydGVkIGFnYWluc3QgdGhlIHR5cGU6IEFib3J0VHlwZSBpbnN0ZWFkIG9mIEFib3J0TWV0aG9kDQorCQkJLy8gcmVzZXQgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY2xpbml0IGNvZGUNCisJCQkvLyBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBtZXRob2QgaW5mbyBhcyB3ZWxsLg0KKwkJCS8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgYWRkUHJvYmxlbU1ldGhvZCBhbmQgYWRkUHJvYmxlbUNvbnN0cnVjdG9yIGZvciBvdGhlcg0KKwkJCS8vIGNhc2VzLg0KKwkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsNCisJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsNCisJCX0NCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBpc0NsaW5pdCgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6YXRpb25NZXRob2QoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorCXB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cyhQYXJzZXIgcGFyc2VyLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7DQorCQkvL3RoZSBjbGluaXQgaXMgZmlsbGVkIGJ5IGhhbmQgLi4uLiANCisJfQ0KKwlwdWJsaWMgdm9pZCByZXNvbHZlKENsYXNzU2NvcGUgc2NvcGUpIHsNCisJCXRoaXMuc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUoc2NvcGUsIHNjb3BlLnJlZmVyZW5jZUNvbnRleHQsIHRydWUpOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgew0KKwkJLyogc2xvdyBjb2RlICovDQorCQlTdHJpbmcgcyA9ICIiIDsgLy8kTk9OLU5MUy0xJA0KKwkJcyA9IHMgKyB0YWJTdHJpbmcodGFiKTsNCisJCXMgPSBzICsgIjxjbGluaXQ+KCkiIDsgLy8kTk9OLU5MUy0xJA0KKwkJcyA9IHMgKyB0b1N0cmluZ1N0YXRlbWVudHModGFiICsgMSk7DQorCQlyZXR1cm4gczsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgNCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsDQorCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsNCisJCXZpc2l0b3IudmlzaXQodGhpcywgY2xhc3NTY29wZSk7DQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpOw0KKwl9DQorDQorCS8vIDEuNCBmZWF0dXJlDQorCXB1YmxpYyB2b2lkIGFkZFN1cHBvcnRGb3JBc3NlcnRpb24oRmllbGRCaW5kaW5nIGFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZykgew0KKwkJdGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcgPSBhc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmc7DQorDQorCQkvLyB3ZSBuZWVkIHRvIGFkZCB0aGUgZmllbGQgcmlnaHQgbm93LCBiZWNhdXNlIHRoZSBmaWVsZCBpbmZvcyBhcmUgZ2VuZXJhdGVkIGJlZm9yZSB0aGUgbWV0aG9kcw0KKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9DQorCQkJdGhpcy5zY29wZS5vdXRlck1vc3RNZXRob2RTY29wZSgpLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsNCisJCXRoaXMuY2xhc3NMaXRlcmFsU3ludGhldGljRmllbGQgPQ0KKwkJCXNvdXJjZVR5cGUuYWRkU3ludGhldGljRmllbGQoc291cmNlVHlwZSwgc2NvcGUpOw0KKwl9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YQppbmRleCA1ZmUxMTNmLi5hMTUyZjdiIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5qYXZhCkBAIC0xOTcsMTggKzE5NywxOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7DQogCS8qdmVyeSBzbG93IGNvZGUqLw0KIA0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkNCi0JCXMgPSB0YWJTdHJpbmcodGFiKSArICJwYWNrYWdlICIvKm5vbk5MUyovICsgY3VycmVudFBhY2thZ2UudG9TdHJpbmcoMCwgZmFsc2UpICsgIjtcbiIvKm5vbk5MUyovOw0KKwkJcyA9IHRhYlN0cmluZyh0YWIpICsgInBhY2thZ2UgIiArIGN1cnJlbnRQYWNrYWdlLnRvU3RyaW5nKDAsIGZhbHNlKSArICI7XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiANCiAJaWYgKGltcG9ydHMgIT0gbnVsbCkNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgew0KLQkJCXMgKz0gdGFiU3RyaW5nKHRhYikgKyAiaW1wb3J0ICIvKm5vbk5MUyovICsgaW1wb3J0c1tpXS50b1N0cmluZygpICsgIjtcbiIvKm5vbk5MUyovOw0KKwkJCXMgKz0gdGFiU3RyaW5nKHRhYikgKyAiaW1wb3J0ICIgKyBpbXBvcnRzW2ldLnRvU3RyaW5nKCkgKyAiO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQl9Ow0KIA0KIAlpZiAodHlwZXMgIT0gbnVsbCkNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlzICs9ICB0eXBlc1tpXS50b1N0cmluZyh0YWIpICsgIlxuIi8qbm9uTkxTKi87DQorCQkJcyArPSAgdHlwZXNbaV0udG9TdHJpbmcodGFiKSArICJcbiI7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJcmV0dXJuIHM7DQogfQ0KQEAgLTIyOCw2ICsyMjgsNyBAQAogCQkJCQl0eXBlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7DQogCQkJfQ0KIAkJfQ0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7DQogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21wb3VuZEFzc2lnbm1lbnQuamF2YQppbmRleCA4ZjNkZjczLi5mZWM0ZThjIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcG91bmRBc3NpZ25tZW50LmphdmEKQEAgLTQ4LDI5ICs0OCwyOSBAQAogcHVibGljIFN0cmluZyBvcGVyYXRvclRvU3RyaW5nKCkgew0KIAlzd2l0Y2ggKG9wZXJhdG9yKSB7DQogCQljYXNlIFBMVVMgOg0KLQkJCXJldHVybiAiKz0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIis9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBNSU5VUyA6DQotCQkJcmV0dXJuICItPSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiLT0iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIE1VTFRJUExZIDoNCi0JCQlyZXR1cm4gIio9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIqPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgRElWSURFIDoNCi0JCQlyZXR1cm4gIi89Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIvPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgQU5EIDoNCi0JCQlyZXR1cm4gIiY9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICImPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgT1IgOg0KLQkJCXJldHVybiAifD0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gInw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBYT1IgOg0KLQkJCXJldHVybiAiXj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIl49IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBSRU1BSU5ERVIgOg0KLQkJCXJldHVybiAiJT0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiU9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBMRUZUX1NISUZUIDoNCi0JCQlyZXR1cm4gIjw8PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPDw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBSSUdIVF9TSElGVCA6DQotCQkJcmV0dXJuICI+Pj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj4+PSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQgOg0KLQkJCXJldHVybiAiPj4+PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPj4+PSI7IC8vJE5PTi1OTFMtMSQNCiAJfTsNCi0JcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIi8qbm9uTkxTKi87DQorCXJldHVybiAidW5rbm93biBvcGVyYXRvciI7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsNCiAJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7DQpAQCAtMTE5LDggKzExOSw4IEBACiAJcmV0dXJuIGZhbHNlIDt9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgew0KIA0KLQlyZXR1cm4gCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIi8qbm9uTkxTKi8gKw0KLQkJCW9wZXJhdG9yVG9TdHJpbmcoKSArICIgIi8qbm9uTkxTKi8gKw0KKwlyZXR1cm4gCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIiArIC8vJE5PTi1OTFMtMSQNCisJCQlvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyAvLyROT04tTkxTLTEkDQogCQkJZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSA7IH0NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmluZGV4IGRhMDU5NjMuLjcwYTk3ZGYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQpAQCAtMjU0LDggKzI1NCw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKXsNCiAJLyogc2xvdyBjb2RlKi8NCiANCi0JcmV0dXJuCWNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgPyAiLypub25OTFMqLyArDQotCQkJdmFsdWVJZlRydWUudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiIDogIi8qbm9uTkxTKi8gKw0KKwlyZXR1cm4JY29uZGl0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiA/ICIgKyAvLyROT04tTkxTLTEkDQorCQkJdmFsdWVJZlRydWUudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiIDogIiArIC8vJE5PTi1OTFMtMSQNCiAJCQl2YWx1ZUlmRmFsc2UudG9TdHJpbmdFeHByZXNzaW9uKCkgOyB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDc4Zjg3ODUuLjkxMWZkYTAgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCkBAIC0xNSw3ICsxNSw3IEBACiANCiBwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gew0KIAlwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY29uc3RydWN0b3JDYWxsOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBDb25zdGFudFBvb2xOYW1lID0gIjxpbml0PiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIENvbnN0YW50UG9vbE5hbWUgPSAiPGluaXQ+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENvbnN0cnVjdG9yID0gZmFsc2U7DQogDQogCXB1YmxpYyBpbnQgcmVmZXJlbmNlQ291bnQgPSAwOyAvLyBjb3VudCBob3cgbWFueSB0aW1lcyB0aGlzIGNvbnN0cnVjdG9yIGlzIHJlZmVyZW5jZWQgZnJvbSBvdGhlciBsb2NhbCBjb25zdHJ1Y3RvcnMNCkBAIC0yNTcsMTkgKzI1NywxOSBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ1N0YXRlbWVudHMoaW50IHRhYikgew0KIAkvKiBzbG93IGNvZGUgKi8NCiANCi0JU3RyaW5nIHMgPSAiIHsiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiIHsiOyAvLyROT04tTkxTLTEkDQogCWlmIChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgew0KLQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIGNvbnN0cnVjdG9yQ2FsbC50b1N0cmluZyh0YWIpICsgIjsiLypub25OTFMqLzsNCisJCXMgPSBzICsgIlxuIiArIGNvbnN0cnVjdG9yQ2FsbC50b1N0cmluZyh0YWIpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJfQ0KIAlpZiAoc3RhdGVtZW50cyAhPSBudWxsKXsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKyl7DQotCQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiKTsNCisJCQlzID0gcyArICJcbiIgKyBzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKHRhYik7IC8vJE5PTi1OTFMtMSQNCiAJCQlpZiAoIShzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgQmxvY2spKXsNCi0JCQkJcyArPSAiOyIvKm5vbk5MUyovOw0KKwkJCQlzICs9ICI7IjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfQ0KLQlzKz0iXG4iLypub25OTFMqLyt0YWJTdHJpbmcodGFiID09IDAgPyAwIDogdGFiIC0gMSkrIn0iLypub25OTFMqLzsNCisJcys9IlxuIit0YWJTdHJpbmcodGFiID09IDAgPyAwIDogdGFiIC0gMSkrIn0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWUuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWUuamF2YQppbmRleCA1NmI1ZGQ3Li4yZDA4MDM3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnRpbnVlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db250aW51ZS5qYXZhCkBAIC02OSw3ICs2OSw3IEBACiAJLyogc2xvdyBjb2RlICovDQogDQogCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYikgOw0KLQlzID0gcyArICJjb250aW51ZSAiLypub25OTFMqLzsNCisJcyA9IHMgKyAiY29udGludWUgIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAobGFiZWwgIT0gbnVsbCApDQogCQlzID0gcyArIG5ldyBTdHJpbmcobGFiZWwpIDsNCiAJcmV0dXJuIHM7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9EZWZhdWx0Q2FzZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9EZWZhdWx0Q2FzZS5qYXZhCmluZGV4IGI2OTEzNTkuLmIyYzdkNTkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRGVmYXVsdENhc2UuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RlZmF1bHRDYXNlLmphdmEKQEAgLTUzLDcgKzUzLDcgQEAKIAkvKiBzbG93IGNvZGUgKi8NCiANCiAJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsNCi0JcyA9IHMgKyAiZGVmYXVsdCA6ICIvKm5vbk5MUyovIDsNCisJcyA9IHMgKyAiZGVmYXVsdCA6ICIgOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsNCiAJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEKaW5kZXggZjY5YTBiYS4uZWZhYzg5ZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Eb1N0YXRlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG9TdGF0ZW1lbnQuamF2YQpAQCAtMTI1LDE1ICsxMjUsMTUgQEAKIA0KIAlTdHJpbmcgaW5Gcm9udCwgcyA9IHRhYlN0cmluZyh0YWIpOw0KIAlpbkZyb250ID0gczsNCi0JcyA9IHMgKyAiZG8iLypub25OTFMqLzsNCisJcyA9IHMgKyAiZG8iOyAvLyROT04tTkxTLTEkDQogCWlmIChhY3Rpb24gPT0gbnVsbCkNCi0JCXMgPSBzICsgIiB7fVxuIi8qbm9uTkxTKi87DQorCQlzID0gcyArICIge31cbiI7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KIAkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEJsb2NrKQ0KLQkJCXMgPSBzICsgIlxuIi8qbm9uTkxTKi8gKyBhY3Rpb24udG9TdHJpbmcodGFiICsgMSkgKyAiXG4iLypub25OTFMqLzsNCisJCQlzID0gcyArICJcbiIgKyBhY3Rpb24udG9TdHJpbmcodGFiICsgMSkgKyAiXG4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCWVsc2UNCi0JCQlzID0gcyArICIge1xuIi8qbm9uTkxTKi8gKyBhY3Rpb24udG9TdHJpbmcodGFiICsgMSkgKyAiO31cbiIvKm5vbk5MUyovOw0KLQlzID0gcyArIGluRnJvbnQgKyAid2hpbGUgKCIvKm5vbk5MUyovICsgY29uZGl0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIikiLypub25OTFMqLzsNCisJCQlzID0gcyArICIge1xuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKSArICI7fVxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCXMgPSBzICsgaW5Gcm9udCArICJ3aGlsZSAoIiArIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCmluZGV4IDhkZjU4ODEuLmVjNDY4YjEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKQEAgLTIyNCwxNyArMjI0LDE3IEBACiANCiAJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsNCiAJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgDQotCQlzID0gcyArIHF1YWxpZmljYXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLiIvKm5vbk5MUyovIDsNCisJCXMgPSBzICsgcXVhbGlmaWNhdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIiA7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGFjY2Vzc01vZGUgPT0gVGhpcyl7DQotCQlzID0gcyArICJ0aGlzKCIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAidGhpcygiOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlzID0gcyArICJzdXBlcigiLypub25OTFMqLzsNCisJCXMgPSBzICsgInN1cGVyKCI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoYXJndW1lbnRzICE9IG51bGwpDQogCQlmb3IgKGludCBpPTAgOyBpIDwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKykNCiAJCXsJcyA9IHMgKyBhcmd1bWVudHNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCk7DQotCQkJaWYgKGkgIT0gYXJndW1lbnRzLmxlbmd0aC0xKSBzID0gcyArICIsICIvKm5vbk5MUyovO307Ow0KLQlzID0gcysiKSIvKm5vbk5MUyovIDsNCisJCQlpZiAoaSAhPSBhcmd1bWVudHMubGVuZ3RoLTEpIHMgPSBzICsgIiwgIjt9OzsgLy8kTk9OLU5MUy0xJA0KKwlzID0gcysiKSIgOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwcmVzc2lvbi5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKaW5kZXggODU5NTQwMC4uNDU2MjdlZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMpOw0KIAl9IGVsc2Ugew0KIAkJLy8gYWN0dWFsIG5vbi1jb25zdGFudCBjb2RlIGdlbmVyYXRpb24NCi0JCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QubWlzc2luZ0NvZGUiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC5taXNzaW5nQ29kZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTM0NCw3ICszNDQsNyBAQAogCQkvL2JlZm9yZSBUQyBoYXMgcnVubmVkDQogCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQ0KIAkJCS8vYWZ0ZXIgdGhlIFRDIGhhcyBydW5uZWQNCi0JCQlzICs9ICIgLypjc3Q6Ii8qbm9uTkxTKi8gKyBjb25zdGFudC50b1N0cmluZygpICsgIiovICIvKm5vbk5MUyovOw0KKwkJCXMgKz0gIiAvKmNzdDoiICsgY29uc3RhbnQudG9TdHJpbmcoKSArICIqLyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJcmV0dXJuIHMgKyB0b1N0cmluZ0V4cHJlc3Npb24odGFiKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXh0ZW5kZWRTdHJpbmdMaXRlcmFsLmphdmEKaW5kZXggYmU5YzkwZC4uOTlmZmE1ZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4dGVuZGVkU3RyaW5nTGl0ZXJhbC5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsNCiAJLyogc2xvdyBjb2RlICovDQogDQotCVN0cmluZyBzdHIgPSAiRXh0ZW5kZWRTdHJpbmdMaXRlcmFseyIvKm5vbk5MUyovKyBuZXcgU3RyaW5nKHNvdXJjZSkgKyJ9Ii8qbm9uTkxTKi87DQorCVN0cmluZyBzdHIgPSAiRXh0ZW5kZWRTdHJpbmdMaXRlcmFseyIrIG5ldyBTdHJpbmcoc291cmNlKSArIn0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHN0cjsNCiB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZERlY2xhcmF0aW9uLmphdmEKaW5kZXggYzJmMDQ0ZS4uMzA0MDU1ZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZERlY2xhcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTE0Nyw1ICsxNDcsNiBAQAogCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsNCiAJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSBpbml0aWFsaXphdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7DQogCX0NCisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkUmVmZXJlbmNlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkUmVmZXJlbmNlLmphdmEKaW5kZXggMTQ0Y2RlYy4uMWViNWM3YyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGRSZWZlcmVuY2UuamF2YQpAQCAtMzY1LDcgKzM2NSw3IEBACiAJLyogc2xvdyBjb2RlICovDQogCQ0KIAlyZXR1cm4gCXJlY2VpdmVyLnRvU3RyaW5nKCkNCi0JCQkrICIuIi8qbm9uTkxTKi8gDQorCQkJKyAiLiIgIC8vJE5PTi1OTFMtMSQNCiAJCQkrIG5ldyBTdHJpbmcodG9rZW4pO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZvclN0YXRlbWVudC5qYXZhCmluZGV4IDM3ZTY4ODcuLjE2ZWY1NTYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JTdGF0ZW1lbnQuamF2YQpAQCAtMjA4LDMyICsyMDgsMzIgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYiApew0KIAkvKiBzbG93IGNvZGUgKi8NCiAJDQotCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYikgKyAiZm9yICgiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKSArICJmb3IgKCI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKCFuZWVkZWRTY29wZSkNCi0JCXMgPSBzICsgIiAvLy0tTk8gdXBwZXJzY29wZSBzY29wZSBuZWVkZWRcbiIvKm5vbk5MUyovICsgdGFiU3RyaW5nKHRhYikgKyAiICAgICAiLypub25OTFMqLyA7DQorCQlzID0gcyArICIgLy8tLU5PIHVwcGVyc2NvcGUgc2NvcGUgbmVlZGVkXG4iICsgdGFiU3RyaW5nKHRhYikgKyAiICAgICAiIDsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCS8vaW5pdHMNCiAJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKQ0KIAl7CWZvciAoaW50IGkgPSAwIDsgaSA8IGluaXRpYWxpemF0aW9ucy5sZW5ndGggOyBpKyspew0KIAkJCS8vbmljZSBvbmx5IHdpdGggZXhwcmVzc2lvbnMNCiAJCQlzID0gcyArIGluaXRpYWxpemF0aW9uc1tpXS50b1N0cmluZygwKTsNCi0JCQlpZiAoaSAhPSAoaW5pdGlhbGl6YXRpb25zLmxlbmd0aCAtMSkpIHMgPSBzICsgIiAsICIvKm5vbk5MUyovIDt9fTsNCi0JcyA9IHMgKyAiOyAiLypub25OTFMqLyA7DQorCQkJaWYgKGkgIT0gKGluaXRpYWxpemF0aW9ucy5sZW5ndGggLTEpKSBzID0gcyArICIgLCAiIDt9fTsgLy8kTk9OLU5MUy0xJA0KKwlzID0gcyArICI7ICIgOyAvLyROT04tTkxTLTEkDQogCS8vY29uZA0KIAlpZiAoY29uZGl0aW9uICE9IG51bGwpDQogCQlzID0gcyArIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSA7DQotCXMgPSBzICsgIjsgIi8qbm9uTkxTKi8gOw0KKwlzID0gcyArICI7ICIgOyAvLyROT04tTkxTLTEkDQogCS8vdXBkYXRlcw0KIAlpZiAoaW5jcmVtZW50cyAhPSBudWxsKQ0KIAl7CWZvciAoaW50IGkgPSAwIDsgaSA8IGluY3JlbWVudHMubGVuZ3RoIDsgaSsrKXsNCiAJCQkvL25pY2Ugb25seSB3aXRoIGV4cHJlc3Npb25zDQogCQkJcyA9IHMgKyBpbmNyZW1lbnRzW2ldLnRvU3RyaW5nKDApOw0KLQkJCWlmIChpICE9IChpbmNyZW1lbnRzLmxlbmd0aCAtMSkpIHMgPSBzICsgIiAsICIvKm5vbk5MUyovIDt9fTsNCi0JcyA9IHMgKyAiKSAiLypub25OTFMqLyA7DQorCQkJaWYgKGkgIT0gKGluY3JlbWVudHMubGVuZ3RoIC0xKSkgcyA9IHMgKyAiICwgIiA7fX07IC8vJE5PTi1OTFMtMSQNCisJcyA9IHMgKyAiKSAiIDsgLy8kTk9OLU5MUy0xJA0KIAkvL2Jsb2NrDQogCWlmIChhY3Rpb24gPT0gbnVsbCkNCi0JCXMgPSBzICsgInt9Ii8qbm9uTkxTKi8gOw0KKwkJcyA9IHMgKyAie30iIDsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlzID0gcyArICJcbiIvKm5vbk5MUyovKyBhY3Rpb24udG9TdHJpbmcodGFiKzEpIDsNCisJCXMgPSBzICsgIlxuIisgYWN0aW9uLnRvU3RyaW5nKHRhYisxKSA7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7fQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSWZTdGF0ZW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSWZTdGF0ZW1lbnQuamF2YQppbmRleCA0OGE1ZDM0Li4zYjY2ZGNkIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lmU3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JZlN0YXRlbWVudC5qYXZhCkBAIC0xODcsMTAgKzE4NywxMCBAQAogDQogCVN0cmluZyBpbkZyb250ICwgcyA9IHRhYlN0cmluZyh0YWIpIDsNCiAJaW5Gcm9udCA9IHMgOw0KLQlzID0gcyArICJpZiAoIi8qbm9uTkxTKi8rIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSsiKSBcbiIvKm5vbk5MUyovOw0KLQlzID0gcyArIHRoZW5TdGF0ZW1lbnQudG9TdHJpbmcodGFiKzIpICsgIjsiLypub25OTFMqLyA7DQorCXMgPSBzICsgImlmICgiKyBjb25kaXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkrIikgXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJcyA9IHMgKyB0aGVuU3RhdGVtZW50LnRvU3RyaW5nKHRhYisyKSArICI7IiA7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkNCi0JCXMgPSBzICsgIlxuIi8qbm9uTkxTKi8gKyBpbkZyb250ICsgImVsc2VcbiIvKm5vbk5MUyovICsgZWxzZVN0YXRlbWVudC50b1N0cmluZyh0YWIrMikgKyAiOyIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyAiXG4iICsgaW5Gcm9udCArICJlbHNlXG4iICsgZWxzZVN0YXRlbWVudC50b1N0cmluZyh0YWIrMikgKyAiOyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkDQogCXJldHVybiBzIDt9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbXBvcnRSZWZlcmVuY2UuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW1wb3J0UmVmZXJlbmNlLmphdmEKaW5kZXggYWY4MmZlZS4uOTdkN2I0MiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbXBvcnRSZWZlcmVuY2UuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0zOCwxNSArMzgsMTYgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlpZiAod2l0aE9uRGVtYW5kICYmIG9uRGVtYW5kKSB7DQotCQlidWZmZXIuYXBwZW5kKCIuKiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIENvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlKSB7DQogCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOw0KKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YQppbmRleCBiNzk2YzEwLi41YzhkOGVlIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luaXRpYWxpemVyLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhCkBAIC03MiwxNyArNzIsMTkgQEAKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOw0KIAkJYnVmZmVyLmFwcGVuZChtb2RpZmllcnNTdHJpbmcobW9kaWZpZXJzKSk7DQotCQlidWZmZXIuYXBwZW5kKCJ7XG4iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJ7XG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmZmVyLmFwcGVuZChibG9jay50b1N0cmluZ1N0YXRlbWVudHModGFiKSk7DQogCQlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiAJfSBlbHNlIHsNCiAJCXJldHVybiBibG9jay50b1N0cmluZyh0YWIpOw0KIAl9DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIE1ldGhvZFNjb3BlIHNjb3BlKSB7DQorCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgew0KKwkJYmxvY2sudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOw0KKwl9DQogCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOw0KLQlibG9jay50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luc3RhbmNlT2ZFeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luc3RhbmNlT2ZFeHByZXNzaW9uLmphdmEKaW5kZXggZmJmMDE5Yi4uYmY1ZmRhMSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnN0YW5jZU9mRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5zdGFuY2VPZkV4cHJlc3Npb24uamF2YQpAQCAtMTk5LDcgKzE5OSw3IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKXsNCiAJLyogc2xvdyBjb2RlKi8NCiANCi0JcmV0dXJuCWV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiIGluc3RhbmNlb2YgIi8qbm9uTkxTKi8gKw0KKwlyZXR1cm4JZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgaW5zdGFuY2VvZiAiICsgLy8kTk9OLU5MUy0xJA0KIAkJCXR5cGUudG9TdHJpbmcoMCkgOyB9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xhYmVsZWRTdGF0ZW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhCmluZGV4IDQzNmRlZDkuLmI0ZTNjNWEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAJLyogc2xvdyBjb2RlICovDQogDQogCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7DQotCXMgKz0gbmV3IFN0cmluZyhsYWJlbCkgKyAiOiAiLypub25OTFMqLyArIHN0YXRlbWVudC50b1N0cmluZygwKTsNCisJcyArPSBuZXcgU3RyaW5nKGxhYmVsKSArICI6ICIgKyBzdGF0ZW1lbnQudG9TdHJpbmcoMCk7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YQppbmRleCA2NTZlYTJhLi4wODc4NmQyIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lc3NhZ2VTZW5kLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXNzYWdlU2VuZC5qYXZhCkBAIC0yMzksMTUgKzIzOSwxNSBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsNCiAJLypzbG93IGNvZGUqLw0KIAkNCi0JU3RyaW5nIHMgPSAiIi8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHJlY2VpdmVyICE9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KQ0KLQkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSsiLiIvKm5vbk5MUyovOw0KLQlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiLypub25OTFMqLyA7DQorCQlzID0gcyArIHJlY2VpdmVyLnRvU3RyaW5nRXhwcmVzc2lvbigpKyIuIjsgLy8kTk9OLU5MUy0xJA0KKwlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiIDsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoYXJndW1lbnRzICE9IG51bGwpDQogCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggOyBpICsrKQ0KIAkJewlzID0gcyArIGFyZ3VtZW50c1tpXS50b1N0cmluZ0V4cHJlc3Npb24oKTsNCi0JCQlpZiAoIGkgIT0gYXJndW1lbnRzLmxlbmd0aCAtMSApIHMgPSBzICsgIiAsICIvKm5vbk5MUyovIDt9OzsNCi0JcyA9cyArICIpIi8qbm9uTkxTKi8gOw0KKwkJCWlmICggaSAhPSBhcmd1bWVudHMubGVuZ3RoIC0xICkgcyA9IHMgKyAiICwgIiA7fTs7IC8vJE5PTi1OTFMtMSQNCisJcyA9cyArICIpIiA7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7fQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YQppbmRleCA0ZmExM2ViLi5kNmEyYmVlIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC03MCw4ICs3MCw4IEBACiAJLypzbG93IGNvZGUgKi8NCiANCiAJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkNCi0JCXJldHVybiAiIi8qbm9uTkxTKi87DQotCXJldHVybiByZXR1cm5UeXBlLnRvU3RyaW5nKHRhYikrIiAiLypub25OTFMqLzsNCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwlyZXR1cm4gcmV0dXJuVHlwZS50b1N0cmluZyh0YWIpKyIgIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsNCiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgY2xhc3NTY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvckV4cHJlc3Npb24uamF2YQppbmRleCAyYjY3NGY2Li42ZGM2OTc1IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKQEAgLTUzLDgwICs1Myw4MCBAQAogCWNsYXNzIERlY29kZSB7DQogCQlwdWJsaWMgIGZpbmFsIFN0cmluZyBjb25zdGFudChpbnQgY29kZSl7DQogCQkJc3dpdGNoKGNvZGUpeyANCi0JCQkJY2FzZSBUX2Jvb2xlYW4gCTogcmV0dXJuICJ0cnVlIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfYnl0ZQkJOiByZXR1cm4gIigoYnl0ZSkgMykiLypub25OTFMqLyA7DQotCQkJCWNhc2UgVF9jaGFyCQk6IHJldHVybiAiJ0EnIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfZG91YmxlCTogcmV0dXJuICIzMDAuMGQiLypub25OTFMqLyA7DQotCQkJCWNhc2UgVF9mbG9hdAk6IHJldHVybiAiMTAwLjBmIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfaW50CQk6IHJldHVybiAiMSIvKm5vbk5MUyovIDsNCi0JCQkJY2FzZSBUX2xvbmcJCTogcmV0dXJuICI3TCIvKm5vbk5MUyovIDsNCi0JCQkJY2FzZSBUX1N0cmluZwk6IHJldHVybiAiXCJoZWxsby13b3JsZFwiIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfbnVsbAkJOiByZXR1cm4gIm51bGwiLypub25OTFMqLzsNCi0JCQkJY2FzZSBUX3Nob3J0CTogcmV0dXJuICIoKHNob3J0KSA1KSIvKm5vbk5MUyovOw0KLQkJCQljYXNlIFRfT2JqZWN0CTogcmV0dXJuICJudWxsIi8qbm9uTkxTKi87fQ0KLQkJCXJldHVybiAiIi8qbm9uTkxTKi87fQ0KKwkJCQljYXNlIFRfYm9vbGVhbiAJOiByZXR1cm4gInRydWUiIDsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfYnl0ZQkJOiByZXR1cm4gIigoYnl0ZSkgMykiIDsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfY2hhcgkJOiByZXR1cm4gIidBJyIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9kb3VibGUJOiByZXR1cm4gIjMwMC4wZCIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9mbG9hdAk6IHJldHVybiAiMTAwLjBmIiA7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBUX2ludAkJOiByZXR1cm4gIjEiIDsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfbG9uZwkJOiByZXR1cm4gIjdMIiA7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBUX1N0cmluZwk6IHJldHVybiAiXCJoZWxsby13b3JsZFwiIiA7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBUX251bGwJCTogcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfc2hvcnQJOiByZXR1cm4gIigoc2hvcnQpIDUpIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfT2JqZWN0CTogcmV0dXJuICJudWxsIjt9IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7fSAvLyROT04tTkxTLTEkDQogDQogCQlwdWJsaWMgIGZpbmFsIFN0cmluZyB0eXBlKGludCBjb2RlKXsNCiAJCQlzd2l0Y2goY29kZSl7IA0KLQkJCQljYXNlIFRfYm9vbGVhbiAJOiByZXR1cm4gInoiLypub25OTFMqLyA7DQotCQkJCWNhc2UgVF9ieXRlCQk6IHJldHVybiAiYiIvKm5vbk5MUyovIDsNCi0JCQkJY2FzZSBUX2NoYXIJCTogcmV0dXJuICJjIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfZG91YmxlCTogcmV0dXJuICJkIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfZmxvYXQJOiByZXR1cm4gImYiLypub25OTFMqLyA7DQotCQkJCWNhc2UgVF9pbnQJCTogcmV0dXJuICJpIi8qbm9uTkxTKi8gOw0KLQkJCQljYXNlIFRfbG9uZwkJOiByZXR1cm4gImwiLypub25OTFMqLyA7DQotCQkJCWNhc2UgVF9TdHJpbmcJOiByZXR1cm4gInN0ciIvKm5vbk5MUyovIDsNCi0JCQkJY2FzZSBUX251bGwJCTogcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgVF9zaG9ydAk6IHJldHVybiAicyIvKm5vbk5MUyovOw0KLQkJCQljYXNlIFRfT2JqZWN0CTogcmV0dXJuICJvYmoiLypub25OTFMqLzt9DQotCQkJcmV0dXJuICJ4eHgiLypub25OTFMqLzt9DQorCQkJCWNhc2UgVF9ib29sZWFuIAk6IHJldHVybiAieiIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9ieXRlCQk6IHJldHVybiAiYiIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9jaGFyCQk6IHJldHVybiAiYyIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9kb3VibGUJOiByZXR1cm4gImQiIDsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfZmxvYXQJOiByZXR1cm4gImYiIDsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfaW50CQk6IHJldHVybiAiaSIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9sb25nCQk6IHJldHVybiAibCIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9TdHJpbmcJOiByZXR1cm4gInN0ciIgOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgVF9udWxsCQk6IHJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBUX3Nob3J0CTogcmV0dXJuICJzIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFRfT2JqZWN0CTogcmV0dXJuICJvYmoiO30gLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAieHh4Ijt9IC8vJE5PTi1OTFMtMSQNCiAJCQ0KIAkJcHVibGljICBmaW5hbCBTdHJpbmcgb3BlcmF0b3IoaW50IG9wZXJhdG9yKXsNCiAJCQkJc3dpdGNoIChvcGVyYXRvcikgew0KLQkJCQljYXNlIEVRVUFMX0VRVUFMIDoJcmV0dXJuICI9PSIvKm5vbk5MUyovOw0KLQkJCQljYXNlIExFU1NfRVFVQUwgOglyZXR1cm4gIjw9Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgR1JFQVRFUl9FUVVBTCA6cmV0dXJuICI+PSIvKm5vbk5MUyovOw0KLQkJCQljYXNlIExFRlRfU0hJRlQgOglyZXR1cm4gIjw8Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgUklHSFRfU0hJRlQgOglyZXR1cm4gIj4+Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQgOglyZXR1cm4gIj4+PiIvKm5vbk5MUyovOw0KLQkJCQljYXNlIE9SX09SIDpyZXR1cm4gInx8Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgQU5EX0FORCA6CQlyZXR1cm4gIiYmIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgUExVUyA6CQkJcmV0dXJuICIrIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgTUlOVVMgOgkJcmV0dXJuICItIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgTk9UIDoJCQlyZXR1cm4gIiEiLypub25OTFMqLzsNCi0JCQkJY2FzZSBSRU1BSU5ERVIgOglyZXR1cm4gIiUiLypub25OTFMqLzsNCi0JCQkJY2FzZSBYT1IgOgkJCXJldHVybiAiXiIvKm5vbk5MUyovOw0KLQkJCQljYXNlIEFORCA6CQkJcmV0dXJuICImIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgTVVMVElQTFkgOgkJcmV0dXJuICIqIi8qbm9uTkxTKi87DQotCQkJCWNhc2UgT1IgOgkJCXJldHVybiAifCIvKm5vbk5MUyovOw0KLQkJCQljYXNlIFRXSURETEUgOgkJcmV0dXJuICJ+Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgRElWSURFIDoJCXJldHVybiAiLyIvKm5vbk5MUyovOw0KLQkJCQljYXNlIEdSRUFURVIgOgkJcmV0dXJuICI+Ii8qbm9uTkxTKi87DQotCQkJCWNhc2UgTEVTUyA6CQkJcmV0dXJuICI8Ii8qbm9uTkxTKi87CX07DQotCQkJcmV0dXJuICI/Pz8/Ii8qbm9uTkxTKi87fQ0KKwkJCQljYXNlIEVRVUFMX0VRVUFMIDoJcmV0dXJuICI9PSI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBMRVNTX0VRVUFMIDoJcmV0dXJuICI8PSI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBHUkVBVEVSX0VRVUFMIDpyZXR1cm4gIj49IjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIExFRlRfU0hJRlQgOglyZXR1cm4gIjw8IjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFJJR0hUX1NISUZUIDoJcmV0dXJuICI+PiI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVCA6CXJldHVybiAiPj4+IjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIE9SX09SIDpyZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIEFORF9BTkQgOgkJcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBQTFVTIDoJCQlyZXR1cm4gIisiOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgTUlOVVMgOgkJcmV0dXJuICItIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIE5PVCA6CQkJcmV0dXJuICIhIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIFJFTUFJTkRFUiA6CXJldHVybiAiJSI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBYT1IgOgkJCXJldHVybiAiXiI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBBTkQgOgkJCXJldHVybiAiJiI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBNVUxUSVBMWSA6CQlyZXR1cm4gIioiOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgT1IgOgkJCXJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBUV0lERExFIDoJCXJldHVybiAifiI7IC8vJE5PTi1OTFMtMSQNCisJCQkJY2FzZSBESVZJREUgOgkJcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIEdSRUFURVIgOgkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJA0KKwkJCQljYXNlIExFU1MgOgkJCXJldHVybiAiPCI7CX07IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIj8/Pz8iO30gLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCQkNCiAJRGVjb2RlIGRlY29kZSA9IG5ldyBEZWNvZGUoKTsNCiAJU3RyaW5nIHMgOw0KLQlzID0gIlx0cHVibGljIHN0YXRpYyB2b2lkIGJpbmFyeU9wZXJhdGlvblRhYmxlc1Rlc3RDYXNlKCl7XG4iLypub25OTFMqLyArDQorCXMgPSAiXHRwdWJsaWMgc3RhdGljIHZvaWQgYmluYXJ5T3BlcmF0aW9uVGFibGVzVGVzdENhc2UoKXtcbiIgKyAvLyROT04tTkxTLTEkDQogDQotCQkiXHRcdC8vVEMgdGVzdCA6IGFsbCBiaW5hcnkgb3BlcmF0aW9uIChkZXNjcmliZWQgaW4gdGFibGVzKVxuIi8qbm9uTkxTKi8rDQotCQkiXHRcdC8vbWV0aG9kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5XG4iLypub25OTFMqLysNCi0JCSJcdFx0Ly9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9yRXhwcmVzc2lvbi5nZW5lcmF0ZVRhYmxlVGVzdENhc2UoKTtcbiIvKm5vbk5MUyovKw0KKwkJIlx0XHQvL1RDIHRlc3QgOiBhbGwgYmluYXJ5IG9wZXJhdGlvbiAoZGVzY3JpYmVkIGluIHRhYmxlcylcbiIrIC8vJE5PTi1OTFMtMSQNCisJCSJcdFx0Ly9tZXRob2QgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnlcbiIrIC8vJE5PTi1OTFMtMSQNCisJCSJcdFx0Ly9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9yRXhwcmVzc2lvbi5nZW5lcmF0ZVRhYmxlVGVzdENhc2UoKTtcbiIrIC8vJE5PTi1OTFMtMSQNCiAJDQotCQkiXHRcdFN0cmluZyBzdHIwIDtcdCBTdHJpbmcgc3RyXHQ9ICIvKm5vbk5MUyovK2RlY29kZS5jb25zdGFudChUX1N0cmluZykrIjtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRpbnQgaTAgO1x0IGludCBpXHQ9ICIvKm5vbk5MUyovK2RlY29kZS5jb25zdGFudChUX2ludCkrIiA7XG4iLypub25OTFMqLysNCi0JCSJcdFx0Ym9vbGVhbiB6MDtcdCBib29sZWFuIHpcdD0gIi8qbm9uTkxTKi8rZGVjb2RlLmNvbnN0YW50KFRfYm9vbGVhbikrIjtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRjaGFyIGMwOyBcdCBjaGFyICBjXHQ9ICIvKm5vbk5MUyovK2RlY29kZS5jb25zdGFudChUX2NoYXIpKyIgO1xuIi8qbm9uTkxTKi8rDQotCQkiXHRcdGZsb2F0IGYwOyBcdCBmbG9hdCBmXHQ9ICIvKm5vbk5MUyovK2RlY29kZS5jb25zdGFudChUX2Zsb2F0KSsiIDtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRkb3VibGUgZDA7XHQgZG91YmxlIGRcdD0gIi8qbm9uTkxTKi8rZGVjb2RlLmNvbnN0YW50KFRfZG91YmxlKSsiIDtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRieXRlIGIwOyBcdCBieXRlIGJcdD0gIi8qbm9uTkxTKi8rZGVjb2RlLmNvbnN0YW50KFRfYnl0ZSkrIjtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRzaG9ydCBzMDsgXHQgc2hvcnQgc1x0PSAiLypub25OTFMqLytkZWNvZGUuY29uc3RhbnQoVF9zaG9ydCkrIjtcbiIvKm5vbk5MUyovKw0KLQkJIlx0XHRsb25nIGwwOyBcdCBsb25nIGxcdD0gIi8qbm9uTkxTKi8rZGVjb2RlLmNvbnN0YW50KFRfbG9uZykrIiA7XG4iLypub25OTFMqLysNCi0JCSJcdFx0T2JqZWN0IG9iajA7IFx0IE9iamVjdCBvYmpcdD0gIi8qbm9uTkxTKi8rZGVjb2RlLmNvbnN0YW50KFRfT2JqZWN0KSsiIDtcbiIvKm5vbk5MUyovKw0KKwkJIlx0XHRTdHJpbmcgc3RyMCA7XHQgU3RyaW5nIHN0clx0PSAiK2RlY29kZS5jb25zdGFudChUX1N0cmluZykrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJIlx0XHRpbnQgaTAgO1x0IGludCBpXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfaW50KSsiIDtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJIlx0XHRib29sZWFuIHowO1x0IGJvb2xlYW4gelx0PSAiK2RlY29kZS5jb25zdGFudChUX2Jvb2xlYW4pKyI7XG4iKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCSJcdFx0Y2hhciBjMDsgXHQgY2hhciAgY1x0PSAiK2RlY29kZS5jb25zdGFudChUX2NoYXIpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkiXHRcdGZsb2F0IGYwOyBcdCBmbG9hdCBmXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfZmxvYXQpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkiXHRcdGRvdWJsZSBkMDtcdCBkb3VibGUgZFx0PSAiK2RlY29kZS5jb25zdGFudChUX2RvdWJsZSkrIiA7XG4iKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCSJcdFx0Ynl0ZSBiMDsgXHQgYnl0ZSBiXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfYnl0ZSkrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJIlx0XHRzaG9ydCBzMDsgXHQgc2hvcnQgc1x0PSAiK2RlY29kZS5jb25zdGFudChUX3Nob3J0KSsiO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkiXHRcdGxvbmcgbDA7IFx0IGxvbmcgbFx0PSAiK2RlY29kZS5jb25zdGFudChUX2xvbmcpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkiXHRcdE9iamVjdCBvYmowOyBcdCBPYmplY3Qgb2JqXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfT2JqZWN0KSsiIDtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIA0KLQkJIlxuIi8qbm9uTkxTKi87DQorCQkiXG4iOyAvLyROT04tTkxTLTEkDQogDQogCWludCBlcnJvciA9IDA7CQkNCiAJZm9yIChpbnQgaT0wOyBpIDwgb3BlcmF0b3JzLmxlbmd0aCA7IGkrKykNCkBAIC0xNDIsMTkgKzE0MiwxOSBAQAogCQkJCS8vCWlmICggejAgIT0gKCgoc2hvcnQpIDUpID49ICgoc2hvcnQpIDUpKSkNCiAJCQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigxNTUpOw0KIA0KLQkJCXsJcyArPSAiXHRcdCIvKm5vbk5MUyovK2RlY29kZS50eXBlKHJlc3VsdCkrIjAiLypub25OTFMqLysiID0gIi8qbm9uTkxTKi8rZGVjb2RlLnR5cGUobGVmdCk7DQotCQkJCXMgKz0gIiAiLypub25OTFMqLytkZWNvZGUub3BlcmF0b3Iob3BlcmF0b3IpKyIgIi8qbm9uTkxTKi8rZGVjb2RlLnR5cGUocmlnaHQpKyI7XG4iLypub25OTFMqLzsNCi0JCQkJU3RyaW5nIGJlZ2luID0gcmVzdWx0ID09IFRfU3RyaW5nID8gIlx0XHRpZiAoISAiLypub25OTFMqLyA6ICJcdFx0aWYgKCAiLypub25OTFMqLzsNCi0JCQkJU3RyaW5nIHRlc3QgPSByZXN1bHQgPT0gVF9TdHJpbmcgPyAiLmVxdWFscygiLypub25OTFMqLyA6ICIgIT0gKCIvKm5vbk5MUyovIDsNCi0JCQkJcyArPSBiZWdpbgkrZGVjb2RlLnR5cGUocmVzdWx0KSsiMCIvKm5vbk5MUyovK3Rlc3QNCi0JCQkJCQkJK2RlY29kZS5jb25zdGFudChsZWZ0KSsiICIvKm5vbk5MUyovDQotCQkJCQkJCStkZWNvZGUub3BlcmF0b3Iob3BlcmF0b3IpKyIgIi8qbm9uTkxTKi8NCi0JCQkJCQkJK2RlY29kZS5jb25zdGFudChyaWdodCkrIikpXG4iLypub25OTFMqLzsNCi0JCQkJcyArPSAiXHRcdFx0U3lzdGVtLm91dC5wcmludGxuKCIvKm5vbk5MUyovKyAoKytlcnJvcikgKyIpO1xuIi8qbm9uTkxTKi87DQorCQkJewlzICs9ICJcdFx0IitkZWNvZGUudHlwZShyZXN1bHQpKyIwIisiID0gIitkZWNvZGUudHlwZShsZWZ0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQNCisJCQkJcyArPSAiICIrZGVjb2RlLm9wZXJhdG9yKG9wZXJhdG9yKSsiICIrZGVjb2RlLnR5cGUocmlnaHQpKyI7XG4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJA0KKwkJCQlTdHJpbmcgYmVnaW4gPSByZXN1bHQgPT0gVF9TdHJpbmcgPyAiXHRcdGlmICghICIgOiAiXHRcdGlmICggIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCQkJCVN0cmluZyB0ZXN0ID0gcmVzdWx0ID09IFRfU3RyaW5nID8gIi5lcXVhbHMoIiA6ICIgIT0gKCIgOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJCQkJcyArPSBiZWdpbgkrZGVjb2RlLnR5cGUocmVzdWx0KSsiMCIrdGVzdCAvLyROT04tTkxTLTEkDQorCQkJCQkJCStkZWNvZGUuY29uc3RhbnQobGVmdCkrIiAiIC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJK2RlY29kZS5vcGVyYXRvcihvcGVyYXRvcikrIiAiIC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJK2RlY29kZS5jb25zdGFudChyaWdodCkrIikpXG4iOyAvLyROT04tTkxTLTEkDQorCQkJCXMgKz0gIlx0XHRcdFN5c3RlbS5vdXQucHJpbnRsbigiKyAoKytlcnJvcikgKyIpO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCQkJCQkNCiAJCQkJfX19DQogCQkNCi0JcmV0dXJuIHMgKz0gIlxuXHRcdFN5c3RlbS5vdXQucHJpbnRsbihcImJpbmFyeSB0YWJsZXMgdGVzdCA6IGRvbmVcIik7fSIvKm5vbk5MUyovIDsNCisJcmV0dXJuIHMgKz0gIlxuXHRcdFN5c3RlbS5vdXQucHJpbnRsbihcImJpbmFyeSB0YWJsZXMgdGVzdCA6IGRvbmVcIik7fSIgOyAvLyROT04tTkxTLTEkDQogCQl9DQogcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfQU5EKCl7DQogDQpAQCAtMTUzOSw2MCArMTUzOSw2MCBAQAogcHVibGljIFN0cmluZyBvcGVyYXRvclRvU3RyaW5nKCkgew0KIAlzd2l0Y2ggKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSB7DQogCQljYXNlIEVRVUFMX0VRVUFMIDoNCi0JCQlyZXR1cm4gIj09Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI9PSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgTEVTU19FUVVBTCA6DQotCQkJcmV0dXJuICI8PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPD0iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIEdSRUFURVJfRVFVQUwgOg0KLQkJCXJldHVybiAiPj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj49IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBOT1RfRVFVQUwgOg0KLQkJCXJldHVybiAiIT0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiE9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBMRUZUX1NISUZUIDoNCi0JCQlyZXR1cm4gIjw8Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI8PCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgUklHSFRfU0hJRlQgOg0KLQkJCXJldHVybiAiPj4iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj4+IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVCA6DQotCQkJcmV0dXJuICI+Pj4iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj4+PiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgT1JfT1IgOg0KLQkJCXJldHVybiAifHwiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBBTkRfQU5EIDoNCi0JCQlyZXR1cm4gIiYmIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgUExVUyA6DQotCQkJcmV0dXJuICIrIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIrIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBNSU5VUyA6DQotCQkJcmV0dXJuICItIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICItIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBOT1QgOg0KLQkJCXJldHVybiAiISIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiISI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgUkVNQUlOREVSIDoNCi0JCQlyZXR1cm4gIiUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiUiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFhPUiA6DQotCQkJcmV0dXJuICJeIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJeIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBBTkQgOg0KLQkJCXJldHVybiAiJiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiJiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgTVVMVElQTFkgOg0KLQkJCXJldHVybiAiKiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgT1IgOg0KLQkJCXJldHVybiAifCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVFdJRERMRSA6DQotCQkJcmV0dXJuICJ+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ+IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBESVZJREUgOg0KLQkJCXJldHVybiAiLyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgR1JFQVRFUiA6DQotCQkJcmV0dXJuICI+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBMRVNTIDoNCi0JCQlyZXR1cm4gIjwiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIjwiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFFVRVNUSU9OQ09MT04gOg0KLQkJCXJldHVybiAiPzoiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj86IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBFUVVBTCA6DQotCQkJcmV0dXJuICI9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI9IjsgLy8kTk9OLU5MUy0xJA0KIAl9Ow0KLQlyZXR1cm4gInVua25vd24gb3BlcmF0b3IiLypub25OTFMqLzsNCisJcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpew0KIAkvKiBzbG93IGNvZGUqLw0KIA0KIAkvL3N1YmNsYXNzIHJlZGVmaW5lIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKQ0KIAkNCi0JcmV0dXJuCSIoIi8qbm9uTkxTKi8gKyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgKyAiKSIvKm5vbk5MUyovOyANCisJcmV0dXJuCSIoIiArIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSArICIpIjsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiANCiBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKaW5kZXggMDA4YzcxMi4uNzVkYzEyMiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUG9zdGZpeEV4cHJlc3Npb24uamF2YQpAQCAtMzksMTcgKzM5LDE3IEBACiBwdWJsaWMgU3RyaW5nIG9wZXJhdG9yVG9TdHJpbmcoKSB7DQogCXN3aXRjaCAob3BlcmF0b3IpIHsNCiAJCWNhc2UgUExVUyA6DQotCQkJcmV0dXJuICIrKyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiKysiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIE1JTlVTIDoNCi0JCQlyZXR1cm4gIi0tIi8qbm9uTkxTKi87fQ0KLQlyZXR1cm4gInVua25vd24gb3BlcmF0b3IiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIi0tIjt9IC8vJE5PTi1OTFMtMSQNCisJcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgYm9vbGVhbiByZXN0cmFpblVzYWdlVG9OdW1lcmljVHlwZXMoKXsNCiAJcmV0dXJuIHRydWUgO30NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKXsNCiAJLyogc2xvdyBjb2RlKi8NCiANCi0JcmV0dXJuCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIi8qbm9uTkxTKi8gKyBvcGVyYXRvclRvU3RyaW5nKCk7IH0NCisJcmV0dXJuCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIiArIG9wZXJhdG9yVG9TdHJpbmcoKTsgfSAvLyROT04tTkxTLTEkDQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsNCiAJCWxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1ByZWZpeEV4cHJlc3Npb24uamF2YQppbmRleCA3OTEyNDg3Li5kZjE4YTQ3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1ByZWZpeEV4cHJlc3Npb24uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1ByZWZpeEV4cHJlc3Npb24uamF2YQpAQCAtMjMsMTcgKzIzLDE3IEBACiBwdWJsaWMgU3RyaW5nIG9wZXJhdG9yVG9TdHJpbmcoKSB7DQogCXN3aXRjaCAob3BlcmF0b3IpIHsNCiAJCWNhc2UgUExVUyA6DQotCQkJcmV0dXJuICIrKyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiKysiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIE1JTlVTIDoNCi0JCQlyZXR1cm4gIi0tIi8qbm9uTkxTKi87fQ0KLQlyZXR1cm4gInVua25vd24gb3BlcmF0b3IiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIi0tIjt9IC8vJE5PTi1OTFMtMSQNCisJcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgYm9vbGVhbiByZXN0cmFpblVzYWdlVG9OdW1lcmljVHlwZXMoKXsNCiAJcmV0dXJuIHRydWUgO30NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKXsNCiAJLyogc2xvdyBjb2RlICovDQogCQ0KLQlyZXR1cm4gb3BlcmF0b3JUb1N0cmluZygpICsgIiAiLypub25OTFMqLyArIGxocy50b1N0cmluZ0V4cHJlc3Npb24oKSA7DQorCXJldHVybiBvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyBsaHMudG9TdHJpbmdFeHByZXNzaW9uKCkgOyAvLyROT04tTkxTLTEkDQogDQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggZmM3ZDkyMi4uZjc5OTI1NiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMjM4LDkgKzIzOCw5IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7DQogCS8qc2xvdyBjb2RlICovDQogDQotCVN0cmluZyBzID0gIiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkDQogCWlmIChlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKQ0KLQkJcyArPSBlbmNsb3NpbmdJbnN0YW5jZS50b1N0cmluZygpICsgIi4iLypub25OTFMqLzsNCisJCXMgKz0gZW5jbG9zaW5nSW5zdGFuY2UudG9TdHJpbmcoKSArICIuIjsgLy8kTk9OLU5MUy0xJA0KIAlzICs9IHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpOw0KIAlpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7DQogCQlzICs9IGFub255bW91c1R5cGUudG9TdHJpbmcodGFiKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDkxMTQ2NjIuLjBhNGYzYTkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC01OTcsNyArNTk3LDcgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhCmluZGV4IDdiNDAxMTUuLmM5NTUzOWUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7DQogCS8qIHNsb3cgY29kZSAqLw0KIAkNCi0JcmV0dXJuIHF1YWxpZmljYXRpb24udG9TdHJpbmcoMCkrIi5zdXBlciIvKm5vbk5MUyovIDsNCisJcmV0dXJuIHF1YWxpZmljYXRpb24udG9TdHJpbmcoMCkrIi5zdXBlciIgOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVGhpc1JlZmVyZW5jZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggNDU5ODdkMS4uZjA2ZTQwZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsNCiAJLyogc2xvdyBjb2RlICovDQogCQ0KLQlyZXR1cm4gcXVhbGlmaWNhdGlvbi50b1N0cmluZygwKSsiLnRoaXMiLypub25OTFMqLyA7DQorCXJldHVybiBxdWFsaWZpY2F0aW9uLnRvU3RyaW5nKDApKyIudGhpcyIgOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggY2IyY2NjYS4uYzcwMDZlNSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTQxLDcgKzQxLDcgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgew0KIAkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOw0KIAkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZWZlcmVuY2UuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEKaW5kZXggMDRhMzM2Zi4uMWJiYzBkMyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZWZlcmVuY2UuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JlZmVyZW5jZS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAJc3VwZXIoKTsNCiB9DQogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiBpc0NvbXBvdW5kKSB7DQotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QudmFyaWFibGVTaG91bGRQcm92aWRlIi8qbm9uTkxTKi8pKTsNCisJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC52YXJpYWJsZVNob3VsZFByb3ZpZGUiKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsNCiAJcmV0dXJuIGZsb3dJbmZvOw0KQEAgLTYxLDEzICs2MSwxMyBAQAogCX0NCiB9DQogcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7DQotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QuY29tcG91bmRQcmVTaG91bGRQcm92aWRlIi8qbm9uTkxTKi8pKTsNCisJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC5jb21wb3VuZFByZVNob3VsZFByb3ZpZGUiKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsNCi0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC5jb21wb3VuZFZhcmlhYmxlU2hvdWxkUHJvdmlkZSIvKm5vbk5MUyovKSk7DQorCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QuY29tcG91bmRWYXJpYWJsZVNob3VsZFByb3ZpZGUiKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIENvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsNCi0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC5wb3N0SW5jclNob3VsZFByb3ZpZGUiLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0LnBvc3RJbmNyU2hvdWxkUHJvdmlkZSIpKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkUmVmZXJlbmNlKCkgew0KIA0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmV0dXJuU3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JldHVyblN0YXRlbWVudC5qYXZhCmluZGV4IGU3NmRkYzguLjA0MWIzYTAgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmV0dXJuU3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMjI1LDcgKzIyNSw3IEBACiAJLyogc2xvdyBjb2RlICovDQogDQogCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYikgOw0KLQlzID0gcyArICJyZXR1cm4gIi8qbm9uTkxTKi87DQorCXMgPSBzICsgInJldHVybiAiOyAvLyROT04tTkxTLTEkDQogCWlmIChleHByZXNzaW9uICE9IG51bGwgKQ0KIAkJcyA9IHMgKyBleHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpIDsNCiAJcmV0dXJuIHM7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RhdGVtZW50LmphdmEKaW5kZXggNTA2MDA2My4uMDhmNTQwYyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0YXRlbWVudC5qYXZhCkBAIC0zMyw2ICszMyw5IEBACiANCiAJLy8gZm9yIHN0YXRlbWVudHMgb25seQ0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc1JlYWNoYWJsZU1BU0sgPSAweDgwMDAwMDAwOyAvLyBoaWdoZXN0IGJpdA0KKwkNCisJLy8gZm9yIHR5cGUgZGVjbGFyYXRpb24gb25seQ0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBZGRBc3NlcnRpb25NQVNLID0gMTsgLy8gaGlnaGVzdCBiaXQNCiANCiAJLyoNCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE9IDB4MTsgLy8gZGVjaW1hbCAxDQpAQCAtNzgsNyArODEsNyBAQAogCXJldHVybiBmbG93SW5mbzsNCiB9DQogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pew0KLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0Lm1pc3NpbmdTdGF0ZW1lbnQiLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0Lm1pc3NpbmdTdGF0ZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIGJvb2xlYW4gaXNFbXB0eUJsb2NrKCl7DQogCXJldHVybiBmYWxzZTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbC5qYXZhCmluZGV4IDRmNGIyNTcuLmZiMzAwMmQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbC5qYXZhCkBAIC01NywzOCArNTcsMzggQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgew0KIA0KIAkvLyBoYW5kbGUgc29tZSBzcGVjaWFsIGNoYXIuLi4uLg0KLQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiXCIiLypub25OTFMqLyk7DQorCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJcIiIpOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7DQogCQlzd2l0Y2ggKHNvdXJjZVtpXSkgew0KIAkJCWNhc2UgJ1xiJyA6DQotCQkJCXJlc3VsdC5hcHBlbmQoIlxcYiIvKm5vbk5MUyovKTsNCisJCQkJcmVzdWx0LmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYnJlYWs7DQogCQkJY2FzZSAnXHQnIDoNCi0JCQkJcmVzdWx0LmFwcGVuZCgiXFx0Ii8qbm9uTkxTKi8pOw0KKwkJCQlyZXN1bHQuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlicmVhazsNCiAJCQljYXNlICdcbicgOg0KLQkJCQlyZXN1bHQuYXBwZW5kKCJcXG4iLypub25OTFMqLyk7DQorCQkJCXJlc3VsdC5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJCWJyZWFrOw0KIAkJCWNhc2UgJ1xmJyA6DQotCQkJCXJlc3VsdC5hcHBlbmQoIlxcZiIvKm5vbk5MUyovKTsNCisJCQkJcmVzdWx0LmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYnJlYWs7DQogCQkJY2FzZSAnXHInIDoNCi0JCQkJcmVzdWx0LmFwcGVuZCgiXFxyIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXN1bHQuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlicmVhazsNCiAJCQljYXNlICdcIicgOg0KLQkJCQlyZXN1bHQuYXBwZW5kKCJcXFwiIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXN1bHQuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYnJlYWs7DQogCQkJY2FzZSAnXCcnIDoNCi0JCQkJcmVzdWx0LmFwcGVuZCgiXFwnIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXN1bHQuYXBwZW5kKCJcXCciKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlicmVhazsNCiAJCQljYXNlICdcXCcgOiAvL3Rha2UgY2FyZSBub3QgdG8gZGlzcGxheSB0aGUgZXNjYXBlIGFzIGEgcG90ZW50aWFsIHJlYWwgY2hhcg0KLQkJCQlyZXN1bHQuYXBwZW5kKCJcXFxcIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXN1bHQuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYnJlYWs7DQogCQkJZGVmYXVsdCA6DQogCQkJCXJlc3VsdC5hcHBlbmQoc291cmNlW2ldKTsNCiAJCX0NCiAJfQ0KLQlyZXN1bHQuYXBwZW5kKCJcIiIvKm5vbk5MUyovKTsNCisJcmVzdWx0LmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEKaW5kZXggODNlNTVmZS4uODhmMGNlZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdXBlclJlZmVyZW5jZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtNDYsNyArNDYsNyBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7DQogDQotCXJldHVybiAic3VwZXIiLypub25OTFMqLzsNCisJcmV0dXJuICJzdXBlciI7IC8vJE5PTi1OTFMtMSQNCiAJDQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3dpdGNoU3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N3aXRjaFN0YXRlbWVudC5qYXZhCmluZGV4IDYxYzA3NzYuLjkwNDM1N2IgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3dpdGNoU3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Td2l0Y2hTdGF0ZW1lbnQuamF2YQpAQCAtMTkzLDcgKzE5Myw2IEBACiAJCQlpZiAoKGNzdCA9IHN0YXRlbWVudHNbaV0ucmVzb2x2ZUNhc2Uoc2NvcGUsIHRlc3RUeXBlLCB0aGlzKSkgIT0gbnVsbCkgew0KIAkJCQkvLy0tLS1jaGVjayBmb3IgZHVwbGljYXRlIGNhc2Ugc3RhdGVtZW50LS0tLS0tLS0tLS0tDQogCQkJCWlmIChjc3QgIT0gTm90QUNvbnN0YW50KSB7DQotCQkJCQkvLyBhIGNhc2Ugd2l0aCBhIHdlbGxlZCB0eXBlZCBjb25zdGFudCwgc28gaW50VmFsdWUoKSBpcyB2YWxpZA0KIAkJCQkJaW50IGtleSA9IGNzdC5pbnRWYWx1ZSgpOw0KIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudGVyOyBqKyspIHsNCiAJCQkJCQlpZiAoY2FzZXNWYWx1ZXNbal0gPT0ga2V5KSB7DQpAQCAtMjExLDQxICsyMTAsNDEgQEAKIAkNCiAJU3RyaW5nIGluRnJvbnQgLCBzID0gdGFiU3RyaW5nKHRhYikgOw0KIAlpbkZyb250ID0gcyA7DQotCXMgPSBzICsgInN3aXRjaCAoIi8qbm9uTkxTKi8gKyB0ZXN0RXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIpICIvKm5vbk5MUyovOw0KKwlzID0gcyArICJzd2l0Y2ggKCIgKyB0ZXN0RXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIpICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAlpZiAoc3RhdGVtZW50cyA9PSBudWxsKQ0KLQl7IAlzID0gcyArICJ7fSIvKm5vbk5MUyovIDsgDQorCXsgCXMgPSBzICsgInt9IiA7ICAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gczt9DQogCWVsc2UNCi0JCXMgPSBzICsgInsiLypub25OTFMqLzsNCisJCXMgPSBzICsgInsiOyAvLyROT04tTkxTLTEkDQogDQogCXMgPSBzICsgKGV4cGxpY2l0RGVjbGFyYXRpb25zICE9IDANCi0JCQkJPyAiLy8gLS0tc2NvcGUgbmVlZGVkIGZvciAiLypub25OTFMqLytTdHJpbmcudmFsdWVPZihleHBsaWNpdERlY2xhcmF0aW9ucykgKyIgbG9jYWxzLS0tLS0tLS0tLS0tIFxuIi8qbm9uTkxTKi8NCi0JCQkJOiAiLy8gLS0tTk8gc2NvcGUgbmVlZGVkLS0tLS0tIFxuIi8qbm9uTkxTKi8pIDsNCisJCQkJPyAiLy8gLS0tc2NvcGUgbmVlZGVkIGZvciAiK1N0cmluZy52YWx1ZU9mKGV4cGxpY2l0RGVjbGFyYXRpb25zKSArIiBsb2NhbHMtLS0tLS0tLS0tLS0gXG4iIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KKwkJCQk6ICIvLyAtLS1OTyBzY29wZSBuZWVkZWQtLS0tLS0gXG4iKSA7IC8vJE5PTi1OTFMtMSQNCiAJCQ0KIAlpbnQgaSA9IDA7DQotCVN0cmluZyB0YWJ1bGF0aW9uID0gIiAgIi8qbm9uTkxTKi87DQorCVN0cmluZyB0YWJ1bGF0aW9uID0gIiAgIjsgLy8kTk9OLU5MUy0xJA0KIAl0cnkJe3doaWxlKHRydWUpew0KIAkJLy91c2UgaW5zdGFuY2VvZiBpbiBvcmRlciBub3QgdG8gcG9sbHVhdGUgY2xhc3NlcyB3aXRoIGJlaGF2aW9yIG9ubHkgbmVlZGVkIGZvciBwcmludGluZyBwdXJwb3NlLg0KIAkJaWYgKCBzdGF0ZW1lbnRzW2ldICBpbnN0YW5jZW9mIEV4cHJlc3Npb24pDQotCQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIGluRnJvbnQgKyB0YWJ1bGF0aW9uOw0KKwkJCXMgPSBzICsgIlxuIiArIGluRnJvbnQgKyB0YWJ1bGF0aW9uOyAvLyROT04tTkxTLTEkDQogCQlpZiAoIHN0YXRlbWVudHNbaV0gIGluc3RhbmNlb2YgQnJlYWspDQogCQkJcyA9IHMgKyBzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKDApIDsNCiAJCWVsc2UJDQotCQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiKzIpIDsNCisJCQlzID0gcyArICJcbiIgKyBzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKHRhYisyKSA7IC8vJE5PTi1OTFMtMSQNCiAJCS8vPT09PT09PT09PT09PQkNCiAJCWlmICggKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBDYXNlKSB8fCAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIERlZmF1bHRDYXNlKSkNCiAJCXsJaSsrOw0KIAkJCXdoaWxlKCEgKChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgQ2FzZSkgfHwgKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBEZWZhdWx0Q2FzZSkpKQ0KIAkJCXsJaWYgKCAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHx8IChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgQnJlYWspKQ0KLQkJCQkJcyA9IHMgKyAgc3RhdGVtZW50c1tpXS50b1N0cmluZygwKSArIiA7ICIvKm5vbk5MUyovOw0KKwkJCQkJcyA9IHMgKyAgc3RhdGVtZW50c1tpXS50b1N0cmluZygwKSArIiA7ICI7IC8vJE5PTi1OTFMtMSQNCiAJCQkJZWxzZQ0KLQkJCQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiKzYpICsgIiA7ICIvKm5vbk5MUyovOw0KKwkJCQkJcyA9IHMgKyAiXG4iICsgc3RhdGVtZW50c1tpXS50b1N0cmluZyh0YWIrNikgKyAiIDsgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCWkrKzt9fQ0KIAkJZWxzZQ0KLQkJewlzID0gcyArICIgOyIvKm5vbk5MUyovIDsNCisJCXsJcyA9IHMgKyAiIDsiIDsgLy8kTk9OLU5MUy0xJA0KIAkJCWkrKzt9fX0NCiAJY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXt9Ow0KLQlzID0gcyArICJ9Ii8qbm9uTkxTKi87DQorCXMgPSBzICsgIn0iOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsNCiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YQppbmRleCBkYzdjYmU5Li4zN2QyYWI3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIA0KIAlib29sZWFuIGJsb2NrRXhpdDsNCiAJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIHN5bmNocm9WYXJpYWJsZTsNCi0Jc3RhdGljIGZpbmFsIGNoYXJbXSBTZWNyZXRMb2NhbERlY2xhcmF0aW9uTmFtZSA9ICIgc3luY1ZhbHVlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCisJc3RhdGljIGZpbmFsIGNoYXJbXSBTZWNyZXRMb2NhbERlY2xhcmF0aW9uTmFtZSA9ICIgc3luY1ZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogDQogcHVibGljIFN5bmNocm9uaXplZFN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24gLCBCbG9jayBzdGF0ZW1lbnQsIGludCBzLCBpbnQgZSkgew0KIAl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOw0KQEAgLTczLDcgKzczLDYgQEAKIAkJLy8gZ2VuZXJhdGUgIHRoZSBib2R5IG9mIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2sNCiAJCUV4Y2VwdGlvbkxhYmVsIGFueUV4Y2VwdGlvbkhhbmRsZXIgPSBuZXcgRXhjZXB0aW9uTGFiZWwoY29kZVN0cmVhbSwgbnVsbCk7IC8vJ251bGwnIGRlbm90ZXMgYW55IGtpbmQgb2YgZXhjZXB0aW9uDQogCQlibG9jay5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOw0KLQkJYW55RXhjZXB0aW9uSGFuZGxlci5wbGFjZUVuZCgpOw0KIAkJTGFiZWwgZW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7DQogCQlpZiAoIWJsb2NrRXhpdCkgew0KIAkJCWNvZGVTdHJlYW0ubG9hZChzeW5jaHJvVmFyaWFibGUpOw0KQEAgLTgxLDYgKzgwLDcgQEAKIAkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwpOw0KIAkJfQ0KIAkJLy8gZ2VuZXJhdGUgdGhlIGJvZHkgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyDQorCQlhbnlFeGNlcHRpb25IYW5kbGVyLnBsYWNlRW5kKCk7DQogCQlhbnlFeGNlcHRpb25IYW5kbGVyLnBsYWNlKCk7DQogCQljb2RlU3RyZWFtLmluY3JTdGFja1NpemUoMSk7DQogCQljb2RlU3RyZWFtLmxvYWQoc3luY2hyb1ZhcmlhYmxlKTsNCkBAIC0xMjgsOCArMTI4LDggQEAKIAkvKiBzbG93IGNvZGUgKi8NCiANCiAJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKSA7DQotCXMgPSBzICsgInN5bmNocm9uaXplZCAoIi8qbm9uTkxTKi8gKyBleHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIikiLypub25OTFMqLzsNCi0JcyA9IHMgKyAiXG4iLypub25OTFMqLyArIGJsb2NrLnRvU3RyaW5nKHRhYisxKSA7DQorCXMgPSBzICsgInN5bmNocm9uaXplZCAoIiArIGV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwlzID0gcyArICJcbiIgKyBibG9jay50b1N0cmluZyh0YWIrMSkgOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzO30NCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsNCiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhpc1JlZmVyZW5jZS5qYXZhCmluZGV4IGU5Y2Y3ZTIuLjM2NmM0NmEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhpc1JlZmVyZW5jZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhpc1JlZmVyZW5jZS5qYXZhCkBAIC01Niw4ICs1Niw4IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsNCiANCi0JaWYgKHRoaXMgPT0gVGhpc0ltcGxpY2l0KSByZXR1cm4gIiIvKm5vbk5MUyovIDsNCi0JcmV0dXJuICJ0aGlzIi8qbm9uTkxTKi87DQorCWlmICh0aGlzID09IFRoaXNJbXBsaWNpdCkgcmV0dXJuICIiIDsgLy8kTk9OLU5MUy0xJA0KKwlyZXR1cm4gInRoaXMiOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhyb3dTdGF0ZW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhyb3dTdGF0ZW1lbnQuamF2YQppbmRleCBmMWFkZWI3Li4zZmY5MGQ1IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Rocm93U3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaHJvd1N0YXRlbWVudC5qYXZhCkBAIC0xMyw1NyArMTMsNTQgQEAKIHB1YmxpYyBjbGFzcyBUaHJvd1N0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7DQogCXB1YmxpYyBFeHByZXNzaW9uIGV4Y2VwdGlvbjsNCiAJcHVibGljIFR5cGVCaW5kaW5nIGV4Y2VwdGlvblR5cGU7DQotcHVibGljIFRocm93U3RhdGVtZW50KEV4cHJlc3Npb24gZXhjZXB0aW9uLGludCBzdGFydFBvc2l0aW9uKSB7DQotCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOw0KLQl0aGlzLnNvdXJjZVN0YXJ0ID0gc3RhcnRQb3NpdGlvbiA7DQotCXRoaXMuc291cmNlRW5kID0gZXhjZXB0aW9uLnNvdXJjZUVuZCA7DQotfQ0KLXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7DQogDQotCS8vIG5lZWQgdG8gY2hlY2sgdGhhdCBleGNlcHRpb24gdGhyb3duIGlzIGFjdHVhbGx5IGNhdWdodCBzb21ld2hlcmUNCi0NCi0JZXhjZXB0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsNCi0JZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyhleGNlcHRpb25UeXBlLCB0aGlzLCBmbG93SW5mbywgY3VycmVudFNjb3BlKTsNCi0JcmV0dXJuIEZsb3dJbmZvLkRlYWRFbmQ7DQotfQ0KLS8qKg0KLSAqIFRocm93IGNvZGUgZ2VuZXJhdGlvbg0KLSAqDQotICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUNCi0gKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtDQotICovIA0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7DQotDQotCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgew0KLQkJcmV0dXJuOw0KKwlwdWJsaWMgVGhyb3dTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleGNlcHRpb24sIGludCBzdGFydFBvc2l0aW9uKSB7DQorCQl0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsNCisJCXRoaXMuc291cmNlU3RhcnQgPSBzdGFydFBvc2l0aW9uOw0KKwkJdGhpcy5zb3VyY2VFbmQgPSBleGNlcHRpb24uc291cmNlRW5kOw0KIAl9DQotCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247DQotCWV4Y2VwdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsNCi0JY29kZVN0cmVhbS5hdGhyb3coKTsNCi0JY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzKTsNCi0JDQotfQ0KLXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgew0KLQlleGNlcHRpb25UeXBlID0gZXhjZXB0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsNCi0JaWYgKGV4Y2VwdGlvblR5cGUgPT0gTnVsbEJpbmRpbmcpDQotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RUaHJvd051bGwodGhpcyk7DQotCWV4Y2VwdGlvbi5pbXBsaWNpdFdpZGVuaW5nKGV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpOw0KLX0NCi0vKiBTSE9VTEROJ1QgSVQgUkFUSEVSIERPIC0NCi1zY29wZS5jaGVja1Rocm93YWJsZShleGNlcHRpb25UeXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSkpOyANCi0qLw0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYil7DQotCS8qIHNsb3cgY29kZSAqLw0KIA0KLQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpIDsNCi0JcyA9IHMgKyAidGhyb3cgIi8qbm9uTkxTKi87DQotCXMgPSBzICsgZXhjZXB0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpIDsNCi0JcmV0dXJuIHM7DQotfQ0KLXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KLQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KLQkJZXhjZXB0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOw0KKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgew0KKw0KKwkJZXhjZXB0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsNCisJCS8vIG5lZWQgdG8gY2hlY2sgdGhhdCBleGNlcHRpb24gdGhyb3duIGlzIGFjdHVhbGx5IGNhdWdodCBzb21ld2hlcmUNCisJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoZXhjZXB0aW9uVHlwZSwgdGhpcywgZmxvd0luZm8sIGN1cnJlbnRTY29wZSk7DQorCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsNCiAJfQ0KLQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOw0KLX0NCi19DQorDQorCS8qKg0KKwkgKiBUaHJvdyBjb2RlIGdlbmVyYXRpb24NCisJICoNCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUNCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQ0KKwkgKi8NCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsNCisNCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkNCisJCQlyZXR1cm47DQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOw0KKwkJZXhjZXB0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOw0KKwkJY29kZVN0cmVhbS5hdGhyb3coKTsNCisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcyk7DQorCX0NCisNCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7DQorCQlleGNlcHRpb25UeXBlID0gZXhjZXB0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsNCisJCWlmIChleGNlcHRpb25UeXBlID09IE51bGxCaW5kaW5nKQ0KKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFRocm93TnVsbCh0aGlzKTsNCisJCWV4Y2VwdGlvbi5pbXBsaWNpdFdpZGVuaW5nKGV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgew0KKwkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsNCisJCXMgPSBzICsgInRocm93ICI7IC8vJE5PTi1OTFMtMSQNCisJCXMgPSBzICsgZXhjZXB0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOw0KKwkJcmV0dXJuIHM7DQorCX0NCisNCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7DQorCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkNCisJCQlleGNlcHRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7DQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ5U3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RyeVN0YXRlbWVudC5qYXZhCmluZGV4IGYyZjQ4MTUuLjc1MzFkYTIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ5U3RhdGVtZW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YQpAQCAtMjksOCArMjksOCBAQAogCUxhYmVsIHN1YlJvdXRpbmVTdGFydExhYmVsOw0KIAlMb2NhbFZhcmlhYmxlQmluZGluZyBhbnlFeGNlcHRpb25WYXJpYWJsZSwgcmV0dXJuQWRkcmVzc1ZhcmlhYmxlOw0KIA0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIFNlY3JldFJldHVybk5hbWUgPSAiIHJldHVybkFkZHJlc3MiLypub25OTFMqLy50b0NoYXJBcnJheSgpIDsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTZWNyZXRBbnlIYW5kbGVyTmFtZSA9ICIgYW55RXhjZXB0aW9uSGFuZGxlciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU2VjcmV0UmV0dXJuTmFtZSA9ICIgcmV0dXJuQWRkcmVzcyIudG9DaGFyQXJyYXkoKSA7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTZWNyZXRBbnlIYW5kbGVyTmFtZSA9ICIgYW55RXhjZXB0aW9uSGFuZGxlciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMNCiAJaW50IHByZVRyeUluaXRTdGF0ZUluZGV4ID0gLTE7DQpAQCAtMzc0LDI0ICszNzQsMjQgQEAKIA0KIAlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpIDsNCiAJLy90cnkNCi0JcyA9IHMgKyAidHJ5ICIvKm5vbk5MUyovIDsNCisJcyA9IHMgKyAidHJ5ICIgOyAvLyROT04tTkxTLTEkDQogCWlmICh0cnlCbG9jayA9PSBCbG9jay5Ob25lKQ0KLQkJcyA9cyArICJ7fSIvKm5vbk5MUyovIDsNCisJCXMgPXMgKyAie30iIDsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlzID0gcyArICJcbiIvKm5vbk5MUyovICsgdHJ5QmxvY2sudG9TdHJpbmcodGFiKzEpIDsNCisJCXMgPSBzICsgIlxuIiArIHRyeUJsb2NrLnRvU3RyaW5nKHRhYisxKSA7IC8vJE5PTi1OTFMtMSQNCiAJDQogCS8vY2F0Y2hlcw0KIAlpZiAoY2F0Y2hCbG9ja3MgIT0gbnVsbCkNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0Y2hCbG9ja3MubGVuZ3RoIDsgaSsrKQ0KLQkJCXMgPSBzIAkrICJcbiIvKm5vbk5MUyovICsgdGFiU3RyaW5nKHRhYikgKyAiY2F0Y2ggKCIvKm5vbk5MUyovIA0KLQkJCQkJKyBjYXRjaEFyZ3VtZW50c1tpXS50b1N0cmluZygwKSArICIpICIvKm5vbk5MUyovDQorCQkJcyA9IHMgCSsgIlxuIiArIHRhYlN0cmluZyh0YWIpICsgImNhdGNoICgiICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJCQkJCSsgY2F0Y2hBcmd1bWVudHNbaV0udG9TdHJpbmcoMCkgKyAiKSAiIC8vJE5PTi1OTFMtMSQNCiAJCQkJCSsgY2F0Y2hCbG9ja3NbaV0udG9TdHJpbmcodGFiKzEpIDsNCiAJLy9maW5hbGx5DQogCWlmIChmaW5hbGx5QmxvY2sgIT0gbnVsbCkNCiAJewlpZiAoZmluYWxseUJsb2NrID09IEJsb2NrLk5vbmUpIA0KLQkJCXMgPSBzICsgIlxuIi8qbm9uTkxTKi8gKyB0YWJTdHJpbmcodGFiKSsgImZpbmFsbHkge30iLypub25OTFMqLyA7DQorCQkJcyA9IHMgKyAiXG4iICsgdGFiU3RyaW5nKHRhYikrICJmaW5hbGx5IHt9IiA7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJZWxzZQ0KLQkJCXMgPSBzICsgIlxuIi8qbm9uTkxTKi8gKyB0YWJTdHJpbmcodGFiKSsgImZpbmFsbHlcbiIvKm5vbk5MUyovICsgDQorCQkJcyA9IHMgKyAiXG4iICsgdGFiU3RyaW5nKHRhYikrICJmaW5hbGx5XG4iICsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQlmaW5hbGx5QmxvY2sudG9TdHJpbmcodGFiKzEpIDt9DQogCQ0KIAlyZXR1cm4gcyA7fQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDM4NzA1ZTEuLjhiYzgxM2YgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMzMsNiArMzMsNyBAQAogCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA7DQogCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQgOw0KIAlwdWJsaWMgaW50IGJvZHlTdGFydDsNCisJDQogLyoNCiAgKglXZSBjYXVzZSB0aGUgY29tcGlsYXRpb24gdGFzayB0byBhYm9ydCB0byBhIGdpdmVuIGV4dGVudC4NCiAgKi8NCkBAIC02NTAsNiArNjUxLDkgQEAKIAkNCiAJcmV0dXJuIGZhbHNlIDt9DQogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZiAoKHRoaXMuYml0cyAmIEFkZEFzc2VydGlvbk1BU0spICE9IDApIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQogCWlmIChmaWVsZHMgPT0gbnVsbCkNCiAJCXJldHVybiBmYWxzZTsNCiAJaWYgKGlzSW50ZXJmYWNlKCkpIHJldHVybiB0cnVlOyAvLyBmaWVsZHMgYXJlIGltcGxpY2l0bHkgc3RhdGljcw0KQEAgLTc3Myw0OCArNzc3LDQ4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nQm9keShpbnQgdGFiKSB7DQogCS8qc2xvdyBjb2RlICovDQogDQotCVN0cmluZyBzID0gIiB7Ii8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIiB7IjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgew0KIAkJCWlmIChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSB7DQotCQkJCXMgKz0gIlxuIi8qbm9uTkxTKi8gKyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZyh0YWIgKyAxKTsNCisJCQkJcyArPSAiXG4iICsgbWVtYmVyVHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSk7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQl9DQogCX0NCiAJaWYgKGZpZWxkcyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBmaWVsZEkgPSAwOyBmaWVsZEkgPCBmaWVsZHMubGVuZ3RoOyBmaWVsZEkrKykgew0KIAkJCWlmIChmaWVsZHNbZmllbGRJXSAhPSBudWxsKSB7DQotCQkJCXMgKz0gIlxuIi8qbm9uTkxTKi8gKyBmaWVsZHNbZmllbGRJXS50b1N0cmluZyh0YWIgKyAxKTsNCi0JCQkJaWYgKGZpZWxkc1tmaWVsZEldLmlzRmllbGQoKSkgcyArPSAiOyIvKm5vbk5MUyovOw0KKwkJCQlzICs9ICJcbiIgKyBmaWVsZHNbZmllbGRJXS50b1N0cmluZyh0YWIgKyAxKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQlpZiAoZmllbGRzW2ZpZWxkSV0uaXNGaWVsZCgpKSBzICs9ICI7IjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfQ0KIAlpZiAobWV0aG9kcyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsNCiAJCQlpZiAobWV0aG9kc1tpXSAhPSBudWxsKSB7DQotCQkJCXMgKz0gIlxuIi8qbm9uTkxTKi8gKyBtZXRob2RzW2ldLnRvU3RyaW5nKHRhYiArIDEpOw0KKwkJCQlzICs9ICJcbiIgKyBtZXRob2RzW2ldLnRvU3RyaW5nKHRhYiArIDEpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfQ0KIAl9DQotCXMgKz0gIlxuIi8qbm9uTkxTKi8rdGFiU3RyaW5nKHRhYikgKyAifSIvKm5vbk5MUyovOwkNCisJcyArPSAiXG4iK3RhYlN0cmluZyh0YWIpICsgIn0iOwkgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nSGVhZGVyKCkgew0KIAkvKnNsb3cgY29kZSAqLw0KIA0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAobW9kaWZpZXJzICE9IEFjY0RlZmF1bHQpIHsNCiAJCXMgKz0gbW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycyk7DQogCX0NCi0JcyArPSAoaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UgIi8qbm9uTkxTKi8gOiAiY2xhc3MgIi8qbm9uTkxTKi8pICsgbmV3IFN0cmluZyhuYW1lKTsNCisJcyArPSAoaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UgIiA6ICJjbGFzcyAiKSArIG5ldyBTdHJpbmcobmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKQ0KLQkJcyArPSAiIGV4dGVuZHMgIi8qbm9uTkxTKi8gKyBzdXBlcmNsYXNzLnRvU3RyaW5nKDApOw0KKwkJcyArPSAiIGV4dGVuZHMgIiArIHN1cGVyY2xhc3MudG9TdHJpbmcoMCk7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsICYmIHN1cGVySW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7DQotCQlzICs9IChpc0ludGVyZmFjZSgpID8gIiBleHRlbmRzICIvKm5vbk5MUyovIDogIiBpbXBsZW1lbnRzICIvKm5vbk5MUyovKTsNCisJCXMgKz0gKGlzSW50ZXJmYWNlKCkgPyAiIGV4dGVuZHMgIiA6ICIgaW1wbGVtZW50cyAiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgew0KIAkJCXMgKz0gc3VwZXJJbnRlcmZhY2VzW2ldLnRvU3RyaW5nKDApOw0KIAkJCWlmIChpICE9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGgtMSkNCi0JCQkJcyArPSAiLCAiLypub25OTFMqLzsNCisJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkDQogCQl9Ow0KIAl9Ow0KIA0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1VuYXJ5RXhwcmVzc2lvbi5qYXZhCmluZGV4IGQ5OTAyMWQuLjMwOTNkZDUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMjQ1LDcgKzI0NSw3IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKXsNCiAJLyogc2xvdyBjb2RlKi8NCiANCi0JcmV0dXJuCW9wZXJhdG9yVG9TdHJpbmcoKSArICIgIi8qbm9uTkxTKi8gKyBleHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpIDsgfQ0KKwlyZXR1cm4Jb3BlcmF0b3JUb1N0cmluZygpICsgIiAiICsgZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSA7IH0gLy8kTk9OLU5MUy0xJA0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgew0KIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgew0KIAkJZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1doaWxlU3RhdGVtZW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1doaWxlU3RhdGVtZW50LmphdmEKaW5kZXggYjg3OWEwYy4uODZkZjFmYyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaGlsZVN0YXRlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YQpAQCAtMTQ5LDE0ICsxNDksMTQgQEAKIAkvKiBzbG93IGNvZGUgKi8NCiANCiAJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKSA7DQotCXMgPSBzICsgIndoaWxlICgiLypub25OTFMqLyArIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIpIi8qbm9uTkxTKi87DQorCXMgPSBzICsgIndoaWxlICgiICsgY29uZGl0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJaWYgKGFjdGlvbiA9PSBudWxsKQ0KLQkJcyA9IHMgKyAiIHt9IDsiLypub25OTFMqLzsNCisJCXMgPSBzICsgIiB7fSA7IjsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQogCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spDQotCQkJcyA9IHMgKyAiXG4iLypub25OTFMqLyArIGFjdGlvbi50b1N0cmluZyh0YWIrMSkgOw0KKwkJCXMgPSBzICsgIlxuIiArIGFjdGlvbi50b1N0cmluZyh0YWIrMSkgOyAvLyROT04tTkxTLTEkDQogCQllbHNlDQotCQkJcyA9IHMgKyAiIHtcbiIvKm5vbk5MUyovICsgYWN0aW9uLnRvU3RyaW5nKHRhYisxKSArICJ9Ii8qbm9uTkxTKi8gOw0KKwkJCXMgPSBzICsgIiB7XG4iICsgYWN0aW9uLnRvU3RyaW5nKHRhYisxKSArICJ9IiA7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczt9DQogcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7DQogCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVJlYWRlci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVJlYWRlci5qYXZhCmluZGV4IDFhMTlhNDYuLjI0YWNkYjIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlUmVhZGVyLmphdmEKQEAgLTQsMTIgKzQsMTUgQEAKICAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAgKi8NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5OdWxsQ29uc3RhbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCiANCiBpbXBvcnQgamF2YS5pby4qOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KIA0KIHB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVSZWFkZXIgZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cywgSUJpbmFyeVR5cGUgew0KIAlwcml2YXRlIGludCBjb25zdGFudFBvb2xDb3VudDsNCkBAIC01MDgsMTIgKzUxMSwyMTYgQEAKIAlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCiAJamF2YS5pby5QcmludFdyaXRlciBwcmludCA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKG91dCk7DQogCQ0KLQlwcmludC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAieyIvKm5vbk5MUyovKTsNCi0JcHJpbnQucHJpbnRsbigiIGNsYXNzTmFtZTogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKGdldE5hbWUoKSkpOw0KLQlwcmludC5wcmludGxuKCIgc3VwZXJjbGFzc05hbWU6ICIvKm5vbk5MUyovICsgKGdldFN1cGVyY2xhc3NOYW1lKCkgPT0gbnVsbCA/ICJudWxsIi8qbm9uTkxTKi8gOiBuZXcgU3RyaW5nKGdldFN1cGVyY2xhc3NOYW1lKCkpKSk7DQotCXByaW50LnByaW50bG4oIiBhY2Nlc3NfZmxhZ3M6ICIvKm5vbk5MUyovICsgQ2xhc3NGaWxlU3RydWN0LnByaW50VHlwZU1vZGlmaWVycyhhY2Nlc3NGbGFncygpKSArICIoIi8qbm9uTkxTKi8gKyBhY2Nlc3NGbGFncygpICsgIikiLypub25OTFMqLyk7DQorCXByaW50LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJ7Iik7IC8vJE5PTi1OTFMtMSQNCisJcHJpbnQucHJpbnRsbigiIGNsYXNzTmFtZTogIiArIG5ldyBTdHJpbmcoZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQNCisJcHJpbnQucHJpbnRsbigiIHN1cGVyY2xhc3NOYW1lOiAiICsgKGdldFN1cGVyY2xhc3NOYW1lKCkgPT0gbnVsbCA/ICJudWxsIiA6IG5ldyBTdHJpbmcoZ2V0U3VwZXJjbGFzc05hbWUoKSkpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCXByaW50LnByaW50bG4oIiBhY2Nlc3NfZmxhZ3M6ICIgKyBDbGFzc0ZpbGVTdHJ1Y3QucHJpbnRUeXBlTW9kaWZpZXJzKGFjY2Vzc0ZsYWdzKCkpICsgIigiICsgYWNjZXNzRmxhZ3MoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkDQogDQogCXByaW50LmZsdXNoKCk7DQogCXJldHVybiBvdXQudG9TdHJpbmcoKTsNCiB9DQorLyoqDQorICogQ2hlY2sgaWYgdGhlIHJlY2VpdmVyIGhhcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgY29tcGFyZSB0byB0aGUgYnl0ZSBhcnJheSBpbiBhcmd1bWVudC4NCisgKiBTdHJ1Y3R1cmFsIGNoYW5nZXMgYXJlOg0KKyAqIC0gbW9kaWZpZXJzIGNoYW5nZXMgZm9yIHRoZSBjbGFzcywgdGhlIGZpZWxkcyBvciB0aGUgbWV0aG9kcw0KKyAqIC0gc2lnbmF0dXJlIGNoYW5nZXMgZm9yIGZpZWxkcyBvciBtZXRob2RzLg0KKyAqIC0gY2hhbmdlcyBpbiB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvciBtZXRob2RzDQorICogLSBjaGFuZ2VzIGZvciBmaWVsZCBjb25zdGFudHMNCisgKiAtIGNoYW5nZXMgZm9yIHRocm93biBleGNlcHRpb25zDQorICogLSBjaGFuZ2UgZm9yIHRoZSBzdXBlciBjbGFzcyBvciBhbnkgc3VwZXIgaW50ZXJmYWNlcy4NCisgKiAtIGNoYW5nZXMgZm9yIG1lbWJlciB0eXBlcyBuYW1lIG9yIG1vZGlmaWVycw0KKyAqIElmIGFueSBvZiB0aGVzZSBjaGFuZ2VzIG9jY3VycywgdGhlIG1ldGhvZCByZXR1cm5zIHRydWUuIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitwdWJsaWMgYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhieXRlW10gbmV3Qnl0ZXMpIHsNCisJdHJ5IHsNCisJCUNsYXNzRmlsZVJlYWRlciBuZXdDbGFzc0ZpbGUgPQ0KKwkJCW5ldyBDbGFzc0ZpbGVSZWFkZXIobmV3Qnl0ZXMsIHRoaXMuY2xhc3NGaWxlTmFtZSk7DQorCQkvLyB0eXBlIGxldmVsIGNvbXBhcmlzb24NCisJCS8vIG1vZGlmaWVycw0KKwkJaWYgKHRoaXMuZ2V0TW9kaWZpZXJzKCkgIT0gbmV3Q2xhc3NGaWxlLmdldE1vZGlmaWVycygpKSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQkvLyBzdXBlcmNsYXNzDQorCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZ2V0U3VwZXJjbGFzc05hbWUoKSwgbmV3Q2xhc3NGaWxlLmdldFN1cGVyY2xhc3NOYW1lKCkpKSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQkvLyBpbnRlcmZhY2VzDQorCQljaGFyW11bXSBuZXdJbnRlcmZhY2VzTmFtZXMgPSBuZXdDbGFzc0ZpbGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsNCisJCWludCBuZXdJbnRlcmZhY2VzTGVuZ3RoID0gbmV3SW50ZXJmYWNlc05hbWVzID09IG51bGwgPyAwIDogbmV3SW50ZXJmYWNlc05hbWVzLmxlbmd0aDsNCisJCWlmIChuZXdJbnRlcmZhY2VzTGVuZ3RoICE9IHRoaXMuaW50ZXJmYWNlc0NvdW50KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAodGhpcy5pbnRlcmZhY2VzQ291bnQgIT0gMCkgew0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmludGVyZmFjZXNDb3VudDsgaSA8IG1heDsgaSsrKSB7DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5pbnRlcmZhY2VOYW1lc1tpXSwgbmV3SW50ZXJmYWNlc05hbWVzW2ldKSkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQkvLyBmaWVsZHMNCisJCUZpZWxkSW5mb1tdIG90aGVyRmllbGRJbmZvcyA9IChGaWVsZEluZm9bXSkgbmV3Q2xhc3NGaWxlLmdldEZpZWxkcygpOw0KKwkJaW50IG90aGVyRmllbGRJbmZvc0xlbmd0aCA9IG90aGVyRmllbGRJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyRmllbGRJbmZvcy5sZW5ndGg7DQorCQlpZiAodGhpcy5maWVsZHNDb3VudCAhPSBvdGhlckZpZWxkSW5mb3NMZW5ndGgpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChvdGhlckZpZWxkSW5mb3NMZW5ndGggIT0gMCkgew0KKy8vCQkJQXJyYXlzLnNvcnQodGhpcy5maWVsZHMpOw0KKy8vCQkJQXJyYXlzLnNvcnQob3RoZXJGaWVsZEluZm9zKTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyRmllbGRJbmZvc0xlbmd0aDsgaSsrKSB7DQorCQkJCUZpZWxkSW5mbyBjdXJyZW50RmllbGRJbmZvID0gdGhpcy5maWVsZHNbaV07DQorCQkJCUZpZWxkSW5mbyBvdGhlckZpZWxkSW5mbyA9IG90aGVyRmllbGRJbmZvc1tpXTsNCisJCQkJaWYgKGN1cnJlbnRGaWVsZEluZm8uZ2V0TW9kaWZpZXJzKCkgIT0gb3RoZXJGaWVsZEluZm8uZ2V0TW9kaWZpZXJzKCkpIHsNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEZpZWxkSW5mby5nZXROYW1lKCksIG90aGVyRmllbGRJbmZvLmdldE5hbWUoKSkpIHsNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEZpZWxkSW5mby5nZXRUeXBlTmFtZSgpLCBvdGhlckZpZWxkSW5mby5nZXRUeXBlTmFtZSgpKSkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQkJaWYgKGN1cnJlbnRGaWVsZEluZm8uaGFzQ29uc3RhbnQoKSkgew0KKwkJCQkJaWYgKCFvdGhlckZpZWxkSW5mby5oYXNDb25zdGFudCgpKSB7DQorCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQl9DQorCQkJCQlDb25zdGFudCBjdXJyZW50Q29uc3RhbnQgPSBjdXJyZW50RmllbGRJbmZvLmdldENvbnN0YW50KCk7DQorCQkJCQlDb25zdGFudCBvdGhlckNvbnN0YW50ID0gb3RoZXJGaWVsZEluZm8uZ2V0Q29uc3RhbnQoKTsNCisJCQkJCWlmICghY3VycmVudENvbnN0YW50LmdldENsYXNzKCkuZXF1YWxzKG90aGVyQ29uc3RhbnQuZ2V0Q2xhc3MoKSkpIHsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0gDQorCQkJCQlzd2l0Y2ggKGN1cnJlbnRDb25zdGFudC50eXBlSUQoKSkgew0KKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9pbnQgOiANCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9pbnQpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LmludFZhbHVlKCkgIT0gY3VycmVudENvbnN0YW50LmludFZhbHVlKCkpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9ieXRlIDoNCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9ieXRlKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC5ieXRlVmFsdWUoKSAhPSBjdXJyZW50Q29uc3RhbnQuYnl0ZVZhbHVlKCkpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6IA0KKwkJCQkJCQkJaWYgKG90aGVyQ29uc3RhbnQudHlwZUlEKCkgIT0gVHlwZUlkcy5UX3Nob3J0KSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC5zaG9ydFZhbHVlKCkgIT0gY3VycmVudENvbnN0YW50LnNob3J0VmFsdWUoKSkgew0KKwkJCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOiANCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9jaGFyKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC5jaGFyVmFsdWUoKSAhPSBjdXJyZW50Q29uc3RhbnQuY2hhclZhbHVlKCkpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9mbG9hdCA6DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfZmxvYXQpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LmZsb2F0VmFsdWUoKSAhPSBjdXJyZW50Q29uc3RhbnQuZmxvYXRWYWx1ZSgpKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoNCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9kb3VibGUpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWlmIChvdGhlckNvbnN0YW50LmRvdWJsZVZhbHVlKCkgIT0gY3VycmVudENvbnN0YW50LmRvdWJsZVZhbHVlKCkpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDogDQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfYm9vbGVhbikgew0KKwkJCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJaWYgKG90aGVyQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgIT0gY3VycmVudENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJY2FzZSBUeXBlSWRzLlRfU3RyaW5nIDogDQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfU3RyaW5nKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC5zdHJpbmdWYWx1ZSgpICE9IGN1cnJlbnRDb25zdGFudC5zdHJpbmdWYWx1ZSgpKSB7DQorCQkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJY2FzZSBUeXBlSWRzLlRfbnVsbCA6DQorCQkJCQkJCQlpZiAob3RoZXJDb25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfbnVsbCkgew0KKwkJCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJaWYgKG90aGVyQ29uc3RhbnQgIT0gTnVsbENvbnN0YW50LkRlZmF1bHQpIHsNCisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQkJCX0NCisJCQkJCX0NCisJCQkJfSBlbHNlIGlmIChvdGhlckZpZWxkSW5mby5oYXNDb25zdGFudCgpKSB7DQorCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCS8vIG1ldGhvZHMNCisJCU1ldGhvZEluZm9bXSBvdGhlck1ldGhvZEluZm9zID0gKE1ldGhvZEluZm9bXSkgbmV3Q2xhc3NGaWxlLmdldE1ldGhvZHMoKTsNCisJCWludCBvdGhlck1ldGhvZEluZm9zTGVuZ3RoID0gb3RoZXJNZXRob2RJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyTWV0aG9kSW5mb3MubGVuZ3RoOw0KKwkJaWYgKHRoaXMubWV0aG9kc0NvdW50ICE9IG90aGVyTWV0aG9kSW5mb3NMZW5ndGgpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChvdGhlck1ldGhvZEluZm9zTGVuZ3RoICE9IDApIHsNCisvLwkJCUFycmF5cy5zb3J0KHRoaXMubWV0aG9kcyk7DQorLy8JCQlBcnJheXMuc29ydChvdGhlck1ldGhvZEluZm9zKTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyTWV0aG9kSW5mb3NMZW5ndGg7IGkrKykgew0KKwkJCQlNZXRob2RJbmZvIG90aGVyTWV0aG9kSW5mbyA9IG90aGVyTWV0aG9kSW5mb3NbaV07DQorCQkJCU1ldGhvZEluZm8gY3VycmVudE1ldGhvZEluZm8gPSB0aGlzLm1ldGhvZHNbaV07DQorCQkJCWlmIChvdGhlck1ldGhvZEluZm8uZ2V0TW9kaWZpZXJzKCkgIT0gY3VycmVudE1ldGhvZEluZm8uZ2V0TW9kaWZpZXJzKCkpIHsNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9CQkJCQ0KKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKG90aGVyTWV0aG9kSW5mby5nZXRTZWxlY3RvcigpLCBjdXJyZW50TWV0aG9kSW5mby5nZXRTZWxlY3RvcigpKSkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhvdGhlck1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpLCBjdXJyZW50TWV0aG9kSW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKSB7DQorCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJfQ0KKwkJCQljaGFyW11bXSBvdGhlclRocm93bkV4Y2VwdGlvbnMgPSBvdGhlck1ldGhvZEluZm8uZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCk7DQorCQkJCWludCBvdGhlclRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSBvdGhlclRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCA/IDAgOiBvdGhlclRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOw0KKwkJCQljaGFyW11bXSBjdXJyZW50VGhyb3duRXhjZXB0aW9ucyA9IGN1cnJlbnRNZXRob2RJbmZvLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpOw0KKwkJCQlpbnQgY3VycmVudFRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSBjdXJyZW50VGhyb3duRXhjZXB0aW9ucyA9PSBudWxsID8gMCA6IGN1cnJlbnRUaHJvd25FeGNlcHRpb25zLmxlbmd0aDsNCisJCQkJaWYgKGN1cnJlbnRUaHJvd25FeGNlcHRpb25zTGVuZ3RoICE9IG90aGVyVGhyb3duRXhjZXB0aW9uc0xlbmd0aCkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQkJaWYgKGN1cnJlbnRUaHJvd25FeGNlcHRpb25zTGVuZ3RoICE9IDApIHsNCisJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY3VycmVudFRocm93bkV4Y2VwdGlvbnNMZW5ndGg7IGsrKykgew0KKwkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudFRocm93bkV4Y2VwdGlvbnNba10sIG90aGVyVGhyb3duRXhjZXB0aW9uc1trXSkpIHsNCisJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJLy8gTWVtYmVyIHR5cGVzDQorCQlJbm5lckNsYXNzSW5mb1tdIGN1cnJlbnRNZW1iZXJUeXBlcyA9IChJbm5lckNsYXNzSW5mb1tdKSB0aGlzLmdldE1lbWJlclR5cGVzKCk7DQorCQlJbm5lckNsYXNzSW5mb1tdIG90aGVyTWVtYmVyVHlwZXMgPSAoSW5uZXJDbGFzc0luZm9bXSkgbmV3Q2xhc3NGaWxlLmdldE1lbWJlclR5cGVzKCk7DQorCQlpbnQgY3VycmVudE1lbWJlclR5cGVMZW5ndGggPSBjdXJyZW50TWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBjdXJyZW50TWVtYmVyVHlwZXMubGVuZ3RoOw0KKwkJaW50IG90aGVyTWVtYmVyVHlwZUxlbmd0aCA9IG90aGVyTWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBvdGhlck1lbWJlclR5cGVzLmxlbmd0aDsNCisJCWlmIChjdXJyZW50TWVtYmVyVHlwZUxlbmd0aCAhPSBvdGhlck1lbWJlclR5cGVMZW5ndGgpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjdXJyZW50TWVtYmVyVHlwZUxlbmd0aCAhPSAwKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TWVtYmVyVHlwZUxlbmd0aDsgaSsrKSB7DQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudE1lbWJlclR5cGVzW2ldLmdldE5hbWUoKSwgb3RoZXJNZW1iZXJUeXBlc1tpXS5nZXROYW1lKCkpDQorCQkJCQl8fCBjdXJyZW50TWVtYmVyVHlwZXNbaV0uZ2V0TW9kaWZpZXJzKCkgIT0gb3RoZXJNZW1iZXJUeXBlc1tpXS5nZXRNb2RpZmllcnMoKSkgew0KKwkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9DQorCQkJfQkJCQ0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KK30NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhCmluZGV4IDFmZjRlMWYuLmIwYmM0OTggMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlU3RydWN0LmphdmEKQEAgLTExNCwxMiArMTE0LDEyIEBACiAJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQogCWphdmEuaW8uUHJpbnRXcml0ZXIgcHJpbnQgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihvdXQpOw0KIA0KLQlpZiAoKG1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkgcHJpbnQucHJpbnQoInB1YmxpYyAiLypub25OTFMqLyk7DQotCWlmICgobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkgcHJpbnQucHJpbnQoInByaXZhdGUgIi8qbm9uTkxTKi8pOw0KLQlpZiAoKG1vZGlmaWVycyAmIEFjY0ZpbmFsKSAhPSAwKSBwcmludC5wcmludCgiZmluYWwgIi8qbm9uTkxTKi8pOw0KLQlpZiAoKG1vZGlmaWVycyAmIEFjY1N1cGVyKSAhPSAwKSBwcmludC5wcmludCgic3VwZXIgIi8qbm9uTkxTKi8pOw0KLQlpZiAoKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgIT0gMCkgcHJpbnQucHJpbnQoImludGVyZmFjZSAiLypub25OTFMqLyk7DQotCWlmICgobW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApIHByaW50LnByaW50KCJhYnN0cmFjdCAiLypub25OTFMqLyk7DQorCWlmICgobW9kaWZpZXJzICYgQWNjUHVibGljKSAhPSAwKSBwcmludC5wcmludCgicHVibGljICIpOyAvLyROT04tTkxTLTEkDQorCWlmICgobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkgcHJpbnQucHJpbnQoInByaXZhdGUgIik7IC8vJE5PTi1OTFMtMSQNCisJaWYgKChtb2RpZmllcnMgJiBBY2NGaW5hbCkgIT0gMCkgcHJpbnQucHJpbnQoImZpbmFsICIpOyAvLyROT04tTkxTLTEkDQorCWlmICgobW9kaWZpZXJzICYgQWNjU3VwZXIpICE9IDApIHByaW50LnByaW50KCJzdXBlciAiKTsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgIT0gMCkgcHJpbnQucHJpbnQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoKG1vZGlmaWVycyAmIEFjY0Fic3RyYWN0KSAhPSAwKSBwcmludC5wcmludCgiYWJzdHJhY3QgIik7IC8vJE5PTi1OTFMtMSQNCiAJcHJpbnQuZmx1c2goKTsNCiAJcmV0dXJuIG91dC50b1N0cmluZygpOw0KIH0NCkBAIC0yNzAsNyArMjcwLDcgQEAKIA0KIAkvLyBpZiBuYW1lIGJlZ2lucyB3aXRoIHRoZSA8IGNoYXJhY3RlciBpdCBtdXN0IGJlIGNsaW5pdCBvciBpbml0DQogCWlmIChuYW1lWzBdID09ICc8Jykgew0KLQkJaWYgKG5ldyBTdHJpbmcobmFtZSkuZXF1YWxzKCI8Y2xpbml0PiIvKm5vbk5MUyovKSB8fCBuZXcgU3RyaW5nKG5hbWUpLmVxdWFscygiPGluaXQ+Ii8qbm9uTkxTKi8pKSB7DQorCQlpZiAobmV3IFN0cmluZyhuYW1lKS5lcXVhbHMoIjxjbGluaXQ+IikgfHwgbmV3IFN0cmluZyhuYW1lKS5lcXVhbHMoIjxpbml0PiIpKSB7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCWludCBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOw0KIAkJCWlmICghKChzaWduYXR1cmVMZW5ndGggPiAyKQ0KIAkJCQkmJiAoc2lnbmF0dXJlWzBdID09ICcoJykNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEKaW5kZXggMGMzNzFiNS4uNWY0Njc2ZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mby5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9GaWVsZEluZm8uamF2YQpAQCAtMTEsNyArMTEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQogDQotcHVibGljIGNsYXNzIEZpZWxkSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBJQmluYXJ5RmllbGQgew0KK3B1YmxpYyBjbGFzcyBGaWVsZEluZm8gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cywgSUJpbmFyeUZpZWxkLCBDb21wYXJhYmxlIHsNCiAJcHJpdmF0ZSBDb25zdGFudCBjb25zdGFudDsNCiAJcHJpdmF0ZSBib29sZWFuIGlzRGVwcmVjYXRlZDsNCiAJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzOw0KQEAgLTM4LDggKzM4LDggQEAKIH0NCiAvKioNCiAgKiBSZXR1cm4gdGhlIGNvbnN0YW50IG9mIHRoZSBmaWVsZC4NCi0gKiBSZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbnN0YW50Lk5vdEFDb25zdGFudCBpZiB0aGVyZSBpcyBub25lLg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbnN0YW50DQorICogUmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50Lk5vdEFDb25zdGFudCBpZiB0aGVyZSBpcyBub25lLg0KKyAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQNCiAgKi8NCiBwdWJsaWMgQ29uc3RhbnQgZ2V0Q29uc3RhbnQoKSB7DQogCWlmIChjb25zdGFudCA9PSBudWxsKSB7DQpAQCAtMjYxLDIyICsyNjEsMjkgQEAKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCiAJaW50IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycygpOw0KIAlyZXR1cm4gYnVmZmVyDQotCQkuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pDQorCQkuYXBwZW5kKCJ7IikgLy8kTk9OLU5MUy0xJA0KIAkJLmFwcGVuZCgNCi0JCQkoKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDAgPyAiZGVwcmVjYXRlZCAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykNCi0JCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwMSkgPT0gMSA/ICJwdWJsaWMgIi8qbm9uTkxTKi8gOiAiIi8qbm9uTkxTKi8pDQotCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDIpID09IDB4MDAwMiA/ICJwcml2YXRlICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKQ0KLQkJCQkrICgobW9kaWZpZXJzICYgMHgwMDA0KSA9PSAweDAwMDQgPyAicHJvdGVjdGVkICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKQ0KLQkJCQkrICgobW9kaWZpZXJzICYgMHgwMDA4KSA9PSAweDAwMDAwOCA/ICJzdGF0aWMgIi8qbm9uTkxTKi8gOiAiIi8qbm9uTkxTKi8pDQotCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMTApID09IDB4MDAxMCA/ICJmaW5hbCAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykNCi0JCQkJKyAoKG1vZGlmaWVycyAmIDB4MDA0MCkgPT0gMHgwMDQwID8gInZvbGF0aWxlICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKQ0KLQkJCQkrICgobW9kaWZpZXJzICYgMHgwMDgwKSA9PSAweDAwODAgPyAidHJhbnNpZW50ICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKSkNCisJCQkoKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDAgPyAiZGVwcmVjYXRlZCAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDAxKSA9PSAxID8gInB1YmxpYyAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDAyKSA9PSAweDAwMDIgPyAicHJpdmF0ZSAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDA0KSA9PSAweDAwMDQgPyAicHJvdGVjdGVkICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDgpID09IDB4MDAwMDA4ID8gInN0YXRpYyAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDEwKSA9PSAweDAwMTAgPyAiZmluYWwgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDA0MCkgPT0gMHgwMDQwID8gInZvbGF0aWxlICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwODApID09IDB4MDA4MCA/ICJ0cmFuc2llbnQgIiA6ICIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkuYXBwZW5kKGdldFR5cGVOYW1lKCkpDQotCQkuYXBwZW5kKCIgIi8qbm9uTkxTKi8pDQorCQkuYXBwZW5kKCIgIikgLy8kTk9OLU5MUy0xJA0KIAkJLmFwcGVuZChnZXROYW1lKCkpDQotCQkuYXBwZW5kKCIgIi8qbm9uTkxTKi8pDQorCQkuYXBwZW5kKCIgIikgLy8kTk9OLU5MUy0xJA0KIAkJLmFwcGVuZChnZXRDb25zdGFudCgpKQ0KLQkJLmFwcGVuZCgifSIvKm5vbk5MUyovKQ0KKwkJLmFwcGVuZCgifSIpIC8vJE5PTi1OTFMtMSQNCiAJCS50b1N0cmluZygpOyANCiB9DQorDQorcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsNCisJaWYgKCEobyBpbnN0YW5jZW9mIEZpZWxkSW5mbykpIHsNCisJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsNCisJfQ0KKwlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmdldE5hbWUoKSkuY29tcGFyZVRvKG5ldyBTdHJpbmcoKChGaWVsZEluZm8pIG8pLmdldE5hbWUoKSkpOw0KK30NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0lubmVyQ2xhc3NJbmZvLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQppbmRleCAzY2M0Zjk0Li5lYTQyNzg5IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQpAQCAtMTA5LDExICsxMDksMTEgQEAKIAlpZiAoZ2V0TmFtZSgpICE9IG51bGwpIHsNCiAJCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpKTsNCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSAhPSBudWxsKSB7DQogCQlidWZmZXIuYXBwZW5kKGdldEVuY2xvc2luZ1R5cGVOYW1lKCkpOw0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCWlmIChnZXRTb3VyY2VOYW1lKCkgIT0gbnVsbCkgew0KIAkJYnVmZmVyLmFwcGVuZChnZXRTb3VyY2VOYW1lKCkpOw0KIAl9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm8uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvLmphdmEKaW5kZXggMDYxNDZhNS4uOWU4MDZiMCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm8uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mby5qYXZhCkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCiANCi1wdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlNZXRob2QsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzIHsNCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlNZXRob2QsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21wYXJhYmxlIHsNCiAJcHJpdmF0ZSBjaGFyW11bXSBleGNlcHRpb25OYW1lczsNCiAJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzOw0KIAlwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkOw0KQEAgLTE5MiwxOSArMTkyLDMwIEBACiAJaW50IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycygpOw0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCiAJcmV0dXJuIGJ1ZmZlcg0KLQkJLmFwcGVuZCgieyIvKm5vbk5MUyovKQ0KKwkJLmFwcGVuZCgieyIpIC8vJE5PTi1OTFMtMSQNCiAJCS5hcHBlbmQoDQotCQkJKChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwID8gImRlcHJlY2F0ZWQgIi8qbm9uTkxTKi8gOiAiIi8qbm9uTkxTKi8pDQotCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDEpID09IDEgPyAicHVibGljICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKQ0KLQkJCQkrICgobW9kaWZpZXJzICYgMHgwMDAyKSA9PSAweDAwMDIgPyAicHJpdmF0ZSAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykNCi0JCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwNCkgPT0gMHgwMDA0ID8gInByb3RlY3RlZCAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykNCi0JCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwOCkgPT0gMHgwMDAwMDggPyAic3RhdGljICIvKm5vbk5MUyovIDogIiIvKm5vbk5MUyovKQ0KLQkJCQkrICgobW9kaWZpZXJzICYgMHgwMDEwKSA9PSAweDAwMTAgPyAiZmluYWwgIi8qbm9uTkxTKi8gOiAiIi8qbm9uTkxTKi8pDQotCQkJCSsgKChtb2RpZmllcnMgJiAweDAwNDApID09IDB4MDA0MCA/ICJ2b2xhdGlsZSAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykNCi0JCQkJKyAoKG1vZGlmaWVycyAmIDB4MDA4MCkgPT0gMHgwMDgwID8gInRyYW5zaWVudCAiLypub25OTFMqLyA6ICIiLypub25OTFMqLykpDQorCQkJKChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwID8gImRlcHJlY2F0ZWQgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwMSkgPT0gMSA/ICJwdWJsaWMgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwMikgPT0gMHgwMDAyID8gInByaXZhdGUgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwNCkgPT0gMHgwMDA0ID8gInByb3RlY3RlZCAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDA4KSA9PSAweDAwMDAwOCA/ICJzdGF0aWMgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAxMCkgPT0gMHgwMDEwID8gImZpbmFsICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwNDApID09IDB4MDA0MCA/ICJ2b2xhdGlsZSAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDgwKSA9PSAweDAwODAgPyAidHJhbnNpZW50ICIgOiAiIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJLmFwcGVuZChnZXRTZWxlY3RvcigpKQ0KIAkJLmFwcGVuZChnZXRNZXRob2REZXNjcmlwdG9yKCkpDQotCQkuYXBwZW5kKCJ9Ii8qbm9uTkxTKi8pDQorCQkuYXBwZW5kKCJ9IikgLy8kTk9OLU5MUy0xJA0KIAkJLnRvU3RyaW5nKCk7IA0KIH0NCitwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgbykgew0KKwlpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kSW5mbykpIHsNCisJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsNCisJfQ0KKwlTdHJpbmdCdWZmZXIgY3VycmVudENvbXBhcmlzb25LZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorCWN1cnJlbnRDb21wYXJpc29uS2V5LmFwcGVuZCh0aGlzLmdldFNlbGVjdG9yKCkpLmFwcGVuZCh0aGlzLmdldE1ldGhvZERlc2NyaXB0b3IoKSk7DQorCVN0cmluZ0J1ZmZlciBvdGhlckNvbXBhcmlzb25LZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorCU1ldGhvZEluZm8gb3RoZXJNZXRob2RJbmZvID0gKE1ldGhvZEluZm8pIG87DQorCW90aGVyQ29tcGFyaXNvbktleS5hcHBlbmQob3RoZXJNZXRob2RJbmZvLmdldFNlbGVjdG9yKCkpLmFwcGVuZChvdGhlck1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpKTsNCisJcmV0dXJuIGN1cnJlbnRDb21wYXJpc29uS2V5LnRvU3RyaW5nKCkuY29tcGFyZVRvKG90aGVyQ29tcGFyaXNvbktleS50b1N0cmluZygpKTsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DaGFyQXJyYXlDYWNoZS5qYXZhCmluZGV4IGFhNDFjNzkuLmRjZDcyMWYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2hhckFycmF5Q2FjaGUuamF2YQpAQCAtMTY2LDE2ICsxNjYsMTYgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCWludCBtYXggPSBzaXplKCk7DQogCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1Zi5hcHBlbmQoInsiLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7DQogCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkgew0KLQkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iLypub25OTFMqLykuYXBwZW5kKHZhbHVlVGFibGVbaV0pOw0KKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmIChpIDwgbWF4KSB7DQotCQkJYnVmLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1Zi5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db2RlU3RyZWFtLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db2RlU3RyZWFtLmphdmEKaW5kZXggYWNiNTliOS4uZDM4MTQ4NCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29kZVN0cmVhbS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvZGVTdHJlYW0uamF2YQpAQCAtMTM2OSw3ICsxMzY5LDcgQEAKIAkvLyBXcmFwIHRoZSBjb2RlIGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNvbnZlcnQgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGludG8gYSBOb0NsYXNzRGVmRXJyb3INCiANCiAJYW55RXhjZXB0aW9uSGFuZGxlciA9IG5ldyBFeGNlcHRpb25MYWJlbCh0aGlzLCBUeXBlQmluZGluZy5OdWxsQmluZGluZyAvKiByZXByZXNlbnRzIENsYXNzTm90Rm91bmRFeGNlcHRpb24qLyk7DQotCXRoaXMubGRjKGFjY2Vzc2VkVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZyA/ICJqYXZhLmxhbmcuT2JqZWN0Ii8qbm9uTkxTKi8gOiBTdHJpbmcudmFsdWVPZihhY2Nlc3NlZFR5cGUuY29uc3RhbnRQb29sTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKSk7DQorCXRoaXMubGRjKGFjY2Vzc2VkVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZyA/ICJqYXZhLmxhbmcuT2JqZWN0IiA6IFN0cmluZy52YWx1ZU9mKGFjY2Vzc2VkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsgLy8kTk9OLU5MUy0xJA0KIAl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOw0KIA0KIAkvKiBXZSBuZWVkIHRvIHByb3RlY3QgdGhlIHJ1bnRpbWUgY29kZSBmcm9tIGJpbmFyeSBpbmNvbnNpc3RlbmNpZXMNCkBAIC0xNDI5LDcgKzE0MjksNyBAQAogCWFuZXdhcnJheUphdmFMYW5nQ2xhc3MoKTsNCiAJZHVwKCk7DQogCWljb25zdF8wKCk7DQotCWxkYygiamF2YS5sYW5nLlN0cmluZyIvKm5vbk5MUyovKTsNCisJbGRjKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCiAJaW52b2tlQ2xhc3NGb3JOYW1lKCk7DQogCWFhc3RvcmUoKTsNCiAJaW52b2tlQ29uc3RydWN0b3JHZXRDb25zdHJ1Y3RvcigpOw0KQEAgLTE3NzMsMjggKzE3NzMsMjggQEAKIAljaGFyW11bXSB3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG51bGw7DQogCXN3aXRjaCAodmFsdWVUeXBlLmlkKSB7DQogCQljYXNlIFRfaW50IDogLy8gbmV3OiBqYXZhLmxhbmcuSW50ZWdlcg0KLQkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksICJsYW5nIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgIkludGVnZXIiLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCisJCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiSW50ZWdlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkDQogCQkJYnJlYWs7DQogCQljYXNlIFRfYm9vbGVhbiA6IC8vIG5ldzogamF2YS5sYW5nLkJvb2xlYW4NCi0JCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAibGFuZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksICJCb29sZWFuIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQorCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi50b0NoYXJBcnJheSgpLCAibGFuZyIudG9DaGFyQXJyYXkoKSwgIkJvb2xlYW4iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUX2J5dGUgOiAvLyBuZXc6IGphdmEubGFuZy5CeXRlDQotCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgImxhbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAiQnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJCeXRlIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQNCiAJCQlicmVhazsNCiAJCWNhc2UgVF9jaGFyIDogLy8gbmV3OiBqYXZhLmxhbmcuQ2hhcmFjdGVyDQotCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgImxhbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAiQ2hhcmFjdGVyIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQorCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi50b0NoYXJBcnJheSgpLCAibGFuZyIudG9DaGFyQXJyYXkoKSwgIkNoYXJhY3RlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkDQogCQkJYnJlYWs7DQogCQljYXNlIFRfZmxvYXQgOiAvLyBuZXc6IGphdmEubGFuZy5GbG9hdA0KLQkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksICJsYW5nIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgIkZsb2F0Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQorCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi50b0NoYXJBcnJheSgpLCAibGFuZyIudG9DaGFyQXJyYXkoKSwgIkZsb2F0Ii50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQNCiAJCQlicmVhazsNCiAJCWNhc2UgVF9kb3VibGUgOiAvLyBuZXc6IGphdmEubGFuZy5Eb3VibGUNCi0JCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAibGFuZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksICJEb3VibGUiLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCisJCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiRG91YmxlIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQNCiAJCQlicmVhazsNCiAJCWNhc2UgVF9zaG9ydCA6IC8vIG5ldzogamF2YS5sYW5nLlNob3J0DQotCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgImxhbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAiU2hvcnQiLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCisJCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiU2hvcnQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUX2xvbmcgOiAvLyBuZXc6IGphdmEubGFuZy5Mb25nDQotCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgImxhbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAiTG9uZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJMb25nIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQNCiAJCQlicmVhazsNCiAJfQ0KIAlUeXBlQmluZGluZyB3cmFwcGVyVHlwZSA9IG1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLmdldFR5cGUod3JhcHBlclR5cGVDb21wb3VuZE5hbWUpOw0KQEAgLTI4ODUsNiArMjg4NSwyMCBAQAogCX0NCiAJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzRm9yTmFtZSgpKTsNCiB9DQorDQorcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdDbGFzc0Rlc2lyZWRBc3NlcnRpb25TdGF0dXMoKSB7DQorCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5DbGFzcy5kZXNpcmVkQXNzZXJ0aW9uU3RhdHVzKClaOw0KKwljb3VudExhYmVscyA9IDA7DQorCXN0YWNrRGVwdGgtLTsNCisJdHJ5IHsNCisJCXBvc2l0aW9uKys7DQorCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsNCisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQorCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOw0KKwl9DQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0Rlc2lyZWRBc3NlcnRpb25TdGF0dXMoKSk7DQorfQ0KKw0KIHB1YmxpYyB2b2lkIGludm9rZUNvbnN0cnVjdG9yR2V0Q29uc3RydWN0b3IoKSB7DQogCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5DbGFzcy5nZXRDb25zdHJ1Y3RvcihqYXZhLmxhbmcuQ2xhc3NbXSlMamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQogCWNvdW50TGFiZWxzID0gMDsNCkBAIC0zMDY4LDYgKzMwODIsMzMgQEAKIAllbHNlDQogCQlzdGFja0RlcHRoLS07DQogfQ0KKw0KK3B1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3RvcihpbnQgdHlwZUJpbmRpbmdJRCkgew0KKwkvLyBpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IuPGluaXQ+KHR5cGVCaW5kaW5nSUQpVg0KKwljb3VudExhYmVscyA9IDA7DQorCXRyeSB7DQorCQlwb3NpdGlvbisrOw0KKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXNwZWNpYWw7DQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsNCisJfQ0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3Rvcih0eXBlQmluZGluZ0lEKSk7DQorCXN0YWNrRGVwdGggLT0gMjsNCit9DQorDQorcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdBc3NlcnRpb25FcnJvckRlZmF1bHRDb25zdHJ1Y3RvcigpIHsNCisJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yLjxpbml0PigpVg0KKwljb3VudExhYmVscyA9IDA7DQorCXRyeSB7DQorCQlwb3NpdGlvbisrOw0KKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXNwZWNpYWw7DQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsNCisJfQ0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IoKSk7DQorCXN0YWNrRGVwdGggLS07DQorfQ0KKw0KIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0J1ZmZlckRlZmF1bHRDb25zdHJ1Y3RvcigpIHsNCiAJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oKVYNCiAJY291bnRMYWJlbHMgPSAwOw0KQEAgLTMwOTIsNiArMzEzMyw3IEBACiAJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0cnVjdG9yKCkpOw0KIAlzdGFja0RlcHRoIC09IDI7DQogfQ0KKw0KIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0J1ZmZlclRvU3RyaW5nKCkgew0KIAkvLyBpbnZva2V2aXJ0dWFsOiBTdHJpbmdCdWZmZXIudG9TdHJpbmcoKUxqYXZhLmxhbmcuU3RyaW5nOw0KIAljb3VudExhYmVscyA9IDA7DQpAQCAtNDQ0MSw2ICs0NDgzLDIyIEBACiAJfQ0KIAl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nRXJyb3IoKSk7DQogfQ0KKw0KK3B1YmxpYyB2b2lkIG5ld0phdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKSB7DQorCS8vIG5ldzogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yDQorCWNvdW50TGFiZWxzID0gMDsNCisJc3RhY2tEZXB0aCsrOw0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQ0KKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOw0KKwl0cnkgew0KKwkJcG9zaXRpb24rKzsNCisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19uZXc7DQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19uZXcpOw0KKwl9DQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpKTsNCit9DQorDQogcHVibGljIHZvaWQgbmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKSB7IC8vIG5ldzogamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yDQogCWNvdW50TGFiZWxzID0gMDsNCiAJc3RhY2tEZXB0aCsrOw0KQEAgLTUzMDQsMTUgKzUzNjIsMTUgQEAKIAl9DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCIoIHBvc2l0aW9uOiIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIiggcG9zaXRpb246Iik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZChwb3NpdGlvbik7DQotCWJ1ZmZlci5hcHBlbmQoIixcbnN0YWNrRGVwdGg6Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCIsXG5zdGFja0RlcHRoOiIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoc3RhY2tEZXB0aCk7DQotCWJ1ZmZlci5hcHBlbmQoIixcbm1heFN0YWNrOiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiLFxubWF4U3RhY2s6Iik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZChzdGFja01heCk7DQotCWJ1ZmZlci5hcHBlbmQoIixcbm1heExvY2FsczoiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIixcbm1heExvY2FsczoiKTsgLy8kTk9OLU5MUy0xJA0KIAlidWZmZXIuYXBwZW5kKG1heExvY2Fscyk7DQotCWJ1ZmZlci5hcHBlbmQoIikiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIHB1YmxpYyB2b2lkIHVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGludCBwb3MpIHsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db25zdGFudFBvb2wuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCmluZGV4IGU4NzI0MGYuLjM1ODA3OTQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCkBAIC00MSwxMSArNDEsMTEgQEAKIAlwcm90ZWN0ZWQgT2JqZWN0Q2FjaGUgY2xhc3NDYWNoZTsNCiAJcHJvdGVjdGVkIEZpZWxkTmFtZUFuZFR5cGVDYWNoZSBuYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzOw0KIAlwcm90ZWN0ZWQgTWV0aG9kTmFtZUFuZFR5cGVDYWNoZSBuYW1lQW5kVHlwZUNhY2hlRm9yTWV0aG9kczsNCi0JaW50W10gd2VsbEtub3duVHlwZXMgPSBuZXcgaW50WzIwXTsNCi0JaW50W10gd2VsbEtub3duTWV0aG9kcyA9IG5ldyBpbnRbMjZdOw0KKwlpbnRbXSB3ZWxsS25vd25UeXBlcyA9IG5ldyBpbnRbMjFdOw0KKwlpbnRbXSB3ZWxsS25vd25NZXRob2RzID0gbmV3IGludFszNV07DQogCWludFtdIHdlbGxLbm93bkZpZWxkcyA9IG5ldyBpbnRbMTBdOw0KIAlpbnRbXSB3ZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlcyA9IG5ldyBpbnRbMl07DQotCWludFtdIHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlcyA9IG5ldyBpbnRbMjRdOw0KKwlpbnRbXSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXMgPSBuZXcgaW50WzMyXTsNCiAJcHVibGljIGJ5dGVbXSBwb29sQ29udGVudDsNCiAJcHVibGljIGludCBjdXJyZW50SW5kZXggPSAxOw0KIAlwdWJsaWMgaW50IGN1cnJlbnRPZmZzZXQ7DQpAQCAtNzAsNiArNzAsOCBAQAogCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX0VSUk9SX1RZUEUgPSAxNzsNCiAJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfRVhDRVBUSU9OX1RZUEUgPSAxODsNCiAJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfUkVGTEVDVF9DT05TVFJVQ1RPUl9UWVBFID0gMTk7DQorCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SX1RZUEUgPSAyMDsNCisJDQogCS8vIHByZWRlZmluZWQgY29uc3RhbnQgaW5kZXggZm9yIHdlbGwga25vd24gZmllbGRzICANCiAJZmluYWwgc3RhdGljIGludCBUWVBFX0JZVEVfRklFTEQgPSAwOw0KIAlmaW5hbCBzdGF0aWMgaW50IFRZUEVfU0hPUlRfRklFTEQgPSAxOw0KQEAgLTEwOCwxMiArMTEwLDIxIEBACiAJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0NIQVJfTUVUSE9EID0gMjM7DQogCWZpbmFsIHN0YXRpYyBpbnQgVkFMVUVPRl9CT09MRUFOX01FVEhPRCA9IDI0Ow0KIAlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfRE9VQkxFX01FVEhPRCA9IDI1Ow0KKwlmaW5hbCBzdGF0aWMgaW50IEFTU0VSVElPTkVSUk9SX0NPTlNUUl9PQkpFQ1RfTUVUSE9EID0gMjY7DQorCWZpbmFsIHN0YXRpYyBpbnQgQVNTRVJUSU9ORVJST1JfQ09OU1RSX0lOVF9NRVRIT0QgPSAyNzsNCisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfTE9OR19NRVRIT0QgPSAyODsNCisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfRkxPQVRfTUVUSE9EID0gMjk7DQorCWZpbmFsIHN0YXRpYyBpbnQgQVNTRVJUSU9ORVJST1JfQ09OU1RSX0RPVUJMRV9NRVRIT0QgPSAzMDsNCisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfQk9PTEVBTl9NRVRIT0QgPSAzMTsNCisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfQ0hBUl9NRVRIT0QgPSAzMjsNCisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0QgPSAzMzsNCisJZmluYWwgc3RhdGljIGludCBERVNJUkVEQVNTRVJUSU9OU1RBVFVTX0NMQVNTX01FVEhPRCA9IDM0Ow0KIAkvLyBwcmVkZWZpbmVkIGNvbnN0YW50IGluZGV4IGZvciB3ZWxsIGtub3duIG5hbWUgYW5kIHR5cGUgZm9yIGZpZWxkcw0KIAlmaW5hbCBzdGF0aWMgaW50IFRZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFID0gMDsNCiAJZmluYWwgc3RhdGljIGludCBPVVRfU1lTVEVNX05BTUVfQU5EX1RZUEUgPSAxOw0KIAkvLyBwcmVkZWZpbmVkIGNvbnN0YW50IGluZGV4IGZvciB3ZWxsIGtub3duIG5hbWUgYW5kIHR5cGUgZm9yIG1ldGhvZHMNCiAJZmluYWwgc3RhdGljIGludCBGT1JOQU1FX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMDsNCi0JZmluYWwgc3RhdGljIGludCBTVFJJTkdfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTsNCisJZmluYWwgc3RhdGljIGludCBDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTsNCiAJZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDI7DQogCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDM7DQogCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gNDsNCkBAIC0xMzYsNiArMTQ3LDE1IEBACiAJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyMTsNCiAJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyMjsNCiAJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDIzOw0KKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyNDsNCisJZmluYWwgc3RhdGljIGludCBDT05TVFJfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDI1Ow0KKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDI2Ow0KKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9ET1VCTEVfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyNzsNCisJZmluYWwgc3RhdGljIGludCBDT05TVFJfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjg7DQorCWZpbmFsIHN0YXRpYyBpbnQgQ09OU1RSX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyOTsNCisJZmluYWwgc3RhdGljIGludCBDT05TVFJfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDMwOw0KKwlmaW5hbCBzdGF0aWMgaW50IERFU0lSRURBU1NFUlRJT05TVEFUVVNfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAzMTsNCisJDQogCXB1YmxpYyBDbGFzc0ZpbGUgY2xhc3NGaWxlOw0KIA0KIC8qKg0KQEAgLTI1MiwxMyArMjcyLDYzIEBACiAJCQlicmVhazsNCiAJCWNhc2UgJzwnIDoNCiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCkpIHsNCi0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKSkgew0KLQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyAoamF2YS5sYW5nLlN0cmluZylWDQotCQkJCQlyZXR1cm4gU1RSSU5HX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCi0JCQkJfSBlbHNlDQotCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRGVmYXVsdENvbnN0cnVjdG9yU2lnbmF0dXJlKSkgew0KLQkJCQkJCXJldHVybiBERUZBVUxUX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCi0JCQkJCX0NCisJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpIHsNCisJCQkJCWNhc2UgMToNCisJCQkJCQlzd2l0Y2gobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkKSB7DQorCQkJCQkJCWNhc2UgVF9TdHJpbmcgOg0KKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKSkgew0KKwkJCQkJCQkJCXJldHVybiBDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFOwkNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfT2JqZWN0IDoNCisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvck9iamVjdENvbnN0clNpZ25hdHVyZSkpIHsNCisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfaW50IDoNCisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckludENvbnN0clNpZ25hdHVyZSkpIHsNCisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfY2hhciA6DQorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JDaGFyQ29uc3RyU2lnbmF0dXJlKSkgew0KKwkJCQkJCQkJCXJldHVybiBDT05TVFJfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfYm9vbGVhbiA6DQorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JCb29sZWFuQ29uc3RyU2lnbmF0dXJlKSkgew0KKwkJCQkJCQkJCXJldHVybiBDT05TVFJfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfZmxvYXQgOg0KKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yRmxvYXRDb25zdHJTaWduYXR1cmUpKSB7DQorCQkJCQkJCQkJcmV0dXJuIENPTlNUUl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfZG91YmxlIDoNCisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckRvdWJsZUNvbnN0clNpZ25hdHVyZSkpIHsNCisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQljYXNlIFRfbG9uZyA6DQorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JMb25nQ29uc3RyU2lnbmF0dXJlKSkgew0KKwkJCQkJCQkJCXJldHVybiBDT05TVFJfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCWNhc2UgMDoNCisJCQkJCQlpZiAobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKS5sZW5ndGggPT0gMykgew0KKwkJCQkJCQlyZXR1cm4gREVGQVVMVF9DT05TVFJfTUVUSE9EX05BTUVfQU5EX1RZUEU7DQorCQkJCQkJfQ0KKwkJCQl9DQogCQkJfQ0KIAkJCWJyZWFrOw0KIAkJY2FzZSAnYScgOg0KQEAgLTM1NywxMCArNDI3LDExIEBACiAJCQlpZiAoKGZpcnN0Q2hhciA9PSAnZicpICYmIChtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Gb3JOYW1lKSkpIHsNCiAJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBmb3JOYW1lKGphdmEubGFuZy5TdHJpbmcpDQogCQkJCXJldHVybiBGT1JOQU1FX0NMQVNTX01FVEhPRDsNCi0JCQl9IGVsc2UNCi0JCQkJaWYgKChmaXJzdENoYXIgPT0gJ2cnKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IpICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkdldENvbnN0cnVjdG9yKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uY29uc3RhbnRQb29sTmFtZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcnJheUphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lKSkgew0KKwkJCX0gZWxzZSBpZiAoKGZpcnN0Q2hhciA9PSAnZycpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvcikgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuR2V0Q29uc3RydWN0b3IpICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5jb25zdGFudFBvb2xOYW1lKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFycmF5SmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUpKSB7DQogCQkJCQlyZXR1cm4gR0VUQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EOw0KLQkJCQl9DQorCQkJfSBlbHNlIGlmICgoZmlyc3RDaGFyID09ICdkJykgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMCkgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2Jvb2xlYW4pICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkRlc2lyZWRBc3NlcnRpb25TdGF0dXMpKSB7DQorCQkJCQlyZXR1cm4gREVTSVJFREFTU0VSVElPTlNUQVRVU19DTEFTU19NRVRIT0Q7DQorCQkJfQ0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUX0phdmFMYW5nTm9DbGFzc0RlZkVycm9yIDoNCiAJCQlpZiAoKGZpcnN0Q2hhciA9PSAnPCcpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpKSkgew0KQEAgLTQ2Miw2ICs1MzMsMzIgQEAKIAkJCWlmICgoZmlyc3RDaGFyID09ICc8JykgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMSkgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkID09IFRfU3RyaW5nKSkgew0KIAkJCQlyZXR1cm4gSkFWQUxBTkdFUlJPUl9DT05TVFJfTUVUSE9EOw0KIAkJCX0NCisJCWNhc2UgVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yIDoNCisJCQlpZiAoKGZpcnN0Q2hhciA9PSAnPCcpICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpKSB7DQorCQkJCXN3aXRjaCAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCkgew0KKwkJCQkJY2FzZSAwOg0KKwkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0Q7DQorCQkJCQljYXNlIDE6DQorCQkJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCkgew0KKwkJCQkJCQljYXNlIFRfYm9vbGVhbiA6DQorCQkJCQkJCQlyZXR1cm4gQVNTRVJUSU9ORVJST1JfQ09OU1RSX0JPT0xFQU5fTUVUSE9EOw0KKwkJCQkJCQljYXNlIFRfY2hhciA6DQorCQkJCQkJCQlyZXR1cm4gQVNTRVJUSU9ORVJST1JfQ09OU1RSX0NIQVJfTUVUSE9EOw0KKwkJCQkJCQljYXNlIFRfZG91YmxlIDoNCisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfRE9VQkxFX01FVEhPRDsNCisJCQkJCQkJY2FzZSBUX2ludCA6DQorCQkJCQkJCWNhc2UgVF9ieXRlIDoNCisJCQkJCQkJY2FzZSBUX3Nob3J0IDoNCisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfSU5UX01FVEhPRDsNCisJCQkJCQkJY2FzZSBUX2Zsb2F0IDoNCisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfRkxPQVRfTUVUSE9EOw0KKwkJCQkJCQljYXNlIFRfbG9uZyA6DQorCQkJCQkJCQlyZXR1cm4gQVNTRVJUSU9ORVJST1JfQ09OU1RSX0xPTkdfTUVUSE9EOw0KKwkJCQkJCQlkZWZhdWx0Og0KKwkJCQkJCQkJcmV0dXJuIEFTU0VSVElPTkVSUk9SX0NPTlNUUl9PQkpFQ1RfTUVUSE9EOw0KKwkJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCiAJfQ0KIAlyZXR1cm4gLTE7DQogfQ0KQEAgLTQ5Niw2ICs1OTMsNyBAQAogCQljYXNlIFRfSmF2YUxhbmdFcnJvciA6IHJldHVybiBKQVZBX0xBTkdfRVJST1JfVFlQRTsNCiAJCWNhc2UgVF9KYXZhTGFuZ0V4Y2VwdGlvbiA6IHJldHVybiBKQVZBX0xBTkdfRVhDRVBUSU9OX1RZUEU7DQogCQljYXNlIFRfSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IgOiByZXR1cm4gSkFWQV9MQU5HX1JFRkxFQ1RfQ09OU1RSVUNUT1JfVFlQRTsNCisJCWNhc2UgVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yIDogcmV0dXJuIEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUl9UWVBFOw0KIAl9DQogCXJldHVybiAtMTsNCiB9DQpAQCAtMTI0OCw2ICsxMzQ2LDQyIEBACiAJcmV0dXJuIGluZGV4Ow0KIH0NCiAvKioNCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgDQorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQNCisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuDQorICoNCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4NCisgKi8NCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3NEZXNpcmVkQXNzZXJ0aW9uU3RhdHVzKCkgew0KKwlpbnQgaW5kZXg7DQorCWludCBuYW1lQW5kVHlwZUluZGV4Ow0KKwlpbnQgY2xhc3NJbmRleDsNCisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlDQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0RFU0lSRURBU1NFUlRJT05TVEFUVVNfQ0xBU1NfTUVUSE9EXSkgPT0gMCkgew0KKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3MoKTsNCisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tERVNJUkVEQVNTRVJUSU9OU1RBVFVTX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRGVzaXJlZEFzc2VydGlvblN0YXR1cyk7DQorCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5EZXNpcmVkQXNzZXJ0aW9uU3RhdHVzU2lnbmF0dXJlKTsNCisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0RFU0lSRURBU1NFUlRJT05TVEFUVVNfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7DQorCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7DQorCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCXdyaXRlVTIodHlwZUluZGV4KTsNCisJCX0NCisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tERVNJUkVEQVNTRVJUSU9OU1RBVFVTX0NMQVNTX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsNCisJCWlmIChpbmRleCA+IDB4RkZGRil7DQorCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsNCisJCX0NCisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wNCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnDQorCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7DQorCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleA0KKwkJd3JpdGVVMihjbGFzc0luZGV4KTsNCisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgNCisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7DQorCX0NCisJcmV0dXJuIGluZGV4Ow0KK30NCisvKioNCiAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLg0KICAqDQogICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZw0KQEAgLTEzNTgsMTAgKzE0OTIsMTAgQEAKIAkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUNCiAJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbSkFWQUxBTkdFUlJPUl9DT05TVFJfTUVUSE9EXSkgPT0gMCkgew0KIAkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRXJyb3IoKTsNCi0JCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTVFJJTkdfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7DQogCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCiAJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKTsNCi0JCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NUUklOR19DT05TVFJfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7DQorCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KIAkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KIAkJCXdyaXRlVTIobmFtZUluZGV4KTsNCiAJCQl3cml0ZVUyKHR5cGVJbmRleCk7DQpAQCAtMTU3Niw2ICsxNzEwLDI1NCBAQAogCX0NCiAJcmV0dXJuIGluZGV4Ow0KIH0NCisNCisvKioNCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLg0KKyAqDQorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZw0KKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPg0KKyAqLw0KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsNCisJaW50IGluZGV4Ow0KKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SX1RZUEVdKSA9PSAwKSB7DQorCQlpbnQgbmFtZUluZGV4Ow0KKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQNCisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0Fzc2VydGlvbkVycm9yQ29uc3RhbnRQb29sTmFtZSk7DQorCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19BU1NFUlRJT05FUlJPUl9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsNCisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOw0KKwkJfQ0KKwkJd3JpdGVVMShDbGFzc1RhZyk7DQorCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcNCisJCXdyaXRlVTIobmFtZUluZGV4KTsNCisJfQ0KKwlyZXR1cm4gaW5kZXg7DQorfQ0KKw0KKy8qKg0KKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuDQorICoNCisgKiBAcGFyYW0gVHlwZUJpbmRpbmcgYVR5cGVCaW5kaW5nDQorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+DQorICovDQorcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yQ29uc3RydWN0b3IoaW50IHR5cGVCaW5kaW5nSUQpIHsNCisJaW50IGluZGV4ID0gMDsNCisJaW50IG5hbWVBbmRUeXBlSW5kZXggPSAwOw0KKwlpbnQgY2xhc3NJbmRleCA9IDA7DQorCXN3aXRjaCAodHlwZUJpbmRpbmdJRCkgew0KKwkJY2FzZSBUX2ludCA6DQorCQljYXNlIFRfYnl0ZSA6DQorCQljYXNlIFRfc2hvcnQgOg0KKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9JTlRfTUVUSE9EXSkgPT0gMCkgew0KKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsNCisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7DQorCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9ySW50Q29uc3RyU2lnbmF0dXJlKTsNCisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOw0KKwkJCQl9DQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfSU5UX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsNCisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQorCQkJCX0NCisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbA0KKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZw0KKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7DQorCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4DQorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7DQorCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgNCisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFRfbG9uZyA6DQorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0xPTkdfTUVUSE9EXSkgPT0gMCkgew0KKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7DQorCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOw0KKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckxvbmdDb25zdHJTaWduYXR1cmUpOw0KKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOw0KKwkJCQl9DQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfTE9OR19NRVRIT0RdID0gY3VycmVudEluZGV4Kys7DQorCQkJCWlmIChpbmRleCA+IDB4RkZGRil7DQorCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOw0KKwkJCQl9DQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wNCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcNCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOw0KKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleA0KKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOw0KKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4DQorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBUX2Zsb2F0IDoNCisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfRkxPQVRfTUVUSE9EXSkgPT0gMCkgew0KKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JGbG9hdENvbnN0clNpZ25hdHVyZSk7DQorCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOw0KKwkJCQl9DQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfRkxPQVRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpew0KKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsNCisJCQkJfQ0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sDQorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnDQorCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsNCisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgNCisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsNCisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleA0KKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgVF9kb3VibGUgOg0KKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9ET1VCTEVfTUVUSE9EXSkgPT0gMCkgew0KKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsNCisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7DQorCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yRG91YmxlQ29uc3RyU2lnbmF0dXJlKTsNCisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOw0KKwkJCQl9DQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfRE9VQkxFX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsNCisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQorCQkJCX0NCisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbA0KKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZw0KKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7DQorCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4DQorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7DQorCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgNCisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFRfY2hhciA6DQorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0NIQVJfTUVUSE9EXSkgPT0gMCkgew0KKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7DQorCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOw0KKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckNoYXJDb25zdHJTaWduYXR1cmUpOw0KKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsNCisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOw0KKwkJCQl9DQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfQ0hBUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7DQorCQkJCWlmIChpbmRleCA+IDB4RkZGRil7DQorCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOw0KKwkJCQl9DQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wNCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcNCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOw0KKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleA0KKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOw0KKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4DQorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBUX2Jvb2xlYW4gOg0KKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9CT09MRUFOX01FVEhPRF0pID09IDApIHsNCisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsNCisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JCb29sZWFuQ29uc3RyU2lnbmF0dXJlKTsNCisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7DQorCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsNCisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsNCisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsNCisJCQkJfQ0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0JPT0xFQU5fTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpew0KKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsNCisJCQkJfQ0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sDQorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnDQorCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsNCisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgNCisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsNCisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleA0KKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgVF9PYmplY3QgOg0KKwkJY2FzZSBUX1N0cmluZyA6DQorCQljYXNlIFRfbnVsbCA6DQorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX09CSkVDVF9NRVRIT0RdKSA9PSAwKSB7DQorCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCk7DQorCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JPYmplY3RDb25zdHJTaWduYXR1cmUpOw0KKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7DQorCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7DQorCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7DQorCQkJCX0NCisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9PQkpFQ1RfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpew0KKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsNCisJCQkJfQ0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sDQorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnDQorCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsNCisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgNCisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsNCisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleA0KKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOw0KKwkJCX0NCisJfQ0KKwlyZXR1cm4gaW5kZXg7DQorfQ0KKw0KKy8qKg0KKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSANCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudA0KKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4NCisgKg0KKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPg0KKyAqLw0KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvckRlZmF1bHRDb25zdHJ1Y3RvcigpIHsNCisJaW50IGluZGV4Ow0KKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsNCisJaW50IGNsYXNzSW5kZXg7DQorCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQ0KKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0RdKSA9PSAwKSB7DQorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOw0KKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0RFRkFVTFRfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7DQorCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5EZWZhdWx0Q29uc3RydWN0b3JTaWduYXR1cmUpOw0KKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbREVGQVVMVF9DT05TVFJfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7DQorCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7DQorCQkJd3JpdGVVMihuYW1lSW5kZXgpOw0KKwkJCXdyaXRlVTIodHlwZUluZGV4KTsNCisJCX0NCisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7DQorCQlpZiAoaW5kZXggPiAweEZGRkYpew0KKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7DQorCQl9DQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sDQorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZw0KKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOw0KKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgNCisJCXdyaXRlVTIoY2xhc3NJbmRleCk7DQorCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4DQorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOw0KKwl9DQorCXJldHVybiBpbmRleDsNCit9DQorDQorDQogLyoqDQogICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIA0KICAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50DQpAQCAtMTU5MCwxMCArMTk3MiwxMCBAQAogCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQ0KIAlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tOT0NMQVNTREVGRk9VTkRFUlJPUl9DT05TVFJfTUVUSE9EXSkgPT0gMCkgew0KIAkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nTm9DbGFzc0RlZkZvdW5kRXJyb3IoKTsNCi0JCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTVFJJTkdfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7DQogCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCiAJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKTsNCi0JCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NUUklOR19DT05TVFJfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7DQorCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KIAkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOw0KIAkJCXdyaXRlVTIobmFtZUluZGV4KTsNCiAJCQl3cml0ZVUyKHR5cGVJbmRleCk7DQpAQCAtMjAwNiwxMCArMjM4OCwxMCBAQAogCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQ0KIAlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTVFJJTkdCVUZGRVJfU1RSSU5HX0NPTlNUUl9NRVRIT0RdKSA9PSAwKSB7DQogCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsNCi0JCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NUUklOR19DT05TVFJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7DQorCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgew0KIAkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsNCiAJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuU3RyaW5nQ29uc3RydWN0b3JTaWduYXR1cmUpOw0KLQkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTVFJJTkdfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOw0KIAkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7DQogCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7DQogCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRG91YmxlQ2FjaGUuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0RvdWJsZUNhY2hlLmphdmEKaW5kZXggNzcxMWUxNy4uYmI3OThjZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRG91YmxlQ2FjaGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Eb3VibGVDYWNoZS5qYXZhCkBAIC0xMjAsMTYgKzEyMCwxNiBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJaW50IG1heCA9IGVsZW1lbnRTaXplOw0KIAlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWYuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgew0KIAkJaWYgKChrZXlUYWJsZVtpXSAhPSAwKSB8fCAoKGtleVRhYmxlW2ldID09IDApICYmKHZhbHVlVGFibGVbaV0gIT0gMCkpKSB7DQotCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIvKm5vbk5MUyovKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7DQorCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIpLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaWYgKGkgPCBtYXgpIHsNCi0JCQlidWYuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCi0JYnVmLmFwcGVuZCgifSIvKm5vbk5MUyovKTsNCisJYnVmLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWYudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ZpZWxkTmFtZUFuZFR5cGVDYWNoZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmllbGROYW1lQW5kVHlwZUNhY2hlLmphdmEKaW5kZXggNGVhMWY4OS4uMTBkMTQ2ZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmllbGROYW1lQW5kVHlwZUNhY2hlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmllbGROYW1lQW5kVHlwZUNhY2hlLmphdmEKQEAgLTE0MywxNiArMTQzLDE2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpbnQgbWF4ID0gc2l6ZSgpOw0KIAlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWYuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgew0KIAkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsNCi0JCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+Ii8qbm9uTkxTKi8pLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsNCisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlpZiAoaSA8IG1heCkgew0KLQkJCWJ1Zi5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KLQlidWYuYXBwZW5kKCJ9Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmxvYXRDYWNoZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmxvYXRDYWNoZS5qYXZhCmluZGV4IDM0ODBhNmMuLmU4MTkyNjQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Zsb2F0Q2FjaGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEKQEAgLTEyMCwxNiArMTIwLDE2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpbnQgbWF4ID0gZWxlbWVudFNpemU7DQogCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1Zi5hcHBlbmQoInsiLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7DQogCQlpZiAoKGtleVRhYmxlW2ldICE9IDApIHx8ICgoa2V5VGFibGVbaV0gPT0gMCkgJiYgKHZhbHVlVGFibGVbaV0gIT0gMCkpKSB7DQotCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIvKm5vbk5MUyovKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7DQorCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIpLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaWYgKGkgPCBtYXgpIHsNCi0JCQlidWYuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCi0JYnVmLmFwcGVuZCgifSIvKm5vbk5MUyovKTsNCisJYnVmLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWYudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ludGVnZXJDYWNoZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vSW50ZWdlckNhY2hlLmphdmEKaW5kZXggZDQ5YjhiMy4uZTc0Zjk5NiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vSW50ZWdlckNhY2hlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vSW50ZWdlckNhY2hlLmphdmEKQEAgLTEzOCwxNiArMTM4LDE2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpbnQgbWF4ID0gc2l6ZSgpOw0KIAlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWYuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgew0KIAkJaWYgKChrZXlUYWJsZVtpXSAhPSAwKSB8fCAoKGtleVRhYmxlW2ldID09IDApICYmICh2YWx1ZVRhYmxlW2ldICE9IDApKSkgew0KLQkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iLypub25OTFMqLykuYXBwZW5kKHZhbHVlVGFibGVbaV0pOw0KKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmIChpIDwgbWF4KSB7DQotCQkJYnVmLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1Zi5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTGFiZWwuamF2YQppbmRleCBhNjIxODk2Li4xZmQxYjhjIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xhYmVsLmphdmEKQEAgLTE1MSw2ICsxNTEsMTEgQEAKIAkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxzW2ldOw0KIAkJCQkJCWlmICgobG9jYWwgIT0gbnVsbCkgJiYgKGxvY2FsLmluaXRpYWxpemF0aW9uQ291bnQgPiAwKSkgew0KIAkJCQkJCQlpZiAobG9jYWwuaW5pdGlhbGl6YXRpb25QQ3NbKChsb2NhbC5pbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSA9PSBvbGRQb3NpdGlvbikgew0KKwkJCQkJCQkJLy8gd2Ugd2FudCB0byBwcmV2ZW50IGludGVydmFsIG9mIHNpemUgMCB0byBoYXZlIGEgbmVnYXRpdmUgc2l6ZS4NCisJCQkJCQkJCS8vIHNlZSBQUiAxR0lSUUxBOiBJVFBKQ09SRTpBTEwgLSBDbGFzc0Zvcm1hdEVycm9yIGZvciBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCisJCQkJCQkJCWlmIChsb2NhbC5pbml0aWFsaXphdGlvblBDc1soKGxvY2FsLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKV0gPT0gb2xkUG9zaXRpb24pIHsNCisJCQkJCQkJCQlsb2NhbC5pbml0aWFsaXphdGlvblBDc1soKGxvY2FsLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKV0gPSBwb3NpdGlvbjsNCisJCQkJCQkJCX0NCiAJCQkJCQkJCWxvY2FsLmluaXRpYWxpemF0aW9uUENzWygobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSBwb3NpdGlvbjsNCiAJCQkJCQkJfQ0KIAkJCQkJCX0NCkBAIC0xOTAsMTQgKzE5NSwxNCBAQAogICogUHJpbnQgb3V0IHRoZSByZWNlaXZlcg0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCIocG9zaXRpb249Ii8qbm9uTkxTKi8pOw0KKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiKHBvc2l0aW9uPSIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQocG9zaXRpb24pOw0KLQlidWZmZXIuYXBwZW5kKCIsIGZvcndhcmRzID0gWyIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiLCBmb3J3YXJkcyA9IFsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IGZvcndhcmRSZWZlcmVuY2VDb3VudCAtIDE7IGkrKykNCi0JCWJ1ZmZlci5hcHBlbmQoZm9yd2FyZFJlZmVyZW5jZXNbaV0gKyAiLCAiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKGZvcndhcmRSZWZlcmVuY2VzW2ldICsgIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGZvcndhcmRSZWZlcmVuY2VDb3VudCA+PSAxKQ0KIAkJYnVmZmVyLmFwcGVuZChmb3J3YXJkUmVmZXJlbmNlc1tmb3J3YXJkUmVmZXJlbmNlQ291bnQtMV0pOw0KLQlidWZmZXIuYXBwZW5kKCJdICkiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIl0gKSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xvbmdDYWNoZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTG9uZ0NhY2hlLmphdmEKaW5kZXggYTU5Mzk3Zi4uZTRmNTE5ZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTG9uZ0NhY2hlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTG9uZ0NhY2hlLmphdmEKQEAgLTEzOCwxNiArMTM4LDE2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpbnQgbWF4ID0gc2l6ZSgpOw0KIAlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWYuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgew0KIAkJaWYgKChrZXlUYWJsZVtpXSAhPSAwKSB8fCAoKGtleVRhYmxlW2ldID09IDApICYmICh2YWx1ZVRhYmxlW2ldICE9IDApKSkgew0KLQkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iLypub25OTFMqLykuYXBwZW5kKHZhbHVlVGFibGVbaV0pOw0KKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmIChpIDwgbWF4KSB7DQotCQkJYnVmLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1Zi5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9NZXRob2ROYW1lQW5kVHlwZUNhY2hlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9NZXRob2ROYW1lQW5kVHlwZUNhY2hlLmphdmEKaW5kZXggMmQ1MDg1My4uOWE4Y2E0MyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTWV0aG9kTmFtZUFuZFR5cGVDYWNoZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL01ldGhvZE5hbWVBbmRUeXBlQ2FjaGUuamF2YQpAQCAtMTQ0LDE2ICsxNDQsMTYgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCWludCBtYXggPSBzaXplKCk7DQogCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1Zi5hcHBlbmQoInsiLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7DQogCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkgew0KLQkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iLypub25OTFMqLykuYXBwZW5kKHZhbHVlVGFibGVbaV0pOw0KKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmIChpIDwgbWF4KSB7DQotCQkJYnVmLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCWJ1Zi5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PYmplY3RDYWNoZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YQppbmRleCA2M2NiNTFmLi42NDM2M2E2IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PYmplY3RDYWNoZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09iamVjdENhY2hlLmphdmEKQEAgLTEzNSwxNiArMTM1LDE2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpbnQgbWF4ID0gc2l6ZSgpOw0KIAlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWYuYXBwZW5kKCJ7Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgew0KIAkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsNCi0JCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+Ii8qbm9uTkxTKi8pLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsNCisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlpZiAoaSA8IG1heCkgew0KLQkJCWJ1Zi5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KLQlidWYuYXBwZW5kKCJ9Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1F1YWxpZmllZE5hbWVzQ29uc3RhbnRzLmphdmEKaW5kZXggZWRlZmJkZC4uNmQ0NmRlNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9RdWFsaWZpZWROYW1lc0NvbnN0YW50cy5qYXZhCkBAIC02LDI2ICs2LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsNCiANCiBwdWJsaWMgaW50ZXJmYWNlIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzIHsNCi0JY2hhcltdIEphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvT2JqZWN0Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nQnVmZmVyIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DbGFzcyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1Rocm93YWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nTm9DbGFzc0RlZkZvdW5kRXJyb3JDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0ludGVnZXJDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9JbnRlZ2VyIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9GbG9hdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0RvdWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0xvbmdDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9Mb25nIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9TaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0J5dGVDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9CeXRlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQ2hhcmFjdGVyIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEphdmFMYW5nVm9pZENvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1ZvaWQiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQm9vbGVhbiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ1N5c3RlbUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1N5c3RlbSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhTGFuZ0Vycm9yQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvRXJyb3IiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gSmF2YUxhbmdFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9FeGNlcHRpb24iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IgPSAiamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IiLypub25OTFMqLy50b0NoYXJBcnJheSgpOyAgDQorCWNoYXJbXSBKYXZhTGFuZ09iamVjdENvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL09iamVjdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9TdHJpbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nQnVmZmVyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQ2xhc3MiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nVGhyb3dhYmxlQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvVGhyb3dhYmxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhTGFuZ05vQ2xhc3NEZWZGb3VuZEVycm9yQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvTm9DbGFzc0RlZkZvdW5kRXJyb3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0ludGVnZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9GbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gSmF2YUxhbmdEb3VibGVDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9Eb3VibGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0xvbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9TaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gSmF2YUxhbmdCeXRlQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQnl0ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gSmF2YUxhbmdDaGFyYWN0ZXJDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DaGFyYWN0ZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nVm9pZENvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1ZvaWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nQm9vbGVhbkNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0Jvb2xlYW4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nU3lzdGVtQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3lzdGVtIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhTGFuZ0Vycm9yQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvRXJyb3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEphdmFMYW5nRXhjZXB0aW9uQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvciA9ICJqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvciIudG9DaGFyQXJyYXkoKTsgICAvLyROT04tTkxTLTEkDQogCWNoYXJbXSBBcHBlbmQgPSBuZXcgY2hhcltdIHsnYScsICdwJywgJ3AnLCAnZScsICduJywgJ2QnfTsNCiAJY2hhcltdIFRvU3RyaW5nID0gbmV3IGNoYXJbXSB7J3QnLCAnbycsICdTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZyd9Ow0KIAljaGFyW10gSW5pdCA9IG5ldyBjaGFyW10geyc8JywgJ2knLCAnbicsICdpJywgJ3QnLCAnPid9Ow0KQEAgLTMzLDQxICszMyw1MiBAQAogCWNoYXJbXSBWYWx1ZU9mID0gbmV3IGNoYXJbXSB7J3YnLCAnYScsICdsJywgJ3UnLCAnZScsICdPJywgJ2YnfTsNCiAJY2hhcltdIEZvck5hbWUgPSBuZXcgY2hhcltdIHsnZicsICdvJywgJ3InLCAnTicsICdhJywgJ20nLCAnZSd9Ow0KIAljaGFyW10gR2V0TWVzc2FnZSA9IG5ldyBjaGFyW10geydnJywgJ2UnLCAndCcsICdNJywgJ2UnLCAncycsICdzJywgJ2EnLCAnZycsICdlJ307DQotCWNoYXJbXSBOZXdJbnN0YW5jZSA9ICJuZXdJbnN0YW5jZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBHZXRDb25zdHJ1Y3RvciA9ICJnZXRDb25zdHJ1Y3RvciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCWNoYXJbXSBOZXdJbnN0YW5jZSA9ICJuZXdJbnN0YW5jZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gR2V0Q29uc3RydWN0b3IgPSAiZ2V0Q29uc3RydWN0b3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJY2hhcltdIEV4aXQgPSBuZXcgY2hhcltdIHsnZScsICd4JywgJ2knLCAndCd9Ow0KLQljaGFyW10gSW50ZXJuID0gImludGVybiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCWNoYXJbXSBJbnRlcm4gPSAiaW50ZXJuIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCWNoYXJbXSBPdXQgPSBuZXcgY2hhcltdIHsnbycsICd1JywgJ3QnfTsNCiAJY2hhcltdIFRZUEUgPSBuZXcgY2hhcltdIHsnVCcsICdZJywgJ1AnLCAnRSd9Ow0KIAljaGFyW10gVGhpcyA9IG5ldyBjaGFyW10geyd0JywgJ2gnLCAnaScsICdzJ307DQogCWNoYXJbXSBKYXZhTGFuZ0NsYXNzU2lnbmF0dXJlID0gbmV3IGNoYXJbXSB7J0wnLCAnaicsICdhJywgJ3YnLCAnYScsICcvJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLycsICdDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnOyd9Ow0KLQljaGFyW10gRm9yTmFtZVNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEdldE1lc3NhZ2VTaWduYXR1cmUgPSAiKClMamF2YS9sYW5nL1N0cmluZzsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gR2V0Q29uc3RydWN0b3JTaWduYXR1cmUgPSAiKFtMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIFN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBOZXdJbnN0YW5jZVNpZ25hdHVyZSA9ICIoW0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwljaGFyW10gRm9yTmFtZVNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBHZXRNZXNzYWdlU2lnbmF0dXJlID0gIigpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBHZXRDb25zdHJ1Y3RvclNpZ25hdHVyZSA9ICIoW0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIFN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gTmV3SW5zdGFuY2VTaWduYXR1cmUgPSAiKFtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCWNoYXJbXSBEZWZhdWx0Q29uc3RydWN0b3JTaWduYXR1cmUgPSB7JygnLCAnKScsICdWJ307DQogCWNoYXJbXSBDbGluaXRTaWduYXR1cmUgPSBEZWZhdWx0Q29uc3RydWN0b3JTaWduYXR1cmU7DQogCWNoYXJbXSBUb1N0cmluZ1NpZ25hdHVyZSA9IEdldE1lc3NhZ2VTaWduYXR1cmU7DQogCWNoYXJbXSBJbnRlcm5TaWduYXR1cmUgPSBHZXRNZXNzYWdlU2lnbmF0dXJlOw0KLQljaGFyW10gQXBwZW5kSW50U2lnbmF0dXJlID0gIihJKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcHBlbmRMb25nU2lnbmF0dXJlID0gIihKKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcHBlbmRGbG9hdFNpZ25hdHVyZSA9ICIoRilMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gQXBwZW5kRG91YmxlU2lnbmF0dXJlID0gIihEKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcHBlbmRDaGFyU2lnbmF0dXJlID0gIihDKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcHBlbmRCb29sZWFuU2lnbmF0dXJlID0gIihaKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcHBlbmRPYmplY3RTaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gQXBwZW5kU3RyaW5nU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIFZhbHVlT2ZPYmplY3RTaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gVmFsdWVPZkludFNpZ25hdHVyZSA9ICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gVmFsdWVPZkxvbmdTaWduYXR1cmUgPSAiKEopTGphdmEvbGFuZy9TdHJpbmc7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIFZhbHVlT2ZDaGFyU2lnbmF0dXJlID0gIihDKUxqYXZhL2xhbmcvU3RyaW5nOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBWYWx1ZU9mQm9vbGVhblNpZ25hdHVyZSA9ICIoWilMamF2YS9sYW5nL1N0cmluZzsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gVmFsdWVPZkRvdWJsZVNpZ25hdHVyZSA9ICIoRClMamF2YS9sYW5nL1N0cmluZzsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gVmFsdWVPZkZsb2F0U2lnbmF0dXJlID0gIihGKUxqYXZhL2xhbmcvU3RyaW5nOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBKYXZhSW9QcmludFN0cmVhbVNpZ25hdHVyZSA9ICJMamF2YS9pby9QcmludFN0cmVhbTsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwljaGFyW10gQXBwZW5kSW50U2lnbmF0dXJlID0gIihJKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQXBwZW5kTG9uZ1NpZ25hdHVyZSA9ICIoSilMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEFwcGVuZEZsb2F0U2lnbmF0dXJlID0gIihGKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQXBwZW5kRG91YmxlU2lnbmF0dXJlID0gIihEKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQXBwZW5kQ2hhclNpZ25hdHVyZSA9ICIoQylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEFwcGVuZEJvb2xlYW5TaWduYXR1cmUgPSAiKFopTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBcHBlbmRPYmplY3RTaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEFwcGVuZFN0cmluZ1NpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gVmFsdWVPZk9iamVjdFNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gVmFsdWVPZkludFNpZ25hdHVyZSA9ICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIFZhbHVlT2ZMb25nU2lnbmF0dXJlID0gIihKKUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gVmFsdWVPZkNoYXJTaWduYXR1cmUgPSAiKEMpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBWYWx1ZU9mQm9vbGVhblNpZ25hdHVyZSA9ICIoWilMamF2YS9sYW5nL1N0cmluZzsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIFZhbHVlT2ZEb3VibGVTaWduYXR1cmUgPSAiKEQpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBWYWx1ZU9mRmxvYXRTaWduYXR1cmUgPSAiKEYpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBKYXZhSW9QcmludFN0cmVhbVNpZ25hdHVyZSA9ICJMamF2YS9pby9QcmludFN0cmVhbTsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJY2hhcltdIEV4aXRJbnRTaWduYXR1cmUgPSBuZXcgY2hhcltdIHsnKCcsICdJJywgJyknLCAnVid9Ow0KLQljaGFyW10gQXJyYXlKYXZhTGFuZ09iamVjdENvbnN0YW50UG9vbE5hbWUgPSAiW0xqYXZhL2xhbmcvT2JqZWN0OyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBBcnJheUphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lID0gIltMamF2YS9sYW5nL0NsYXNzOyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotDQorCWNoYXJbXSBBcnJheUphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSA9ICJbTGphdmEvbGFuZy9PYmplY3Q7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBcnJheUphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lID0gIltMamF2YS9sYW5nL0NsYXNzOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBc3NlcnRpb25FcnJvckludENvbnN0clNpZ25hdHVyZSA9ICIoSSlWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBc3NlcnRpb25FcnJvckxvbmdDb25zdHJTaWduYXR1cmUgPSAiKEopViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQXNzZXJ0aW9uRXJyb3JGbG9hdENvbnN0clNpZ25hdHVyZSA9ICIoRilWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBc3NlcnRpb25FcnJvckRvdWJsZUNvbnN0clNpZ25hdHVyZSA9ICIoRClWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBBc3NlcnRpb25FcnJvckNoYXJDb25zdHJTaWduYXR1cmUgPSAiKEMpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQXNzZXJ0aW9uRXJyb3JCb29sZWFuQ29uc3RyU2lnbmF0dXJlID0gIihaKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIEFzc2VydGlvbkVycm9yT2JqZWN0Q29uc3RyU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL09iamVjdDspViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gRGVzaXJlZEFzc2VydGlvblN0YXR1cyA9ICJkZXNpcmVkQXNzZXJ0aW9uU3RhdHVzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBEZXNpcmVkQXNzZXJ0aW9uU3RhdHVzU2lnbmF0dXJlID0gIigpWiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gU2hvcnRDb25zdHJTaWduYXR1cmUgPSAiKFMpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQnl0ZUNvbnN0clNpZ25hdHVyZSA9ICIoQilWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YQppbmRleCAxYjIwMWFmLi42YjBiZWU0IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlUeXBlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5VHlwZS5qYXZhCkBAIC02OCw0ICs2OCwxMSBAQAogDQogY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCk7DQogDQorLyoqDQorICogQW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgbm9uZS4NCisgKg0KKyAqIEZvciBleGFtcGxlLCAiU3RyaW5nLmphdmEiDQorICovDQorDQorY2hhcltdIHNvdXJjZUZpbGVOYW1lKCk7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvTmFtZUVudmlyb25tZW50QW5zd2VyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L05hbWVFbnZpcm9ubWVudEFuc3dlci5qYXZhCmluZGV4IGVjZmVlMjQuLmNmZmRiNDcgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvTmFtZUVudmlyb25tZW50QW5zd2VyLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YQpAQCAtNiw2MiArNiw2OSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOw0KIA0KIHB1YmxpYyBjbGFzcyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgew0KKwkNCiAJLy8gb25seSBvbmUgb2YgdGhlIHRocmVlIGNhbiBiZSBzZXQNCiAJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZTsNCiAJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7DQotCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGU7DQotcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlcihJQmluYXJ5VHlwZSBiaW5hcnlUeXBlKSB7DQotCXRoaXMuYmluYXJ5VHlwZSA9IGJpbmFyeVR5cGU7DQotfQ0KLXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsNCi0JdGhpcy5jb21waWxhdGlvblVuaXQgPSBjb21waWxhdGlvblVuaXQ7DQotfQ0KLXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoSVNvdXJjZVR5cGUgc291cmNlVHlwZSkgew0KLQl0aGlzLnNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlOw0KLX0NCi0vKioNCi0gKiBBbnN3ZXIgdGhlIHJlc29sdmVkIGJpbmFyeSBmb3JtIGZvciB0aGUgdHlwZSBvciBudWxsIGlmIHRoZQ0KLSAqIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBjb21waWxhdGlvbiB1bml0IG9yIHNvdXJjZSB0eXBlLg0KLSAqLw0KKwlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzOw0KKwkNCisJcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlcihJQmluYXJ5VHlwZSBiaW5hcnlUeXBlKSB7DQorCQl0aGlzLmJpbmFyeVR5cGUgPSBiaW5hcnlUeXBlOw0KKwl9DQogDQotcHVibGljIElCaW5hcnlUeXBlIGdldEJpbmFyeVR5cGUoKSB7DQotCXJldHVybiBiaW5hcnlUeXBlOw0KLX0NCi0vKioNCi0gKiBBbnN3ZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3IgbnVsbCBpZiB0aGUNCi0gKiByZWNlaXZlciByZXByZXNlbnRzIGEgYmluYXJ5IG9yIHNvdXJjZSB0eXBlLg0KLSAqLw0KKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7DQorCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsNCisJfQ0KIA0KLXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsNCi0JcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsNCi19DQotLyoqDQotICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIHNvdXJjZSBmb3JtIGZvciB0aGUgdHlwZSBvciBudWxsIGlmIHRoZQ0KLSAqIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBjb21waWxhdGlvbiB1bml0IG9yIGJpbmFyeSB0eXBlLg0KLSAqLw0KKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyKElTb3VyY2VUeXBlW10gc291cmNlVHlwZXMpIHsNCisJCXRoaXMuc291cmNlVHlwZXMgPSBzb3VyY2VUeXBlczsNCisJfQ0KIA0KLXB1YmxpYyBJU291cmNlVHlwZSBnZXRTb3VyY2VUeXBlKCkgew0KLQlyZXR1cm4gc291cmNlVHlwZTsNCi19DQotLyoqDQotICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybSBvZiB0aGUgdHlwZS4NCi0gKi8NCisJLyoqDQorCSAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgYmluYXJ5IGZvcm0gZm9yIHRoZSB0eXBlIG9yIG51bGwgaWYgdGhlDQorCSAqIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBjb21waWxhdGlvbiB1bml0IG9yIHNvdXJjZSB0eXBlLg0KKwkgKi8NCisJcHVibGljIElCaW5hcnlUeXBlIGdldEJpbmFyeVR5cGUoKSB7DQorCQlyZXR1cm4gYmluYXJ5VHlwZTsNCisJfQ0KIA0KLXB1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsNCi0JcmV0dXJuIGJpbmFyeVR5cGUgIT0gbnVsbDsNCi19DQotLyoqDQotICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSBjb21waWxhdGlvbiB1bml0IHdoaWNoIGRlZmluZXMgdGhlIHR5cGUuDQotICovDQorCS8qKg0KKwkgKiBBbnN3ZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3IgbnVsbCBpZiB0aGUNCisJICogcmVjZWl2ZXIgcmVwcmVzZW50cyBhIGJpbmFyeSBvciBzb3VyY2UgdHlwZS4NCisJICovDQorCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsNCisJCXJldHVybiBjb21waWxhdGlvblVuaXQ7DQorCX0NCiANCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdCgpIHsNCi0JcmV0dXJuIGNvbXBpbGF0aW9uVW5pdCAhPSBudWxsOw0KLX0NCi0vKioNCi0gKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgY29udGFpbnMgdGhlIHVucmVzb2x2ZWQgc291cmNlIGZvcm0gb2YgdGhlIHR5cGUuDQotICovDQorCS8qKg0KKwkgKiBBbnN3ZXIgdGhlIHVucmVzb2x2ZWQgc291cmNlIGZvcm1zIGZvciB0aGUgdHlwZSBvciBudWxsIGlmIHRoZQ0KKwkgKiByZWNlaXZlciByZXByZXNlbnRzIGEgY29tcGlsYXRpb24gdW5pdCBvciBiaW5hcnkgdHlwZS4NCisJICogDQorCSAqIE11bHRpcGxlIHNvdXJjZSBmb3JtcyBjYW4gYmUgYW5zd2VyZWQgaW4gY2FzZSB0aGUgb3JpZ2luYXRpbmcgY29tcGlsYXRpb24gdW5pdCBkaWQgY29udGFpbg0KKwkgKiBzZXZlcmFsIHR5cGUgYXQgb25jZS4gVGhlbiB0aGUgZmlyc3QgdHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSByZXF1ZXN0ZWQgdHlwZS4NCisJICovDQorCXB1YmxpYyBJU291cmNlVHlwZVtdIGdldFNvdXJjZVR5cGVzKCkgew0KKwkJcmV0dXJuIHNvdXJjZVR5cGVzOw0KKwl9DQogDQotcHVibGljICBib29sZWFuIGlzU291cmNlVHlwZSgpIHsNCi0JcmV0dXJuIHNvdXJjZVR5cGUgIT0gbnVsbDsNCi19DQotfQ0KKwkvKioNCisJICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybSBvZiB0aGUgdHlwZS4NCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsNCisJCXJldHVybiBiaW5hcnlUeXBlICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlciBjb250YWlucyB0aGUgY29tcGlsYXRpb24gdW5pdCB3aGljaCBkZWZpbmVzIHRoZSB0eXBlLg0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXQoKSB7DQorCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0ICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlciBjb250YWlucyB0aGUgdW5yZXNvbHZlZCBzb3VyY2UgZm9ybSBvZiB0aGUgdHlwZS4NCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZSgpIHsNCisJCXJldHVybiBzb3VyY2VUeXBlcyAhPSBudWxsOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YQppbmRleCAzMDdkNDNhLi5hNzk5ZGM3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Db25kaXRpb25hbEZsb3dJbmZvLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvQ29uZGl0aW9uYWxGbG93SW5mby5qYXZhCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aChvdGhlckluaXRzKTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJGbG93SW5mbzx0cnVlOiAiLypub25OTFMqLyArIGluaXRzV2hlblRydWUudG9TdHJpbmcoKSArICIsIGZhbHNlOiAiLypub25OTFMqLyArIGluaXRzV2hlbkZhbHNlLnRvU3RyaW5nKCkgKyAiPiIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIkZsb3dJbmZvPHRydWU6ICIgKyBpbml0c1doZW5UcnVlLnRvU3RyaW5nKCkgKyAiLCBmYWxzZTogIiArIGluaXRzV2hlbkZhbHNlLnRvU3RyaW5nKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkDQogfQ0KIHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzKCkgew0KIAlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS51bmNvbmRpdGlvbmFsSW5pdHMoKS5jb3B5KCkNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEKaW5kZXggNDI2Njk4Yy4uNTQ0NWI2ZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0V4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogCXRyeVN0YXRlbWVudC5wcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXIgPSBpc05lZWRlZDsNCiB9DQogcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7DQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGNlcHRpb24gZmxvdyBjb250ZXh0Ii8qbm9uTkxTKi8pOw0KKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiRXhjZXB0aW9uIGZsb3cgY29udGV4dCIpOyAvLyROT04tTkxTLTEkDQogCWludCBsZW5ndGggPSBoYW5kbGVkRXhjZXB0aW9ucy5sZW5ndGg7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCWludCBjYWNoZUluZGV4ID0gaSAvIEJpdENhY2hlU2l6ZTsNCkBAIC05OSwxMiArOTksMTIgQEAKIAkJYnVmZmVyLmFwcGVuZCgnWycpLmFwcGVuZChoYW5kbGVkRXhjZXB0aW9uc1tpXS5yZWFkYWJsZU5hbWUoKSk7DQogCQlpZiAoKGlzUmVhY2hlZFtjYWNoZUluZGV4XSAmIGJpdE1hc2spICE9IDApIHsNCiAJCQlpZiAoKGlzTmVlZGVkW2NhY2hlSW5kZXhdICYgYml0TWFzaykgPT0gMCkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCItbWFza2VkIi8qbm9uTkxTKi8pOw0KKwkJCQlidWZmZXIuYXBwZW5kKCItbWFza2VkIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KLQkJCQlidWZmZXIuYXBwZW5kKCItcmVhY2hlZCIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgiLXJlYWNoZWQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0gZWxzZSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLW5vdCByZWFjaGVkIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi1ub3QgcmVhY2hlZCIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlidWZmZXIuYXBwZW5kKCctJykuYXBwZW5kKGluaXRzT25FeGNlcHRpb25zW2ldLnRvU3RyaW5nKCkpLmFwcGVuZCgnXScpOw0KIAl9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKaW5kZXggMzI5Y2NiZi4uNjMyYmMzZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93Q29udGV4dC5qYXZhCkBAIC0zMjYsNyArMzI2LDcgQEAKIAlyZXR1cm4gbnVsbDsNCiB9DQogcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKXsNCi0JcmV0dXJuICJGbG93IGNvbnRleHQiLypub25OTFMqLzsNCisJcmV0dXJuICJGbG93IGNvbnRleHQiOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyBGbG93SW5mbyBpbml0c09uQnJlYWsoKSB7DQogCXJldHVybiBGbG93SW5mby5EZWFkRW5kOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dJbmZvLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93SW5mby5qYXZhCmluZGV4IDc0ZWY0MmMuLjE1ZGQ2ZmUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dJbmZvLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YQpAQCAtNzEsNyArNzEsNyBAQAogYWJzdHJhY3QgcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKTsNCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogCWlmICh0aGlzID09IERlYWRFbmQpew0KLQkJcmV0dXJuICJGbG93SW5mby5EZWFkRW5kIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIkZsb3dJbmZvLkRlYWRFbmQiOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xhYmVsRmxvd0NvbnRleHQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xhYmVsRmxvd0NvbnRleHQuamF2YQppbmRleCAwYTY1NDI4Li43YTIwYzU2IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9MYWJlbEZsb3dDb250ZXh0LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhCkBAIC0zOCw3ICszOCw3IEBACiAJfQ0KIH0NCiBwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpew0KLQlyZXR1cm4gIkxhYmVsIGZsb3cgY29udGV4dCBbbGFiZWw6Ii8qbm9uTkxTKi8rU3RyaW5nLnZhbHVlT2YobGFiZWxOYW1lKSsiXSIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIkxhYmVsIGZsb3cgY29udGV4dCBbbGFiZWw6IitTdHJpbmcudmFsdWVPZihsYWJlbE5hbWUpKyJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyBjaGFyW10gbGFiZWxOYW1lKCkgew0KIAlyZXR1cm4gbGFiZWxOYW1lOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTG9vcGluZ0Zsb3dDb250ZXh0LmphdmEKaW5kZXggOTNhY2JhZi4uNzcwMzJlZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTG9vcGluZ0Zsb3dDb250ZXh0LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTG9vcGluZ0Zsb3dDb250ZXh0LmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAlyZXR1cm4gY29udGludWVMYWJlbDsNCiB9DQogcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKXsNCi0JcmV0dXJuICJMb29waW5nIGZsb3cgY29udGV4dCIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIkxvb3BpbmcgZmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgYm9vbGVhbiBpc0NvbnRpbnVhYmxlKCkgew0KIAlyZXR1cm4gdHJ1ZTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Td2l0Y2hGbG93Q29udGV4dC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvU3dpdGNoRmxvd0NvbnRleHQuamF2YQppbmRleCAzM2E3N2I1Li45ZDQ0ZmJkIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Td2l0Y2hGbG93Q29udGV4dC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAlyZXR1cm4gYnJlYWtMYWJlbDsNCiB9DQogcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKXsNCi0JcmV0dXJuICJTd2l0Y2ggZmxvdyBjb250ZXh0Ii8qbm9uTkxTKi87DQorCXJldHVybiAiU3dpdGNoIGZsb3cgY29udGV4dCI7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIGJvb2xlYW4gaXNCcmVha2FibGUoKSB7DQogCXJldHVybiB0cnVlOw0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1VuY29uZGl0aW9uYWxGbG93SW5mby5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvVW5jb25kaXRpb25hbEZsb3dJbmZvLmphdmEKaW5kZXggNzdiMTY1NC4uNjdjYjhkYSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvVW5jb25kaXRpb25hbEZsb3dJbmZvLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvVW5jb25kaXRpb25hbEZsb3dJbmZvLmphdmEKQEAgLTQyMCw5ICs0MjAsOSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiAJaWYgKHRoaXMgPT0gRGVhZEVuZCl7DQotCQlyZXR1cm4gIkZsb3dJbmZvLkRlYWRFbmQiLypub25OTFMqLzsNCisJCXJldHVybiAiRmxvd0luZm8uRGVhZEVuZCI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KLQlyZXR1cm4gIkZsb3dJbmZvPGRlZjogIi8qbm9uTkxTKi8rIGRlZmluaXRlSW5pdHMgKyIsIHBvdDogIi8qbm9uTkxTKi8gKyBwb3RlbnRpYWxJbml0cyArICI+Ii8qbm9uTkxTKi87DQorCXJldHVybiAiRmxvd0luZm88ZGVmOiAiKyBkZWZpbml0ZUluaXRzICsiLCBwb3Q6ICIgKyBwb3RlbnRpYWxJbml0cyArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQNCiB9DQogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsSW5pdHMoKSB7DQogCS8vIGFsc28gc2VlIGNvbmRpdGlvbmFsIGluaXRzLCB3aGVyZSBpdCByZXF1ZXN0cyB0aGVtIHRvIG1lcmdlDQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQppbmRleCA3ZjlhNDIxLi41NTgzMmMxIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQpAQCAtMjMsMTMgKzIzLDEzIEBACiAJDQogCVN0cmluZyBzID0gbmV3IEJvb2xlYW4odmFsdWUpLnRvU3RyaW5nKCkgOw0KIAlpZiAocyA9PSBudWxsKQ0KLQkJcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCiAJCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQotCXJldHVybiAiKGJvb2xlYW4pIi8qbm9uTkxTKi8gKyB2YWx1ZSA7IH0NCisJcmV0dXJuICIoYm9vbGVhbikiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgaW50IHR5cGVJRCgpIHsNCiAJcmV0dXJuIFRfYm9vbGVhbjsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQnl0ZUNvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQppbmRleCA1ZDg4ZGE4Li4xMTRhZjRkIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQpAQCAtMzYsMTMgKzM2LDEzIEBACiAJDQogCVN0cmluZyBzID0gbmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkgOw0KIAlpZiAocyA9PSBudWxsKQ0KLQkJcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCiAJCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQotCXJldHVybiAiKGJ5dGUpIi8qbm9uTkxTKi8gKyB2YWx1ZSA7IH0NCisJcmV0dXJuICIoYnl0ZSkiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgaW50IHR5cGVJRCgpIHsNCiAJcmV0dXJuIFRfYnl0ZTsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ2hhckNvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQppbmRleCA1YjQwMjEzLi5mMTAxNWE1IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQpAQCAtMzksMTMgKzM5LDEzIEBACiAJDQogCVN0cmluZyBzID0gbmV3IENoYXJhY3Rlcih2YWx1ZSkudG9TdHJpbmcoKSA7DQogCWlmIChzID09IG51bGwpDQotCQlyZXR1cm4gIm51bGwiLypub25OTFMqLzsNCisJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KIAkJcmV0dXJuIHM7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCi0JcmV0dXJuICIoY2hhcikiLypub25OTFMqLyArIHZhbHVlIDsgfQ0KKwlyZXR1cm4gIihjaGFyKSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJA0KIHB1YmxpYyBpbnQgdHlwZUlEKCkgew0KIAlyZXR1cm4gVF9jaGFyOw0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlck9wdGlvbnMuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCmluZGV4IDMzNjAwNzYuLjE1ZTczNWEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCkBAIC0xMSw2ICsxMSwyNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsNCiANCiBwdWJsaWMgY2xhc3MgQ29tcGlsZXJPcHRpb25zIGltcGxlbWVudHMgQ29uZmlndXJhYmxlUHJvYmxlbXMsIFByb2JsZW1JcnJpdGFudHMsIFByb2JsZW1SZWFzb25zLCBQcm9ibGVtU2V2ZXJpdGllcyB7DQorCQ0KKwkvKioNCisJICogT3B0aW9uIElEcw0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLmxvY2FsVmFyaWFibGVBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5saW5lTnVtYmVyQXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSA9IENvbXBpbGVyLmNsYXNzLmdldE5hbWUoKSArICIuc291cmNlRmlsZUF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnByZXNlcnZlVW51c2VkTG9jYWwiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnJlYWNoYWJsZUNvZGUgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydFVucmVhY2hhYmxlQ29kZSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEludmFsaWRJbXBvcnQgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydEludmFsaWRJbXBvcnQiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5yZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5yZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnREZXByZWNhdGlvbiA9IENvbXBpbGVyLmNsYXNzLmdldE5hbWUoKSArICIucmVwb3J0RGVwcmVjYXRpb24iOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5yZXBvcnRIaWRkZW5DYXRjaEJsb2NrIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkTG9jYWwgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydFVudXNlZExvY2FsIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5yZXBvcnRVbnVzZWRQYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24gPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Tb3VyY2UgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1RhcmdldFBsYXRmb3JtID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi50YXJnZXRQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCkgKyAiLnJlcG9ydEFzc2VydElkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkDQogDQogCS8vIGNsYXNzIGZpbGUgb3V0cHV0DQogCS8vIHRoZXNlIGFyZSB0aGUgYml0cyB1c2VkIHRvIGJ1bGQgYSBtYXNrIHRvIGtub3cgd2hpY2ggZGVidWcgDQpAQCAtMjQsMTEgKzQ1LDEwIEBACiANCiAJLy8gZGVmYXVsdCBzZXZlcml0eSBsZXZlbCBmb3IgaGFuZGxlcnMNCiAJcHVibGljIGludCBlcnJvclRocmVzaG9sZCA9IFVucmVhY2hhYmxlQ29kZSB8IEltcG9ydFByb2JsZW07DQotCXB1YmxpYyBpbnQgd2FybmluZ1RocmVzaG9sZCA9DQotCQlQYXJzaW5nT3B0aW9uYWxFcnJvciB8IA0KKwlwdWJsaWMgaW50IHdhcm5pbmdUaHJlc2hvbGQgPSANCiAJCU1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgfCBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QgfA0KIAkJVXNpbmdEZXByZWNhdGVkQVBJIHwgTWFza2VkQ2F0Y2hCbG9jayB8DQotCQlVbnVzZWRMb2NhbFZhcmlhYmxlIHwgVW51c2VkQXJndW1lbnQgfA0KKwkJVW51c2VkTG9jYWxWYXJpYWJsZSB8IEFzc2VydFVzZWRBc0FuSWRlbnRpZmllciB8DQogCQlUZW1wb3JhcnlXYXJuaW5nOw0KIA0KIAkvLyB0YXJnZXQgSkRLIDEuMSBvciAxLjINCkBAIC0zNiw2ICs1Niw5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkRLMV8yID0gMTsNCiAJcHVibGljIGludCB0YXJnZXRKREsgPSBKREsxXzE7IC8vIGRlZmF1bHQgZ2VuZXJhdGVzIGZvciBKVk0xLjENCiANCisJLy8gMS40IGZlYXR1cmUNCisJcHVibGljIGJvb2xlYW4gYXNzZXJ0TW9kZSA9IGZhbHNlOyAvLzEuMyBiZWhhdmlvciBieSBkZWZhdWx0DQorCQ0KIAkvLyBwcmludCB3aGF0IHVuaXQgaXMgYmVpbmcgcHJvY2Vzc2VkDQogCXB1YmxpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsNCiAJLy8gaW5kaWNhdGVzIGlmIHJlZmVyZW5jZSBpbmZvIGlzIGRlc2lyZWQNCkBAIC00Niw3ICs2OSw3IEBACiAJcHVibGljIGJvb2xlYW4gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cyA9IHRydWU7DQogDQogCS8vIGV4Y2VwdGlvbiByYWlzZWQgZm9yIHVucmVzb2x2ZWQgY29tcGlsZSBlcnJvcnMNCi0JcHVibGljIFN0cmluZyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciA9ICJqYXZhLmxhbmcuRXJyb3IiLypub25OTFMqLzsNCisJcHVibGljIFN0cmluZyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciA9ICJqYXZhLmxhbmcuRXJyb3IiOyAvLyROT04tTkxTLTEkDQogDQogCS8vIHRvZ2dsZSBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gZm9yIDEuMiAoY29uc3RyLiBhY2Nlc3NvciBoYXMgZXh0cmEgYXJnIG9uIGNvbnN0cnVjdG9yKSBvciAxLjMgKG1ha2UgcHJpdmF0ZSBjb25zdHJ1Y3RvciBkZWZhdWx0IGFjY2VzcyB3aGVuIGFjY2VzcyBuZWVkZWQpDQogCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2hhbmdpbmdWaXNpYmlsaXR5ID0gZmFsc2U7IC8vIGJ5IGRlZmF1bHQsIGZvbGxvd3MgMS4yDQpAQCAtNjAsNiArODMsNyBAQAogICovDQogcHVibGljIENvbXBpbGVyT3B0aW9ucyhDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncyl7DQogCWlmIChzZXR0aW5ncyA9PSBudWxsKSByZXR1cm47DQorCQ0KIAkvLyBmaWx0ZXIgb3B0aW9ucyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgY29tcGlsZXIgY29tcG9uZW50DQogCVN0cmluZyBjb21wb25lbnROYW1lID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpOw0KIAlmb3IgKGludCBpID0gMCwgbWF4ID0gc2V0dGluZ3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspew0KQEAgLTY4LDE5NCArOTIsMTkxIEBACiAJCX0NCiAJfQ0KIH0NCi0vKioNCi0gKiBSZXR1cm5zIGFsbCB0aGUgb3B0aW9ucyBvZiB0aGUgY29tcGlsZXIgdG8gYmUgc2hvd24gYnkgdGhlIFVJDQotICoNCi0gKiBAcGFyYW0gbG9jYWxlIGphdmEudXRpbC5Mb2NhbGUNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25maWd1cmFibGVPcHRpb25bXQ0KLSAqLw0KLXB1YmxpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXRDb25maWd1cmFibGVPcHRpb25zKExvY2FsZSBsb2NhbGUpIHsNCi0JU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBDb21waWxlci5jbGFzcy5nZXROYW1lKCk7DQotCXJldHVybiBuZXcgQ29uZmlndXJhYmxlT3B0aW9uW10gew0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JCQljb21wb25lbnROYW1lLA0KLQkJCSJkZWJ1Zy52YXJzIi8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBWYXJzKSAhPSAwID8gMCA6IDEpLCANCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oDQotCQkJY29tcG9uZW50TmFtZSwNCi0JCQkiZGVidWcubGluZXMiLypub25OTFMqLywgDQotCQkJbG9jYWxlLCANCi0JCQkocHJvZHVjZURlYnVnQXR0cmlidXRlcyAmIExpbmVzKSAhPSAwID8gMCA6IDEpLCANCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oDQotCQkJY29tcG9uZW50TmFtZSwNCi0JCQkiZGVidWcuc291cmNlIi8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBTb3VyY2UpICE9IDAgPyAwIDogMSksIA0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JCQljb21wb25lbnROYW1lLA0KLQkJCSJkZWJ1Zy5wcmVzZXJ2ZUFsbExvY2FscyIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCXByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMgPyAwIDogMSksIA0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JCQljb21wb25lbnROYW1lLA0KLQkJCSJvcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZSIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCShlcnJvclRocmVzaG9sZCAmIFVucmVhY2hhYmxlQ29kZSkgIT0gMCA/IDAgOiAxKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJIm9wdGlvbmFsRXJyb3IuaW1wb3J0UHJvYmxlbSIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCShlcnJvclRocmVzaG9sZCAmIEltcG9ydFByb2JsZW0pICE9IDAgPyAwIDogMSksIA0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JCQljb21wb25lbnROYW1lLA0KLQkJCSJvcHRpb25hbFdhcm5pbmcubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCSh3YXJuaW5nVGhyZXNob2xkICYgTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSkgIT0gMCA/IDAgOiAxKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJIm9wdGlvbmFsV2FybmluZy5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QiLypub25OTFMqLywgDQotCQkJbG9jYWxlLCANCi0JCQkod2FybmluZ1RocmVzaG9sZCAmIE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZCkgIT0gMCA/IDAgOiAxKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJIm9wdGlvbmFsV2FybmluZy5kZXByZWNhdGVkIi8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJKHdhcm5pbmdUaHJlc2hvbGQgJiBVc2luZ0RlcHJlY2F0ZWRBUEkpICE9IDAgPyAwIDogMSksIA0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbigNCi0JCQljb21wb25lbnROYW1lLA0KLQkJCSJvcHRpb25hbFdhcm5pbmcubWFza2VkQ2F0Y2hCbG9jayIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCSh3YXJuaW5nVGhyZXNob2xkICYgTWFza2VkQ2F0Y2hCbG9jaykgIT0gMCA/IDAgOiAxKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJIm9wdGlvbmFsV2FybmluZy51bnVzZWRMb2NhbFZhcmlhYmxlIi8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRMb2NhbFZhcmlhYmxlKSAhPSAwID8gMCA6IDEpLCANCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oDQotCQkJY29tcG9uZW50TmFtZSwNCi0JCQkib3B0aW9uYWxXYXJuaW5nLnVudXNlZEFyZ3VtZW50Ii8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRBcmd1bWVudCkgIT0gMCA/IDAgOiAxKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJImJpbmFyeUNvbXBhdGliaWxpdHkudGFyZ2V0SkRLIi8qbm9uTkxTKi8sIA0KLQkJCWxvY2FsZSwgDQotCQkJdGFyZ2V0SkRLKSwgDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKA0KLQkJCWNvbXBvbmVudE5hbWUsDQotCQkJIm9wdGlvbmFsV2FybmluZy5hY2Nlc3NFbXVsYXRpb24iLypub25OTFMqLywgDQotCQkJbG9jYWxlLCANCi0JCQkod2FybmluZ1RocmVzaG9sZCAmIEFjY2Vzc0VtdWxhdGlvbikgIT0gMCA/IDAgOiAxKSwNCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oDQotCQkJY29tcG9uZW50TmFtZSwNCi0JCQkib3B0aW9uYWxXYXJuaW5nLm5vbkV4dGVybmFsaXplZFN0cmluZyIvKm5vbk5MUyovLCANCi0JCQlsb2NhbGUsIA0KLQkJCSh3YXJuaW5nVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwID8gMCA6IDEpDQotCQl9OyANCi19DQorDQogcHVibGljIGludCBnZXREZWJ1Z0F0dHJpYnV0ZXNNYXNrKCkgew0KIAlyZXR1cm4gdGhpcy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzOw0KIH0NCiBwdWJsaWMgaW50IGdldFRhcmdldEpESygpIHsNCiAJcmV0dXJuIHRoaXMudGFyZ2V0SkRLOw0KIH0NCi1wdWJsaWMgdm9pZCBoYW5kbGVBY2Nlc3NFbXVsYXRpb25Bc1dhcm5pbmcoYm9vbGVhbiBmbGFnKSB7DQotCWlmIChmbGFnKSB7DQotCQl3YXJuaW5nVGhyZXNob2xkIHw9IEFjY2Vzc0VtdWxhdGlvbjsNCi0JfSBlbHNlIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgJj0gfkFjY2Vzc0VtdWxhdGlvbjsNCitwdWJsaWMgYm9vbGVhbiBnZXRBc3NlcnRNb2RlKCkgew0KKwlyZXR1cm4gdGhpcy5hc3NlcnRNb2RlOw0KK30NCitwdWJsaWMgdm9pZCBzZXRBY2Nlc3NFbXVsYXRpb25TZXZlcml0eShpbnQgZmxhZykgew0KKwllcnJvclRocmVzaG9sZCAmPSB+QWNjZXNzRW11bGF0aW9uOw0KKwl3YXJuaW5nVGhyZXNob2xkICY9IH5BY2Nlc3NFbXVsYXRpb247DQorCXN3aXRjaChmbGFnKXsNCisJCWNhc2UgRXJyb3IgOiANCisJCQllcnJvclRocmVzaG9sZCB8PSBBY2Nlc3NFbXVsYXRpb247DQorCQkJYnJlYWs7DQorCQljYXNlIFdhcm5pbmcgOiANCisJCQl3YXJuaW5nVGhyZXNob2xkIHw9IEFjY2Vzc0VtdWxhdGlvbjsNCisJCQlicmVhazsNCiAJfQ0KIH0NCi1wdWJsaWMgdm9pZCBoYW5kbGVEZXByZWNhdGlvblVzZUFzV2FybmluZyhib29sZWFuIGZsYWcpIHsNCi0JaWYgKGZsYWcpIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgfD0gVXNpbmdEZXByZWNhdGVkQVBJOw0KLQl9IGVsc2Ugew0KLQkJd2FybmluZ1RocmVzaG9sZCAmPSB+VXNpbmdEZXByZWNhdGVkQVBJOw0KK3B1YmxpYyB2b2lkIHNldERlcHJlY2F0aW9uVXNlU2V2ZXJpdHkoaW50IGZsYWcpIHsNCisJZXJyb3JUaHJlc2hvbGQgJj0gflVzaW5nRGVwcmVjYXRlZEFQSTsNCisJd2FybmluZ1RocmVzaG9sZCAmPSB+VXNpbmdEZXByZWNhdGVkQVBJOw0KKwlzd2l0Y2goZmxhZyl7DQorCQljYXNlIEVycm9yIDogDQorCQkJZXJyb3JUaHJlc2hvbGQgfD0gVXNpbmdEZXByZWNhdGVkQVBJOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXYXJuaW5nIDogDQorCQkJd2FybmluZ1RocmVzaG9sZCB8PSBVc2luZ0RlcHJlY2F0ZWRBUEk7DQorCQkJYnJlYWs7DQogCX0NCiB9DQotcHVibGljIHZvaWQgaGFuZGxlSW1wb3J0UHJvYmxlbUFzRXJyb3IoYm9vbGVhbiBmbGFnKSB7DQotCWlmIChmbGFnKSB7DQotCQllcnJvclRocmVzaG9sZCB8PSBJbXBvcnRQcm9ibGVtOw0KLQkJd2FybmluZ1RocmVzaG9sZCAmPSB+SW1wb3J0UHJvYmxlbTsNCi0JfSBlbHNlIHsNCi0JCWVycm9yVGhyZXNob2xkICY9IH5JbXBvcnRQcm9ibGVtOw0KLQkJd2FybmluZ1RocmVzaG9sZCB8PSBJbXBvcnRQcm9ibGVtOw0KK3B1YmxpYyB2b2lkIHNldEltcG9ydFByb2JsZW1TZXZlcml0eShpbnQgZmxhZykgew0KKwllcnJvclRocmVzaG9sZCAmPSB+SW1wb3J0UHJvYmxlbTsNCisJd2FybmluZ1RocmVzaG9sZCAmPSB+SW1wb3J0UHJvYmxlbTsNCisJc3dpdGNoKGZsYWcpew0KKwkJY2FzZSBFcnJvciA6IA0KKwkJCWVycm9yVGhyZXNob2xkIHw9IEltcG9ydFByb2JsZW07DQorCQkJYnJlYWs7DQorCQljYXNlIFdhcm5pbmcgOiANCisJCQl3YXJuaW5nVGhyZXNob2xkIHw9IEltcG9ydFByb2JsZW07DQorCQkJYnJlYWs7DQogCX0NCiB9DQotcHVibGljIHZvaWQgaGFuZGxlTWFza2VkQ2F0Y2hCbG9ja0FzV2FybmluZyhib29sZWFuIGZsYWcpIHsNCi0JaWYgKGZsYWcpIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgfD0gTWFza2VkQ2F0Y2hCbG9jazsNCi0JfSBlbHNlIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgJj0gfk1hc2tlZENhdGNoQmxvY2s7DQorcHVibGljIHZvaWQgc2V0TWFza2VkQ2F0Y2hCbG9ja1NldmVyaXR5KGludCBmbGFnKSB7DQorCWVycm9yVGhyZXNob2xkICY9IH5NYXNrZWRDYXRjaEJsb2NrOw0KKwl3YXJuaW5nVGhyZXNob2xkICY9IH5NYXNrZWRDYXRjaEJsb2NrOw0KKwlzd2l0Y2goZmxhZyl7DQorCQljYXNlIEVycm9yIDogDQorCQkJZXJyb3JUaHJlc2hvbGQgfD0gTWFza2VkQ2F0Y2hCbG9jazsNCisJCQlicmVhazsNCisJCWNhc2UgV2FybmluZyA6IA0KKwkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gTWFza2VkQ2F0Y2hCbG9jazsNCisJCQlicmVhazsNCiAJfQ0KIH0NCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lQXNXYXJuaW5nKGJvb2xlYW4gZmxhZykgew0KLQlpZiAoZmxhZykgew0KLQkJd2FybmluZ1RocmVzaG9sZCB8PSBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOw0KLQl9IGVsc2Ugew0KLQkJd2FybmluZ1RocmVzaG9sZCAmPSB+TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZTsNCitwdWJsaWMgdm9pZCBzZXRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lU2V2ZXJpdHkoaW50IGZsYWcpIHsNCisJZXJyb3JUaHJlc2hvbGQgJj0gfk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7DQorCXdhcm5pbmdUaHJlc2hvbGQgJj0gfk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7DQorCXN3aXRjaChmbGFnKXsNCisJCWNhc2UgRXJyb3IgOiANCisJCQllcnJvclRocmVzaG9sZCB8PSBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXYXJuaW5nIDogDQorCQkJd2FybmluZ1RocmVzaG9sZCB8PSBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOw0KKwkJCWJyZWFrOw0KIAl9DQogfQ0KLXB1YmxpYyB2b2lkIGhhbmRsZU9ic29sZXRlTGl0ZXJhbEFzRXJyb3IoYm9vbGVhbiBmbGFnKSB7DQotCWlmIChmbGFnKSB7DQotCQllcnJvclRocmVzaG9sZCB8PSBQYXJzaW5nT3B0aW9uYWxFcnJvcjsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgJj0gflBhcnNpbmdPcHRpb25hbEVycm9yOw0KLQl9IGVsc2Ugew0KLQkJZXJyb3JUaHJlc2hvbGQgJj0gflBhcnNpbmdPcHRpb25hbEVycm9yOw0KLQkJd2FybmluZ1RocmVzaG9sZCB8PSBQYXJzaW5nT3B0aW9uYWxFcnJvcjsNCisNCitwdWJsaWMgdm9pZCBzZXRPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RTZXZlcml0eShpbnQgZmxhZykgew0KKwllcnJvclRocmVzaG9sZCAmPSB+T3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kOw0KKwl3YXJuaW5nVGhyZXNob2xkICY9IH5PdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2Q7DQorCXN3aXRjaChmbGFnKXsNCisJCWNhc2UgRXJyb3IgOiANCisJCQllcnJvclRocmVzaG9sZCB8PSBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2Q7DQorCQkJYnJlYWs7DQorCQljYXNlIFdhcm5pbmcgOiANCisJCQl3YXJuaW5nVGhyZXNob2xkIHw9IE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsNCisJCQlicmVhazsNCiAJfQ0KIH0NCi1wdWJsaWMgdm9pZCBoYW5kbGVPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RBc1dhcm5pbmcoYm9vbGVhbiBmbGFnKSB7DQotCWlmIChmbGFnKSB7DQotCQl3YXJuaW5nVGhyZXNob2xkIHw9IE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsNCi0JfSBlbHNlIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgJj0gfk92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsNCi0JfQ0KLX0NCi1wdWJsaWMgdm9pZCBoYW5kbGVVbnJlYWNoYWJsZUNvZGVBc0Vycm9yKGJvb2xlYW4gZmxhZykgew0KLQlpZiAoZmxhZykgew0KLQkJZXJyb3JUaHJlc2hvbGQgfD0gVW5yZWFjaGFibGVDb2RlOw0KLQkJd2FybmluZ1RocmVzaG9sZCAmPSB+VW5yZWFjaGFibGVDb2RlOw0KLQl9IGVsc2Ugew0KLQkJZXJyb3JUaHJlc2hvbGQgJj0gflVucmVhY2hhYmxlQ29kZTsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW5yZWFjaGFibGVDb2RlOw0KK3B1YmxpYyB2b2lkIHNldFVucmVhY2hhYmxlQ29kZVNldmVyaXR5KGludCBmbGFnKSB7DQorCWVycm9yVGhyZXNob2xkICY9IH5VbnJlYWNoYWJsZUNvZGU7DQorCXdhcm5pbmdUaHJlc2hvbGQgJj0gflVucmVhY2hhYmxlQ29kZTsNCisJc3dpdGNoKGZsYWcpew0KKwkJY2FzZSBFcnJvciA6IA0KKwkJCWVycm9yVGhyZXNob2xkIHw9IFVucmVhY2hhYmxlQ29kZTsNCisJCQlicmVhazsNCisJCWNhc2UgV2FybmluZyA6IA0KKwkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW5yZWFjaGFibGVDb2RlOw0KKwkJCWJyZWFrOw0KIAl9CQ0KIH0NCi1wdWJsaWMgdm9pZCBoYW5kbGVVbnVzZWRBcmd1bWVudEFzV2FybmluZyhib29sZWFuIGZsYWcpIHsNCi0JaWYgKGZsYWcpIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW51c2VkQXJndW1lbnQ7DQotCX0gZWxzZSB7DQotCQl3YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRBcmd1bWVudDsNCitwdWJsaWMgdm9pZCBzZXRVbnVzZWRBcmd1bWVudFNldmVyaXR5KGludCBmbGFnKSB7DQorCWVycm9yVGhyZXNob2xkICY9IH5VbnVzZWRBcmd1bWVudDsNCisJd2FybmluZ1RocmVzaG9sZCAmPSB+VW51c2VkQXJndW1lbnQ7DQorCXN3aXRjaChmbGFnKXsNCisJCWNhc2UgRXJyb3IgOiANCisJCQllcnJvclRocmVzaG9sZCB8PSBVbnVzZWRBcmd1bWVudDsNCisJCQlicmVhazsNCisJCWNhc2UgV2FybmluZyA6IA0KKwkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW51c2VkQXJndW1lbnQ7DQorCQkJYnJlYWs7DQogCX0NCiB9DQotcHVibGljIHZvaWQgaGFuZGxlVW51c2VkTG9jYWxWYXJpYWJsZUFzV2FybmluZyhib29sZWFuIGZsYWcpIHsNCi0JaWYgKGZsYWcpIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW51c2VkTG9jYWxWYXJpYWJsZTsNCi0JfSBlbHNlIHsNCi0JCXdhcm5pbmdUaHJlc2hvbGQgJj0gflVudXNlZExvY2FsVmFyaWFibGU7DQorcHVibGljIHZvaWQgc2V0VW51c2VkTG9jYWxWYXJpYWJsZVNldmVyaXR5KGludCBmbGFnKSB7DQorCWVycm9yVGhyZXNob2xkICY9IH5VbnVzZWRMb2NhbFZhcmlhYmxlOw0KKwl3YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRMb2NhbFZhcmlhYmxlOw0KKwlzd2l0Y2goZmxhZyl7DQorCQljYXNlIEVycm9yIDogDQorCQkJZXJyb3JUaHJlc2hvbGQgfD0gVW51c2VkTG9jYWxWYXJpYWJsZTsNCisJCQlicmVhazsNCisJCWNhc2UgV2FybmluZyA6IA0KKwkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gVW51c2VkTG9jYWxWYXJpYWJsZTsNCisJCQlicmVhazsNCiAJfQ0KIH0NCi1wdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0VtdWxhdGlvbkhhbmRsZWRBc1dhcm5pbmcoKSB7DQotCXJldHVybiAod2FybmluZ1RocmVzaG9sZCAmIEFjY2Vzc0VtdWxhdGlvbikgIT0gMDsNCitwdWJsaWMgdm9pZCBzZXROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsU2V2ZXJpdHkoaW50IGZsYWcpIHsNCisJZXJyb3JUaHJlc2hvbGQgJj0gfk5vbkV4dGVybmFsaXplZFN0cmluZzsNCisJd2FybmluZ1RocmVzaG9sZCAmPSB+Tm9uRXh0ZXJuYWxpemVkU3RyaW5nOw0KKwlzd2l0Y2goZmxhZyl7DQorCQljYXNlIEVycm9yIDogDQorCQkJZXJyb3JUaHJlc2hvbGQgfD0gTm9uRXh0ZXJuYWxpemVkU3RyaW5nOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXYXJuaW5nIDogDQorCQkJd2FybmluZ1RocmVzaG9sZCB8PSBOb25FeHRlcm5hbGl6ZWRTdHJpbmc7DQorCQkJYnJlYWs7DQorCX0JDQogfQ0KLXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRpb25Vc2VIYW5kbGVkQXNXYXJuaW5nKCkgew0KLQlyZXR1cm4gKHdhcm5pbmdUaHJlc2hvbGQgJiBVc2luZ0RlcHJlY2F0ZWRBUEkpICE9IDA7DQorcHVibGljIHZvaWQgc2V0QXNzZXJ0SWRlbnRpZmllclNldmVyaXR5KGludCBmbGFnKSB7DQorCWVycm9yVGhyZXNob2xkICY9IH5Bc3NlcnRVc2VkQXNBbklkZW50aWZpZXI7DQorCXdhcm5pbmdUaHJlc2hvbGQgJj0gfkFzc2VydFVzZWRBc0FuSWRlbnRpZmllcjsNCisJc3dpdGNoKGZsYWcpew0KKwkJY2FzZSBFcnJvciA6IA0KKwkJCWVycm9yVGhyZXNob2xkIHw9IEFzc2VydFVzZWRBc0FuSWRlbnRpZmllcjsNCisJCQlicmVhazsNCisJCWNhc2UgV2FybmluZyA6IA0KKwkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyOw0KKwkJCWJyZWFrOw0KKwl9CQ0KIH0NCi1wdWJsaWMgYm9vbGVhbiBpc0ltcG9ydFByb2JsZW1IYW5kbGVkQXNFcnJvcigpIHsNCi0JcmV0dXJuIChlcnJvclRocmVzaG9sZCAmIEltcG9ydFByb2JsZW0pICE9IDA7DQorcHVibGljIGludCBnZXRBY2Nlc3NFbXVsYXRpb25TZXZlcml0eSgpIHsNCisJaWYoKHdhcm5pbmdUaHJlc2hvbGQgJiBBY2Nlc3NFbXVsYXRpb24pICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgQWNjZXNzRW11bGF0aW9uKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KIH0NCi1wdWJsaWMgYm9vbGVhbiBpc01hc2tlZENhdGNoQmxvY2tIYW5kbGVkQXNXYXJuaW5nKCkgew0KLQlyZXR1cm4gKHdhcm5pbmdUaHJlc2hvbGQgJiBNYXNrZWRDYXRjaEJsb2NrKSAhPSAwOw0KK3B1YmxpYyBpbnQgZ2V0RGVwcmVjYXRpb25Vc2VTZXZlcml0eSgpIHsNCisJaWYoKHdhcm5pbmdUaHJlc2hvbGQgJiBVc2luZ0RlcHJlY2F0ZWRBUEkpICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgVXNpbmdEZXByZWNhdGVkQVBJKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KIH0NCi1wdWJsaWMgYm9vbGVhbiBpc01ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWVIYW5kbGVkQXNXYXJuaW5nKCkgew0KLQlyZXR1cm4gKHdhcm5pbmdUaHJlc2hvbGQgJiBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwOw0KK3B1YmxpYyBpbnQgZ2V0SW1wb3J0UHJvYmxlbVNldmVyaXR5KCkgew0KKwlpZigod2FybmluZ1RocmVzaG9sZCAmIEltcG9ydFByb2JsZW0pICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgSW1wb3J0UHJvYmxlbSkgIT0gMCkNCisJCXJldHVybiBFcnJvcjsNCisJcmV0dXJuIElnbm9yZTsNCiB9DQotcHVibGljIGJvb2xlYW4gaXNPYnNvbGV0ZUxpdGVyYWxBc0hhbmRsZWRFcnJvcigpIHsNCi0JcmV0dXJuIChlcnJvclRocmVzaG9sZCAmIFBhcnNpbmdPcHRpb25hbEVycm9yKSAhPSAwOw0KK3B1YmxpYyBpbnQgZ2V0TWFza2VkQ2F0Y2hCbG9ja1NldmVyaXR5KCkgew0KKwlpZigod2FybmluZ1RocmVzaG9sZCAmIE1hc2tlZENhdGNoQmxvY2spICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgTWFza2VkQ2F0Y2hCbG9jaykgIT0gMCkNCisJCXJldHVybiBFcnJvcjsNCisJcmV0dXJuIElnbm9yZTsNCiB9DQotcHVibGljIGJvb2xlYW4gaXNPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RIYW5kbGVkQXNXYXJuaW5nKCkgew0KLQlyZXR1cm4gKHdhcm5pbmdUaHJlc2hvbGQgJiBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QpICE9IDA7DQorcHVibGljIGludCBnZXRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lU2V2ZXJpdHkoKSB7DQorCWlmKCh3YXJuaW5nVGhyZXNob2xkICYgTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSkgIT0gMCkNCisJCXJldHVybiBXYXJuaW5nOw0KKwlpZigoZXJyb3JUaHJlc2hvbGQgJiBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KK30NCisNCitwdWJsaWMgaW50IGdldE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZFNldmVyaXR5KCkgew0KKwlpZigod2FybmluZ1RocmVzaG9sZCAmIE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZCkgIT0gMCkNCisJCXJldHVybiBXYXJuaW5nOw0KKwlpZigoZXJyb3JUaHJlc2hvbGQgJiBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QpICE9IDApDQorCQlyZXR1cm4gRXJyb3I7DQorCXJldHVybiBJZ25vcmU7DQogfQ0KIHB1YmxpYyBib29sZWFuIGlzUHJlc2VydmluZ0FsbExvY2FsVmFyaWFibGVzKCkgew0KIAlyZXR1cm4gdGhpcy5wcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzIDsNCkBAIC0yNjMsMTQgKzI4NCw0MCBAQAogcHVibGljIGJvb2xlYW4gaXNQcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDaGFuZ2luZ1Zpc2liaWxpdHkoKSB7DQogCXJldHVybiBpc1ByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0NoYW5naW5nVmlzaWJpbGl0eTsNCiB9DQotcHVibGljIGJvb2xlYW4gaXNVbnJlYWNoYWJsZUNvZGVIYW5kbGVkQXNFcnJvcigpIHsNCi0JcmV0dXJuIChlcnJvclRocmVzaG9sZCAmIFVucmVhY2hhYmxlQ29kZSkgIT0gMDsNCitwdWJsaWMgaW50IGdldFVucmVhY2hhYmxlQ29kZUhhbmRsZWRBc0Vycm9yKCkgew0KKwlpZigod2FybmluZ1RocmVzaG9sZCAmIFVucmVhY2hhYmxlQ29kZSkgIT0gMCkNCisJCXJldHVybiBXYXJuaW5nOw0KKwlpZigoZXJyb3JUaHJlc2hvbGQgJiBVbnJlYWNoYWJsZUNvZGUpICE9IDApDQorCQlyZXR1cm4gRXJyb3I7DQorCXJldHVybiBJZ25vcmU7DQogfQ0KLXB1YmxpYyBib29sZWFuIGlzVW51c2VkQXJndW1lbnRIYW5kbGVkQXNXYXJuaW5nKCkgew0KLQlyZXR1cm4gKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRBcmd1bWVudCkgIT0gMDsNCitwdWJsaWMgaW50IGdldFVudXNlZEFyZ3VtZW50U2V2ZXJpdHkoKSB7DQorCWlmKCh3YXJuaW5nVGhyZXNob2xkICYgVW51c2VkQXJndW1lbnQpICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgVW51c2VkQXJndW1lbnQpICE9IDApDQorCQlyZXR1cm4gRXJyb3I7DQorCXJldHVybiBJZ25vcmU7DQogfQ0KLXB1YmxpYyBib29sZWFuIGlzVW51c2VkTG9jYWxWYXJpYWJsZUhhbmRsZWRBc1dhcm5pbmcoKSB7DQotCXJldHVybiAod2FybmluZ1RocmVzaG9sZCAmIFVudXNlZExvY2FsVmFyaWFibGUpICE9IDA7DQorcHVibGljIGludCBnZXRVbnVzZWRMb2NhbFZhcmlhYmxlU2V2ZXJpdHkoKSB7DQorCWlmKCh3YXJuaW5nVGhyZXNob2xkICYgVW51c2VkTG9jYWxWYXJpYWJsZSkgIT0gMCkNCisJCXJldHVybiBXYXJuaW5nOw0KKwlpZigoZXJyb3JUaHJlc2hvbGQgJiBVbnVzZWRMb2NhbFZhcmlhYmxlKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KK30NCitwdWJsaWMgaW50IGdldE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxTZXZlcml0eSgpIHsNCisJaWYoKHdhcm5pbmdUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KK30NCitwdWJsaWMgaW50IGdldEFzc2VydElkZW50aWZpZXJTZXZlcml0eSgpIHsNCisJaWYoKHdhcm5pbmdUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApDQorCQlyZXR1cm4gV2FybmluZzsNCisJaWYoKGVycm9yVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwKQ0KKwkJcmV0dXJuIEVycm9yOw0KKwlyZXR1cm4gSWdub3JlOw0KIH0NCiBwdWJsaWMgdm9pZCBwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzKGJvb2xlYW4gZmxhZykgew0KIAl0aGlzLnByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMgPSBmbGFnOw0KQEAgLTI4OCwyMjYgKzMzNSwzMTEgQEAKIAl0aGlzLmVycm9yVGhyZXNob2xkID0gZXJyb3JNYXNrOw0KIH0NCiAvKioNCi0gKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgb3B0aW9uIG51bWJlcg0KLSAqDQotICogQHBhcmFtIG9wdGlvbk51bWJlciA8Q09ERT5pbnQ8L0NPREU+DQotICogQHBhcmFtIHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA8Q09ERT5pbnQ8L0NPREU+DQorICogQ2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9wdGlvbiBJRA0KICAqLw0KIHZvaWQgc2V0T3B0aW9uKENvbmZpZ3VyYWJsZU9wdGlvbiBzZXR0aW5nKSB7DQorCVN0cmluZyBjb21wb25lbnROYW1lID0gQ29tcGlsZXIuY2xhc3MuZ2V0TmFtZSgpOw0KIAkNCi0Jc3dpdGNoIChzZXR0aW5nLmdldElEKCkpIHsNCi0JCWNhc2UgMSA6IC8vIExvY2FsIHZhcmlhYmxlIHRhYmxlIGF0dHJpYnV0ZQ0KLQkJCWlmIChzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCkgew0KLQkJCQkvLyBzZXQgdGhlIGRlYnVnIGZsYWcgd2l0aCBWYXJzLg0KLQkJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzIHw9IFZhcnM7DQotCQkJfSBlbHNlIHsNCi0JCQkJcHJvZHVjZURlYnVnQXR0cmlidXRlcyAmPSB+VmFyczsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQljYXNlIDIgOiAvLyBMaW5lIG51bWJlciBhdHRyaWJ1dGUNCi0JCQlpZiAoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApIHsNCi0JCQkJLy8gc2V0IHRoZSBkZWJ1ZyBmbGFnIHdpdGggTGluZXMNCi0JCQkJcHJvZHVjZURlYnVnQXR0cmlidXRlcyB8PSBMaW5lczsNCi0JCQl9IGVsc2Ugew0KLQkJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzICY9IH5MaW5lczsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQljYXNlIDMgOiAvLyBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUNCi0JCQlpZiAoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApIHsNCi0JCQkJLy8gc2V0IHRoZSBkZWJ1ZyBmbGFnIHdpdGggU291cmNlLg0KLQkJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzIHw9IFNvdXJjZTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzICY9IH5Tb3VyY2U7DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0IDogLy8gcHJlc2VydmVBbGxMb2NhbHMgZmxhZw0KLQkJCXByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA1IDogLy8gdW5yZWFjaGFibGUgY29kZSByZXBvcnRlZCBhcyBlcnJvcg0KLQkJCWhhbmRsZVVucmVhY2hhYmxlQ29kZUFzRXJyb3Ioc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA2IDogLy8gaW52YWxpZCBpbXBvcnQNCi0JCQloYW5kbGVJbXBvcnRQcm9ibGVtQXNFcnJvcihzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDcgOiAvLyBtZXRob2RzIHdpdGggY29uc3RydWN0b3IgbmFtZQ0KLQkJCWhhbmRsZU1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWVBc1dhcm5pbmcoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA4IDogLy8gb3ZlcnJpZGRlbiBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kDQotCQkJaGFuZGxlT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kQXNXYXJuaW5nKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgOSA6IC8vIHVzZSBvZiBkZXByZWNhdGVkIEFQSQ0KLQkJCWhhbmRsZURlcHJlY2F0aW9uVXNlQXNXYXJuaW5nKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTAgOiAvLyBjYXRjaCBibG9jayBoaWRkZW4gYnkgYW5vdGhlciBvbmUNCi0JCQloYW5kbGVNYXNrZWRDYXRjaEJsb2NrQXNXYXJuaW5nKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTEgOiAvLyBsb2NhbCB2YXJpYWJsZSBub3QgdXNlZA0KLQkJCWhhbmRsZVVudXNlZExvY2FsVmFyaWFibGVBc1dhcm5pbmcoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMiA6IC8vIGFyZ3VtZW50IG5vdCB1c2VkDQotCQkJaGFuZGxlVW51c2VkQXJndW1lbnRBc1dhcm5pbmcoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMyA6IC8vIHRlbXBvcmFyeSB3YXJuaW5nDQotCQkJaWYgKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKSB7DQotCQkJCXdhcm5pbmdUaHJlc2hvbGQgfD0gVGVtcG9yYXJ5V2FybmluZzsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQljYXNlIDE0IDogLy8gdGFyZ2V0IEpESw0KLQkJCXNldFRhcmdldEpESyhzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCA/IEpESzFfMSA6IEpESzFfMik7DQotCQkJYnJlYWs7DQotCQljYXNlIDE1OiAvLyBzeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbg0KLQkJCWhhbmRsZUFjY2Vzc0VtdWxhdGlvbkFzV2FybmluZyhzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE2OiAvLyBub24gZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFsDQotCQkJaGFuZGxlTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbEFzV2FybmluZyhzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQkJYnJlYWs7DQorCVN0cmluZyBvcHRpb25JRCA9IHNldHRpbmcuZ2V0SUQoKTsNCisJDQorCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSkpew0KKwkJaWYgKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpID09IDApIHsNCisJCQkvLyBzZXQgdGhlIGRlYnVnIGZsYWcgd2l0aCBWYXJzLg0KKwkJCXByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgfD0gVmFyczsNCisJCX0gZWxzZSB7DQorCQkJcHJvZHVjZURlYnVnQXR0cmlidXRlcyAmPSB+VmFyczsNCisJCX0NCisJfSBlbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fTGluZU51bWJlckF0dHJpYnV0ZSkpIHsNCisJCWlmIChzZXR0aW5nLmdldFZhbHVlSW5kZXgoKSA9PSAwKSB7DQorCQkJLy8gc2V0IHRoZSBkZWJ1ZyBmbGFnIHdpdGggTGluZXMNCisJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzIHw9IExpbmVzOw0KKwkJfSBlbHNlIHsNCisJCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzICY9IH5MaW5lczsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlKSkgew0KKwkJaWYgKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpID09IDApIHsNCisJCQkvLyBzZXQgdGhlIGRlYnVnIGZsYWcgd2l0aCBTb3VyY2UuDQorCQkJcHJvZHVjZURlYnVnQXR0cmlidXRlcyB8PSBTb3VyY2U7DQorCQl9IGVsc2Ugew0KKwkJCXByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJj0gflNvdXJjZTsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9QcmVzZXJ2ZVVudXNlZExvY2FsKSl7DQorCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpID09IDApOw0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydFVucmVhY2hhYmxlQ29kZSkpew0KKwkJc3dpdGNoKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpKXsNCisJCQljYXNlIDAgOiANCisJCQkJc2V0VW5yZWFjaGFibGVDb2RlU2V2ZXJpdHkoRXJyb3IpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEgOg0KKwkJCQlzZXRVbnJlYWNoYWJsZUNvZGVTZXZlcml0eShXYXJuaW5nKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyIDogDQorCQkJCXNldFVucmVhY2hhYmxlQ29kZVNldmVyaXR5KElnbm9yZSk7DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydEludmFsaWRJbXBvcnQpKXsNCisJCXN3aXRjaChzZXR0aW5nLmdldFZhbHVlSW5kZXgoKSl7DQorCQkJY2FzZSAwIDogDQorCQkJCXNldEltcG9ydFByb2JsZW1TZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldEltcG9ydFByb2JsZW1TZXZlcml0eShXYXJuaW5nKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyIDoNCisJCQkJc2V0SW1wb3J0UHJvYmxlbVNldmVyaXR5KElnbm9yZSk7DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1RhcmdldFBsYXRmb3JtKSl7DQorCQlzZXRUYXJnZXRKREsoc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkgPT0gMCA/IEpESzFfMSA6IEpESzFfMik7DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSkpew0KKwkJc3dpdGNoKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpKXsNCisJCQljYXNlIDAgOiANCisJCQkJc2V0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZVNldmVyaXR5KEVycm9yKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxIDoNCisJCQkJc2V0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZVNldmVyaXR5KFdhcm5pbmcpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIgOg0KKwkJCQlzZXRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lU2V2ZXJpdHkoSWdub3JlKTsNCisJCQkJYnJlYWs7DQorCQl9DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kKSl7DQorCQlzd2l0Y2goc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkpew0KKwkJCWNhc2UgMCA6IA0KKwkJCQlzZXRPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RTZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZFNldmVyaXR5KFdhcm5pbmcpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIgOg0KKwkJCQlzZXRPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RTZXZlcml0eShJZ25vcmUpOw0KKwkJCQlicmVhazsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnREZXByZWNhdGlvbikpew0KKwkJc3dpdGNoKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpKXsNCisJCQljYXNlIDAgOiANCisJCQkJc2V0RGVwcmVjYXRpb25Vc2VTZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldERlcHJlY2F0aW9uVXNlU2V2ZXJpdHkoV2FybmluZyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMiA6DQorCQkJCXNldERlcHJlY2F0aW9uVXNlU2V2ZXJpdHkoSWdub3JlKTsNCisJCQkJYnJlYWs7DQorCQl9DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaykpew0KKwkJc3dpdGNoKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpKXsNCisJCQljYXNlIDAgOiANCisJCQkJc2V0TWFza2VkQ2F0Y2hCbG9ja1NldmVyaXR5KEVycm9yKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxIDoNCisJCQkJc2V0TWFza2VkQ2F0Y2hCbG9ja1NldmVyaXR5KFdhcm5pbmcpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIgOg0KKwkJCQlzZXRNYXNrZWRDYXRjaEJsb2NrU2V2ZXJpdHkoSWdub3JlKTsNCisJCQkJYnJlYWs7DQorCQl9DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0VW51c2VkTG9jYWwpKXsNCisJCXN3aXRjaChzZXR0aW5nLmdldFZhbHVlSW5kZXgoKSl7DQorCQkJY2FzZSAwIDogDQorCQkJCXNldFVudXNlZExvY2FsVmFyaWFibGVTZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldFVudXNlZExvY2FsVmFyaWFibGVTZXZlcml0eShXYXJuaW5nKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyIDoNCisJCQkJc2V0VW51c2VkTG9jYWxWYXJpYWJsZVNldmVyaXR5KElnbm9yZSk7DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcikpew0KKwkJc3dpdGNoKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpKXsNCisJCQljYXNlIDAgOiANCisJCQkJc2V0VW51c2VkQXJndW1lbnRTZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldFVudXNlZEFyZ3VtZW50U2V2ZXJpdHkoV2FybmluZyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMiA6DQorCQkJCXNldFVudXNlZEFyZ3VtZW50U2V2ZXJpdHkoSWdub3JlKTsNCisJCQkJYnJlYWs7DQorCQl9DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uKSl7DQorCQlzd2l0Y2goc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkpew0KKwkJCWNhc2UgMCA6IA0KKwkJCQlzZXRBY2Nlc3NFbXVsYXRpb25TZXZlcml0eShFcnJvcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSA6DQorCQkJCXNldEFjY2Vzc0VtdWxhdGlvblNldmVyaXR5KFdhcm5pbmcpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIgOg0KKwkJCQlzZXRBY2Nlc3NFbXVsYXRpb25TZXZlcml0eShJZ25vcmUpOw0KKwkJCQlicmVhazsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKSl7DQorCQlzd2l0Y2goc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkpew0KKwkJCWNhc2UgMCA6IA0KKwkJCQlzZXROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsU2V2ZXJpdHkoRXJyb3IpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEgOg0KKwkJCQlzZXROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsU2V2ZXJpdHkoV2FybmluZyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMiA6DQorCQkJCXNldE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxTZXZlcml0eShJZ25vcmUpOw0KKwkJCQlicmVhazsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRBc3NlcnRJZGVudGlmaWVyKSl7DQorCQlzd2l0Y2goc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkpew0KKwkJCWNhc2UgMCA6IA0KKwkJCQlzZXRBc3NlcnRJZGVudGlmaWVyU2V2ZXJpdHkoRXJyb3IpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEgOg0KKwkJCQlzZXRBc3NlcnRJZGVudGlmaWVyU2V2ZXJpdHkoV2FybmluZyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMiA6DQorCQkJCXNldEFzc2VydElkZW50aWZpZXJTZXZlcml0eShJZ25vcmUpOw0KKwkJCQlicmVhazsNCisJCX0NCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9Tb3VyY2UpKXsNCisJCXNldEFzc2VydE1vZGUoc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkgPT0gMSk7DQogCX0NCiB9DQorDQogcHVibGljIHZvaWQgc2V0VGFyZ2V0SkRLKGludCB2bUlEKSB7DQogCXRoaXMudGFyZ2V0SkRLID0gdm1JRDsNCiB9DQogcHVibGljIHZvaWQgc2V0VmVyYm9zZU1vZGUoYm9vbGVhbiBmbGFnKSB7DQogCXRoaXMudmVyYm9zZSA9IGZsYWc7DQogfQ0KK3B1YmxpYyB2b2lkIHNldEFzc2VydE1vZGUoYm9vbGVhbiBhc3NlcnRNb2RlKSB7DQorCXRoaXMuYXNzZXJ0TW9kZSA9IGFzc2VydE1vZGU7DQorfQ0KIHB1YmxpYyB2b2lkIHNldFdhcm5pbmdUaHJlc2hvbGQoaW50IHdhcm5pbmdNYXNrKSB7DQogCXRoaXMud2FybmluZ1RocmVzaG9sZCA9IHdhcm5pbmdNYXNrOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIA0KLQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQ29tcGlsZXJPcHRpb25zOiIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbXBpbGVyT3B0aW9uczoiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBWYXJzKSAhPSAwKXsNCi0JCWJ1Zi5hcHBlbmQoIlxuLWxvY2FsIHZhcmlhYmxlcyBkZWJ1ZyBhdHRyaWJ1dGVzOiBPTiIvKm5vbk5MUyovKTsNCisJCWJ1Zi5hcHBlbmQoIlxuLWxvY2FsIHZhcmlhYmxlcyBkZWJ1ZyBhdHRyaWJ1dGVzOiBPTiIpOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlidWYuYXBwZW5kKCJcbi1sb2NhbCB2YXJpYWJsZXMgZGVidWcgYXR0cmlidXRlczogT0ZGIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG4tbG9jYWwgdmFyaWFibGVzIGRlYnVnIGF0dHJpYnV0ZXM6IE9GRiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKChwcm9kdWNlRGVidWdBdHRyaWJ1dGVzICYgTGluZXMpICE9IDApew0KLQkJYnVmLmFwcGVuZCgiXG4tbGluZSBudW1iZXIgZGVidWcgYXR0cmlidXRlczogT04iLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1saW5lIG51bWJlciBkZWJ1ZyBhdHRyaWJ1dGVzOiBPTiIpOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlidWYuYXBwZW5kKCJcbi1saW5lIG51bWJlciBkZWJ1ZyBhdHRyaWJ1dGVzOiBPRkYiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1saW5lIG51bWJlciBkZWJ1ZyBhdHRyaWJ1dGVzOiBPRkYiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmICgocHJvZHVjZURlYnVnQXR0cmlidXRlcyAmIFNvdXJjZSkgIT0gMCl7DQotCQlidWYuYXBwZW5kKCJcbi1zb3VyY2UgZGVidWcgYXR0cmlidXRlczogT04iLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1zb3VyY2UgZGVidWcgYXR0cmlidXRlczogT04iKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJYnVmLmFwcGVuZCgiXG4tc291cmNlIGRlYnVnIGF0dHJpYnV0ZXM6IE9GRiIvKm5vbk5MUyovKTsNCisJCWJ1Zi5hcHBlbmQoIlxuLXNvdXJjZSBkZWJ1ZyBhdHRyaWJ1dGVzOiBPRkYiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzKXsNCi0JCWJ1Zi5hcHBlbmQoIlxuLXByZXNlcnZlIGFsbCBsb2NhbCB2YXJpYWJsZXM6IE9OIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG4tcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlczogT04iKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJYnVmLmFwcGVuZCgiXG4tcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlczogT0ZGIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG4tcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlczogT0ZGIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoKGVycm9yVGhyZXNob2xkICYgVW5yZWFjaGFibGVDb2RlKSAhPSAwKXsNCi0JCWJ1Zi5hcHBlbmQoIlxuLXVucmVhY2hhYmxlIGNvZGU6IEVSUk9SIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG4tdW5yZWFjaGFibGUgY29kZTogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgVW5yZWFjaGFibGVDb2RlKSAhPSAwKXsNCi0JCQlidWYuYXBwZW5kKCJcbi11bnJlYWNoYWJsZSBjb2RlOiBXQVJOSU5HIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXVucmVhY2hhYmxlIGNvZGU6IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBlbHNlIHsNCi0JCQlidWYuYXBwZW5kKCJcbi11bnJlYWNoYWJsZSBjb2RlOiBJR05PUkUiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tdW5yZWFjaGFibGUgY29kZTogSUdOT1JFIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlpZiAoKGVycm9yVGhyZXNob2xkICYgSW1wb3J0UHJvYmxlbSkgIT0gMCl7DQotCQlidWYuYXBwZW5kKCJcbi1pbXBvcnQgcHJvYmxlbTogRVJST1IiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1pbXBvcnQgcHJvYmxlbTogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgSW1wb3J0UHJvYmxlbSkgIT0gMCl7DQotCQkJYnVmLmFwcGVuZCgiXG4taW1wb3J0IHByb2JsZW06IFdBUk5JTkciLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4taW1wb3J0IHByb2JsZW06IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBlbHNlIHsNCi0JCQlidWYuYXBwZW5kKCJcbi1pbXBvcnQgcHJvYmxlbTogSUdOT1JFIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLWltcG9ydCBwcm9ibGVtOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwKXsNCi0JCWJ1Zi5hcHBlbmQoIlxuLW1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWU6IEVSUk9SIi8qbm9uTkxTKi8pOwkJDQorCQlidWYuYXBwZW5kKCJcbi1tZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lOiBFUlJPUiIpOwkJIC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUpICE9IDApew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLW1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWU6IFdBUk5JTkciLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tbWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZTogV0FSTklORyIpOyAvLyROT04tTkxTLTEkDQogCQl9IGVsc2Ugew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLW1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWU6IElHTk9SRSIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi1tZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QpICE9IDApew0KLQkJYnVmLmFwcGVuZCgiXG4tb3ZlcnJpZGRlbiBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kOiBFUlJPUiIvKm5vbk5MUyovKTsNCisJCWJ1Zi5hcHBlbmQoIlxuLW92ZXJyaWRkZW4gcGFja2FnZSBkZWZhdWx0IG1ldGhvZDogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kKSAhPSAwKXsNCi0JCQlidWYuYXBwZW5kKCJcbi1vdmVycmlkZGVuIHBhY2thZ2UgZGVmYXVsdCBtZXRob2Q6IFdBUk5JTkciLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tb3ZlcnJpZGRlbiBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0gZWxzZSB7DQotCQkJYnVmLmFwcGVuZCgiXG4tb3ZlcnJpZGRlbiBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kOiBJR05PUkUiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tb3ZlcnJpZGRlbiBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBVc2luZ0RlcHJlY2F0ZWRBUEkpICE9IDApew0KLQkJYnVmLmFwcGVuZCgiXG4tZGVwcmVjYXRpb246IEVSUk9SIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG4tZGVwcmVjYXRpb246IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIFVzaW5nRGVwcmVjYXRlZEFQSSkgIT0gMCl7DQotCQkJYnVmLmFwcGVuZCgiXG4tZGVwcmVjYXRpb246IFdBUk5JTkciLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tZGVwcmVjYXRpb246IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBlbHNlIHsNCi0JCQlidWYuYXBwZW5kKCJcbi1kZXByZWNhdGlvbjogSUdOT1JFIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLWRlcHJlY2F0aW9uOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBNYXNrZWRDYXRjaEJsb2NrKSAhPSAwKXsNCi0JCWJ1Zi5hcHBlbmQoIlxuLW1hc2tlZCBjYXRjaCBibG9jazogRVJST1IiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1tYXNrZWQgY2F0Y2ggYmxvY2s6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIE1hc2tlZENhdGNoQmxvY2spICE9IDApew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLW1hc2tlZCBjYXRjaCBibG9jazogV0FSTklORyIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi1tYXNrZWQgY2F0Y2ggYmxvY2s6IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBlbHNlIHsNCi0JCQlidWYuYXBwZW5kKCJcbi1tYXNrZWQgY2F0Y2ggYmxvY2s6IElHTk9SRSIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi1tYXNrZWQgY2F0Y2ggYmxvY2s6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJaWYgKChlcnJvclRocmVzaG9sZCAmIFVudXNlZExvY2FsVmFyaWFibGUpICE9IDApew0KLQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIGxvY2FsIHZhcmlhYmxlOiBFUlJPUiIvKm5vbk5MUyovKTsNCisJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBsb2NhbCB2YXJpYWJsZTogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgVW51c2VkTG9jYWxWYXJpYWJsZSkgIT0gMCl7DQotCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIGxvY2FsIHZhcmlhYmxlOiBXQVJOSU5HIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBsb2NhbCB2YXJpYWJsZTogV0FSTklORyIpOyAvLyROT04tTkxTLTEkDQogCQl9IGVsc2Ugew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBsb2NhbCB2YXJpYWJsZTogSUdOT1JFIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBsb2NhbCB2YXJpYWJsZTogSUdOT1JFIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlpZiAoKGVycm9yVGhyZXNob2xkICYgVW51c2VkQXJndW1lbnQpICE9IDApew0KLQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIHBhcmFtZXRlcjogRVJST1IiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgcGFyYW1ldGVyOiBFUlJPUiIpOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQogCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRBcmd1bWVudCkgIT0gMCl7DQotCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIHBhcmFtZXRlcjogV0FSTklORyIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgcGFyYW1ldGVyOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0gZWxzZSB7DQotCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIHBhcmFtZXRlcjogSUdOT1JFIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBwYXJhbWV0ZXI6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJaWYgKChlcnJvclRocmVzaG9sZCAmIEFjY2Vzc0VtdWxhdGlvbikgIT0gMCl7DQotCQlidWYuYXBwZW5kKCJcbi1zeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbjogRVJST1IiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1zeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbjogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQWNjZXNzRW11bGF0aW9uKSAhPSAwKXsNCi0JCQlidWYuYXBwZW5kKCJcbi1zeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbjogV0FSTklORyIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi1zeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbjogV0FSTklORyIpOyAvLyROT04tTkxTLTEkDQogCQl9IGVsc2Ugew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLXN5bnRoZXRpYyBhY2Nlc3MgZW11bGF0aW9uOiBJR05PUkUiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tc3ludGhldGljIGFjY2VzcyBlbXVsYXRpb246IElHTk9SRSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJaWYgKChlcnJvclRocmVzaG9sZCAmIE5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gMCl7DQotCQlidWYuYXBwZW5kKCJcbi1ub24gZXh0ZXJuYWxpemVkIHN0cmluZzogRVJST1IiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCJcbi1ub24gZXh0ZXJuYWxpemVkIHN0cmluZzogRVJST1IiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwKXsNCi0JCQlidWYuYXBwZW5kKCJcbi1ub24gZXh0ZXJuYWxpemVkIHN0cmluZzogV0FSTklORyIvKm5vbk5MUyovKTsNCisJCQlidWYuYXBwZW5kKCJcbi1ub24gZXh0ZXJuYWxpemVkIHN0cmluZzogV0FSTklORyIpOyAvLyROT04tTkxTLTEkDQogCQl9IGVsc2Ugew0KLQkJCWJ1Zi5hcHBlbmQoIlxuLW5vbiBleHRlcm5hbGl6ZWQgc3RyaW5nOiBJR05PUkUiLypub25OTFMqLyk7DQorCQkJYnVmLmFwcGVuZCgiXG4tbm9uIGV4dGVybmFsaXplZCBzdHJpbmc6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJc3dpdGNoKHRhcmdldEpESyl7DQogCQljYXNlIEpESzFfMSA6DQotCQkJYnVmLmFwcGVuZCgiXG4tdGFyZ2V0IEpESzogMS4xIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXRhcmdldCBKREs6IDEuMSIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIEpESzFfMiA6DQotCQkJYnVmLmFwcGVuZCgiXG4tdGFyZ2V0IEpESzogMS4yIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIlxuLXRhcmdldCBKREs6IDEuMiIpOyAvLyROT04tTkxTLTEkDQogCX0NCi0JYnVmLmFwcGVuZCgiXG4tdmVyYm9zZSA6ICIvKm5vbk5MUyovICsgKHZlcmJvc2UgPyAiT04iLypub25OTFMqLyA6ICJPRkYiLypub25OTFMqLykpOw0KLQlidWYuYXBwZW5kKCJcbi1wcm9kdWNlIHJlZmVyZW5jZSBpbmZvIDogIi8qbm9uTkxTKi8gKyAocHJvZHVjZVJlZmVyZW5jZUluZm8gPyAiT04iLypub25OTFMqLyA6ICJPRkYiLypub25OTFMqLykpOw0KLQlidWYuYXBwZW5kKCJcbi1wYXJzZSBsaXRlcmFsIGV4cHJlc3Npb25zIGFzIGNvbnN0YW50cyA6ICIvKm5vbk5MUyovICsgKHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMgPyAiT04iLypub25OTFMqLyA6ICJPRkYiLypub25OTFMqLykpOw0KLQlidWYuYXBwZW5kKCJcbi1ydW50aW1lIGV4Y2VwdGlvbiBuYW1lIGZvciBjb21waWxlIGVycm9yIDogIi8qbm9uTkxTKi8gKyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvcik7DQorCWJ1Zi5hcHBlbmQoIlxuLXZlcmJvc2UgOiAiICsgKHZlcmJvc2UgPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCisJYnVmLmFwcGVuZCgiXG4tcHJvZHVjZSByZWZlcmVuY2UgaW5mbyA6ICIgKyAocHJvZHVjZVJlZmVyZW5jZUluZm8gPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCisJYnVmLmFwcGVuZCgiXG4tcGFyc2UgbGl0ZXJhbCBleHByZXNzaW9ucyBhcyBjb25zdGFudHMgOiAiICsgKHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMgPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCisJYnVmLmFwcGVuZCgiXG4tcnVudGltZSBleGNlcHRpb24gbmFtZSBmb3IgY29tcGlsZSBlcnJvciA6ICIgKyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvcik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIH0NCi0NCi1wdWJsaWMgdm9pZCBoYW5kbGVOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsQXNXYXJuaW5nKGJvb2xlYW4gZmxhZykgew0KLQlpZiAoZmxhZykgew0KLQkJd2FybmluZ1RocmVzaG9sZCB8PSBOb25FeHRlcm5hbGl6ZWRTdHJpbmc7DQotCX0gZWxzZSB7DQotCQl3YXJuaW5nVGhyZXNob2xkICY9IH5Ob25FeHRlcm5hbGl6ZWRTdHJpbmc7DQotCX0NCi19DQotDQotcHVibGljIGJvb2xlYW4gaXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsSGFuZGxlZEFzV2FybmluZygpIHsNCi0JcmV0dXJuICh3YXJuaW5nVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwOw0KLX0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uZmlndXJhYmxlUHJvYmxlbXMuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbmZpZ3VyYWJsZVByb2JsZW1zLmphdmEKaW5kZXggNDQ4MmZkOS4uMDMzODQzZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uZmlndXJhYmxlUHJvYmxlbXMuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db25maWd1cmFibGVQcm9ibGVtcy5qYXZhCkBAIC05LDcgKzksNiBAQAogDQogcHVibGljIGludGVyZmFjZSBDb25maWd1cmFibGVQcm9ibGVtcyB7DQogCWZpbmFsIGludCBVbnJlYWNoYWJsZUNvZGUgPSAweDEwMDsNCi0JZmluYWwgaW50IFBhcnNpbmdPcHRpb25hbEVycm9yID0gMHgyMDA7DQogCWZpbmFsIGludCBJbXBvcnRQcm9ibGVtID0gMHg0MDA7DQogCWZpbmFsIGludCBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lID0gMHgxMDAwOw0KIAlmaW5hbCBpbnQgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kID0gMHgyMDAwOw0KQEAgLTIwLDQgKzE5LDUgQEAKIAlmaW5hbCBpbnQgVGVtcG9yYXJ5V2FybmluZyA9IDB4NDAwMDA7DQogCWZpbmFsIGludCBBY2Nlc3NFbXVsYXRpb24gPSAweDgwMDAwOw0KIAlmaW5hbCBpbnQgTm9uRXh0ZXJuYWxpemVkU3RyaW5nID0gMHgxMDAwMDA7DQorCWZpbmFsIGludCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgPSAweDIwMDAwMDsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbnN0YW50LmphdmEKaW5kZXggOTJiNTVkZC4uOGYwNTk1MSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db25zdGFudC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEludENvbnN0YW50IFR3byA9IG5ldyBJbnRDb25zdGFudCgyKTsNCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBPbmUgPSBuZXcgSW50Q29uc3RhbnQoMSk7DQogcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgew0KLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIvKm5vbk5MUyovLHR5cGVOYW1lKCksImJvb2xlYW4iLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiYm9vbGVhbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogfQ0KIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsNCi0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLypub25OTFMqLyx0eXBlTmFtZSgpLCJieXRlIi8qbm9uTkxTKi8pKTsNCisJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImJ5dGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIH0NCiBwdWJsaWMgZmluYWwgQ29uc3RhbnQgY2FzdFRvKGludCBjb252ZXJzaW9uVG9UYXJnZXRUeXBlKXsNCiAJLy90aGUgY2FzdCBpcyBhbiBpbnQgb2YgdGhlIGZvcm0NCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlyZXR1cm4gTm90QUNvbnN0YW50IDsNCiB9DQogcHVibGljIGNoYXIgY2hhclZhbHVlKCkgew0KLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIvKm5vbk5MUyovLHR5cGVOYW1lKCksImNoYXIiLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiY2hhciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogfQ0KIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGNzdCwgaW50IGlkLCBpbnQgb3BlcmF0b3IpIHsNCiAJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gDQpAQCAtMTQxNiwxMCArMTQxNiwxMCBAQAogDQogCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUgDQogcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsNCi0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLypub25OTFMqLyx0eXBlTmFtZSgpLCJkb3VibGUiLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZG91YmxlIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7DQotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIi8qbm9uTkxTKi8sdHlwZU5hbWUoKSwiZmxvYXQiLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZmxvYXQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShieXRlIHZhbHVlKSB7DQogCXJldHVybiBuZXcgQnl0ZUNvbnN0YW50KHZhbHVlKTsNCkBAIC0xNDUwLDM2ICsxNDUwLDM2IEBACiAJcmV0dXJuIG5ldyBCb29sZWFuQ29uc3RhbnQodmFsdWUpOw0KIH0NCiBwdWJsaWMgaW50IGludFZhbHVlKCkgew0KLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIvKm5vbk5MUyovLHR5cGVOYW1lKCksImludCIvKm5vbk5MUyovKSk7DQorCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJpbnQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7DQotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIi8qbm9uTkxTKi8sdHlwZU5hbWUoKSwibG9uZyIvKm5vbk5MUyovKSk7DQorCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJsb25nIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7DQotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDb252ZXJ0ZWRUbyIvKm5vbk5MUyovLHR5cGVOYW1lKCksInNob3J0Ii8qbm9uTkxTKi8pKTsNCisJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENvbnZlcnRlZFRvIix0eXBlTmFtZSgpLCJzaG9ydCIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIC8qKiBEZXByZWNhdGVkDQogKi8NCiBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgew0KLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8iLypub25OTFMqLyx0eXBlTmFtZSgpLCJTdHJpbmciLypub25OTFMqLykpOw0KKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8iLHR5cGVOYW1lKCksIlN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCi0JaWYgKHRoaXMgPT0gTm90QUNvbnN0YW50KSByZXR1cm4gIihDb25zdGFudCkgTm90QUNvbnN0YW50Ii8qbm9uTkxTKi8gOw0KKwlpZiAodGhpcyA9PSBOb3RBQ29uc3RhbnQpIHJldHVybiAiKENvbnN0YW50KSBOb3RBQ29uc3RhbnQiIDsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsgfQ0KIHB1YmxpYyBhYnN0cmFjdCBpbnQgdHlwZUlEKCk7DQogcHVibGljIFN0cmluZyB0eXBlTmFtZSgpIHsNCiAJc3dpdGNoICh0eXBlSUQoKSkgew0KLQkJY2FzZSBUX2ludCA6IHJldHVybiAiaW50Ii8qbm9uTkxTKi87DQotCQljYXNlIFRfYnl0ZSA6IHJldHVybiAiYnl0ZSIvKm5vbk5MUyovOw0KLQkJY2FzZSBUX3Nob3J0IDogcmV0dXJuICJzaG9ydCIvKm5vbk5MUyovOw0KLQkJY2FzZSBUX2NoYXIgOiByZXR1cm4gImNoYXIiLypub25OTFMqLzsNCi0JCWNhc2UgVF9mbG9hdCA6IHJldHVybiAiZmxvYXQiLypub25OTFMqLzsNCi0JCWNhc2UgVF9kb3VibGUgOiByZXR1cm4gImRvdWJsZSIvKm5vbk5MUyovOw0KLQkJY2FzZSBUX2Jvb2xlYW4gOiByZXR1cm4gImJvb2xlYW4iLypub25OTFMqLzsNCi0JCWNhc2UgVF9TdHJpbmcgOiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciLypub25OTFMqLzsNCi0JCWNhc2UgVF9udWxsIDogcmV0dXJuICJudWxsIi8qbm9uTkxTKi87CQ0KLQkJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIi8qbm9uTkxTKi87DQorCQljYXNlIFRfaW50IDogcmV0dXJuICJpbnQiOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFRfYnl0ZSA6IHJldHVybiAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgVF9zaG9ydCA6IHJldHVybiAic2hvcnQiOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFRfY2hhciA6IHJldHVybiAiY2hhciI7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgVF9mbG9hdCA6IHJldHVybiAiZmxvYXQiOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFRfZG91YmxlIDogcmV0dXJuICJkb3VibGUiOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFRfYm9vbGVhbiA6IHJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgVF9TdHJpbmcgOiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFRfbnVsbCA6IHJldHVybiAibnVsbCI7CSAvLyROT04tTkxTLTEkDQorCQlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0RvdWJsZUNvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhCmluZGV4IDUyMjQ3NGMuLjAzNzk0YjIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0RvdWJsZUNvbnN0YW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRG91YmxlQ29uc3RhbnQuamF2YQpAQCAtMzYsMTQgKzM2LDE0IEBACiAJDQogCVN0cmluZyBzID0gbmV3IERvdWJsZSh2YWx1ZSkudG9TdHJpbmcoKSA7DQogCWlmIChzID09IG51bGwpDQotCQlyZXR1cm4gIm51bGwiLypub25OTFMqLzsNCisJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KIAkJcmV0dXJuIHM7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCi0JaWYgKHRoaXMgPT0gTm90QUNvbnN0YW50KSByZXR1cm4gIihDb25zdGFudCkgTm90QUNvbnN0YW50Ii8qbm9uTkxTKi8gOw0KLQlyZXR1cm4gIihkb3VibGUpIi8qbm9uTkxTKi8gKyB2YWx1ZSA7IH0NCisJaWYgKHRoaXMgPT0gTm90QUNvbnN0YW50KSByZXR1cm4gIihDb25zdGFudCkgTm90QUNvbnN0YW50IiA7IC8vJE5PTi1OTFMtMSQNCisJcmV0dXJuICIoZG91YmxlKSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJA0KIHB1YmxpYyBpbnQgdHlwZUlEKCkgew0KIAlyZXR1cm4gVF9kb3VibGU7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YQppbmRleCA0ODNlZjVkLi44ZTQxMWNmIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9GbG9hdENvbnN0YW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRmxvYXRDb25zdGFudC5qYXZhCkBAIC0zNiwxMyArMzYsMTMgQEAKIAkNCiAJU3RyaW5nIHMgPSBuZXcgRmxvYXQodmFsdWUpLnRvU3RyaW5nKCkgOw0KIAlpZiAocyA9PSBudWxsKQ0KLQkJcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCiAJCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQotCXJldHVybiAiKGZsb2F0KSIvKm5vbk5MUyovICsgdmFsdWUgOyB9DQorCXJldHVybiAiKGZsb2F0KSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJA0KIHB1YmxpYyBpbnQgdHlwZUlEKCkgew0KIAlyZXR1cm4gVF9mbG9hdDsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lUeXBlUmVxdWVzdG9yLmphdmEKaW5kZXggZjQyNzBhYy4uOTM5ZjBiNyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JVHlwZVJlcXVlc3Rvci5qYXZhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0ludENvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhCmluZGV4IDQ5MDE5NmMuLmQwMDBhMWQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0ludENvbnN0YW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSW50Q29uc3RhbnQuamF2YQpAQCAtMzYsMTMgKzM2LDEzIEBACiAJDQogCVN0cmluZyBzID0gbmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkgOw0KIAlpZiAocyA9PSBudWxsKQ0KLQkJcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCiAJCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQotCXJldHVybiAiKGludCkiLypub25OTFMqLyArIHZhbHVlIDsgfQ0KKwlyZXR1cm4gIihpbnQpIiArIHZhbHVlIDsgfSAvLyROT04tTkxTLTEkDQogcHVibGljIGludCB0eXBlSUQoKSB7DQogCXJldHVybiBUX2ludDsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTG9uZ0NvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Mb25nQ29uc3RhbnQuamF2YQppbmRleCA5MTFiODFmLi5kNmI0MTYxIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Mb25nQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Mb25nQ29uc3RhbnQuamF2YQpAQCAtMzYsMTMgKzM2LDEzIEBACiAJDQogCVN0cmluZyBzID0gbmV3IExvbmcodmFsdWUpLnRvU3RyaW5nKCkgOw0KIAlpZiAocyA9PSBudWxsKQ0KLQkJcmV0dXJuICJudWxsIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCiAJCXJldHVybiBzOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQotCXJldHVybiAiKGxvbmcpIi8qbm9uTkxTKi8gKyB2YWx1ZSA7IH0NCisJcmV0dXJuICIobG9uZykiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgaW50IHR5cGVJRCgpIHsNCiAJcmV0dXJuIFRfbG9uZzsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTnVsbENvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9OdWxsQ29uc3RhbnQuamF2YQppbmRleCA2ZTI0YmY1Li4xMDI0MTU5IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9OdWxsQ29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9OdWxsQ29uc3RhbnQuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCi0JcmV0dXJuICIobnVsbCkiLypub25OTFMqLyArIG51bGwgOyB9DQorCXJldHVybiAiKG51bGwpIiArIG51bGwgOyB9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgaW50IHR5cGVJRCgpIHsNCiAJcmV0dXJuIFRfbnVsbDsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhCmluZGV4IGZkODdjYTkuLmQxYmViZmEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1Nob3J0Q29uc3RhbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TaG9ydENvbnN0YW50LmphdmEKQEAgLTM2LDEzICszNiwxMyBAQAogCQ0KIAlTdHJpbmcgcyA9IG5ldyBJbnRlZ2VyKHZhbHVlKS50b1N0cmluZygpIDsNCiAJaWYgKHMgPT0gbnVsbCkNCi0JCXJldHVybiAibnVsbCIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQogCQlyZXR1cm4gczsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KIA0KLQlyZXR1cm4gIihzaG9ydCkiLypub25OTFMqLyArIHZhbHVlIDsgfQ0KKwlyZXR1cm4gIihzaG9ydCkiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQNCiBwdWJsaWMgaW50IHR5cGVJRCgpIHsNCiAJcmV0dXJuIFRfc2hvcnQ7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TdHJpbmdDb25zdGFudC5qYXZhCmluZGV4IGZlMTk3ZDQuLjJlNzU3ZDMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU3RyaW5nQ29uc3RhbnQuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCi0JcmV0dXJuICIoU3RyaW5nKVwiIi8qbm9uTkxTKi8gKyB2YWx1ZSArIlwiIi8qbm9uTkxTKi87IH0NCisJcmV0dXJuICIoU3RyaW5nKVwiIiArIHZhbHVlICsiXCIiOyB9IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIHB1YmxpYyBpbnQgdHlwZUlEKCkgew0KIAlyZXR1cm4gVF9TdHJpbmc7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL29wdGlvbnMucHJvcGVydGllcyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL29wdGlvbnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2NmZjMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9vcHRpb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1kZWJ1Zy52YXJzLm51bWJlcj0xDQotZGVidWcudmFycy5jYXRlZ29yeT1EZWJ1ZyBJbmZvcm1hdGlvbg0KLWRlYnVnLnZhcnMubmFtZT1Mb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUNCi1kZWJ1Zy52YXJzLnBvc3NpYmxlVmFsdWVzPTJ8R2VuZXJhdGV8RG8gbm90IGdlbmVyYXRlDQotZGVidWcudmFycy5kZXNjcmlwdGlvbj1XaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gYmUgZGlzcGxheWVkIGluIGRlYnVnZ2VyLCBvbmx5IGluIHBsYWNlIHdoZXJlIHZhcmlhYmxlcyBhcmUgZGVmaW5pdGVseSBhc3NpZ25lZCAoLmNsYXNzIGZpbGUgaXMgdGhlbiBiaWdnZXIpDQotDQotZGVidWcubGluZXMubnVtYmVyPTINCi1kZWJ1Zy5saW5lcy5jYXRlZ29yeT1EZWJ1ZyBJbmZvcm1hdGlvbg0KLWRlYnVnLmxpbmVzLm5hbWU9TGluZSBudW1iZXIgYXR0cmlidXRlDQotZGVidWcubGluZXMucG9zc2libGVWYWx1ZXM9MnxHZW5lcmF0ZXxEbyBub3QgZ2VuZXJhdGUNCi1kZWJ1Zy5saW5lcy5kZXNjcmlwdGlvbj1XaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgc291cmNlIGNvZGUgaGlnaGxpZ2h0aW5nIGluIGRlYnVnZ2VyICguY2xhc3MgZmlsZSBpcyB0aGVuIGJpZ2dlcikuDQotDQotZGVidWcuc291cmNlLm51bWJlcj0zDQotZGVidWcuc291cmNlLmNhdGVnb3J5PURlYnVnIEluZm9ybWF0aW9uDQotZGVidWcuc291cmNlLm5hbWU9U291cmNlIGZpbGUgYXR0cmlidXRlDQotZGVidWcuc291cmNlLnBvc3NpYmxlVmFsdWVzPTJ8R2VuZXJhdGV8RG8gbm90IGdlbmVyYXRlDQotZGVidWcuc291cmNlLmRlc2NyaXB0aW9uPVdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSB0aGUgZGVidWdnZXIgdG8gcHJlc2VudCB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4NCi0NCi1kZWJ1Zy5wcmVzZXJ2ZUFsbExvY2Fscy5udW1iZXI9NA0KLWRlYnVnLnByZXNlcnZlQWxsTG9jYWxzLmNhdGVnb3J5PUNvZGUgR2VuZXJhdGlvbg0KLWRlYnVnLnByZXNlcnZlQWxsTG9jYWxzLm5hbWU9UHJlc2VydmUgdW51c2VkIGxvY2Fscw0KLWRlYnVnLnByZXNlcnZlQWxsTG9jYWxzLnBvc3NpYmxlVmFsdWVzPTJ8UHJlc2VydmV8T3B0aW1pemUgb3V0DQotZGVidWcucHJlc2VydmVBbGxMb2NhbHMuZGVzY3JpcHRpb249VW5sZXNzIHJlcXVlc3RlZCB0byBwcmVzZXJ2ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIChpLmUuIG5ldmVyIHJlYWQpLCB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIG91dCwgcG90ZW50aWFsbHkgYWx0ZXJpbmcgZGVidWdnaW5nDQotDQotb3B0aW9uYWxFcnJvci51blJlYWNoYWJsZUNvZGUubnVtYmVyPTUNCi1vcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZS5jYXRlZ29yeT1PcHRpb25hbCBFcnJvcnMNCi1vcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZS5uYW1lPVVucmVhY2hhYmxlIGNvZGUNCi1vcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZS5wb3NzaWJsZVZhbHVlcz0yfFJhaXNlIGVycm9yfFdhcm4NCi1vcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZS5kZXNjcmlwdGlvbj1VbnJlYWNoYWJsZSBjb2RlIGNhbiBlaXRoZXIgYmUgcmVwb3J0ZWQgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nDQotDQotb3B0aW9uYWxFcnJvci5pbXBvcnRQcm9ibGVtLm51bWJlcj02DQotb3B0aW9uYWxFcnJvci5pbXBvcnRQcm9ibGVtLmNhdGVnb3J5PU9wdGlvbmFsIEVycm9ycw0KLW9wdGlvbmFsRXJyb3IuaW1wb3J0UHJvYmxlbS5uYW1lPUludmFsaWQgaW1wb3J0DQotb3B0aW9uYWxFcnJvci5pbXBvcnRQcm9ibGVtLnBvc3NpYmxlVmFsdWVzPTJ8UmFpc2UgZXJyb3J8V2Fybg0KLW9wdGlvbmFsRXJyb3IuaW1wb3J0UHJvYmxlbS5kZXNjcmlwdGlvbj1BbiBpbXBvcnQgc3RhdGVtZW50IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIG1pZ2h0IGVpdGhlciBiZSByZXBvcnRlZCBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYXMgYSB3YXJuaW5nDQotDQotb3B0aW9uYWxXYXJuaW5nLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUubnVtYmVyPTcNCi1vcHRpb25hbFdhcm5pbmcubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZS5jYXRlZ29yeT1PcHRpb25hbCBXYXJuaW5ncw0KLW9wdGlvbmFsV2FybmluZy5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLm5hbWU9TWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZQ0KLW9wdGlvbmFsV2FybmluZy5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZS5kZXNjcmlwdGlvbj1OYW1pbmcgYSBtZXRob2Qgd2l0aCBhIGNvbnN0cnVjdG9yIG5hbWUgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgcG9vciBzdHlsZSBwcm9ncmFtbWluZy4gV2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHN1Y2ggc2NlbmFyaWkuDQotDQotb3B0aW9uYWxXYXJuaW5nLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZC5udW1iZXI9OA0KLW9wdGlvbmFsV2FybmluZy5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QuY2F0ZWdvcnk9T3B0aW9uYWwgV2FybmluZ3MNCi1vcHRpb25hbFdhcm5pbmcub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLm5hbWU9T3ZlcnJpZGluZyBhIHBhY2thZ2UgZGVmYXVsdCBtZXRob2QNCi1vcHRpb25hbFdhcm5pbmcub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLmRlc2NyaXB0aW9uPUEgcGFja2FnZSBkZWZhdWx0IG1ldGhvZCBpcyBub3QgdmlzaWJsZSBpbiBhIGRpZmZlcmVudCBwYWNrYWdlLCBhbmQgdGh1cyBjYW5ub3QgYmUgb3ZlcnJpZGVuLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgc3VjaCBzY2VuYXJpaS4NCi0NCi1vcHRpb25hbFdhcm5pbmcuZGVwcmVjYXRlZC5udW1iZXI9OQ0KLW9wdGlvbmFsV2FybmluZy5kZXByZWNhdGVkLmNhdGVnb3J5PU9wdGlvbmFsIFdhcm5pbmdzDQotb3B0aW9uYWxXYXJuaW5nLmRlcHJlY2F0ZWQubmFtZT1EZXByZWNhdGlvbg0KLW9wdGlvbmFsV2FybmluZy5kZXByZWNhdGVkLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcuZGVwcmVjYXRlZC5kZXNjcmlwdGlvbj1XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1c2Ugb2YgZGVwcmVjYXRlZCBBUEkuDQotDQotb3B0aW9uYWxXYXJuaW5nLm1hc2tlZENhdGNoQmxvY2subnVtYmVyPTEwDQotb3B0aW9uYWxXYXJuaW5nLm1hc2tlZENhdGNoQmxvY2suY2F0ZWdvcnk9T3B0aW9uYWwgV2FybmluZ3MNCi1vcHRpb25hbFdhcm5pbmcubWFza2VkQ2F0Y2hCbG9jay5uYW1lPUhpZGRlbiBjYXRjaCBibG9jaw0KLW9wdGlvbmFsV2FybmluZy5tYXNrZWRDYXRjaEJsb2NrLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcubWFza2VkQ2F0Y2hCbG9jay5kZXNjcmlwdGlvbj1Mb2NhbGx5IHRvIGEgdHJ5IHN0YXRlbWVudCwgc29tZSBjYXRjaCBibG9ja3MgbWF5IGhpZGUgb3RoZXJzIChlLmcuIHRyeSB7dGhyb3cgbmV3IGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKTt9IGNhdGNoIChqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uIGUpIHt9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHt9KS4gV2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB3YXJuaW5nIGZvciBoaWRkZW4gY2F0Y2ggYmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gY2hlY2tlZCBleGNlcHRpb25zDQotDQotb3B0aW9uYWxXYXJuaW5nLnVudXNlZExvY2FsVmFyaWFibGUubnVtYmVyPTExDQotb3B0aW9uYWxXYXJuaW5nLnVudXNlZExvY2FsVmFyaWFibGUuY2F0ZWdvcnk9T3B0aW9uYWwgV2FybmluZ3MNCi1vcHRpb25hbFdhcm5pbmcudW51c2VkTG9jYWxWYXJpYWJsZS5uYW1lPVVudXNlZCBsb2NhbCB2YXJpYWJsZQ0KLW9wdGlvbmFsV2FybmluZy51bnVzZWRMb2NhbFZhcmlhYmxlLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcudW51c2VkTG9jYWxWYXJpYWJsZS5kZXNjcmlwdGlvbj1XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGEgd2FybmluZyBmb3IgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyAoaS5lLiB2YXJpYWJsZXMgbmV2ZXIgcmVhZCBmcm9tKQ0KLQ0KLW9wdGlvbmFsV2FybmluZy51bnVzZWRBcmd1bWVudC5udW1iZXI9MTINCi1vcHRpb25hbFdhcm5pbmcudW51c2VkQXJndW1lbnQuY2F0ZWdvcnk9T3B0aW9uYWwgV2FybmluZ3MNCi1vcHRpb25hbFdhcm5pbmcudW51c2VkQXJndW1lbnQubmFtZT1VbnVzZWQgcGFyYW1ldGVyDQotb3B0aW9uYWxXYXJuaW5nLnVudXNlZEFyZ3VtZW50LnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcudW51c2VkQXJndW1lbnQuZGVzY3JpcHRpb249V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgZm9yIHVudXNlZCBtZXRob2QgcGFyYW1ldGVycyAoaS5lLiBwYXJhbWV0ZXJzIG5ldmVyIHJlYWQgZnJvbSkNCi0NCi1iaW5hcnlDb21wYXRpYmlsaXR5LnRhcmdldEpESy5udW1iZXI9MTQNCi1iaW5hcnlDb21wYXRpYmlsaXR5LnRhcmdldEpESy5jYXRlZ29yeT1CaW5hcnkgQ29tcGF0aWJpbGl0eQ0KLWJpbmFyeUNvbXBhdGliaWxpdHkudGFyZ2V0SkRLLm5hbWU9VGFyZ2V0IHBsYXRmb3JtDQotYmluYXJ5Q29tcGF0aWJpbGl0eS50YXJnZXRKREsucG9zc2libGVWYWx1ZXM9MnwxLjF8MS4yDQotYmluYXJ5Q29tcGF0aWJpbGl0eS50YXJnZXRKREsuZGVzY3JpcHRpb249R2VuZXJhdGUgLmNsYXNzIGZpbGVzIGVpdGhlciBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggSlZNIDEuMSBvciBvbmx5IGV4ZWN1dGFibGUgb24gSlZNIDEuMiBhbmQgbGF0ZXINCi0NCi1vcHRpb25hbFdhcm5pbmcuYWNjZXNzRW11bGF0aW9uLm51bWJlcj0xNQ0KLW9wdGlvbmFsV2FybmluZy5hY2Nlc3NFbXVsYXRpb24uY2F0ZWdvcnk9T3B0aW9uYWwgV2FybmluZ3MNCi1vcHRpb25hbFdhcm5pbmcuYWNjZXNzRW11bGF0aW9uLm5hbWU9U3ludGhldGljIEFjY2VzcyBFbXVsYXRpb24NCi1vcHRpb25hbFdhcm5pbmcuYWNjZXNzRW11bGF0aW9uLnBvc3NpYmxlVmFsdWVzPTJ8V2FybnxJZ25vcmUNCi1vcHRpb25hbFdhcm5pbmcuYWNjZXNzRW11bGF0aW9uLmRlc2NyaXB0aW9uPVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW5ldmVyIGl0IGVtdWxhdGVzIGFjY2VzcyB0byBhIG5vbi1hY2Nlc3NpYmxlIG1lbWJlciBvZiBhbiBlbmNsb3NpbmcgdHlwZQ0KLQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0FycmF5QmluZGluZy5qYXZhCmluZGV4IDE1ZTc4OWMuLjk4MDUwZDIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9BcnJheUJpbmRpbmcuamF2YQpAQCAtMzksNyArMzksNyBAQAogU3RyaW5nIGRlYnVnTmFtZSgpIHsNCiAJU3RyaW5nQnVmZmVyIGJyYWNrZXRzID0gbmV3IFN0cmluZ0J1ZmZlcihkaW1lbnNpb25zICogMik7DQogCWZvciAoaW50IGkgPSBkaW1lbnNpb25zOyAtLWkgPj0gMDspDQotCQlicmFja2V0cy5hcHBlbmQoIltdIi8qbm9uTkxTKi8pOw0KKwkJYnJhY2tldHMuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZS5kZWJ1Z05hbWUoKSArIGJyYWNrZXRzLnRvU3RyaW5nKCk7DQogfQ0KIC8qIEFuc3dlciBhbiBhcnJheSB3aG9zZSBkaW1lbnNpb24gc2l6ZSBpcyBvbmUgbGVzcyB0aGFuIHRoZSByZWNlaXZlci4NCkBAIC0xMjgsNiArMTI4LDYgQEAKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQobGVhZkNvbXBvbmVudFR5cGUuc291cmNlTmFtZSgpLCBicmFja2V0cyk7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZSAhPSBudWxsID8gZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIEFSUkFZIi8qbm9uTkxTKi87DQorCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZSAhPSBudWxsID8gZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIEFSUkFZIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZUJpbmRpbmcuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVCaW5kaW5nLmphdmEKaW5kZXggZDY2NDg1Mi4uMGYxZGU3ZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZUJpbmRpbmcuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlQmluZGluZy5qYXZhCkBAIC0xNDYsNiArMTQ2LDYgQEAKIAlyZXR1cm4gc2ltcGxlTmFtZTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuIG5ldyBTdHJpbmcoY29uc3RhbnRQb29sTmFtZSkgKyAiIChpZD0iLypub25OTFMqLyArIGlkICsgIikiLypub25OTFMqLzsNCisJcmV0dXJuIG5ldyBTdHJpbmcoY29uc3RhbnRQb29sTmFtZSkgKyAiIChpZD0iICsgaWQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZXMuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVzLmphdmEKaW5kZXggNDVjYWZmZS4uN2M0M2YyYyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZXMuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlcy5qYXZhCkBAIC02LDE0ICs2LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7DQogDQogcHVibGljIGludGVyZmFjZSBCYXNlVHlwZXMgew0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgSW50QmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2ludCwgImludCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydJJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQnl0ZUJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ieXRlLCAiYnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydCJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgU2hvcnRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfc2hvcnQsICJzaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydTJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQ2hhckJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9jaGFyLCAiY2hhciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydDJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTG9uZ0JpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9sb25nLCAibG9uZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydKJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRmxvYXRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfZmxvYXQsICJmbG9hdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydGJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRG91YmxlQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2RvdWJsZSwgImRvdWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydEJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQm9vbGVhbkJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ib29sZWFuLCAiYm9vbGVhbiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydaJ30pOw0KLQlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTnVsbEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9udWxsLCAibnVsbCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydOJ30pOyAvL04gc3RhbmRzIGZvciBudWxsIGV2ZW4gaWYgaXQgaXMgbmV2ZXIgaW50ZXJuYWxseSB1c2VkDQotCWZpbmFsIEJhc2VUeXBlQmluZGluZyBWb2lkQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX3ZvaWQsICJ2b2lkIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J1YnfSk7DQorCWZpbmFsIEJhc2VUeXBlQmluZGluZyBJbnRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfaW50LCAiaW50Ii50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnSSd9KTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQnl0ZUJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ieXRlLCAiYnl0ZSIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0InfSk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgQmFzZVR5cGVCaW5kaW5nIFNob3J0QmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX3Nob3J0LCAic2hvcnQiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydTJ30pOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIEJhc2VUeXBlQmluZGluZyBDaGFyQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2NoYXIsICJjaGFyIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnQyd9KTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTG9uZ0JpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9sb25nLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0onfSk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgQmFzZVR5cGVCaW5kaW5nIEZsb2F0QmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2Zsb2F0LCAiZmxvYXQiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydGJ30pOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIEJhc2VUeXBlQmluZGluZyBEb3VibGVCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfZG91YmxlLCAiZG91YmxlIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnRCd9KTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQm9vbGVhbkJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ib29sZWFuLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J1onfSk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgQmFzZVR5cGVCaW5kaW5nIE51bGxCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfbnVsbCwgIm51bGwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydOJ30pOyAvL04gc3RhbmRzIGZvciBudWxsIGV2ZW4gaWYgaXQgaXMgbmV2ZXIgaW50ZXJuYWxseSB1c2VkIC8vJE5PTi1OTFMtMSQNCisJZmluYWwgQmFzZVR5cGVCaW5kaW5nIFZvaWRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfdm9pZCwgInZvaWQiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydWJ30pOyAvLyROT04tTkxTLTEkDQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YQppbmRleCA2ODNhNjE3Li4yNWE4OGI3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeVR5cGVCaW5kaW5nLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhCkBAIC0zNzYsNzEgKzM3Niw3MSBAQAogCXJldHVybiBzdXBlckludGVyZmFjZXM7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCVN0cmluZyBzID0gIiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkDQogDQotCWlmIChpc0RlcHJlY2F0ZWQoKSkgcyArPSAiZGVwcmVjYXRlZCAiLypub25OTFMqLzsNCi0JaWYgKGlzUHVibGljKCkpIHMgKz0gInB1YmxpYyAiLypub25OTFMqLzsNCi0JaWYgKGlzUHJvdGVjdGVkKCkpIHMgKz0gInByb3RlY3RlZCAiLypub25OTFMqLzsNCi0JaWYgKGlzUHJpdmF0ZSgpKSBzICs9ICJwcml2YXRlICIvKm5vbk5MUyovOw0KLQlpZiAoaXNBYnN0cmFjdCgpICYmIGlzQ2xhc3MoKSkgcyArPSAiYWJzdHJhY3QgIi8qbm9uTkxTKi87DQotCWlmIChpc1N0YXRpYygpICYmIGlzTmVzdGVkVHlwZSgpKSBzICs9ICJzdGF0aWMgIi8qbm9uTkxTKi87DQotCWlmIChpc0ZpbmFsKCkpIHMgKz0gImZpbmFsICIvKm5vbk5MUyovOw0KKwlpZiAoaXNEZXByZWNhdGVkKCkpIHMgKz0gImRlcHJlY2F0ZWQgIjsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoaXNQdWJsaWMoKSkgcyArPSAicHVibGljICI7IC8vJE5PTi1OTFMtMSQNCisJaWYgKGlzUHJvdGVjdGVkKCkpIHMgKz0gInByb3RlY3RlZCAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc1ByaXZhdGUoKSkgcyArPSAicHJpdmF0ZSAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc0Fic3RyYWN0KCkgJiYgaXNDbGFzcygpKSBzICs9ICJhYnN0cmFjdCAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc1N0YXRpYygpICYmIGlzTmVzdGVkVHlwZSgpKSBzICs9ICJzdGF0aWMgIjsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoaXNGaW5hbCgpKSBzICs9ICJmaW5hbCAiOyAvLyROT04tTkxTLTEkDQogDQotCXMgKz0gaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UgIi8qbm9uTkxTKi8gOiAiY2xhc3MgIi8qbm9uTkxTKi87DQotCXMgKz0gKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IENoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIFRZUEUiLypub25OTFMqLzsNCisJcyArPSBpc0ludGVyZmFjZSgpID8gImludGVyZmFjZSAiIDogImNsYXNzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwlzICs9IChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQlzICs9ICJcblx0ZXh0ZW5kcyAiLypub25OTFMqLzsNCi0JcyArPSAoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIi8qbm9uTkxTKi87DQorCXMgKz0gIlxuXHRleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQNCisJcyArPSAoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsNCiAJCWlmIChzdXBlckludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCi0JCQlzICs9ICJcblx0aW1wbGVtZW50cyA6ICIvKm5vbk5MUyovOw0KKwkJCXMgKz0gIlxuXHRpbXBsZW1lbnRzIDogIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCQkJaWYgKGkgID4gMCkNCi0JCQkJCXMgKz0gIiwgIi8qbm9uTkxTKi87DQotCQkJCXMgKz0gKHN1cGVySW50ZXJmYWNlc1tpXSAhPSBudWxsKSA/IHN1cGVySW50ZXJmYWNlc1tpXS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiLypub25OTFMqLzsNCisJCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQlzICs9IChzdXBlckludGVyZmFjZXNbaV0gIT0gbnVsbCkgPyBzdXBlckludGVyZmFjZXNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgU1VQRVJJTlRFUkZBQ0VTIi8qbm9uTkxTKi87DQorCQlzICs9ICJOVUxMIFNVUEVSSU5URVJGQUNFUyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KIAlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7DQotCQlzICs9ICJcblx0ZW5jbG9zaW5nIHR5cGUgOiAiLypub25OTFMqLzsNCisJCXMgKz0gIlxuXHRlbmNsb3NpbmcgdHlwZSA6ICI7IC8vJE5PTi1OTFMtMSQNCiAJCXMgKz0gZW5jbG9zaW5nVHlwZS5kZWJ1Z05hbWUoKTsNCiAJfQ0KIA0KIAlpZiAoZmllbGRzICE9IG51bGwpIHsNCiAJCWlmIChmaWVsZHMgIT0gTm9GaWVsZHMpIHsNCi0JCQlzICs9ICJcbi8qICAgZmllbGRzICAgKi8iLypub25OTFMqLzsNCisJCQlzICs9ICJcbi8qICAgZmllbGRzICAgKi8iOyAvLyROT04tTkxTLTEkDQogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCi0JCQkJcyArPSAoZmllbGRzW2ldICE9IG51bGwpID8gIlxuIi8qbm9uTkxTKi8gKyBmaWVsZHNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgRklFTEQiLypub25OTFMqLzsNCisJCQkJcyArPSAoZmllbGRzW2ldICE9IG51bGwpID8gIlxuIiArIGZpZWxkc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBGSUVMRCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJfQ0KIAl9IGVsc2Ugew0KLQkJcyArPSAiTlVMTCBGSUVMRFMiLypub25OTFMqLzsNCisJCXMgKz0gIk5VTEwgRklFTERTIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCWlmIChtZXRob2RzICE9IG51bGwpIHsNCiAJCWlmIChtZXRob2RzICE9IE5vTWV0aG9kcykgew0KLQkJCXMgKz0gIlxuLyogICBtZXRob2RzICAgKi8iLypub25OTFMqLzsNCisJCQlzICs9ICJcbi8qICAgbWV0aG9kcyAgICovIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KLQkJCQlzICs9IChtZXRob2RzW2ldICE9IG51bGwpID8gIlxuIi8qbm9uTkxTKi8gKyBtZXRob2RzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIE1FVEhPRCIvKm5vbk5MUyovOw0KKwkJCQlzICs9IChtZXRob2RzW2ldICE9IG51bGwpID8gIlxuIiArIG1ldGhvZHNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgTUVUSE9EIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQl9DQogCX0gZWxzZSB7DQotCQlzICs9ICJOVUxMIE1FVEhPRFMiLypub25OTFMqLzsNCisJCXMgKz0gIk5VTEwgTUVUSE9EUyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KIAlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgew0KIAkJaWYgKG1lbWJlclR5cGVzICE9IE5vTWVtYmVyVHlwZXMpIHsNCi0JCQlzICs9ICJcbi8qICAgbWVtYmVycyAgICovIi8qbm9uTkxTKi87DQorCQkJcyArPSAiXG4vKiAgIG1lbWJlcnMgICAqLyI7IC8vJE5PTi1OTFMtMSQNCiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspDQotCQkJCXMgKz0gKG1lbWJlclR5cGVzW2ldICE9IG51bGwpID8gIlxuIi8qbm9uTkxTKi8gKyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBUWVBFIi8qbm9uTkxTKi87DQorCQkJCXMgKz0gKG1lbWJlclR5cGVzW2ldICE9IG51bGwpID8gIlxuIiArIG1lbWJlclR5cGVzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgTUVNQkVSIFRZUEVTIi8qbm9uTkxTKi87DQorCQlzICs9ICJOVUxMIE1FTUJFUiBUWVBFUyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KLQlzICs9ICJcblxuXG4iLypub25OTFMqLzsNCisJcyArPSAiXG5cblxuIjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmxvY2tTY29wZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKaW5kZXggYTRlMTRiYy4uMDJlNDM1MSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKQEAgLTEzOSwxNiArMTM5LDE2IEBACiAJCXx8ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCkuaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpOyAvLyBpbnNpZGUgY29uc3RydWN0b3Igb3IgY2xpbml0DQogfQ0KIFN0cmluZyBiYXNpY1RvU3RyaW5nKGludCB0YWIpIHsNCi0JU3RyaW5nIG5ld0xpbmUgPSAiXG4iLypub25OTFMqLzsNCisJU3RyaW5nIG5ld0xpbmUgPSAiXG4iOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSB0YWI7IC0taSA+PSAwOykNCi0JCW5ld0xpbmUgKz0gIlx0Ii8qbm9uTkxTKi87DQorCQluZXdMaW5lICs9ICJcdCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JU3RyaW5nIHMgPSBuZXdMaW5lICsgIi0tLSBCbG9jayBTY29wZSAtLS0iLypub25OTFMqLzsNCi0JbmV3TGluZSArPSAiXHQiLypub25OTFMqLzsNCi0JcyArPSBuZXdMaW5lICsgImxvY2FsczoiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSBuZXdMaW5lICsgIi0tLSBCbG9jayBTY29wZSAtLS0iOyAvLyROT04tTkxTLTEkDQorCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJA0KKwlzICs9IG5ld0xpbmUgKyAibG9jYWxzOiI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEluZGV4OyBpKyspDQotCQlzICs9IG5ld0xpbmUgKyAiXHQiLypub25OTFMqLyArIGxvY2Fsc1tpXS50b1N0cmluZygpOw0KLQlzICs9IG5ld0xpbmUgKyAic3RhcnRJbmRleCA9ICIvKm5vbk5MUyovICsgc3RhcnRJbmRleDsNCisJCXMgKz0gbmV3TGluZSArICJcdCIgKyBsb2NhbHNbaV0udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KKwlzICs9IG5ld0xpbmUgKyAic3RhcnRJbmRleCA9ICIgKyBzdGFydEluZGV4OyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiBwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyB2YXJCaW5kaW5nKSB7DQpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAlTdHJpbmcgcyA9IGJhc2ljVG9TdHJpbmcodGFiKTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBzY29wZUluZGV4OyBpKyspDQogCQlpZiAoc3Vic2NvcGVzW2ldIGluc3RhbmNlb2YgQmxvY2tTY29wZSkNCi0JCQlzICs9ICgoQmxvY2tTY29wZSkgc3Vic2NvcGVzW2ldKS50b1N0cmluZyh0YWIgKyAxKSArICJcbiIvKm5vbk5MUyovOw0KKwkJCXMgKz0gKChCbG9ja1Njb3BlKSBzdWJzY29wZXNbaV0pLnRvU3RyaW5nKHRhYiArIDEpICsgIlxuIjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2xhc3NTY29wZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKaW5kZXggMDJhMzlkMi4uNDZkNTM3MiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKQEAgLTExLDYwNiArMTEsNjc2IEBACiANCiBwdWJsaWMgY2xhc3MgQ2xhc3NTY29wZSBleHRlbmRzIFNjb3BlIHsNCiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VDb250ZXh0Ow0KLXB1YmxpYyBDbGFzc1Njb3BlKFNjb3BlIHBhcmVudCwgVHlwZURlY2xhcmF0aW9uIGNvbnRleHQpIHsNCi0Jc3VwZXIoQ0xBU1NfU0NPUEUsIHBhcmVudCk7DQotCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7DQotfQ0KLXZvaWQgYnVpbGRBbm9ueW1vdXNUeXBlQmluZGluZyhTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHN1cGVydHlwZSkgew0KLSAJYnVpbGRMb2NhbFR5cGUoZW5jbG9zaW5nVHlwZSwgZW5jbG9zaW5nVHlwZS5mUGFja2FnZSk7DQotDQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWlmIChzdXBlcnR5cGUuaXNJbnRlcmZhY2UoKSkgew0KLQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsNCi0JCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7c3VwZXJ0eXBlfTsNCi0JfSBlbHNlIHsNCi0JCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IHN1cGVydHlwZTsNCi0JCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gVHlwZUJpbmRpbmcuTm9TdXBlckludGVyZmFjZXM7DQorCQ0KKwlwdWJsaWMgQ2xhc3NTY29wZShTY29wZSBwYXJlbnQsIFR5cGVEZWNsYXJhdGlvbiBjb250ZXh0KSB7DQorCQlzdXBlcihDTEFTU19TQ09QRSwgcGFyZW50KTsNCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7DQogCX0NCi0JY29ubmVjdE1lbWJlclR5cGVzKCk7DQotCWJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOw0KLQlzb3VyY2VUeXBlLnZlcmlmeU1ldGhvZHMoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpKTsNCi19DQotcHJpdmF0ZSB2b2lkIGJ1aWxkRmllbGRzKCkgew0KLQlpZiAocmVmZXJlbmNlQ29udGV4dC5maWVsZHMgPT0gbnVsbCkgew0KLQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLmZpZWxkcyA9IE5vRmllbGRzOw0KLQkJcmV0dXJuOw0KLQl9DQorCQ0KKwl2b2lkIGJ1aWxkQW5vbnltb3VzVHlwZUJpbmRpbmcoU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgUmVmZXJlbmNlQmluZGluZyBzdXBlcnR5cGUpIHsNCisJCWJ1aWxkTG9jYWxUeXBlKGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1R5cGUuZlBhY2thZ2UpOw0KIA0KLQkvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGZpZWxkcyB2cy4gaW5pdGlhbGl6ZXJzDQotCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSByZWZlcmVuY2VDb250ZXh0LmZpZWxkczsNCi0JaW50IHNpemUgPSBmaWVsZHMubGVuZ3RoOw0KLQlpbnQgY291bnQgPSAwOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykNCi0JCWlmIChmaWVsZHNbaV0uaXNGaWVsZCgpKQ0KLQkJCWNvdW50Kys7DQotDQotCS8vIGl0ZXJhdGUgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyB0byBjcmVhdGUgdGhlIGJpbmRpbmdzLCBsb3NlIGFsbCBkdXBsaWNhdGVzDQotCUZpZWxkQmluZGluZ1tdIGZpZWxkQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2NvdW50XTsNCi0JSGFzaHRhYmxlT2ZPYmplY3Qga25vd25GaWVsZE5hbWVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGNvdW50KTsNCi0JYm9vbGVhbiBkdXBsaWNhdGUgPSBmYWxzZTsNCi0JY291bnQgPSAwOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsNCi0JCWlmICghZmllbGQuaXNGaWVsZCgpKSB7DQotCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5pc0ludGVyZmFjZSgpKQ0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbnRlcmZhY2VDYW5ub3RIYXZlSW5pdGlhbGl6ZXJzKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZywgZmllbGQpOw0KKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCWlmIChzdXBlcnR5cGUuaXNJbnRlcmZhY2UoKSkgew0KKwkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IGdldEphdmFMYW5nT2JqZWN0KCk7DQorCQkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tdIHsgc3VwZXJ0eXBlIH07DQogCQl9IGVsc2Ugew0KLQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBuZXcgRmllbGRCaW5kaW5nKGZpZWxkLCBudWxsLCByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcpOyAvLyBmaWVsZCdzIHR5cGUgd2lsbCBiZSByZXNvbHZlZCB3aGVuIG5lZWRlZCBmb3IgdG9wIGxldmVsIHR5cGVzDQotCQkJY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JGaWVsZChmaWVsZEJpbmRpbmcsIGZpZWxkKTsNCisJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcnR5cGU7DQorCQkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBUeXBlQmluZGluZy5Ob1N1cGVySW50ZXJmYWNlczsNCisJCX0NCisJCWNvbm5lY3RNZW1iZXJUeXBlcygpOw0KKwkJYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7DQorCQlzb3VyY2VUeXBlLnZlcmlmeU1ldGhvZHMoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpKTsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIGJ1aWxkRmllbGRzKCkgew0KKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuZmllbGRzID09IG51bGwpIHsNCisJCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcuZmllbGRzID0gTm9GaWVsZHM7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJLy8gY291bnQgdGhlIG51bWJlciBvZiBmaWVsZHMgdnMuIGluaXRpYWxpemVycw0KKwkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHJlZmVyZW5jZUNvbnRleHQuZmllbGRzOw0KKwkJaW50IHNpemUgPSBmaWVsZHMubGVuZ3RoOw0KKwkJaW50IGNvdW50ID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKwkJCWlmIChmaWVsZHNbaV0uaXNGaWVsZCgpKQ0KKwkJCQljb3VudCsrOw0KIA0KLQkJCWlmIChrbm93bkZpZWxkTmFtZXMuY29udGFpbnNLZXkoZmllbGQubmFtZSkpIHsNCi0JCQkJZHVwbGljYXRlID0gdHJ1ZTsNCi0JCQkJRmllbGRCaW5kaW5nIHByZXZpb3VzQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGtub3duRmllbGROYW1lcy5nZXQoZmllbGQubmFtZSk7DQotCQkJCWlmIChwcmV2aW91c0JpbmRpbmcgIT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBpOyBmKyspIHsNCi0JCQkJCQlGaWVsZERlY2xhcmF0aW9uIHByZXZpb3VzRmllbGQgPSBmaWVsZHNbZl07DQotCQkJCQkJaWYgKHByZXZpb3VzRmllbGQuYmluZGluZyA9PSBwcmV2aW91c0JpbmRpbmcpIHsNCi0JCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRmllbGRJblR5cGUocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLCBwcmV2aW91c0ZpZWxkKTsNCi0JCQkJCQkJcHJldmlvdXNGaWVsZC5iaW5kaW5nID0gbnVsbDsNCi0JCQkJCQkJYnJlYWs7DQorCQkvLyBpdGVyYXRlIHRoZSBmaWVsZCBkZWNsYXJhdGlvbnMgdG8gY3JlYXRlIHRoZSBiaW5kaW5ncywgbG9zZSBhbGwgZHVwbGljYXRlcw0KKwkJRmllbGRCaW5kaW5nW10gZmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbY291bnRdOw0KKwkJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25GaWVsZE5hbWVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGNvdW50KTsNCisJCWJvb2xlYW4gZHVwbGljYXRlID0gZmFsc2U7DQorCQljb3VudCA9IDA7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZHNbaV07DQorCQkJaWYgKCFmaWVsZC5pc0ZpZWxkKCkpIHsNCisJCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5pc0ludGVyZmFjZSgpKQ0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW50ZXJmYWNlQ2Fubm90SGF2ZUluaXRpYWxpemVycyhyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcsIGZpZWxkKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gbmV3IEZpZWxkQmluZGluZyhmaWVsZCwgbnVsbCwgcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nKTsNCisJCQkJLy8gZmllbGQncyB0eXBlIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQgZm9yIHRvcCBsZXZlbCB0eXBlcw0KKwkJCQljaGVja0FuZFNldE1vZGlmaWVyc0ZvckZpZWxkKGZpZWxkQmluZGluZywgZmllbGQpOw0KKw0KKwkJCQlpZiAoa25vd25GaWVsZE5hbWVzLmNvbnRhaW5zS2V5KGZpZWxkLm5hbWUpKSB7DQorCQkJCQlkdXBsaWNhdGUgPSB0cnVlOw0KKwkJCQkJRmllbGRCaW5kaW5nIHByZXZpb3VzQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGtub3duRmllbGROYW1lcy5nZXQoZmllbGQubmFtZSk7DQorCQkJCQlpZiAocHJldmlvdXNCaW5kaW5nICE9IG51bGwpIHsNCisJCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGk7IGYrKykgew0KKwkJCQkJCQlGaWVsZERlY2xhcmF0aW9uIHByZXZpb3VzRmllbGQgPSBmaWVsZHNbZl07DQorCQkJCQkJCWlmIChwcmV2aW91c0ZpZWxkLmJpbmRpbmcgPT0gcHJldmlvdXNCaW5kaW5nKSB7DQorCQkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVGaWVsZEluVHlwZShyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcsIHByZXZpb3VzRmllbGQpOw0KKwkJCQkJCQkJcHJldmlvdXNGaWVsZC5iaW5kaW5nID0gbnVsbDsNCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJa25vd25GaWVsZE5hbWVzLnB1dChmaWVsZC5uYW1lLCBudWxsKTsgLy8gZW5zdXJlIHRoYXQgdGhlIGR1cGxpY2F0ZSBmaWVsZCBpcyBmb3VuZCAmIHJlbW92ZWQNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUZpZWxkSW5UeXBlKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZywgZmllbGQpOw0KKwkJCQkJZmllbGQuYmluZGluZyA9IG51bGw7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlrbm93bkZpZWxkTmFtZXMucHV0KGZpZWxkLm5hbWUsIGZpZWxkQmluZGluZyk7DQorCQkJCQkvLyByZW1lbWJlciB0aGF0IHdlIGhhdmUgc2VlbiBhIGZpZWxkIHdpdGggdGhpcyBuYW1lDQorCQkJCQlpZiAoZmllbGRCaW5kaW5nICE9IG51bGwpDQorCQkJCQkJZmllbGRCaW5kaW5nc1tjb3VudCsrXSA9IGZpZWxkQmluZGluZzsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCS8vIHJlbW92ZSBkdXBsaWNhdGUgZmllbGRzDQorCQlpZiAoZHVwbGljYXRlKSB7DQorCQkJRmllbGRCaW5kaW5nW10gbmV3RmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdba25vd25GaWVsZE5hbWVzLnNpemUoKSAtIDFdOw0KKwkJCS8vIHdlIGtub3cgd2UnbGwgYmUgcmVtb3ZpbmcgYXQgbGVhc3QgMSBkdXBsaWNhdGUgbmFtZQ0KKwkJCXNpemUgPSBjb3VudDsNCisJCQljb3VudCA9IDA7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZ3NbaV07DQorCQkJCWlmIChrbm93bkZpZWxkTmFtZXMuZ2V0KGZpZWxkQmluZGluZy5uYW1lKSAhPSBudWxsKQ0KKwkJCQkJbmV3RmllbGRCaW5kaW5nc1tjb3VudCsrXSA9IGZpZWxkQmluZGluZzsNCisJCQl9DQorCQkJZmllbGRCaW5kaW5ncyA9IG5ld0ZpZWxkQmluZGluZ3M7DQorCQl9DQorDQorCQlpZiAoY291bnQgIT0gZmllbGRCaW5kaW5ncy5sZW5ndGgpDQorCQkJU3lzdGVtLmFycmF5Y29weShmaWVsZEJpbmRpbmdzLCAwLCBmaWVsZEJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykNCisJCQlmaWVsZEJpbmRpbmdzW2ldLmlkID0gaTsNCisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5maWVsZHMgPSBmaWVsZEJpbmRpbmdzOw0KKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5pc0xvY2FsVHlwZSgpKQ0KKwkJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5maWVsZHMoKTsNCisJCS8vIGZhdWx0IHRoZSB0eXBlcyBmb3IgdGhlIGxvY2FsIHR5cGUncyBmaWVsZHMgbm93IHNpbmNlIHdlIG5lZWQgdGhlbQ0KKwl9DQorCQ0KKwl2b2lkIGJ1aWxkRmllbGRzQW5kTWV0aG9kcygpIHsNCisJCWJ1aWxkRmllbGRzKCk7DQorCQlidWlsZE1ldGhvZHMoKTsNCisNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQorCQlpZiAoc291cmNlVHlwZS5pc01lbWJlclR5cGUoKSAmJiAhc291cmNlVHlwZS5pc0xvY2FsVHlwZSgpKQ0KKwkJCSAoKE1lbWJlclR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5jaGVja1N5bnRoZXRpY0FyZ3NBbmRGaWVsZHMoKTsNCisNCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcyA9IHNvdXJjZVR5cGUubWVtYmVyVHlwZXM7DQorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspDQorCQkJICgoU291cmNlVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKS5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsNCisJfQ0KKwkNCisJcHJpdmF0ZSBMb2NhbFR5cGVCaW5kaW5nIGJ1aWxkTG9jYWxUeXBlKA0KKwkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwNCisJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQorCQlyZWZlcmVuY2VDb250ZXh0LnNjb3BlID0gdGhpczsNCisJCXJlZmVyZW5jZUNvbnRleHQuc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCB0cnVlKTsNCisJCXJlZmVyZW5jZUNvbnRleHQuaW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCBmYWxzZSk7DQorDQorCQkvLyBidWlsZCB0aGUgYmluZGluZyBvciB0aGUgbG9jYWwgdHlwZQ0KKwkJTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUgPSBuZXcgTG9jYWxUeXBlQmluZGluZyh0aGlzLCBlbmNsb3NpbmdUeXBlKTsNCisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZyA9IGxvY2FsVHlwZTsNCisJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKCk7DQorDQorCQkvLyBMb29rIGF0IG1lbWJlciB0eXBlcw0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVCaW5kaW5ncyA9IE5vTWVtYmVyVHlwZXM7DQorCQlpZiAocmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcyAhPSBudWxsKSB7DQorCQkJaW50IHNpemUgPSByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzLmxlbmd0aDsNCisJCQltZW1iZXJUeXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsNCisJCQlpbnQgY291bnQgPSAwOw0KKwkJCW5leHRNZW1iZXIgOiBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKwkJCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbaV07DQorCQkJCWlmIChtZW1iZXJDb250ZXh0LmlzSW50ZXJmYWNlKCkpIHsNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLm5lc3RlZENsYXNzQ2Fubm90RGVjbGFyZUludGVyZmFjZShtZW1iZXJDb250ZXh0KTsNCisJCQkJCWNvbnRpbnVlIG5leHRNZW1iZXI7DQorCQkJCX0NCisJCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gbG9jYWxUeXBlOw0KKwkJCQkvLyBjaGVjayB0aGF0IHRoZSBtZW1iZXIgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbiBlbmNsb3NpbmcgdHlwZQ0KKwkJCQlkbyB7DQorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5zb3VyY2VOYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7DQorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGlkaW5nRW5jbG9zaW5nVHlwZShtZW1iZXJDb250ZXh0KTsNCisJCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOw0KKwkJCQkJfQ0KKwkJCQkJdHlwZSA9IHR5cGUuZW5jbG9zaW5nVHlwZSgpOw0KKwkJCQl9IHdoaWxlICh0eXBlICE9IG51bGwpOw0KKwkJCQkvLyBjaGVjayB0aGUgbWVtYmVyIHR5cGUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNpYmxpbmcgbWVtYmVyIHR5cGUNCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsNCisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsNCisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVOZXN0ZWRUeXBlKG1lbWJlckNvbnRleHQpOw0KKwkJCQkJCWNvbnRpbnVlIG5leHRNZW1iZXI7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQ2xhc3NTY29wZSBtZW1iZXJTY29wZSA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbaV0pOw0KKwkJCQlMb2NhbFR5cGVCaW5kaW5nIG1lbWJlckJpbmRpbmcgPSBtZW1iZXJTY29wZS5idWlsZExvY2FsVHlwZShsb2NhbFR5cGUsIHBhY2thZ2VCaW5kaW5nKTsNCisJCQkJbWVtYmVyQmluZGluZy5zZXRBc01lbWJlclR5cGUoKTsNCisJCQkJbWVtYmVyVHlwZUJpbmRpbmdzW2NvdW50KytdID0gbWVtYmVyQmluZGluZzsNCisJCQl9DQorCQkJaWYgKGNvdW50ICE9IHNpemUpDQorCQkJCVN5c3RlbS5hcnJheWNvcHkobWVtYmVyVHlwZUJpbmRpbmdzLCAwLCBtZW1iZXJUeXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsNCisJCX0NCisJCWxvY2FsVHlwZS5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVCaW5kaW5nczsNCisJCXJldHVybiBsb2NhbFR5cGU7DQorCX0NCisJDQorCXZvaWQgYnVpbGRMb2NhbFR5cGVCaW5kaW5nKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsNCisJCWJ1aWxkTG9jYWxUeXBlKGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1R5cGUuZlBhY2thZ2UpOw0KKwkJY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsNCisJCWJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOw0KKwkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnZlcmlmeU1ldGhvZHMoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpKTsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIGJ1aWxkTWV0aG9kcygpIHsNCisJCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHMgPT0gbnVsbCkgew0KKwkJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZXRob2RzID0gTm9NZXRob2RzOw0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCS8vIGl0ZXJhdGUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMgdG8gY3JlYXRlIHRoZSBiaW5kaW5ncw0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSByZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7DQorCQlpbnQgc2l6ZSA9IG1ldGhvZHMubGVuZ3RoOw0KKwkJaW50IGNsaW5pdEluZGV4ID0gLTE7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKwkJCWlmIChtZXRob2RzW2ldIGluc3RhbmNlb2YgQ2xpbml0KSB7DQorCQkJCWNsaW5pdEluZGV4ID0gaTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZEJpbmRpbmdzID0gbmV3IE1ldGhvZEJpbmRpbmdbY2xpbml0SW5kZXggPT0gLTEgPyBzaXplIDogc2l6ZSAtIDFdOw0KKw0KKwkJaW50IGNvdW50ID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorCQkJaWYgKGkgIT0gY2xpbml0SW5kZXgpIHsNCisJCQkJTWV0aG9kU2NvcGUgc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgbWV0aG9kc1tpXSwgZmFsc2UpOw0KKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBzY29wZS5jcmVhdGVNZXRob2QobWV0aG9kc1tpXSk7DQorCQkJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIC8vIGlzIG51bGwgaWYgYmluZGluZyBjb3VsZCBub3QgYmUgY3JlYXRlZA0KKwkJCQkJbWV0aG9kQmluZGluZ3NbY291bnQrK10gPSBtZXRob2RCaW5kaW5nOw0KKwkJCX0NCisJCX0NCisJCWlmIChjb3VudCAhPSBtZXRob2RCaW5kaW5ncy5sZW5ndGgpDQorCQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RCaW5kaW5ncywgMCwgbWV0aG9kQmluZGluZ3MgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsNCisNCisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZXRob2RzID0gbWV0aG9kQmluZGluZ3M7DQorCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcubW9kaWZpZXJzIHw9IEFjY1VucmVzb2x2ZWQ7IC8vIHVudGlsIG1ldGhvZHMoKSBpcyBzZW50DQorCQlpZiAocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLmlzTG9jYWxUeXBlKCkpDQorCQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLm1ldGhvZHMoKTsNCisJCS8vIGZhdWx0IHRoZSB0eXBlcyBmb3IgdGhlIGxvY2FsIHR5cGUncyBtZXRob2RzIG5vdyBzaW5jZSB3ZSBuZWVkIHRoZW0NCisJfQ0KKwlTb3VyY2VUeXBlQmluZGluZyBidWlsZFR5cGUoU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCisJCS8vIHByb3ZpZGUgdGhlIHR5cGVEZWNsYXJhdGlvbiB3aXRoIG5lZWRlZCBzY29wZXMNCisJCXJlZmVyZW5jZUNvbnRleHQuc2NvcGUgPSB0aGlzOw0KKwkJcmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIHRydWUpOw0KKwkJcmVmZXJlbmNlQ29udGV4dC5pbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIGZhbHNlKTsNCisNCisJCWlmIChlbmNsb3NpbmdUeXBlID09IG51bGwpIHsNCisJCQljaGFyW11bXSBjbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgcmVmZXJlbmNlQ29udGV4dC5uYW1lKTsNCisJCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgU291cmNlVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCBwYWNrYWdlQmluZGluZywgdGhpcyk7DQorCQl9IGVsc2Ugew0KKwkJCWNoYXJbXVtdIGNsYXNzTmFtZSA9IENoYXJPcGVyYXRpb24uZGVlcENvcHkoZW5jbG9zaW5nVHlwZS5jb21wb3VuZE5hbWUpOw0KKwkJCWNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV0gPQ0KKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWVbY2xhc3NOYW1lLmxlbmd0aCAtIDFdLCByZWZlcmVuY2VDb250ZXh0Lm5hbWUsICckJyk7DQorCQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nID0gbmV3IE1lbWJlclR5cGVCaW5kaW5nKGNsYXNzTmFtZSwgdGhpcywgZW5jbG9zaW5nVHlwZSk7DQorCQl9DQorDQorCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KKwkJc291cmNlVHlwZS5mUGFja2FnZS5hZGRUeXBlKHNvdXJjZVR5cGUpOw0KKwkJY2hlY2tBbmRTZXRNb2RpZmllcnMoKTsNCisNCisJCS8vIExvb2sgYXQgbWVtYmVyIHR5cGVzDQorCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZUJpbmRpbmdzID0gTm9NZW1iZXJUeXBlczsNCisJCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzICE9IG51bGwpIHsNCisJCQlpbnQgc2l6ZSA9IHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMubGVuZ3RoOw0KKwkJCW1lbWJlclR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3NpemVdOw0KKwkJCWludCBjb3VudCA9IDA7DQorCQkJbmV4dE1lbWJlciA6IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorCQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tpXTsNCisJCQkJaWYgKG1lbWJlckNvbnRleHQuaXNJbnRlcmZhY2UoKQ0KKwkJCQkJJiYgc291cmNlVHlwZS5pc05lc3RlZFR5cGUoKQ0KKwkJCQkJJiYgc291cmNlVHlwZS5pc0NsYXNzKCkNCisJCQkJCSYmICFzb3VyY2VUeXBlLmlzU3RhdGljKCkpIHsNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLm5lc3RlZENsYXNzQ2Fubm90RGVjbGFyZUludGVyZmFjZShtZW1iZXJDb250ZXh0KTsNCisJCQkJCWNvbnRpbnVlIG5leHRNZW1iZXI7DQorCQkJCX0NCisJCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gc291cmNlVHlwZTsNCisJCQkJLy8gY2hlY2sgdGhhdCB0aGUgbWVtYmVyIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW4gZW5jbG9zaW5nIHR5cGUNCisJCQkJZG8gew0KKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGUuc291cmNlTmFtZSwgbWVtYmVyQ29udGV4dC5uYW1lKSkgew0KKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmhpZGluZ0VuY2xvc2luZ1R5cGUobWVtYmVyQ29udGV4dCk7DQorCQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsNCisJCQkJCX0NCisJCQkJCXR5cGUgPSB0eXBlLmVuY2xvc2luZ1R5cGUoKTsNCisJCQkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsNCisJCQkJLy8gY2hlY2sgdGhhdCB0aGUgbWVtYmVyIHR5cGUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNpYmxpbmcgbWVtYmVyIHR5cGUNCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsNCisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsNCisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVOZXN0ZWRUeXBlKG1lbWJlckNvbnRleHQpOw0KKwkJCQkJCWNvbnRpbnVlIG5leHRNZW1iZXI7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQ2xhc3NTY29wZSBtZW1iZXJTY29wZSA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIG1lbWJlckNvbnRleHQpOw0KKwkJCQltZW1iZXJUeXBlQmluZGluZ3NbY291bnQrK10gPSBtZW1iZXJTY29wZS5idWlsZFR5cGUoc291cmNlVHlwZSwgcGFja2FnZUJpbmRpbmcpOw0KKwkJCX0NCisJCQlpZiAoY291bnQgIT0gc2l6ZSkNCisJCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJUeXBlQmluZGluZ3MsIDAsIG1lbWJlclR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOw0KKwkJfQ0KKwkJc291cmNlVHlwZS5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVCaW5kaW5nczsNCisJCXJldHVybiBzb3VyY2VUeXBlOw0KKwl9DQorCQ0KKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnMoKSB7DQorCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KKwkJaW50IG1vZGlmaWVycyA9IHNvdXJjZVR5cGUubW9kaWZpZXJzOw0KKwkJaWYgKChtb2RpZmllcnMgJiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pICE9IDApDQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTW9kaWZpZXJGb3JUeXBlKHNvdXJjZVR5cGUpOw0KKw0KKwkJaWYgKHNvdXJjZVR5cGUuaXNNZW1iZXJUeXBlKCkpIHsNCisJCQkvLyBjaGVja3MgZm9yIG1lbWJlciB0eXBlcyBiZWZvcmUgbG9jYWwgdHlwZXMgdG8gY2F0Y2ggbG9jYWwgbWVtYmVycw0KKwkJCWlmIChzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc1N0cmljdGZwKCkpDQorCQkJCW1vZGlmaWVycyB8PSBBY2NTdHJpY3RmcDsNCisJCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNEZXByZWNhdGVkKCkpDQorCQkJCW1vZGlmaWVycyB8PSBBY2NEZXByZWNhdGVkSW1wbGljaXRseTsNCisJCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkNCisJCQkJbW9kaWZpZXJzIHw9IEFjY1B1YmxpYzsNCisJCX0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0xvY2FsVHlwZSgpKSB7DQorCQkJaWYgKHNvdXJjZVR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpDQorCQkJCW1vZGlmaWVycyB8PSBBY2NGaW5hbDsNCisJCQlSZWZlcmVuY2VDb250ZXh0IHJlZkNvbnRleHQgPSBtZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQ7DQorCQkJaWYgKHJlZkNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCisJCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKChUeXBlRGVjbGFyYXRpb24pIHJlZkNvbnRleHQpLmJpbmRpbmc7DQorCQkJCWlmICh0eXBlLmlzU3RyaWN0ZnAoKSkNCisJCQkJCW1vZGlmaWVycyB8PSBBY2NTdHJpY3RmcDsNCisJCQkJaWYgKHR5cGUuaXNEZXByZWNhdGVkKCkpDQorCQkJCQltb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7DQorCQkJfSBlbHNlIHsNCisJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZkNvbnRleHQpLmJpbmRpbmc7DQorCQkJCWlmIChtZXRob2QuaXNTdHJpY3RmcCgpKQ0KKwkJCQkJbW9kaWZpZXJzIHw9IEFjY1N0cmljdGZwOw0KKwkJCQlpZiAobWV0aG9kLmlzRGVwcmVjYXRlZCgpKQ0KKwkJCQkJbW9kaWZpZXJzIHw9IEFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5Ow0KKwkJCX0NCisJCX0NCisJCS8vIGFmdGVyIHRoaXMgcG9pbnQsIHRlc3RzIG9uIHRoZSAxNiBiaXRzIHJlc2VydmVkLg0KKwkJaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsNCisNCisJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgIT0gMCkgew0KKwkJCS8vIGRldGVjdCBhYm5vcm1hbCBjYXNlcyBmb3IgaW50ZXJmYWNlcw0KKwkJCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpKSB7DQorCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0NCisJCQkJCX4oQWNjUHVibGljIHwgQWNjUHJpdmF0ZSB8IEFjY1Byb3RlY3RlZCB8IEFjY1N0YXRpYyB8IEFjY0Fic3RyYWN0IHwgQWNjSW50ZXJmYWNlIHwgQWNjU3RyaWN0ZnApOw0KKwkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVySW50ZXJmYWNlKHNvdXJjZVR5cGUpOw0KKwkJCQkvKg0KKwkJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgeyAvL2ludGVyZmFjZXMgY2Fubm90IGJlIGRlZmluZWQgaW5zaWRlIGEgbWV0aG9kDQorCQkJCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH4oQWNjQWJzdHJhY3QgfCBBY2NJbnRlcmZhY2UgfCBBY2NTdHJpY3RmcCk7DQorCQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckxvY2FsSW50ZXJmYWNlKHNvdXJjZVR5cGUpOw0KKwkJCQkqLw0KKwkJCX0gZWxzZSB7DQorCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NQdWJsaWMgfCBBY2NBYnN0cmFjdCB8IEFjY0ludGVyZmFjZSB8IEFjY1N0cmljdGZwKTsNCisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZShzb3VyY2VUeXBlKTsNCisJCQl9DQorCQkJbW9kaWZpZXJzIHw9IEFjY0Fic3RyYWN0Ow0KKwkJfSBlbHNlIHsNCisJCQkvLyBkZXRlY3QgYWJub3JtYWwgY2FzZXMgZm9yIHR5cGVzDQorCQkJaWYgKHNvdXJjZVR5cGUuaXNNZW1iZXJUeXBlKCkpIHsgLy8gaW5jbHVkZXMgbWVtYmVyIHR5cGVzIGRlZmluZWQgaW5zaWRlIGxvY2FsIHR5cGVzDQorCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0NCisJCQkJCX4oQWNjUHVibGljIHwgQWNjUHJpdmF0ZSB8IEFjY1Byb3RlY3RlZCB8IEFjY1N0YXRpYyB8IEFjY0Fic3RyYWN0IHwgQWNjRmluYWwgfCBBY2NTdHJpY3RmcCk7DQorCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApDQorCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJDbGFzcyhzb3VyY2VUeXBlKTsNCisJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgew0KKwkJCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH4oQWNjQWJzdHJhY3QgfCBBY2NGaW5hbCB8IEFjY1N0cmljdGZwKTsNCisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckxvY2FsQ2xhc3Moc291cmNlVHlwZSk7DQorCQkJfSBlbHNlIHsNCisJCQkJaW50IHVuZXhwZWN0ZWRNb2RpZmllcnMgPSB+KEFjY1B1YmxpYyB8IEFjY0Fic3RyYWN0IHwgQWNjRmluYWwgfCBBY2NTdHJpY3RmcCk7DQorCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApDQorCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JDbGFzcyhzb3VyY2VUeXBlKTsNCisJCQl9DQorDQorCQkJLy8gY2hlY2sgdGhhdCBGaW5hbCBhbmQgQWJzdHJhY3QgYXJlIG5vdCBzZXQgdG9nZXRoZXINCisJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiAoQWNjRmluYWwgfCBBY2NBYnN0cmFjdCkpID09IChBY2NGaW5hbCB8IEFjY0Fic3RyYWN0KSkNCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyQ29tYmluYXRpb25GaW5hbEFic3RyYWN0Rm9yQ2xhc3Moc291cmNlVHlwZSk7DQorCQl9DQorDQorCQlpZiAoc291cmNlVHlwZS5pc01lbWJlclR5cGUoKSkgew0KKwkJCS8vIHRlc3QgdmlzaWJpbGl0eSBtb2RpZmllcnMgaW5jb25zaXN0ZW5jeSwgaXNvbGF0ZSB0aGUgYWNjZXNzb3JzIGJpdHMNCisJCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkgew0KKwkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiAoQWNjUHJvdGVjdGVkIHwgQWNjUHJpdmF0ZSkpICE9IDApIHsNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJGb3JJbnRlcmZhY2VNZW1iZXJUeXBlKHNvdXJjZVR5cGUpOw0KKw0KKwkJCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlDQorCQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApDQorCQkJCQkJbW9kaWZpZXJzIF49IEFjY1Byb3RlY3RlZDsNCisJCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDApDQorCQkJCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlpbnQgYWNjZXNzb3JCaXRzID0gcmVhbE1vZGlmaWVycyAmIChBY2NQdWJsaWMgfCBBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlKTsNCisJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiAoYWNjZXNzb3JCaXRzIC0gMSkpID4gMSkgew0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWVtYmVyVHlwZShzb3VyY2VUeXBlKTsNCisNCisJCQkJCS8vIG5lZWQgdG8ga2VlcCB0aGUgbGVzcyByZXN0cmljdGl2ZQ0KKwkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQdWJsaWMpICE9IDApIHsNCisJCQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkNCisJCQkJCQkJbW9kaWZpZXJzIF49IEFjY1Byb3RlY3RlZDsNCisJCQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1ByaXZhdGUpICE9IDApDQorCQkJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcm90ZWN0ZWQpICE9IDApDQorCQkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQ0KKwkJCQkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQkvLyBzdGF0aWMgbW9kaWZpZXIgdGVzdA0KKwkJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY1N0YXRpYykgPT0gMCkgew0KKwkJCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkNCisJCQkJCW1vZGlmaWVycyB8PSBBY2NTdGF0aWM7DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKCFzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc1N0YXRpYygpKQ0KKwkJCQkJLy8gZXJyb3IgdGhlIGVuY2xvc2luZyB0eXBlIG9mIGEgc3RhdGljIGZpZWxkIG11c3QgYmUgc3RhdGljIG9yIGEgdG9wLWxldmVsIHR5cGUNCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxTdGF0aWNNb2RpZmllckZvck1lbWJlclR5cGUoc291cmNlVHlwZSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJc291cmNlVHlwZS5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQorCX0NCisJDQorCS8qIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGUgbW9kaWZpZXJzIG9mIGEgZmllbGQuDQorCSoNCisJKiA5LjMgJiA4LjMNCisJKiBOZWVkIHRvIGludGVncmF0ZSB0aGUgY2hlY2sgZm9yIHRoZSBmaW5hbCBtb2RpZmllcnMgZm9yIG5lc3RlZCB0eXBlcw0KKwkqDQorCSogTm90ZSA6IEEgc2NvcGUgaXMgYWNjZXNzaWJsZSBieSA6IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zY29wZQ0KKwkqLw0KKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JGaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgew0KKwkJaW50IG1vZGlmaWVycyA9IGZpZWxkQmluZGluZy5tb2RpZmllcnM7DQorCQlpZiAoKG1vZGlmaWVycyAmIEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCkNCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNb2RpZmllckZvckZpZWxkKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsNCisNCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgew0KKwkJCWludCBleHBlY3RlZFZhbHVlID0gQWNjUHVibGljIHwgQWNjU3RhdGljIHwgQWNjRmluYWw7DQorCQkJLy8gc2V0IHRoZSBtb2RpZmllcnMNCisJCQltb2RpZmllcnMgfD0gZXhwZWN0ZWRWYWx1ZTsNCisNCisJCQkvLyBhbmQgdGhlbiBjaGVjayB0aGF0IHRoZXkgYXJlIHRoZSBvbmx5IG9uZXMNCisJCQlpZiAoKG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnKSAhPSBleHBlY3RlZFZhbHVlKQ0KKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2VGaWVsZChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkRGVjbCk7DQorCQkJZmllbGRCaW5kaW5nLm1vZGlmaWVycyA9IG1vZGlmaWVyczsNCisJCQlyZXR1cm47DQorCQl9DQorDQorCQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4NCisJCWludCByZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgQWNjSnVzdEZsYWc7DQorCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9DQorCQkJfihBY2NQdWJsaWMgfCBBY2NQcml2YXRlIHwgQWNjUHJvdGVjdGVkIHwgQWNjRmluYWwgfCBBY2NTdGF0aWMgfCBBY2NUcmFuc2llbnQgfCBBY2NWb2xhdGlsZSk7DQorCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckZpZWxkKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsNCisNCisJCWludCBhY2Nlc3NvckJpdHMgPSByZWFsTW9kaWZpZXJzICYgKEFjY1B1YmxpYyB8IEFjY1Byb3RlY3RlZCB8IEFjY1ByaXZhdGUpOw0KKwkJaWYgKChhY2Nlc3NvckJpdHMgJiAoYWNjZXNzb3JCaXRzIC0gMSkpID4gMSkgew0KKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvckZpZWxkKA0KKwkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsDQorCQkJCWZpZWxkRGVjbCk7DQorDQorCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlDQorCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQdWJsaWMpICE9IDApIHsNCisJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcm90ZWN0ZWQpICE9IDApDQorCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOw0KKwkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1ByaXZhdGUpICE9IDApDQorCQkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsNCisJCQl9DQorCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcm90ZWN0ZWQpICE9IDApDQorCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJpdmF0ZSkgIT0gMCkNCisJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOw0KKwkJfQ0KKw0KKwkJaWYgKChyZWFsTW9kaWZpZXJzICYgKEFjY0ZpbmFsIHwgQWNjVm9sYXRpbGUpKSA9PSAoQWNjRmluYWwgfCBBY2NWb2xhdGlsZSkpDQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyQ29tYmluYXRpb25GaW5hbFZvbGF0aWxlRm9yRmllbGQoDQorCQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywNCisJCQkJZmllbGREZWNsKTsNCisNCisJCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQorCX0NCisJDQorCXByaXZhdGUgdm9pZCBjaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUpIHsNCisJCS8vIHNlYXJjaCB1cCB0aGUgaGllcmFyY2h5IG9mIHRoZSBzb3VyY2VUeXBlIHRvIHNlZSBpZiBhbnkgc3VwZXJUeXBlIGRlZmluZXMgYSBtZW1iZXIgdHlwZQ0KKwkJLy8gd2hlbiBubyBtZW1iZXIgdHlwZXMgYXJlIGRlZmluZWQsIHRhZyB0aGUgc291cmNlVHlwZSAmIGVhY2ggc3VwZXJUeXBlIHdpdGggdGhlIEhhc05vTWVtYmVyVHlwZXMgYml0DQorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gc291cmNlVHlwZTsNCisJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsNCisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsNCisJCWRvIHsNCisJCQlpZiAoKGN1cnJlbnRUeXBlLnRhZ0JpdHMgJiBIYXNOb01lbWJlclR5cGVzKSAhPSAwKQ0KKwkJCQlicmVhazsgLy8gYWxyZWFkeSBrbm93IGl0IGhhcyBubyBpbmhlcml0ZWQgbWVtYmVyIHR5cGVzLCBjYW4gc3RvcCBsb29raW5nIHVwDQorCQkJaWYgKGN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCkgIT0gTm9NZW1iZXJUeXBlcykNCisJCQkJcmV0dXJuOyAvLyBoYXMgbWVtYmVyIHR5cGVzDQorCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KKwkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkNCisJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCisJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsDQorCQkJCQkJMCwNCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sDQorCQkJCQkJMCwNCisJCQkJCQlsYXN0UG9zaXRpb24pOw0KKwkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCisJCQl9DQorCQl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOw0KKw0KKwkJYm9vbGVhbiBoYXNNZW1iZXJzID0gZmFsc2U7DQorCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KKwkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQorCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBJbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7IC8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQNCisJCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7DQorCQkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSGFzTm9NZW1iZXJUeXBlcykgIT0gMCkNCisJCQkJCQkJY29udGludWU7IC8vIGFscmVhZHkga25vdyBpdCBoYXMgbm8gaW5oZXJpdGVkIG1lbWJlciB0eXBlcw0KKwkJCQkJCWlmIChhbkludGVyZmFjZS5tZW1iZXJUeXBlcygpICE9IE5vTWVtYmVyVHlwZXMpIHsNCisJCQkJCQkJaGFzTWVtYmVycyA9IHRydWU7DQorCQkJCQkJCWJyZWFrIGRvbmU7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2Uuc3VwZXJJbnRlcmZhY2VzKCk7DQorCQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsDQorCQkJCQkJCQkJMCwNCisJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sDQorCQkJCQkJCQkJMCwNCisJCQkJCQkJCQlsYXN0UG9zaXRpb24pOw0KKwkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCiAJCQkJCQl9DQogCQkJCQl9DQogCQkJCX0NCi0JCQkJa25vd25GaWVsZE5hbWVzLnB1dChmaWVsZC5uYW1lLCBudWxsKTsgLy8gZW5zdXJlIHRoYXQgdGhlIGR1cGxpY2F0ZSBmaWVsZCBpcyBmb3VuZCAmIHJlbW92ZWQNCi0JCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRmllbGRJblR5cGUocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLCBmaWVsZCk7DQotCQkJCWZpZWxkLmJpbmRpbmcgPSBudWxsOw0KKwkJCX0NCisNCisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KKwkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOw0KKwkJCQkJaWYgKCFoYXNNZW1iZXJzKQ0KKwkJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyB8PSBIYXNOb01lbWJlclR5cGVzOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKCFoYXNNZW1iZXJzKSB7DQorCQkJY3VycmVudFR5cGUgPSBzb3VyY2VUeXBlOw0KKwkJCWRvIHsNCisJCQkJY3VycmVudFR5cGUudGFnQml0cyB8PSBIYXNOb01lbWJlclR5cGVzOw0KKwkJCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7DQorCQl9DQorCX0NCisJDQorCXByaXZhdGUgdm9pZCBjb25uZWN0TWVtYmVyVHlwZXMoKSB7DQorCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KKwkJaWYgKHNvdXJjZVR5cGUubWVtYmVyVHlwZXMgIT0gTm9NZW1iZXJUeXBlcykNCisJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IHNvdXJjZVR5cGUubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKQ0KKwkJCQkgKChTb3VyY2VUeXBlQmluZGluZykgc291cmNlVHlwZS5tZW1iZXJUeXBlc1tpXSkuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsNCisJfQ0KKwkvKg0KKwkJT3VyIGN1cnJlbnQgYmVsaWVmIGJhc2VkIG9uIGF2YWlsYWJsZSBKQ0sgdGVzdHMgaXM6DQorCQkJaW5oZXJpdGVkIG1lbWJlciB0eXBlcyBhcmUgdmlzaWJsZSBhcyBhIHBvdGVudGlhbCBzdXBlcmNsYXNzLg0KKwkJCWluaGVyaXRlZCBpbnRlcmZhY2VzIGFyZSBub3QgdmlzaWJsZSB3aGVuIGRlZmluaW5nIGEgc3VwZXJpbnRlcmZhY2UuDQorCQ0KKwkJRXJyb3IgcmVjb3Zlcnkgc3Rvcnk6DQorCQkJZW5zdXJlIHRoZSBzdXBlcmNsYXNzIGlzIHNldCB0byBqYXZhLmxhbmcuT2JqZWN0IGlmIGEgcHJvYmxlbSBpcyBkZXRlY3RlZA0KKwkJCXJlc29sdmluZyB0aGUgc3VwZXJjbGFzcy4NCisJDQorCQlBbnN3ZXIgZmFsc2UgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkIGFnYWluc3QgdGhlIHNvdXJjZVR5cGUuDQorCSovDQorCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0U3VwZXJjbGFzcygpIHsNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQorCQlpZiAocmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzID09IG51bGwpIHsNCisJCQlpZiAoaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2Uoc291cmNlVHlwZS5zdXBlcmNsYXNzKTsNCisJCQlyZXR1cm4gIWRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHNvdXJjZVR5cGUuc3VwZXJjbGFzcywgbnVsbCk7DQorCQkJLy8gZW5zdXJlIE9iamVjdCBpcyBpbml0aWFsaXplZCBpZiBpdCBjb21lcyBmcm9tIGEgc291cmNlIGZpbGUNCisJCX0NCisJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IGZpbmRTdXBlcnR5cGUocmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzKTsNCisJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsgLy8gaXMgbnVsbCBpZiBhIGN5Y2xlIHdhcyBkZXRlY3RlZCBjeWNsZQ0KKwkJCWlmICghc3VwZXJjbGFzcy5pc1ZhbGlkQmluZGluZygpKSB7DQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRTdXBlcmNsYXNzKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7DQorCQkJfSBlbHNlIGlmIChzdXBlcmNsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJjbGFzc011c3RCZUFDbGFzcyhzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MsIHN1cGVyY2xhc3MpOw0KKwkJCX0gZWxzZSBpZiAoc3VwZXJjbGFzcy5pc0ZpbmFsKCkpIHsNCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuY2xhc3NFeHRlbmRGaW5hbENsYXNzKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7DQorCQkJfSBlbHNlIGlmIChpc0phdmFMYW5nT2JqZWN0KHNvdXJjZVR5cGUpKSB7DQorCQkJCS8vIGNhbiBvbmx5IGhhcHBlbiBpZiBPYmplY3QgZXh0ZW5kcyBhbm90aGVyIHR5cGUuLi4gd2lsbCBuZXZlciBoYXBwZW4gdW5sZXNzIHdlJ3JlIHRlc3RpbmcgZm9yIGl0Lg0KKwkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IG51bGw7DQorCQkJCXJldHVybiB0cnVlOw0KIAkJCX0gZWxzZSB7DQotCQkJCWtub3duRmllbGROYW1lcy5wdXQoZmllbGQubmFtZSwgZmllbGRCaW5kaW5nKTsgLy8gcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHNlZW4gYSBmaWVsZCB3aXRoIHRoaXMgbmFtZQ0KLQkJCQlpZiAoZmllbGRCaW5kaW5nICE9IG51bGwpDQotCQkJCQlmaWVsZEJpbmRpbmdzW2NvdW50KytdID0gZmllbGRCaW5kaW5nOw0KKwkJCQkvLyBvbmx5IHdhbnQgdG8gcmVhY2ggaGVyZSB3aGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQNCisJCQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzLmJpbmRpbmcgPSBzdXBlcmNsYXNzOw0KKwkJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOw0KKwkJCQlyZXR1cm4gdHJ1ZTsNCiAJCQl9DQogCQl9DQotCX0NCi0NCi0JLy8gcmVtb3ZlIGR1cGxpY2F0ZSBmaWVsZHMNCi0JaWYgKGR1cGxpY2F0ZSkgew0KLQkJRmllbGRCaW5kaW5nW10gbmV3RmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdba25vd25GaWVsZE5hbWVzLnNpemUoKSAtIDFdOyAvLyB3ZSBrbm93IHdlJ2xsIGJlIHJlbW92aW5nIGF0IGxlYXN0IDEgZHVwbGljYXRlIG5hbWUNCi0JCXNpemUgPSBjb3VudDsNCi0JCWNvdW50ID0gMDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQotCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZ3NbaV07DQotCQkJaWYgKGtub3duRmllbGROYW1lcy5nZXQoZmllbGRCaW5kaW5nLm5hbWUpICE9IG51bGwpDQotCQkJCW5ld0ZpZWxkQmluZGluZ3NbY291bnQrK10gPSBmaWVsZEJpbmRpbmc7DQorCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQlpZiAoIWlzSmF2YUxhbmdPYmplY3Qoc291cmNlVHlwZSkpIHsNCisJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOw0KKwkJCWlmICgoc291cmNlVHlwZS5zdXBlcmNsYXNzLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSA9PSAwKQ0KKwkJCQlkZXRlY3RDeWNsZShzb3VyY2VUeXBlLCBzb3VyY2VUeXBlLnN1cGVyY2xhc3MsIG51bGwpOw0KKwkJCS8vIGVuc3VyZSBPYmplY3QgaXMgaW5pdGlhbGl6ZWQgaWYgaXQgY29tZXMgZnJvbSBhIHNvdXJjZSBmaWxlDQogCQl9DQotCQlmaWVsZEJpbmRpbmdzID0gbmV3RmllbGRCaW5kaW5nczsNCisJCXJldHVybiBmYWxzZTsgLy8gcmVwb3J0ZWQgc29tZSBlcnJvciBhZ2FpbnN0IHRoZSBzb3VyY2UgdHlwZQ0KIAl9DQogDQotCWlmIChjb3VudCAhPSBmaWVsZEJpbmRpbmdzLmxlbmd0aCkNCi0JCVN5c3RlbS5hcnJheWNvcHkoZmllbGRCaW5kaW5ncywgMCwgZmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykNCi0JCWZpZWxkQmluZGluZ3NbaV0uaWQgPSBpOw0KLQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcuZmllbGRzID0gZmllbGRCaW5kaW5nczsNCi0JaWYgKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5pc0xvY2FsVHlwZSgpKQ0KLQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLmZpZWxkcygpOyAvLyBmYXVsdCB0aGUgdHlwZXMgZm9yIHRoZSBsb2NhbCB0eXBlJ3MgZmllbGRzIG5vdyBzaW5jZSB3ZSBuZWVkIHRoZW0NCi19DQotdm9pZCBidWlsZEZpZWxkc0FuZE1ldGhvZHMoKSB7DQotCWJ1aWxkRmllbGRzKCk7DQotCWJ1aWxkTWV0aG9kcygpOw0KLQ0KLQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQlpZiAoc291cmNlVHlwZS5pc01lbWJlclR5cGUoKSAmJiAhc291cmNlVHlwZS5pc0xvY2FsVHlwZSgpKQ0KLQkJKChNZW1iZXJUeXBlQmluZGluZykgc291cmNlVHlwZSkuY2hlY2tTeW50aGV0aWNBcmdzQW5kRmllbGRzKCk7DQotDQotCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcyA9IHNvdXJjZVR5cGUubWVtYmVyVHlwZXM7DQotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCi0JCSgoU291cmNlVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKS5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsNCi19DQotcHJpdmF0ZSBMb2NhbFR5cGVCaW5kaW5nIGJ1aWxkTG9jYWxUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQotCXJlZmVyZW5jZUNvbnRleHQuc2NvcGUgPSB0aGlzOw0KLQlyZWZlcmVuY2VDb250ZXh0LnN0YXRpY0luaXRpYWxpemVyU2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgcmVmZXJlbmNlQ29udGV4dCwgdHJ1ZSk7DQotCXJlZmVyZW5jZUNvbnRleHQuaW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCBmYWxzZSk7DQotDQotCS8vIGJ1aWxkIHRoZSBiaW5kaW5nIG9yIHRoZSBsb2NhbCB0eXBlDQotCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbmV3IExvY2FsVHlwZUJpbmRpbmcodGhpcywgZW5jbG9zaW5nVHlwZSk7DQotCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZyA9IGxvY2FsVHlwZTsNCi0JY2hlY2tBbmRTZXRNb2RpZmllcnMoKTsNCi0NCi0JLy8gTG9vayBhdCBtZW1iZXIgdHlwZXMNCi0JUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVCaW5kaW5ncyA9IE5vTWVtYmVyVHlwZXM7DQotCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzICE9IG51bGwpIHsNCi0JCWludCBzaXplID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcy5sZW5ndGg7DQotCQltZW1iZXJUeXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsNCi0JCWludCBjb3VudCA9IDA7DQotCQluZXh0TWVtYmVyOiBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tpXTsNCi0JCQlpZiAobWVtYmVyQ29udGV4dC5pc0ludGVyZmFjZSgpKSB7DQotCQkJCXByb2JsZW1SZXBvcnRlcigpLm5lc3RlZENsYXNzQ2Fubm90RGVjbGFyZUludGVyZmFjZShtZW1iZXJDb250ZXh0KTsNCi0JCQkJY29udGludWUgbmV4dE1lbWJlcjsNCi0JCQl9DQotCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gbG9jYWxUeXBlOw0KLQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlDQotCQkJZG8gew0KLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5zb3VyY2VOYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7DQotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWRpbmdFbmNsb3NpbmdUeXBlKG1lbWJlckNvbnRleHQpOw0KLQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsNCi0JCQkJfQ0KLQkJCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7DQotCQkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsNCi0JCQkvLyBjaGVjayB0aGUgbWVtYmVyIHR5cGUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNpYmxpbmcgbWVtYmVyIHR5cGUNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgew0KLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tqXS5uYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7DQotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVOZXN0ZWRUeXBlKG1lbWJlckNvbnRleHQpOw0KLQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlDbGFzc1Njb3BlIG1lbWJlclNjb3BlID0gbmV3IENsYXNzU2NvcGUodGhpcywgcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tpXSk7DQotCQkJTG9jYWxUeXBlQmluZGluZyBtZW1iZXJCaW5kaW5nID0gbWVtYmVyU2NvcGUuYnVpbGRMb2NhbFR5cGUobG9jYWxUeXBlLCBwYWNrYWdlQmluZGluZyk7DQotCQkJbWVtYmVyQmluZGluZy5zZXRBc01lbWJlclR5cGUoKTsNCi0JCQltZW1iZXJUeXBlQmluZGluZ3NbY291bnQrK10gPSBtZW1iZXJCaW5kaW5nOw0KLQkJfQ0KLQkJaWYgKGNvdW50ICE9IHNpemUpDQotCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJUeXBlQmluZGluZ3MsIDAsIG1lbWJlclR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOw0KLQl9DQotCWxvY2FsVHlwZS5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVCaW5kaW5nczsNCi0JcmV0dXJuIGxvY2FsVHlwZTsNCi19DQotdm9pZCBidWlsZExvY2FsVHlwZUJpbmRpbmcoU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgew0KLQlidWlsZExvY2FsVHlwZShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdUeXBlLmZQYWNrYWdlKTsNCi0JY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsNCi0JYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7DQotCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy52ZXJpZnlNZXRob2RzKGVudmlyb25tZW50KCkubWV0aG9kVmVyaWZpZXIoKSk7DQotfQ0KLXByaXZhdGUgdm9pZCBidWlsZE1ldGhvZHMoKSB7DQotCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHMgPT0gbnVsbCkgew0KLQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLm1ldGhvZHMgPSBOb01ldGhvZHM7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JLy8gaXRlcmF0ZSB0aGUgbWV0aG9kIGRlY2xhcmF0aW9ucyB0byBjcmVhdGUgdGhlIGJpbmRpbmdzDQotCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gcmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOw0KLQlpbnQgc2l6ZSA9IG1ldGhvZHMubGVuZ3RoOw0KLQlpbnQgY2xpbml0SW5kZXggPSAtMTsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0JCWlmIChtZXRob2RzW2ldIGluc3RhbmNlb2YgQ2xpbml0KSB7DQotCQkJY2xpbml0SW5kZXggPSBpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RCaW5kaW5ncyA9IG5ldyBNZXRob2RCaW5kaW5nW2NsaW5pdEluZGV4ID09IC0xID8gc2l6ZSA6IHNpemUgLSAxXTsNCi0NCi0JaW50IGNvdW50ID0gMDsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0JCWlmIChpICE9IGNsaW5pdEluZGV4KSB7DQotCQkJTWV0aG9kU2NvcGUgc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgbWV0aG9kc1tpXSwgZmFsc2UpOw0KLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHNjb3BlLmNyZWF0ZU1ldGhvZChtZXRob2RzW2ldKTsNCi0JCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSAvLyBpcyBudWxsIGlmIGJpbmRpbmcgY291bGQgbm90IGJlIGNyZWF0ZWQNCi0JCQkJbWV0aG9kQmluZGluZ3NbY291bnQrK10gPSBtZXRob2RCaW5kaW5nOw0KLQkJfQ0KLQl9DQotCWlmIChjb3VudCAhPSBtZXRob2RCaW5kaW5ncy5sZW5ndGgpDQotCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZEJpbmRpbmdzLCAwLCBtZXRob2RCaW5kaW5ncyA9IG5ldyBNZXRob2RCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOw0KLQ0KLQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcubWV0aG9kcyA9IG1ldGhvZEJpbmRpbmdzOw0KLQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcubW9kaWZpZXJzIHw9IEFjY1VucmVzb2x2ZWQ7IC8vIHVudGlsIG1ldGhvZHMoKSBpcyBzZW50DQotCWlmIChyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcuaXNMb2NhbFR5cGUoKSkNCi0JCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZXRob2RzKCk7IC8vIGZhdWx0IHRoZSB0eXBlcyBmb3IgdGhlIGxvY2FsIHR5cGUncyBtZXRob2RzIG5vdyBzaW5jZSB3ZSBuZWVkIHRoZW0NCi19DQotU291cmNlVHlwZUJpbmRpbmcgYnVpbGRUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQotCS8vIHByb3ZpZGUgdGhlIHR5cGVEZWNsYXJhdGlvbiB3aXRoIG5lZWRlZCBzY29wZXMNCi0JcmVmZXJlbmNlQ29udGV4dC5zY29wZSA9IHRoaXM7DQotCXJlZmVyZW5jZUNvbnRleHQuc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCB0cnVlKTsNCi0JcmVmZXJlbmNlQ29udGV4dC5pbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIGZhbHNlKTsNCi0NCi0JaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgew0KLQkJY2hhcltdW10gY2xhc3NOYW1lID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUsIHJlZmVyZW5jZUNvbnRleHQubmFtZSk7DQotCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgU291cmNlVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCBwYWNrYWdlQmluZGluZywgdGhpcyk7DQotCX0gZWxzZSB7DQotCQljaGFyW11bXSBjbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmRlZXBDb3B5KGVuY2xvc2luZ1R5cGUuY29tcG91bmROYW1lKTsNCi0JCWNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWVbY2xhc3NOYW1lLmxlbmd0aCAtIDFdLCByZWZlcmVuY2VDb250ZXh0Lm5hbWUsICckJyk7DQotCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgTWVtYmVyVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCB0aGlzLCBlbmNsb3NpbmdUeXBlKTsNCi0JfQ0KLQ0KLQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQlzb3VyY2VUeXBlLmZQYWNrYWdlLmFkZFR5cGUoc291cmNlVHlwZSk7DQotCWNoZWNrQW5kU2V0TW9kaWZpZXJzKCk7DQotDQotCS8vIExvb2sgYXQgbWVtYmVyIHR5cGVzDQotCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlQmluZGluZ3MgPSBOb01lbWJlclR5cGVzOw0KLQlpZiAocmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcyAhPSBudWxsKSB7DQotCQlpbnQgc2l6ZSA9IHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMubGVuZ3RoOw0KLQkJbWVtYmVyVHlwZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07DQotCQlpbnQgY291bnQgPSAwOw0KLQkJbmV4dE1lbWJlcjogZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0JCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbaV07DQotCQkJaWYgKG1lbWJlckNvbnRleHQuaXNJbnRlcmZhY2UoKSAmJiBzb3VyY2VUeXBlLmlzTmVzdGVkVHlwZSgpICYmIHNvdXJjZVR5cGUuaXNDbGFzcygpICYmICFzb3VyY2VUeXBlLmlzU3RhdGljKCkpIHsNCi0JCQkJcHJvYmxlbVJlcG9ydGVyKCkubmVzdGVkQ2xhc3NDYW5ub3REZWNsYXJlSW50ZXJmYWNlKG1lbWJlckNvbnRleHQpOw0KLQkJCQljb250aW51ZSBuZXh0TWVtYmVyOw0KLQkJCX0NCi0JCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBzb3VyY2VUeXBlOw0KLQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlDQotCQkJZG8gew0KLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5zb3VyY2VOYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7DQotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWRpbmdFbmNsb3NpbmdUeXBlKG1lbWJlckNvbnRleHQpOw0KLQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsNCi0JCQkJfQ0KLQkJCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7DQotCQkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsNCi0JCQkvLyBjaGVjayB0aGF0IHRoZSBtZW1iZXIgdHlwZSBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFub3RoZXIgc2libGluZyBtZW1iZXIgdHlwZQ0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7DQotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsNCi0JCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU5lc3RlZFR5cGUobWVtYmVyQ29udGV4dCk7DQotCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCUNsYXNzU2NvcGUgbWVtYmVyU2NvcGUgPSBuZXcgQ2xhc3NTY29wZSh0aGlzLCBtZW1iZXJDb250ZXh0KTsNCi0JCQltZW1iZXJUeXBlQmluZGluZ3NbY291bnQrK10gPSBtZW1iZXJTY29wZS5idWlsZFR5cGUoc291cmNlVHlwZSwgcGFja2FnZUJpbmRpbmcpOw0KLQkJfQ0KLQkJaWYgKGNvdW50ICE9IHNpemUpDQotCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJUeXBlQmluZGluZ3MsIDAsIG1lbWJlclR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOw0KLQl9DQotCXNvdXJjZVR5cGUubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlQmluZGluZ3M7DQotCXJldHVybiBzb3VyY2VUeXBlOw0KLX0NCi1wcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnMoKSB7DQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWludCBtb2RpZmllcnMgPSBzb3VyY2VUeXBlLm1vZGlmaWVyczsNCi0JaWYgKChtb2RpZmllcnMgJiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pICE9IDApDQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNb2RpZmllckZvclR5cGUoc291cmNlVHlwZSk7DQotDQotCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpKSB7IC8vIGNoZWNrcyBmb3IgbWVtYmVyIHR5cGVzIGJlZm9yZSBsb2NhbCB0eXBlcyB0byBjYXRjaCBsb2NhbCBtZW1iZXJzDQotCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNTdHJpY3RmcCgpKQ0KLQkJCW1vZGlmaWVycyB8PSBBY2NTdHJpY3RmcDsNCi0JCWlmIChzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc0RlcHJlY2F0ZWQoKSkNCi0JCQltb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7DQotCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkNCi0JCQltb2RpZmllcnMgfD0gQWNjUHVibGljOw0KLQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgew0KLQkJaWYgKHNvdXJjZVR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpDQotCQkJbW9kaWZpZXJzIHw9IEFjY0ZpbmFsOw0KLQkJUmVmZXJlbmNlQ29udGV4dCByZWZDb250ZXh0ID0gbWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0Ow0KLQkJaWYgKHJlZkNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0JCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoKFR5cGVEZWNsYXJhdGlvbikgcmVmQ29udGV4dCkuYmluZGluZzsNCi0JCQlpZiAodHlwZS5pc1N0cmljdGZwKCkpDQotCQkJCW1vZGlmaWVycyB8PSBBY2NTdHJpY3RmcDsNCi0JCQlpZiAodHlwZS5pc0RlcHJlY2F0ZWQoKSkNCi0JCQkJbW9kaWZpZXJzIHw9IEFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5Ow0KLQkJfSBlbHNlIHsNCi0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmQ29udGV4dCkuYmluZGluZzsNCi0JCQlpZiAobWV0aG9kLmlzU3RyaWN0ZnAoKSkNCi0JCQkJbW9kaWZpZXJzIHw9IEFjY1N0cmljdGZwOw0KLQkJCWlmIChtZXRob2QuaXNEZXByZWNhdGVkKCkpDQotCQkJCW1vZGlmaWVycyB8PSBBY2NEZXByZWNhdGVkSW1wbGljaXRseTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4NCi0JaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsNCi0NCi0JaWYgKChyZWFsTW9kaWZpZXJzICYgQWNjSW50ZXJmYWNlKSAhPSAwKSB7DQotCQkvLyBkZXRlY3QgYWJub3JtYWwgY2FzZXMgZm9yIGludGVyZmFjZXMNCi0JCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpKSB7DQotCQkJaW50IHVuZXhwZWN0ZWRNb2RpZmllcnMgPSB+KEFjY1B1YmxpYyB8IEFjY1ByaXZhdGUgfCBBY2NQcm90ZWN0ZWQgfCBBY2NTdGF0aWMgfCBBY2NBYnN0cmFjdCB8IEFjY0ludGVyZmFjZSB8IEFjY1N0cmljdGZwKTsNCi0JCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJJbnRlcmZhY2Uoc291cmNlVHlwZSk7DQotCQkvKg0KLQkJfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpIHsgLy9pbnRlcmZhY2VzIGNhbm5vdCBiZSBkZWZpbmVkIGluc2lkZSBhIG1ldGhvZA0KLQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NBYnN0cmFjdCB8IEFjY0ludGVyZmFjZSB8IEFjY1N0cmljdGZwKTsNCi0JCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JMb2NhbEludGVyZmFjZShzb3VyY2VUeXBlKTsNCi0JCSovDQotCQl9IGVsc2Ugew0KLQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NQdWJsaWMgfCBBY2NBYnN0cmFjdCB8IEFjY0ludGVyZmFjZSB8IEFjY1N0cmljdGZwKTsNCi0JCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQ0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2Uoc291cmNlVHlwZSk7DQotCQl9DQotCQltb2RpZmllcnMgfD0gQWNjQWJzdHJhY3Q7DQotCX0gZWxzZSB7DQotCQkvLyBkZXRlY3QgYWJub3JtYWwgY2FzZXMgZm9yIHR5cGVzDQotCQlpZiAoc291cmNlVHlwZS5pc01lbWJlclR5cGUoKSkgeyAvLyBpbmNsdWRlcyBtZW1iZXIgdHlwZXMgZGVmaW5lZCBpbnNpZGUgbG9jYWwgdHlwZXMNCi0JCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH4oQWNjUHVibGljIHwgQWNjUHJpdmF0ZSB8IEFjY1Byb3RlY3RlZCB8IEFjY1N0YXRpYyB8IEFjY0Fic3RyYWN0IHwgQWNjRmluYWwgfCBBY2NTdHJpY3RmcCk7DQotCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkNCi0JCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVyQ2xhc3Moc291cmNlVHlwZSk7DQotCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgew0KLQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NBYnN0cmFjdCB8IEFjY0ZpbmFsIHwgQWNjU3RyaWN0ZnApOw0KLQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApDQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckxvY2FsQ2xhc3Moc291cmNlVHlwZSk7DQotCQl9IGVsc2Ugew0KLQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NQdWJsaWMgfCBBY2NBYnN0cmFjdCB8IEFjY0ZpbmFsIHwgQWNjU3RyaWN0ZnApOw0KLQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApDQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckNsYXNzKHNvdXJjZVR5cGUpOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgdGhhdCBGaW5hbCBhbmQgQWJzdHJhY3QgYXJlIG5vdCBzZXQgdG9nZXRoZXINCi0JCWlmICgocmVhbE1vZGlmaWVycyAmIChBY2NGaW5hbCB8IEFjY0Fic3RyYWN0KSkgPT0gKEFjY0ZpbmFsIHwgQWNjQWJzdHJhY3QpKQ0KLQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxBYnN0cmFjdEZvckNsYXNzKHNvdXJjZVR5cGUpOw0KLQl9DQotDQotCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpKSB7DQotCQkvLyB0ZXN0IHZpc2liaWxpdHkgbW9kaWZpZXJzIGluY29uc2lzdGVuY3ksIGlzb2xhdGUgdGhlIGFjY2Vzc29ycyBiaXRzDQotCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkgew0KLQkJCWlmICgocmVhbE1vZGlmaWVycyAmIChBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlKSkgIT0gMCkgew0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyRm9ySW50ZXJmYWNlTWVtYmVyVHlwZShzb3VyY2VUeXBlKTsNCi0NCi0JCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlDQotCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkNCi0JCQkJCW1vZGlmaWVycyBePSBBY2NQcm90ZWN0ZWQ7DQotCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDApDQotCQkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsNCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWludCBhY2Nlc3NvckJpdHMgPSByZWFsTW9kaWZpZXJzICYgKEFjY1B1YmxpYyB8IEFjY1Byb3RlY3RlZCB8IEFjY1ByaXZhdGUpOw0KLQkJCWlmICgoYWNjZXNzb3JCaXRzICYgKGFjY2Vzc29yQml0cyAtIDEpKSA+IDEpIHsNCi0JCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWVtYmVyVHlwZShzb3VyY2VUeXBlKTsNCi0NCi0JCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlDQotCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHVibGljKSAhPSAwKSB7DQotCQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkNCi0JCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOw0KLQkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQ0KLQkJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOw0KLQkJCQl9DQotCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQ0KLQkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQ0KLQkJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIHN0YXRpYyBtb2RpZmllciB0ZXN0DQotCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBBY2NTdGF0aWMpID09IDApIHsNCi0JCQlpZiAoc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkNCi0JCQkJbW9kaWZpZXJzIHw9IEFjY1N0YXRpYzsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKCFzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc1N0YXRpYygpKQ0KLQkJCQkvLyBlcnJvciB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgYSBzdGF0aWMgZmllbGQgbXVzdCBiZSBzdGF0aWMgb3IgYSB0b3AtbGV2ZWwgdHlwZQ0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsU3RhdGljTW9kaWZpZXJGb3JNZW1iZXJUeXBlKHNvdXJjZVR5cGUpOw0KLQkJfQ0KLQl9DQotDQotCXNvdXJjZVR5cGUubW9kaWZpZXJzID0gbW9kaWZpZXJzOw0KLX0NCi0vKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIG1vZGlmaWVycyBvZiBhIGZpZWxkLg0KLSoNCi0qIDkuMyAmIDguMw0KLSogTmVlZCB0byBpbnRlZ3JhdGUgdGhlIGNoZWNrIGZvciB0aGUgZmluYWwgbW9kaWZpZXJzIGZvciBuZXN0ZWQgdHlwZXMNCi0qDQotKiBOb3RlIDogQSBzY29wZSBpcyBhY2Nlc3NpYmxlIGJ5IDogZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNjb3BlDQotKi8NCi0NCi1wcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JGaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgew0KLQlpbnQgbW9kaWZpZXJzID0gZmllbGRCaW5kaW5nLm1vZGlmaWVyczsNCi0JaWYgKChtb2RpZmllcnMgJiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pICE9IDApDQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNb2RpZmllckZvckZpZWxkKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsNCi0NCi0JaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7DQotCQlpbnQgZXhwZWN0ZWRWYWx1ZSA9IEFjY1B1YmxpYyB8IEFjY1N0YXRpYyB8IEFjY0ZpbmFsOw0KLQkJLy8gc2V0IHRoZSBtb2RpZmllcnMNCi0JCW1vZGlmaWVycyB8PSBleHBlY3RlZFZhbHVlOw0KLQ0KLQkJLy8gYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGV5IGFyZSB0aGUgb25seSBvbmVzDQotCQlpZiAoKG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnKSAhPSBleHBlY3RlZFZhbHVlKQ0KLQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZUZpZWxkKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsNCi0JCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JLy8gYWZ0ZXIgdGhpcyBwb2ludCwgdGVzdHMgb24gdGhlIDE2IGJpdHMgcmVzZXJ2ZWQuDQotCWludCByZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgQWNjSnVzdEZsYWc7DQotCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NQdWJsaWMgfCBBY2NQcml2YXRlIHwgQWNjUHJvdGVjdGVkIHwgQWNjRmluYWwgfCBBY2NTdGF0aWMgfCBBY2NUcmFuc2llbnQgfCBBY2NWb2xhdGlsZSk7DQotCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApDQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkRGVjbCk7DQotDQotCWludCBhY2Nlc3NvckJpdHMgPSByZWFsTW9kaWZpZXJzICYgKEFjY1B1YmxpYyB8IEFjY1Byb3RlY3RlZCB8IEFjY1ByaXZhdGUpOw0KLQlpZiAoKGFjY2Vzc29yQml0cyAmIChhY2Nlc3NvckJpdHMgLSAxKSkgPiAxKSB7DQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JGaWVsZChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkRGVjbCk7DQotDQotCQkvLyBuZWVkIHRvIGtlZXAgdGhlIGxlc3MgcmVzdHJpY3RpdmUNCi0JCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHVibGljKSAhPSAwKSB7DQotCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcm90ZWN0ZWQpICE9IDApDQotCQkJCW1vZGlmaWVycyBePSBBY2NQcm90ZWN0ZWQ7DQotCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQ0KLQkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsNCi0JCX0NCi0JCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQ0KLQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJpdmF0ZSkgIT0gMCkNCi0JCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7DQotCX0NCi0NCi0JaWYgKChyZWFsTW9kaWZpZXJzICYgKEFjY0ZpbmFsIHwgQWNjVm9sYXRpbGUpKSA9PSAoQWNjRmluYWwgfCBBY2NWb2xhdGlsZSkpDQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsVm9sYXRpbGVGb3JGaWVsZChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkRGVjbCk7DQotDQotCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQotfQ0KLXByaXZhdGUgdm9pZCBjaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUpIHsNCi0JLy8gc2VhcmNoIHVwIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHNvdXJjZVR5cGUgdG8gc2VlIGlmIGFueSBzdXBlclR5cGUgZGVmaW5lcyBhIG1lbWJlciB0eXBlDQotCS8vIHdoZW4gbm8gbWVtYmVyIHR5cGVzIGFyZSBkZWZpbmVkLCB0YWcgdGhlIHNvdXJjZVR5cGUgJiBlYWNoIHN1cGVyVHlwZSB3aXRoIHRoZSBIYXNOb01lbWJlclR5cGVzIGJpdA0KLQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gc291cmNlVHlwZTsNCi0JUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOw0KLQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQotCWRvIHsNCi0JCWlmICgoY3VycmVudFR5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApIGJyZWFrOyAvLyBhbHJlYWR5IGtub3cgaXQgaGFzIG5vIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMsIGNhbiBzdG9wIGxvb2tpbmcgdXANCi0JCWlmIChjdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpICE9IE5vTWVtYmVyVHlwZXMpIHJldHVybjsgLy8gaGFzIG1lbWJlciB0eXBlcw0KLQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCi0JCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQotCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpDQotCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCi0JCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQotCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQotCQl9DQotCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7DQotDQotCWJvb2xlYW4gaGFzTWVtYmVycyA9IGZhbHNlOw0KLQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KLQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCi0JCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1tqXTsNCi0JCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeyAvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkDQotCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7DQotCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBIYXNOb01lbWJlclR5cGVzKSAhPSAwKSBjb250aW51ZTsgLy8gYWxyZWFkeSBrbm93IGl0IGhhcyBubyBpbmhlcml0ZWQgbWVtYmVyIHR5cGVzDQotCQkJCQlpZiAoYW5JbnRlcmZhY2UubWVtYmVyVHlwZXMoKSAhPSBOb01lbWJlclR5cGVzKSB7DQotCQkJCQkJaGFzTWVtYmVycyA9IHRydWU7DQotCQkJCQkJYnJlYWsgZG9uZTsNCi0JCQkJCX0NCi0NCi0JCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2Uuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsNCi0JCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCi0JCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KLQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7DQotCQkJCWlmICghaGFzTWVtYmVycykNCi0JCQkJCWludGVyZmFjZXNbal0udGFnQml0cyB8PSBIYXNOb01lbWJlclR5cGVzOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlpZiAoIWhhc01lbWJlcnMpIHsNCi0JCWN1cnJlbnRUeXBlID0gc291cmNlVHlwZTsNCi0JCWRvIHsNCi0JCQljdXJyZW50VHlwZS50YWdCaXRzIHw9IEhhc05vTWVtYmVyVHlwZXM7DQotCQl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOw0KLQl9DQotfQ0KLXByaXZhdGUgdm9pZCBjb25uZWN0TWVtYmVyVHlwZXMoKSB7DQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWlmIChzb3VyY2VUeXBlLm1lbWJlclR5cGVzICE9IE5vTWVtYmVyVHlwZXMpDQotCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IHNvdXJjZVR5cGUubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKQ0KLQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHNvdXJjZVR5cGUubWVtYmVyVHlwZXNbaV0pLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7DQotfQ0KLS8qDQotCU91ciBjdXJyZW50IGJlbGllZiBiYXNlZCBvbiBhdmFpbGFibGUgSkNLIHRlc3RzIGlzOg0KLQkJaW5oZXJpdGVkIG1lbWJlciB0eXBlcyBhcmUgdmlzaWJsZSBhcyBhIHBvdGVudGlhbCBzdXBlcmNsYXNzLg0KLQkJaW5oZXJpdGVkIGludGVyZmFjZXMgYXJlIG5vdCB2aXNpYmxlIHdoZW4gZGVmaW5pbmcgYSBzdXBlcmludGVyZmFjZS4NCi0NCi0JRXJyb3IgcmVjb3Zlcnkgc3Rvcnk6DQotCQllbnN1cmUgdGhlIHN1cGVyY2xhc3MgaXMgc2V0IHRvIGphdmEubGFuZy5PYmplY3QgaWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkDQotCQlyZXNvbHZpbmcgdGhlIHN1cGVyY2xhc3MuDQotDQotCUFuc3dlciBmYWxzZSBpZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgc291cmNlVHlwZS4NCi0qLw0KLQ0KLXByaXZhdGUgYm9vbGVhbiBjb25uZWN0U3VwZXJjbGFzcygpIHsNCi0JU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCi0JaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcyA9PSBudWxsKSB7DQotCQlpZiAoaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkgcmV0dXJuIHRydWU7DQotCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOw0KLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKHNvdXJjZVR5cGUuc3VwZXJjbGFzcyk7CQkNCi0JCXJldHVybiAhZGV0ZWN0Q3ljbGUoc291cmNlVHlwZSwgc291cmNlVHlwZS5zdXBlcmNsYXNzLCBudWxsKTsgLy8gZW5zdXJlIE9iamVjdCBpcyBpbml0aWFsaXplZCBpZiBpdCBjb21lcyBmcm9tIGEgc291cmNlIGZpbGUNCi0JfQ0KLQ0KLQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MgPSBmaW5kU3VwZXJ0eXBlKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcyk7DQotCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsgLy8gaXMgbnVsbCBpZiBhIGN5Y2xlIHdhcyBkZXRlY3RlZCBjeWNsZQ0KLQkJaWYgKCFzdXBlcmNsYXNzLmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkU3VwZXJjbGFzcyhzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MsIHN1cGVyY2xhc3MpOw0KLQkJfSBlbHNlIGlmIChzdXBlcmNsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCi0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5zdXBlcmNsYXNzTXVzdEJlQUNsYXNzKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7DQotCQl9IGVsc2UgaWYgKHN1cGVyY2xhc3MuaXNGaW5hbCgpKSB7DQotCQkJcHJvYmxlbVJlcG9ydGVyKCkuY2xhc3NFeHRlbmRGaW5hbENsYXNzKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7DQotCQl9IGVsc2UgaWYgKGlzSmF2YUxhbmdPYmplY3Qoc291cmNlVHlwZSkpIHsNCi0JCQkvLyBjYW4gb25seSBoYXBwZW4gaWYgT2JqZWN0IGV4dGVuZHMgYW5vdGhlciB0eXBlLi4uIHdpbGwgbmV2ZXIgaGFwcGVuIHVubGVzcyB3ZSdyZSB0ZXN0aW5nIGZvciBpdC4NCi0JCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQotCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gbnVsbDsNCisJLyoNCisJCU91ciBjdXJyZW50IGJlbGllZiBiYXNlZCBvbiBhdmFpbGFibGUgSkNLIDEuMyB0ZXN0cyBpczoNCisJCQlpbmhlcml0ZWQgbWVtYmVyIHR5cGVzIGFyZSB2aXNpYmxlIGFzIGEgcG90ZW50aWFsIHN1cGVyY2xhc3MuDQorCQkJaW5oZXJpdGVkIGludGVyZmFjZXMgYXJlIHZpc2libGUgd2hlbiBkZWZpbmluZyBhIHN1cGVyaW50ZXJmYWNlLg0KKwkNCisJCUVycm9yIHJlY292ZXJ5IHN0b3J5Og0KKwkJCWVuc3VyZSB0aGUgc3VwZXJpbnRlcmZhY2VzIGNvbnRhaW4gb25seSB2YWxpZCB2aXNpYmxlIGludGVyZmFjZXMuDQorCQ0KKwkJQW5zd2VyIGZhbHNlIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZCBhZ2FpbnN0IHRoZSBzb3VyY2VUeXBlLg0KKwkqLw0KKwlwcml2YXRlIGJvb2xlYW4gY29ubmVjdFN1cGVySW50ZXJmYWNlcygpIHsNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQorCQlzb3VyY2VUeXBlLnN1cGVySW50ZXJmYWNlcyA9IE5vU3VwZXJJbnRlcmZhY2VzOw0KKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzID09IG51bGwpDQogCQkJcmV0dXJuIHRydWU7DQotCQl9IGVsc2Ugew0KLQkJCS8vIG9ubHkgd2FudCB0byByZWFjaCBoZXJlIHdoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZA0KLQkJCXJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcy5iaW5kaW5nID0gc3VwZXJjbGFzczsNCi0JCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOw0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQl9DQogDQotCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCi0JaWYgKCFpc0phdmFMYW5nT2JqZWN0KHNvdXJjZVR5cGUpKSB7DQotCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOw0KLQkJaWYgKChzb3VyY2VUeXBlLnN1cGVyY2xhc3MudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApDQotCQkJZGV0ZWN0Q3ljbGUoc291cmNlVHlwZSwgc291cmNlVHlwZS5zdXBlcmNsYXNzLCBudWxsKTsgLy8gZW5zdXJlIE9iamVjdCBpcyBpbml0aWFsaXplZCBpZiBpdCBjb21lcyBmcm9tIGEgc291cmNlIGZpbGUNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7IC8vIHJlcG9ydGVkIHNvbWUgZXJyb3IgYWdhaW5zdCB0aGUgc291cmNlIHR5cGUNCi19DQotLyoNCi0JT3VyIGN1cnJlbnQgYmVsaWVmIGJhc2VkIG9uIGF2YWlsYWJsZSBKQ0sgMS4zIHRlc3RzIGlzOg0KLQkJaW5oZXJpdGVkIG1lbWJlciB0eXBlcyBhcmUgdmlzaWJsZSBhcyBhIHBvdGVudGlhbCBzdXBlcmNsYXNzLg0KLQkJaW5oZXJpdGVkIGludGVyZmFjZXMgYXJlIHZpc2libGUgd2hlbiBkZWZpbmluZyBhIHN1cGVyaW50ZXJmYWNlLg0KLQ0KLQlFcnJvciByZWNvdmVyeSBzdG9yeToNCi0JCWVuc3VyZSB0aGUgc3VwZXJpbnRlcmZhY2VzIGNvbnRhaW4gb25seSB2YWxpZCB2aXNpYmxlIGludGVyZmFjZXMuDQotDQotCUFuc3dlciBmYWxzZSBpZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgc291cmNlVHlwZS4NCi0qLw0KLQ0KLXByaXZhdGUgYm9vbGVhbiBjb25uZWN0U3VwZXJJbnRlcmZhY2VzKCkgew0KLQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQlzb3VyY2VUeXBlLnN1cGVySW50ZXJmYWNlcyA9IE5vU3VwZXJJbnRlcmZhY2VzOw0KLQlpZiAocmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMgPT0gbnVsbCkNCi0JCXJldHVybiB0cnVlOw0KLQ0KLQlib29sZWFuIG5vUHJvYmxlbXMgPSB0cnVlOw0KLQlpbnQgbGVuZ3RoID0gcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMubGVuZ3RoOw0KLQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOw0KLQlpbnQgY291bnQgPSAwOw0KLQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJUmVmZXJlbmNlQmluZGluZyBzdXBlckludGVyZmFjZSA9IGZpbmRTdXBlcnR5cGUocmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0pOw0KLQkJaWYgKHN1cGVySW50ZXJmYWNlID09IG51bGwpIHsgLy8gZGV0ZWN0ZWQgY3ljbGUNCi0JCQlub1Byb2JsZW1zID0gZmFsc2U7DQotCQkJY29udGludWUgbmV4dEludGVyZmFjZTsNCi0JCX0NCi0JCWlmICghc3VwZXJJbnRlcmZhY2UuaXNWYWxpZEJpbmRpbmcoKSkgew0KLQkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRTdXBlcmludGVyZmFjZShzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LnN1cGVySW50ZXJmYWNlc1tpXSwgc3VwZXJJbnRlcmZhY2UpOw0KLQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCi0JCQlub1Byb2JsZW1zID0gZmFsc2U7DQotCQkJY29udGludWUgbmV4dEludGVyZmFjZTsNCi0JCX0NCi0NCi0JCS8vIENoZWNrIGZvciBhIGR1cGxpY2F0ZSBpbnRlcmZhY2Ugb25jZSB0aGUgbmFtZSBpcyByZXNvbHZlZCwgb3RoZXJ3aXNlIHdlIG1heSBiZSBjb25mdXNlZCAoaWUgOiBhLmIuSSBhbmQgYy5kLkkpDQotCQlmb3IgKGludCBrID0gMDsgayA8IGNvdW50OyBrKyspIHsNCi0JCQlpZiAoaW50ZXJmYWNlQmluZGluZ3Nba10gPT0gc3VwZXJJbnRlcmZhY2UpIHsNCi0JCQkJLy8gc2hvdWxkIHRoaXMgYmUgdHJlYXRlZCBhcyBhIHdhcm5pbmc/DQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZVN1cGVyaW50ZXJmYWNlKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQsIHN1cGVySW50ZXJmYWNlKTsNCisJCWJvb2xlYW4gbm9Qcm9ibGVtcyA9IHRydWU7DQorCQlpbnQgbGVuZ3RoID0gcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMubGVuZ3RoOw0KKwkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsNCisJCWludCBjb3VudCA9IDA7DQorCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSBmaW5kU3VwZXJ0eXBlKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzW2ldKTsNCisJCQlpZiAoc3VwZXJJbnRlcmZhY2UgPT0gbnVsbCkgeyAvLyBkZXRlY3RlZCBjeWNsZQ0KKwkJCQlub1Byb2JsZW1zID0gZmFsc2U7DQogCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7DQogCQkJfQ0KKwkJCWlmICghc3VwZXJJbnRlcmZhY2UuaXNWYWxpZEJpbmRpbmcoKSkgew0KKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkU3VwZXJpbnRlcmZhY2UoDQorCQkJCQlzb3VyY2VUeXBlLA0KKwkJCQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0sDQorCQkJCQlzdXBlckludGVyZmFjZSk7DQorCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCisJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOw0KKwkJCQljb250aW51ZSBuZXh0SW50ZXJmYWNlOw0KKwkJCX0NCisJCQkvLyBDaGVjayBmb3IgYSBkdXBsaWNhdGUgaW50ZXJmYWNlIG9uY2UgdGhlIG5hbWUgaXMgcmVzb2x2ZWQsIG90aGVyd2lzZSB3ZSBtYXkgYmUgY29uZnVzZWQgKGllIDogYS5iLkkgYW5kIGMuZC5JKQ0KKwkJCWZvciAoaW50IGsgPSAwOyBrIDwgY291bnQ7IGsrKykgew0KKwkJCQlpZiAoaW50ZXJmYWNlQmluZGluZ3Nba10gPT0gc3VwZXJJbnRlcmZhY2UpIHsNCisJCQkJCS8vIHNob3VsZCB0aGlzIGJlIHRyZWF0ZWQgYXMgYSB3YXJuaW5nPw0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlU3VwZXJpbnRlcmZhY2Uoc291cmNlVHlwZSwgcmVmZXJlbmNlQ29udGV4dCwgc3VwZXJJbnRlcmZhY2UpOw0KKwkJCQkJY29udGludWUgbmV4dEludGVyZmFjZTsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAoc3VwZXJJbnRlcmZhY2UuaXNDbGFzcygpKSB7DQorCQkJCXByb2JsZW1SZXBvcnRlcigpLnN1cGVyaW50ZXJmYWNlTXVzdEJlQW5JbnRlcmZhY2Uoc291cmNlVHlwZSwgcmVmZXJlbmNlQ29udGV4dCwgc3VwZXJJbnRlcmZhY2UpOw0KKwkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsNCisJCQkJY29udGludWUgbmV4dEludGVyZmFjZTsNCisJCQl9DQorCQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0uYmluZGluZyA9IHN1cGVySW50ZXJmYWNlOw0KKwkJCS8vIG9ubHkgd2FudCB0byByZWFjaCBoZXJlIHdoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZA0KKwkJCWludGVyZmFjZUJpbmRpbmdzW2NvdW50KytdID0gc3VwZXJJbnRlcmZhY2U7DQogCQl9DQotCQlpZiAoc3VwZXJJbnRlcmZhY2UuaXNDbGFzcygpKSB7DQotCQkJcHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJpbnRlcmZhY2VNdXN0QmVBbkludGVyZmFjZShzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LCBzdXBlckludGVyZmFjZSk7DQotCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KLQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsNCi0JCQljb250aW51ZSBuZXh0SW50ZXJmYWNlOw0KKwkJLy8gaG9sZCBvbnRvIGFsbCBjb3JyZWN0bHkgcmVzb2x2ZWQgc3VwZXJpbnRlcmZhY2VzDQorCQlpZiAoY291bnQgPiAwKSB7DQorCQkJaWYgKGNvdW50ICE9IGxlbmd0aCkNCisJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VCaW5kaW5ncywgMCwgaW50ZXJmYWNlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsNCisJCQlzb3VyY2VUeXBlLnN1cGVySW50ZXJmYWNlcyA9IGludGVyZmFjZUJpbmRpbmdzOw0KIAkJfQ0KLQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0uYmluZGluZyA9IHN1cGVySW50ZXJmYWNlOyAvLyBvbmx5IHdhbnQgdG8gcmVhY2ggaGVyZSB3aGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQNCi0JCWludGVyZmFjZUJpbmRpbmdzW2NvdW50KytdID0gc3VwZXJJbnRlcmZhY2U7DQorCQlyZXR1cm4gbm9Qcm9ibGVtczsNCiAJfQ0KKwkNCisJdm9pZCBjb25uZWN0VHlwZUhpZXJhcmNoeSgpIHsNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQorCQlpZiAoKHNvdXJjZVR5cGUudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApIHsNCisJCQlib29sZWFuIG5vUHJvYmxlbXMgPSB0cnVlOw0KKwkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBCZWdpbkhpZXJhcmNoeUNoZWNrOw0KKwkJCWlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkNCisJCQkJbm9Qcm9ibGVtcyAmPSBjb25uZWN0U3VwZXJjbGFzcygpOw0KKwkJCW5vUHJvYmxlbXMgJj0gY29ubmVjdFN1cGVySW50ZXJmYWNlcygpOw0KKwkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBFbmRIaWVyYXJjaHlDaGVjazsNCisJCQlpZiAobm9Qcm9ibGVtcyAmJiBzb3VyY2VUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpDQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmhpZXJhcmNoeUhhc1Byb2JsZW1zKHNvdXJjZVR5cGUpOw0KKwkJfQ0KKwkJY29ubmVjdE1lbWJlclR5cGVzKCk7DQorCQljaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKHNvdXJjZVR5cGUpOw0KKwl9DQorCQ0KKwlwcml2YXRlIHZvaWQgY29ubmVjdFR5cGVIaWVyYXJjaHlXaXRob3V0TWVtYmVycygpIHsNCisJCS8vIG11c3QgZW5zdXJlIHRoZSBpbXBvcnRzIGFyZSByZXNvbHZlZA0KKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdFNjb3BlKSB7DQorCQkJaWYgKCgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHBhcmVudCkuaW1wb3J0cyA9PSBudWxsKQ0KKwkJCQkgKChDb21waWxhdGlvblVuaXRTY29wZSkgcGFyZW50KS5jaGVja0FuZFNldEltcG9ydHMoKTsNCisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ2xhc3NTY29wZSkgew0KKwkJCS8vIGVuc3VyZSB0aGF0IHRoZSBlbmNsb3NpbmcgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQNCisJCQkgKChDbGFzc1Njb3BlKSBwYXJlbnQpLmNvbm5lY3RUeXBlSGllcmFyY2h5V2l0aG91dE1lbWJlcnMoKTsNCisJCX0NCiANCi0JLy8gaG9sZCBvbnRvIGFsbCBjb3JyZWN0bHkgcmVzb2x2ZWQgc3VwZXJpbnRlcmZhY2VzDQotCWlmIChjb3VudCA+IDApIHsNCi0JCWlmIChjb3VudCAhPSBsZW5ndGgpDQotCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VCaW5kaW5ncywgMCwgaW50ZXJmYWNlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsNCi0JCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gaW50ZXJmYWNlQmluZGluZ3M7DQotCX0NCi0JcmV0dXJuIG5vUHJvYmxlbXM7DQotfQ0KLXZvaWQgY29ubmVjdFR5cGVIaWVyYXJjaHkoKSB7DQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWlmICgoc291cmNlVHlwZS50YWdCaXRzICYgQmVnaW5IaWVyYXJjaHlDaGVjaykgPT0gMCkgew0KKwkJLy8gZG91YmxlIGNoZWNrIHRoYXQgdGhlIGhpZXJhcmNoeSBzZWFyY2ggaGFzIG5vdCBhbHJlYWR5IGJlZ3VuLi4uDQorCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KKwkJaWYgKChzb3VyY2VUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSAhPSAwKQ0KKwkJCXJldHVybjsNCisNCiAJCWJvb2xlYW4gbm9Qcm9ibGVtcyA9IHRydWU7DQogCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gQmVnaW5IaWVyYXJjaHlDaGVjazsNCiAJCWlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkNCkBAIC02MjAsMTkwICs2OTAsMTc0IEBACiAJCWlmIChub1Byb2JsZW1zICYmIHNvdXJjZVR5cGUuaXNIaWVyYXJjaHlJbmNvbnNpc3RlbnQoKSkNCiAJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlIYXNQcm9ibGVtcyhzb3VyY2VUeXBlKTsNCiAJfQ0KLQljb25uZWN0TWVtYmVyVHlwZXMoKTsNCi0JY2hlY2tGb3JJbmhlcml0ZWRNZW1iZXJUeXBlcyhzb3VyY2VUeXBlKTsNCi19DQotcHJpdmF0ZSB2b2lkIGNvbm5lY3RUeXBlSGllcmFyY2h5V2l0aG91dE1lbWJlcnMoKSB7DQotCS8vIG11c3QgZW5zdXJlIHRoZSBpbXBvcnRzIGFyZSByZXNvbHZlZA0KLQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0U2NvcGUpIHsNCi0JCWlmICgoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBwYXJlbnQpLmltcG9ydHMgPT0gbnVsbCkNCi0JCQkoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBwYXJlbnQpLmNoZWNrQW5kU2V0SW1wb3J0cygpOw0KLQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsNCi0JCS8vIGVuc3VyZSB0aGF0IHRoZSBlbmNsb3NpbmcgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQNCi0JCSgoQ2xhc3NTY29wZSkgcGFyZW50KS5jb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCk7DQotCX0NCi0NCi0JLy8gZG91YmxlIGNoZWNrIHRoYXQgdGhlIGhpZXJhcmNoeSBzZWFyY2ggaGFzIG5vdCBhbHJlYWR5IGJlZ3VuLi4uDQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWlmICgoc291cmNlVHlwZS50YWdCaXRzICYgQmVnaW5IaWVyYXJjaHlDaGVjaykgIT0gMCkgcmV0dXJuOw0KLQ0KLQlib29sZWFuIG5vUHJvYmxlbXMgPSB0cnVlOw0KLQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gQmVnaW5IaWVyYXJjaHlDaGVjazsNCi0JaWYgKHNvdXJjZVR5cGUuaXNDbGFzcygpKQ0KLQkJbm9Qcm9ibGVtcyAmPSBjb25uZWN0U3VwZXJjbGFzcygpOw0KLQlub1Byb2JsZW1zICY9IGNvbm5lY3RTdXBlckludGVyZmFjZXMoKTsNCi0Jc291cmNlVHlwZS50YWdCaXRzIHw9IEVuZEhpZXJhcmNoeUNoZWNrOw0KLQlpZiAobm9Qcm9ibGVtcyAmJiBzb3VyY2VUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpDQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlIYXNQcm9ibGVtcyhzb3VyY2VUeXBlKTsNCi19DQotLy8gQW5zd2VyIHdoZXRoZXIgYSBjeWNsZSB3YXMgZm91bmQgYmV0d2VlbiB0aGUgc291cmNlVHlwZSAmIHRoZSBzdXBlclR5cGUNCi0NCi1wcml2YXRlIGJvb2xlYW4gZGV0ZWN0Q3ljbGUoU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSwgUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUsIFR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7DQotCWlmIChzb3VyY2VUeXBlID09IHN1cGVyVHlwZSkgew0KLQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOw0KLQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JaWYgKHN1cGVyVHlwZS5pc0JpbmFyeUJpbmRpbmcoKSkgew0KLQkJLy8gZm9yY2UgaXRzIHN1cGVyY2xhc3MgJiBzdXBlcmludGVyZmFjZXMgdG8gYmUgZm91bmQuLi4gMiBwb3NzaWJpbGl0aWVzIGV4aXN0IC0gdGhlIHNvdXJjZSB0eXBlIGlzIGluY2x1ZGVkIGluIHRoZSBoaWVyYXJjaHkgb2Y6DQotCQkvLwkJLSBhIGJpbmFyeSB0eXBlLi4uIHRoaXMgY2FzZSBNVVNUIGJlIGNhdWdodCAmIHJlcG9ydGVkIGhlcmUNCi0JCS8vCQktIGFub3RoZXIgc291cmNlIHR5cGUuLi4gdGhpcyBjYXNlIGlzIHJlcG9ydGVkIGFnYWluc3QgdGhlIG90aGVyIHNvdXJjZSB0eXBlDQotCQlib29sZWFuIGhhc0N5Y2xlID0gZmFsc2U7DQotCQlpZiAoc3VwZXJUeXBlLnN1cGVyY2xhc3MoKSAhPSBudWxsKSB7DQotCQkJaWYgKHNvdXJjZVR5cGUgPT0gc3VwZXJUeXBlLnN1cGVyY2xhc3MoKSkgew0KLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eShzb3VyY2VUeXBlLCBzdXBlclR5cGUsIHJlZmVyZW5jZSk7DQotCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCi0JCQkJc3VwZXJUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQloYXNDeWNsZSB8PSBkZXRlY3RDeWNsZShzb3VyY2VUeXBlLCBzdXBlclR5cGUuc3VwZXJjbGFzcygpLCByZWZlcmVuY2UpOw0KLQkJCWlmICgoc3VwZXJUeXBlLnN1cGVyY2xhc3MoKS50YWdCaXRzICYgSGllcmFyY2h5SGFzUHJvYmxlbXMpICE9IDApIHsNCi0JCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KLQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsgLy8gcHJvcGFnYXRlIGRvd24gdGhlIGhpZXJhcmNoeQ0KLQkJCX0NCisJDQorCS8vIEFuc3dlciB3aGV0aGVyIGEgY3ljbGUgd2FzIGZvdW5kIGJldHdlZW4gdGhlIHNvdXJjZVR5cGUgJiB0aGUgc3VwZXJUeXBlDQorCXByaXZhdGUgYm9vbGVhbiBkZXRlY3RDeWNsZSgNCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUsDQorCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZSwNCisJCVR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7DQorCQlpZiAoc291cmNlVHlwZSA9PSBzdXBlclR5cGUpIHsNCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eShzb3VyY2VUeXBlLCBzdXBlclR5cGUsIHJlZmVyZW5jZSk7DQorCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KKwkJCXJldHVybiB0cnVlOw0KIAkJfQ0KIA0KLQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBzdXBlclR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpdHNJbnRlcmZhY2VzW2ldOw0KLQkJCQlpZiAoc291cmNlVHlwZSA9PSBhbkludGVyZmFjZSkgew0KKwkJaWYgKHN1cGVyVHlwZS5pc0JpbmFyeUJpbmRpbmcoKSkgew0KKwkJCS8vIGZvcmNlIGl0cyBzdXBlcmNsYXNzICYgc3VwZXJpbnRlcmZhY2VzIHRvIGJlIGZvdW5kLi4uIDIgcG9zc2liaWxpdGllcyBleGlzdCAtIHRoZSBzb3VyY2UgdHlwZSBpcyBpbmNsdWRlZCBpbiB0aGUgaGllcmFyY2h5IG9mOg0KKwkJCS8vCQktIGEgYmluYXJ5IHR5cGUuLi4gdGhpcyBjYXNlIE1VU1QgYmUgY2F1Z2h0ICYgcmVwb3J0ZWQgaGVyZQ0KKwkJCS8vCQktIGFub3RoZXIgc291cmNlIHR5cGUuLi4gdGhpcyBjYXNlIGlzIHJlcG9ydGVkIGFnYWluc3QgdGhlIG90aGVyIHNvdXJjZSB0eXBlDQorCQkJYm9vbGVhbiBoYXNDeWNsZSA9IGZhbHNlOw0KKwkJCWlmIChzdXBlclR5cGUuc3VwZXJjbGFzcygpICE9IG51bGwpIHsNCisJCQkJaWYgKHNvdXJjZVR5cGUgPT0gc3VwZXJUeXBlLnN1cGVyY2xhc3MoKSkgew0KIAkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOw0KIAkJCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KIAkJCQkJc3VwZXJUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQogCQkJCQlyZXR1cm4gdHJ1ZTsNCiAJCQkJfQ0KLQkJCQloYXNDeWNsZSB8PSBkZXRlY3RDeWNsZShzb3VyY2VUeXBlLCBhbkludGVyZmFjZSwgcmVmZXJlbmNlKTsNCi0JCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSGllcmFyY2h5SGFzUHJvYmxlbXMpICE9IDApIHsNCisJCQkJaGFzQ3ljbGUgfD0gZGV0ZWN0Q3ljbGUoc291cmNlVHlwZSwgc3VwZXJUeXBlLnN1cGVyY2xhc3MoKSwgcmVmZXJlbmNlKTsNCisJCQkJaWYgKChzdXBlclR5cGUuc3VwZXJjbGFzcygpLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkgew0KIAkJCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOw0KLQkJCQkJc3VwZXJUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsgLy8gcHJvcGFnYXRlIGRvd24gdGhlIGhpZXJhcmNoeQ0KIAkJCQl9DQogCQkJfQ0KKw0KKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gc3VwZXJUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaXRzSW50ZXJmYWNlc1tpXTsNCisJCQkJCWlmIChzb3VyY2VUeXBlID09IGFuSW50ZXJmYWNlKSB7DQorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOw0KKwkJCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCisJCQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisJCQkJCWhhc0N5Y2xlIHw9IGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIGFuSW50ZXJmYWNlLCByZWZlcmVuY2UpOw0KKwkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSGllcmFyY2h5SGFzUHJvYmxlbXMpICE9IDApIHsNCisJCQkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQkJCQkJc3VwZXJUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIGhhc0N5Y2xlOw0KIAkJfQ0KLQkJcmV0dXJuIGhhc0N5Y2xlOw0KLQl9DQogDQotCWlmICgoc3VwZXJUeXBlLnRhZ0JpdHMgJiBFbmRIaWVyYXJjaHlDaGVjaykgPT0gMCAmJiAoc3VwZXJUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSAhPSAwKSB7DQotCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eShzb3VyY2VUeXBlLCBzdXBlclR5cGUsIHJlZmVyZW5jZSk7DQotCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQotCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWlmICgoc3VwZXJUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSA9PSAwKQ0KLQkJLy8gZW5zdXJlIGlmIHRoaXMgaXMgYSBzb3VyY2Ugc3VwZXJjbGFzcyB0aGF0IGl0IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZA0KLQkJKChTb3VyY2VUeXBlQmluZGluZykgc3VwZXJUeXBlKS5zY29wZS5jb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCk7DQotCWlmICgoc3VwZXJUeXBlLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkNCi0JCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi1wcml2YXRlIFJlZmVyZW5jZUJpbmRpbmcgZmluZFN1cGVydHlwZShUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpIHsNCi0JdHlwZVJlZmVyZW5jZS5hYm91dFRvUmVzb2x2ZSh0aGlzKTsgLy8gYWxsb3dzIHVzIHRvIHRyYXAgY29tcGxldGlvbiAmIHNlbGVjdGlvbiBub2Rlcw0KLQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSB0eXBlUmVmZXJlbmNlLmdldFR5cGVOYW1lKCk7DQotCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7DQotCWludCBzaXplID0gY29tcG91bmROYW1lLmxlbmd0aDsNCi0JaW50IG4gPSAxOw0KLQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZTsNCi0NCi0JLy8gcmVzb2x2ZSB0aGUgZmlyc3QgbmFtZSBvZiB0aGUgY29tcG91bmROYW1lDQotCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZE5hbWVbMF0sIHNvdXJjZVR5cGUuc291cmNlTmFtZSkpIHsNCi0JCXN1cGVyVHlwZSA9IHNvdXJjZVR5cGU7IC8vIG1hdGNoIGFnYWluc3QgdGhlIHNvdXJjZVR5cGUgZXZlbiB0aG91Z2ggbmVzdGVkIG1lbWJlcnMgY2Fubm90IGJlIHN1cGVydHlwZXMNCi0JfSBlbHNlIHsNCi0JCUJpbmRpbmcgdHlwZU9yUGFja2FnZSA9IHBhcmVudC5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSwgVFlQRSB8IFBBQ0tBR0UpOw0KLQkJaWYgKHR5cGVPclBhY2thZ2UgPT0gbnVsbCB8fCAhdHlwZU9yUGFja2FnZS5pc1ZhbGlkQmluZGluZygpKXsNCi0JCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShuZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKGNvbXBvdW5kTmFtZVswXSwgTm90Rm91bmQpKTsgLy8gcmVjb3JkIHBhY2thZ2UgcmVmDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIHR5cGVPclBhY2thZ2UgPT0gbnVsbCA/IE5vdEZvdW5kIDogdHlwZU9yUGFja2FnZS5wcm9ibGVtSWQoKSk7DQorCQlpZiAoKHN1cGVyVHlwZS50YWdCaXRzICYgRW5kSGllcmFyY2h5Q2hlY2spID09IDANCisJCQkmJiAoc3VwZXJUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSAhPSAwKSB7DQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOw0KKwkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCisJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsNCisJCQlyZXR1cm4gdHJ1ZTsNCiAJCX0NCi0JCWJvb2xlYW4gY2hlY2tWaXNpYmlsaXR5ID0gZmFsc2U7DQotCQlmb3IgKDsgbiA8IHNpemU7IG4rKykgew0KLQkJCWlmICghKHR5cGVPclBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykpIGJyZWFrOw0KKwkJaWYgKChzdXBlclR5cGUudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApDQorCQkJLy8gZW5zdXJlIGlmIHRoaXMgaXMgYSBzb3VyY2Ugc3VwZXJjbGFzcyB0aGF0IGl0IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZA0KKwkJCSAoKFNvdXJjZVR5cGVCaW5kaW5nKSBzdXBlclR5cGUpLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5V2l0aG91dE1lbWJlcnMoKTsNCisJCWlmICgoc3VwZXJUeXBlLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkNCisJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJDQorCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBmaW5kU3VwZXJ0eXBlKFR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSkgew0KKwkJdHlwZVJlZmVyZW5jZS5hYm91dFRvUmVzb2x2ZSh0aGlzKTsgLy8gYWxsb3dzIHVzIHRvIHRyYXAgY29tcGxldGlvbiAmIHNlbGVjdGlvbiBub2Rlcw0KKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gdHlwZVJlZmVyZW5jZS5nZXRUeXBlTmFtZSgpOw0KKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCWludCBzaXplID0gY29tcG91bmROYW1lLmxlbmd0aDsNCisJCWludCBuID0gMTsNCisJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlOw0KIA0KLQkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSB0eXBlT3JQYWNrYWdlOw0KLQkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKHBhY2thZ2VCaW5kaW5nKTsNCi0JCQl0eXBlT3JQYWNrYWdlID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbbl0pOw0KLQkJCWlmICh0eXBlT3JQYWNrYWdlID09IG51bGwgfHwgIXR5cGVPclBhY2thZ2UuaXNWYWxpZEJpbmRpbmcoKSkNCisJCS8vIHJlc29sdmUgdGhlIGZpcnN0IG5hbWUgb2YgdGhlIGNvbXBvdW5kTmFtZQ0KKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNvbXBvdW5kTmFtZVswXSwgc291cmNlVHlwZS5zb3VyY2VOYW1lKSkgew0KKwkJCXN1cGVyVHlwZSA9IHNvdXJjZVR5cGU7DQorCQkJLy8gbWF0Y2ggYWdhaW5zdCB0aGUgc291cmNlVHlwZSBldmVuIHRob3VnaCBuZXN0ZWQgbWVtYmVycyBjYW5ub3QgYmUgc3VwZXJ0eXBlcw0KKwkJfSBlbHNlIHsNCisJCQlCaW5kaW5nIHR5cGVPclBhY2thZ2UgPSBwYXJlbnQuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIFRZUEUgfCBQQUNLQUdFKTsNCisJCQlpZiAodHlwZU9yUGFja2FnZSA9PSBudWxsIHx8ICF0eXBlT3JQYWNrYWdlLmlzVmFsaWRCaW5kaW5nKCkpIHsNCisJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UobmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIE5vdEZvdW5kKSk7DQorCQkJCS8vIHJlY29yZCBwYWNrYWdlIHJlZg0KIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKA0KLQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4gKyAxKSwNCisJCQkJCWNvbXBvdW5kTmFtZVswXSwNCiAJCQkJCXR5cGVPclBhY2thZ2UgPT0gbnVsbCA/IE5vdEZvdW5kIDogdHlwZU9yUGFja2FnZS5wcm9ibGVtSWQoKSk7DQotCQkJY2hlY2tWaXNpYmlsaXR5ID0gdHJ1ZTsNCi0JCX0NCisJCQl9DQorCQkJYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsNCisJCQlmb3IgKDsgbiA8IHNpemU7IG4rKykgew0KKwkJCQlpZiAoISh0eXBlT3JQYWNrYWdlIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQ0KKwkJCQkJYnJlYWs7DQogDQotCQkvLyBjb252ZXJ0IHRvIGEgUmVmZXJlbmNlQmluZGluZw0KLQkJaWYgKHR5cGVPclBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgLy8gZXJyb3IsIHRoZSBjb21wb3VuZE5hbWUgaXMgYSBwYWNrYWdlTmFtZQ0KLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4pLCBOb3RGb3VuZCk7DQotCQlzdXBlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZU9yUGFja2FnZTsNCi0JCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZShzdXBlclR5cGUpOw0KLQkJDQotCQlpZiAoY2hlY2tWaXNpYmlsaXR5ICYmIG4gPT0gc2l6ZSkgeyAvLyBpZiB3ZSdyZSBmaW5pc2hlZCBhbmQga25vdyB0aGUgZmluYWwgc3VwZXJpbnRlcmZhY2UgdGhlbiBjaGVjayB2aXNpYmlsaXR5DQotCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nU291cmNlVHlwZSA9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKTsNCi0JCQlpZiAoZW5jbG9zaW5nU291cmNlVHlwZSA9PSBudWxsDQotCQkJCT8gIXN1cGVyVHlwZS5jYW5CZVNlZW5CeShzb3VyY2VUeXBlLmZQYWNrYWdlKQ0KLQkJCQk6ICFzdXBlclR5cGUuY2FuQmVTZWVuQnkoc291cmNlVHlwZSwgZW5jbG9zaW5nU291cmNlVHlwZSkpDQorCQkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSB0eXBlT3JQYWNrYWdlOw0KKwkJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShwYWNrYWdlQmluZGluZyk7DQorCQkJCXR5cGVPclBhY2thZ2UgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVtuXSk7DQorCQkJCWlmICh0eXBlT3JQYWNrYWdlID09IG51bGwgfHwgIXR5cGVPclBhY2thZ2UuaXNWYWxpZEJpbmRpbmcoKSkNCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoDQorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4gKyAxKSwNCisJCQkJCQl0eXBlT3JQYWNrYWdlID09IG51bGwgPyBOb3RGb3VuZCA6IHR5cGVPclBhY2thZ2UucHJvYmxlbUlkKCkpOw0KKwkJCQljaGVja1Zpc2liaWxpdHkgPSB0cnVlOw0KKwkJCX0NCisNCisJCQkvLyBjb252ZXJ0IHRvIGEgUmVmZXJlbmNlQmluZGluZw0KKwkJCWlmICh0eXBlT3JQYWNrYWdlIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIC8vIGVycm9yLCB0aGUgY29tcG91bmROYW1lIGlzIGEgcGFja2FnZU5hbWUNCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgbiksIE5vdEZvdW5kKTsNCisJCQlzdXBlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZU9yUGFja2FnZTsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2Uoc3VwZXJUeXBlKTsNCisNCisJCQlpZiAoY2hlY2tWaXNpYmlsaXR5DQorCQkJCSYmIG4gPT0gc2l6ZSkgeyAvLyBpZiB3ZSdyZSBmaW5pc2hlZCBhbmQga25vdyB0aGUgZmluYWwgc3VwZXJ0eXBlIHRoZW4gY2hlY2sgdmlzaWJpbGl0eQ0KKwkJCQlpZiAoIXN1cGVyVHlwZS5jYW5CZVNlZW5CeShzb3VyY2VUeXBlLmZQYWNrYWdlKSkNCisJCQkJCS8vIGl0cyBhIHRvcGxldmVsIHR5cGUgc28ganVzdCBjaGVjayBwYWNrYWdlIGFjY2Vzcw0KIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgbiksIE5vdFZpc2libGUpOw0KKwkJCX0NCisJCX0NCisJCS8vIGF0IHRoaXMgcG9pbnQgd2Uga25vdyB3ZSBoYXZlIGEgdHlwZSBidXQgd2UgaGF2ZSB0byBsb29rIGZvciBjeWNsZXMNCisJCXdoaWxlICh0cnVlKSB7DQorCQkJLy8gbXVzdCBkZXRlY3QgY3ljbGVzICYgZm9yY2UgY29ubmVjdGlvbiB1cCB0aGUgaGllcmFyY2h5Li4uIGFsc28gaGFuZGxlIGN5Y2xlcyB3aXRoIGJpbmFyeSB0eXBlcy4NCisJCQkvLyBtdXN0IGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgc3VwZXJUeXBlIGtub3dzIGl0cyBlbnRpcmUgaGllcmFyY2h5DQorCQkJaWYgKGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgdHlwZVJlZmVyZW5jZSkpDQorCQkJCXJldHVybiBudWxsOyAvLyBjeWNsZSBlcnJvciB3YXMgYWxyZWFkeSByZXBvcnRlZA0KKw0KKwkJCWlmIChuID49IHNpemUpDQorCQkJCWJyZWFrOw0KKw0KKwkJCS8vIHJldHJpZXZlIHRoZSBuZXh0IG1lbWJlciB0eXBlDQorCQkJY2hhcltdIHR5cGVOYW1lID0gY29tcG91bmROYW1lW24rK107DQorCQkJc3VwZXJUeXBlID0gZmluZE1lbWJlclR5cGUodHlwZU5hbWUsIHN1cGVyVHlwZSk7DQorCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKQ0KKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBuKSwgTm90Rm91bmQpOw0KKwkJCWlmICghc3VwZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsNCisJCQkJc3VwZXJUeXBlLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBuKTsNCisJCQkJcmV0dXJuIHN1cGVyVHlwZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc3VwZXJUeXBlOw0KKwl9DQorDQorCS8qIEFuc3dlciB0aGUgcHJvYmxlbSByZXBvcnRlciB0byB1c2UgZm9yIHJhaXNpbmcgbmV3IHByb2JsZW1zLg0KKwkqDQorCSogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dA0KKwkqICh1bml0LCB0eXBlIG9yIG1ldGhvZCkgaW4gY2FzZSB0aGUgcHJvYmxlbSBoYW5kbGVyIGRlY2lkZXMgaXQgaXMgbmVjZXNzYXJ5DQorCSogdG8gYWJvcnQuDQorCSovDQorCXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCkgew0KKwkJTWV0aG9kU2NvcGUgb3V0ZXJNZXRob2RTY29wZTsNCisJCWlmICgob3V0ZXJNZXRob2RTY29wZSA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkpID09IG51bGwpIHsNCisJCQlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucHJvYmxlbVJlcG9ydGVyOw0KKwkJCXByb2JsZW1SZXBvcnRlci5yZWZlcmVuY2VDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dDsNCisJCQlyZXR1cm4gcHJvYmxlbVJlcG9ydGVyOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gb3V0ZXJNZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKTsNCiAJCX0NCiAJfQ0KIA0KLQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgd2UgaGF2ZSBhIHR5cGUgYnV0IHdlIGhhdmUgdG8gbG9vayBmb3IgY3ljbGVzDQotCXdoaWxlICh0cnVlKSB7DQotCQkvLyBtdXN0IGRldGVjdCBjeWNsZXMgJiBmb3JjZSBjb25uZWN0aW9uIHVwIHRoZSBoaWVyYXJjaHkuLi4gYWxzbyBoYW5kbGUgY3ljbGVzIHdpdGggYmluYXJ5IHR5cGVzLg0KLQkJLy8gbXVzdCBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIHN1cGVyVHlwZSBrbm93cyBpdHMgZW50aXJlIGhpZXJhcmNoeQ0KLQkJaWYgKGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgdHlwZVJlZmVyZW5jZSkpDQotCQkJcmV0dXJuIG51bGw7IC8vIGN5Y2xlIGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkDQotDQotCQlpZiAobiA+PSBzaXplKQ0KLQkJCWJyZWFrOw0KLQ0KLQkJLy8gcmV0cmlldmUgdGhlIG5leHQgbWVtYmVyIHR5cGUNCi0JCWNoYXJbXSB0eXBlTmFtZSA9IGNvbXBvdW5kTmFtZVtuKytdOw0KLQkJc3VwZXJUeXBlID0gZmluZE1lbWJlclR5cGUodHlwZU5hbWUsIHN1cGVyVHlwZSk7DQotCQlpZiAoc3VwZXJUeXBlID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgbiksIE5vdEZvdW5kKTsNCi0JCWlmICghc3VwZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCQlzdXBlclR5cGUuY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4pOw0KLQkJCXJldHVybiBzdXBlclR5cGU7DQotCQl9DQorCS8qIEFuc3dlciB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgdGhpcyBzY29wZS4NCisJKg0KKwkqIGkuZS4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHR5cGUgb2YgdGhpcyBzY29wZS4NCisJKi8NCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgew0KKwkJcmV0dXJuIHJlZmVyZW5jZUNvbnRleHQ7DQogCX0NCi0JcmV0dXJuIHN1cGVyVHlwZTsNCi19DQotLyogQW5zd2VyIHRoZSBwcm9ibGVtIHJlcG9ydGVyIHRvIHVzZSBmb3IgcmFpc2luZyBuZXcgcHJvYmxlbXMuDQotKg0KLSogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dA0KLSogKHVuaXQsIHR5cGUgb3IgbWV0aG9kKSBpbiBjYXNlIHRoZSBwcm9ibGVtIGhhbmRsZXIgZGVjaWRlcyBpdCBpcyBuZWNlc3NhcnkNCi0qIHRvIGFib3J0Lg0KLSovDQotDQotcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7DQotCU1ldGhvZFNjb3BlIG91dGVyTWV0aG9kU2NvcGU7DQotCWlmICgob3V0ZXJNZXRob2RTY29wZSA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkpID09IG51bGwpIHsNCi0JCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5wcm9ibGVtUmVwb3J0ZXI7DQotCQlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7DQotCQlyZXR1cm4gcHJvYmxlbVJlcG9ydGVyOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIG91dGVyTWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7DQorCQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQgIT0gbnVsbCkNCisJCQlyZXR1cm4gIi0tLSBDbGFzcyBTY29wZSAtLS1cblxuIiAgLy8kTk9OLU5MUy0xJA0KKwkJCStyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcudG9TdHJpbmcoKTsNCisJCWVsc2UNCisJCQlyZXR1cm4gIi0tLSBDbGFzcyBTY29wZSAtLS1cblxuIEJpbmRpbmcgbm90IGluaXRpYWxpemVkIiA7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KLX0NCi0vKiBBbnN3ZXIgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgc2NvcGUuDQotKg0KLSogaS5lLiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLg0KLSovDQotDQotcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgew0KLQlyZXR1cm4gcmVmZXJlbmNlQ29udGV4dDsNCi19DQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JaWYgKHJlZmVyZW5jZUNvbnRleHQgIT0gbnVsbCkNCi0JCXJldHVybiAiLS0tIENsYXNzIFNjb3BlIC0tLVxuXG4iLypub25OTFMqLyArIHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy50b1N0cmluZygpOw0KLQllbHNlDQotCQlyZXR1cm4gIi0tLSBDbGFzcyBTY29wZSAtLS1cblxuIEJpbmRpbmcgbm90IGluaXRpYWxpemVkIi8qbm9uTkxTKi87DQotfQ0KLX0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxhdGlvblVuaXRTY29wZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxhdGlvblVuaXRTY29wZS5qYXZhCmluZGV4IDA0M2ZkN2UuLjIzMGM3NmEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsYXRpb25Vbml0U2NvcGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEKQEAgLTQyNyw3ICs0MjcsNyBAQAogCXJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQuZmlsZURlcGVuZGVuY2llcyA9IGZpbGVOYW1lczsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICItLS0gQ29tcGlsYXRpb25Vbml0IFNjb3BlIDogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHJlZmVyZW5jZUNvbnRleHQuZ2V0RmlsZU5hbWUoKSk7DQorCXJldHVybiAiLS0tIENvbXBpbGF0aW9uVW5pdCBTY29wZSA6ICIgKyBuZXcgU3RyaW5nKHJlZmVyZW5jZUNvbnRleHQuZ2V0RmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIHZvaWQgdmVyaWZ5TWV0aG9kcyhNZXRob2RWZXJpZmllciB2ZXJpZmllcikgew0KIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCmluZGV4IDE0NDVkOTEuLmJhZGVhODcgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCkBAIC0yNSwxMSArMjUsMTEgQEAKIH0NCiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsNCiAJaWYgKG9uRGVtYW5kKQ0KLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksICIuKiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCkpOw0KKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksICIuKiIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KIAkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyk7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiAiaW1wb3J0IDogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHJlYWRhYmxlTmFtZSgpKTsNCisJcmV0dXJuICJpbXBvcnQgOiAiICsgbmV3IFN0cmluZyhyZWFkYWJsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxUeXBlQmluZGluZy5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKaW5kZXggZDJkZTJkMS4uNGZiMWRjYSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKQEAgLTU2LDkgKzU2LDkgQEAKIHB1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgew0KIAlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpIHsNCiAJCWlmIChzdXBlckludGVyZmFjZXMgPT0gTm9TdXBlckludGVyZmFjZXMpDQotCQkJcmV0dXJuICgiPCIvKm5vbk5MUyovK1V0aWwuYmluZCgiYmluZGluZy5zdWJjbGFzcyIvKm5vbk5MUyovLG5ldyBTdHJpbmcoc3VwZXJjbGFzcy5yZWFkYWJsZU5hbWUoKSkpICsgIj4iLypub25OTFMqLykudG9DaGFyQXJyYXkoKTsNCisJCQlyZXR1cm4gKCI8IitVdGlsLmJpbmQoImJpbmRpbmcuc3ViY2xhc3MiLG5ldyBTdHJpbmcoc3VwZXJjbGFzcy5yZWFkYWJsZU5hbWUoKSkpICsgIj4iKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJA0KIAkJZWxzZQ0KLQkJCXJldHVybiAoIjwiLypub25OTFMqLytVdGlsLmJpbmQoImJpbmRpbmcuaW1wbGVtZW50YXRpb24iLypub25OTFMqLyxuZXcgU3RyaW5nKHN1cGVySW50ZXJmYWNlc1swXS5yZWFkYWJsZU5hbWUoKSkpICsgIj4iLypub25OTFMqLykudG9DaGFyQXJyYXkoKTsJCQkNCisJCQlyZXR1cm4gKCI8IitVdGlsLmJpbmQoImJpbmRpbmcuaW1wbGVtZW50YXRpb24iLG5ldyBTdHJpbmcoc3VwZXJJbnRlcmZhY2VzWzBdLnJlYWRhYmxlTmFtZSgpKSkgKyAiPiIpLnRvQ2hhckFycmF5KCk7CQkJIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkDQogCX0gZWxzZSBpZiAoaXNNZW1iZXJUeXBlKCkpIHsNCiAJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCksIHNvdXJjZU5hbWUsICcuJyk7DQogCX0gZWxzZSB7DQpAQCAtNzgsMTAgKzc4LDEwIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJaWYgKGlzQW5vbnltb3VzVHlwZSgpKQ0KLQkJcmV0dXJuICJBbm9ueW1vdXMgdHlwZSA6ICIvKm5vbk5MUyovICsgc3VwZXIudG9TdHJpbmcoKTsNCisJCXJldHVybiAiQW5vbnltb3VzIHR5cGUgOiAiICsgc3VwZXIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoaXNNZW1iZXJUeXBlKCkpDQotCQlyZXR1cm4gIkxvY2FsIG1lbWJlciB0eXBlIDogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIvKm5vbk5MUyovICsgc3VwZXIudG9TdHJpbmcoKTsNCi0JcmV0dXJuICJMb2NhbCB0eXBlIDogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIvKm5vbk5MUyovICsgc3VwZXIudG9TdHJpbmcoKTsNCisJCXJldHVybiAiTG9jYWwgbWVtYmVyIHR5cGUgOiAiICsgbmV3IFN0cmluZyhzb3VyY2VOYW1lKCkpICsgIiAiICsgc3VwZXIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCXJldHVybiAiTG9jYWwgdHlwZSA6ICIgKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiB9DQogLyogVHJpZ2dlciB0aGUgZGVwZW5kZW5jeSBtZWNoYW5pc20gZm9yY2luZyB0aGUgaW5uZXJjbGFzcyBlbXVsYXRpb24NCiAqIHRvIGJlIHByb3BhZ2F0ZWQgdG8gYWxsIGRlcGVuZGVudCBzb3VyY2UgdHlwZXMuDQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IDBiMDU5MWUuLjFlOTYzNzAgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTY2LDE4ICs2NiwxOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZygpOw0KIAlpZiAoIXVzZWQpDQotCQlzICs9ICJbcG9zOiB1bnVzZWRdIi8qbm9uTkxTKi87DQorCQlzICs9ICJbcG9zOiB1bnVzZWRdIjsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlzICs9ICJbcG9zOiAiLypub25OTFMqLyArIFN0cmluZy52YWx1ZU9mKHJlc29sdmVkUG9zaXRpb24pICsgIl0iLypub25OTFMqLzsNCi0JcyArPSAiW2lkOiIvKm5vbk5MUyovICsgU3RyaW5nLnZhbHVlT2YoaWQpICsgIl0iLypub25OTFMqLzsNCisJCXMgKz0gIltwb3M6ICIgKyBTdHJpbmcudmFsdWVPZihyZXNvbHZlZFBvc2l0aW9uKSArICJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCXMgKz0gIltpZDoiICsgU3RyaW5nLnZhbHVlT2YoaWQpICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJaWYgKGluaXRpYWxpemF0aW9uQ291bnQgPiAwKSB7DQotCQlzICs9ICJbcGM6ICIvKm5vbk5MUyovOw0KKwkJcyArPSAiW3BjOiAiOyAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemF0aW9uQ291bnQ7IGkrKykgew0KIAkJCWlmIChpID4gMCkNCi0JCQkJcyArPSAiLCAiLypub25OTFMqLzsNCi0JCQlzICs9IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzW2kgPDwgMV0pICsgIi0iLypub25OTFMqLyArICgoaW5pdGlhbGl6YXRpb25QQ3NbKGkgPDwgMSkgKyAxXSA9PSAtMSkgPyAiPyIvKm5vbk5MUyovIDogU3RyaW5nLnZhbHVlT2YoaW5pdGlhbGl6YXRpb25QQ3NbKGk8PCAxKSArIDFdKSk7DQorCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJA0KKwkJCXMgKz0gU3RyaW5nLnZhbHVlT2YoaW5pdGlhbGl6YXRpb25QQ3NbaSA8PCAxXSkgKyAiLSIgKyAoKGluaXRpYWxpemF0aW9uUENzWyhpIDw8IDEpICsgMV0gPT0gLTEpID8gIj8iIDogU3RyaW5nLnZhbHVlT2YoaW5pdGlhbGl6YXRpb25QQ3NbKGk8PCAxKSArIDFdKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KLQkJcyArPSAiXSIvKm5vbk5MUyovOw0KKwkJcyArPSAiXSI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gczsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhCmluZGV4IDI3Yjg2M2EuLmE3YjgxMjggMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvb2t1cEVudmlyb25tZW50LmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKIAkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCiAJZWxzZSBpZiAoYW5zd2VyLmlzU291cmNlVHlwZSgpKQ0KIAkJLy8gdGhlIHR5cGUgd2FzIGZvdW5kIGFzIGEgc291cmNlIG1vZGVsDQotCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0U291cmNlVHlwZSgpLCBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lKSk7DQorCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0U291cmNlVHlwZXMoKSwgY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSkpOw0KIA0KIAlyZXR1cm4gZ2V0Q2FjaGVkVHlwZShjb21wb3VuZE5hbWUpOw0KIH0NCkBAIC05NCw3ICs5NCw3IEBACiAJCXR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRDb21waWxhdGlvblVuaXQoKSk7DQogCWVsc2UgaWYgKGFuc3dlci5pc1NvdXJjZVR5cGUoKSkNCiAJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIHNvdXJjZSBtb2RlbA0KLQkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldFNvdXJjZVR5cGUoKSwgcGFja2FnZUJpbmRpbmcpOw0KKwkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldFNvdXJjZVR5cGVzKCksIHBhY2thZ2VCaW5kaW5nKTsNCiANCiAJcmV0dXJuIHBhY2thZ2VCaW5kaW5nLmdldFR5cGUwKG5hbWUpOw0KIH0NCkBAIC01MDUsNyArNTA1LDcgQEAKIAkJCQliaW5kaW5nID0gU2hvcnRCaW5kaW5nOw0KIAkJCQlicmVhazsNCiAJCQlkZWZhdWx0IDoNCi0JCQkJdGhyb3cgbmV3IEVycm9yKFV0aWwuYmluZCgiZXJyb3IudW5kZWZpbmVkQmFzZVR5cGUiLypub25OTFMqLyxTdHJpbmcudmFsdWVPZihzaWduYXR1cmVbc3RhcnRdKSkpOw0KKwkJCQl0aHJvdyBuZXcgRXJyb3IoVXRpbC5iaW5kKCJlcnJvci51bmRlZmluZWRCYXNlVHlwZSIsU3RyaW5nLnZhbHVlT2Yoc2lnbmF0dXJlW3N0YXJ0XSkpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9IGVsc2Ugew0KIAkJYmluZGluZyA9IGdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShzaWduYXR1cmUsIHN0YXJ0ICsgMSwgZW5kIC0gMSk7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhCmluZGV4IDgwMDJhYmEuLmUxM2Y2ODggMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWVtYmVyVHlwZUJpbmRpbmcuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01lbWJlclR5cGVCaW5kaW5nLmphdmEKQEAgLTI4LDYgKzI4LDYgQEAKIAlyZXR1cm4gY29uc3RhbnRQb29sTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCksIHNvdXJjZU5hbWUsICckJyk7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiAiTWVtYmVyIHR5cGUgOiAiLypub25OTFMqLyArIG5ldyBTdHJpbmcoc291cmNlTmFtZSgpKSArICIgIi8qbm9uTkxTKi8gKyBzdXBlci50b1N0cmluZygpOw0KKwlyZXR1cm4gIk1lbWJlciB0eXBlIDogIiArIG5ldyBTdHJpbmcoc291cmNlTmFtZSgpKSArICIgIiArIHN1cGVyLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZEJpbmRpbmcuamF2YQppbmRleCA2NWI1ZWM4Li43ZGZjYjllIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZEJpbmRpbmcuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZEJpbmRpbmcuamF2YQpAQCAtMzA5LDcgKzMwOSw3IEBACiAJaWYgKHBhcmFtZXRlcnMgIT0gTm9QYXJhbWV0ZXJzKSB7DQogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJCWlmIChpID4gMCkNCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKHBhcmFtZXRlcnNbaV0uc291cmNlTmFtZSgpKTsNCiAJCX0NCiAJfQ0KQEAgLTM4NywzNSArMzg3LDM1IEBACiAJbW9kaWZpZXJzIHw9IEFjY0NsZWFyUHJpdmF0ZU1vZGlmaWVyOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmcgcyA9IChyZXR1cm5UeXBlICE9IG51bGwpID8gcmV0dXJuVHlwZS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiLypub25OTFMqLzsNCi0JcyArPSAiICIvKm5vbk5MUyovOw0KLQlzICs9IChzZWxlY3RvciAhPSBudWxsKSA/IG5ldyBTdHJpbmcoc2VsZWN0b3IpIDogIlVOTkFNRUQgTUVUSE9EIi8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gKHJldHVyblR5cGUgIT0gbnVsbCkgPyByZXR1cm5UeXBlLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSI7IC8vJE5PTi1OTFMtMSQNCisJcyArPSAiICI7IC8vJE5PTi1OTFMtMSQNCisJcyArPSAoc2VsZWN0b3IgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKHNlbGVjdG9yKSA6ICJVTk5BTUVEIE1FVEhPRCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JcyArPSAiKCIvKm5vbk5MUyovOw0KKwlzICs9ICIoIjsgLy8kTk9OLU5MUy0xJA0KIAlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7DQogCQlpZiAocGFyYW1ldGVycyAhPSBOb1BhcmFtZXRlcnMpIHsNCiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJCQlpZiAoaSAgPiAwKQ0KLQkJCQkJcyArPSAiLCAiLypub25OTFMqLzsNCi0JCQkJcyArPSAocGFyYW1ldGVyc1tpXSAhPSBudWxsKSA/IHBhcmFtZXRlcnNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIi8qbm9uTkxTKi87DQorCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQNCisJCQkJcyArPSAocGFyYW1ldGVyc1tpXSAhPSBudWxsKSA/IHBhcmFtZXRlcnNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgUEFSQU1FVEVSUyIvKm5vbk5MUyovOw0KKwkJcyArPSAiTlVMTCBQQVJBTUVURVJTIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCXMgKz0gIikgIi8qbm9uTkxTKi87DQorCXMgKz0gIikgIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7DQogCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBOb0V4Y2VwdGlvbnMpIHsNCi0JCQlzICs9ICJ0aHJvd3MgIi8qbm9uTkxTKi87DQorCQkJcyArPSAidGhyb3dzICI7IC8vJE5PTi1OTFMtMSQNCiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJCQlpZiAoaSAgPiAwKQ0KLQkJCQkJcyArPSAiLCAiLypub25OTFMqLzsNCi0JCQkJcyArPSAodGhyb3duRXhjZXB0aW9uc1tpXSAhPSBudWxsKSA/IHRocm93bkV4Y2VwdGlvbnNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIi8qbm9uTkxTKi87DQorCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQNCisJCQkJcyArPSAodGhyb3duRXhjZXB0aW9uc1tpXSAhPSBudWxsKSA/IHRocm93bkV4Y2VwdGlvbnNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgVEhST1dOIEVYQ0VQVElPTlMiLypub25OTFMqLzsNCisJCXMgKz0gIk5VTEwgVEhST1dOIEVYQ0VQVElPTlMiOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcmV0dXJuIHM7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YQppbmRleCA5YzlmOWRmLi4zYmQyZmRhIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFNjb3BlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RTY29wZS5qYXZhCkBAIC00MiwxOCArNDIsMTggQEAKIAl0aGlzLnN0YXJ0SW5kZXggPSAwOw0KIH0NCiBTdHJpbmcgYmFzaWNUb1N0cmluZyhpbnQgdGFiKSB7DQotCVN0cmluZyBuZXdMaW5lID0gIlxuIi8qbm9uTkxTKi87DQorCVN0cmluZyBuZXdMaW5lID0gIlxuIjsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gdGFiOyAtLWkgPj0gMDspDQotCQluZXdMaW5lICs9ICJcdCIvKm5vbk5MUyovOw0KKwkJbmV3TGluZSArPSAiXHQiOyAvLyROT04tTkxTLTEkDQogDQotCVN0cmluZyBzID0gbmV3TGluZSArICItLS0gTWV0aG9kIFNjb3BlIC0tLSIvKm5vbk5MUyovOw0KLQluZXdMaW5lICs9ICJcdCIvKm5vbk5MUyovOw0KLQlzICs9IG5ld0xpbmUgKyAibG9jYWxzOiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9IG5ld0xpbmUgKyAiLS0tIE1ldGhvZCBTY29wZSAtLS0iOyAvLyROT04tTkxTLTEkDQorCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJA0KKwlzICs9IG5ld0xpbmUgKyAibG9jYWxzOiI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEluZGV4OyBpKyspDQotCQlzICs9IG5ld0xpbmUgKyAiXHQiLypub25OTFMqLyArIGxvY2Fsc1tpXS50b1N0cmluZygpOw0KLQlzICs9IG5ld0xpbmUgKyAic3RhcnRJbmRleCA9ICIvKm5vbk5MUyovICsgc3RhcnRJbmRleDsNCi0JcyArPSBuZXdMaW5lICsgImlzQ29uc3RydWN0b3JDYWxsID0gIi8qbm9uTkxTKi8gKyBpc0NvbnN0cnVjdG9yQ2FsbDsNCi0JcyArPSBuZXdMaW5lICsgImZpZWxkRGVjbGFyYXRpb25JbmRleCA9ICIvKm5vbk5MUyovICsgZmllbGREZWNsYXJhdGlvbkluZGV4Ow0KKwkJcyArPSBuZXdMaW5lICsgIlx0IiArIGxvY2Fsc1tpXS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkDQorCXMgKz0gbmV3TGluZSArICJzdGFydEluZGV4ID0gIiArIHN0YXJ0SW5kZXg7IC8vJE5PTi1OTFMtMSQNCisJcyArPSBuZXdMaW5lICsgImlzQ29uc3RydWN0b3JDYWxsID0gIiArIGlzQ29uc3RydWN0b3JDYWxsOyAvLyROT04tTkxTLTEkDQorCXMgKz0gbmV3TGluZSArICJmaWVsZERlY2xhcmF0aW9uSW5kZXggPSAiICsgZmllbGREZWNsYXJhdGlvbkluZGV4OyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiAvKiBTcGVjIDogOC40LjMgJiA5LjQNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhY2thZ2VCaW5kaW5nLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhY2thZ2VCaW5kaW5nLmphdmEKaW5kZXggYTAzMTE2Ny4uNTRhZGIyZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYWNrYWdlQmluZGluZy5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFja2FnZUJpbmRpbmcuamF2YQpAQCAtMTkwLDggKzE5MCw4IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJaWYgKGNvbXBvdW5kTmFtZSA9PSBOb0NoYXJDaGFyKQ0KLQkJcmV0dXJuICJUaGUgRGVmYXVsdCBQYWNrYWdlIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIlRoZSBEZWZhdWx0IFBhY2thZ2UiOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JCXJldHVybiAicGFja2FnZSAiLypub25OTFMqLyArICgoY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wb3VuZE5hbWUpIDogIlVOTkFNRUQiLypub25OTFMqLyk7DQorCQlyZXR1cm4gInBhY2thZ2UgIiArICgoY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wb3VuZE5hbWUpIDogIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1JlZmVyZW5jZUJpbmRpbmcuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCmluZGV4IDlmZmZhZWUuLjEzNjZiNzQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCkBAIC0yNTIsNiArMjUyLDExIEBACiAJCWlkID0gVF9KYXZhTGFuZ1ZvaWQ7DQogCQlyZXR1cm47DQogCX0NCisJDQorCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IsIGNvbXBvdW5kTmFtZSkpIHsNCisJCWlkID0gVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yOw0KKwkJcmV0dXJuOw0KKwl9DQogfQ0KIC8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjb25zdGFudCBwb29sIG5hbWUuDQogKg0KQEAgLTI1OSwxMyArMjY0LDExIEBACiAqLw0KIA0KIHB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIC8qIGphdmEvbGFuZy9PYmplY3QgKi8gew0KLQlpZiAoY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKQ0KLQkJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWU7DQotDQorCWlmIChjb25zdGFudFBvb2xOYW1lICE9IG51bGwpIAlyZXR1cm4gY29uc3RhbnRQb29sTmFtZTsNCiAJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpOw0KIH0NCiBTdHJpbmcgZGVidWdOYW1lKCkgew0KLQlyZXR1cm4gKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcocmVhZGFibGVOYW1lKCkpIDogIlVOTkFNRUQgVFlQRSIvKm5vbk5MUyovOw0KKwlyZXR1cm4gKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcocmVhZGFibGVOYW1lKCkpIDogIlVOTkFNRUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIGZpbmFsIGludCBkZXB0aCgpIHsNCiAJaW50IGRlcHRoID0gMDsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEKaW5kZXggYWJhNmM5OC4uNGQxMWNlZCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TY29wZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2NvcGUuamF2YQpAQCAtOSw3ICs5LDE2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCiANCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NvcGUgaW1wbGVtZW50cyBCYXNlVHlwZXMsIEJpbmRpbmdJZHMsIENvbXBpbGVyTW9kaWZpZXJzLCBQcm9ibGVtUmVhc29ucywgVGFnQml0cywgVHlwZUNvbnN0YW50cywgVHlwZUlkcyB7DQorcHVibGljIGFic3RyYWN0IGNsYXNzIFNjb3BlDQorCWltcGxlbWVudHMNCisJCUJhc2VUeXBlcywNCisJCUJpbmRpbmdJZHMsDQorCQlDb21waWxlck1vZGlmaWVycywNCisJCVByb2JsZW1SZWFzb25zLA0KKwkJVGFnQml0cywNCisJCVR5cGVDb25zdGFudHMsDQorCQlUeXBlSWRzIHsNCisNCiAJcHVibGljIFNjb3BlIHBhcmVudDsNCiAJcHVibGljIGludCBraW5kOw0KIA0KQEAgLTE3LDEwNDggKzI2LDExOTQgQEAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0RfU0NPUEUgPSAyOw0KIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19TQ09QRSA9IDM7DQogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgPSA0Ow0KLXByb3RlY3RlZCBTY29wZShpbnQga2luZCwgU2NvcGUgcGFyZW50KSB7DQotCXRoaXMua2luZCA9IGtpbmQ7DQotCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KLX0NCi0vLyBJbnRlcm5hbCB1c2Ugb25seQ0KKwlwcm90ZWN0ZWQgU2NvcGUoaW50IGtpbmQsIFNjb3BlIHBhcmVudCkgew0KKwkJdGhpcy5raW5kID0ga2luZDsNCisJCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KKwl9DQogDQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUoVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50cykgew0KLQlpZiAocGFyYW1ldGVycyA9PSBhcmd1bWVudHMpDQorCXB1YmxpYyBhYnN0cmFjdCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCk7DQorDQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKA0KKwkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzLA0KKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMpIHsNCisJCWlmIChwYXJhbWV0ZXJzID09IGFyZ3VtZW50cykNCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsNCisJCWlmIChsZW5ndGggIT0gYXJndW1lbnRzLmxlbmd0aCkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KKwkJCWlmIChwYXJhbWV0ZXJzW2ldICE9IGFyZ3VtZW50c1tpXSkNCisJCQkJaWYgKCFhcmd1bWVudHNbaV0uaXNDb21wYXRpYmxlV2l0aChwYXJhbWV0ZXJzW2ldKSkNCisJCQkJCXJldHVybiBmYWxzZTsNCiAJCXJldHVybiB0cnVlOw0KKwl9DQogDQotCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsNCi0JaWYgKGxlbmd0aCAhPSBhcmd1bWVudHMubGVuZ3RoKQ0KLQkJcmV0dXJuIGZhbHNlOw0KKwkvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbGVmdCB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byByaWdodA0KKwkqLw0KKwlwdWJsaWMgYm9vbGVhbiBhcmVUeXBlc0NvbXBhdGlibGUoVHlwZUJpbmRpbmcgbGVmdCwgVHlwZUJpbmRpbmcgcmlnaHQpIHsNCisJCXJldHVybiBsZWZ0LmlzQ29tcGF0aWJsZVdpdGgocmlnaHQpOw0KKwl9DQorDQorCS8qIEFuc3dlciBhbiBpbnQgZGVzY3JpYmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdpdmVuIHR5cGVzLg0KKwkqDQorCSogCQlOb3RSZWxhdGVkIA0KKwkqIAkJRXF1YWxPck1vcmVTcGVjaWZpYyA6IGxlZnQgaXMgY29tcGF0aWJsZSB3aXRoIHJpZ2h0DQorCSogCQlNb3JlR2VuZXJpYyA6IHJpZ2h0IGlzIGNvbXBhdGlibGUgd2l0aCBsZWZ0DQorCSovDQorCXB1YmxpYyBpbnQgY29tcGFyZVR5cGVzKFR5cGVCaW5kaW5nIGxlZnQsIFR5cGVCaW5kaW5nIHJpZ2h0KSB7DQorCQlpZiAoYXJlVHlwZXNDb21wYXRpYmxlKGxlZnQsIHJpZ2h0KSkNCisJCQlyZXR1cm4gRXF1YWxPck1vcmVTcGVjaWZpYzsNCisJCWlmIChhcmVUeXBlc0NvbXBhdGlibGUocmlnaHQsIGxlZnQpKQ0KKwkJCXJldHVybiBNb3JlR2VuZXJpYzsNCisJCXJldHVybiBOb3RSZWxhdGVkOw0KKwl9DQorDQorCS8qIEFuc3dlciBhbiBpbnQgZGVzY3JpYmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdpdmVuIHR5cGUgYW5kIHVuY2hlY2tlZCBleGNlcHRpb25zLg0KKwkqDQorCSogCU5vdFJlbGF0ZWQgDQorCSogCUVxdWFsT3JNb3JlU3BlY2lmaWMgOiB0eXBlIGlzIGtub3duIGZvciBzdXJlIHRvIGJlIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZQ0KKwkqIAlNb3JlR2VuZXJpYyA6IHR5cGUgaXMgYSBzdXBlcnR5cGUgb2YgYW4gYWN0dWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZQ0KKwkqLw0KKwlwdWJsaWMgaW50IGNvbXBhcmVVbmNoZWNrZWRFeGNlcHRpb24oUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7DQorCQlpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmVUeXBlcyh0eXBlLCBnZXRKYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24oKSk7DQorCQlpZiAoY29tcGFyaXNvbiAhPSAwKQ0KKwkJCXJldHVybiBjb21wYXJpc29uOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBjb21wYXJlVHlwZXModHlwZSwgZ2V0SmF2YUxhbmdFcnJvcigpKTsNCisJfQ0KKw0KKwlwdWJsaWMgZmluYWwgQ29tcGlsYXRpb25Vbml0U2NvcGUgY29tcGlsYXRpb25Vbml0U2NvcGUoKSB7DQorCQlTY29wZSBsYXN0U2NvcGUgPSBudWxsOw0KKwkJU2NvcGUgc2NvcGUgPSB0aGlzOw0KKwkJZG8gew0KKwkJCWxhc3RTY29wZSA9IHNjb3BlOw0KKwkJCXNjb3BlID0gc2NvcGUucGFyZW50Ow0KKwkJfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7DQorCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBsYXN0U2NvcGU7DQorCX0NCisNCisJcHVibGljIEFycmF5QmluZGluZyBjcmVhdGVBcnJheShUeXBlQmluZGluZyB0eXBlLCBpbnQgZGltZW5zaW9uKSB7DQorCQlpZiAodHlwZS5pc1ZhbGlkQmluZGluZygpKQ0KKwkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZUFycmF5VHlwZSh0eXBlLCBkaW1lbnNpb24pOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBuZXcgQXJyYXlCaW5kaW5nKHR5cGUsIGRpbWVuc2lvbik7DQorCX0NCisNCisJLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGVuY2xvc2luZyBzb3VyY2UgdHlwZS4NCisJKi8NCisJcHVibGljIGZpbmFsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUoKSB7DQorCQlTY29wZSBzY29wZSA9IHRoaXM7DQorCQlkbyB7DQorCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkNCisJCQkJcmV0dXJuICgoQ2xhc3NTY29wZSkgc2NvcGUpLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCisJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisJcHVibGljIGZpbmFsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgew0KKwkJU2NvcGUgc2NvcGUsIHVuaXRTY29wZSA9IHRoaXM7DQorCQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkNCisJCQl1bml0U2NvcGUgPSBzY29wZTsNCisJCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB1bml0U2NvcGUpLmVudmlyb25tZW50Ow0KKwl9DQorDQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGZpbmREaXJlY3RNZW1iZXJUeXBlKA0KKwkJY2hhcltdIHR5cGVOYW1lLA0KKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7DQorCQlpZiAoKGVuY2xvc2luZ1R5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApDQorCQkJcmV0dXJuIG51bGw7IC8vIGtub3cgaXQgaGFzIG5vIG1lbWJlciB0eXBlcyAobm9yIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMpDQorDQorCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlID0gZW5jbG9zaW5nU291cmNlVHlwZSgpOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGVuY2xvc2luZ1R5cGUpOw0KKwkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZW5jbG9zaW5nVHlwZS5nZXRNZW1iZXJUeXBlKHR5cGVOYW1lKTsNCisJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7DQorCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbA0KKwkJCQk/IG1lbWJlclR5cGUuY2FuQmVTZWVuQnkoZ2V0Q3VycmVudFBhY2thZ2UoKSkNCisJCQkJOiBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1NvdXJjZVR5cGUpKQ0KKwkJCQlyZXR1cm4gbWVtYmVyVHlwZTsNCisJCQllbHNlDQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIE5vdFZpc2libGUpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkNCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZEV4YWN0TWV0aG9kKA0KKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsDQorCQljaGFyW10gc2VsZWN0b3IsDQorCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKHJlY2VpdmVyVHlwZSk7DQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2VzKGFyZ3VtZW50VHlwZXMpOw0KKwkJTWV0aG9kQmluZGluZyBleGFjdE1ldGhvZCA9DQorCQkJcmVjZWl2ZXJUeXBlLmdldEV4YWN0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzKTsNCisJCWlmIChleGFjdE1ldGhvZCAhPSBudWxsKSB7DQorCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlcyhleGFjdE1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsNCisJCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkNCisJCQkJfHwgZXhhY3RNZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpDQorCQkJCXJldHVybiBleGFjdE1ldGhvZDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCS8qCUFuc3dlciB0aGUgZmllbGQgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIGZpZWxkTmFtZS4NCisJCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIHJlY2VpdmVyVHlwZS4NCisJCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMNCisJCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgZmllbGQgaXMgdmlzaWJsZS4NCisJCU9ubHkgZmllbGRzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyVHlwZSBvciBpdHMgc3VwZXJ0eXBlcyBhcmUgYW5zd2VyZWQ7DQorCQlhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyB0eXBlIHdpbGwgbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgQVBJLg0KIAkNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykNCi0JCWlmIChwYXJhbWV0ZXJzW2ldICE9IGFyZ3VtZW50c1tpXSkNCi0JCQlpZiAoIWFyZ3VtZW50c1tpXS5pc0NvbXBhdGlibGVXaXRoKHBhcmFtZXRlcnNbaV0pKQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCXJldHVybiB0cnVlOw0KLX0NCi0vKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbGVmdCB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byByaWdodA0KLSovDQotDQotcHVibGljIGJvb2xlYW4gYXJlVHlwZXNDb21wYXRpYmxlKFR5cGVCaW5kaW5nIGxlZnQsIFR5cGVCaW5kaW5nIHJpZ2h0KSB7DQotCXJldHVybiBsZWZ0LmlzQ29tcGF0aWJsZVdpdGgocmlnaHQpOw0KLX0NCi0vKiBBbnN3ZXIgYW4gaW50IGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBnaXZlbiB0eXBlcy4NCi0qDQotKiAJCU5vdFJlbGF0ZWQgDQotKiAJCUVxdWFsT3JNb3JlU3BlY2lmaWMgOiBsZWZ0IGlzIGNvbXBhdGlibGUgd2l0aCByaWdodA0KLSogCQlNb3JlR2VuZXJpYyA6IHJpZ2h0IGlzIGNvbXBhdGlibGUgd2l0aCBsZWZ0DQotKi8NCi0NCi1wdWJsaWMgaW50IGNvbXBhcmVUeXBlcyhUeXBlQmluZGluZyBsZWZ0LCBUeXBlQmluZGluZyByaWdodCkgew0KLQlpZiAoYXJlVHlwZXNDb21wYXRpYmxlKGxlZnQsIHJpZ2h0KSkNCi0JCXJldHVybiBFcXVhbE9yTW9yZVNwZWNpZmljOw0KLQlpZiAoYXJlVHlwZXNDb21wYXRpYmxlKHJpZ2h0LCBsZWZ0KSkNCi0JCXJldHVybiBNb3JlR2VuZXJpYzsNCi0JcmV0dXJuIE5vdFJlbGF0ZWQ7DQotfQ0KLS8qIEFuc3dlciBhbiBpbnQgZGVzY3JpYmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdpdmVuIHR5cGUgYW5kIHVuY2hlY2tlZCBleGNlcHRpb25zLg0KLSoNCi0qIAlOb3RSZWxhdGVkIA0KLSogCUVxdWFsT3JNb3JlU3BlY2lmaWMgOiB0eXBlIGlzIGtub3duIGZvciBzdXJlIHRvIGJlIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZQ0KLSogCU1vcmVHZW5lcmljIDogdHlwZSBpcyBhIHN1cGVydHlwZSBvZiBhbiBhY3R1YWwgdW5jaGVja2VkIGV4Y2VwdGlvbiB0eXBlDQotKi8NCi0NCi1wdWJsaWMgaW50IGNvbXBhcmVVbmNoZWNrZWRFeGNlcHRpb24oUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7DQotCWludCBjb21wYXJpc29uID0gY29tcGFyZVR5cGVzKHR5cGUsIGdldEphdmFMYW5nUnVudGltZUV4Y2VwdGlvbigpKTsNCi0JaWYgKGNvbXBhcmlzb24gIT0gMCkNCi0JCXJldHVybiBjb21wYXJpc29uOw0KLQllbHNlDQotCQlyZXR1cm4gY29tcGFyZVR5cGVzKHR5cGUsIGdldEphdmFMYW5nRXJyb3IoKSk7DQotfQ0KLXB1YmxpYyBmaW5hbCBDb21waWxhdGlvblVuaXRTY29wZSBjb21waWxhdGlvblVuaXRTY29wZSgpIHsNCi0JU2NvcGUgbGFzdFNjb3BlID0gbnVsbDsNCi0JU2NvcGUgc2NvcGUgPSB0aGlzOw0KLQlkbyB7DQotCQlsYXN0U2NvcGUgPSBzY29wZTsNCi0JCXNjb3BlID0gc2NvcGUucGFyZW50Ow0KLQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsNCi0JcmV0dXJuIChDb21waWxhdGlvblVuaXRTY29wZSkgbGFzdFNjb3BlOw0KLX0NCi1wdWJsaWMgQXJyYXlCaW5kaW5nIGNyZWF0ZUFycmF5KFR5cGVCaW5kaW5nIHR5cGUsIGludCBkaW1lbnNpb24pIHsNCi0JaWYgKHR5cGUuaXNWYWxpZEJpbmRpbmcoKSkNCi0JCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZUFycmF5VHlwZSh0eXBlLCBkaW1lbnNpb24pOw0KLQllbHNlDQotCQlyZXR1cm4gbmV3IEFycmF5QmluZGluZyh0eXBlLCBkaW1lbnNpb24pOw0KLX0NCi0vKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZW5jbG9zaW5nIHNvdXJjZSB0eXBlLg0KLSovDQotDQotcHVibGljIGZpbmFsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUoKSB7DQotCVNjb3BlIHNjb3BlID0gdGhpczsNCi0JZG8gew0KLQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkNCi0JCQlyZXR1cm4gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQotCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOw0KLQlyZXR1cm4gbnVsbDsNCi19DQotcHVibGljIGZpbmFsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgew0KLQlTY29wZSBzY29wZSwgdW5pdFNjb3BlID0gdGhpczsNCi0Jd2hpbGUgKChzY29wZSA9IHVuaXRTY29wZS5wYXJlbnQpICE9IG51bGwpDQotCQl1bml0U2NvcGUgPSBzY29wZTsNCi0JcmV0dXJuICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHVuaXRTY29wZSkuZW52aXJvbm1lbnQ7DQotfQ0KLS8vIEludGVybmFsIHVzZSBvbmx5DQotDQotcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZmluZERpcmVjdE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsNCi0JaWYgKChlbmNsb3NpbmdUeXBlLnRhZ0JpdHMgJiBIYXNOb01lbWJlclR5cGVzKSAhPSAwKQ0KLQkJcmV0dXJuIG51bGw7IC8vIGtub3cgaXQgaGFzIG5vIG1lbWJlciB0eXBlcyAobm9yIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMpDQotDQotCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBlbmNsb3NpbmdTb3VyY2VUeXBlKCk7DQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZShlbmNsb3NpbmdUeXBlKTsNCi0JUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZW5jbG9zaW5nVHlwZS5nZXRNZW1iZXJUeXBlKHR5cGVOYW1lKTsNCi0JaWYgKG1lbWJlclR5cGUgIT0gbnVsbCkgew0KLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKG1lbWJlclR5cGUpOw0KLQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbA0KLQkJCT8gbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShnZXRDdXJyZW50UGFja2FnZSgpKQ0KLQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdTb3VyY2VUeXBlKSkNCi0JCQkJcmV0dXJuIG1lbWJlclR5cGU7DQotCQllbHNlDQotCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIE5vdFZpc2libGUpOw0KLQl9DQotCXJldHVybiBudWxsOw0KLX0NCi0vLyBJbnRlcm5hbCB1c2Ugb25seQ0KLQ0KLXB1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmRFeGFjdE1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7DQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZShyZWNlaXZlclR5cGUpOw0KLQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2VzKGFyZ3VtZW50VHlwZXMpOw0KLQlNZXRob2RCaW5kaW5nIGV4YWN0TWV0aG9kID0gcmVjZWl2ZXJUeXBlLmdldEV4YWN0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzKTsNCi0JaWYgKGV4YWN0TWV0aG9kICE9IG51bGwpew0KLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlcyhleGFjdE1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsNCi0JCWlmIChyZWNlaXZlclR5cGUuaXNJbnRlcmZhY2UoKSB8fCBleGFjdE1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkNCi0JCQlyZXR1cm4gZXhhY3RNZXRob2Q7DQotCX0NCi0JcmV0dXJuIG51bGw7DQotfQ0KLS8vIEludGVybmFsIHVzZSBvbmx5DQotDQotLyoJQW5zd2VyIHRoZSBmaWVsZCBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGROYW1lLg0KLQlTdGFydCB0aGUgbG9va3VwIGF0IHRoZSByZWNlaXZlclR5cGUuDQotCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMNCi0JCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBmaWVsZCBpcyB2aXNpYmxlLg0KLQlPbmx5IGZpZWxkcyBkZWZpbmVkIGJ5IHRoZSByZWNlaXZlclR5cGUgb3IgaXRzIHN1cGVydHlwZXMgYXJlIGFuc3dlcmVkOw0KLQlhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyB0eXBlIHdpbGwgbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgQVBJLg0KLQ0KLQlJZiBubyB2aXNpYmxlIGZpZWxkIGlzIGRpc2NvdmVyZWQsIG51bGwgaXMgYW5zd2VyZWQuDQotKi8NCi0NCi1wdWJsaWMgRmllbGRCaW5kaW5nIGZpbmRGaWVsZChUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIGNoYXJbXSBmaWVsZE5hbWUsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7DQotCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQ0KLQkJcmV0dXJuIG51bGw7DQotCWlmIChyZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKSkgew0KLQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkTmFtZSwgTEVOR1RIKSkNCi0JCQlyZXR1cm4gQXJyYXlCaW5kaW5nLkxlbmd0aEZpZWxkOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7DQotCWlmICghY3VycmVudFR5cGUuY2FuQmVTZWVuQnkodGhpcykpDQotCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoZmllbGROYW1lLCBOb3RWaXNpYmxlKTsgLy8gKioqIE5lZWQgYSBuZXcgcHJvYmxlbSBpZCAtIFR5cGVOb3RWaXNpYmxlPw0KLQ0KLQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOw0KLQlGaWVsZEJpbmRpbmcgZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOw0KLQlpZiAoZmllbGQgIT0gbnVsbCkgew0KLQkJaWYgKGZpZWxkLmNhbkJlU2VlbkJ5KGN1cnJlbnRUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpDQotCQkJcmV0dXJuIGZpZWxkOw0KLQkJZWxzZQ0KKwkJSWYgbm8gdmlzaWJsZSBmaWVsZCBpcyBkaXNjb3ZlcmVkLCBudWxsIGlzIGFuc3dlcmVkLg0KKwkqLw0KKwlwdWJsaWMgRmllbGRCaW5kaW5nIGZpbmRGaWVsZCgNCisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCWNoYXJbXSBmaWVsZE5hbWUsDQorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KKwkJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpDQorCQkJcmV0dXJuIG51bGw7DQorCQlpZiAocmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsNCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGROYW1lLCBMRU5HVEgpKQ0KKwkJCQlyZXR1cm4gQXJyYXlCaW5kaW5nLkxlbmd0aEZpZWxkOw0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7DQorCQlpZiAoIWN1cnJlbnRUeXBlLmNhbkJlU2VlbkJ5KHRoaXMpKQ0KIAkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhmaWVsZE5hbWUsIE5vdFZpc2libGUpOw0KLQl9DQotDQotCS8vIGNvbGxlY3QgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiByZWNlaXZlclR5cGUgdW50aWwgdGhlIGZpZWxkIGlzIGZvdW5kIGluIGEgc3VwZXJ0eXBlDQotCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsNCi0JaW50IGxhc3RQb3NpdGlvbiA9IC0xOw0KLQlGaWVsZEJpbmRpbmcgdmlzaWJsZUZpZWxkID0gbnVsbDsNCi0JYm9vbGVhbiBrZWVwTG9va2luZyA9IHRydWU7DQotCWJvb2xlYW4gbm90VmlzaWJsZSA9IGZhbHNlOyAvLyB3ZSBjb3VsZCBob2xkIG9udG8gdGhlIG5vdCB2aXNpYmxlIGZpZWxkIGZvciBleHRyYSBlcnJvciByZXBvcnRpbmcNCi0Jd2hpbGUgKGtlZXBMb29raW5nKSB7DQotCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KLQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCi0JCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkNCi0JCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOw0KLQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsNCi0JCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCi0JCX0NCi0JCWlmICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpID09IG51bGwpDQotCQkJYnJlYWs7DQotDQotCQlpZiAoKGZpZWxkID0gY3VycmVudFR5cGUuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgew0KLQkJCWtlZXBMb29raW5nID0gZmFsc2U7DQotCQkJaWYgKGZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKSB7DQotCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkNCi0JCQkJCXZpc2libGVGaWVsZCA9IGZpZWxkOw0KLQkJCQllbHNlDQotCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoZmllbGROYW1lLCBBbWJpZ3VvdXMpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5vdFZpc2libGUgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvLyB3YWxrIGFsbCB2aXNpYmxlIGludGVyZmFjZXMgdG8gZmluZCBhbWJpZ3VvdXMgcmVmZXJlbmNlcw0KLQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KLQkJUHJvYmxlbUZpZWxkQmluZGluZyBhbWJpZ3VvdXMgPSBudWxsOw0KLQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCi0JCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1tqXTsNCi0JCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeyAvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkDQotCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7DQotCQkJCQlpZiAoKGZpZWxkID0gYW5JbnRlcmZhY2UuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgew0KLQkJCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkgew0KLQkJCQkJCQl2aXNpYmxlRmllbGQgPSBmaWVsZDsNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQlhbWJpZ3VvdXMgPSBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhmaWVsZE5hbWUsIEFtYmlndW91cyk7DQotCQkJCQkJCWJyZWFrIGRvbmU7DQotCQkJCQkJfQ0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOw0KLQkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQotCQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQotCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGJpdCByZWluaXRpYWxpemF0aW9uDQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQotCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspDQotCQkJCWludGVyZmFjZXNbal0udGFnQml0cyAmPSB+SW50ZXJmYWNlVmlzaXRlZDsNCi0JCX0NCi0JCWlmIChhbWJpZ3VvdXMgIT0gbnVsbCkgcmV0dXJuIGFtYmlndW91czsNCi0JfQ0KLQ0KLQlpZiAodmlzaWJsZUZpZWxkICE9IG51bGwpDQotCQlyZXR1cm4gdmlzaWJsZUZpZWxkOw0KLQlpZiAobm90VmlzaWJsZSkNCi0JCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhmaWVsZE5hbWUsIE5vdFZpc2libGUpOw0KLQlyZXR1cm4gbnVsbDsNCi19DQotLy8gSW50ZXJuYWwgdXNlIG9ubHkNCi0NCi1wdWJsaWMgIFJlZmVyZW5jZUJpbmRpbmcgZmluZE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsNCi0JaWYgKChlbmNsb3NpbmdUeXBlLnRhZ0JpdHMgJiBIYXNOb01lbWJlclR5cGVzKSAhPSAwKQ0KLQkJcmV0dXJuIG51bGw7IC8vIGtub3cgaXQgaGFzIG5vIG1lbWJlciB0eXBlcyAobm9yIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMpDQotDQotCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBlbmNsb3NpbmdTb3VyY2VUeXBlKCk7DQotCVBhY2thZ2VCaW5kaW5nIGN1cnJlbnRQYWNrYWdlID0gZ2V0Q3VycmVudFBhY2thZ2UoKTsNCi0JY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGVuY2xvc2luZ1R5cGUpOw0KLQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBlbmNsb3NpbmdUeXBlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpOw0KLQlpZiAobWVtYmVyVHlwZSAhPSBudWxsKSB7DQotCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7DQotCQlpZiAoZW5jbG9zaW5nU291cmNlVHlwZSA9PSBudWxsDQotCQkJPyBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGN1cnJlbnRQYWNrYWdlKQ0KLQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdTb3VyY2VUeXBlKSkNCi0JCQkJcmV0dXJuIG1lbWJlclR5cGU7DQotCQllbHNlDQotCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIE5vdFZpc2libGUpOw0KLQl9DQotDQotCS8vIGNvbGxlY3QgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiByZWNlaXZlclR5cGUgdW50aWwgdGhlIG1lbWJlclR5cGUgaXMgZm91bmQgaW4gYSBzdXBlcnR5cGUNCi0JUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGVuY2xvc2luZ1R5cGU7DQotCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsNCi0JaW50IGxhc3RQb3NpdGlvbiA9IC0xOw0KLQlSZWZlcmVuY2VCaW5kaW5nIHZpc2libGVNZW1iZXJUeXBlID0gbnVsbDsNCi0JYm9vbGVhbiBrZWVwTG9va2luZyA9IHRydWU7DQotCWJvb2xlYW4gbm90VmlzaWJsZSA9IGZhbHNlOyAvLyB3ZSBjb3VsZCBob2xkIG9udG8gdGhlIG5vdCB2aXNpYmxlIGZpZWxkIGZvciBleHRyYSBlcnJvciByZXBvcnRpbmcNCi0Jd2hpbGUgKGtlZXBMb29raW5nKSB7DQotCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KLQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCi0JCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkNCi0JCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOw0KLQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsNCi0JCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCi0JCX0NCi0JCWlmICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpID09IG51bGwpDQotCQkJYnJlYWs7DQorCQkvLyAqKiogTmVlZCBhIG5ldyBwcm9ibGVtIGlkIC0gVHlwZU5vdFZpc2libGU/DQogDQogCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOw0KLQkJaWYgKChtZW1iZXJUeXBlID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZSh0eXBlTmFtZSkpICE9IG51bGwpIHsNCi0JCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7DQotCQkJa2VlcExvb2tpbmcgPSBmYWxzZTsNCi0JCQlpZiAoZW5jbG9zaW5nU291cmNlVHlwZSA9PSBudWxsDQotCQkJCT8gbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShjdXJyZW50UGFja2FnZSkNCi0JCQkJOiBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1NvdXJjZVR5cGUpKSB7DQotCQkJCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgPT0gbnVsbCkNCi0JCQkJCQl2aXNpYmxlTWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7DQotCQkJCQllbHNlDQotCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgQW1iaWd1b3VzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlub3RWaXNpYmxlID0gdHJ1ZTsNCi0JCQl9DQorCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOw0KKwkJaWYgKGZpZWxkICE9IG51bGwpIHsNCisJCQlpZiAoZmllbGQuY2FuQmVTZWVuQnkoY3VycmVudFR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkNCisJCQkJcmV0dXJuIGZpZWxkOw0KKwkJCWVsc2UNCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGZpZWxkTmFtZSwgTm90VmlzaWJsZSk7DQogCQl9DQotCX0NCisJCS8vIGNvbGxlY3QgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiByZWNlaXZlclR5cGUgdW50aWwgdGhlIGZpZWxkIGlzIGZvdW5kIGluIGEgc3VwZXJ0eXBlDQorCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7DQorCQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQorCQlGaWVsZEJpbmRpbmcgdmlzaWJsZUZpZWxkID0gbnVsbDsNCisJCWJvb2xlYW4ga2VlcExvb2tpbmcgPSB0cnVlOw0KKwkJYm9vbGVhbiBub3RWaXNpYmxlID0gZmFsc2U7DQorCQkvLyB3ZSBjb3VsZCBob2xkIG9udG8gdGhlIG5vdCB2aXNpYmxlIGZpZWxkIGZvciBleHRyYSBlcnJvciByZXBvcnRpbmcNCisJCXdoaWxlIChrZWVwTG9va2luZykgew0KKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQorCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCisJCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpDQorCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107DQorCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LA0KKwkJCQkJCTAsDQorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLA0KKwkJCQkJCTAsDQorCQkJCQkJbGFzdFBvc2l0aW9uKTsNCisJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQorCQkJfQ0KKwkJCWlmICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpID09IG51bGwpDQorCQkJCWJyZWFrOw0KIA0KLQkvLyB3YWxrIGFsbCB2aXNpYmxlIGludGVyZmFjZXMgdG8gZmluZCBhbWJpZ3VvdXMgcmVmZXJlbmNlcw0KLQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgew0KLQkJUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgYW1iaWd1b3VzID0gbnVsbDsNCi0JCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQotCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsNCi0JCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQotCQkJCWlmICgoYW5JbnRlcmZhY2UudGFnQml0cyAmIEludGVyZmFjZVZpc2l0ZWQpID09IDApIHsgLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZA0KLQkJCQkJYW5JbnRlcmZhY2UudGFnQml0cyB8PSBJbnRlcmZhY2VWaXNpdGVkOw0KLQkJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGFuSW50ZXJmYWNlKTsNCi0JCQkJCWlmICgobWVtYmVyVHlwZSA9IGFuSW50ZXJmYWNlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpKSAhPSBudWxsKSB7DQotCQkJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKG1lbWJlclR5cGUpOw0KLQkJCQkJCWlmICh2aXNpYmxlTWVtYmVyVHlwZSA9PSBudWxsKSB7DQotCQkJCQkJCXZpc2libGVNZW1iZXJUeXBlID0gbWVtYmVyVHlwZTsNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQlhbWJpZ3VvdXMgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIEFtYmlndW91cyk7DQotCQkJCQkJCWJyZWFrIGRvbmU7DQotCQkJCQkJfQ0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOw0KLQkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQotCQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQotCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7DQotCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KLQkJCQkJCX0NCi0JCQkJCX0NCisJCQlpZiAoKGZpZWxkID0gY3VycmVudFR5cGUuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgew0KKwkJCQlrZWVwTG9va2luZyA9IGZhbHNlOw0KKwkJCQlpZiAoZmllbGQuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpIHsNCisJCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkNCisJCQkJCQl2aXNpYmxlRmllbGQgPSBmaWVsZDsNCisJCQkJCWVsc2UNCisJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoZmllbGROYW1lLCBBbWJpZ3VvdXMpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJbm90VmlzaWJsZSA9IHRydWU7DQogCQkJCX0NCiAJCQl9DQogCQl9DQotDQotCQkvLyBiaXQgcmVpbml0aWFsaXphdGlvbg0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsNCi0JCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KLQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQ0KLQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7DQotCQl9DQotCQlpZiAoYW1iaWd1b3VzICE9IG51bGwpIHJldHVybiBhbWJpZ3VvdXM7DQotCX0NCi0NCi0JaWYgKHZpc2libGVNZW1iZXJUeXBlICE9IG51bGwpDQotCQlyZXR1cm4gdmlzaWJsZU1lbWJlclR5cGU7DQotCWlmIChub3RWaXNpYmxlKQ0KLQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgTm90VmlzaWJsZSk7DQotCXJldHVybiBudWxsOw0KLX0NCi0vLyBJbnRlcm5hbCB1c2Ugb25seQ0KLQ0KLXB1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmRNZXRob2QoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsIGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOw0KLQlNZXRob2RCaW5kaW5nIG1hdGNoaW5nTWV0aG9kID0gbnVsbDsNCi0JT2JqZWN0VmVjdG9yIGZvdW5kID0gbnVsbDsNCi0NCi0JY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGN1cnJlbnRUeXBlKTsNCi0JY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlcyhhcmd1bWVudFR5cGVzKTsNCi0JaWYgKGN1cnJlbnRUeXBlLmlzSW50ZXJmYWNlKCkpIHsNCi0JCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50TWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpOw0KLQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7DQotCQlpZiAoY3VycmVudExlbmd0aCA9PSAxKSB7DQotCQkJbWF0Y2hpbmdNZXRob2QgPSBjdXJyZW50TWV0aG9kc1swXTsNCi0JCX0gZWxzZSBpZiAoY3VycmVudExlbmd0aCA+IDEpIHsNCi0JCQlmb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsNCi0JCQlmb3IgKGludCBmID0gMDsgZiA8IGN1cnJlbnRMZW5ndGg7IGYrKykNCi0JCQkJZm91bmQuYWRkKGN1cnJlbnRNZXRob2RzW2ZdKTsNCi0JCX0NCi0NCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7DQotCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsNCi0JCQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7DQotCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCi0JCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOw0KLQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KLQkJCQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQorCQkvLyB3YWxrIGFsbCB2aXNpYmxlIGludGVyZmFjZXMgdG8gZmluZCBhbWJpZ3VvdXMgcmVmZXJlbmNlcw0KKwkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsNCisJCQlQcm9ibGVtRmllbGRCaW5kaW5nIGFtYmlndW91cyA9IG51bGw7DQorCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQogCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQogCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7DQotCQkJCQljdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal07DQotCQkJCQlpZiAoKGN1cnJlbnRUeXBlLnRhZ0JpdHMgJiBJbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7IC8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQNCi0JCQkJCQljdXJyZW50VHlwZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7DQotDQotCQkJCQkJY3VycmVudE1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsNCi0JCQkJCQlpZiAoKGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGgpID09IDEgJiYgbWF0Y2hpbmdNZXRob2QgPT0gbnVsbCAmJiBmb3VuZCA9PSBudWxsKSB7DQotCQkJCQkJCW1hdGNoaW5nTWV0aG9kID0gY3VycmVudE1ldGhvZHNbMF07DQotCQkJCQkJfSBlbHNlIGlmIChjdXJyZW50TGVuZ3RoID4gMCkgew0KLQkJCQkJCQlpZiAoZm91bmQgPT0gbnVsbCkgew0KLQkJCQkJCQkJZm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQotCQkJCQkJCQlpZiAobWF0Y2hpbmdNZXRob2QgIT0gbnVsbCkNCi0JCQkJCQkJCQlmb3VuZC5hZGQobWF0Y2hpbmdNZXRob2QpOw0KKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07DQorCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBJbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7DQorCQkJCQkJLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZA0KKwkJCQkJCWFuSW50ZXJmYWNlLnRhZ0JpdHMgfD0gSW50ZXJmYWNlVmlzaXRlZDsNCisJCQkJCQlpZiAoKGZpZWxkID0gYW5JbnRlcmZhY2UuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgew0KKwkJCQkJCQlpZiAodmlzaWJsZUZpZWxkID09IG51bGwpIHsNCisJCQkJCQkJCXZpc2libGVGaWVsZCA9IGZpZWxkOw0KKwkJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQkJYW1iaWd1b3VzID0gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoZmllbGROYW1lLCBBbWJpZ3VvdXMpOw0KKwkJCQkJCQkJYnJlYWsgZG9uZTsNCiAJCQkJCQkJfQ0KLQkJCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGN1cnJlbnRMZW5ndGg7IGYrKykNCi0JCQkJCQkJCWZvdW5kLmFkZChjdXJyZW50TWV0aG9kc1tmXSk7DQotCQkJCQkJfQ0KLQ0KLQkJCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCi0JCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KLQkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KLQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOw0KLQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KKwkJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KKwkJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwNCisJCQkJCQkJCQkJMCwNCisJCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLA0KKwkJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCQlsYXN0UG9zaXRpb24pOw0KKwkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7DQorCQkJCQkJCX0NCiAJCQkJCQl9DQogCQkJCQl9DQogCQkJCX0NCiAJCQl9DQotDQogCQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24NCiAJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgew0KIAkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KIAkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykNCiAJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyAmPSB+SW50ZXJmYWNlVmlzaXRlZDsNCiAJCQl9DQorCQkJaWYgKGFtYmlndW91cyAhPSBudWxsKQ0KKwkJCQlyZXR1cm4gYW1iaWd1b3VzOw0KIAkJfQ0KLQkJY3VycmVudFR5cGUgPSAobWF0Y2hpbmdNZXRob2QgPT0gbnVsbCAmJiBmb3VuZCA9PSBudWxsKSA/IGdldEphdmFMYW5nT2JqZWN0KCkgOiBudWxsOw0KKw0KKwkJaWYgKHZpc2libGVGaWVsZCAhPSBudWxsKQ0KKwkJCXJldHVybiB2aXNpYmxlRmllbGQ7DQorCQlpZiAobm90VmlzaWJsZSkNCisJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoZmllbGROYW1lLCBOb3RWaXNpYmxlKTsNCisJCXJldHVybiBudWxsOw0KIAl9DQogDQotCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7DQotCQlNZXRob2RCaW5kaW5nW10gY3VycmVudE1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsNCi0JCWludCBjdXJyZW50TGVuZ3RoID0gY3VycmVudE1ldGhvZHMubGVuZ3RoOw0KLQkJaWYgKGN1cnJlbnRMZW5ndGggPT0gMSAmJiBtYXRjaGluZ01ldGhvZCA9PSBudWxsICYmIGZvdW5kID09IG51bGwpIHsNCi0JCQltYXRjaGluZ01ldGhvZCA9IGN1cnJlbnRNZXRob2RzWzBdOw0KLQkJfSBlbHNlIGlmIChjdXJyZW50TGVuZ3RoID4gMCkgew0KLQkJCWlmIChmb3VuZCA9PSBudWxsKSB7DQotCQkJCWZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOw0KLQkJCQlpZiAobWF0Y2hpbmdNZXRob2QgIT0gbnVsbCkNCi0JCQkJCWZvdW5kLmFkZChtYXRjaGluZ01ldGhvZCk7DQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGZpbmRNZW1iZXJUeXBlKA0KKwkJY2hhcltdIHR5cGVOYW1lLA0KKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7DQorCQlpZiAoKGVuY2xvc2luZ1R5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApDQorCQkJcmV0dXJuIG51bGw7IC8vIGtub3cgaXQgaGFzIG5vIG1lbWJlciB0eXBlcyAobm9yIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMpDQorDQorCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlID0gZW5jbG9zaW5nU291cmNlVHlwZSgpOw0KKwkJUGFja2FnZUJpbmRpbmcgY3VycmVudFBhY2thZ2UgPSBnZXRDdXJyZW50UGFja2FnZSgpOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGVuY2xvc2luZ1R5cGUpOw0KKwkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZW5jbG9zaW5nVHlwZS5nZXRNZW1iZXJUeXBlKHR5cGVOYW1lKTsNCisJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7DQorCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbA0KKwkJCQk/IG1lbWJlclR5cGUuY2FuQmVTZWVuQnkoY3VycmVudFBhY2thZ2UpDQorCQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdTb3VyY2VUeXBlKSkNCisJCQkJcmV0dXJuIG1lbWJlclR5cGU7DQorCQkJZWxzZQ0KKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBOb3RWaXNpYmxlKTsNCisJCX0NCisJCS8vIGNvbGxlY3QgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiByZWNlaXZlclR5cGUgdW50aWwgdGhlIG1lbWJlclR5cGUgaXMgZm91bmQgaW4gYSBzdXBlcnR5cGUNCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBlbmNsb3NpbmdUeXBlOw0KKwkJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOw0KKwkJaW50IGxhc3RQb3NpdGlvbiA9IC0xOw0KKwkJUmVmZXJlbmNlQmluZGluZyB2aXNpYmxlTWVtYmVyVHlwZSA9IG51bGw7DQorCQlib29sZWFuIGtlZXBMb29raW5nID0gdHJ1ZTsNCisJCWJvb2xlYW4gbm90VmlzaWJsZSA9IGZhbHNlOw0KKwkJLy8gd2UgY291bGQgaG9sZCBvbnRvIHRoZSBub3QgdmlzaWJsZSBmaWVsZCBmb3IgZXh0cmEgZXJyb3IgcmVwb3J0aW5nDQorCQl3aGlsZSAoa2VlcExvb2tpbmcpIHsNCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7DQorCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQ0KKwkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOw0KKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQ0KKwkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwNCisJCQkJCQkwLA0KKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkwLA0KKwkJCQkJCWxhc3RQb3NpdGlvbik7DQorCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KIAkJCX0NCi0JCQlmb3IgKGludCBmID0gMDsgZiA8IGN1cnJlbnRMZW5ndGg7IGYrKykNCi0JCQkJZm91bmQuYWRkKGN1cnJlbnRNZXRob2RzW2ZdKTsNCi0JCX0NCi0JCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOw0KLQl9DQotDQotCWlmIChmb3VuZCA9PSBudWxsKQ0KLQkJcmV0dXJuIG1hdGNoaW5nTWV0aG9kOyAvLyBtYXkgYmUgbnVsbCAtIGhhdmUgbm90IGNoZWNrZWQgYXJnIHR5cGVzIG9yIHZpc2liaWxpdHkNCi0NCi0JaW50IGZvdW5kU2l6ZSA9IGZvdW5kLnNpemU7DQotCU1ldGhvZEJpbmRpbmdbXSBjb21wYXRpYmxlID0gbmV3IE1ldGhvZEJpbmRpbmdbZm91bmRTaXplXTsNCi0JaW50IGNvbXBhdGlibGVJbmRleCA9IDA7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsNCi0JCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChNZXRob2RCaW5kaW5nKSBmb3VuZC5lbGVtZW50QXQoaSk7DQotCQlpZiAoYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBhcmd1bWVudFR5cGVzKSkNCi0JCQljb21wYXRpYmxlW2NvbXBhdGlibGVJbmRleCsrXSA9IG1ldGhvZEJpbmRpbmc7DQotCX0NCi0JaWYgKGNvbXBhdGlibGVJbmRleCA9PSAxKQ0KLQkJcmV0dXJuIGNvbXBhdGlibGVbMF07IC8vIGhhdmUgbm90IGNoZWNrZWQgdmlzaWJpbGl0eQ0KLQlpZiAoY29tcGF0aWJsZUluZGV4ID09IDApDQotCQlyZXR1cm4gKE1ldGhvZEJpbmRpbmcpIGZvdW5kLmVsZW1lbnRBdCgwKTsgLy8gbm8gZ29vZCBtYXRjaCBzbyBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kDQotDQotCU1ldGhvZEJpbmRpbmdbXSB2aXNpYmxlID0gbmV3IE1ldGhvZEJpbmRpbmdbY29tcGF0aWJsZUluZGV4XTsNCi0JaW50IHZpc2libGVJbmRleCA9IDA7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUluZGV4OyBpKyspIHsNCi0JCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGNvbXBhdGlibGVbaV07DQotCQlpZiAobWV0aG9kQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkNCi0JCQl2aXNpYmxlW3Zpc2libGVJbmRleCsrXSA9IG1ldGhvZEJpbmRpbmc7DQotCX0NCi0JaWYgKHZpc2libGVJbmRleCA9PSAxKXsNCi0JCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZXModmlzaWJsZVswXS50aHJvd25FeGNlcHRpb25zKTsNCi0JCXJldHVybiB2aXNpYmxlWzBdOw0KLQl9DQotCWlmICh2aXNpYmxlSW5kZXggPT0gMCkNCi0JCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoY29tcGF0aWJsZVswXS5zZWxlY3RvciwgYXJndW1lbnRUeXBlcywgY29tcGF0aWJsZVswXS5kZWNsYXJpbmdDbGFzcywgTm90VmlzaWJsZSk7DQotCWlmICh2aXNpYmxlWzBdLmRlY2xhcmluZ0NsYXNzLmlzQ2xhc3MoKSkNCi0JCXJldHVybiBtb3N0U3BlY2lmaWNDbGFzc01ldGhvZEJpbmRpbmcodmlzaWJsZSwgdmlzaWJsZUluZGV4KTsNCi0JZWxzZQ0KLQkJcmV0dXJuIG1vc3RTcGVjaWZpY0ludGVyZmFjZU1ldGhvZEJpbmRpbmcodmlzaWJsZSwgdmlzaWJsZUluZGV4KTsNCi19DQotLy8gSW50ZXJuYWwgdXNlIG9ubHkNCi0NCi1wdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kTWV0aG9kRm9yQXJyYXkoQXJyYXlCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7DQotCVJlZmVyZW5jZUJpbmRpbmcgb2JqZWN0ID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsNCi0JTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gb2JqZWN0LmdldEV4YWN0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzKTsNCi0JaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgew0KLQkJLy8gaGFuZGxlIHRoZSBtZXRob2QgY2xvbmUoKSBzcGVjaWFsbHkuLi4gY2Fubm90IGJlIHByb3RlY3RlZCBvciB0aHJvdyBleGNlcHRpb25zDQotCQlpZiAoYXJndW1lbnRUeXBlcyA9PSBOb1BhcmFtZXRlcnMgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIENMT05FKSkNCi0JCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmcoKG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzIF4gQWNjUHJvdGVjdGVkKSB8IEFjY1B1YmxpYywgQ0xPTkUsIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwgYXJndW1lbnRUeXBlcywgbnVsbCwgb2JqZWN0KTsNCi0JCWlmIChtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQ0KLQkJCXJldHVybiBtZXRob2RCaW5kaW5nOw0KLQl9DQotDQotCS8vIGFuc3dlcnMgY2xvc2VzdCBhcHByb3hpbWF0aW9uLCBtYXkgbm90IGNoZWNrIGFyZ3VtZW50VHlwZXMgb3IgdmlzaWJpbGl0eQ0KLQltZXRob2RCaW5kaW5nID0gZmluZE1ldGhvZChvYmplY3QsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7DQotCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpDQotCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBOb3RGb3VuZCk7DQotCWlmIChtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBhcmd1bWVudFR5cGVzKSkNCi0JCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKG1ldGhvZEJpbmRpbmcsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBOb3RGb3VuZCk7DQotCQlpZiAoIW1ldGhvZEJpbmRpbmcuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywgTm90VmlzaWJsZSk7DQotCX0NCi0JcmV0dXJuIG1ldGhvZEJpbmRpbmc7DQotfQ0KLS8vIEludGVybmFsIHVzZSBvbmx5DQotDQotcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZmluZFR5cGUoY2hhcltdIHR5cGVOYW1lLCBQYWNrYWdlQmluZGluZyBkZWNsYXJhdGlvblBhY2thZ2UsIFBhY2thZ2VCaW5kaW5nIGludm9jYXRpb25QYWNrYWdlKSB7DQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKGRlY2xhcmF0aW9uUGFja2FnZSk7DQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBkZWNsYXJhdGlvblBhY2thZ2UuZ2V0VHlwZSh0eXBlTmFtZSk7DQotCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsNCi0NCi0JaWYgKHR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZSh0eXBlQmluZGluZyk7DQotCQlpZiAoZGVjbGFyYXRpb25QYWNrYWdlICE9IGludm9jYXRpb25QYWNrYWdlICYmICF0eXBlQmluZGluZy5jYW5CZVNlZW5CeShpbnZvY2F0aW9uUGFja2FnZSkpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgTm90VmlzaWJsZSk7DQotCX0NCi0JcmV0dXJuIHR5cGVCaW5kaW5nOw0KLX0NCi1wdWJsaWMgVHlwZUJpbmRpbmcgZ2V0QmFzZVR5cGUoY2hhcltdIG5hbWUpIHsNCi0JLy8gbGlzdCBzaG91bGQgYmUgb3B0aW1pemVkICh3aXRoIG1vc3Qgb2Z0ZW4gdXNlZCBmaXJzdCkNCi0JaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOw0KLQlpZiAobGVuZ3RoID4gMiAmJiBsZW5ndGggPCA4KSB7DQotCQlzd2l0Y2ggKG5hbWVbMF0pIHsNCi0JCQljYXNlIAkJCSAgICdpJzoNCi0JCQkJaWYgKGxlbmd0aCA9PSAzICYmIA0KLQkJCQkJbmFtZVsxXSA9PSAnbicgJiYgDQotCQkJCQluYW1lWzJdID09ICd0JykNCi0JCQkJCXJldHVybiBJbnRCaW5kaW5nOw0KKwkJCWlmICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpID09IG51bGwpDQogCQkJCWJyZWFrOw0KLQkJCWNhc2UgCQkJICAgJ3YnOg0KLQkJCQlpZiAobGVuZ3RoID09IDQgJiYNCi0JCQkJCW5hbWVbMV0gPT0gJ28nICYmDQotCQkJCQluYW1lWzJdID09ICdpJyAmJg0KLQkJCQkJbmFtZVszXSA9PSAnZCcpDQotCQkJCQlyZXR1cm4gVm9pZEJpbmRpbmc7DQotCQkJCWJyZWFrOw0KLQkJCQ0KLQkJCWNhc2UgCQkJICAgJ2InOg0KLQkJCQlpZiAobGVuZ3RoID09IDcgJiYgDQotCQkJCQluYW1lWzFdID09ICdvJyAmJiANCi0JCQkJCW5hbWVbMl0gPT0gJ28nICYmIA0KLQkJCQkJbmFtZVszXSA9PSAnbCcgJiYNCi0JCQkJCW5hbWVbNF0gPT0gJ2UnICYmDQotCQkJCQluYW1lWzVdID09ICdhJyAmJg0KLQkJCQkJbmFtZVs2XSA9PSAnbicpDQotCQkJCQlyZXR1cm4gQm9vbGVhbkJpbmRpbmc7DQotCQkJCWlmIChsZW5ndGggPT0gNCAmJg0KLQkJCQkJbmFtZVsxXSA9PSAneScgJiYNCi0JCQkJCW5hbWVbMl0gPT0gJ3QnICYmDQotCQkJCQluYW1lWzNdID09ICdlJykNCi0JCQkJCXJldHVybiBCeXRlQmluZGluZzsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSAJCQkgICAnYyc6DQotCQkJCWlmIChsZW5ndGggPT0gNCAmJg0KLQkJCQkJbmFtZVsxXSA9PSAnaCcgJiYNCi0JCQkJCW5hbWVbMl0gPT0gJ2EnICYmDQotCQkJCQluYW1lWzNdID09ICdyJykNCi0JCQkJCXJldHVybiBDaGFyQmluZGluZzsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSAJCQkgICAnZCc6DQotCQkJCWlmIChsZW5ndGggPT0gNiAmJiANCi0JCQkJCW5hbWVbMV0gPT0gJ28nICYmDQotCQkJCQluYW1lWzJdID09ICd1JyAmJg0KLQkJCQkJbmFtZVszXSA9PSAnYicgJiYNCi0JCQkJCW5hbWVbNF0gPT0gJ2wnICYmDQotCQkJCQluYW1lWzVdID09ICdlJykNCi0JCQkJCXJldHVybiBEb3VibGVCaW5kaW5nOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIAkJCSAgICdmJzoNCi0JCQkJaWYgKGxlbmd0aCA9PSA1ICYmIA0KLQkJCQkJbmFtZVsxXSA9PSAnbCcgJiYNCi0JCQkJCW5hbWVbMl0gPT0gJ28nICYmDQotCQkJCQluYW1lWzNdID09ICdhJyAmJg0KLQkJCQkJbmFtZVs0XSA9PSAndCcpDQotCQkJCQlyZXR1cm4gRmxvYXRCaW5kaW5nOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIAkJCSAgICdsJzoNCi0JCQkJaWYgKGxlbmd0aCA9PSA0ICYmDQotCQkJCQluYW1lWzFdID09ICdvJyAmJg0KLQkJCQkJbmFtZVsyXSA9PSAnbicgJiYNCi0JCQkJCW5hbWVbM10gPT0gJ2cnKQ0KLQkJCQkJcmV0dXJuIExvbmdCaW5kaW5nOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIAkJCSAgICdzJzoNCi0JCQkJaWYgKGxlbmd0aCA9PSA1ICYmIA0KLQkJCQkJbmFtZVsxXSA9PSAnaCcgJiYNCi0JCQkJCW5hbWVbMl0gPT0gJ28nICYmDQotCQkJCQluYW1lWzNdID09ICdyJyAmJg0KLQkJCQkJbmFtZVs0XSA9PSAndCcpDQotCQkJCXJldHVybiBTaG9ydEJpbmRpbmc7DQotCQl9DQotCX0NCi0JcmV0dXJuIG51bGw7CQ0KLX0NCi1wdWJsaWMgZmluYWwgUGFja2FnZUJpbmRpbmcgZ2V0Q3VycmVudFBhY2thZ2UoKSB7DQotCVNjb3BlIHNjb3BlLCB1bml0U2NvcGUgPSB0aGlzOw0KLQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkNCi0JCXVuaXRTY29wZSA9IHNjb3BlOw0KLQlyZXR1cm4gKChDb21waWxhdGlvblVuaXRTY29wZSkgdW5pdFNjb3BlKS5mUGFja2FnZTsNCi19DQotcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUlvU2VyaWFsaXphYmxlKCkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9JT19TRVJJQUxJWkFCTEUpOw0KLQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJcmV0dXJuIHR5cGU7DQogDQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9JTywgTm90Rm91bmQpKTsgLy8gcmVjb3JkIGV4dHJhIHJlZmVyZW5jZSB0byBwa2cNCi0JcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfSU9fU0VSSUFMSVpBQkxFLCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQotCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbg0KLX0NCi1wdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0NsYXNzKCkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX0NMQVNTKTsNCi0JaWYgKHR5cGUgIT0gbnVsbCkNCi0JCXJldHVybiB0eXBlOw0KLQ0KLQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShuZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKEpBVkFfTEFORywgTm90Rm91bmQpKTsgLy8gcmVjb3JkIGV4dHJhIHJlZmVyZW5jZSB0byBwa2cNCi0JcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19DTEFTUywgcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOw0KLQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCi19DQotcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdDbG9uZWFibGUoKSB7DQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfQ0xPTkVBQkxFKTsNCi0JaWYgKHR5cGUgIT0gbnVsbCkNCi0JCXJldHVybiB0eXBlOw0KLQ0KLQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShuZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKEpBVkFfTEFORywgTm90Rm91bmQpKTsgLy8gcmVjb3JkIGV4dHJhIHJlZmVyZW5jZSB0byBwa2cNCi0JcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19DTE9ORUFCTEUsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCi0JcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQotfQ0KLXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nRXJyb3IoKSB7DQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfRVJST1IpOw0KLQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJcmV0dXJuIHR5cGU7DQotDQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9MQU5HLCBOb3RGb3VuZCkpOyAvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KLQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX0VSUk9SLCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQotCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbg0KLX0NCi1wdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ09iamVjdCgpIHsNCi0JUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfTEFOR19PQkpFQ1QpOw0KLQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJcmV0dXJuIHR5cGU7DQotDQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9MQU5HLCBOb3RGb3VuZCkpOyAvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KLQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX09CSkVDVCwgcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOw0KLQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCi19DQotcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04pOw0KLQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJcmV0dXJuIHR5cGU7DQotDQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9MQU5HLCBOb3RGb3VuZCkpOyAvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KLQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCi0JcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQotfQ0KLXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nU3RyaW5nKCkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1NUUklORyk7DQotCWlmICh0eXBlICE9IG51bGwpDQotCQlyZXR1cm4gdHlwZTsNCi0NCi0JcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19TVFJJTkcsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCi0JcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQotfQ0KLXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nVGhyb3dhYmxlKCkgew0KLQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1RIUk9XQUJMRSk7DQotCWlmICh0eXBlICE9IG51bGwpDQotCQlyZXR1cm4gdHlwZTsNCi0NCi0JcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19USFJPV0FCTEUsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCi0JcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQotfQ0KLS8qIEFuc3dlciB0aGUgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGVOYW1lIGFyZ3VtZW50LCByZWxhdGl2ZSB0byB0aGUgZW5jbG9zaW5nVHlwZS4NCi0qLw0KLQ0KLXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsNCi0JUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZmluZE1lbWJlclR5cGUodHlwZU5hbWUsIGVuY2xvc2luZ1R5cGUpOw0KLQlpZiAobWVtYmVyVHlwZSA9PSBudWxsKQ0KLQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgTm90Rm91bmQpOw0KLQllbHNlDQotCQlyZXR1cm4gbWVtYmVyVHlwZTsNCi19DQotLyogQW5zd2VyIHRoZSB0eXBlIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmROYW1lLg0KLSoNCi0qIE5PVEU6IElmIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLCBzZW5kZXJzIHNob3VsZCBleHRyYWN0IHRoZSBjb21wb3VuZCBuYW1lDQotKiBmcm9tIHRoZSBiaW5kaW5nICYgbm90IGFzc3VtZSB0aGUgcHJvYmxlbSBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY29tcG91bmROYW1lLg0KLSovDQotDQotcHVibGljIGZpbmFsIFR5cGVCaW5kaW5nIGdldFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7DQotCWludCB0eXBlTmFtZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGg7CQ0KLQlpZiAodHlwZU5hbWVMZW5ndGggPT0gMSkgew0KLQkJLy8gV291bGQgbGlrZSB0byByZW1vdmUgdGhpcyB0ZXN0IGFuZCByZXF1aXJlIHNlbmRlcnMgdG8gc3BlY2lhbGx5IGhhbmRsZSBiYXNlIHR5cGVzDQotCQlUeXBlQmluZGluZyBiaW5kaW5nID0gZ2V0QmFzZVR5cGUoY29tcG91bmROYW1lWzBdKTsNCi0JCWlmIChiaW5kaW5nICE9IG51bGwpDQotCQkJcmV0dXJuIGJpbmRpbmc7DQotCX0NCi0NCi0JQmluZGluZyBiaW5kaW5nID0gZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIHR5cGVOYW1lTGVuZ3RoID09IDEgPyBUWVBFIDogVFlQRSB8IFBBQ0tBR0UpOw0KLQlpZiAoYmluZGluZyA9PSBudWxsKQ0KLQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIE5vdEZvdW5kKTsNCi0JaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpew0KLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UobmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIE5vdEZvdW5kKSk7IC8vIHJlY29yZCBleHRyYSByZWZlcmVuY2UgdG8gcGtnDQotCQlyZXR1cm4gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7DQotCX0NCi0JaW50IGN1cnJlbnRJbmRleCA9IDE7DQotCWJvb2xlYW4gY2hlY2tWaXNpYmlsaXR5ID0gZmFsc2U7DQotCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsNCi0JCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOw0KLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UocGFja2FnZUJpbmRpbmcpOw0KLQ0KLQkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IHR5cGVOYW1lTGVuZ3RoKSB7DQotCQkJYmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSk7IC8vIGRvZXMgbm90IGNoZWNrIHZpc2liaWxpdHkNCi0JCQlpZiAoYmluZGluZyA9PSBudWxsKQ0KLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCBOb3RGb3VuZCk7DQotIAkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQ0KLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCBiaW5kaW5nLnByb2JsZW1JZCgpKTsNCi0gCQkJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSkNCi0gCQkJCWJyZWFrOw0KLSAJCQlwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsNCi0JCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShwYWNrYWdlQmluZGluZyk7DQotCQl9DQotDQotCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKQ0KLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIE5vdEZvdW5kKTsNCi0JCWNoZWNrVmlzaWJpbGl0eSA9IHRydWU7DQotCX0NCi0NCi0JLy8gYmluZGluZyBpcyBub3cgYSBSZWZlcmVuY2VCaW5kaW5nDQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCi0JY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKHR5cGVCaW5kaW5nKTsNCi0JaWYgKGNoZWNrVmlzaWJpbGl0eSkgLy8gaGFuZGxlcyB0aGUgZmFsbCB0aHJvdWdoIGNhc2UNCi0JCWlmICghdHlwZUJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcykpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgTm90VmlzaWJsZSk7IA0KLQ0KLQl3aGlsZSAoY3VycmVudEluZGV4IDwgdHlwZU5hbWVMZW5ndGgpIHsNCi0JCXR5cGVCaW5kaW5nID0gZ2V0TWVtYmVyVHlwZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCB0eXBlQmluZGluZyk7DQotCQlpZiAoIXR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgdHlwZUJpbmRpbmcucHJvYmxlbUlkKCkpOw0KLQl9DQotCXJldHVybiB0eXBlQmluZGluZzsNCi19DQotLyogQW5zd2VyIHRoZSB0eXBlIGJpbmRpbmcgdGhhdCBjb3JyZXNwb25kcyB0aGUgZ2l2ZW4gbmFtZSwgc3RhcnRpbmcgdGhlIGxvb2t1cCBpbiB0aGUgcmVjZWl2ZXIuDQotKiBUaGUgbmFtZSBwcm92aWRlZCBpcyBhIHNpbXBsZSBzb3VyY2UgbmFtZSAoZS5nLiwgIk9iamVjdCIgLCAiUG9pbnQiLCAuLi4pDQotKi8NCi0NCi0vLyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2QgY291bGQgYmUgUmVmZXJlbmNlQmluZGluZyBpZiB3ZSBkaWQgbm90IGFuc3dlciBiYXNlIHR5cGVzLg0KLQ0KLS8vIE5PVEU6IFdlIGNvdWxkIHN1cHBvcnQgbG9va2luZyBmb3IgQmFzZSBUeXBlcyBsYXN0IGluIHRoZSBzZWFyY2gsIGhvd2V2ZXIgYW55IGNvZGUgdXNpbmcNCi0vLyB0aGlzIGZlYXR1cmUgd291bGQgYmUgZXh0cmFvcmRpbmFyaWx5IHNsb3cuICBUaGVyZWZvcmUgd2UgZG9uJ3QgZG8gdGhpcw0KLQ0KLXB1YmxpYyBmaW5hbCBUeXBlQmluZGluZyBnZXRUeXBlKGNoYXJbXSBuYW1lKSB7DQotCS8vIFdvdWxkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgdGVzdCBhbmQgcmVxdWlyZSBzZW5kZXJzIHRvIHNwZWNpYWxseSBoYW5kbGUgYmFzZSB0eXBlcw0KLQlUeXBlQmluZGluZyBiaW5kaW5nID0gZ2V0QmFzZVR5cGUobmFtZSk7DQotCWlmIChiaW5kaW5nICE9IG51bGwpDQotCQlyZXR1cm4gYmluZGluZzsNCi0NCi0JcmV0dXJuIChSZWZlcmVuY2VCaW5kaW5nKSBnZXRUeXBlT3JQYWNrYWdlKG5hbWUsIFRZUEUpOw0KLX0NCi0vLyBBZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gTk9UIFB1YmxpYyBBUEkNCi0NCi1wdWJsaWMgZmluYWwgQmluZGluZyBnZXRUeXBlT3JQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgew0KLQlpbnQgbmFtZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGg7DQotCWlmIChuYW1lTGVuZ3RoID09IDEpIHsNCi0JCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBnZXRCYXNlVHlwZShjb21wb3VuZE5hbWVbMF0pOw0KLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkNCi0JCQlyZXR1cm4gYmluZGluZzsNCi0JfQ0KLQ0KLQlCaW5kaW5nIGJpbmRpbmcgPSBnZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSwgVFlQRSB8IFBBQ0tBR0UpOw0KLQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkNCi0JCXJldHVybiBiaW5kaW5nOw0KLQ0KLQlpbnQgY3VycmVudEluZGV4ID0gMTsNCi0JYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsNCi0JaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgew0KLQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7DQotDQotCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbmFtZUxlbmd0aCkgew0KLQkJCWJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK10pOw0KLQkJCWlmIChiaW5kaW5nID09IG51bGwpDQotCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIE5vdEZvdW5kKTsNCi0gCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpDQotCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIGJpbmRpbmcucHJvYmxlbUlkKCkpOw0KLSAJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQ0KLSAJCQkJYnJlYWs7DQotIAkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOw0KLQkJfQ0KLQ0KLQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykNCi0JCQlyZXR1cm4gYmluZGluZzsNCi0JCWNoZWNrVmlzaWJpbGl0eSA9IHRydWU7DQotCX0NCi0NCi0JLy8gYmluZGluZyBpcyBub3cgYSBSZWZlcmVuY2VCaW5kaW5nDQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCi0JaWYgKGNoZWNrVmlzaWJpbGl0eSkgLy8gaGFuZGxlcyB0aGUgZmFsbCB0aHJvdWdoIGNhc2UNCi0JCWlmICghdHlwZUJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcykpDQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgTm90VmlzaWJsZSk7IA0KLQ0KLQl3aGlsZSAoY3VycmVudEluZGV4IDwgbmFtZUxlbmd0aCkgew0KLQkJdHlwZUJpbmRpbmcgPSBnZXRNZW1iZXJUeXBlKGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK10sIHR5cGVCaW5kaW5nKTsgLy8gY2hlY2tzIHZpc2liaWxpdHkNCi0JCWlmICghdHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkNCi0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCB0eXBlQmluZGluZy5wcm9ibGVtSWQoKSk7DQotCX0NCi0JcmV0dXJuIHR5cGVCaW5kaW5nOw0KLX0NCi0vKiBJbnRlcm5hbCB1c2Ugb25seSANCi0qLw0KLQ0KLWZpbmFsIEJpbmRpbmcgZ2V0VHlwZU9yUGFja2FnZShjaGFyW10gbmFtZSwgaW50IG1hc2spIHsNCi0JU2NvcGUgc2NvcGUgPSB0aGlzOw0KLQlpZiAoKG1hc2sgJiBUWVBFKSA9PSAwKSB7DQotCQlTY29wZSBuZXh0ID0gc2NvcGU7DQotCQl3aGlsZSAoKG5leHQgPSBzY29wZS5wYXJlbnQpICE9IG51bGwpDQotCQkJc2NvcGUgPSBuZXh0Ow0KLQl9IGVsc2Ugew0KLQkJUmVmZXJlbmNlQmluZGluZyBmb3VuZFR5cGUgPSBudWxsOw0KLQkJZG9uZSA6IHdoaWxlICh0cnVlKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQNCi0JCQlzd2l0Y2goc2NvcGUua2luZCkgew0KLQkJCQljYXNlIE1FVEhPRF9TQ09QRSA6DQotCQkJCWNhc2UgQkxPQ0tfU0NPUEUgOg0KLQkJCQkJUmVmZXJlbmNlQmluZGluZyBsb2NhbFR5cGUgPSAoKEJsb2NrU2NvcGUpIHNjb3BlKS5maW5kTG9jYWxUeXBlKG5hbWUpOyAvLyBsb29rcyBpbiB0aGlzIHNjb3BlIG9ubHkNCi0JCQkJCWlmIChsb2NhbFR5cGUgIT0gbnVsbCkgew0KLQkJCQkJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCAmJiBmb3VuZFR5cGUgIT0gbG9jYWxUeXBlKQ0KLQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOw0KLQkJCQkJCXJldHVybiBsb2NhbFR5cGU7DQotCQkJCQl9DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBDTEFTU19TQ09QRSA6DQotCQkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOw0KLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNvdXJjZVR5cGUuc291cmNlTmFtZSwgbmFtZSkpIHsNCi0JCQkJCQlpZiAoZm91bmRUeXBlICE9IG51bGwgJiYgZm91bmRUeXBlICE9IHNvdXJjZVR5cGUpDQotCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7DQotCQkJCQkJcmV0dXJuIHNvdXJjZVR5cGU7DQotCQkJCQl9DQotDQotCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBmaW5kTWVtYmVyVHlwZShuYW1lLCBzb3VyY2VUeXBlKTsNCi0JCQkJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsgLy8gc2tpcCBpdCBpZiB3ZSBkaWQgbm90IGZpbmQgYW55dGhpbmcNCi0JCQkJCQlpZiAobWVtYmVyVHlwZS5wcm9ibGVtSWQoKSA9PSBBbWJpZ3VvdXMpIHsNCi0JCQkJCQkJaWYgKGZvdW5kVHlwZSA9PSBudWxsIHx8IGZvdW5kVHlwZS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKQ0KLQkJCQkJCQkJLy8gc3VwZXJjZWRlcyBhbnkgcG90ZW50aWFsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgcHJvYmxlbQ0KLQkJCQkJCQkJcmV0dXJuIG1lbWJlclR5cGU7DQotCQkJCQkJCWVsc2UNCi0JCQkJCQkJCS8vIG1ha2UgdGhlIHVzZXIgcXVhbGlmeSB0aGUgdHlwZSwgbGlrZWx5IHdhbnRzIHRoZSBmaXJzdCBpbmhlcml0ZWQgdHlwZQ0KLQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsNCi0JCQkJCQl9DQotDQotCQkJCQkJaWYgKG1lbWJlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgew0KLQkJCQkJCQlpZiAoc291cmNlVHlwZSA9PSBtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSkgeyAvLyBmb3VuZCBhIHZhbGlkIHR5cGUgaW4gdGhlICdpbW1lZGlhdGUnIHNjb3BlIChpZS4gbm90IGluaGVyaXRlZCkNCi0JCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbCkNCi0JCQkJCQkJCQlyZXR1cm4gbWVtYmVyVHlwZTsNCi0JCQkJCQkJCWlmIChmb3VuZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgLy8gaWYgYSB2YWxpZCB0eXBlIHdhcyBmb3VuZCwgY29tcGxhaW4gd2hlbiBhbm90aGVyIGlzIGZvdW5kIGluIGFuICdpbW1lZGlhdGUnIGVuY2xvc2luZyB0eXBlIChpZS4gbm90IGluaGVyaXRlZCkNCi0JCQkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG1lbWJlclR5cGUpDQotCQkJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotDQotCQkJCQkJaWYgKGZvdW5kVHlwZSA9PSBudWxsIHx8IChmb3VuZFR5cGUucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSAmJiBtZW1iZXJUeXBlLnByb2JsZW1JZCgpICE9IE5vdFZpc2libGUpKQ0KLQkJCQkJCQkvLyBvbmx5IHJlbWVtYmVyIHRoZSBtZW1iZXJUeXBlIGlmIGl0cyB0aGUgZmlyc3Qgb25lIGZvdW5kIG9yIHRoZSBwcmV2aW91cyBvbmUgd2FzIG5vdCB2aXNpYmxlICYgbWVtYmVyVHlwZSBpcy4uLg0KLQkJCQkJCQlmb3VuZFR5cGUgPSBtZW1iZXJUeXBlOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6DQotCQkJCQlicmVhayBkb25lOw0KLQkJCX0NCi0JCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCi0JCX0NCi0JCWlmIChmb3VuZFR5cGUgIT0gbnVsbCkNCi0JCQlyZXR1cm4gZm91bmRUeXBlOw0KLQl9DQotDQotCS8vIGF0IHRoaXMgcG9pbnQgdGhlIHNjb3BlIGlzIGEgY29tcGlsYXRpb24gdW5pdCBzY29wZQ0KLQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSAoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHNjb3BlOw0KLQkvLyBhc2sgZm9yIHRoZSBpbXBvcnRzICsgbmFtZQ0KLQlpZiAoKG1hc2sgJiBUWVBFKSAhPSAwKSB7DQotCQkvLyBjaGVjayBzaW5nbGUgdHlwZSBpbXBvcnRzLg0KLQkJSW1wb3J0QmluZGluZ1tdIGltcG9ydHMgPSB1bml0U2NvcGUuaW1wb3J0czsgLy8gY29weSB0aGUgbGlzdCwgc2luY2Ugc2luZ2xlIHR5cGUgaW1wb3J0cyBhcmUgcmVtb3ZlZCBpZiB0aGV5IGNhbm5vdCBiZSByZXNvbHZlZA0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGltcG9ydHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCQlJbXBvcnRCaW5kaW5nIHR5cGVJbXBvcnQgPSBpbXBvcnRzW2ldOw0KLQkJCWlmICghdHlwZUltcG9ydC5vbkRlbWFuZCkNCi0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVJbXBvcnQuY29tcG91bmROYW1lW3R5cGVJbXBvcnQuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLCBuYW1lKSkNCi0JCQkJCWlmICh1bml0U2NvcGUucmVzb2x2ZVNpbmdsZVR5cGVJbXBvcnQodHlwZUltcG9ydCkgIT0gbnVsbCkNCi0JCQkJCQlyZXR1cm4gdHlwZUltcG9ydC5yZXNvbHZlZEltcG9ydDsgLy8gYWxyZWFkeSBrbm93IGl0cyB2aXNpYmxlDQotCQl9DQotDQotCQkvLyBjaGVjayBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgY3VycmVudCBwYWNrYWdlIChhbnN3ZXIgdGhlIHByb2JsZW0gYmluZGluZyB1bmxlc3MgaXRzIG5vdCBmb3VuZCBpbiB3aGljaCBjYXNlIGNvbnRpbnVlIHRvIGxvb2spDQotCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBmaW5kVHlwZShuYW1lLCB1bml0U2NvcGUuZlBhY2thZ2UsIHVuaXRTY29wZS5mUGFja2FnZSk7IC8vIGlzIGFsd2F5cyB2aXNpYmxlDQotCQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJCXJldHVybiB0eXBlOw0KLQ0KLQkJLy8gY2hlY2sgb24gZGVtYW5kIGltcG9ydHMNCi0JCWJvb2xlYW4gZm91bmRJbkltcG9ydCA9IGZhbHNlOw0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHVuaXRTY29wZS5pbXBvcnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKHVuaXRTY29wZS5pbXBvcnRzW2ldLm9uRGVtYW5kKSB7DQotCQkJCUJpbmRpbmcgcmVzb2x2ZWRJbXBvcnQgPSB1bml0U2NvcGUuaW1wb3J0c1tpXS5yZXNvbHZlZEltcG9ydDsNCi0JCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0NCi0JCQkJCShyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKQ0KLQkJCQkJCT8gZmluZFR5cGUobmFtZSwgKFBhY2thZ2VCaW5kaW5nKSByZXNvbHZlZEltcG9ydCwgdW5pdFNjb3BlLmZQYWNrYWdlKQ0KLQkJCQkJCTogZmluZERpcmVjdE1lbWJlclR5cGUobmFtZSwgKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVkSW1wb3J0KTsNCi0JCQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCQkJCWlmIChmb3VuZEluSW1wb3J0KQ0KLQkJCQkJCS8vIEFuc3dlciBlcnJvciBiaW5kaW5nIC0tIGltcG9ydCBvbiBkZW1hbmQgY29uZmxpY3Q7IG5hbWUgZm91bmQgaW4gdHdvIGltcG9ydCBvbiBkZW1hbmQgcGFja2FnZXMuDQotCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBBbWJpZ3VvdXMpOw0KLQkJCQkJdHlwZSA9IHRlbXA7DQotCQkJCQlmb3VuZEluSW1wb3J0ID0gdHJ1ZTsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOw0KKwkJCWlmICgobWVtYmVyVHlwZSA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpKSAhPSBudWxsKSB7DQorCQkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZShtZW1iZXJUeXBlKTsNCisJCQkJa2VlcExvb2tpbmcgPSBmYWxzZTsNCisJCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbA0KKwkJCQkJPyBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGN1cnJlbnRQYWNrYWdlKQ0KKwkJCQkJOiBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1NvdXJjZVR5cGUpKSB7DQorCQkJCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgPT0gbnVsbCkNCisJCQkJCQl2aXNpYmxlTWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7DQorCQkJCQllbHNlDQorCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgQW1iaWd1b3VzKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCW5vdFZpc2libGUgPSB0cnVlOw0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KKwkJLy8gd2FsayBhbGwgdmlzaWJsZSBpbnRlcmZhY2VzIHRvIGZpbmQgYW1iaWd1b3VzIHJlZmVyZW5jZXMNCisJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCAhPSBudWxsKSB7DQorCQkJUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgYW1iaWd1b3VzID0gbnVsbDsNCisJCQlkb25lIDogZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsNCisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsNCisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzW2pdOw0KKwkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgew0KKwkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQNCisJCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7DQorCQkJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlKGFuSW50ZXJmYWNlKTsNCisJCQkJCQlpZiAoKG1lbWJlclR5cGUgPSBhbkludGVyZmFjZS5nZXRNZW1iZXJUeXBlKHR5cGVOYW1lKSkgIT0gbnVsbCkgew0KKwkJCQkJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7DQorCQkJCQkJCWlmICh2aXNpYmxlTWVtYmVyVHlwZSA9PSBudWxsKSB7DQorCQkJCQkJCQl2aXNpYmxlTWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7DQorCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQlhbWJpZ3VvdXMgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIEFtYmlndW91cyk7DQorCQkJCQkJCQlicmVhayBkb25lOw0KKwkJCQkJCQl9DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCisJCQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQorCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsDQorCQkJCQkJCQkJCTAsDQorCQkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkJCQkJMCwNCisJCQkJCQkJCQkJbGFzdFBvc2l0aW9uKTsNCisJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCS8vIGJpdCByZWluaXRpYWxpemF0aW9uDQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsNCisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsNCisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspDQorCQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7DQorCQkJfQ0KKwkJCWlmIChhbWJpZ3VvdXMgIT0gbnVsbCkNCisJCQkJcmV0dXJuIGFtYmlndW91czsNCisJCX0NCisJCWlmICh2aXNpYmxlTWVtYmVyVHlwZSAhPSBudWxsKQ0KKwkJCXJldHVybiB2aXNpYmxlTWVtYmVyVHlwZTsNCisJCWlmIChub3RWaXNpYmxlKQ0KKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIE5vdFZpc2libGUpOw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCiANCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkNCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZE1ldGhvZCgNCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLA0KKwkJY2hhcltdIHNlbGVjdG9yLA0KKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLA0KKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7DQorCQlNZXRob2RCaW5kaW5nIG1hdGNoaW5nTWV0aG9kID0gbnVsbDsNCisJCU9iamVjdFZlY3RvciBmb3VuZCA9IG51bGw7DQorDQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGRUeXBlUmVmZXJlbmNlcyhhcmd1bWVudFR5cGVzKTsNCisJCWlmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpKSB7DQorCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7DQorCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7DQorCQkJaWYgKGN1cnJlbnRMZW5ndGggPT0gMSkgew0KKwkJCQltYXRjaGluZ01ldGhvZCA9IGN1cnJlbnRNZXRob2RzWzBdOw0KKwkJCX0gZWxzZSBpZiAoY3VycmVudExlbmd0aCA+IDEpIHsNCisJCQkJZm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQorCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgY3VycmVudExlbmd0aDsgZisrKQ0KKwkJCQkJZm91bmQuYWRkKGN1cnJlbnRNZXRob2RzW2ZdKTsNCisJCQl9DQorCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgew0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107DQorCQkJCWludCBsYXN0UG9zaXRpb24gPSAtMTsNCisJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkNCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsDQorCQkJCQkJMCwNCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sDQorCQkJCQkJMCwNCisJCQkJCQlsYXN0UG9zaXRpb24pOw0KKwkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsNCisNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsNCisJCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07DQorCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgew0KKwkJCQkJCWN1cnJlbnRUeXBlID0gaW50ZXJmYWNlc1tqXTsNCisJCQkJCQlpZiAoKGN1cnJlbnRUeXBlLnRhZ0JpdHMgJiBJbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7DQorCQkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQNCisJCQkJCQkJY3VycmVudFR5cGUudGFnQml0cyB8PSBJbnRlcmZhY2VWaXNpdGVkOw0KKw0KKwkJCQkJCQljdXJyZW50TWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpOw0KKwkJCQkJCQlpZiAoKGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGgpID09IDENCisJCQkJCQkJCSYmIG1hdGNoaW5nTWV0aG9kID09IG51bGwNCisJCQkJCQkJCSYmIGZvdW5kID09IG51bGwpIHsNCisJCQkJCQkJCW1hdGNoaW5nTWV0aG9kID0gY3VycmVudE1ldGhvZHNbMF07DQorCQkJCQkJCX0gZWxzZSBpZiAoY3VycmVudExlbmd0aCA+IDApIHsNCisJCQkJCQkJCWlmIChmb3VuZCA9PSBudWxsKSB7DQorCQkJCQkJCQkJZm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7DQorCQkJCQkJCQkJaWYgKG1hdGNoaW5nTWV0aG9kICE9IG51bGwpDQorCQkJCQkJCQkJCWZvdW5kLmFkZChtYXRjaGluZ01ldGhvZCk7DQorCQkJCQkJCQl9DQorCQkJCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGN1cnJlbnRMZW5ndGg7IGYrKykNCisJCQkJCQkJCQlmb3VuZC5hZGQoY3VycmVudE1ldGhvZHNbZl0pOw0KKwkJCQkJCQl9DQorCQkJCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsNCisJCQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCisJCQkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpDQorCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsDQorCQkJCQkJCQkJCTAsDQorCQkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwNCisJCQkJCQkJCQkJMCwNCisJCQkJCQkJCQkJbGFzdFBvc2l0aW9uKTsNCisJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCS8vIGJpdCByZWluaXRpYWxpemF0aW9uDQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7DQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOw0KKwkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspDQorCQkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWN1cnJlbnRUeXBlID0NCisJCQkJKG1hdGNoaW5nTWV0aG9kID09IG51bGwgJiYgZm91bmQgPT0gbnVsbCkgPyBnZXRKYXZhTGFuZ09iamVjdCgpIDogbnVsbDsNCisJCX0NCisJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7DQorCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7DQorCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7DQorCQkJaWYgKGN1cnJlbnRMZW5ndGggPT0gMSAmJiBtYXRjaGluZ01ldGhvZCA9PSBudWxsICYmIGZvdW5kID09IG51bGwpIHsNCisJCQkJbWF0Y2hpbmdNZXRob2QgPSBjdXJyZW50TWV0aG9kc1swXTsNCisJCQl9IGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggPiAwKSB7DQorCQkJCWlmIChmb3VuZCA9PSBudWxsKSB7DQorCQkJCQlmb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsNCisJCQkJCWlmIChtYXRjaGluZ01ldGhvZCAhPSBudWxsKQ0KKwkJCQkJCWZvdW5kLmFkZChtYXRjaGluZ01ldGhvZCk7DQorCQkJCX0NCisJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBjdXJyZW50TGVuZ3RoOyBmKyspDQorCQkJCQlmb3VuZC5hZGQoY3VycmVudE1ldGhvZHNbZl0pOw0KKwkJCX0NCisJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsNCisJCX0NCisNCisJCWlmIChmb3VuZCA9PSBudWxsKQ0KKwkJCXJldHVybiBtYXRjaGluZ01ldGhvZDsNCisJCS8vIG1heSBiZSBudWxsIC0gaGF2ZSBub3QgY2hlY2tlZCBhcmcgdHlwZXMgb3IgdmlzaWJpbGl0eQ0KKw0KKwkJaW50IGZvdW5kU2l6ZSA9IGZvdW5kLnNpemU7DQorCQlNZXRob2RCaW5kaW5nW10gY29tcGF0aWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW2ZvdW5kU2l6ZV07DQorCQlpbnQgY29tcGF0aWJsZUluZGV4ID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsNCisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KGkpOw0KKwkJCWlmIChhcmVQYXJhbWV0ZXJzQXNzaWduYWJsZShtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIGFyZ3VtZW50VHlwZXMpKQ0KKwkJCQljb21wYXRpYmxlW2NvbXBhdGlibGVJbmRleCsrXSA9IG1ldGhvZEJpbmRpbmc7DQorCQl9DQorCQlpZiAoY29tcGF0aWJsZUluZGV4ID09IDEpDQorCQkJcmV0dXJuIGNvbXBhdGlibGVbMF07IC8vIGhhdmUgbm90IGNoZWNrZWQgdmlzaWJpbGl0eQ0KKwkJaWYgKGNvbXBhdGlibGVJbmRleCA9PSAwKQ0KKwkJCXJldHVybiAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KDApOw0KKwkJLy8gbm8gZ29vZCBtYXRjaCBzbyBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kDQorDQorCQlNZXRob2RCaW5kaW5nW10gdmlzaWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW2NvbXBhdGlibGVJbmRleF07DQorCQlpbnQgdmlzaWJsZUluZGV4ID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUluZGV4OyBpKyspIHsNCisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBjb21wYXRpYmxlW2ldOw0KKwkJCWlmIChtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQ0KKwkJCQl2aXNpYmxlW3Zpc2libGVJbmRleCsrXSA9IG1ldGhvZEJpbmRpbmc7DQorCQl9DQorCQlpZiAodmlzaWJsZUluZGV4ID09IDEpIHsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2VzKHZpc2libGVbMF0udGhyb3duRXhjZXB0aW9ucyk7DQorCQkJcmV0dXJuIHZpc2libGVbMF07DQorCQl9DQorCQlpZiAodmlzaWJsZUluZGV4ID09IDApDQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygNCisJCQkJY29tcGF0aWJsZVswXS5zZWxlY3RvciwNCisJCQkJYXJndW1lbnRUeXBlcywNCisJCQkJY29tcGF0aWJsZVswXS5kZWNsYXJpbmdDbGFzcywNCisJCQkJTm90VmlzaWJsZSk7DQorCQlpZiAodmlzaWJsZVswXS5kZWNsYXJpbmdDbGFzcy5pc0NsYXNzKCkpDQorCQkJcmV0dXJuIG1vc3RTcGVjaWZpY0NsYXNzTWV0aG9kQmluZGluZyh2aXNpYmxlLCB2aXNpYmxlSW5kZXgpOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBtb3N0U3BlY2lmaWNJbnRlcmZhY2VNZXRob2RCaW5kaW5nKHZpc2libGUsIHZpc2libGVJbmRleCk7DQorCX0NCisNCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkNCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZE1ldGhvZEZvckFycmF5KA0KKwkJQXJyYXlCaW5kaW5nIHJlY2VpdmVyVHlwZSwNCisJCWNoYXJbXSBzZWxlY3RvciwNCisJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywNCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7DQorCQlSZWZlcmVuY2VCaW5kaW5nIG9iamVjdCA9IGdldEphdmFMYW5nT2JqZWN0KCk7DQorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBvYmplY3QuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMpOw0KKwkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgew0KKwkJCS8vIGhhbmRsZSB0aGUgbWV0aG9kIGNsb25lKCkgc3BlY2lhbGx5Li4uIGNhbm5vdCBiZSBwcm90ZWN0ZWQgb3IgdGhyb3cgZXhjZXB0aW9ucw0KKwkJCWlmIChhcmd1bWVudFR5cGVzID09IE5vUGFyYW1ldGVycyAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgQ0xPTkUpKQ0KKwkJCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmcoDQorCQkJCQkobWV0aG9kQmluZGluZy5tb2RpZmllcnMgXiBBY2NQcm90ZWN0ZWQpIHwgQWNjUHVibGljLA0KKwkJCQkJQ0xPTkUsDQorCQkJCQltZXRob2RCaW5kaW5nLnJldHVyblR5cGUsDQorCQkJCQlhcmd1bWVudFR5cGVzLA0KKwkJCQkJbnVsbCwNCisJCQkJCW9iamVjdCk7DQorCQkJaWYgKG1ldGhvZEJpbmRpbmcuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpDQorCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOw0KKwkJfQ0KKwkJLy8gYW5zd2VycyBjbG9zZXN0IGFwcHJveGltYXRpb24sIG1heSBub3QgY2hlY2sgYXJndW1lbnRUeXBlcyBvciB2aXNpYmlsaXR5DQorCQltZXRob2RCaW5kaW5nID0gZmluZE1ldGhvZChvYmplY3QsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7DQorCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKQ0KKwkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdEZvdW5kKTsNCisJCWlmIChtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsNCisJCQlpZiAoIWFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpDQorCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoDQorCQkJCQltZXRob2RCaW5kaW5nLA0KKwkJCQkJc2VsZWN0b3IsDQorCQkJCQlhcmd1bWVudFR5cGVzLA0KKwkJCQkJTm90Rm91bmQpOw0KKwkJCWlmICghbWV0aG9kQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkNCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygNCisJCQkJCXNlbGVjdG9yLA0KKwkJCQkJYXJndW1lbnRUeXBlcywNCisJCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsDQorCQkJCQlOb3RWaXNpYmxlKTsNCisJCX0NCisJCXJldHVybiBtZXRob2RCaW5kaW5nOw0KKwl9DQorDQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGZpbmRUeXBlKA0KKwkJY2hhcltdIHR5cGVOYW1lLA0KKwkJUGFja2FnZUJpbmRpbmcgZGVjbGFyYXRpb25QYWNrYWdlLA0KKwkJUGFja2FnZUJpbmRpbmcgaW52b2NhdGlvblBhY2thZ2UpIHsNCisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKGRlY2xhcmF0aW9uUGFja2FnZSk7DQorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gZGVjbGFyYXRpb25QYWNrYWdlLmdldFR5cGUodHlwZU5hbWUpOw0KKwkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpDQorCQkJcmV0dXJuIG51bGw7DQorDQorCQlpZiAodHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgew0KKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZSh0eXBlQmluZGluZyk7DQorCQkJaWYgKGRlY2xhcmF0aW9uUGFja2FnZSAhPSBpbnZvY2F0aW9uUGFja2FnZQ0KKwkJCQkmJiAhdHlwZUJpbmRpbmcuY2FuQmVTZWVuQnkoaW52b2NhdGlvblBhY2thZ2UpKQ0KKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBOb3RWaXNpYmxlKTsNCisJCX0NCisJCXJldHVybiB0eXBlQmluZGluZzsNCisJfQ0KKw0KKwlwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0QmFzZVR5cGUoY2hhcltdIG5hbWUpIHsNCisJCS8vIGxpc3Qgc2hvdWxkIGJlIG9wdGltaXplZCAod2l0aCBtb3N0IG9mdGVuIHVzZWQgZmlyc3QpDQorCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7DQorCQlpZiAobGVuZ3RoID4gMiAmJiBsZW5ndGggPCA4KSB7DQorCQkJc3dpdGNoIChuYW1lWzBdKSB7DQorCQkJCWNhc2UgJ2knIDoNCisJCQkJCWlmIChsZW5ndGggPT0gMyAmJiBuYW1lWzFdID09ICduJyAmJiBuYW1lWzJdID09ICd0JykNCisJCQkJCQlyZXR1cm4gSW50QmluZGluZzsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlICd2JyA6DQorCQkJCQlpZiAobGVuZ3RoID09IDQgJiYgbmFtZVsxXSA9PSAnbycgJiYgbmFtZVsyXSA9PSAnaScgJiYgbmFtZVszXSA9PSAnZCcpDQorCQkJCQkJcmV0dXJuIFZvaWRCaW5kaW5nOw0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ2InIDoNCisJCQkJCWlmIChsZW5ndGggPT0gNw0KKwkJCQkJCSYmIG5hbWVbMV0gPT0gJ28nDQorCQkJCQkJJiYgbmFtZVsyXSA9PSAnbycNCisJCQkJCQkmJiBuYW1lWzNdID09ICdsJw0KKwkJCQkJCSYmIG5hbWVbNF0gPT0gJ2UnDQorCQkJCQkJJiYgbmFtZVs1XSA9PSAnYScNCisJCQkJCQkmJiBuYW1lWzZdID09ICduJykNCisJCQkJCQlyZXR1cm4gQm9vbGVhbkJpbmRpbmc7DQorCQkJCQlpZiAobGVuZ3RoID09IDQgJiYgbmFtZVsxXSA9PSAneScgJiYgbmFtZVsyXSA9PSAndCcgJiYgbmFtZVszXSA9PSAnZScpDQorCQkJCQkJcmV0dXJuIEJ5dGVCaW5kaW5nOw0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ2MnIDoNCisJCQkJCWlmIChsZW5ndGggPT0gNCAmJiBuYW1lWzFdID09ICdoJyAmJiBuYW1lWzJdID09ICdhJyAmJiBuYW1lWzNdID09ICdyJykNCisJCQkJCQlyZXR1cm4gQ2hhckJpbmRpbmc7DQorCQkJCQlicmVhazsNCisJCQkJY2FzZSAnZCcgOg0KKwkJCQkJaWYgKGxlbmd0aCA9PSA2DQorCQkJCQkJJiYgbmFtZVsxXSA9PSAnbycNCisJCQkJCQkmJiBuYW1lWzJdID09ICd1Jw0KKwkJCQkJCSYmIG5hbWVbM10gPT0gJ2InDQorCQkJCQkJJiYgbmFtZVs0XSA9PSAnbCcNCisJCQkJCQkmJiBuYW1lWzVdID09ICdlJykNCisJCQkJCQlyZXR1cm4gRG91YmxlQmluZGluZzsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlICdmJyA6DQorCQkJCQlpZiAobGVuZ3RoID09IDUNCisJCQkJCQkmJiBuYW1lWzFdID09ICdsJw0KKwkJCQkJCSYmIG5hbWVbMl0gPT0gJ28nDQorCQkJCQkJJiYgbmFtZVszXSA9PSAnYScNCisJCQkJCQkmJiBuYW1lWzRdID09ICd0JykNCisJCQkJCQlyZXR1cm4gRmxvYXRCaW5kaW5nOw0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgJ2wnIDoNCisJCQkJCWlmIChsZW5ndGggPT0gNCAmJiBuYW1lWzFdID09ICdvJyAmJiBuYW1lWzJdID09ICduJyAmJiBuYW1lWzNdID09ICdnJykNCisJCQkJCQlyZXR1cm4gTG9uZ0JpbmRpbmc7DQorCQkJCQlicmVhazsNCisJCQkJY2FzZSAncycgOg0KKwkJCQkJaWYgKGxlbmd0aCA9PSA1DQorCQkJCQkJJiYgbmFtZVsxXSA9PSAnaCcNCisJCQkJCQkmJiBuYW1lWzJdID09ICdvJw0KKwkJCQkJCSYmIG5hbWVbM10gPT0gJ3InDQorCQkJCQkJJiYgbmFtZVs0XSA9PSAndCcpDQorCQkJCQkJcmV0dXJuIFNob3J0QmluZGluZzsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwlwdWJsaWMgZmluYWwgUGFja2FnZUJpbmRpbmcgZ2V0Q3VycmVudFBhY2thZ2UoKSB7DQorCQlTY29wZSBzY29wZSwgdW5pdFNjb3BlID0gdGhpczsNCisJCXdoaWxlICgoc2NvcGUgPSB1bml0U2NvcGUucGFyZW50KSAhPSBudWxsKQ0KKwkJCXVuaXRTY29wZSA9IHNjb3BlOw0KKwkJcmV0dXJuICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHVuaXRTY29wZSkuZlBhY2thZ2U7DQorCX0NCisNCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUlvU2VyaWFsaXphYmxlKCkgew0KKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfSU9fU0VSSUFMSVpBQkxFKTsNCiAJCWlmICh0eXBlICE9IG51bGwpDQogCQkJcmV0dXJuIHR5cGU7DQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZSgNCisJCQluZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKEpBVkFfSU8sIE5vdEZvdW5kKSk7DQorCQkvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KKwkJcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KA0KKwkJCUpBVkFfSU9fU0VSSUFMSVpBQkxFLA0KKwkJCXJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCisJCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbg0KIAl9DQogDQotCS8vIHNlZSBpZiB0aGUgbmFtZSBpcyBhIHBhY2thZ2UNCi0JaWYgKChtYXNrICYgUEFDS0FHRSkgIT0gMCkgew0KLQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0VG9wTGV2ZWxQYWNrYWdlKG5hbWUpOw0KLQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpDQotCQkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOw0KKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0NsYXNzKCkgew0KKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfTEFOR19DTEFTUyk7DQorCQlpZiAodHlwZSAhPSBudWxsKQ0KKwkJCXJldHVybiB0eXBlOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UoDQorCQkJbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhKQVZBX0xBTkcsIE5vdEZvdW5kKSk7DQorCQkvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KKwkJcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KA0KKwkJCUpBVkFfTEFOR19DTEFTUywNCisJCQlyZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQorCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCiAJfQ0KIA0KLQkvLyBBbnN3ZXIgZXJyb3IgYmluZGluZyAtLSBjb3VsZCBub3QgZmluZCBuYW1lDQotCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcobmFtZSwgTm90Rm91bmQpKTsNCi0JcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBOb3RGb3VuZCk7DQotfQ0KLS8qIEFuc3dlciB3aGV0aGVyIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdCBhcyB0aGUgcmVjZWl2ZXINCi0qLw0KKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0Nsb25lYWJsZSgpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfQ0xPTkVBQkxFKTsNCisJCWlmICh0eXBlICE9IG51bGwpDQorCQkJcmV0dXJuIHR5cGU7DQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZSgNCisJCQluZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKEpBVkFfTEFORywgTm90Rm91bmQpKTsNCisJCS8vIHJlY29yZCBleHRyYSByZWZlcmVuY2UgdG8gcGtnDQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoDQorCQkJSkFWQV9MQU5HX0NMT05FQUJMRSwNCisJCQlyZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQorCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCisJfQ0KIA0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmaW5lZEluU2FtZVVuaXQoUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7DQotCS8vIGZpbmQgdGhlIG91dGVyIG1vc3QgZW5jbG9zaW5nIHR5cGUNCi0JUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gdHlwZTsNCi0Jd2hpbGUgKCh0eXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpDQotCQllbmNsb3NpbmdUeXBlID0gdHlwZTsNCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdFcnJvcigpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfRVJST1IpOw0KKwkJaWYgKHR5cGUgIT0gbnVsbCkNCisJCQlyZXR1cm4gdHlwZTsNCisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKA0KKwkJCW5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9MQU5HLCBOb3RGb3VuZCkpOw0KKwkJLy8gcmVjb3JkIGV4dHJhIHJlZmVyZW5jZSB0byBwa2cNCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdCgNCisJCQlKQVZBX0xBTkdfRVJST1IsDQorCQkJcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOw0KKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQorCX0NCiANCi0JLy8gZmluZCB0aGUgY29tcGlsYXRpb24gdW5pdCBzY29wZQ0KLQlTY29wZSBzY29wZSwgdW5pdFNjb3BlID0gdGhpczsNCi0Jd2hpbGUgKChzY29wZSA9IHVuaXRTY29wZS5wYXJlbnQpICE9IG51bGwpDQotCQl1bml0U2NvcGUgPSBzY29wZTsNCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IpOw0KKwkJaWYgKHR5cGUgIT0gbnVsbCkNCisJCQlyZXR1cm4gdHlwZTsNCisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKA0KKwkJCW5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoSkFWQV9MQU5HLCBOb3RGb3VuZCkpOw0KKwkJLy8gcmVjb3JkIGV4dHJhIHJlZmVyZW5jZSB0byBwa2cNCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdCgNCisJCQlKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IsDQorCQkJcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOw0KKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uDQorCX0NCiANCi0JLy8gdGVzdCB0aGF0IHRoZSBlbmNsb3NpbmdUeXBlIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0DQotCVNvdXJjZVR5cGVCaW5kaW5nW10gdG9wTGV2ZWxUeXBlcyA9ICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHVuaXRTY29wZSkudG9wTGV2ZWxUeXBlczsNCi0JZm9yIChpbnQgaSA9IHRvcExldmVsVHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspDQotCQlpZiAodG9wTGV2ZWxUeXBlc1tpXSA9PSBlbmNsb3NpbmdUeXBlKQ0KLQkJCXJldHVybiB0cnVlOw0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSmF2YUlvU2VyaWFsaXphYmxlKFR5cGVCaW5kaW5nIHRiKXsNCi0JLy9hIGZpcnN0IC1ub25lIG9wdGltaXplZCB2ZXJzaW9uLS4uLjotKS4uLi4NCi0JLy9wbGVhc2UgbW9kaWZ5IGFzIG5lZWRlZA0KKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ09iamVjdCgpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfT0JKRUNUKTsNCisJCWlmICh0eXBlICE9IG51bGwpDQorCQkJcmV0dXJuIHR5cGU7DQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZSgNCisJCQluZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKEpBVkFfTEFORywgTm90Rm91bmQpKTsNCisJCS8vIHJlY29yZCBleHRyYSByZWZlcmVuY2UgdG8gcGtnDQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoDQorCQkJSkFWQV9MQU5HX09CSkVDVCwNCisJCQlyZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQorCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCisJfQ0KIA0KLQlyZXR1cm4gdGIgPT0gZ2V0SmF2YUlvU2VyaWFsaXphYmxlKCk7DQotfQ0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSmF2YUxhbmdDbG9uZWFibGUoVHlwZUJpbmRpbmcgdGIpew0KLQkvL2EgZmlyc3QgLW5vbmUgb3B0aW1pemVkIHZlcnNpb24tLi4uOi0pLi4uLg0KLQkvL3BsZWFzZSBtb2RpZnkgYXMgbmVlZGVkDQorCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nUnVudGltZUV4Y2VwdGlvbigpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTik7DQorCQlpZiAodHlwZSAhPSBudWxsKQ0KKwkJCXJldHVybiB0eXBlOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UoDQorCQkJbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhKQVZBX0xBTkcsIE5vdEZvdW5kKSk7DQorCQkvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KKwkJcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KA0KKwkJCUpBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OLA0KKwkJCXJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsNCisJCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbg0KKwl9DQogDQotCXJldHVybiB0YiA9PSBnZXRKYXZhTGFuZ0Nsb25lYWJsZSgpOw0KLX0NCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0phdmFMYW5nT2JqZWN0KFR5cGVCaW5kaW5nIHR5cGUpIHsNCi0JcmV0dXJuIHR5cGUuaWQgPT0gVF9KYXZhTGFuZ09iamVjdDsNCi19DQotcHVibGljIGZpbmFsIE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKCkgew0KLQlTY29wZSBzY29wZSA9IHRoaXM7DQotCWRvIHsNCi0JCWlmIChzY29wZSBpbnN0YW5jZW9mIE1ldGhvZFNjb3BlKQ0KLQkJCXJldHVybiAoTWV0aG9kU2NvcGUpIHNjb3BlOw0KLQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQotCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOw0KLQlyZXR1cm4gbnVsbDsNCi19DQotLy8gSW50ZXJuYWwgdXNlIG9ubHkNCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdTdHJpbmcoKSB7DQorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1NUUklORyk7DQorCQlpZiAodHlwZSAhPSBudWxsKQ0KKwkJCXJldHVybiB0eXBlOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UoDQorCQkJbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhKQVZBX0xBTkcsIE5vdEZvdW5kKSk7DQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoDQorCQkJSkFWQV9MQU5HX1NUUklORywNCisJCQlyZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQorCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCisJfQ0KIA0KLS8qIEFsbCBtZXRob2RzIGluIHZpc2libGUgYXJlIGFjY2VwdGFibGUgbWF0Y2hlcyBmb3IgdGhlIG1ldGhvZCBpbiBxdWVzdGlvbi4uLg0KLSogVGhlIG1ldGhvZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXIgdHlwZSBhcHBlYXIgYmVmb3JlIHRob3NlIGRlZmluZWQgYnkgaXRzDQotKiBzdXBlcmNsYXNzIGFuZCBzbyBvbi4gV2Ugd2FudCB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyBiZXN0Lg0KLSoNCi0qIFNpbmNlIHRoZSByZWNlaXZlciB0eXBlIGlzIGEgY2xhc3MsIHdlIGtub3cgZWFjaCBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MgaXMNCi0qIGVpdGhlciB0aGUgcmVjZWl2ZXIgdHlwZSBvciBvbmUgb2YgaXRzIHN1cGVyY2xhc3Nlcy4gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIGJlc3QgbWF0Y2gNCi0qIGlzIGRlZmluZWQgYnkgYSBzdXBlcmNsYXNzLCB3aGVuIGEgbGVzc2VyIG1hdGNoIGlzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyIHR5cGUNCi0qIG9yIGEgY2xvc2VyIHN1cGVyY2xhc3MuDQotKi8NCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSB7DQorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1RIUk9XQUJMRSk7DQorCQlpZiAodHlwZSAhPSBudWxsKQ0KKwkJCXJldHVybiB0eXBlOw0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UoDQorCQkJbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhKQVZBX0xBTkcsIE5vdEZvdW5kKSk7DQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoDQorCQkJSkFWQV9MQU5HX1RIUk9XQUJMRSwNCisJCQlyZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7DQorCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCisJfQ0KIA0KLXByb3RlY3RlZCBmaW5hbCBNZXRob2RCaW5kaW5nIG1vc3RTcGVjaWZpY0NsYXNzTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nW10gdmlzaWJsZSwgaW50IHZpc2libGVTaXplKSB7DQotCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbnVsbDsNCi0JTWV0aG9kQmluZGluZyBwcmV2aW91cyA9IG51bGw7DQotCW5leHRWaXNpYmxlOiBmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVTaXplOyBpKyspIHsNCi0JCW1ldGhvZCA9IHZpc2libGVbaV07DQotCQlpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBtZXRob2QuZGVjbGFyaW5nQ2xhc3MgIT0gcHJldmlvdXMuZGVjbGFyaW5nQ2xhc3MpDQotCQkJYnJlYWs7IC8vIGNhbm5vdCBhbnN3ZXIgYSBtZXRob2QgZmFydGhlciB1cCB0aGUgaGllcmFyY2h5IHRoYW4gdGhlIGZpcnN0IG1ldGhvZCBmb3VuZA0KLQkJcHJldmlvdXMgPSBtZXRob2Q7DQotCQlmb3IgKGludCBqID0gMDsgaiA8IHZpc2libGVTaXplOyBqKyspIHsNCi0JCQlpZiAoaSA9PSBqKSBjb250aW51ZTsNCi0JCQlNZXRob2RCaW5kaW5nIG5leHQgPSB2aXNpYmxlW2pdOw0KLQkJCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobmV4dC5wYXJhbWV0ZXJzLCBtZXRob2QucGFyYW1ldGVycykpDQotCQkJCWNvbnRpbnVlIG5leHRWaXNpYmxlOw0KKwkvKiBBbnN3ZXIgdGhlIHR5cGUgYmluZGluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlTmFtZSBhcmd1bWVudCwgcmVsYXRpdmUgdG8gdGhlIGVuY2xvc2luZ1R5cGUuDQorCSovDQorCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldE1lbWJlclR5cGUoDQorCQljaGFyW10gdHlwZU5hbWUsDQorCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsNCisJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGZpbmRNZW1iZXJUeXBlKHR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlKTsNCisJCWlmIChtZW1iZXJUeXBlID09IG51bGwpDQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgTm90Rm91bmQpOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBtZW1iZXJUeXBlOw0KKwl9DQorDQorCS8qIEFuc3dlciB0aGUgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvdW5kTmFtZS4NCisJKg0KKwkqIE5PVEU6IElmIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLCBzZW5kZXJzIHNob3VsZCBleHRyYWN0IHRoZSBjb21wb3VuZCBuYW1lDQorCSogZnJvbSB0aGUgYmluZGluZyAmIG5vdCBhc3N1bWUgdGhlIHByb2JsZW0gYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvdW5kTmFtZS4NCisJKi8NCisJcHVibGljIGZpbmFsIFR5cGVCaW5kaW5nIGdldFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7DQorCQlpbnQgdHlwZU5hbWVMZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOw0KKwkJaWYgKHR5cGVOYW1lTGVuZ3RoID09IDEpIHsNCisJCQkvLyBXb3VsZCBsaWtlIHRvIHJlbW92ZSB0aGlzIHRlc3QgYW5kIHJlcXVpcmUgc2VuZGVycyB0byBzcGVjaWFsbHkgaGFuZGxlIGJhc2UgdHlwZXMNCisJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gZ2V0QmFzZVR5cGUoY29tcG91bmROYW1lWzBdKTsNCisJCQlpZiAoYmluZGluZyAhPSBudWxsKQ0KKwkJCQlyZXR1cm4gYmluZGluZzsNCiAJCX0NCi0JCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZXMobWV0aG9kLnRocm93bkV4Y2VwdGlvbnMpOw0KLQkJcmV0dXJuIG1ldGhvZDsNCi0JfQ0KLQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHZpc2libGVbMF0uc2VsZWN0b3IsIHZpc2libGVbMF0ucGFyYW1ldGVycywgQW1iaWd1b3VzKTsNCi19DQotLy8gSW50ZXJuYWwgdXNlIG9ubHkNCi0NCi0vKiBBbGwgbWV0aG9kcyBpbiB2aXNpYmxlIGFyZSBhY2NlcHRhYmxlIG1hdGNoZXMgZm9yIHRoZSBtZXRob2QgaW4gcXVlc3Rpb24uLi4NCi0qIFNpbmNlIHRoZSByZWNlaXZlciB0eXBlIGlzIGFuIGludGVyZmFjZSwgd2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IDIgaW5oZXJpdGVkDQotKiBidXQgdW5yZWxhdGVkIHN1cGVyaW50ZXJmYWNlcyBtYXkgZGVmaW5lIHRoZSBzYW1lIG1ldGhvZCBpbiBhY2NlcHRhYmxlIGJ1dA0KLSogbm90IGlkZW50aWNhbCB3YXlzLi4uIHdlIGp1c3QgdGFrZSB0aGUgYmVzdCBtYXRjaCB0aGF0IHdlIGZpbmQgc2luY2UgYW55IGNsYXNzIHdoaWNoDQotKiBpbXBsZW1lbnRzIHRoZSByZWNlaXZlciBpbnRlcmZhY2UgTVVTVCBpbXBsZW1lbnQgYWxsIHNpZ25hdHVyZXMgZm9yIHRoZSBtZXRob2QuLi4NCi0qIGluIHdoaWNoIGNhc2UgdGhlIGJlc3QgbWF0Y2ggaXMgY29ycmVjdC4NCi0qDQotKiBOT1RFOiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIGphdmFjLi4uIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIG1lc3NhZ2Ugc2VuZCBvZg0KLSogYmFyKFgpIGluIGNsYXNzIFkgaXMgc3VwcG9zZWQgdG8gYmUgYW1iaWd1b3VzLiBCdXQgYW55IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlDQotKiBpbnRlcmZhY2UgSSBNVVNUIGltcGxlbWVudCBib3RoIHNpZ25hdHVyZXMgZm9yIGJhci4gSWYgdGhpcyBjbGFzcyB3YXMgdGhlIHJlY2VpdmVyIG9mDQotKiB0aGUgbWVzc2FnZSBzZW5kIGluc3RlYWQgb2YgdGhlIGludGVyZmFjZSBJLCB0aGVuIG5vIHByb2JsZW0gd291bGQgYmUgcmVwb3J0ZWQuDQotKg0KLWludGVyZmFjZSBJMSB7DQotCXZvaWQgYmFyKEogaik7DQotfQ0KLWludGVyZmFjZSBJMiB7DQotLy8Jdm9pZCBiYXIoSiBqKTsNCi0Jdm9pZCBiYXIoT2JqZWN0IG8pOw0KLX0NCi1pbnRlcmZhY2UgSSBleHRlbmRzIEkxLCBJMiB7fQ0KLWludGVyZmFjZSBKIHt9DQotDQotY2xhc3MgWCBpbXBsZW1lbnRzIEoge30NCi0NCi1jbGFzcyBZIGV4dGVuZHMgWCB7DQotCXB1YmxpYyB2b2lkIGZvbyhJIGksIFggeCkgeyBpLmJhcih4KTsgfQ0KLX0NCi0qLw0KLQ0KLXByb3RlY3RlZCBmaW5hbCBNZXRob2RCaW5kaW5nIG1vc3RTcGVjaWZpY0ludGVyZmFjZU1ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZ1tdIHZpc2libGUsIGludCB2aXNpYmxlU2l6ZSkgew0KLQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG51bGw7DQotCW5leHRWaXNpYmxlOiBmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVTaXplOyBpKyspIHsNCi0JCW1ldGhvZCA9IHZpc2libGVbaV07DQotCQlmb3IgKGludCBqID0gMDsgaiA8IHZpc2libGVTaXplOyBqKyspIHsNCi0JCQlpZiAoaSA9PSBqKSBjb250aW51ZTsNCi0JCQlNZXRob2RCaW5kaW5nIG5leHQgPSB2aXNpYmxlW2pdOw0KLQkJCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobmV4dC5wYXJhbWV0ZXJzLCBtZXRob2QucGFyYW1ldGVycykpDQotCQkJCWNvbnRpbnVlIG5leHRWaXNpYmxlOw0KKwkJQmluZGluZyBiaW5kaW5nID0NCisJCQlnZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSwgdHlwZU5hbWVMZW5ndGggPT0gMSA/IFRZUEUgOiBUWVBFIHwgUEFDS0FHRSk7DQorCQlpZiAoYmluZGluZyA9PSBudWxsKQ0KKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lWzBdLCBOb3RGb3VuZCk7DQorCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgew0KKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkTmFtZXNwYWNlUmVmZXJlbmNlKA0KKwkJCQluZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKGNvbXBvdW5kTmFtZVswXSwgTm90Rm91bmQpKTsNCisJCQkvLyByZWNvcmQgZXh0cmEgcmVmZXJlbmNlIHRvIHBrZw0KKwkJCXJldHVybiAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCiAJCX0NCi0JCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZXMobWV0aG9kLnRocm93bkV4Y2VwdGlvbnMpOw0KLQkJcmV0dXJuIG1ldGhvZDsNCisJCWludCBjdXJyZW50SW5kZXggPSAxOw0KKwkJYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsNCisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsNCisJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsNCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShwYWNrYWdlQmluZGluZyk7DQorDQorCQkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IHR5cGVOYW1lTGVuZ3RoKSB7DQorCQkJCWJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK10pOw0KKwkJCQkvLyBkb2VzIG5vdCBjaGVjayB2aXNpYmlsaXR5DQorCQkJCWlmIChiaW5kaW5nID09IG51bGwpDQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKA0KKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLA0KKwkJCQkJCU5vdEZvdW5kKTsNCisJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpDQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKA0KKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLA0KKwkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOw0KKwkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQ0KKwkJCQkJYnJlYWs7DQorCQkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOw0KKwkJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZE5hbWVzcGFjZVJlZmVyZW5jZShwYWNrYWdlQmluZGluZyk7DQorCQkJfQ0KKwkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpDQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoDQorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwNCisJCQkJCU5vdEZvdW5kKTsNCisJCQljaGVja1Zpc2liaWxpdHkgPSB0cnVlOw0KKwkJfQ0KKwkJLy8gYmluZGluZyBpcyBub3cgYSBSZWZlcmVuY2VCaW5kaW5nDQorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7DQorCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2UodHlwZUJpbmRpbmcpOw0KKwkJaWYgKGNoZWNrVmlzaWJpbGl0eSkgLy8gaGFuZGxlcyB0aGUgZmFsbCB0aHJvdWdoIGNhc2UNCisJCQlpZiAoIXR5cGVCaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMpKQ0KKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKA0KKwkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksDQorCQkJCQlOb3RWaXNpYmxlKTsNCisNCisJCXdoaWxlIChjdXJyZW50SW5kZXggPCB0eXBlTmFtZUxlbmd0aCkgew0KKwkJCXR5cGVCaW5kaW5nID0gZ2V0TWVtYmVyVHlwZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCB0eXBlQmluZGluZyk7DQorCQkJaWYgKCF0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKQ0KKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKA0KKwkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksDQorCQkJCQl0eXBlQmluZGluZy5wcm9ibGVtSWQoKSk7DQorCQl9DQorCQlyZXR1cm4gdHlwZUJpbmRpbmc7DQogCX0NCi0JcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyh2aXNpYmxlWzBdLnNlbGVjdG9yLCB2aXNpYmxlWzBdLnBhcmFtZXRlcnMsIEFtYmlndW91cyk7DQotfQ0KLXB1YmxpYyBmaW5hbCBDbGFzc1Njb3BlIG91dGVyTW9zdENsYXNzU2NvcGUoKSB7DQotCUNsYXNzU2NvcGUgbGFzdENsYXNzU2NvcGUgPSBudWxsOw0KLQlTY29wZSBzY29wZSA9IHRoaXM7DQotCWRvIHsNCi0JCWlmIChzY29wZSBpbnN0YW5jZW9mIENsYXNzU2NvcGUpDQotCQkJbGFzdENsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgc2NvcGU7DQotCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCi0JfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7DQotCXJldHVybiBsYXN0Q2xhc3NTY29wZTsgLy8gbWF5IGFuc3dlciBudWxsIGlmIG5vIGNsYXNzIGFyb3VuZA0KLX0NCi1wdWJsaWMgZmluYWwgTWV0aG9kU2NvcGUgb3V0ZXJNb3N0TWV0aG9kU2NvcGUoKSB7DQotCU1ldGhvZFNjb3BlIGxhc3RNZXRob2RTY29wZSA9IG51bGw7DQotCVNjb3BlIHNjb3BlID0gdGhpczsNCi0JZG8gew0KLQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpDQotCQkJbGFzdE1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsNCi0JCXNjb3BlID0gc2NvcGUucGFyZW50Ow0KLQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsNCi0JcmV0dXJuIGxhc3RNZXRob2RTY29wZTsgLy8gbWF5IGFuc3dlciBudWxsIGlmIG5vIG1ldGhvZCBhcm91bmQNCi19DQotcHVibGljIGFic3RyYWN0IFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKTsNCi1wdWJsaWMgZmluYWwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkgew0KLQlTY29wZSBzY29wZSwgdW5pdFNjb3BlID0gdGhpczsNCi0Jd2hpbGUgKChzY29wZSA9IHVuaXRTY29wZS5wYXJlbnQpICE9IG51bGwpDQotCQl1bml0U2NvcGUgPSBzY29wZTsNCi0JcmV0dXJuICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHVuaXRTY29wZSkucmVmZXJlbmNlQ29udGV4dDsNCi19DQotLy8gc3RhcnQgcG9zaXRpb24gaW4gdGhpcyBzY29wZSAtIGZvciBvcmRlcmluZyBzY29wZXMgdnMuIHZhcmlhYmxlcw0KLWludCBzdGFydEluZGV4KCkgew0KLQlyZXR1cm4gMDsNCi19DQotfQ0KKw0KKwkvKiBBbnN3ZXIgdGhlIHR5cGUgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRoZSBnaXZlbiBuYW1lLCBzdGFydGluZyB0aGUgbG9va3VwIGluIHRoZSByZWNlaXZlci4NCisJKiBUaGUgbmFtZSBwcm92aWRlZCBpcyBhIHNpbXBsZSBzb3VyY2UgbmFtZSAoZS5nLiwgIk9iamVjdCIgLCAiUG9pbnQiLCAuLi4pDQorCSovDQorCS8vIFRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBjb3VsZCBiZSBSZWZlcmVuY2VCaW5kaW5nIGlmIHdlIGRpZCBub3QgYW5zd2VyIGJhc2UgdHlwZXMuDQorCS8vIE5PVEU6IFdlIGNvdWxkIHN1cHBvcnQgbG9va2luZyBmb3IgQmFzZSBUeXBlcyBsYXN0IGluIHRoZSBzZWFyY2gsIGhvd2V2ZXIgYW55IGNvZGUgdXNpbmcNCisJLy8gdGhpcyBmZWF0dXJlIHdvdWxkIGJlIGV4dHJhb3JkaW5hcmlseSBzbG93LiAgVGhlcmVmb3JlIHdlIGRvbid0IGRvIHRoaXMNCisJcHVibGljIGZpbmFsIFR5cGVCaW5kaW5nIGdldFR5cGUoY2hhcltdIG5hbWUpIHsNCisJCS8vIFdvdWxkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgdGVzdCBhbmQgcmVxdWlyZSBzZW5kZXJzIHRvIHNwZWNpYWxseSBoYW5kbGUgYmFzZSB0eXBlcw0KKwkJVHlwZUJpbmRpbmcgYmluZGluZyA9IGdldEJhc2VUeXBlKG5hbWUpOw0KKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkNCisJCQlyZXR1cm4gYmluZGluZzsNCisNCisJCXJldHVybiAoUmVmZXJlbmNlQmluZGluZykgZ2V0VHlwZU9yUGFja2FnZShuYW1lLCBUWVBFKTsNCisJfQ0KKw0KKwkvLyBBZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gTk9UIFB1YmxpYyBBUEkNCisJcHVibGljIGZpbmFsIEJpbmRpbmcgZ2V0VHlwZU9yUGFja2FnZShjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsNCisJCWludCBuYW1lTGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsNCisJCWlmIChuYW1lTGVuZ3RoID09IDEpIHsNCisJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gZ2V0QmFzZVR5cGUoY29tcG91bmROYW1lWzBdKTsNCisJCQlpZiAoYmluZGluZyAhPSBudWxsKQ0KKwkJCQlyZXR1cm4gYmluZGluZzsNCisJCX0NCisJCUJpbmRpbmcgYmluZGluZyA9IGdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lWzBdLCBUWVBFIHwgUEFDS0FHRSk7DQorCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkNCisJCQlyZXR1cm4gYmluZGluZzsNCisNCisJCWludCBjdXJyZW50SW5kZXggPSAxOw0KKwkJYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsNCisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsNCisJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsNCisNCisJCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbmFtZUxlbmd0aCkgew0KKwkJCQliaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdKTsNCisJCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkNCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoDQorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksDQorCQkJCQkJTm90Rm91bmQpOw0KKwkJCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkNCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoDQorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksDQorCQkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7DQorCQkJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykpDQorCQkJCQlicmVhazsNCisJCQkJcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7DQorCQkJfQ0KKwkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpDQorCQkJCXJldHVybiBiaW5kaW5nOw0KKwkJCWNoZWNrVmlzaWJpbGl0eSA9IHRydWU7DQorCQl9DQorCQkvLyBiaW5kaW5nIGlzIG5vdyBhIFJlZmVyZW5jZUJpbmRpbmcNCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCisJCWlmIChjaGVja1Zpc2liaWxpdHkpIC8vIGhhbmRsZXMgdGhlIGZhbGwgdGhyb3VnaCBjYXNlDQorCQkJaWYgKCF0eXBlQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzKSkNCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygNCisJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLA0KKwkJCQkJTm90VmlzaWJsZSk7DQorDQorCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbmFtZUxlbmd0aCkgew0KKwkJCXR5cGVCaW5kaW5nID0gZ2V0TWVtYmVyVHlwZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCB0eXBlQmluZGluZyk7DQorCQkJLy8gY2hlY2tzIHZpc2liaWxpdHkNCisJCQlpZiAoIXR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpDQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoDQorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwNCisJCQkJCXR5cGVCaW5kaW5nLnByb2JsZW1JZCgpKTsNCisJCX0NCisJCXJldHVybiB0eXBlQmluZGluZzsNCisJfQ0KKw0KKwkvKiBJbnRlcm5hbCB1c2Ugb25seSANCisJKi8NCisJZmluYWwgQmluZGluZyBnZXRUeXBlT3JQYWNrYWdlKGNoYXJbXSBuYW1lLCBpbnQgbWFzaykgew0KKwkJU2NvcGUgc2NvcGUgPSB0aGlzOw0KKwkJaWYgKChtYXNrICYgVFlQRSkgPT0gMCkgew0KKwkJCVNjb3BlIG5leHQgPSBzY29wZTsNCisJCQl3aGlsZSAoKG5leHQgPSBzY29wZS5wYXJlbnQpICE9IG51bGwpDQorCQkJCXNjb3BlID0gbmV4dDsNCisJCX0gZWxzZSB7DQorCQkJUmVmZXJlbmNlQmluZGluZyBmb3VuZFR5cGUgPSBudWxsOw0KKwkJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kDQorCQkJCXN3aXRjaCAoc2NvcGUua2luZCkgew0KKwkJCQkJY2FzZSBNRVRIT0RfU0NPUEUgOg0KKwkJCQkJY2FzZSBCTE9DS19TQ09QRSA6DQorCQkJCQkJUmVmZXJlbmNlQmluZGluZyBsb2NhbFR5cGUgPSAoKEJsb2NrU2NvcGUpIHNjb3BlKS5maW5kTG9jYWxUeXBlKG5hbWUpOw0KKwkJCQkJCS8vIGxvb2tzIGluIHRoaXMgc2NvcGUgb25seQ0KKwkJCQkJCWlmIChsb2NhbFR5cGUgIT0gbnVsbCkgew0KKwkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG51bGwgJiYgZm91bmRUeXBlICE9IGxvY2FsVHlwZSkNCisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7DQorCQkJCQkJCXJldHVybiBsb2NhbFR5cGU7DQorCQkJCQkJfQ0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDTEFTU19TQ09QRSA6DQorCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9ICgoQ2xhc3NTY29wZSkgc2NvcGUpLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsNCisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc291cmNlVHlwZS5zb3VyY2VOYW1lLCBuYW1lKSkgew0KKwkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG51bGwgJiYgZm91bmRUeXBlICE9IHNvdXJjZVR5cGUpDQorCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOw0KKwkJCQkJCQlyZXR1cm4gc291cmNlVHlwZTsNCisJCQkJCQl9DQorCQkJCQkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZmluZE1lbWJlclR5cGUobmFtZSwgc291cmNlVHlwZSk7DQorCQkJCQkJaWYgKG1lbWJlclR5cGUgIT0gbnVsbCkgeyAvLyBza2lwIGl0IGlmIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZw0KKwkJCQkJCQlpZiAobWVtYmVyVHlwZS5wcm9ibGVtSWQoKSA9PSBBbWJpZ3VvdXMpIHsNCisJCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbCB8fCBmb3VuZFR5cGUucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkNCisJCQkJCQkJCQkvLyBzdXBlcmNlZGVzIGFueSBwb3RlbnRpYWwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSBwcm9ibGVtDQorCQkJCQkJCQkJcmV0dXJuIG1lbWJlclR5cGU7DQorCQkJCQkJCQllbHNlDQorCQkJCQkJCQkJLy8gbWFrZSB0aGUgdXNlciBxdWFsaWZ5IHRoZSB0eXBlLCBsaWtlbHkgd2FudHMgdGhlIGZpcnN0IGluaGVyaXRlZCB0eXBlDQorCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlpZiAobWVtYmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7DQorCQkJCQkJCQlpZiAoc291cmNlVHlwZSA9PSBtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSkgew0KKwkJCQkJCQkJCS8vIGZvdW5kIGEgdmFsaWQgdHlwZSBpbiB0aGUgJ2ltbWVkaWF0ZScgc2NvcGUgKGllLiBub3QgaW5oZXJpdGVkKQ0KKwkJCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbCkNCisJCQkJCQkJCQkJcmV0dXJuIG1lbWJlclR5cGU7DQorCQkJCQkJCQkJaWYgKGZvdW5kVHlwZS5pc1ZhbGlkQmluZGluZygpKQ0KKwkJCQkJCQkJCQkvLyBpZiBhIHZhbGlkIHR5cGUgd2FzIGZvdW5kLCBjb21wbGFpbiB3aGVuIGFub3RoZXIgaXMgZm91bmQgaW4gYW4gJ2ltbWVkaWF0ZScgZW5jbG9zaW5nIHR5cGUgKGllLiBub3QgaW5oZXJpdGVkKQ0KKwkJCQkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG1lbWJlclR5cGUpDQorCQkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbA0KKwkJCQkJCQkJfHwgKGZvdW5kVHlwZS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlICYmIG1lbWJlclR5cGUucHJvYmxlbUlkKCkgIT0gTm90VmlzaWJsZSkpDQorCQkJCQkJCQkvLyBvbmx5IHJlbWVtYmVyIHRoZSBtZW1iZXJUeXBlIGlmIGl0cyB0aGUgZmlyc3Qgb25lIGZvdW5kIG9yIHRoZSBwcmV2aW91cyBvbmUgd2FzIG5vdCB2aXNpYmxlICYgbWVtYmVyVHlwZSBpcy4uLg0KKwkJCQkJCQkJZm91bmRUeXBlID0gbWVtYmVyVHlwZTsNCisJCQkJCQl9DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOg0KKwkJCQkJCWJyZWFrIGRvbmU7DQorCQkJCX0NCisJCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQorCQkJfQ0KKwkJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCkNCisJCQkJcmV0dXJuIGZvdW5kVHlwZTsNCisJCX0NCisJCS8vIGF0IHRoaXMgcG9pbnQgdGhlIHNjb3BlIGlzIGEgY29tcGlsYXRpb24gdW5pdCBzY29wZQ0KKwkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlID0gKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBzY29wZTsNCisJCS8vIGFzayBmb3IgdGhlIGltcG9ydHMgKyBuYW1lDQorCQlpZiAoKG1hc2sgJiBUWVBFKSAhPSAwKSB7DQorCQkJLy8gY2hlY2sgc2luZ2xlIHR5cGUgaW1wb3J0cy4NCisJCQlJbXBvcnRCaW5kaW5nW10gaW1wb3J0cyA9IHVuaXRTY29wZS5pbXBvcnRzOw0KKwkJCS8vIGNvcHkgdGhlIGxpc3QsIHNpbmNlIHNpbmdsZSB0eXBlIGltcG9ydHMgYXJlIHJlbW92ZWQgaWYgdGhleSBjYW5ub3QgYmUgcmVzb2x2ZWQNCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCQlJbXBvcnRCaW5kaW5nIHR5cGVJbXBvcnQgPSBpbXBvcnRzW2ldOw0KKwkJCQlpZiAoIXR5cGVJbXBvcnQub25EZW1hbmQpDQorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbg0KKwkJCQkJCS5lcXVhbHModHlwZUltcG9ydC5jb21wb3VuZE5hbWVbdHlwZUltcG9ydC5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIG5hbWUpKQ0KKwkJCQkJCWlmICh1bml0U2NvcGUucmVzb2x2ZVNpbmdsZVR5cGVJbXBvcnQodHlwZUltcG9ydCkgIT0gbnVsbCkNCisJCQkJCQkJcmV0dXJuIHR5cGVJbXBvcnQucmVzb2x2ZWRJbXBvcnQ7IC8vIGFscmVhZHkga25vdyBpdHMgdmlzaWJsZQ0KKwkJCX0NCisJCQkvLyBjaGVjayBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgY3VycmVudCBwYWNrYWdlIChhbnN3ZXIgdGhlIHByb2JsZW0gYmluZGluZyB1bmxlc3MgaXRzIG5vdCBmb3VuZCBpbiB3aGljaCBjYXNlIGNvbnRpbnVlIHRvIGxvb2spDQorCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZmluZFR5cGUobmFtZSwgdW5pdFNjb3BlLmZQYWNrYWdlLCB1bml0U2NvcGUuZlBhY2thZ2UpOw0KKwkJCS8vIGlzIGFsd2F5cyB2aXNpYmxlDQorCQkJaWYgKHR5cGUgIT0gbnVsbCkNCisJCQkJcmV0dXJuIHR5cGU7DQorDQorCQkJLy8gY2hlY2sgb24gZGVtYW5kIGltcG9ydHMNCisJCQlib29sZWFuIGZvdW5kSW5JbXBvcnQgPSBmYWxzZTsNCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdW5pdFNjb3BlLmltcG9ydHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCisJCQkJaWYgKHVuaXRTY29wZS5pbXBvcnRzW2ldLm9uRGVtYW5kKSB7DQorCQkJCQlCaW5kaW5nIHJlc29sdmVkSW1wb3J0ID0gdW5pdFNjb3BlLmltcG9ydHNbaV0ucmVzb2x2ZWRJbXBvcnQ7DQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRlbXAgPQ0KKwkJCQkJCShyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKQ0KKwkJCQkJCQk/IGZpbmRUeXBlKG5hbWUsIChQYWNrYWdlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQsIHVuaXRTY29wZS5mUGFja2FnZSkNCisJCQkJCQkJOiBmaW5kRGlyZWN0TWVtYmVyVHlwZShuYW1lLCAoUmVmZXJlbmNlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQpOw0KKwkJCQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmlzVmFsaWRCaW5kaW5nKCkpIHsNCisJCQkJCQlpZiAoZm91bmRJbkltcG9ydCkNCisJCQkJCQkJLy8gQW5zd2VyIGVycm9yIGJpbmRpbmcgLS0gaW1wb3J0IG9uIGRlbWFuZCBjb25mbGljdDsgbmFtZSBmb3VuZCBpbiB0d28gaW1wb3J0IG9uIGRlbWFuZCBwYWNrYWdlcy4NCisJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBBbWJpZ3VvdXMpOw0KKwkJCQkJCXR5cGUgPSB0ZW1wOw0KKwkJCQkJCWZvdW5kSW5JbXBvcnQgPSB0cnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmICh0eXBlICE9IG51bGwpDQorCQkJCXJldHVybiB0eXBlOw0KKwkJfQ0KKwkJLy8gc2VlIGlmIHRoZSBuYW1lIGlzIGEgcGFja2FnZQ0KKwkJaWYgKChtYXNrICYgUEFDS0FHRSkgIT0gMCkgew0KKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShuYW1lKTsNCisJCQlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCkNCisJCQkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOw0KKwkJfQ0KKwkJLy8gQW5zd2VyIGVycm9yIGJpbmRpbmcgLS0gY291bGQgbm90IGZpbmQgbmFtZQ0KKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5hZGROYW1lc3BhY2VSZWZlcmVuY2UoDQorCQkJbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhuYW1lLCBOb3RGb3VuZCkpOw0KKwkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBOb3RGb3VuZCk7DQorCX0NCisNCisJLyogQW5zd2VyIHdoZXRoZXIgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IGFzIHRoZSByZWNlaXZlcg0KKwkqLw0KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmluZWRJblNhbWVVbml0KFJlZmVyZW5jZUJpbmRpbmcgdHlwZSkgew0KKwkJLy8gZmluZCB0aGUgb3V0ZXIgbW9zdCBlbmNsb3NpbmcgdHlwZQ0KKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gdHlwZTsNCisJCXdoaWxlICgodHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKQ0KKwkJCWVuY2xvc2luZ1R5cGUgPSB0eXBlOw0KKw0KKwkJLy8gZmluZCB0aGUgY29tcGlsYXRpb24gdW5pdCBzY29wZQ0KKwkJU2NvcGUgc2NvcGUsIHVuaXRTY29wZSA9IHRoaXM7DQorCQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkNCisJCQl1bml0U2NvcGUgPSBzY29wZTsNCisNCisJCS8vIHRlc3QgdGhhdCB0aGUgZW5jbG9zaW5nVHlwZSBpcyBub3QgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdA0KKwkJU291cmNlVHlwZUJpbmRpbmdbXSB0b3BMZXZlbFR5cGVzID0NCisJCQkoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB1bml0U2NvcGUpLnRvcExldmVsVHlwZXM7DQorCQlmb3IgKGludCBpID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykNCisJCQlpZiAodG9wTGV2ZWxUeXBlc1tpXSA9PSBlbmNsb3NpbmdUeXBlKQ0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0phdmFJb1NlcmlhbGl6YWJsZShUeXBlQmluZGluZyB0Yikgew0KKwkJLy9hIGZpcnN0IC1ub25lIG9wdGltaXplZCB2ZXJzaW9uLS4uLjotKS4uLi4NCisJCS8vcGxlYXNlIG1vZGlmeSBhcyBuZWVkZWQNCisNCisJCXJldHVybiB0YiA9PSBnZXRKYXZhSW9TZXJpYWxpemFibGUoKTsNCisJfQ0KKw0KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0phdmFMYW5nQ2xvbmVhYmxlKFR5cGVCaW5kaW5nIHRiKSB7DQorCQkvL2EgZmlyc3QgLW5vbmUgb3B0aW1pemVkIHZlcnNpb24tLi4uOi0pLi4uLg0KKwkJLy9wbGVhc2UgbW9kaWZ5IGFzIG5lZWRlZA0KKw0KKwkJcmV0dXJuIHRiID09IGdldEphdmFMYW5nQ2xvbmVhYmxlKCk7DQorCX0NCisNCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKYXZhTGFuZ09iamVjdChUeXBlQmluZGluZyB0eXBlKSB7DQorCQlyZXR1cm4gdHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0Ow0KKwl9DQorDQorCXB1YmxpYyBmaW5hbCBNZXRob2RTY29wZSBtZXRob2RTY29wZSgpIHsNCisJCVNjb3BlIHNjb3BlID0gdGhpczsNCisJCWRvIHsNCisJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSkNCisJCQkJcmV0dXJuIChNZXRob2RTY29wZSkgc2NvcGU7DQorCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7DQorCQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8vIEludGVybmFsIHVzZSBvbmx5DQorCS8qIEFsbCBtZXRob2RzIGluIHZpc2libGUgYXJlIGFjY2VwdGFibGUgbWF0Y2hlcyBmb3IgdGhlIG1ldGhvZCBpbiBxdWVzdGlvbi4uLg0KKwkqIFRoZSBtZXRob2RzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyIHR5cGUgYXBwZWFyIGJlZm9yZSB0aG9zZSBkZWZpbmVkIGJ5IGl0cw0KKwkqIHN1cGVyY2xhc3MgYW5kIHNvIG9uLiBXZSB3YW50IHRvIGZpbmQgdGhlIG9uZSB3aGljaCBtYXRjaGVzIGJlc3QuDQorCSoNCisJKiBTaW5jZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBhIGNsYXNzLCB3ZSBrbm93IGVhY2ggbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzDQorCSogZWl0aGVyIHRoZSByZWNlaXZlciB0eXBlIG9yIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLiBJdCBpcyBhbiBlcnJvciBpZiB0aGUgYmVzdCBtYXRjaA0KKwkqIGlzIGRlZmluZWQgYnkgYSBzdXBlcmNsYXNzLCB3aGVuIGEgbGVzc2VyIG1hdGNoIGlzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyIHR5cGUNCisJKiBvciBhIGNsb3NlciBzdXBlcmNsYXNzLg0KKwkqLw0KKwlwcm90ZWN0ZWQgZmluYWwgTWV0aG9kQmluZGluZyBtb3N0U3BlY2lmaWNDbGFzc01ldGhvZEJpbmRpbmcoDQorCQlNZXRob2RCaW5kaW5nW10gdmlzaWJsZSwNCisJCWludCB2aXNpYmxlU2l6ZSkgew0KKwkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBudWxsOw0KKwkJTWV0aG9kQmluZGluZyBwcmV2aW91cyA9IG51bGw7DQorCQluZXh0VmlzaWJsZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVNpemU7IGkrKykgew0KKwkJCW1ldGhvZCA9IHZpc2libGVbaV07DQorCQkJaWYgKHByZXZpb3VzICE9IG51bGwgJiYgbWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IHByZXZpb3VzLmRlY2xhcmluZ0NsYXNzKQ0KKwkJCQlicmVhazsNCisJCQkvLyBjYW5ub3QgYW5zd2VyIGEgbWV0aG9kIGZhcnRoZXIgdXAgdGhlIGhpZXJhcmNoeSB0aGFuIHRoZSBmaXJzdCBtZXRob2QgZm91bmQNCisJCQlwcmV2aW91cyA9IG1ldGhvZDsNCisJCQlmb3IgKGludCBqID0gMDsgaiA8IHZpc2libGVTaXplOyBqKyspIHsNCisJCQkJaWYgKGkgPT0gaikNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQlNZXRob2RCaW5kaW5nIG5leHQgPSB2aXNpYmxlW2pdOw0KKwkJCQlpZiAoIWFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG5leHQucGFyYW1ldGVycywgbWV0aG9kLnBhcmFtZXRlcnMpKQ0KKwkJCQkJY29udGludWUgbmV4dFZpc2libGU7DQorCQkJfQ0KKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuYWRkVHlwZVJlZmVyZW5jZXMobWV0aG9kLnRocm93bkV4Y2VwdGlvbnMpOw0KKwkJCXJldHVybiBtZXRob2Q7DQorCQl9DQorCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKA0KKwkJCXZpc2libGVbMF0uc2VsZWN0b3IsDQorCQkJdmlzaWJsZVswXS5wYXJhbWV0ZXJzLA0KKwkJCUFtYmlndW91cyk7DQorCX0NCisNCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkNCisJLyogQWxsIG1ldGhvZHMgaW4gdmlzaWJsZSBhcmUgYWNjZXB0YWJsZSBtYXRjaGVzIGZvciB0aGUgbWV0aG9kIGluIHF1ZXN0aW9uLi4uDQorCSogU2luY2UgdGhlIHJlY2VpdmVyIHR5cGUgaXMgYW4gaW50ZXJmYWNlLCB3ZSBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IHRoYXQgMiBpbmhlcml0ZWQNCisJKiBidXQgdW5yZWxhdGVkIHN1cGVyaW50ZXJmYWNlcyBtYXkgZGVmaW5lIHRoZSBzYW1lIG1ldGhvZCBpbiBhY2NlcHRhYmxlIGJ1dA0KKwkqIG5vdCBpZGVudGljYWwgd2F5cy4uLiB3ZSBqdXN0IHRha2UgdGhlIGJlc3QgbWF0Y2ggdGhhdCB3ZSBmaW5kIHNpbmNlIGFueSBjbGFzcyB3aGljaA0KKwkqIGltcGxlbWVudHMgdGhlIHJlY2VpdmVyIGludGVyZmFjZSBNVVNUIGltcGxlbWVudCBhbGwgc2lnbmF0dXJlcyBmb3IgdGhlIG1ldGhvZC4uLg0KKwkqIGluIHdoaWNoIGNhc2UgdGhlIGJlc3QgbWF0Y2ggaXMgY29ycmVjdC4NCisJKg0KKwkqIE5PVEU6IFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gamF2YWMuLi4gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgbWVzc2FnZSBzZW5kIG9mDQorCSogYmFyKFgpIGluIGNsYXNzIFkgaXMgc3VwcG9zZWQgdG8gYmUgYW1iaWd1b3VzLiBCdXQgYW55IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlDQorCSogaW50ZXJmYWNlIEkgTVVTVCBpbXBsZW1lbnQgYm90aCBzaWduYXR1cmVzIGZvciBiYXIuIElmIHRoaXMgY2xhc3Mgd2FzIHRoZSByZWNlaXZlciBvZg0KKwkqIHRoZSBtZXNzYWdlIHNlbmQgaW5zdGVhZCBvZiB0aGUgaW50ZXJmYWNlIEksIHRoZW4gbm8gcHJvYmxlbSB3b3VsZCBiZSByZXBvcnRlZC4NCisJKg0KKwlpbnRlcmZhY2UgSTEgew0KKwkJdm9pZCBiYXIoSiBqKTsNCisJfQ0KKwlpbnRlcmZhY2UgSTIgew0KKwkvLwl2b2lkIGJhcihKIGopOw0KKwkJdm9pZCBiYXIoT2JqZWN0IG8pOw0KKwl9DQorCWludGVyZmFjZSBJIGV4dGVuZHMgSTEsIEkyIHt9DQorCWludGVyZmFjZSBKIHt9DQorCQ0KKwljbGFzcyBYIGltcGxlbWVudHMgSiB7fQ0KKwkNCisJY2xhc3MgWSBleHRlbmRzIFggew0KKwkJcHVibGljIHZvaWQgZm9vKEkgaSwgWCB4KSB7IGkuYmFyKHgpOyB9DQorCX0NCisJKi8NCisJcHJvdGVjdGVkIGZpbmFsIE1ldGhvZEJpbmRpbmcgbW9zdFNwZWNpZmljSW50ZXJmYWNlTWV0aG9kQmluZGluZygNCisJCU1ldGhvZEJpbmRpbmdbXSB2aXNpYmxlLA0KKwkJaW50IHZpc2libGVTaXplKSB7DQorCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG51bGw7DQorCQluZXh0VmlzaWJsZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVNpemU7IGkrKykgew0KKwkJCW1ldGhvZCA9IHZpc2libGVbaV07DQorCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2aXNpYmxlU2l6ZTsgaisrKSB7DQorCQkJCWlmIChpID09IGopDQorCQkJCQljb250aW51ZTsNCisJCQkJTWV0aG9kQmluZGluZyBuZXh0ID0gdmlzaWJsZVtqXTsNCisJCQkJaWYgKCFhcmVQYXJhbWV0ZXJzQXNzaWduYWJsZShuZXh0LnBhcmFtZXRlcnMsIG1ldGhvZC5wYXJhbWV0ZXJzKSkNCisJCQkJCWNvbnRpbnVlIG5leHRWaXNpYmxlOw0KKwkJCX0NCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLmFkZFR5cGVSZWZlcmVuY2VzKG1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsNCisJCQlyZXR1cm4gbWV0aG9kOw0KKwkJfQ0KKwkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygNCisJCQl2aXNpYmxlWzBdLnNlbGVjdG9yLA0KKwkJCXZpc2libGVbMF0ucGFyYW1ldGVycywNCisJCQlBbWJpZ3VvdXMpOw0KKwl9DQorDQorCXB1YmxpYyBmaW5hbCBDbGFzc1Njb3BlIG91dGVyTW9zdENsYXNzU2NvcGUoKSB7DQorCQlDbGFzc1Njb3BlIGxhc3RDbGFzc1Njb3BlID0gbnVsbDsNCisJCVNjb3BlIHNjb3BlID0gdGhpczsNCisJCWRvIHsNCisJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBDbGFzc1Njb3BlKQ0KKwkJCQlsYXN0Q2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBzY29wZTsNCisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCisJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOw0KKwkJcmV0dXJuIGxhc3RDbGFzc1Njb3BlOyAvLyBtYXkgYW5zd2VyIG51bGwgaWYgbm8gY2xhc3MgYXJvdW5kDQorCX0NCisNCisJcHVibGljIGZpbmFsIE1ldGhvZFNjb3BlIG91dGVyTW9zdE1ldGhvZFNjb3BlKCkgew0KKwkJTWV0aG9kU2NvcGUgbGFzdE1ldGhvZFNjb3BlID0gbnVsbDsNCisJCVNjb3BlIHNjb3BlID0gdGhpczsNCisJCWRvIHsNCisJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSkNCisJCQkJbGFzdE1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsNCisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsNCisJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOw0KKwkJcmV0dXJuIGxhc3RNZXRob2RTY29wZTsgLy8gbWF5IGFuc3dlciBudWxsIGlmIG5vIG1ldGhvZCBhcm91bmQNCisJfQ0KKw0KKwlwdWJsaWMgZmluYWwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkgew0KKwkJU2NvcGUgc2NvcGUsIHVuaXRTY29wZSA9IHRoaXM7DQorCQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkNCisJCQl1bml0U2NvcGUgPSBzY29wZTsNCisJCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB1bml0U2NvcGUpLnJlZmVyZW5jZUNvbnRleHQ7DQorCX0NCisJLy8gc3RhcnQgcG9zaXRpb24gaW4gdGhpcyBzY29wZSAtIGZvciBvcmRlcmluZyBzY29wZXMgdnMuIHZhcmlhYmxlcw0KKwlpbnQgc3RhcnRJbmRleCgpIHsNCisJCXJldHVybiAwOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YQppbmRleCA0ZjFmMTNiLi4wMDc2N2RhIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVCaW5kaW5nLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCQkJc3ludGhGaWVsZC5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoDQogCQkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nLk91dGVyTG9jYWxQcmVmaXgsDQogCQkJCQkJYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLm5hbWUsDQotCQkJCQkJKCIkIi8qbm9uTkxTKi8gKyBTdHJpbmcudmFsdWVPZihpbmRleCsrKSkudG9DaGFyQXJyYXkoKSk7DQorCQkJCQkJKCIkIiArIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKS50b0NoYXJBcnJheSgpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJbmVlZFJlY2hlY2sgPSB0cnVlOw0KIAkJCQkJYnJlYWs7DQogCQkJCX0NCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlGaWVsZEJpbmRpbmcgc3ludGhGaWVsZCA9IChGaWVsZEJpbmRpbmcpIHN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0uZ2V0KHRhcmdldFR5cGUpOw0KIAlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7DQogCQlzeW50aEZpZWxkID0gbmV3IFN5bnRoZXRpY0ZpZWxkQmluZGluZygNCi0JCQkoImNsYXNzJCIvKm5vbk5MUyovICsgc3ludGhldGljc1tDTEFTU19MSVRFUkFMXS5zaXplKCkpLnRvQ2hhckFycmF5KCksDQorCQkJKCJjbGFzcyQiICsgc3ludGhldGljc1tDTEFTU19MSVRFUkFMXS5zaXplKCkpLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQNCiAJCQlibG9ja1Njb3BlLmdldEphdmFMYW5nQ2xhc3MoKSwNCiAJCQlBY2NEZWZhdWx0IHwgQWNjU3RhdGljIHwgQWNjU3ludGhldGljLA0KIAkJCXRoaXMsDQpAQCAtMTk4LDYgKzE5OCw1MSBAQAogCX0JCQ0KIAlyZXR1cm4gc3ludGhGaWVsZDsNCiB9DQorDQorLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBmaWVsZCBmb3IgdGhlIGVtdWxhdGlvbiBvZiB0aGUgYXNzZXJ0IHN0YXRlbWVudC4NCisqCUFuc3dlciB0aGUgbmV3IGZpZWxkIG9yIHRoZSBleGlzdGluZyBmaWVsZCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLg0KKyovDQorcHVibGljIEZpZWxkQmluZGluZyBhZGRTeW50aGV0aWNGaWVsZChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsNCisJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCkgew0KKwkJc3ludGhldGljcyA9IG5ldyBIYXNodGFibGVbXSB7IG5ldyBIYXNodGFibGUoNSksIG5ldyBIYXNodGFibGUoNSksIG5ldyBIYXNodGFibGUoNSkgfTsNCisJfQ0KKw0KKwkvLyB1c2UgYSBkaWZmZXJlbnQgdGFibGUgdGhhbiBGSUVMRFMsIGdpdmVuIHRoZXJlIG1pZ2h0IGJlIGEgY29sbGlzaW9uIGJldHdlZW4gZW11bGF0aW9uIG9mIFgudGhpcyQwIGFuZCBYLmNsYXNzLg0KKwlGaWVsZEJpbmRpbmcgc3ludGhGaWVsZCA9IChGaWVsZEJpbmRpbmcpIHN5bnRoZXRpY3NbRklFTERdLmdldCgiYXNzZXJ0aW9uRW11bGF0aW9uIik7IC8vJE5PTi1OTFMtMSQNCisJaWYgKHN5bnRoRmllbGQgPT0gbnVsbCkgew0KKwkJc3ludGhGaWVsZCA9IG5ldyBTeW50aGV0aWNGaWVsZEJpbmRpbmcoDQorCQkJIiRhc3NlcnRpb25zRGlzYWJsZWQiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQNCisJCQlCb29sZWFuQmluZGluZywNCisJCQlBY2NEZWZhdWx0IHwgQWNjU3RhdGljIHwgQWNjU3ludGhldGljIHwgQWNjRmluYWwsDQorCQkJdGhpcywNCisJCQlDb25zdGFudC5Ob3RBQ29uc3RhbnQsDQorCQkJMCk7DQorCQlzeW50aGV0aWNzW0ZJRUxEXS5wdXQoImFzc2VydGlvbkVtdWxhdGlvbiIsIHN5bnRoRmllbGQpOyAvLyROT04tTkxTLTEkDQorCX0NCisJLy8gZW5zdXJlIHRoZXJlIGlzIG5vdCBhbHJlYWR5IHN1Y2ggYSBmaWVsZCBkZWZpbmVkIGJ5IHRoZSB1c2VyDQorCS8vIGVuc3VyZSB0aGVyZSBpcyBub3QgYWxyZWFkeSBzdWNoIGEgZmllbGQgZGVmaW5lZCBieSB0aGUgdXNlcg0KKwlib29sZWFuIG5lZWRSZWNoZWNrOw0KKwlpbnQgaW5kZXggPSAwOw0KKwlkbyB7DQorCQluZWVkUmVjaGVjayA9IGZhbHNlOw0KKwkJRmllbGRCaW5kaW5nIGV4aXN0aW5nRmllbGQ7DQorCQlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSkpICE9IG51bGwpIHsNCisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0Ow0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCisJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSB0eXBlRGVjbC5maWVsZHNbaV07DQorCQkJCWlmIChmaWVsZERlY2wuYmluZGluZyA9PSBleGlzdGluZ0ZpZWxkKSB7DQorCQkJCQlzeW50aEZpZWxkLm5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgNCisJCQkJCQkiJGFzc2VydGlvbnNEaXNhYmxlZCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCSgiXyIgKyBTdHJpbmcudmFsdWVPZihpbmRleCsrKSkudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCW5lZWRSZWNoZWNrID0gdHJ1ZTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9IHdoaWxlIChuZWVkUmVjaGVjayk7DQorCXJldHVybiBzeW50aEZpZWxkOw0KK30NCisNCiAvKiBBZGQgYSBuZXcgc3ludGhldGljIGFjY2VzcyBtZXRob2QgZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIDx0YXJnZXRGaWVsZD4uDQogCUFuc3dlciB0aGUgbmV3IG1ldGhvZCBvciB0aGUgZXhpc3RpbmcgbWV0aG9kIGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuDQogKi8NCkBAIC03MzIsNzEgKzc3Nyw3MSBAQAogCXJldHVybiBiaW5kaW5nczsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JU3RyaW5nIHMgPSAiKGlkPSIvKm5vbk5MUyovKyhpZCA9PSBOb0lkID8gIk5vSWQiLypub25OTFMqLyA6ICgiIi8qbm9uTkxTKi8raWQpICkgKyIpXG4iLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiKGlkPSIrKGlkID09IE5vSWQgPyAiTm9JZCIgOiAoIiIraWQpICkgKyIpXG4iOyAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTEkDQogDQotCWlmIChpc0RlcHJlY2F0ZWQoKSkgcyArPSAiZGVwcmVjYXRlZCAiLypub25OTFMqLzsNCi0JaWYgKGlzUHVibGljKCkpIHMgKz0gInB1YmxpYyAiLypub25OTFMqLzsNCi0JaWYgKGlzUHJvdGVjdGVkKCkpIHMgKz0gInByb3RlY3RlZCAiLypub25OTFMqLzsNCi0JaWYgKGlzUHJpdmF0ZSgpKSBzICs9ICJwcml2YXRlICIvKm5vbk5MUyovOw0KLQlpZiAoaXNBYnN0cmFjdCgpICYmIGlzQ2xhc3MoKSkgcyArPSAiYWJzdHJhY3QgIi8qbm9uTkxTKi87DQotCWlmIChpc1N0YXRpYygpICYmIGlzTmVzdGVkVHlwZSgpKSBzICs9ICJzdGF0aWMgIi8qbm9uTkxTKi87DQotCWlmIChpc0ZpbmFsKCkpIHMgKz0gImZpbmFsICIvKm5vbk5MUyovOw0KKwlpZiAoaXNEZXByZWNhdGVkKCkpIHMgKz0gImRlcHJlY2F0ZWQgIjsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoaXNQdWJsaWMoKSkgcyArPSAicHVibGljICI7IC8vJE5PTi1OTFMtMSQNCisJaWYgKGlzUHJvdGVjdGVkKCkpIHMgKz0gInByb3RlY3RlZCAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc1ByaXZhdGUoKSkgcyArPSAicHJpdmF0ZSAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc0Fic3RyYWN0KCkgJiYgaXNDbGFzcygpKSBzICs9ICJhYnN0cmFjdCAiOyAvLyROT04tTkxTLTEkDQorCWlmIChpc1N0YXRpYygpICYmIGlzTmVzdGVkVHlwZSgpKSBzICs9ICJzdGF0aWMgIjsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoaXNGaW5hbCgpKSBzICs9ICJmaW5hbCAiOyAvLyROT04tTkxTLTEkDQogDQotCXMgKz0gaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UgIi8qbm9uTkxTKi8gOiAiY2xhc3MgIi8qbm9uTkxTKi87DQotCXMgKz0gKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IENoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIFRZUEUiLypub25OTFMqLzsNCisJcyArPSBpc0ludGVyZmFjZSgpID8gImludGVyZmFjZSAiIDogImNsYXNzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwlzICs9IChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQlzICs9ICJcblx0ZXh0ZW5kcyAiLypub25OTFMqLzsNCi0JcyArPSAoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIi8qbm9uTkxTKi87DQorCXMgKz0gIlxuXHRleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQNCisJcyArPSAoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsNCiAJCWlmIChzdXBlckludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsNCi0JCQlzICs9ICJcblx0aW1wbGVtZW50cyA6ICIvKm5vbk5MUyovOw0KKwkJCXMgKz0gIlxuXHRpbXBsZW1lbnRzIDogIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCQkJaWYgKGkgID4gMCkNCi0JCQkJCXMgKz0gIiwgIi8qbm9uTkxTKi87DQotCQkJCXMgKz0gKHN1cGVySW50ZXJmYWNlc1tpXSAhPSBudWxsKSA/IHN1cGVySW50ZXJmYWNlc1tpXS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiLypub25OTFMqLzsNCisJCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJA0KKwkJCQlzICs9IChzdXBlckludGVyZmFjZXNbaV0gIT0gbnVsbCkgPyBzdXBlckludGVyZmFjZXNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgU1VQRVJJTlRFUkZBQ0VTIi8qbm9uTkxTKi87DQorCQlzICs9ICJOVUxMIFNVUEVSSU5URVJGQUNFUyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KIAlpZiAoZW5jbG9zaW5nVHlwZSgpICE9IG51bGwpIHsNCi0JCXMgKz0gIlxuXHRlbmNsb3NpbmcgdHlwZSA6ICIvKm5vbk5MUyovOw0KKwkJcyArPSAiXG5cdGVuY2xvc2luZyB0eXBlIDogIjsgLy8kTk9OLU5MUy0xJA0KIAkJcyArPSBlbmNsb3NpbmdUeXBlKCkuZGVidWdOYW1lKCk7DQogCX0NCiANCiAJaWYgKGZpZWxkcyAhPSBudWxsKSB7DQogCQlpZiAoZmllbGRzICE9IE5vRmllbGRzKSB7DQotCQkJcyArPSAiXG4vKiAgIGZpZWxkcyAgICovIi8qbm9uTkxTKi87DQorCQkJcyArPSAiXG4vKiAgIGZpZWxkcyAgICovIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspDQotCQkJCXMgKz0gKGZpZWxkc1tpXSAhPSBudWxsKSA/ICJcbiIvKm5vbk5MUyovICsgZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIEZJRUxEIi8qbm9uTkxTKi87DQorCQkJCXMgKz0gKGZpZWxkc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBmaWVsZHNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgRklFTEQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0NCiAJfSBlbHNlIHsNCi0JCXMgKz0gIk5VTEwgRklFTERTIi8qbm9uTkxTKi87DQorCQlzICs9ICJOVUxMIEZJRUxEUyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KIAlpZiAobWV0aG9kcyAhPSBudWxsKSB7DQogCQlpZiAobWV0aG9kcyAhPSBOb01ldGhvZHMpIHsNCi0JCQlzICs9ICJcbi8qICAgbWV0aG9kcyAgICovIi8qbm9uTkxTKi87DQorCQkJcyArPSAiXG4vKiAgIG1ldGhvZHMgICAqLyI7IC8vJE5PTi1OTFMtMSQNCiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCi0JCQkJcyArPSAobWV0aG9kc1tpXSAhPSBudWxsKSA/ICJcbiIvKm5vbk5MUyovICsgbWV0aG9kc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBNRVRIT0QiLypub25OTFMqLzsNCisJCQkJcyArPSAobWV0aG9kc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBtZXRob2RzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIE1FVEhPRCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJfQ0KIAl9IGVsc2Ugew0KLQkJcyArPSAiTlVMTCBNRVRIT0RTIi8qbm9uTkxTKi87DQorCQlzICs9ICJOVUxMIE1FVEhPRFMiOyAvLyROT04tTkxTLTEkDQogCX0NCiANCiAJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsNCiAJCWlmIChtZW1iZXJUeXBlcyAhPSBOb01lbWJlclR5cGVzKSB7DQotCQkJcyArPSAiXG4vKiAgIG1lbWJlcnMgICAqLyIvKm5vbk5MUyovOw0KKwkJCXMgKz0gIlxuLyogICBtZW1iZXJzICAgKi8iOyAvLyROT04tTkxTLTEkDQogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KLQkJCQlzICs9IChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/ICJcbiIvKm5vbk5MUyovICsgbWVtYmVyVHlwZXNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgVFlQRSIvKm5vbk5MUyovOw0KKwkJCQlzICs9IChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQl9DQogCX0gZWxzZSB7DQotCQlzICs9ICJOVUxMIE1FTUJFUiBUWVBFUyIvKm5vbk5MUyovOw0KKwkJcyArPSAiTlVMTCBNRU1CRVIgVFlQRVMiOyAvLyROT04tTkxTLTEkDQogCX0NCiANCi0JcyArPSAiXG5cblxuIi8qbm9uTkxTKi87DQorCXMgKz0gIlxuXG5cbiI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIHZvaWQgdmVyaWZ5TWV0aG9kcyhNZXRob2RWZXJpZmllciB2ZXJpZmllcikgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKaW5kZXggY2VmOGZjMy4uZDBkYjEwNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIAkvLyBDb25zdGFudCBjb21wb3VuZCBuYW1lcw0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkcgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkd9Ow0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0lPID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBJT307DQorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkFzc2VydGlvbkVycm9yIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJA0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0xBU1MgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnQycsICdsJywgJ2EnLCAncycsICdzJ319Ow0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0xBU1NOT1RGT1VOREVYQ0VQVElPTiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgeydDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnTicsICdvJywgJ3QnLCAnRicsICdvJywgJ3UnLCAnbicsICdkJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJ319Ow0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0xPTkVBQkxFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J0MnLCAnbCcsICdvJywgJ24nLCAnZScsICdhJywgJ2InLCAnbCcsICdlJ319Ow0KQEAgLTMyLDE1ICszMywxNSBAQAogCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCB7J0MnLCAnbycsICduJywgJ3MnLCAndCcsICdyJywgJ3UnLCAnYycsICd0JywgJ28nLCAncid9fTsNCiAJZmluYWwgY2hhcltdW10gSkFWQV9JT19QUklOVFNUUkVBTSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgSU8sIHsnUCcsICdyJywgJ2knLCAnbicsICd0JywgJ1MnLCAndCcsICdyJywgJ2UnLCAnYScsICdtJ319Ow0KIAlmaW5hbCBjaGFyW11bXSBKQVZBX0lPX1NFUklBTElaQUJMRSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgSU8sIHsnUycsICdlJywgJ3InLCAnaScsICdhJywgJ2wnLCAnaScsICd6JywgJ2EnLCAnYicsICdsJywgJ2UnfX07DQotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19CWVRFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU0hPUlQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJTaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0hBUkFDVEVSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQ2hhcmFjdGVyIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19JTlRFR0VSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiSW50ZWdlciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfTE9ORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkxvbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0ZMT0FUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiRmxvYXQiLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0RPVUJMRSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkRvdWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQk9PTEVBTiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkJvb2xlYW4iLypub25OTFMqLy50b0NoYXJBcnJheSgpfTsNCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1ZPSUQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJWb2lkIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19CWVRFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQnl0ZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NIT1JUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiU2hvcnQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkDQorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19DSEFSQUNURVIgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJDaGFyYWN0ZXIiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkDQorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19JTlRFR0VSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiSW50ZWdlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0xPTkcgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJMb25nIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfRkxPQVQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJGbG9hdCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0RPVUJMRSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkRvdWJsZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0JPT0xFQU4gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJCb29sZWFuIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfVk9JRCA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIlZvaWQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkDQogDQogCS8vIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBmbG93IGFuYWx5c2lzDQogCWZpbmFsIGludCBFcXVhbE9yTW9yZVNwZWNpZmljID0gLTE7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQppbmRleCA4NjQ3NTIyLi42MWI2MzM2IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQpAQCAtNTIsNiArNTIsOSBAQAogCWZpbmFsIGludCBUX0phdmFMYW5nRG91YmxlID0gMzI7DQogCWZpbmFsIGludCBUX0phdmFMYW5nQm9vbGVhbiA9IDMzOw0KIAlmaW5hbCBpbnQgVF9KYXZhTGFuZ1ZvaWQgPSAzNDsNCisNCisJLy8gMS40IGZlYXR1cmUNCisJZmluYWwgaW50IFRfSmF2YUxhbmdBc3NlcnRpb25FcnJvciA9IDM1Ow0KIAlmaW5hbCBpbnQgTm9JZCA9IEludGVnZXIuTUFYX1ZBTFVFOw0KIA0KIAkvLyBpbXBsaWNpdCBjb252ZXJzaW9uczogPGNvbXBpbGVUeXBlPiB0byA8cnVudGltZVR5cGU+ICAobm90ZTogYm9vbGVhbnMgYXJlIGludGVnZXJzIGF0IHJ1bnRpbWUpDQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZy5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZy5qYXZhCmluZGV4IDBhZDFiZjEuLmI1OTIwMTEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEKQEAgLTMyLDYgKzMyLDYgQEAKIAlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24NCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJVbnJlc29sdmVkIHR5cGUgIi8qbm9uTkxTKi8gKyAoKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IENoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gIlVucmVzb2x2ZWQgdHlwZSAiICsgKChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1ZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IDZiZGFkMTIuLjUwMDZmYmEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9WYXJpYWJsZUJpbmRpbmcuamF2YQpAQCAtMjYsOSArMjYsOSBAQAogCXJldHVybiBuYW1lOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmcgcyA9ICh0eXBlICE9IG51bGwpID8gdHlwZS5kZWJ1Z05hbWUoKSA6ICJVTkRFRklORUQgVFlQRSIvKm5vbk5MUyovOw0KLQlzICs9ICIgIi8qbm9uTkxTKi87DQotCXMgKz0gKG5hbWUgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKG5hbWUpIDogIlVOTkFNRUQgRklFTEQiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAodHlwZSAhPSBudWxsKSA/IHR5cGUuZGVidWdOYW1lKCkgOiAiVU5ERUZJTkVEIFRZUEUiOyAvLyROT04tTkxTLTEkDQorCXMgKz0gIiAiOyAvLyROT04tTkxTLTEkDQorCXMgKz0gKG5hbWUgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKG5hbWUpIDogIlVOTkFNRUQgRklFTEQiOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyLmphdmEKaW5kZXggMTFhOWYzZS4uMWI5MTZhZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsNCiANCiBpbXBvcnQgamF2YS5pby4qOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KIA0KIHB1YmxpYyBjbGFzcyBQYXJzZXIgaW1wbGVtZW50cyBCaW5kaW5nSWRzLCBQYXJzZXJCYXNpY0luZm9ybWF0aW9uLCBUZXJtaW5hbFN5bWJvbHMsIENvbXBpbGVyTW9kaWZpZXJzLCBPcGVyYXRvcklkcywgVHlwZUlkcyB7DQogCXByb3RlY3RlZCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOw0KQEAgLTMzLDYgKzM0LDkgQEAKIAlwcm90ZWN0ZWQgaW50IGxhc3RJZ25vcmVkVG9rZW4sIG5leHRJZ25vcmVkVG9rZW47DQogCXByb3RlY3RlZCBpbnQgbGFzdEVycm9yRW5kUG9zaXRpb247DQogCQkNCisJLy8gMS40IGZlYXR1cmUNCisJcHJvdGVjdGVkIGJvb2xlYW4gYXNzZXJ0TW9kZSA9IGZhbHNlOw0KKwkNCiAJLy9pbnRlcm5hbCBkYXRhIGZvciB0aGUgYXV0b21hdCANCiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU3RhY2tJbmNyZW1lbnQgPSAyNTU7DQogCXByb3RlY3RlZCBpbnQgc3RhdGVTdGFja1RvcDsNCkBAIC03OCwyNzQgKzgyLDI3MCBAQAogCXByb3RlY3RlZCBpbnQgZGlldEludCA9IDA7IC8vIGlmID4gMCBmb3JjZSB0aGUgbm9uZS1kaWV0LXBhcnNpbmcgbW9kZSAoZXZlbiBpZiBkaWV0IGlmIHJlcXVlc3RlZCkgW2ZpZWxkIHBhcnNpbmcgd2l0aCBhbm9ueW1vdXMgaW5uZXIgY2xhc3Nlcy4uLl0NCiAJcHJvdGVjdGVkIGludFtdIHZhcmlhYmxlc0NvdW50ZXI7DQogCS8vPT09REFUQT09PURBVEE9PT1EQVRBPT09REFUQT09PURBVEE9PT1EQVRBPT09Ly8NCi0NCi0JcHVibGljIGZpbmFsIHN0YXRpYyBieXRlIHJoc1tdID0gezAsDQotCQkJMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsDQotCQkJMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsDQotCQkJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsDQotCQkJMiwyLDEsMSwxLDEsMyw0LDAsMSwyLDEsMSwxLDEsDQotCQkJMSwxLDEsMSwxLDUsMSwyLDEsMiwyLDIsMSwxLDIsDQotCQkJMiwyLDQsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsDQotCQkJMSwxLDEsMSwyLDMsMywyLDIsMSwzLDEsMywxLDIsDQotCQkJMSwxLDEsMywwLDEsMSwxLDEsMSwxLDEsNCwxLDMsDQotCQkJMyw3LDAsMCwwLDAsMCwyLDEsMSwxLDIsMiw0LDQsDQotCQkJNSw0LDQsMiwxLDIsMywzLDEsMywzLDEsMywxLDQsDQotCQkJMCwyLDEsMiw0LDEsMSwyLDUsNSw3LDcsNyw3LDIsDQotCQkJMiwzLDIsMiwzLDEsMiwxLDIsMSwxLDIsMiwxLDEsDQotCQkJMSwxLDEsMywzLDQsMSwzLDQsMCwxLDIsMSwxLDEsDQotCQkJMSwyLDMsNCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsDQotCQkJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwzLDMsDQotCQkJMiwxLDEsMSwxLDEsMSwxLDUsNyw3LDYsMiwzLDMsDQotCQkJNCwxLDIsMiwxLDIsMywyLDUsNSw3LDksOSwxLDEsDQotCQkJMSwxLDMsMiwzLDIsMywzLDMsNSwxLDMsNCwxLDIsDQotCQkJNSwyLDEsMSwxLDEsMSwxLDMsMSwxLDMsMywzLDMsDQotCQkJMywxLDEsNSw2LDgsNywyLDAsMiwwLDEsMyw0LDQsDQotCQkJMSwyLDMsMiwxLDEsMiwyLDMsMyw0LDYsNiw0LDQsDQotCQkJMSwxLDEsMSwyLDIsMCwxLDEsMywzLDEsMywzLDEsDQotCQkJMywzLDEsNSw1LDQsMSwzLDMsMywxLDMsMywxLDMsDQotCQkJMywzLDEsMywzLDMsMywzLDEsMywzLDEsMywxLDMsDQotCQkJMSwzLDEsMywxLDMsMSw1LDEsMSwzLDMsMSwxLDEsDQotCQkJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsDQotCQkJMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDEsMCwyLDAsDQotCQkJMSwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDIsDQotCQkJMCwwLDEsMCwxLDAsMSwwLDEsMCwxDQotCX07DQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSByaHNbXSA9IHswLA0KKyAgICAgICAgICAgIDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLA0KKyAgICAgICAgICAgIDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDIsMiwxLDEsMSwxLDMsNCwwLDEsMiwxLDEsMSwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMSw1LDEsMiwxLDIsMiwyLDEsMSwyLA0KKyAgICAgICAgICAgIDIsMiw0LDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMiwzLDMsMiwyLDEsMywxLDMsMSwyLA0KKyAgICAgICAgICAgIDEsMSwxLDMsMCwzLDEsMSwxLDEsMSwxLDEsNCwxLA0KKyAgICAgICAgICAgIDMsMyw3LDAsMCwwLDAsMCwyLDEsMSwxLDIsMiw0LA0KKyAgICAgICAgICAgIDQsNSw0LDQsMiwxLDIsMywzLDEsMywzLDEsMywxLA0KKyAgICAgICAgICAgIDQsMCwyLDEsMiw0LDEsMSwyLDUsNSw3LDcsNyw3LA0KKyAgICAgICAgICAgIDIsMiwzLDIsMiwzLDEsMiwxLDIsMSwxLDIsMiwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMywzLDQsMSwzLDQsMCwxLDIsMSwxLA0KKyAgICAgICAgICAgIDEsMSwyLDMsNCwwLDEsMSwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDMsMywyLDEsMSwxLDEsMSwxLDEsNSw3LDcsNiwyLA0KKyAgICAgICAgICAgIDMsMyw0LDEsMiwyLDEsMiwzLDIsNSw1LDcsOSw5LA0KKyAgICAgICAgICAgIDEsMSwxLDEsMywzLDUsMiwzLDIsMywzLDMsNSwxLA0KKyAgICAgICAgICAgIDMsNCwxLDIsNSwyLDEsMSwxLDEsMSwxLDMsMSwxLA0KKyAgICAgICAgICAgIDMsMywzLDMsMywxLDEsNSw2LDgsNywyLDAsMiwwLA0KKyAgICAgICAgICAgIDEsMyw0LDQsMSwyLDMsMiwxLDEsMiwyLDMsMyw0LA0KKyAgICAgICAgICAgIDYsNiw0LDQsMSwxLDEsMSwyLDIsMCwxLDEsMywzLA0KKyAgICAgICAgICAgIDEsMywzLDEsMywzLDEsNSw1LDQsMSwzLDMsMywxLA0KKyAgICAgICAgICAgIDMsMywxLDMsMywzLDEsMywzLDMsMywzLDEsMywzLA0KKyAgICAgICAgICAgIDEsMywxLDMsMSwzLDEsMywxLDMsMSw1LDEsMSwzLA0KKyAgICAgICAgICAgIDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLA0KKyAgICAgICAgICAgIDEsMSwxLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLA0KKyAgICAgICAgICAgIDEsMCwyLDAsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLA0KKyAgICAgICAgICAgIDAsMSwwLDIsMCwwLDEsMCwxLDAsMSwwLDEsMCwxDQorICAgIH07DQogCQkNCiAJcHVibGljICBzdGF0aWMgY2hhciBhc2JbXSA9IG51bGw7DQogCXB1YmxpYyAgc3RhdGljIGNoYXIgYXNyW10gPSBudWxsOw0KIAlwdWJsaWMgIHN0YXRpYyBjaGFyIHN5bWJvbF9pbmRleFtdID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORVhQRUNURURfRU9GID0gIlVuZXhwZWN0ZWQgRW5kIE9mIEZpbGUiLypub25OTFMqLyA7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX0VPRiA9ICJVbmV4cGVjdGVkIEVuZCBPZiBGaWxlIiA7IC8vJE5PTi1OTFMtMSQNCiANCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbmFtZVtdID0geyBudWxsLA0KLQkJCSIrKyIvKm5vbk5MUyovLA0KLQkJCSItLSIvKm5vbk5MUyovLA0KLQkJCSI9PSIvKm5vbk5MUyovLA0KLQkJCSI8PSIvKm5vbk5MUyovLA0KLQkJCSI+PSIvKm5vbk5MUyovLA0KLQkJCSIhPSIvKm5vbk5MUyovLA0KLQkJCSI8PCIvKm5vbk5MUyovLA0KLQkJCSI+PiIvKm5vbk5MUyovLA0KLQkJCSI+Pj4iLypub25OTFMqLywNCi0JCQkiKz0iLypub25OTFMqLywNCi0JCQkiLT0iLypub25OTFMqLywNCi0JCQkiKj0iLypub25OTFMqLywNCi0JCQkiLz0iLypub25OTFMqLywNCi0JCQkiJj0iLypub25OTFMqLywNCi0JCQkifD0iLypub25OTFMqLywNCi0JCQkiXj0iLypub25OTFMqLywNCi0JCQkiJT0iLypub25OTFMqLywNCi0JCQkiPDw9Ii8qbm9uTkxTKi8sDQotCQkJIj4+PSIvKm5vbk5MUyovLA0KLQkJCSI+Pj49Ii8qbm9uTkxTKi8sDQotCQkJInx8Ii8qbm9uTkxTKi8sDQotCQkJIiYmIi8qbm9uTkxTKi8sDQotCQkJIisiLypub25OTFMqLywNCi0JCQkiLSIvKm5vbk5MUyovLA0KLQkJCSIhIi8qbm9uTkxTKi8sDQotCQkJIiUiLypub25OTFMqLywNCi0JCQkiXiIvKm5vbk5MUyovLA0KLQkJCSImIi8qbm9uTkxTKi8sDQotCQkJIioiLypub25OTFMqLywNCi0JCQkifCIvKm5vbk5MUyovLA0KLQkJCSJ+Ii8qbm9uTkxTKi8sDQotCQkJIi8iLypub25OTFMqLywNCi0JCQkiPiIvKm5vbk5MUyovLA0KLQkJCSI8Ii8qbm9uTkxTKi8sDQotCQkJIigiLypub25OTFMqLywNCi0JCQkiKSIvKm5vbk5MUyovLA0KLQkJCSJ7Ii8qbm9uTkxTKi8sDQotCQkJIn0iLypub25OTFMqLywNCi0JCQkiWyIvKm5vbk5MUyovLA0KLQkJCSJdIi8qbm9uTkxTKi8sDQotCQkJIjsiLypub25OTFMqLywNCi0JCQkiPyIvKm5vbk5MUyovLA0KLQkJCSI6Ii8qbm9uTkxTKi8sDQotCQkJIiwiLypub25OTFMqLywNCi0JCQkiLiIvKm5vbk5MUyovLA0KLQkJCSI9Ii8qbm9uTkxTKi8sDQotCQkJIiIvKm5vbk5MUyovLA0KLQkJCSIkZW1wdHkiLypub25OTFMqLywNCi0JCQkiSWRlbnRpZmllciIvKm5vbk5MUyovLA0KLQkJCSJhYnN0cmFjdCIvKm5vbk5MUyovLA0KLQkJCSJib29sZWFuIi8qbm9uTkxTKi8sDQotCQkJImJyZWFrIi8qbm9uTkxTKi8sDQotCQkJImJ5dGUiLypub25OTFMqLywNCi0JCQkiY2FzZSIvKm5vbk5MUyovLA0KLQkJCSJjYXRjaCIvKm5vbk5MUyovLA0KLQkJCSJjaGFyIi8qbm9uTkxTKi8sDQotCQkJImNsYXNzIi8qbm9uTkxTKi8sDQotCQkJImNvbnRpbnVlIi8qbm9uTkxTKi8sDQotCQkJImRlZmF1bHQiLypub25OTFMqLywNCi0JCQkiZG8iLypub25OTFMqLywNCi0JCQkiZG91YmxlIi8qbm9uTkxTKi8sDQotCQkJImVsc2UiLypub25OTFMqLywNCi0JCQkiZXh0ZW5kcyIvKm5vbk5MUyovLA0KLQkJCSJmYWxzZSIvKm5vbk5MUyovLA0KLQkJCSJmaW5hbCIvKm5vbk5MUyovLA0KLQkJCSJmaW5hbGx5Ii8qbm9uTkxTKi8sDQotCQkJImZsb2F0Ii8qbm9uTkxTKi8sDQotCQkJImZvciIvKm5vbk5MUyovLA0KLQkJCSJpZiIvKm5vbk5MUyovLA0KLQkJCSJpbXBsZW1lbnRzIi8qbm9uTkxTKi8sDQotCQkJImltcG9ydCIvKm5vbk5MUyovLA0KLQkJCSJpbnN0YW5jZW9mIi8qbm9uTkxTKi8sDQotCQkJImludCIvKm5vbk5MUyovLA0KLQkJCSJpbnRlcmZhY2UiLypub25OTFMqLywNCi0JCQkibG9uZyIvKm5vbk5MUyovLA0KLQkJCSJuYXRpdmUiLypub25OTFMqLywNCi0JCQkibmV3Ii8qbm9uTkxTKi8sDQotCQkJIm51bGwiLypub25OTFMqLywNCi0JCQkicGFja2FnZSIvKm5vbk5MUyovLA0KLQkJCSJwcml2YXRlIi8qbm9uTkxTKi8sDQotCQkJInByb3RlY3RlZCIvKm5vbk5MUyovLA0KLQkJCSJwdWJsaWMiLypub25OTFMqLywNCi0JCQkicmV0dXJuIi8qbm9uTkxTKi8sDQotCQkJInNob3J0Ii8qbm9uTkxTKi8sDQotCQkJInN0YXRpYyIvKm5vbk5MUyovLA0KLQkJCSJzdHJpY3RmcCIvKm5vbk5MUyovLA0KLQkJCSJzdXBlciIvKm5vbk5MUyovLA0KLQkJCSJzd2l0Y2giLypub25OTFMqLywNCi0JCQkic3luY2hyb25pemVkIi8qbm9uTkxTKi8sDQotCQkJInRoaXMiLypub25OTFMqLywNCi0JCQkidGhyb3ciLypub25OTFMqLywNCi0JCQkidGhyb3dzIi8qbm9uTkxTKi8sDQotCQkJInRyYW5zaWVudCIvKm5vbk5MUyovLA0KLQkJCSJ0cnVlIi8qbm9uTkxTKi8sDQotCQkJInRyeSIvKm5vbk5MUyovLA0KLQkJCSJ2b2lkIi8qbm9uTkxTKi8sDQotCQkJInZvbGF0aWxlIi8qbm9uTkxTKi8sDQotCQkJIndoaWxlIi8qbm9uTkxTKi8sDQotCQkJIkludGVnZXJMaXRlcmFsIi8qbm9uTkxTKi8sDQotCQkJIkxvbmdMaXRlcmFsIi8qbm9uTkxTKi8sDQotCQkJIkZsb2F0aW5nUG9pbnRMaXRlcmFsIi8qbm9uTkxTKi8sDQotCQkJIkRvdWJsZUxpdGVyYWwiLypub25OTFMqLywNCi0JCQkiQ2hhcmFjdGVyTGl0ZXJhbCIvKm5vbk5MUyovLA0KLQkJCSJTdHJpbmdMaXRlcmFsIi8qbm9uTkxTKi8sDQotICAJCQlVTkVYUEVDVEVEX0VPRiwNCi0JCQkiSW52YWxpZCBDaGFyYWN0ZXIiLypub25OTFMqLywNCi0JCQkiR29hbCIvKm5vbk5MUyovLA0KLQkJCSJNZXRob2RCb2R5Ii8qbm9uTkxTKi8sDQotCQkJIkNvbnN0cnVjdG9yQm9keSIvKm5vbk5MUyovLA0KLQkJCSJTdGF0aWNJbml0aWFsaXplciIvKm5vbk5MUyovLA0KLQkJCSJDbGFzc0JvZHlEZWNsYXJhdGlvbiIvKm5vbk5MUyovLA0KLQkJCSJIZWFkZXJzIi8qbm9uTkxTKi8sDQotCQkJIkJsb2NrU3RhdGVtZW50cyIvKm5vbk5MUyovLA0KLQkJCSJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIi8qbm9uTkxTKi8sDQotCQkJIkNhdGNoSGVhZGVyIi8qbm9uTkxTKi8sDQotCQkJIkZpZWxkRGVjbGFyYXRpb24iLypub25OTFMqLywNCi0JCQkiSW1wb3J0RGVjbGFyYXRpb24iLypub25OTFMqLywNCi0JCQkiUGFja2FnZURlY2xhcmF0aW9uIi8qbm9uTkxTKi8sDQotCQkJIlR5cGVEZWNsYXJhdGlvbiIvKm5vbk5MUyovLA0KLQkJCSJHZW5lcmljTWV0aG9kRGVjbGFyYXRpb24iLypub25OTFMqLywNCi0JCQkiRXhwcmVzc2lvbiIvKm5vbk5MUyovLA0KLQkJCSJUeXBlIi8qbm9uTkxTKi8sDQotCQkJIlByaW1pdGl2ZVR5cGUiLypub25OTFMqLywNCi0JCQkiUmVmZXJlbmNlVHlwZSIvKm5vbk5MUyovLA0KLQkJCSJDbGFzc09ySW50ZXJmYWNlVHlwZSIvKm5vbk5MUyovLA0KLQkJCSJBcnJheVR5cGUiLypub25OTFMqLywNCi0JCQkiTmFtZSIvKm5vbk5MUyovLA0KLQkJCSJEaW1zIi8qbm9uTkxTKi8sDQotCQkJIkNsYXNzVHlwZSIvKm5vbk5MUyovLA0KLQkJCSJTaW1wbGVOYW1lIi8qbm9uTkxTKi8sDQotCQkJIkhlYWRlciIvKm5vbk5MUyovLA0KLQkJCSJDbGFzc0hlYWRlciIvKm5vbk5MUyovLA0KLQkJCSJJbnRlcmZhY2VIZWFkZXIiLypub25OTFMqLywNCi0JCQkiTWV0aG9kSGVhZGVyIi8qbm9uTkxTKi8sDQotCQkJIkNvbnN0cnVjdG9ySGVhZGVyIi8qbm9uTkxTKi8sDQotCQkJIkZvcm1hbFBhcmFtZXRlciIvKm5vbk5MUyovLA0KLQkJCSJJbXBvcnREZWNsYXJhdGlvbnMiLypub25OTFMqLywNCi0JCQkiVHlwZURlY2xhcmF0aW9ucyIvKm5vbk5MUyovLA0KLQkJCSJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIi8qbm9uTkxTKi8sDQotCQkJIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbSIvKm5vbk5MUyovICsNCi0JCQkiZSIvKm5vbk5MUyovLA0KLQkJCSJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk4iLypub25OTFMqLyArDQotCQkJImFtZSIvKm5vbk5MUyovLA0KLQkJCSJNb2RpZmllcnMiLypub25OTFMqLywNCi0JCQkiTW9kaWZpZXIiLypub25OTFMqLywNCi0JCQkiQ2xhc3NCb2R5Ii8qbm9uTkxTKi8sDQotCQkJIkNsYXNzSGVhZGVyTmFtZSIvKm5vbk5MUyovLA0KLQkJCSJJbnRlcmZhY2VUeXBlTGlzdCIvKm5vbk5MUyovLA0KLQkJCSJJbnRlcmZhY2VUeXBlIi8qbm9uTkxTKi8sDQotCQkJIkNsYXNzQm9keURlY2xhcmF0aW9ucyIvKm5vbk5MUyovLA0KLQkJCSJCbG9jayIvKm5vbk5MUyovLA0KLQkJCSJWYXJpYWJsZURlY2xhcmF0b3JzIi8qbm9uTkxTKi8sDQotCQkJIlZhcmlhYmxlRGVjbGFyYXRvciIvKm5vbk5MUyovLA0KLQkJCSJWYXJpYWJsZURlY2xhcmF0b3JJZCIvKm5vbk5MUyovLA0KLQkJCSJWYXJpYWJsZUluaXRpYWxpemVyIi8qbm9uTkxTKi8sDQotCQkJIkFycmF5SW5pdGlhbGl6ZXIiLypub25OTFMqLywNCi0JCQkiTWV0aG9kSGVhZGVyTmFtZSIvKm5vbk5MUyovLA0KLQkJCSJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIi8qbm9uTkxTKi8sDQotCQkJIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIi8qbm9uTkxTKi8sDQotCQkJIkNsYXNzVHlwZUxpc3QiLypub25OTFMqLywNCi0JCQkiQ29uc3RydWN0b3JIZWFkZXJOYW1lIi8qbm9uTkxTKi8sDQotCQkJIkZvcm1hbFBhcmFtZXRlckxpc3QiLypub25OTFMqLywNCi0JCQkiQ2xhc3NUeXBlRWx0Ii8qbm9uTkxTKi8sDQotCQkJIlN0YXRpY09ubHkiLypub25OTFMqLywNCi0JCQkiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24iLypub25OTFMqLywNCi0JCQkiUHJpbWFyeSIvKm5vbk5MUyovLA0KLQkJCSJJbnRlcmZhY2VCb2R5Ii8qbm9uTkxTKi8sDQotCQkJIkludGVyZmFjZUhlYWRlck5hbWUiLypub25OTFMqLywNCi0JCQkiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIi8qbm9uTkxTKi8sDQotCQkJIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIi8qbm9uTkxTKi8sDQotCQkJIlZhcmlhYmxlSW5pdGlhbGl6ZXJzIi8qbm9uTkxTKi8sDQotCQkJIkJsb2NrU3RhdGVtZW50Ii8qbm9uTkxTKi8sDQotCQkJIlN0YXRlbWVudCIvKm5vbk5MUyovLA0KLQkJCSJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24iLypub25OTFMqLywNCi0JCQkiU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhIi8qbm9uTkxTKi8gKw0KLQkJCSJ0ZW1lbnQiLypub25OTFMqLywNCi0JCQkiU3RhdGVtZW50Tm9TaG9ydElmIi8qbm9uTkxTKi8sDQotCQkJIlN0YXRlbWVudEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiUG9zdEluY3JlbWVudEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiUG9zdERlY3JlbWVudEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiTWV0aG9kSW52b2NhdGlvbiIvKm5vbk5MUyovLA0KLQkJCSJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW8iLypub25OTFMqLyArDQotCQkJIm4iLypub25OTFMqLywNCi0JCQkiU3dpdGNoQmxvY2siLypub25OTFMqLywNCi0JCQkiU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIi8qbm9uTkxTKi8sDQotCQkJIlN3aXRjaExhYmVscyIvKm5vbk5MUyovLA0KLQkJCSJTd2l0Y2hCbG9ja1N0YXRlbWVudCIvKm5vbk5MUyovLA0KLQkJCSJTd2l0Y2hMYWJlbCIvKm5vbk5MUyovLA0KLQkJCSJDb25zdGFudEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QiLypub25OTFMqLywNCi0JCQkiT25seVN5bmNocm9uaXplZCIvKm5vbk5MUyovLA0KLQkJCSJDYXRjaGVzIi8qbm9uTkxTKi8sDQotCQkJIkZpbmFsbHkiLypub25OTFMqLywNCi0JCQkiQ2F0Y2hDbGF1c2UiLypub25OTFMqLywNCi0JCQkiUHVzaExQQVJFTiIvKm5vbk5MUyovLA0KLQkJCSJQdXNoUlBBUkVOIi8qbm9uTkxTKi8sDQotCQkJIlByaW1hcnlOb05ld0FycmF5Ii8qbm9uTkxTKi8sDQotCQkJIkZpZWxkQWNjZXNzIi8qbm9uTkxTKi8sDQotCQkJIkFycmF5QWNjZXNzIi8qbm9uTkxTKi8sDQotCQkJIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3NpbyIvKm5vbk5MUyovICsNCi0JCQkibk5hbWUiLypub25OTFMqLywNCi0JCQkiQXJndW1lbnRMaXN0Ii8qbm9uTkxTKi8sDQotCQkJIkRpbVdpdGhPcldpdGhPdXRFeHBycyIvKm5vbk5MUyovLA0KLQkJCSJEaW1XaXRoT3JXaXRoT3V0RXhwciIvKm5vbk5MUyovLA0KLQkJCSJEaW1zTG9vcCIvKm5vbk5MUyovLA0KLQkJCSJPbmVEaW1Mb29wIi8qbm9uTkxTKi8sDQotCQkJIlBvc3RmaXhFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIlVuYXJ5RXhwcmVzc2lvbiIvKm5vbk5MUyovLA0KLQkJCSJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLypub25OTFMqLywNCi0JCQkiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIkFkZGl0aXZlRXhwcmVzc2lvbiIvKm5vbk5MUyovLA0KLQkJCSJTaGlmdEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiUmVsYXRpb25hbEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiRXF1YWxpdHlFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIkFuZEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiRXhjbHVzaXZlT3JFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiIvKm5vbk5MUyovLA0KLQkJCSJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24iLypub25OTFMqLywNCi0JCQkiQ29uZGl0aW9uYWxFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIkFzc2lnbm1lbnRFeHByZXNzaW9uIi8qbm9uTkxTKi8sDQotCQkJIkxlZnRIYW5kU2lkZSIvKm5vbk5MUyovLA0KLQkJCSJBc3NpZ25tZW50T3BlcmF0b3IiLypub25OTFMqLw0KLQl9Ow0KLQ0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBuYW1lW10gPSB7IG51bGwsDQorICAgICAgICAgICAgIisrIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICItLSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiPT0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjw9IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICI+PSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiIT0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjw8IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICI+PiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiPj4+IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICIrPSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiLT0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIio9IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICIvPSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiJj0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInw9IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJePSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiJT0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjw8PSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiPj49IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICI+Pj49IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJ8fCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiJiYiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIisiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIi0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIiEiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIiUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIl4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIiYiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIioiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIn4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIi8iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIj4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIigiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIikiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInsiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIn0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlsiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIl0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjsiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIj8iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIjoiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIiwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIi4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIj0iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiJGVtcHR5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJZGVudGlmaWVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJhYnN0cmFjdCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiYXNzZXJ0IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJib29sZWFuIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJicmVhayIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiYnl0ZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiY2FzZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiY2F0Y2giLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgImNoYXIiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgImNsYXNzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJjb250aW51ZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZGVmYXVsdCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZG8iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgImRvdWJsZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZWxzZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZXh0ZW5kcyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZmFsc2UiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgImZpbmFsIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJmaW5hbGx5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJmbG9hdCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiZm9yIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJpZiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiaW1wbGVtZW50cyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiaW1wb3J0IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJpbnN0YW5jZW9mIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJpbnQiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAibG9uZyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAibmF0aXZlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJuZXciLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIm51bGwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInBhY2thZ2UiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInByaXZhdGUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInByb3RlY3RlZCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAicHVibGljIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJyZXR1cm4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInNob3J0IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJzdGF0aWMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInN0cmljdGZwIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJzdXBlciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAic3dpdGNoIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInRoaXMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInRocm93IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJ0aHJvd3MiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgInRyYW5zaWVudCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAidHJ1ZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAidHJ5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJ2b2lkIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJ2b2xhdGlsZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAid2hpbGUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkludGVnZXJMaXRlcmFsIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJMb25nTGl0ZXJhbCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiRmxvYXRpbmdQb2ludExpdGVyYWwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkRvdWJsZUxpdGVyYWwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkNoYXJhY3RlckxpdGVyYWwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN0cmluZ0xpdGVyYWwiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgVU5FWFBFQ1RFRF9FT0YsDQorICAgICAgICAgICAgIkludmFsaWQgQ2hhcmFjdGVyIiwgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJHb2FsIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RCb2R5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDb25zdHJ1Y3RvckJvZHkiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN0YXRpY0luaXRpYWxpemVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbml0aWFsaXplciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiSGVhZGVycyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQmxvY2tTdGF0ZW1lbnRzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDYXRjaEhlYWRlciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiRmllbGREZWNsYXJhdGlvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiSW1wb3J0RGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlBhY2thZ2VEZWNsYXJhdGlvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiVHlwZURlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJHZW5lcmljTWV0aG9kRGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkNsYXNzQm9keURlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJUeXBlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJQcmltaXRpdmVUeXBlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJSZWZlcmVuY2VUeXBlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc09ySW50ZXJmYWNlVHlwZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQXJyYXlUeXBlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJOYW1lIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJEaW1zIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc1R5cGUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlNpbXBsZU5hbWUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkhlYWRlciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ2xhc3NIZWFkZXIiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkludGVyZmFjZUhlYWRlciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiTWV0aG9kSGVhZGVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDb25zdHJ1Y3RvckhlYWRlciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiRm9ybWFsUGFyYW1ldGVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbXBvcnREZWNsYXJhdGlvbnMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbnMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlBhY2thZ2VEZWNsYXJhdGlvbk5hbWUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiTW9kaWZpZXJzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNb2RpZmllciIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ2xhc3NCb2R5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc0hlYWRlck5hbWUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkludGVyZmFjZVR5cGVMaXN0IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbnRlcmZhY2VUeXBlIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc0JvZHlEZWNsYXJhdGlvbnMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkJsb2NrIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3JzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvcklkIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJWYXJpYWJsZUluaXRpYWxpemVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJBcnJheUluaXRpYWxpemVyIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RIZWFkZXJOYW1lIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ2xhc3NUeXBlTGlzdCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ29uc3RydWN0b3JIZWFkZXJOYW1lIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJGb3JtYWxQYXJhbWV0ZXJMaXN0IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc1R5cGVFbHQiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN0YXRpY09ubHkiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJQcmltYXJ5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbnRlcmZhY2VCb2R5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbnRlcmZhY2VIZWFkZXJOYW1lIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJWYXJpYWJsZUluaXRpYWxpemVycyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQmxvY2tTdGF0ZW1lbnQiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN0YXRlbWVudCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN0YXRlbWVudE5vU2hvcnRJZiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiU3RhdGVtZW50RXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiUG9zdEluY3JlbWVudEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJNZXRob2RJbnZvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTd2l0Y2hCbG9jayIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTd2l0Y2hMYWJlbHMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTd2l0Y2hMYWJlbCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ29uc3RhbnRFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiT25seVN5bmNocm9uaXplZCIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ2F0Y2hlcyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiRmluYWxseSIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQ2F0Y2hDbGF1c2UiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlB1c2hMUEFSRU4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlB1c2hSUEFSRU4iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlByaW1hcnlOb05ld0FycmF5IiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJGaWVsZEFjY2VzcyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQXJyYXlBY2Nlc3MiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJBcmd1bWVudExpc3QiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHBycyIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiRGltV2l0aE9yV2l0aE91dEV4cHIiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkRpbXNMb29wIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJPbmVEaW1Mb29wIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJQb3N0Zml4RXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiVW5hcnlFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiQWRkaXRpdmVFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJTaGlmdEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJFcXVhbGl0eUV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkFuZEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAiSW5jbHVzaXZlT3JFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJDb25kaXRpb25hbEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICJMZWZ0SGFuZFNpZGUiLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgIkFzc2lnbm1lbnRPcGVyYXRvciIgLy8kTk9OLU5MUy0xJA0KKyAgICB9Ow0KKyAgICANCiAJcHVibGljICBzdGF0aWMgc2hvcnQgY2hlY2tfdGFibGVbXSA9IG51bGw7DQogCXB1YmxpYyAgc3RhdGljIGNoYXIgbGhzW10gPSAgbnVsbDsNCiAJcHVibGljICBzdGF0aWMgY2hhciBhY3Rpb25bXSA9IGxoczsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVQUkVGSVggPSAicGFyc2VyIi8qbm9uTkxTKi87DQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFUFJFRklYID0gInBhcnNlciI7IC8vJE5PTi1OTFMtMSQNCiANCiAJc3RhdGljIHsNCiAJCXRyeXsNCkBAIC0zNjMsOSArMzYzLDEzIEBACiAJdGhpcyhwcm9ibGVtUmVwb3J0ZXIsIGZhbHNlKTsNCiB9DQogcHVibGljIFBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIG9wdGltaXplU3RyaW5nTGl0ZXJhbHMpIHsNCisJdGhpcyhwcm9ibGVtUmVwb3J0ZXIsIGZhbHNlLCBmYWxzZSk7DQorfQ0KK3B1YmxpYyBQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgYm9vbGVhbiBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLCBib29sZWFuIGFzc2VydE1vZGUpIHsNCiAJCQ0KIAl0aGlzLnByb2JsZW1SZXBvcnRlciA9IHByb2JsZW1SZXBvcnRlcjsNCiAJdGhpcy5vcHRpbWl6ZVN0cmluZ0xpdGVyYWxzID0gb3B0aW1pemVTdHJpbmdMaXRlcmFsczsNCisJdGhpcy5hc3NlcnRNb2RlID0gYXNzZXJ0TW9kZTsNCiAJdGhpcy5pbml0aWFsaXplU2Nhbm5lcigpOw0KIAlhc3RMZW5ndGhTdGFjayA9IG5ldyBpbnRbNTBdOw0KIAlleHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50WzMwXTsNCkBAIC00MjgsNyArNDMyLDcgQEAKIAljaGFyW10gY2hhcnMgPSBuZXcgY2hhclt0b2tlbnMubGVuZ3RoXTsgLy9jYW4ndCBiZSBiaWdnZXINCiAJaW50IGljID0gMDsNCiAJU3RyaW5nIHRva2VuOw0KLQl3aGlsZSAoISh0b2tlbiA9IHRva2Vuc1tpKytdKS5lcXVhbHMoIn0iLypub25OTFMqLykpIHsNCisJd2hpbGUgKCEodG9rZW4gPSB0b2tlbnNbaSsrXSkuZXF1YWxzKCJ9IikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuKTsNCiAJCWlmIChpc1Nob3J0KQ0KIAkJCWMgKz0gMzI3Njg7DQpAQCAtNDcxLDExICs0NzUsMTEgQEAKIAkJcmVhZGVyLnJlYWQoY29udGVudHMsIDAsIGNvbnRlbnRzLmxlbmd0aCk7DQogCQlyZWFkZXIuY2xvc2UoKTsNCiAJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoInBhcnNlci5pbmNvcnJlY3RQYXRoIi8qbm9uTkxTKi8pKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoInBhcnNlci5pbmNvcnJlY3RQYXRoIikpOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm47DQogCX0NCiAJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBzdCA9IA0KLQkJbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIobmV3IFN0cmluZyhjb250ZW50cyksICIgXHRcblxyW109eyw7Ii8qbm9uTkxTKi8pOyANCisJCW5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKG5ldyBTdHJpbmcoY29udGVudHMpLCAiIFx0XG5ccltdPXssOyIpOyAgLy8kTk9OLU5MUy0xJA0KIAlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOw0KIAlpbnQgaSA9IDA7DQogCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsNCkBAIC00ODMsMTIgKzQ4NywxMiBAQAogCX0NCiAJZmluYWwgU3RyaW5nIHByZWZpeCA9IEZJTEVQUkVGSVg7DQogCWkgPSAwOw0KLQlidWlsZEZpbGVGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIvKm5vbk5MUyovLCAibGhzIi8qbm9uTkxTKi8sIHRva2VucywgZmFsc2UpOw0KLQlidWlsZEZpbGVGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIvKm5vbk5MUyovLCAiY2hlY2tfdGFibGUiLypub25OTFMqLywgdG9rZW5zLCB0cnVlKTsNCi0JYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLypub25OTFMqLywgImFzYiIvKm5vbk5MUyovLCB0b2tlbnMsIGZhbHNlKTsNCi0JYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLypub25OTFMqLywgImFzciIvKm5vbk5MUyovLCB0b2tlbnMsIGZhbHNlKTsNCi0JYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLypub25OTFMqLywgInN5bWJvbF9pbmRleCIvKm5vbk5MUyovLCB0b2tlbnMsIGZhbHNlKTsNCi0JU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgicGFyc2VyLm1vdmVGaWxlcyIvKm5vbk5MUyovKSk7DQorCWJ1aWxkRmlsZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImxocyIsIHRva2VucywgZmFsc2UpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAiY2hlY2tfdGFibGUiLCB0b2tlbnMsIHRydWUpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAiYXNiIiwgdG9rZW5zLCBmYWxzZSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KKwlidWlsZEZpbGVGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJhc3IiLCB0b2tlbnMsIGZhbHNlKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQorCWJ1aWxkRmlsZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInN5bWJvbF9pbmRleCIsIHRva2VucywgZmFsc2UpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgicGFyc2VyLm1vdmVGaWxlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKg0KICAqIEJ1aWxkIGluaXRpYWwgcmVjb3Zlcnkgc3RhdGUuDQpAQCAtNTMzLDcgKzUzNyw4IEBACiAJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0Ow0KIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsNCiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSB0eXBlLmZpZWxkc1tpXTsJCQkJCQ0KLQkJCQkJaWYgKGZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gc2Nhbm5lci5pbml0aWFsUG9zaXRpb24NCisJCQkJCWlmICghZmllbGQuaXNGaWVsZCgpDQorCQkJCQkJJiYgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSBzY2FubmVyLmluaXRpYWxQb3NpdGlvbg0KIAkJCQkJCSYmIHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uIDw9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kDQogCQkJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsNCiAJCQkJCQllbGVtZW50ID0gbmV3IFJlY292ZXJlZEluaXRpYWxpemVyKChJbml0aWFsaXplcikgZmllbGQsIG51bGwsIDEsIHRoaXMpOw0KQEAgLTYxMyw4ICs2MTgsOCBAQAogICovDQogcHVibGljIGJvb2xlYW4gY2hlY2tBbmRSZXBvcnRCcmFja2V0QW5vbWFsaWVzKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsNCiANCisJc2Nhbm5lci53YXNBY3IgPSBmYWxzZTsNCiAJYm9vbGVhbiBhbm9tYWxpZXNEZXRlY3RlZCA9IGZhbHNlOwkNCi0JdGhpcy5zY2FubmVyLndhc0FjciA9IGZhbHNlOw0KIAl0cnkgew0KIAkJY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KIAkJaW50W10gbGVmdENvdW50ID0gezAsIDAsIDB9Ow0KQEAgLTExNDMsNiArMTE0OCwxMyBAQAogDQogCWFycmF5SW5pdGlhbGl6ZXIoZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pOw0KIH0NCisNCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXNzZXJ0U3RhdGVtZW50KCkgew0KKwkvLyBBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzonIEV4cHJlc3Npb24gJzsnDQorCWV4cHJlc3Npb25MZW5ndGhQdHItPTI7DQorCXB1c2hPbkFzdFN0YWNrKG5ldyBBc3NlcnRTdGF0ZW1lbnQoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsNCit9DQorDQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFzc2lnbm1lbnQoKSB7DQogCS8vIEFzc2lnbm1lbnQgOjo9IExlZnRIYW5kU2lkZSBBc3NpZ25tZW50T3BlcmF0b3IgQXNzaWdubWVudEV4cHJlc3Npb24NCiAJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3ANCkBAIC0xMzc5LDYgKzEzOTEsOSBAQAogCX0NCiANCiAJLy9hbHdheXMgYWRkIDxjbGluaXQ+ICh3aWxsIGJlIHJlbW92ZSBhdCBjb2RlIGdlbiB0aW1lIGlmIGVtcHR5KQ0KKwlpZiAodGhpcy5zY2FubmVyLmNvbnRhaW5zQXNzZXJ0S2V5d29yZCkgew0KKwkJdHlwZURlY2wuYml0cyB8PSBTdGF0ZW1lbnQuQWRkQXNzZXJ0aW9uTUFTSzsNCisJfQ0KIAl0eXBlRGVjbC5hZGRDbGluaXQoKTsNCiAJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOyANCiB9DQpAQCAtMjExNyw2ICsyMTMyLDkgQEAKIAl0eXBlRGVjbC5jaGVja0NvbnN0cnVjdG9ycyh0aGlzKTsNCiAJDQogCS8vYWx3YXlzIGFkZCA8Y2xpbml0PiAod2lsbCBiZSByZW1vdmUgYXQgY29kZSBnZW4gdGltZSBpZiBlbXB0eSkNCisJaWYgKHRoaXMuc2Nhbm5lci5jb250YWluc0Fzc2VydEtleXdvcmQpIHsNCisJCXR5cGVEZWNsLmJpdHMgfD0gU3RhdGVtZW50LkFkZEFzc2VydGlvbk1BU0s7DQorCX0NCiAJdHlwZURlY2wuYWRkQ2xpbml0KCk7DQogCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hBbm5vdGF0aW9uc0RlZmluZWRQcmlvclRvKGVuZFN0YXRlbWVudFBvc2l0aW9uKTsgDQogfQ0KQEAgLTI2OTksNjYyICsyNzE3LDY3OCBAQAogCS8vIFB1c2hSUEFSRU4gOjo9ICcpJw0KIAlwdXNoT25JbnRTdGFjayhyUGFyZW5Qb3MpOw0KIH0NCi0vLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5ICANCi1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lUnVsZShpbnQgYWN0KSB7DQotCXN3aXRjaCAoYWN0KSB7DQotCQljYXNlIDI5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDo6PSBQcmltaXRpdmVUeXBlIik7DQotCQkJY29uc3VtZVByaW1pdGl2ZVR5cGUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlIik7DQotCQkJY29uc3VtZVJlZmVyZW5jZVR5cGUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlF1YWxpZmllZE5hbWUgOjo9IE5hbWUgRE9UIFNpbXBsZU5hbWUiKTsNCi0JCQljb25zdW1lUXVhbGlmaWVkTmFtZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsYXRpb25Vbml0IDo6PSBFbnRlckNvbXBpbGF0aW9uVW5pdCBQYWNrYWdlRGVjbGFyYXRpb25vcHQgSW1wb3J0RGVjbGFyYXRpb25zb3B0Iik7DQotCQkJY29uc3VtZUNvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJDb21waWxhdGlvblVuaXQgOjo9Iik7DQotCQkJY29uc3VtZUVudGVyQ29tcGlsYXRpb25Vbml0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDY2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaEhlYWRlciA6Oj0gY2F0Y2ggTFBBUkVOIEZvcm1hbFBhcmFtZXRlciBSUEFSRU4gTEJSQUNFIik7DQotCQkJY29uc3VtZUNhdGNoSGVhZGVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbXBvcnREZWNsYXJhdGlvbnMgOjo9IEltcG9ydERlY2xhcmF0aW9ucyBJbXBvcnREZWNsYXJhdGlvbiIpOw0KLQkJCWNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNzAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbnMgOjo9IFR5cGVEZWNsYXJhdGlvbnMgVHlwZURlY2xhcmF0aW9uIik7DQotCQkJY29uc3VtZVR5cGVEZWNsYXJhdGlvbnMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbiA6Oj0gUGFja2FnZURlY2xhcmF0aW9uTmFtZSBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lUGFja2FnZURlY2xhcmF0aW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDcyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSBwYWNrYWdlIE5hbWUiKTsNCi0JCQljb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uIDo6PSBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIik7DQotCQkJY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PSBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7DQotCQkJY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDc4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIERPVCBNVUxUSVBMWSIpOw0KLQkJCWNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgODEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7DQotCQkJY29uc3VtZUVtcHR5VHlwZURlY2xhcmF0aW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDk1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0RlY2xhcmF0aW9uIDo6PSBDbGFzc0hlYWRlciBDbGFzc0JvZHkiKTsNCi0JCQljb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA5NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXIgOjo9IENsYXNzSGVhZGVyTmFtZSBDbGFzc0hlYWRlckV4dGVuZHNvcHQgQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0Iik7DQotCQkJY29uc3VtZUNsYXNzSGVhZGVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDk3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBjbGFzcyBJZGVudGlmaWVyIik7DQotCQkJY29uc3VtZUNsYXNzSGVhZGVyTmFtZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJFeHRlbmRzIDo6PSBleHRlbmRzIENsYXNzVHlwZSIpOw0KLQkJCWNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVySW1wbGVtZW50cyA6Oj0gaW1wbGVtZW50cyBJbnRlcmZhY2VUeXBlTGlzdCIpOw0KLQkJCWNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTAxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VUeXBlTGlzdCA6Oj0gSW50ZXJmYWNlVHlwZUxpc3QgQ09NTUEgSW50ZXJmYWNlVHlwZSIpOw0KLQkJCWNvbnN1bWVJbnRlcmZhY2VUeXBlTGlzdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlIik7DQotCQkJY29uc3VtZUludGVyZmFjZVR5cGUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTA1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbnMgOjo9IENsYXNzQm9keURlY2xhcmF0aW9ucyBDbGFzc0JvZHlEZWNsYXJhdGlvbiIpOw0KLQkJCWNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTA5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbiA6Oj0gRGlldCBOZXN0ZWRNZXRob2QgQmxvY2siKTsNCi0JCQljb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTEwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaWV0IDo6PSIpOw0KLQkJCWNvbnN1bWVEaWV0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDExNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7DQotCQkJY29uc3VtZUVtcHR5Q2xhc3NNZW1iZXJEZWNsYXJhdGlvbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgU0VNSUNPTE9OIik7DQotCQkJY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTIwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYXJpYWJsZURlY2xhcmF0b3JzIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JzIENPTU1BIFZhcmlhYmxlRGVjbGFyYXRvciIpOw0KLQkJCWNvbnN1bWVWYXJpYWJsZURlY2xhcmF0b3JzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDEyMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJWYXJpYWJsZSA6Oj0iKTsNCi0JCQljb25zdW1lRW50ZXJWYXJpYWJsZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0iKTsNCi0JCQljb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDEyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSIpOw0KLQkJCWNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JjZU5vRGlldCA6Oj0iKTsNCi0JCQljb25zdW1lRm9yY2VOb0RpZXQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXN0b3JlRGlldCA6Oj0iKTsNCi0JCQljb25zdW1lUmVzdG9yZURpZXQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTMyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkiKTsNCi0JCQkvLyBzZXQgdG8gdHJ1ZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGggYSBib2R5DQotCQkJY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBTRU1JQ09MT04iKTsNCi0JCQkvLyBzZXQgdG8gZmFsc2UgdG8gY29uc3VtZSBhIG1ldGhvZCB3aXRob3V0IGJvZHkNCi0JCQljb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlciA6Oj0gTWV0aG9kSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyIpOw0KLQkJCWNvbnN1bWVNZXRob2RIZWFkZXIoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTM1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIDo6PSBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIik7DQotCQkJY29uc3VtZU1ldGhvZEhlYWRlcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoTW9kaWZpZXJzIElkZW50aWZpZXIgTFBBUkVOIik7DQotCQkJY29uc3VtZU1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDEzNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBJZGVudGlmaWVyIExQQVJFTiIpOw0KLQkJCWNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlIElkZW50aWZpZXIgTFBBUkVOIik7DQotCQkJY29uc3VtZU1ldGhvZEhlYWRlck5hbWUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTM5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IFJQQVJFTiIpOw0KLQkJCWNvbnN1bWVNZXRob2RIZWFkZXJQYXJhbWV0ZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0Iik7DQotCQkJY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gdGhyb3dzIENsYXNzVHlwZUxpc3QiKTsNCi0JCQljb25zdW1lTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE0MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JIZWFkZXIgOjo9IENvbnN0cnVjdG9ySGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzLi4uIik7DQotCQkJY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgSWRlbnRpZmllciBMUEFSRU4iKTsNCi0JCQljb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE0NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdCA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdCBDT01NQSBGb3JtYWxQYXJhbWV0ZXIiKTsNCi0JCQljb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQiKTsNCi0JCQkvLyB0aGUgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG1vZGlmaWVycyBzaG91bGQgYmUgcmVzZXQNCi0JCQljb25zdW1lRm9ybWFsUGFyYW1ldGVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE0OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NUeXBlTGlzdCA6Oj0gQ2xhc3NUeXBlTGlzdCBDT01NQSBDbGFzc1R5cGVFbHQiKTsNCi0JCQljb25zdW1lQ2xhc3NUeXBlTGlzdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzVHlwZUVsdCA6Oj0gQ2xhc3NUeXBlIik7DQotCQkJY29uc3VtZUNsYXNzVHlwZUVsdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCBMQlJBQ0UgQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOw0KLQkJCWNvbnN1bWVNZXRob2RCb2R5KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE1MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkTWV0aG9kIDo6PSIpOw0KLQkJCWNvbnN1bWVOZXN0ZWRNZXRob2QoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTUyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbml0aWFsaXplciA6Oj0gU3RhdGljT25seSBCbG9jayIpOw0KLQkJCWNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRpY09ubHkgOjo9IHN0YXRpYyIpOw0KLQkJCWNvbnN1bWVTdGF0aWNPbmx5KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5Iik7DQotCQkJY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTU1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCBMQlJBQ0UgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgUkJSQUNFIik7DQotCQkJY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IDo6PSBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiBCbG9ja1N0YXRlbWVudHMiKTsNCi0JCQljb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTU5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMCwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE2MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7DQotCQkJYnJlYWs7DQotCQljYXNlIDE2MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IFByaW1hcnkgRE9UIHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQotCQkJY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTYyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1Qgc3VwZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4uLi4iKTsNCi0JCQljb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNjMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7DQotCQkJY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lIERPVCB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7DQotCQkJY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDIsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZURlY2xhcmF0aW9uIDo6PSBJbnRlcmZhY2VIZWFkZXIgSW50ZXJmYWNlQm9keSIpOw0KLQkJCWNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlciA6Oj0gSW50ZXJmYWNlSGVhZGVyTmFtZSBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzb3B0Iik7DQotCQkJY29uc3VtZUludGVyZmFjZUhlYWRlcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAxNjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBpbnRlcmZhY2UgSWRlbnRpZmllciIpOw0KLQkJCWNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE2OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBJbnRlcmZhY2VUeXBlTGlzdCIpOw0KLQkJCWNvbnN1bWVJbnRlcmZhY2VIZWFkZXJFeHRlbmRzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE3MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIDo6PSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMuLi4iKTsNCi0JCQljb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE3MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVFbXB0eUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE3NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IEludmFsaWRNZXRob2REZWNsYXJhdGlvbiIpOw0KLQkJCWlnbm9yZU1ldGhvZEJvZHkoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTc3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5Iik7DQotCQkJaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24odHJ1ZSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIFNFTUlDT0xPTiIpOw0KLQkJCWlnbm9yZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGZhbHNlKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTg0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgLG9wdCBSQlJBQ0UiKTsNCi0JCQljb25zdW1lRW1wdHlBcnJheUluaXRpYWxpemVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE4NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFZhcmlhYmxlSW5pdGlhbGl6ZXJzIFJCUkFDRSIpOw0KLQkJCWNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE4NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFZhcmlhYmxlSW5pdGlhbGl6ZXJzIENPTU1BIFJCUkFDRSIpOw0KLQkJCWNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVJbml0aWFsaXplcnMgOjo9IFZhcmlhYmxlSW5pdGlhbGl6ZXJzIENPTU1BIFZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsNCi0JCQljb25zdW1lVmFyaWFibGVJbml0aWFsaXplcnMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9jayA6Oj0gT3BlbkJsb2NrIExCUkFDRSBCbG9ja1N0YXRlbWVudHNvcHQgUkJSQUNFIik7DQotCQkJY29uc3VtZUJsb2NrKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbkJsb2NrIDo6PSIpOw0KLQkJCWNvbnN1bWVPcGVuQmxvY2soKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTkyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyBCbG9ja1N0YXRlbWVudCIpOw0KLQkJCWNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTk2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudCA6Oj0gSW52YWxpZEludGVyZmFjZURlY2xhcmF0aW9uIik7DQotCQkJaWdub3JlSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTk3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgOjo9IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDE5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgVmFyaWFibGVEZWNsYXJhdG9ycyIpOw0KLQkJCWNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hNb2RpZmllcnMgVmFyaWFibGVEZWNsYXJhdG9ycyIpOw0KLQkJCWNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoTW9kaWZpZXJzIDo6PSIpOw0KLQkJCWNvbnN1bWVQdXNoTW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDIyMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW1wdHlTdGF0ZW1lbnQgOjo9IFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVFbXB0eVN0YXRlbWVudCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyMjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsZWRTdGF0ZW1lbnQgOjo9IElkZW50aWZpZXIgQ09MT04gU3RhdGVtZW50Iik7DQotCQkJY29uc3VtZVN0YXRlbWVudExhYmVsKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDIyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gSWRlbnRpZmllciBDT0xPTiBTdGF0ZW1lbnROb1Nob3J0SWYiKTsNCi0JCQljb25zdW1lU3RhdGVtZW50TGFiZWwoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9uU3RhdGVtZW50IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVFeHByZXNzaW9uU3RhdGVtZW50KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDIzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuU3RhdGVtZW50IDo6PSBpZiBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Iik7DQotCQkJY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDIzNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuRWxzZVN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudE5vU2hvcnRJZiBlbHNlLi4uIik7DQotCQkJY29uc3VtZVN0YXRlbWVudElmV2l0aEVsc2UoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjM2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZlRoZW5FbHNlU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBpZiBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Tm9TaG9ydElmLi4uIik7DQotCQkJY29uc3VtZVN0YXRlbWVudElmV2l0aEVsc2UoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjM3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hTdGF0ZW1lbnQgOjo9IHN3aXRjaCBPcGVuQmxvY2sgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN3aXRjaEJsb2NrIik7DQotCQkJY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgUkJSQUNFIik7DQotCQkJY29uc3VtZUVtcHR5U3dpdGNoQmxvY2soKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjQxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9jayA6Oj0gTEJSQUNFIFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hMYWJlbHMgUkJSQUNFIik7DQotCQkJY29uc3VtZVN3aXRjaEJsb2NrKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIDo6PSBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgU3dpdGNoQmxvY2tTdGF0ZW1lbnQiKTsNCi0JCQljb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnRzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI0NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2tTdGF0ZW1lbnQgOjo9IFN3aXRjaExhYmVscyBCbG9ja1N0YXRlbWVudHMiKTsNCi0JCQljb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjQ2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbCIpOw0KLQkJCWNvbnN1bWVTd2l0Y2hMYWJlbHMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjQ3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbCA6Oj0gY2FzZSBDb25zdGFudEV4cHJlc3Npb24gQ09MT04iKTsNCi0JCQljb25zdW1lQ2FzZUxhYmVsKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI0OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWwgOjo9IGRlZmF1bHQgQ09MT04iKTsNCi0JCQljb25zdW1lRGVmYXVsdExhYmVsKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI0OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnQgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnQiKTsNCi0JCQljb25zdW1lU3RhdGVtZW50V2hpbGUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudE5vU2hvcnRJZiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRvU3RhdGVtZW50IDo6PSBkbyBTdGF0ZW1lbnQgd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnREbygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclN0YXRlbWVudCA6Oj0gZm9yIExQQVJFTiBGb3JJbml0b3B0IFNFTUlDT0xPTiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTi4uLiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRGb3IoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjUzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdCBTRU1JQ09MT04gRXhwcmVzc2lvbm9wdCBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lU3RhdGVtZW50Rm9yKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ySW5pdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QiKTsNCi0JCQljb25zdW1lRm9ySW5pdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlbWVudEV4cHJlc3Npb25MaXN0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCBDT01NQSBTdGF0ZW1lbnRFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZVN0YXRlbWVudEV4cHJlc3Npb25MaXN0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI1OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRCcmVhaygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRpbnVlU3RhdGVtZW50IDo6PSBjb250aW51ZSBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lU3RhdGVtZW50Q29udGludWUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjYyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgSWRlbnRpZmllciBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lU3RhdGVtZW50Q29udGludWVXaXRoTGFiZWwoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjYzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjY0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaHJvd1N0YXRlbWVudCA6Oj0gdGhyb3cgRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsNCi0JCQljb25zdW1lU3RhdGVtZW50VGhyb3coKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjY1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIEJsb2NrIik7DQotCQkJY29uc3VtZVN0YXRlbWVudFN5bmNocm9uaXplZCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9ubHlTeW5jaHJvbml6ZWQgOjo9IHN5bmNocm9uaXplZCIpOw0KLQkJCWNvbnN1bWVPbmx5U3luY2hyb25pemVkKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI2NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgQmxvY2sgQ2F0Y2hlcyIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRUcnkoZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXNvcHQgRmluYWxseSIpOw0KLQkJCWNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI3MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlcyA6Oj0gQ2F0Y2hlcyBDYXRjaENsYXVzZSIpOw0KLQkJCWNvbnN1bWVDYXRjaGVzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hDbGF1c2UgOjo9IGNhdGNoIExQQVJFTiBGb3JtYWxQYXJhbWV0ZXIgUlBBUkVOIEJsb2NrIik7DQotCQkJY29uc3VtZVN0YXRlbWVudENhdGNoKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI3MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaExQQVJFTiA6Oj0gTFBBUkVOIik7DQotCQkJY29uc3VtZUxlZnRQYXJlbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyNzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hSUEFSRU4gOjo9IFJQQVJFTiIpOw0KLQkJCWNvbnN1bWVSaWdodFBhcmVuKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IHRoaXMiKTsNCi0JCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI3OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIik7DQotCQkJY29uc3VtZVByaW1hcnlOb05ld0FycmF5KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI4MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIHRoaXMiKTsNCi0JCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lVGhpcygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyODMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBzdXBlciIpOw0KLQkJCWNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVTdXBlcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyODQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBjbGFzcyIpOw0KLQkJCWNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjg1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gQXJyYXlUeXBlIERPVCBjbGFzcyIpOw0KLQkJCWNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheUFycmF5VHlwZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQcmltaXRpdmVUeXBlIERPVCBjbGFzcyIpOw0KLQkJCWNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVByaW1pdGl2ZVR5cGUoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBbGxvY2F0aW9uSGVhZGVyIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQotCQkJY29uc3VtZUFsbG9jYXRpb25IZWFkZXIoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjkwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7DQotCQkJY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjkxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5IERPVCBuZXcgU2ltcGxlTmFtZSBMUEFSRU4uLi4iKTsNCi0JCQljb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyOTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIG5ldy4uLiIpOw0KLQkJCWNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI5MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgOjo9IE5hbWUgRE9UIik7DQotCQkJY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDI5NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5b3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVDbGFzc0JvZHlvcHQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjk2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0iKTsNCi0JCQljb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMjk4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCBDT01NQSBFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUFyZ3VtZW50TGlzdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMuLi4iKTsNCi0JCQljb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycy4uLiIpOw0KLQkJCWNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByIik7DQotCQkJY29uc3VtZURpbVdpdGhPcldpdGhPdXRFeHBycygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHByIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOw0KLQkJCWNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXMgOjo9IERpbXNMb29wIik7DQotCQkJY29uc3VtZURpbXMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzA4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbmVEaW1Mb29wIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOw0KLQkJCWNvbnN1bWVPbmVEaW1Mb29wKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgRE9UIElkZW50aWZpZXIiKTsNCi0JCQljb25zdW1lRmllbGRBY2Nlc3MoZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkQWNjZXNzIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciIpOw0KLQkJCWNvbnN1bWVGaWVsZEFjY2Vzcyh0cnVlKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzExIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQotCQkJY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMxMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOw0KLQkJCWNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IHN1cGVyIERPVCBJZGVudGlmaWVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQotCQkJY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBOYW1lIExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsNCi0JCQljb25zdW1lQXJyYXlBY2Nlc3ModHJ1ZSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMxNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlBY2Nlc3MgOjo9IFByaW1hcnlOb05ld0FycmF5IExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsNCi0JCQljb25zdW1lQXJyYXlBY2Nlc3MoZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3RmaXhFeHByZXNzaW9uIDo6PSBOYW1lIik7DQotCQkJY29uc3VtZVBvc3RmaXhFeHByZXNzaW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMyMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdEluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uIFBMVVNfUExVUyIpOw0KLQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMsIHRydWUpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBNSU5VU19NSU5VUyIpOw0KLQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTLCB0cnVlKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzIyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUG9zaXRpb24gOjo9Iik7DQotCQkJY29uc3VtZVB1c2hQb3NpdGlvbigpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbiA6Oj0gUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMyNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uIDo6PSBNSU5VUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBMVVNfUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUywgZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZURlY3JlbWVudEV4cHJlc3Npb24gOjo9IE1JTlVTX01JTlVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUywgZmFsc2UpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gVFdJRERMRSBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uVFdJRERMRSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMzMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSBOT1QgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUNhc3RFeHByZXNzaW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMzNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIik7DQotCQkJY29uc3VtZUNhc3RFeHByZXNzaW9uKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMzNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyIpOw0KLQkJCWNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIE1VTFRJUExZIFVuYXJ5RXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NVUxUSVBMWSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDMzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRElWSURFIFVuYXJ5RXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5ESVZJREUpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIFJFTUFJTkRFUiBVbmFyeUV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUkVNQUlOREVSKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzQyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBQTFVTIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIExFRlRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFRlRfU0hJRlQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFJJR0hUX1NISUZUIEFkZGl0aXZlRXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5SSUdIVF9TSElGVCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gVU5TSUdORURfUklHSFRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzQ5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gTEVTUyBTaGlmdEV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTUyk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM1MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVIgU2hpZnRFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVIpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBMRVNTX0VRVUFMIFNoaWZ0RXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRVNTX0VRVUFMKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzUyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gR1JFQVRFUl9FUVVBTCBTaGlmdEV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uR1JFQVRFUl9FUVVBTCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlVHlwZSIpOw0KLQkJCWNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uSU5TVEFOQ0VPRik7DQotCQkJYnJlYWs7DQotCQljYXNlIDM1NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gRVFVQUxfRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5FUVVBTF9FUVVBTCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gTk9UX0VRVUFMIFJlbGF0aW9uYWxFeHByZXNzaW9uIik7DQotCQkJY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTk9UX0VRVUFMKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzU4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uIDo6PSBBbmRFeHByZXNzaW9uIEFORCBFcXVhbGl0eUV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzYwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiBYT1IgQW5kRXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5YT1IpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uIE9SIEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUik7DQotCQkJYnJlYWs7DQotCQljYXNlIDM2NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gQU5EX0FORCBJbmNsdXNpdmVPckV4cHJlc3Npb24iKTsNCi0JCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EX0FORCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIE9SX09SIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUl9PUik7DQotCQkJYnJlYWs7DQotCQljYXNlIDM2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiBRVUVTVElPTiBFeHByZXNzaW9uIENPTE9OLi4uIik7DQotCQkJY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUVVFU1RJT05DT0xPTik7DQotCQkJYnJlYWs7DQotCQljYXNlIDM3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbiIpOw0KLQkJCWNvbnN1bWVBc3NpZ25tZW50KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM3MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudCIpOw0KLQkJCWlnbm9yZUV4cHJlc3Npb25Bc3NpZ25tZW50KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM3NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGVmdEhhbmRTaWRlIDo6PSBOYW1lIik7DQotCQkJY29uc3VtZUxlZnRIYW5kU2lkZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzNzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRVFVQUwiKTsNCi0JCQljb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEVRVUFMKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzc4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1VTFRJUExZX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNVUxUSVBMWSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM3OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBESVZJREVfRVFVQUwiKTsNCi0JCQljb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKERJVklERSk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM4MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsNCi0JCQljb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJFTUFJTkRFUik7DQotCQkJYnJlYWs7DQotCQljYXNlIDM4MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBQTFVTX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihQTFVTKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzgyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1JTlVTX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNSU5VUyk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM4MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBMRUZUX1NISUZUX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihMRUZUX1NISUZUKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzg0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFJJR0hUX1NISUZUX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSSUdIVF9TSElGVCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDM4NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCIpOw0KLQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoVU5TSUdORURfUklHSFRfU0hJRlQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gQU5EX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzODcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gWE9SX0VRVUFMIik7DQotCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihYT1IpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAzODggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gT1JfRVFVQUwiKTsNCi0JCQljb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE9SKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzk1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9ub3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUV4cHJlc3Npb24oKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMzk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9Iik7DQotCQkJY29uc3VtZUVtcHR5SW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zb3B0IDo6PSBJbXBvcnREZWNsYXJhdGlvbnMiKTsNCi0JCQljb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0iKTsNCi0JCQljb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gVHlwZURlY2xhcmF0aW9ucyIpOw0KLQkJCWNvbnN1bWVUeXBlRGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsNCi0JCQljb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSBNb2RpZmllcnMiKTsNCi0JCQljb25zdW1lTW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQwNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnRzb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUJsb2NrU3RhdGVtZW50c29wdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXNvcHQgOjo9Iik7DQotCQkJY29uc3VtZUVtcHR5RGltc29wdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdG9wdCA6Oj0iKTsNCi0JCQljb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNDE1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQxOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMiKTsNCi0JCQljb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDQyMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkVHlwZSA6Oj0iKTsNCi0JCQljb25zdW1lTmVzdGVkVHlwZSgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXRvcHQgOjo9Iik7DQotCQkJY29uc3VtZUVtcHR5Rm9ySW5pdG9wdCgpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0MjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclVwZGF0ZW9wdCA6Oj0iKTsNCi0JCQljb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNDI4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaGVzb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUNhdGNoZXNvcHQoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNDMwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyb3B0IDo6PSIpOw0KLQkJCWNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXJvcHQoKTsNCi0JCQlicmVhazsNCisJLy8gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBhdXRvbWF0aWMgZ2VuZXJhdGlvbiA6IGRvIE5PVCBlZGl0LW1vZGlmeSAgDQorCXByb3RlY3RlZCB2b2lkIGNvbnN1bWVSdWxlKGludCBhY3QpIHsNCisJCXN3aXRjaCAoYWN0KSB7DQorCQkJY2FzZSAyOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSA6Oj0gUHJpbWl0aXZlVHlwZSIpOw0KKwkJCQljb25zdW1lUHJpbWl0aXZlVHlwZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWZlcmVuY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZSIpOw0KKwkJCQljb25zdW1lUmVmZXJlbmNlVHlwZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDUyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJRdWFsaWZpZWROYW1lIDo6PSBOYW1lIERPVCBTaW1wbGVOYW1lIik7DQorCQkJCWNvbnN1bWVRdWFsaWZpZWROYW1lKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdCIpOw0KKwkJCQljb25zdW1lQ29tcGlsYXRpb25Vbml0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyQ29tcGlsYXRpb25Vbml0IDo6PSIpOw0KKwkJCQljb25zdW1lRW50ZXJDb21waWxhdGlvblVuaXQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hIZWFkZXIgOjo9IGNhdGNoIExQQVJFTiBGb3JtYWxQYXJhbWV0ZXIgUlBBUkVOIExCUkFDRSIpOw0KKwkJCQljb25zdW1lQ2F0Y2hIZWFkZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgSW1wb3J0RGVjbGFyYXRpb24iKTsNCisJCQkJY29uc3VtZUltcG9ydERlY2xhcmF0aW9ucygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDcwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb25zIDo6PSBUeXBlRGVjbGFyYXRpb25zIFR5cGVEZWNsYXJhdGlvbiIpOw0KKwkJCQljb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDcxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYWNrYWdlRGVjbGFyYXRpb24gOjo9IFBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7DQorCQkJCWNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA3MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gcGFja2FnZSBOYW1lIik7DQorCQkJCWNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDc2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSBpbXBvcnQgTmFtZSIpOw0KKwkJCQljb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDc3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbiA6Oj0gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSBpbXBvcnQgTmFtZSBET1QgTVVMVElQTFkiKTsNCisJCQkJY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDgxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEZWNsYXJhdGlvbiA6Oj0gQ2xhc3NIZWFkZXIgQ2xhc3NCb2R5Iik7DQorCQkJCWNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgOTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyIDo6PSBDbGFzc0hlYWRlck5hbWUgQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IENsYXNzSGVhZGVySW1wbGVtZW50c29wdCIpOw0KKwkJCQljb25zdW1lQ2xhc3NIZWFkZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA5NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgY2xhc3MgSWRlbnRpZmllciIpOw0KKwkJCQljb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgOTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBDbGFzc1R5cGUiKTsNCisJCQkJY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlckltcGxlbWVudHMgOjo9IGltcGxlbWVudHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsNCisJCQkJY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0IENPTU1BIEludGVyZmFjZVR5cGUiKTsNCisJCQkJY29uc3VtZUludGVyZmFjZVR5cGVMaXN0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTAyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZSIpOw0KKwkJCQljb25zdW1lSW50ZXJmYWNlVHlwZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMgQ2xhc3NCb2R5RGVjbGFyYXRpb24iKTsNCisJCQkJY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb24gOjo9IERpZXQgTmVzdGVkTWV0aG9kIEJsb2NrIik7DQorCQkJCWNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDExMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlldCA6Oj0iKTsNCisJCQkJY29uc3VtZURpZXQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluaXRpYWxpemVyIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOw0KKwkJCQljb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lRW1wdHlDbGFzc01lbWJlckRlY2xhcmF0aW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTE5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZERlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JzIFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lRmllbGREZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEyMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVEZWNsYXJhdG9ycyA6Oj0gVmFyaWFibGVEZWNsYXJhdG9ycyBDT01NQSBWYXJpYWJsZURlY2xhcmF0b3IiKTsNCisJCQkJY29uc3VtZVZhcmlhYmxlRGVjbGFyYXRvcnMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyVmFyaWFibGUgOjo9Iik7DQorCQkJCWNvbnN1bWVFbnRlclZhcmlhYmxlKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTI1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24gOjo9Iik7DQorCQkJCWNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0iKTsNCisJCQkJY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEyNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yY2VOb0RpZXQgOjo9Iik7DQorCQkJCWNvbnN1bWVGb3JjZU5vRGlldCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEyOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdG9yZURpZXQgOjo9Iik7DQorCQkJCWNvbnN1bWVSZXN0b3JlRGlldCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEzMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBNZXRob2RCb2R5Iik7DQorCQkJCS8vIHNldCB0byB0cnVlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aCBhIGJvZHkNCisJCQkJY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIFNFTUlDT0xPTiIpOw0KKwkJCQkvLyBzZXQgdG8gZmFsc2UgdG8gY29uc3VtZSBhIG1ldGhvZCB3aXRob3V0IGJvZHkNCisJCQkJY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlciA6Oj0gTWV0aG9kSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyIpOw0KKwkJCQljb25zdW1lTWV0aG9kSGVhZGVyKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTM2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIDo6PSBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIik7DQorCQkJCWNvbnN1bWVNZXRob2RIZWFkZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoTW9kaWZpZXJzIElkZW50aWZpZXIgTFBBUkVOIik7DQorCQkJCWNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDEzOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBJZGVudGlmaWVyIExQQVJFTiIpOw0KKwkJCQljb25zdW1lTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxMzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlIElkZW50aWZpZXIgTFBBUkVOIik7DQorCQkJCWNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTQwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IFJQQVJFTiIpOw0KKwkJCQljb25zdW1lTWV0aG9kSGVhZGVyUGFyYW1ldGVycygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE0MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0Iik7DQorCQkJCWNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gdGhyb3dzIENsYXNzVHlwZUxpc3QiKTsNCisJCQkJY29uc3VtZU1ldGhvZEhlYWRlclRocm93c0NsYXVzZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JIZWFkZXIgOjo9IENvbnN0cnVjdG9ySGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzLi4uIik7DQorCQkJCWNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE0NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgSWRlbnRpZmllciBMUEFSRU4iKTsNCisJCQkJY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE0NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdCA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdCBDT01NQSBGb3JtYWxQYXJhbWV0ZXIiKTsNCisJCQkJY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3QoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNDcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQiKTsNCisJCQkJLy8gdGhlIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBtb2RpZmllcnMgc2hvdWxkIGJlIHJlc2V0DQorCQkJCWNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgQ09NTUEgQ2xhc3NUeXBlRWx0Iik7DQorCQkJCWNvbnN1bWVDbGFzc1R5cGVMaXN0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVFbHQgOjo9IENsYXNzVHlwZSIpOw0KKwkJCQljb25zdW1lQ2xhc3NUeXBlRWx0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTUxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RCb2R5IDo6PSBOZXN0ZWRNZXRob2QgTEJSQUNFIEJsb2NrU3RhdGVtZW50c29wdCBSQlJBQ0UiKTsNCisJCQkJY29uc3VtZU1ldGhvZEJvZHkoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lc3RlZE1ldGhvZCA6Oj0iKTsNCisJCQkJY29uc3VtZU5lc3RlZE1ldGhvZCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljSW5pdGlhbGl6ZXIgOjo9IFN0YXRpY09ubHkgQmxvY2siKTsNCisJCQkJY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNPbmx5IDo6PSBzdGF0aWMiKTsNCisJCQkJY29uc3VtZVN0YXRpY09ubHkoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIENvbnN0cnVjdG9yQm9keSIpOw0KKwkJCQljb25zdW1lQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgTEJSQUNFIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOw0KKwkJCQljb25zdW1lQ29uc3RydWN0b3JCb2R5KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTU5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCA6Oj0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gQmxvY2tTdGF0ZW1lbnRzIik7DQorCQkJCWNvbnN1bWVDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50cygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE2MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IHRoaXMgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4gU0VNSUNPTE9OIik7DQorCQkJCWNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBzdXBlciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDAsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCBzdXBlciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOw0KKwkJCQljb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE2MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7DQorCQkJCWNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTY0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTi4uLiIpOw0KKwkJCQljb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTY1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1QgdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTi4uLiIpOw0KKwkJCQljb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTY2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VEZWNsYXJhdGlvbiA6Oj0gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkiKTsNCisJCQkJY29uc3VtZUludGVyZmFjZURlY2xhcmF0aW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VIZWFkZXIgOjo9IEludGVyZmFjZUhlYWRlck5hbWUgSW50ZXJmYWNlSGVhZGVyRXh0ZW5kc29wdCIpOw0KKwkJCQljb25zdW1lSW50ZXJmYWNlSGVhZGVyKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMTY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgaW50ZXJmYWNlIElkZW50aWZpZXIiKTsNCisJCQkJY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNzAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsNCisJCQkJY29uc3VtZUludGVyZmFjZUhlYWRlckV4dGVuZHMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zLi4uIik7DQorCQkJCWNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBJbnZhbGlkTWV0aG9kRGVjbGFyYXRpb24iKTsNCisJCQkJaWdub3JlTWV0aG9kQm9keSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIENvbnN0cnVjdG9yQm9keSIpOw0KKwkJCQlpZ25vcmVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0cnVlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxNzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBTRU1JQ09MT04iKTsNCisJCQkJaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oZmFsc2UpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE4NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFICxvcHQgUkJSQUNFIik7DQorCQkJCWNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5SW5pdGlhbGl6ZXIgOjo9IExCUkFDRSBWYXJpYWJsZUluaXRpYWxpemVycyBSQlJBQ0UiKTsNCisJCQkJY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxODcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5SW5pdGlhbGl6ZXIgOjo9IExCUkFDRSBWYXJpYWJsZUluaXRpYWxpemVycyBDT01NQSBSQlJBQ0UiKTsNCisJCQkJY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxODkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhcmlhYmxlSW5pdGlhbGl6ZXJzIDo6PSBWYXJpYWJsZUluaXRpYWxpemVycyBDT01NQSBWYXJpYWJsZUluaXRpYWxpemVyIik7DQorCQkJCWNvbnN1bWVWYXJpYWJsZUluaXRpYWxpemVycygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2sgOjo9IE9wZW5CbG9jayBMQlJBQ0UgQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOw0KKwkJCQljb25zdW1lQmxvY2soKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxOTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5CbG9jayA6Oj0iKTsNCisJCQkJY29uc3VtZU9wZW5CbG9jaygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE5MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnRzIDo6PSBCbG9ja1N0YXRlbWVudHMgQmxvY2tTdGF0ZW1lbnQiKTsNCisJCQkJY29uc3VtZUJsb2NrU3RhdGVtZW50cygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE5NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOw0KKwkJCQlpZ25vcmVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDE5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IDo6PSBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gU0VNSUNPTE9OIik7DQorCQkJCWNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMiKTsNCisJCQkJY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIwMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMiKTsNCisJCQkJY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaE1vZGlmaWVycyA6Oj0iKTsNCisJCQkJY29uc3VtZVB1c2hNb2RpZmllcnMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyMjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVtcHR5U3RhdGVtZW50IDo6PSBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZUVtcHR5U3RhdGVtZW50KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMYWJlbGVkU3RhdGVtZW50IDo6PSBJZGVudGlmaWVyIENPTE9OIFN0YXRlbWVudCIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50TGFiZWwoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyMjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IElkZW50aWZpZXIgQ09MT04gU3RhdGVtZW50Tm9TaG9ydElmIik7DQorCQkJCWNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIyOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvblN0YXRlbWVudCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbiBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyMzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlblN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudCIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnQgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYgZWxzZS4uLiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIzOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudE5vU2hvcnRJZi4uLiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDIzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoU3RhdGVtZW50IDo6PSBzd2l0Y2ggT3BlbkJsb2NrIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTd2l0Y2hCbG9jayIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50U3dpdGNoKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjQwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9jayA6Oj0gTEJSQUNFIFJCUkFDRSIpOw0KKwkJCQljb25zdW1lRW1wdHlTd2l0Y2hCbG9jaygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2sgOjo9IExCUkFDRSBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgU3dpdGNoTGFiZWxzIFJCUkFDRSIpOw0KKwkJCQljb25zdW1lU3dpdGNoQmxvY2soKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50cyA6Oj0gU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaEJsb2NrU3RhdGVtZW50Iik7DQorCQkJCWNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudHMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50IDo6PSBTd2l0Y2hMYWJlbHMgQmxvY2tTdGF0ZW1lbnRzIik7DQorCQkJCWNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI0OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWxzIDo6PSBTd2l0Y2hMYWJlbHMgU3dpdGNoTGFiZWwiKTsNCisJCQkJY29uc3VtZVN3aXRjaExhYmVscygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI0OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWwgOjo9IGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uIENPTE9OIik7DQorCQkJCWNvbnN1bWVDYXNlTGFiZWwoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBkZWZhdWx0IENPTE9OIik7DQorCQkJCWNvbnN1bWVEZWZhdWx0TGFiZWwoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoaWxlU3RhdGVtZW50IDo6PSB3aGlsZSBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Iik7DQorCQkJCWNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYiKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudFdoaWxlKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjUzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb1N0YXRlbWVudCA6Oj0gZG8gU3RhdGVtZW50IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudERvKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnQgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdCBTRU1JQ09MT04gRXhwcmVzc2lvbm9wdCBTRU1JQ09MT04uLi4iKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudEZvcigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI1NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBmb3IgTFBBUkVOIEZvckluaXRvcHQgU0VNSUNPTE9OIEV4cHJlc3Npb25vcHQgU0VNSUNPTE9OIik7DQorCQkJCWNvbnN1bWVTdGF0ZW1lbnRGb3IoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0Iik7DQorCQkJCWNvbnN1bWVGb3JJbml0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjYwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgQ09NTUEgU3RhdGVtZW50RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7DQorCQkJCWNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gQ09MT04gRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZUFzc2VydFN0YXRlbWVudCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI2MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50QnJlYWsoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50QnJlYWtXaXRoTGFiZWwoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRpbnVlU3RhdGVtZW50IDo6PSBjb250aW51ZSBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudENvbnRpbnVlKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjY2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgSWRlbnRpZmllciBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudENvbnRpbnVlV2l0aExhYmVsKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50UmV0dXJuKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaHJvd1N0YXRlbWVudCA6Oj0gdGhyb3cgRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsNCisJCQkJY29uc3VtZVN0YXRlbWVudFRocm93KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjY5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIEJsb2NrIik7DQorCQkJCWNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNzAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9ubHlTeW5jaHJvbml6ZWQgOjo9IHN5bmNocm9uaXplZCIpOw0KKwkJCQljb25zdW1lT25seVN5bmNocm9uaXplZCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgQmxvY2sgQ2F0Y2hlcyIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXNvcHQgRmluYWxseSIpOw0KKwkJCQljb25zdW1lU3RhdGVtZW50VHJ5KHRydWUpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI3NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlcyA6Oj0gQ2F0Y2hlcyBDYXRjaENsYXVzZSIpOw0KKwkJCQljb25zdW1lQ2F0Y2hlcygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hDbGF1c2UgOjo9IGNhdGNoIExQQVJFTiBGb3JtYWxQYXJhbWV0ZXIgUlBBUkVOIEJsb2NrIik7DQorCQkJCWNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI3NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaExQQVJFTiA6Oj0gTFBBUkVOIik7DQorCQkJCWNvbnN1bWVMZWZ0UGFyZW4oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hSUEFSRU4gOjo9IFJQQVJFTiIpOw0KKwkJCQljb25zdW1lUmlnaHRQYXJlbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI4MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IHRoaXMiKTsNCisJCQkJY29uc3VtZVByaW1hcnlOb05ld0FycmF5VGhpcygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI4MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIik7DQorCQkJCWNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI4NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIHRoaXMiKTsNCisJCQkJY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVRoaXMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyODcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBzdXBlciIpOw0KKwkJCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lU3VwZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyODggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBjbGFzcyIpOw0KKwkJCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gQXJyYXlUeXBlIERPVCBjbGFzcyIpOw0KKwkJCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlBcnJheVR5cGUoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyOTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQcmltaXRpdmVUeXBlIERPVCBjbGFzcyIpOw0KKwkJCQljb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjkzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBbGxvY2F0aW9uSGVhZGVyIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQorCQkJCWNvbnN1bWVBbGxvY2F0aW9uSGVhZGVyKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjk0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7DQorCQkJCWNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMjk1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5IERPVCBuZXcgU2ltcGxlTmFtZSBMUEFSRU4uLi4iKTsNCisJCQkJY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyOTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIG5ldy4uLiIpOw0KKwkJCQljb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI5NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgOjo9IE5hbWUgRE9UIik7DQorCQkJCWNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDI5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5b3B0IDo6PSIpOw0KKwkJCQljb25zdW1lQ2xhc3NCb2R5b3B0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0iKTsNCisJCQkJY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzAyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCBDT01NQSBFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVBcmd1bWVudExpc3QoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMuLi4iKTsNCisJCQkJY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzA0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycy4uLiIpOw0KKwkJCQljb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByIik7DQorCQkJCWNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMDggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHByIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOw0KKwkJCQljb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXMgOjo9IERpbXNMb29wIik7DQorCQkJCWNvbnN1bWVEaW1zKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzEyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbmVEaW1Mb29wIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOw0KKwkJCQljb25zdW1lT25lRGltTG9vcCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMxMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgRE9UIElkZW50aWZpZXIiKTsNCisJCQkJY29uc3VtZUZpZWxkQWNjZXNzKGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkQWNjZXNzIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciIpOw0KKwkJCQljb25zdW1lRmllbGRBY2Nlc3ModHJ1ZSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzE1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQorCQkJCWNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMxNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOw0KKwkJCQljb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IHN1cGVyIERPVCBJZGVudGlmaWVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7DQorCQkJCWNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBOYW1lIExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsNCisJCQkJY29uc3VtZUFycmF5QWNjZXNzKHRydWUpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMxOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlBY2Nlc3MgOjo9IFByaW1hcnlOb05ld0FycmF5IExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsNCisJCQkJY29uc3VtZUFycmF5QWNjZXNzKGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3RmaXhFeHByZXNzaW9uIDo6PSBOYW1lIik7DQorCQkJCWNvbnN1bWVQb3N0Zml4RXhwcmVzc2lvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMyNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdEluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uIFBMVVNfUExVUyIpOw0KKwkJCQljb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLCB0cnVlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBNSU5VU19NSU5VUyIpOw0KKwkJCQljb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUywgdHJ1ZSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUG9zaXRpb24gOjo9Iik7DQorCQkJCWNvbnN1bWVQdXNoUG9zaXRpb24oKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbiA6Oj0gUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMzMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uIDo6PSBNSU5VUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBMVVNfUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMsIGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZURlY3JlbWVudEV4cHJlc3Npb24gOjo9IE1JTlVTX01JTlVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsIGZhbHNlKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzMzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gVFdJRERMRSBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlRXSURETEUpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMzNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSBOT1QgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5OT1QpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMzOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDMzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIik7DQorCQkJCWNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyIpOw0KKwkJCQljb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIE1VTFRJUExZIFVuYXJ5RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTVVMVElQTFkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRElWSURFIFVuYXJ5RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRElWSURFKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIFJFTUFJTkRFUiBVbmFyeUV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlJFTUFJTkRFUik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzQ2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBQTFVTIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzQ3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIExFRlRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRUZUX1NISUZUKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFJJR0hUX1NISUZUIEFkZGl0aXZlRXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUklHSFRfU0hJRlQpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM1MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gVU5TSUdORURfUklHSFRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5VTlNJR05FRF9SSUdIVF9TSElGVCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzUzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gTEVTUyBTaGlmdEV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFU1MpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVIgU2hpZnRFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5HUkVBVEVSKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBMRVNTX0VRVUFMIFNoaWZ0RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTU19FUVVBTCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzU2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gR1JFQVRFUl9FUVVBTCBTaGlmdEV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVJfRVFVQUwpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM1NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlVHlwZSIpOw0KKwkJCQljb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLklOU1RBTkNFT0YpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM1OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gRVFVQUxfRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRVFVQUxfRVFVQUwpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM2MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gTk9UX0VRVUFMIFJlbGF0aW9uYWxFeHByZXNzaW9uIik7DQorCQkJCWNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVF9FUVVBTCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzYyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uIDo6PSBBbmRFeHByZXNzaW9uIEFORCBFcXVhbGl0eUV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkFORCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzY0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiBYT1IgQW5kRXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uWE9SKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uIE9SIEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1IpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gQU5EX0FORCBJbmNsdXNpdmVPckV4cHJlc3Npb24iKTsNCisJCQkJY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkFORF9BTkQpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM3MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIE9SX09SIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1JfT1IpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM3MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiBRVUVTVElPTiBFeHByZXNzaW9uIENPTE9OLi4uIik7DQorCQkJCWNvbnN1bWVDb25kaXRpb25hbEV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlFVRVNUSU9OQ09MT04pOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbiIpOw0KKwkJCQljb25zdW1lQXNzaWdubWVudCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM3NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudCIpOw0KKwkJCQlpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGVmdEhhbmRTaWRlIDo6PSBOYW1lIik7DQorCQkJCWNvbnN1bWVMZWZ0SGFuZFNpZGUoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzODEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRVFVQUwiKTsNCisJCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihFUVVBTCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzgyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1VTFRJUExZX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTVVMVElQTFkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM4MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBESVZJREVfRVFVQUwiKTsNCisJCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihESVZJREUpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM4NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsNCisJCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM4NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBQTFVTX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUExVUyk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzg2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1JTlVTX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTUlOVVMpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM4NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBMRUZUX1NISUZUX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTEVGVF9TSElGVCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzg4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFJJR0hUX1NISUZUX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUklHSFRfU0hJRlQpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM4OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCIpOw0KKwkJCQljb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFVOU0lHTkVEX1JJR0hUX1NISUZUKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzOTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gQU5EX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoQU5EKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzOTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gWE9SX0VRVUFMIik7DQorCQkJCWNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoWE9SKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzOTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gT1JfRVFVQUwiKTsNCisJCQkJY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihPUik7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMzk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9ub3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlFeHByZXNzaW9uKCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNDAzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9Iik7DQorCQkJCWNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQwNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zb3B0IDo6PSBJbXBvcnREZWNsYXJhdGlvbnMiKTsNCisJCQkJY29uc3VtZUltcG9ydERlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0iKTsNCisJCQkJY29uc3VtZUVtcHR5VHlwZURlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQwNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gVHlwZURlY2xhcmF0aW9ucyIpOw0KKwkJCQljb25zdW1lVHlwZURlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQwNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MDggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsNCisJCQkJY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRGVmYXVsdE1vZGlmaWVycygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQxMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSBNb2RpZmllcnMiKTsNCisJCQkJY29uc3VtZU1vZGlmaWVycygpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQxMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnRzb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlCbG9ja1N0YXRlbWVudHNvcHQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXNvcHQgOjo9Iik7DQorCQkJCWNvbnN1bWVFbXB0eURpbXNvcHQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdG9wdCA6Oj0iKTsNCisJCQkJY29uc3VtZUVtcHR5QXJndW1lbnRMaXN0b3B0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNDE5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQyMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMiKTsNCisJCQkJY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDQyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkVHlwZSA6Oj0iKTsNCisJCQkJY29uc3VtZU5lc3RlZFR5cGUoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXRvcHQgOjo9Iik7DQorCQkJCWNvbnN1bWVFbXB0eUZvckluaXRvcHQoKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA0MjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclVwZGF0ZW9wdCA6Oj0iKTsNCisJCQkJY29uc3VtZUVtcHR5Rm9yVXBkYXRlb3B0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNDMyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaGVzb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlDYXRjaGVzb3B0KCk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNDM0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyb3B0IDo6PSIpOw0KKwkJCQljb25zdW1lRW1wdHlBcnJheUluaXRpYWxpemVyb3B0KCk7DQorCQkJCWJyZWFrOw0KKwkJfQ0KIAl9DQorCQ0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSB7DQorCS8vIEFzc2VydFN0YXRlbWVudCA6Oj0gJ2Fzc2VydCcgRXhwcmVzc2lvbiAnOycNCisJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOw0KKwlwdXNoT25Bc3RTdGFjayhuZXcgQXNzZXJ0U3RhdGVtZW50KGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsJDQogfQ0KKwkNCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uKCkgew0KIAkvLyBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24gOjo9IFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgJzsnDQogDQpAQCAtMzgwNiwxMiArMzg0MCwyNCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVRva2VuKGludCB0eXBlKSB7DQogCS8qIHJlbWVtYmVyIHRoZSBsYXN0IGNvbnN1bWVkIHZhbHVlICovDQogCS8qIHRyeSB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGJ1aWxkIHZhbHVlcyAqLw0KKwlpZiAoc2Nhbm5lci53YXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKSB7DQorCQlTdHJpbmdMaXRlcmFsW10gbGl0ZXJhbHMgPSB0aGlzLnNjYW5uZXIubm9uTkxTU3RyaW5nczsNCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBsaXRlcmFscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KKwkJCXByb2JsZW1SZXBvcnRlcigpLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwobGl0ZXJhbHNbaV0pOw0KKwkJfQ0KKwkJc2Nhbm5lci5jdXJyZW50TGluZSA9IG51bGw7DQorCQlzY2FubmVyLndhc05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSBmYWxzZTsNCisJfQ0KIA0KIAkvL1N5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnRvU3RyaW5nQWN0aW9uKHR5cGUpKTsNCiAJc3dpdGNoICh0eXBlKSB7DQogDQogCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXIgOg0KIAkJCXB1c2hJZGVudGlmaWVyKCk7DQorCQkJaWYgKHNjYW5uZXIudXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyKSB7DQorCQkJCWxvbmcgcG9zaXRpb25zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl07DQorCQkJCXByb2JsZW1SZXBvcnRlcigpLnVzZUFzc2VydEFzQW5JZGVudGlmaWVyKChpbnQpIChwb3NpdGlvbnMgPj4+IDMyKSwgKGludCkgcG9zaXRpb25zKTsNCisJCQl9DQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZWludGVyZmFjZSA6DQpAQCAtMzkzOSw3ICszOTg1LDYgQEAKIAkJCQkJc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSwgDQogCQkJCQlzY2FubmVyLnN0YXJ0UG9zaXRpb24sIA0KIAkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsgDQotCQkJaWYgKHNjYW5uZXIud2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCkgcHJvYmxlbVJlcG9ydGVyKCkubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbChzdHJpbmdMaXRlcmFsKTsNCiAJCQlwdXNoT25FeHByZXNzaW9uU3RhY2soc3RyaW5nTGl0ZXJhbCk7IA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVmYWxzZSA6DQpAQCAtMzk2MSw2ICs0MDA2LDcgQEAKIAkJCWVuZFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOw0KIAkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7DQogCQkJYnJlYWs7DQorCQljYXNlIFRva2VuTmFtZWFzc2VydCA6DQogCQljYXNlIFRva2VuTmFtZWltcG9ydCA6DQogCQljYXNlIFRva2VuTmFtZXBhY2thZ2UgOg0KIAkJY2FzZSBUb2tlbk5hbWV0aHJvdyA6DQpAQCAtNDI5NCwxNyArNDM0MCwxNyBAQAogCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsNCiAJCWN1cnJlbnRFbGVtZW50LnRvcEVsZW1lbnQoKS51cGRhdGVQYXJzZVRyZWUoKTsNCiAJCWlmIChWRVJCT1NFX1JFQ09WRVJZKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50KFV0aWwuYmluZCgicGFyc2VyLnN5bnRheFJlY292ZXJ5Ii8qbm9uTkxTKi8pKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIi8qbm9uTkxTKi8pOwkJDQorCQkJU3lzdGVtLm91dC5wcmludChVdGlsLmJpbmQoInBhcnNlci5zeW50YXhSZWNvdmVyeSIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsJCSAvLyROT04tTkxTLTEkDQogCQkJU3lzdGVtLm91dC5wcmludGxuKGNvbXBpbGF0aW9uVW5pdCk7CQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLypub25OTFMqLyk7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0JCQ0KIAl9IGVsc2Ugew0KIAkJaWYgKGRpZXQgJiBWRVJCT1NFX1JFQ09WRVJZKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50KFV0aWwuYmluZCgicGFyc2VyLnJlZ3VsYXJQYXJzZSIvKm5vbk5MUyovKSk7CQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLypub25OTFMqLyk7CQ0KKwkJCVN5c3RlbS5vdXQucHJpbnQoVXRpbC5iaW5kKCJwYXJzZXIucmVndWxhclBhcnNlIikpOwkgLy8kTk9OLU5MUy0xJA0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsJIC8vJE5PTi1OTFMtMSQNCiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcGlsYXRpb25Vbml0KTsJCQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIvKm5vbk5MUyovKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWlmIChzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IpIHsNCkBAIC00NTUyLDYgKzQ1OTgsMTAgQEAKIAlmaXJzdFRva2VuID0gVG9rZW5OYW1lUExVU19QTFVTIDsNCiAJc2Nhbm5lci5saW5lUHRyID0gLTE7CQ0KIAlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSB0cnVlOw0KKwlzY2FubmVyLmN1cnJlbnRMaW5lTnI9IC0xOw0KKwlzY2FubmVyLnByZXZpb3VzTGluZU5yPSAtMTsNCisJc2Nhbm5lci5jdXJyZW50TGluZT0gbnVsbDsNCisJc2Nhbm5lci5saW5lcz0gbmV3IEFycmF5TGlzdCgpOw0KIH0NCiBwdWJsaWMgdm9pZCBnb0ZvckNvbnN0cnVjdG9yQm9keSgpew0KIAkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBjb21waWxhdGlvbiB1bml0IHBhcnNpbmcNCkBAIC00NjQ0LDcgKzQ2OTQsNyBAQAogDQogCUlkZW50aWZpZXINCiANCi0JYWJzdHJhY3QgYm9vbGVhbiBicmVhayBieXRlIGNhc2UgY2F0Y2ggY2hhciBjbGFzcyANCisJYWJzdHJhY3QgYXNzZXJ0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgDQogCWNvbnRpbnVlIGRlZmF1bHQgZG8gZG91YmxlIGVsc2UgZXh0ZW5kcyBmYWxzZSBmaW5hbCBmaW5hbGx5IGZsb2F0DQogCWZvciBpZiBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIGludA0KIAlpbnRlcmZhY2UgbG9uZyBuYXRpdmUgbmV3IG51bGwgcGFja2FnZSBwcml2YXRlDQpAQCAtNDc3NSw3ICs0ODI1LDcgQEAKIEdvYWwgOjo9ICc9PScgQ29uc3RydWN0b3JCb2R5DQogLS0gSW5pdGlhbGl6ZXINCiBHb2FsIDo6PSAnPj4nIFN0YXRpY0luaXRpYWxpemVyDQotR29hbCA6Oj0gJz4+JyBDbGFzc0JvZHlEZWNsYXJhdGlvbg0KK0dvYWwgOjo9ICc+PicgSW5pdGlhbGl6ZXINCiAtLSBlcnJvciByZWNvdmVyeQ0KIEdvYWwgOjo9ICc+Pj4nIEhlYWRlcnMNCiBHb2FsIDo6PSAnKicgQmxvY2tTdGF0ZW1lbnRzDQpAQCAtNDk3OSw2ICs1MDI5LDkgQEAKIERpZXQgOjo9ICRlbXB0eQ0KIC8uJHB1dENhc2UgY29uc3VtZURpZXQoKTsgJGJyZWFrLi8NCiANCitJbml0aWFsaXplciA6Oj0gRGlldCBOZXN0ZWRNZXRob2QgQmxvY2sNCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8NCisNCiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IEZpZWxkRGVjbGFyYXRpb24NCiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IE1ldGhvZERlY2xhcmF0aW9uDQogLS0xLjEgZmVhdHVyZQ0KQEAgLTUyNzksNiArNTMzMiw3IEBACiBTdGF0ZW1lbnROb1Nob3J0SWYgLT4gV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYNCiBTdGF0ZW1lbnROb1Nob3J0SWYgLT4gRm9yU3RhdGVtZW50Tm9TaG9ydElmDQogDQorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEFzc2VydFN0YXRlbWVudA0KIFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBCbG9jaw0KIFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBFbXB0eVN0YXRlbWVudA0KIFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBFeHByZXNzaW9uU3RhdGVtZW50DQpAQCAtNTM3Myw2ICs1NDI3LDEzIEBACiBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgJywnIFN0YXRlbWVudEV4cHJlc3Npb24NCiAvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCgpIDsgJGJyZWFrIC4vDQogDQorLS0gMS40IGZlYXR1cmUNCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzsnDQorLy4kcHV0Q2FzZSBjb25zdW1lU2ltcGxlQXNzZXJ0U3RhdGVtZW50KCkgOyAkYnJlYWsgLi8NCisNCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzonIEV4cHJlc3Npb24gJzsnDQorLy4kcHV0Q2FzZSBjb25zdW1lQXNzZXJ0U3RhdGVtZW50KCkgOyAkYnJlYWsgLi8NCisgICAgICAgICAgDQogQnJlYWtTdGF0ZW1lbnQgOjo9ICdicmVhaycgJzsnDQogLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50QnJlYWsoKSA7ICRicmVhayAuLw0KIA0KQEAgLTYwMDYsMjEgKzYwNjcsMjEgQEAKIAlsYXN0RXJyb3JFbmRQb3NpdGlvbiA9IC0xOw0KIH0NCiBwdWJsaWMgdm9pZCBpbml0aWFsaXplU2Nhbm5lcigpew0KLQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgZmFsc2UsIHRoaXMucHJvYmxlbVJlcG9ydGVyLm9wdGlvbnMuaXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsSGFuZGxlZEFzV2FybmluZygpKTsNCisJdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIGZhbHNlLCB0aGlzLnByb2JsZW1SZXBvcnRlci5vcHRpb25zLmdldE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxTZXZlcml0eSgpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSAsIHRoaXMuYXNzZXJ0TW9kZSk7DQogfQ0KIHB1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBpbml0VGFibGVzKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KIA0KIAlmaW5hbCBTdHJpbmcgcHJlZml4ID0gRklMRVBSRUZJWDsNCiAJaW50IGkgPSAwOw0KLQlsaHMgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIvKm5vbk5MUyovKTsNCi0JY2hhcltdIGNoYXJzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiLypub25OTFMqLyk7DQorCWxocyA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIGNoYXJzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJA0KIAljaGVja190YWJsZSA9IG5ldyBzaG9ydFtjaGFycy5sZW5ndGhdOw0KIAlmb3IgKGludCBjID0gY2hhcnMubGVuZ3RoOyBjLS0gPiAwOykgew0KIAkJY2hlY2tfdGFibGVbY10gPSAoc2hvcnQpIChjaGFyc1tjXSAtIDMyNzY4KTsNCiAJfQ0KLQlhc2IgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIvKm5vbk5MUyovKTsNCi0JYXNyID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiLypub25OTFMqLyk7DQotCXN5bWJvbF9pbmRleCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIi8qbm9uTkxTKi8pOw0KKwlhc2IgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkDQorCWFzciA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQNCisJc3ltYm9sX2luZGV4ID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJA0KIAlhY3Rpb24gPSBsaHM7DQogfQ0KIHB1YmxpYyBmaW5hbCB2b2lkIGp1bXBPdmVyTWV0aG9kQm9keSgpIHsNCkBAIC02NjQwLDcgKzY3MDEsNyBAQAogDQogCUlucHV0U3RyZWFtIHN0cmVhbSA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsNCiAJaWYgKHN0cmVhbSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihVdGlsLmJpbmQoInBhcnNlci5taXNzaW5nRmlsZSIvKm5vbk5MUyovLGZpbGVuYW1lKSk7DQorCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihVdGlsLmJpbmQoInBhcnNlci5taXNzaW5nRmlsZSIsZmlsZW5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMzIwMDApOw0KQEAgLTY2NTgsNyArNjcxOSw3IEBACiANCiAJLy9taW5pbWFsIGludGVncml0eSBjaGVjayAoZXZlbiBzaXplIGV4cGVjdGVkKQ0KIAlpZiAoc3RyZWFtTGVuZ3RoICUgMiAhPSAwKQ0KLQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJwYXJzZXIuY29ycnVwdGVkRmlsZSIvKm5vbk5MUyovLGZpbGVuYW1lKSk7DQorCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihVdGlsLmJpbmQoInBhcnNlci5jb3JydXB0ZWRGaWxlIixmaWxlbmFtZSkpOyAvLyROT04tTkxTLTEkDQogDQogCS8vIGNvbnZlcnQgYnl0ZXMgaW50byBjaGFycw0KIAljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltzdHJlYW1MZW5ndGggLyAyXTsNCkBAIC02NzQxLDkgKzY4MDIsOSBAQAogCQl9DQogCX0gZWxzZSB7IC8vdGhlIG5leHQgdGVzdCBpcyBIRUFWSUxZIGdyYW1tYXIgREVQRU5ERU5ULg0KIAkJaWYgKChsZW5ndGggPT0gMikNCi0JCQkmJiAodG9rZW5OYW1lLmVxdWFscygiOyIvKm5vbk5MUyovKSkNCi0JCQkmJiAoZXhwZWN0aW5nc1swXSA9PSAiKysiLypub25OTFMqLykNCi0JCQkmJiAoZXhwZWN0aW5nc1sxXSA9PSAiLS0iLypub25OTFMqLykNCisJCQkmJiAodG9rZW5OYW1lLmVxdWFscygiOyIpKSAvLyROT04tTkxTLTEkDQorCQkJJiYgKGV4cGVjdGluZ3NbMF0gPT0gIisrIikgLy8kTk9OLU5MUy0xJA0KKwkJCSYmIChleHBlY3RpbmdzWzFdID09ICItLSIpIC8vJE5PTi1OTFMtMSQNCiAJCQkmJiAoZXhwcmVzc2lvblB0ciA+IC0xKSkgew0KIAkJCS8vIHRoZSA7IGlzIG5vdCB0aGUgZXhwZWN0ZWQgdG9rZW4gPT0+IGl0IGVuZHMgYSBzdGF0ZW1lbnQgd2hlbiBhbiBleHByZXNzaW9uIGlzIG5vdCBlbmRlZA0KIAkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRFeHByZXNzaW9uQXNTdGF0ZW1lbnQoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKTsNCkBAIC02ODQ0LDQwICs2OTA1LDQwIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiANCi0JU3RyaW5nIHMgPSAiaWRlbnRpZmllclN0YWNrIDogY2hhcltdW10gPSB7Ii8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gImlkZW50aWZpZXJTdGFjayA6IGNoYXJbXVtdID0geyI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPD0gaWRlbnRpZmllclB0cjsgaSsrKSB7DQotCQlzID0gcyArICJcIiIvKm5vbk5MUyovICsgU3RyaW5nLnZhbHVlT2YoaWRlbnRpZmllclN0YWNrW2ldKSArICJcIiwiLypub25OTFMqLzsNCisJCXMgPSBzICsgIlwiIiArIFN0cmluZy52YWx1ZU9mKGlkZW50aWZpZXJTdGFja1tpXSkgKyAiXCIsIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCX07DQotCXMgPSBzICsgIn1cbiIvKm5vbk5MUyovOw0KKwlzID0gcyArICJ9XG4iOyAvLyROT04tTkxTLTEkDQogDQotCXMgPSBzICsgImlkZW50aWVyTGVuZ3RoU3RhY2sgOiBpbnRbXSA9IHsiLypub25OTFMqLzsNCisJcyA9IHMgKyAiaWRlbnRpZXJMZW5ndGhTdGFjayA6IGludFtdID0geyI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPD0gaWRlbnRpZmllckxlbmd0aFB0cjsgaSsrKSB7DQotCQlzID0gcyArIGlkZW50aWZpZXJMZW5ndGhTdGFja1tpXSArICIsIi8qbm9uTkxTKi87DQorCQlzID0gcyArIGlkZW50aWZpZXJMZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJA0KIAl9Ow0KLQlzID0gcyArICJ9XG4iLypub25OTFMqLzsNCisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQlzID0gcyArICJhc3RMZW5ndGhTdGFjayA6IGludFtdID0geyIvKm5vbk5MUyovOw0KKwlzID0gcyArICJhc3RMZW5ndGhTdGFjayA6IGludFtdID0geyI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPD0gYXN0TGVuZ3RoUHRyOyBpKyspIHsNCi0JCXMgPSBzICsgYXN0TGVuZ3RoU3RhY2tbaV0gKyAiLCIvKm5vbk5MUyovOw0KKwkJcyA9IHMgKyBhc3RMZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJA0KIAl9Ow0KLQlzID0gcyArICJ9XG4iLypub25OTFMqLzsNCi0JcyA9IHMgKyAiYXN0UHRyIDogaW50ID0gIi8qbm9uTkxTKi8gKyBTdHJpbmcudmFsdWVPZihhc3RQdHIpICsgIlxuIi8qbm9uTkxTKi87DQorCXMgPSBzICsgIn1cbiI7IC8vJE5PTi1OTFMtMSQNCisJcyA9IHMgKyAiYXN0UHRyIDogaW50ID0gIiArIFN0cmluZy52YWx1ZU9mKGFzdFB0cikgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiANCi0JcyA9IHMgKyAiaW50U3RhY2sgOiBpbnRbXSA9IHsiLypub25OTFMqLzsNCisJcyA9IHMgKyAiaW50U3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDw9IGludFB0cjsgaSsrKSB7DQotCQlzID0gcyArIGludFN0YWNrW2ldICsgIiwiLypub25OTFMqLzsNCisJCXMgPSBzICsgaW50U3RhY2tbaV0gKyAiLCI7IC8vJE5PTi1OTFMtMSQNCiAJfTsNCi0JcyA9IHMgKyAifVxuIi8qbm9uTkxTKi87DQorCXMgPSBzICsgIn1cbiI7IC8vJE5PTi1OTFMtMSQNCiANCi0JcyA9IHMgKyAiZXhwcmVzc2lvbkxlbmd0aFN0YWNrIDogaW50W10gPSB7Ii8qbm9uTkxTKi87DQorCXMgPSBzICsgImV4cHJlc3Npb25MZW5ndGhTdGFjayA6IGludFtdID0geyI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPD0gZXhwcmVzc2lvbkxlbmd0aFB0cjsgaSsrKSB7DQotCQlzID0gcyArIGV4cHJlc3Npb25MZW5ndGhTdGFja1tpXSArICIsIi8qbm9uTkxTKi87DQorCQlzID0gcyArIGV4cHJlc3Npb25MZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJA0KIAl9Ow0KLQlzID0gcyArICJ9XG4iLypub25OTFMqLzsNCisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQlzID0gcyArICJleHByZXNzaW9uUHRyIDogaW50ID0gIi8qbm9uTkxTKi8gKyBTdHJpbmcudmFsdWVPZihleHByZXNzaW9uUHRyKSArICJcbiIvKm5vbk5MUyovOw0KKwlzID0gcyArICJleHByZXNzaW9uUHRyIDogaW50ID0gIiArIFN0cmluZy52YWx1ZU9mKGV4cHJlc3Npb25QdHIpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogDQotCXMgPSBzICsgIlxuXG5cbi0tLS0tLS0tLS0tLS0tLS1TY2FubmVyLS0tLS0tLS0tLS0tLS1cbiIvKm5vbk5MUyovICsgc2Nhbm5lci50b1N0cmluZygpOw0KKwlzID0gcyArICJcblxuXG4tLS0tLS0tLS0tLS0tLS0tU2Nhbm5lci0tLS0tLS0tLS0tLS0tXG4iICsgc2Nhbm5lci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIA0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlckJhc2ljSW5mb3JtYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhCmluZGV4IDA2MDZlM2EuLjM0OWM0YmIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhCkBAIC0xMCwyMSArMTAsMjIgQEAKIA0KIHB1YmxpYyBpbnRlcmZhY2UgUGFyc2VyQmFzaWNJbmZvcm1hdGlvbiB7DQogDQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX1NZTUJPTCA9IDMwNCwNCi0JICBNQVhfTkFNRV9MRU5HVEggICA9IDM2LA0KLQkgIE5VTV9TVEFURVMgICAgICAgID0gNTg2LA0KLQkgIE5UX09GRlNFVCAgICAgICAgID0gMzA1LA0KLQkgIFNDT1BFX1VCT1VORCAgICAgID0gLTEsDQotCSAgU0NPUEVfU0laRSAgICAgICAgPSAwLA0KLQkgIExBX1NUQVRFX09GRlNFVCAgID0gMTc3NTQsDQotCSAgTUFYX0xBICAgICAgICAgICAgPSAxLA0KLQkgIE5VTV9SVUxFUyAgICAgICAgID0gNDMxLA0KLQkgIE5VTV9URVJNSU5BTFMgICAgID0gMTA0LA0KLQkgIE5VTV9OT05fVEVSTUlOQUxTID0gMjAxLA0KLQkgIE5VTV9TWU1CT0xTICAgICAgID0gMzA1LA0KLQkgIFNUQVJUX1NUQVRFICAgICAgID0gMTI2MTQsDQotCSAgRU9GVF9TWU1CT0wgICAgICAgPSAxNTYsDQotCSAgRU9MVF9TWU1CT0wgICAgICAgPSAxNTYsDQotCSAgQUNDRVBUX0FDVElPTiAgICAgPSAxNzc1MywNCi0JICBFUlJPUl9BQ1RJT04gICAgICA9IDE3NzU0Ow0KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludA0KKyAgICAgIEVSUk9SX1NZTUJPTCAgICAgID0gMzA3LA0KKyAgICAgIE1BWF9OQU1FX0xFTkdUSCAgID0gMzYsDQorICAgICAgTlVNX1NUQVRFUyAgICAgICAgPSA1OTEsDQorICAgICAgTlRfT0ZGU0VUICAgICAgICAgPSAzMDgsDQorICAgICAgU0NPUEVfVUJPVU5EICAgICAgPSAtMSwNCisgICAgICBTQ09QRV9TSVpFICAgICAgICA9IDAsDQorICAgICAgTEFfU1RBVEVfT0ZGU0VUICAgPSAxNjk2NSwNCisgICAgICBNQVhfTEEgICAgICAgICAgICA9IDEsDQorICAgICAgTlVNX1JVTEVTICAgICAgICAgPSA0MzUsDQorICAgICAgTlVNX1RFUk1JTkFMUyAgICAgPSAxMDUsDQorICAgICAgTlVNX05PTl9URVJNSU5BTFMgPSAyMDMsDQorICAgICAgTlVNX1NZTUJPTFMgICAgICAgPSAzMDgsDQorICAgICAgU1RBUlRfU1RBVEUgICAgICAgPSAxMjI1OSwNCisgICAgICBFT0ZUX1NZTUJPTCAgICAgICA9IDE1OCwNCisgICAgICBFT0xUX1NZTUJPTCAgICAgICA9IDE1OCwNCisgICAgICBBQ0NFUFRfQUNUSU9OICAgICA9IDE2OTY0LA0KKyAgICAgIEVSUk9SX0FDVElPTiAgICAgID0gMTY5NjU7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQmxvY2suamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQmxvY2suamF2YQppbmRleCBhMjZiZGFhLi42NDg3ZTgzIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEJsb2NrLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhCkBAIC0xMzQsMTEgKzEzNCwxMSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgew0KIAlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7DQotCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCBibG9jazpcbiIvKm5vbk5MUyovKTsNCisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIGJsb2NrOlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJcmVzdWx0LmFwcGVuZChibG9ja0RlY2xhcmF0aW9uLnRvU3RyaW5nKHRhYiArIDEpKTsNCiAJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc3RhdGVtZW50Q291bnQ7IGkrKykgew0KLQkJCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlyZXN1bHQuYXBwZW5kKHRoaXMuc3RhdGVtZW50c1tpXS50b1N0cmluZyh0YWIgKyAxKSk7DQogCQl9DQogCX0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEVsZW1lbnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhCmluZGV4IDRkZTAxZTguLjNlODY2NjMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhCkBAIC0yMTUsNyArMjE1LDcgQEAKIHByb3RlY3RlZCBTdHJpbmcgdGFiU3RyaW5nKGludCB0YWIpIHsNCiAJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJZm9yIChpbnQgaSA9IHRhYjsgaSA+IDA7IGktLSkgew0KLQkJcmVzdWx0LmFwcGVuZCgiICAiLypub25OTFMqLyk7DQorCQlyZXN1bHQuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEZpZWxkLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEZpZWxkLmphdmEKaW5kZXggN2QzODAwYy4uYzFlZmFjYiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRmllbGQuamF2YQpAQCAtODUsMTEgKzg1LDExIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKXsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOw0KLQlidWZmZXIuYXBwZW5kKCJSZWNvdmVyZWQgZmllbGQ6XG4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlJlY292ZXJlZCBmaWVsZDpcbiIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoZmllbGREZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7DQogCWlmICh0aGlzLmFub255bW91c1R5cGVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm9ueW1vdXNUeXBlQ291bnQ7IGkrKyl7DQotCQkJYnVmZmVyLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJ1ZmZlci5hcHBlbmQoYW5vbnltb3VzVHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSkpOw0KIAkJfQ0KIAl9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbXBvcnQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW1wb3J0LmphdmEKaW5kZXggMTM5ZGVhZC4uYWYwNDkzZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbXBvcnQuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEltcG9ydC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAJcmV0dXJuIHRoaXMuaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsNCi0JcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBpbXBvcnQ6ICIvKm5vbk5MUyovICsgaW1wb3J0UmVmZXJlbmNlLnRvU3RyaW5nKCk7DQorCXJldHVybiB0YWJTdHJpbmcodGFiKSArICJSZWNvdmVyZWQgaW1wb3J0OiAiICsgaW1wb3J0UmVmZXJlbmNlLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIEltcG9ydFJlZmVyZW5jZSB1cGRhdGVkSW1wb3J0UmVmZXJlbmNlKCl7DQogDQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhCmluZGV4IDM2ZjQxYjkuLjMzNzI5MjUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEluaXRpYWxpemVyLmphdmEKQEAgLTE2MSwxMCArMTYxLDEwIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7DQogCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlN0cmluZyh0YWIpKTsNCi0JcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIGluaXRpYWxpemVyOlxuIi8qbm9uTkxTKi8pOw0KKwlyZXN1bHQuYXBwZW5kKCJSZWNvdmVyZWQgaW5pdGlhbGl6ZXI6XG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXN1bHQuYXBwZW5kKHRoaXMuZmllbGREZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7DQogCWlmICh0aGlzLmluaXRpYWxpemVyQm9keSAhPSBudWxsKSB7DQotCQlyZXN1bHQuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCisJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCXJlc3VsdC5hcHBlbmQodGhpcy5pbml0aWFsaXplckJvZHkudG9TdHJpbmcodGFiICsgMSkpOw0KIAl9DQogCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZExvY2FsVmFyaWFibGUuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCmluZGV4IDNkM2RmM2EuLmRlNzcyMjcgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAJcmV0dXJuIHRoaXMubG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7DQotCXJldHVybiB0YWJTdHJpbmcodGFiKSArICJSZWNvdmVyZWQgbG9jYWwgdmFyaWFibGU6XG4iLypub25OTFMqLyArIGxvY2FsRGVjbGFyYXRpb24udG9TdHJpbmcodGFiICsgMSk7DQorCXJldHVybiB0YWJTdHJpbmcodGFiKSArICJSZWNvdmVyZWQgbG9jYWwgdmFyaWFibGU6XG4iICsgbG9jYWxEZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiBwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoKXsNCiAJcmV0dXJuIGxvY2FsRGVjbGFyYXRpb247DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTWV0aG9kLmphdmEKaW5kZXggZDMzMDQ1NC4uNDliNjQyZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZE1ldGhvZC5qYXZhCkBAIC0xODksMTYgKzE4OSwxNiBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgew0KIAlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7DQotCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCBtZXRob2Q6XG4iLypub25OTFMqLyk7DQorCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCBtZXRob2Q6XG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXN1bHQuYXBwZW5kKHRoaXMubWV0aG9kRGVjbGFyYXRpb24udG9TdHJpbmcodGFiICsgMSkpOw0KIAlpZiAodGhpcy5sb2NhbFR5cGVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sb2NhbFR5cGVDb3VudDsgaSsrKSB7DQotCQkJcmVzdWx0LmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCXJlc3VsdC5hcHBlbmQodGhpcy5sb2NhbFR5cGVzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsNCiAJCX0NCiAJfQ0KIAlpZiAodGhpcy5tZXRob2RCb2R5ICE9IG51bGwpIHsNCi0JCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJcmVzdWx0LmFwcGVuZCh0aGlzLm1ldGhvZEJvZHkudG9TdHJpbmcodGFiICsgMSkpOw0KIAl9DQogCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFN0YXRlbWVudC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRTdGF0ZW1lbnQuamF2YQppbmRleCA0OGJlMDE0Li41YWI1OTdhIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFN0YXRlbWVudC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIAlyZXR1cm4gdGhpcy5zdGF0ZW1lbnQuc291cmNlRW5kOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpew0KLQlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIHN0YXRlbWVudDpcbiIvKm5vbk5MUyovICsgc3RhdGVtZW50LnRvU3RyaW5nKHRhYiArIDEpOw0KKwlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIHN0YXRlbWVudDpcbiIgKyBzdGF0ZW1lbnQudG9TdHJpbmcodGFiICsgMSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIFN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50KCl7DQogCXJldHVybiBzdGF0ZW1lbnQ7DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQppbmRleCBlMWJjMTdmLi40OGJhZTE0IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQpAQCAtMTg1LDI3ICsxODUsMjcgQEAKIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsNCiAJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOw0KLQlyZXN1bHQuYXBwZW5kKCJSZWNvdmVyZWQgdHlwZTpcbiIvKm5vbk5MUyovKTsNCisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIHR5cGU6XG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIHsNCiAJCXJlc3VsdC5hcHBlbmQodGFiU3RyaW5nKHRhYikpOw0KLQkJcmVzdWx0LmFwcGVuZCgiICIvKm5vbk5MUyovKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXJlc3VsdC5hcHBlbmQodHlwZURlY2xhcmF0aW9uLnRvU3RyaW5nKHRhYiArIDEpKTsNCiAJaWYgKHRoaXMubWVtYmVyVHlwZXMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlclR5cGVDb3VudDsgaSsrKSB7DQotCQkJcmVzdWx0LmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCXJlc3VsdC5hcHBlbmQodGhpcy5tZW1iZXJUeXBlc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7DQogCQl9DQogCX0NCiAJaWYgKHRoaXMuZmllbGRzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5maWVsZENvdW50OyBpKyspIHsNCi0JCQlyZXN1bHQuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCisJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJcmVzdWx0LmFwcGVuZCh0aGlzLmZpZWxkc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7DQogCQl9DQogCX0NCiAJaWYgKHRoaXMubWV0aG9kcyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWV0aG9kQ291bnQ7IGkrKykgew0KLQkJCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlyZXN1bHQuYXBwZW5kKHRoaXMubWV0aG9kc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7DQogCQl9DQogCX0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFVuaXQuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCmluZGV4IGViNjc4MDQuLjgzYTQzOGUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCkBAIC0xMDYsMTkgKzEwNiwxOSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgew0KIAlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7DQotCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCB1bml0OiBbXG4iLypub25OTFMqLyk7DQorCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCB1bml0OiBbXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXN1bHQuYXBwZW5kKHVuaXREZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7DQogCXJlc3VsdC5hcHBlbmQodGFiU3RyaW5nKHRhYiArIDEpKTsNCi0JcmVzdWx0LmFwcGVuZCgiXSIvKm5vbk5MUyovKTsNCisJcmVzdWx0LmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkDQogCWlmICh0aGlzLmltcG9ydHMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmltcG9ydENvdW50OyBpKyspIHsNCi0JCQlyZXN1bHQuYXBwZW5kKCJcbiIvKm5vbk5MUyovKTsNCisJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJcmVzdWx0LmFwcGVuZCh0aGlzLmltcG9ydHNbaV0udG9TdHJpbmcodGFiICsgMSkpOw0KIAkJfQ0KIAl9DQogCWlmICh0aGlzLnR5cGVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50eXBlQ291bnQ7IGkrKykgew0KLQkJCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlyZXN1bHQuYXBwZW5kKHRoaXMudHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSkpOw0KIAkJfQ0KIAl9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9TY2FubmVyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXIuamF2YQppbmRleCBhNDQyMTMyLi41MjY0NzkyIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXIuamF2YQpAQCAtNCw4ICs0LDExIEBACiAgKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogICovDQotDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQogaW1wb3J0IGphdmEuaW8uKjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsOw0KIA0KIHB1YmxpYyBjbGFzcyBTY2FubmVyIGltcGxlbWVudHMgVGVybWluYWxTeW1ib2xzIHsNCiANCkBAIC0xOCw2ICsyMSwxMSBAQAogCSAtIGN1cnJlbnRQb3NpdGlvbi0xIGdpdmVzIHRoZSBzb3VyY2VFbmQgcG9zaXRpb24gaW50byB0aGUgc3RyZWFtIA0KIAkqLw0KIA0KKwkvLyAxLjQgZmVhdHVyZQ0KKwlwdWJsaWMgYm9vbGVhbiBhc3NlcnRNb2RlOw0KKwlwdWJsaWMgYm9vbGVhbiB1c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsNCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNBc3NlcnRLZXl3b3JkID0gZmFsc2U7DQorCQ0KIAlwdWJsaWMgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yOw0KIAlwdWJsaWMgY2hhciBjdXJyZW50Q2hhcmFjdGVyOw0KIAlwdWJsaWMgaW50IHN0YXJ0UG9zaXRpb247DQpAQCAtNjIsMjEgKzcwLDIxIEBACiAJcHVibGljIGludCBsaW5lUHRyID0gLTE7DQogCXB1YmxpYyBib29sZWFuIHdhc0FjciA9IGZhbHNlOw0KIA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfT0ZfU09VUkNFID0gIkVuZF9PZl9Tb3VyY2UiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09GX1NPVVJDRSA9ICJFbmRfT2ZfU291cmNlIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0hFWEEgPSAiSW52YWxpZF9IZXhhX0xpdGVyYWwiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9PQ1RBTCA9ICJJbnZhbGlkX09jdGFsX0xpdGVyYWwiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9IRVhBID0gIkludmFsaWRfSGV4YV9MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX09DVEFMID0gIkludmFsaWRfT2N0YWxfTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQNCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQgPSANCi0JCSJJbnZhbGlkX0NoYXJhY3Rlcl9Db25zdGFudCIvKm5vbk5MUyovOyANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9FU0NBUEUgPSAiSW52YWxpZF9Fc2NhcGUiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9JTlBVVCA9ICJJbnZhbGlkX0lucHV0Ii8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfVU5JQ09ERV9FU0NBUEUgPSAiSW52YWxpZF9Vbmljb2RlX0VzY2FwZSIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0ZMT0FUID0gIkludmFsaWRfRmxvYXRfTGl0ZXJhbCIvKm5vbk5MUyovOw0KKwkJIkludmFsaWRfQ2hhcmFjdGVyX0NvbnN0YW50IjsgIC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9FU0NBUEUgPSAiSW52YWxpZF9Fc2NhcGUiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfSU5QVVQgPSAiSW52YWxpZF9JbnB1dCI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSA9ICJJbnZhbGlkX1VuaWNvZGVfRXNjYXBlIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0ZMT0FUID0gIkludmFsaWRfRmxvYXRfTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9TT1VSQ0VfU1RSSU5HID0gIk51bGxfU291cmNlX1N0cmluZyIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlRFUk1JTkFURURfU1RSSU5HID0gIlVudGVybWluYXRlZF9TdHJpbmciLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5URVJNSU5BVEVEX0NPTU1FTlQgPSAiVW50ZXJtaW5hdGVkX0NvbW1lbnQiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9DSEFSX0lOX1NUUklORyA9ICJJbnZhbGlkX0NoYXJfSW5fU3RyaW5nIi8qbm9uTkxTKi87DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfU09VUkNFX1NUUklORyA9ICJOdWxsX1NvdXJjZV9TdHJpbmciOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOVEVSTUlOQVRFRF9TVFJJTkcgPSAiVW50ZXJtaW5hdGVkX1N0cmluZyI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5URVJNSU5BVEVEX0NPTU1FTlQgPSAiVW50ZXJtaW5hdGVkX0NvbW1lbnQiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfQ0hBUl9JTl9TVFJJTkcgPSAiSW52YWxpZF9DaGFyX0luX1N0cmluZyI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLy8tLS0tLS0tLS0tLS0tLS0tb3B0aW1pemVkIGlkZW50aWZpZXIgbWFuYWdtZW50LS0tLS0tLS0tLS0tLS0tLS0tDQogCXN0YXRpYyBmaW5hbCBjaGFyW10gY2hhckFycmF5X2EgPSBuZXcgY2hhcltdIHsnYSd9LCANCkBAIC0xMTMsOSArMTIxLDE4IEBACiAJcHVibGljIC8qc3RhdGljKi8gZmluYWwgY2hhcltdW11bXVtdIGNoYXJBcnJheV9sZW5ndGggPSANCiAJCW5ldyBjaGFyW09wdGltaXplZExlbmd0aF1bVGFibGVTaXplXVtJbnRlcm5hbFRhYmxlU2l6ZV1bXTsgDQogCS8vIHN1cHBvcnQgZm9yIGRldGVjdGluZyBub24tZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFscw0KKwlpbnQgY3VycmVudExpbmVOcj0gLTE7DQorCWludCBwcmV2aW91c0xpbmVOcj0gLTE7DQorCU5MU0xpbmUgY3VycmVudExpbmU9IG51bGw7DQorCUxpc3QgbGluZXM9IG5ldyBBcnJheUxpc3QoKTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BSRUZJWD0gIi8vJE5PTi1OTFMtIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUFJFRklYX0xFTkdUSD0gVEFHX1BSRUZJWC5sZW5ndGgoKTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPU1RGSVg9ICIkIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUE9TVEZJWF9MRU5HVEg9IFRBR19QT1NURklYLmxlbmd0aCgpOw0KKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbFtdIG5vbk5MU1N0cmluZ3MgPSBudWxsOw0KIAlwdWJsaWMgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gdHJ1ZTsNCi0JcHVibGljIHN0YXRpYyBjaGFyW10gTm9uTkxTX1RBRyA9ICIvKm5vbk5MUyovIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCiAJcHVibGljIGJvb2xlYW4gd2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IGZhbHNlOw0KKwkNCiAJLypzdGF0aWMqLyB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgew0KIAkJCWZvciAoaW50IGogPSAwOyBqIDwgVGFibGVTaXplOyBqKyspIHsNCkBAIC02NDAsOSArNjU3LDE0IEBACiAJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7DQogCQkJCQlpc1doaXRlU3BhY2UgPSBqdW1wT3ZlclVuaWNvZGVXaGl0ZVNwYWNlKCk7DQogCQkJCX0gZWxzZSB7DQotCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcg0KLQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpDQotCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsNCisJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgew0KKwkJCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVTdHJpbmcoKTsNCisJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcikgew0KKwkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCWxpbmVQdHIrKzsNCisJCQkJCQl9DQorCQkJCQl9DQogCQkJCQlpc1doaXRlU3BhY2UgPSANCiAJCQkJCQkoY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXJhY3Rlcik7IA0KIAkJCQl9DQpAQCAtOTE2LDE1ICs5MzgsMTggQEAKIAkJCQkJCX0NCiAJCQkJCQl0aHJvdyBlOyAvLyByZXRocm93DQogCQkJCQl9DQotCQkJCQlpZiAoY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyl7IC8vIGNoZWNrIGZvciBwcmVzZW5jZSBvZgkvKm5vbk5MUyovDQotCQkJCQkJaW50IGxvb2tBaGVhZCA9IDA7DQotCQkJCQkJZm9yICg7IGxvb2tBaGVhZCA8IDEwOyBsb29rQWhlYWQrKyl7DQotCQkJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWQgPT0gc291cmNlLmxlbmd0aCkNCi0JCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gIT0gTm9uTkxTX1RBR1tsb29rQWhlYWRdKQ0KLQkJCQkJCQkJYnJlYWs7DQorCQkJCQlpZiAoY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyl7IC8vIGNoZWNrIGZvciBwcmVzZW5jZSBvZglOTFMgdGFncyAvLyROT04tTkxTLT8kIHdoZXJlID8gaXMgYW4gaW50Lg0KKwkJCQkJCWN1cnJlbnRMaW5lTnIgPSBsaW5lUHRyOw0KKwkJCQkJCWlmIChjdXJyZW50TGluZU5yICE9IHByZXZpb3VzTGluZU5yKSB7DQorCQkJCQkJCWN1cnJlbnRMaW5lPSBuZXcgTkxTTGluZShjdXJyZW50TGluZU5yKTsNCisJCQkJCQkJbGluZXMuYWRkKGN1cnJlbnRMaW5lKTsNCisJCQkJCQkJcHJldmlvdXNMaW5lTnI9IGN1cnJlbnRMaW5lTnI7DQogCQkJCQkJfQ0KLQkJCQkJCXRoaXMud2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IGxvb2tBaGVhZCAhPSAxMDsNCisJCQkJCQljdXJyZW50TGluZS5hZGQoDQorCQkJCQkJCW5ldyBTdHJpbmdMaXRlcmFsKA0KKwkJCQkJCQkJZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCksIA0KKwkJCQkJCQkJc3RhcnRQb3NpdGlvbiwgDQorCQkJCQkJCQljdXJyZW50UG9zaXRpb24gLSAxKSk7DQogCQkJCQl9DQogCQkJCQlyZXR1cm4gVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDsNCiAJCQkJY2FzZSAnLycgOg0KQEAgLTk5MiwxMyArMTAxNywxOCBAQAogCQkJCQkJCQkJfSAvL2p1bXAgb3ZlciB0aGUgXFwNCiAJCQkJCQkJCX0NCiAJCQkJCQkJCXJlY29yZENvbW1lbnQoZmFsc2UpOw0KLQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3INCi0JCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQ0KLQkJCQkJCQkJCWlmIChpc1VuaWNvZGUpIHsNCi0JCQkJCQkJCQkJcHVzaFVuaWNvZGVMaW5lU2VwYXJhdG9yKCk7DQorCQkJCQkJCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsNCisJCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7DQorCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsNCisJCQkJCQkJCQkJaWYgKGlzVW5pY29kZSkgew0KKwkJCQkJCQkJCQkJcHVzaFVuaWNvZGVMaW5lU2VwYXJhdG9yKCk7DQorCQkJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOw0KKwkJCQkJCQkJCQl9DQogCQkJCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsNCisJCQkJCQkJCQkJbGluZVB0cisrOw0KIAkJCQkJCQkJCX0NCisJCQkJCQkJCX0NCiAJCQkJCQkJCWlmICh0b2tlbml6ZUNvbW1lbnRzKSB7DQogCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsNCiAJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kDQpAQCAtMTAwNiwxMCArMTAzNiwxMCBAQAogCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsNCiAJCQkJCQkJCX0NCiAJCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vYW4gZW9mIHdpbGwgdGhlbSBiZSBnZW5lcmF0ZWQNCi0JCQkJCQkJCWlmICh0b2tlbml6ZUNvbW1lbnRzKSB7DQotCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kDQotCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsNCi0JCQkJCQkJCX0NCisJCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgew0KKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24tLTsgLy8gcmVzZXQgb25lIGNoYXJhY3RlciBiZWhpbmQNCisJCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsNCisJCQkJCQkJCQl9DQogCQkJCQkJCX0NCiAJCQkJCQkJYnJlYWs7DQogCQkJCQkJfQ0KQEAgLTEwMzAsOSArMTA2MCwxNCBAQAogCQkJCQkJCQlpc0phdmFkb2MgPSB0cnVlOw0KIAkJCQkJCQkJc3RhciA9IHRydWU7DQogCQkJCQkJCX0NCi0JCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3INCi0JCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpDQotCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOw0KKwkJCQkJCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsNCisJCQkJCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVTdHJpbmcoKTsNCisJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7DQorCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsNCisJCQkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCQkJbGluZVB0cisrOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQogCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgDQogCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykNCiAJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgew0KQEAgLTEwNTAsOSArMTA4NSwxNCBAQAogCQkJCQkJCQl9DQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8NCiAJCQkJCQkJCXdoaWxlICgoY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsNCi0JCQkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcg0KLQkJCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQ0KLQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOw0KKwkJCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgew0KKwkJCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7DQorCQkJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7DQorCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOw0KKwkJCQkJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQkJCQkJbGluZVB0cisrOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJfQ0KIAkJCQkJCQkJCXN0YXIgPSBjdXJyZW50Q2hhcmFjdGVyID09ICcqJzsNCiAJCQkJCQkJCQkvL2dldCBuZXh0IGNoYXINCiAJCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykNCkBAIC0xMDg1LDcgKzExMjUsNyBAQAogCQkJCQlpZiAoYXRFbmQoKSkNCiAJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOw0KIAkJCQkJLy90aGUgYXRFbmQgbWF5IG5vdCBiZSA8Y3VycmVudFBvc2l0aW9uID09IHNvdXJjZS5sZW5ndGg+IGlmIHNvdXJjZSBpcyBvbmx5IHNvbWUgcGFydCBvZiBhIHJlYWwgKGV4dGVybmFsKSBzdHJlYW0NCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oIkN0cmwtWiIvKm5vbk5MUyovKTsNCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oIkN0cmwtWiIpOyAvLyROT04tTkxTLTEkDQogDQogCQkJCWRlZmF1bHQgOg0KIAkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3VycmVudENoYXJhY3RlcikpDQpAQCAtMTcwNywxMSArMTc0Nyw5IEBACiAJbmV3RW50cnk2ID0gbWF4Ow0KIAlyZXR1cm4gcjsJDQogfQ0KLXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hMaW5lU2VwYXJhdG9yKCkgew0KK3B1YmxpYyBmaW5hbCB2b2lkIHB1c2hMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7DQogCS8vc2VlIGNvbW1lbnQgb24gaXNMaW5lRGVsaW1pdGVyKGNoYXIpIGZvciB0aGUgdXNlIG9mICdcbicgYW5kICdccicNCi0NCiAJZmluYWwgaW50IElOQ1JFTUVOVCA9IDI1MDsNCi0NCiAJLy9jdXJyZW50Q2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uIGN1cnJlbnRQb3NpdGlvbi0xDQogDQogCS8vIGNyIDAwMEQNCkBAIC0xODQ4LDYgKzE4ODYsNyBAQAogCWVvZlBvc2l0aW9uID0gZW5kICsgMTsNCiAJY29tbWVudFB0ciA9IC0xOyAvLyByZXNldCBjb21tZW50IHN0YWNrDQogfQ0KKw0KIHB1YmxpYyBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsNCiAJLy8gdGhlIHN0cmluZyB3aXRoICJcXHUiIGlzIGEgbGVnYWwgc3RyaW5nIG9mIHR3byBjaGFycyBcIGFuZCB1DQogCS8vdGh1cyB3ZSB1c2UgYSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzb3VyY2UgKGZvciByZWd1bGFyIGNhc2VzKS4NCkBAIC0xOTM2LDcgKzE5NzUsNyBAQAogCS8vdGhlbiB0aGUgbGVuZ3RoLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbA0KIAkvL2tleXdvcnMgd2l0aCB0aGUgc2FtZSBsZW5ndGggQU5EIHRoZSBzYW1lIGZpcnN0IGNoYXIsIHRoZW4gZG8gYW5vdGhlcg0KIAkvL2Rpc3B0YWNoIG9uIHRoZSBzZWNvbmQgY2hhciA6LSkuLi5jb29sLi4uLmJ1dCBmYXN0ICENCi0NCisJdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7DQogCXdoaWxlIChnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkpIHt9Ow0KIA0KIAlpbnQgaW5kZXgsIGxlbmd0aDsNCkBAIC0xOTYzLDIwICsyMDAyLDM5IEBACiAJZmlyc3RMZXR0ZXIgPSBkYXRhW2luZGV4XTsNCiAJc3dpdGNoIChmaXJzdExldHRlcikgew0KIA0KLQkJY2FzZSAnYScgOiAvL2Fic3RyYWN0DQotCQkJaWYgKGxlbmd0aCA9PSA4KSB7DQotCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnYicpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYScpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpDQotCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKSB7DQotCQkJCQlyZXR1cm4gVG9rZW5OYW1lYWJzdHJhY3Q7DQotCQkJCX0NCisJCWNhc2UgJ2EnIDogDQorCQkJc3dpdGNoKGxlbmd0aCkgew0KKwkJCQljYXNlIDg6IC8vYWJzdHJhY3QNCisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnYicpDQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKQ0KKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykNCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpDQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQ0KKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykNCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKSB7DQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVhYnN0cmFjdDsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsNCisJCQkJCQl9DQorCQkJCWNhc2UgNjogLy8gYXNzZXJ0DQorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3MnKQ0KKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykNCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpDQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQ0KKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykpIHsNCisJCQkJCQkJaWYgKGFzc2VydE1vZGUpIHsNCisJCQkJCQkJCWNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IHRydWU7DQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lYXNzZXJ0Ow0KKwkJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQkJdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gdHJ1ZTsNCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwkJCQkJCQkJDQorCQkJCQkJCX0NCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsNCisJCQkJCQl9DQorCQkJCWRlZmF1bHQ6IA0KKwkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7DQogCQkJfQ0KLQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOw0KLQ0KIAkJY2FzZSAnYicgOiAvL2Jvb2xlYW4gYnJlYWsgYnl0ZQ0KIAkJCXN3aXRjaCAobGVuZ3RoKSB7DQogCQkJCWNhc2UgNCA6DQpAQCAtMjY0OCw2ICsyNzA2LDcgQEAKIAlzb3VyY2UgPSBzb3VyY2VTdHJpbmc7DQogCXN0YXJ0UG9zaXRpb24gPSAtMTsNCiAJaW5pdGlhbFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uID0gMDsNCisJY29udGFpbnNBc3NlcnRLZXl3b3JkID0gZmFsc2U7DQogCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KIAkJc291cmNlID0gbmV3IGNoYXJbMF07DQogCX0NCkBAIC0yNjU1LDkgKzI3MTQsOSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCWlmIChzdGFydFBvc2l0aW9uID09IHNvdXJjZS5sZW5ndGgpDQotCQlyZXR1cm4gIkVPRlxuXG4iLypub25OTFMqLyArIG5ldyBTdHJpbmcoc291cmNlKTsNCisJCXJldHVybiAiRU9GXG5cbiIgKyBuZXcgU3RyaW5nKHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IHNvdXJjZS5sZW5ndGgpDQotCQlyZXR1cm4gImJlaGluZCB0aGUgRU9GIDotKCAuLi4uXG5cbiIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhzb3VyY2UpOw0KKwkJcmV0dXJuICJiZWhpbmQgdGhlIEVPRiA6LSggLi4uLlxuXG4iICsgbmV3IFN0cmluZyhzb3VyY2UpOyAvLyROT04tTkxTLTEkDQogDQogCWNoYXIgZnJvbnRbXSA9IG5ldyBjaGFyW3N0YXJ0UG9zaXRpb25dOw0KIAlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgMCwgZnJvbnQsIDAsIHN0YXJ0UG9zaXRpb24pOw0KQEAgLTI2ODUsMjI4ICsyNzQ0LDI4MCBAQAogCQlzb3VyY2UubGVuZ3RoIC0gKGN1cnJlbnRQb3NpdGlvbiAtIDEpIC0gMSk7DQogCQ0KIAlyZXR1cm4gbmV3IFN0cmluZyhmcm9udCkNCi0JCSsgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuU3RhcnRzIGhlcmUgLS0+Ii8qbm9uTkxTKi8NCisJCSsgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuU3RhcnRzIGhlcmUgLS0+IiAvLyROT04tTkxTLTEkDQogCQkrIG5ldyBTdHJpbmcobWlkZGxlKQ0KLQkJKyAiPC0tIEVuZHMgaGVyZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIi8qbm9uTkxTKi8NCisJCSsgIjwtLSBFbmRzIGhlcmVcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIgLy8kTk9OLU5MUy0xJA0KIAkJKyBuZXcgU3RyaW5nKGVuZCk7IA0KIH0NCiBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nQWN0aW9uKGludCBhY3QpIHsNCiAJc3dpdGNoIChhY3QpIHsNCiAJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllciA6DQotCQkJcmV0dXJuICJJZGVudGlmaWVyKCIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiSWRlbnRpZmllcigiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJY2FzZSBUb2tlbk5hbWVhYnN0cmFjdCA6DQotCQkJcmV0dXJuICJhYnN0cmFjdCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiYWJzdHJhY3QiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWJvb2xlYW4gOg0KLQkJCXJldHVybiAiYm9vbGVhbiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lYnJlYWsgOg0KLQkJCXJldHVybiAiYnJlYWsiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImJyZWFrIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVieXRlIDoNCi0JCQlyZXR1cm4gImJ5dGUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImJ5dGUiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWNhc2UgOg0KLQkJCXJldHVybiAiY2FzZSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiY2FzZSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lY2F0Y2ggOg0KLQkJCXJldHVybiAiY2F0Y2giLypub25OTFMqLzsNCisJCQlyZXR1cm4gImNhdGNoIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVjaGFyIDoNCi0JCQlyZXR1cm4gImNoYXIiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImNoYXIiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWNsYXNzIDoNCi0JCQlyZXR1cm4gImNsYXNzIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lY29udGludWUgOg0KLQkJCXJldHVybiAiY29udGludWUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImNvbnRpbnVlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVkZWZhdWx0IDoNCi0JCQlyZXR1cm4gImRlZmF1bHQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWRvIDoNCi0JCQlyZXR1cm4gImRvIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJkbyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lZG91YmxlIDoNCi0JCQlyZXR1cm4gImRvdWJsZSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVlbHNlIDoNCi0JCQlyZXR1cm4gImVsc2UiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImVsc2UiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWV4dGVuZHMgOg0KLQkJCXJldHVybiAiZXh0ZW5kcyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lZmFsc2UgOg0KLQkJCXJldHVybiAiZmFsc2UiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImZhbHNlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVmaW5hbCA6DQotCQkJcmV0dXJuICJmaW5hbCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiZmluYWwiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWZpbmFsbHkgOg0KLQkJCXJldHVybiAiZmluYWxseSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiZmluYWxseSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOg0KLQkJCXJldHVybiAiZmxvYXQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImZsb2F0IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVmb3IgOg0KLQkJCXJldHVybiAiZm9yIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJmb3IiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWlmIDoNCi0JCQlyZXR1cm4gImlmIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJpZiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1laW1wbGVtZW50cyA6DQotCQkJcmV0dXJuICJpbXBsZW1lbnRzIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJpbXBsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVpbXBvcnQgOg0KLQkJCXJldHVybiAiaW1wb3J0Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJpbXBvcnQiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWluc3RhbmNlb2YgOg0KLQkJCXJldHVybiAiaW5zdGFuY2VvZiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiaW5zdGFuY2VvZiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1laW50IDoNCi0JCQlyZXR1cm4gImludCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiaW50IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVpbnRlcmZhY2UgOg0KLQkJCXJldHVybiAiaW50ZXJmYWNlIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJpbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZWxvbmcgOg0KLQkJCXJldHVybiAibG9uZyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAibG9uZyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lbmF0aXZlIDoNCi0JCQlyZXR1cm4gIm5hdGl2ZSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAibmF0aXZlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVuZXcgOg0KLQkJCXJldHVybiAibmV3Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJuZXciOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZW51bGwgOg0KLQkJCXJldHVybiAibnVsbCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lcGFja2FnZSA6DQotCQkJcmV0dXJuICJwYWNrYWdlIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVwcml2YXRlIDoNCi0JCQlyZXR1cm4gInByaXZhdGUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInByaXZhdGUiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXByb3RlY3RlZCA6DQotCQkJcmV0dXJuICJwcm90ZWN0ZWQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInByb3RlY3RlZCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lcHVibGljIDoNCi0JCQlyZXR1cm4gInB1YmxpYyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAicHVibGljIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVyZXR1cm4gOg0KLQkJCXJldHVybiAicmV0dXJuIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJyZXR1cm4iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXNob3J0IDoNCi0JCQlyZXR1cm4gInNob3J0Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lc3RhdGljIDoNCi0JCQlyZXR1cm4gInN0YXRpYyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAic3RhdGljIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVzdXBlciA6DQotCQkJcmV0dXJuICJzdXBlciIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAic3VwZXIiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXN3aXRjaCA6DQotCQkJcmV0dXJuICJzd2l0Y2giLypub25OTFMqLzsNCisJCQlyZXR1cm4gInN3aXRjaCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lc3luY2hyb25pemVkIDoNCi0JCQlyZXR1cm4gInN5bmNocm9uaXplZCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAic3luY2hyb25pemVkIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWV0aGlzIDoNCi0JCQlyZXR1cm4gInRoaXMiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInRoaXMiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXRocm93IDoNCi0JCQlyZXR1cm4gInRocm93Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ0aHJvdyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1ldGhyb3dzIDoNCi0JCQlyZXR1cm4gInRocm93cyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAidGhyb3dzIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWV0cmFuc2llbnQgOg0KLQkJCXJldHVybiAidHJhbnNpZW50Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ0cmFuc2llbnQiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXRydWUgOg0KLQkJCXJldHVybiAidHJ1ZSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1ldHJ5IDoNCi0JCQlyZXR1cm4gInRyeSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAidHJ5IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWV2b2lkIDoNCi0JCQlyZXR1cm4gInZvaWQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInZvaWQiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZXZvbGF0aWxlIDoNCi0JCQlyZXR1cm4gInZvbGF0aWxlIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ2b2xhdGlsZSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1ld2hpbGUgOg0KLQkJCXJldHVybiAid2hpbGUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIndoaWxlIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkJY2FzZSBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCA6DQotCQkJcmV0dXJuICJJbnRlZ2VyKCIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiSW50ZWdlcigiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJY2FzZSBUb2tlbk5hbWVMb25nTGl0ZXJhbCA6DQotCQkJcmV0dXJuICJMb25nKCIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiTG9uZygiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJY2FzZSBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA6DQotCQkJcmV0dXJuICJGbG9hdCgiLypub25OTFMqLyArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkZsb2F0KCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQljYXNlIFRva2VuTmFtZURvdWJsZUxpdGVyYWwgOg0KLQkJCXJldHVybiAiRG91YmxlKCIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiRG91YmxlKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQljYXNlIFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgOg0KLQkJCXJldHVybiAiQ2hhcigiLypub25OTFMqLyArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkNoYXIoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCWNhc2UgVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCA6DQotCQkJcmV0dXJuICJTdHJpbmcoIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJTdHJpbmcoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiANCiAJCWNhc2UgVG9rZW5OYW1lUExVU19QTFVTIDoNCi0JCQlyZXR1cm4gIisrIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIrKyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lTUlOVVNfTUlOVVMgOg0KLQkJCXJldHVybiAiLS0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIi0tIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVFUVVBTF9FUVVBTCA6DQotCQkJcmV0dXJuICI9PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPT0iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZUxFU1NfRVFVQUwgOg0KLQkJCXJldHVybiAiPD0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIjw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDoNCi0JCQlyZXR1cm4gIj49Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI+PSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDoNCi0JCQlyZXR1cm4gIiE9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIhPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVCA6DQotCQkJcmV0dXJuICI8PCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPDwiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUIDoNCi0JCQlyZXR1cm4gIj4+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI+PiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQgOg0KLQkJCXJldHVybiAiPj4+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI+Pj4iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOg0KLQkJCXJldHVybiAiKz0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIis9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6DQotCQkJcmV0dXJuICItPSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiLT0iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDoNCi0JCQlyZXR1cm4gIio9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIqPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDoNCi0JCQlyZXR1cm4gIi89Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIvPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDoNCi0JCQlyZXR1cm4gIiY9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICImPSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOg0KLQkJCXJldHVybiAifD0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gInw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVYT1JfRVFVQUwgOg0KLQkJCXJldHVybiAiXj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIl49IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgOg0KLQkJCXJldHVybiAiJT0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiU9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMIDoNCi0JCQlyZXR1cm4gIjw8PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPDw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6DQotCQkJcmV0dXJuICI+Pj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj4+PSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgOg0KLQkJCXJldHVybiAiPj4+PSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPj4+PSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lT1JfT1IgOg0KLQkJCXJldHVybiAifHwiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVBTkRfQU5EIDoNCi0JCQlyZXR1cm4gIiYmIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lUExVUyA6DQotCQkJcmV0dXJuICIrIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIrIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6DQotCQkJcmV0dXJuICItIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICItIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVOT1QgOg0KLQkJCXJldHVybiAiISIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiISI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSIDoNCi0JCQlyZXR1cm4gIiUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiUiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZVhPUiA6DQotCQkJcmV0dXJuICJeIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJeIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVBTkQgOg0KLQkJCXJldHVybiAiJiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiJiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOg0KLQkJCXJldHVybiAiKiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lT1IgOg0KLQkJCXJldHVybiAifCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lVFdJRERMRSA6DQotCQkJcmV0dXJuICJ+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ+IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVESVZJREUgOg0KLQkJCXJldHVybiAiLyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6DQotCQkJcmV0dXJuICI+Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVMRVNTIDoNCi0JCQlyZXR1cm4gIjwiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIjwiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZUxQQVJFTiA6DQotCQkJcmV0dXJuICIoIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICIoIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOg0KLQkJCXJldHVybiAiKSIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiKSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lTEJSQUNFIDoNCi0JCQlyZXR1cm4gInsiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInsiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6DQotCQkJcmV0dXJuICJ9Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ9IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVMQlJBQ0tFVCA6DQotCQkJcmV0dXJuICJbIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJbIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVSQlJBQ0tFVCA6DQotCQkJcmV0dXJuICJdIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJdIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOg0KLQkJCXJldHVybiAiOyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiOyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOg0KLQkJCXJldHVybiAiPyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiPyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lQ09MT04gOg0KLQkJCXJldHVybiAiOiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiOiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lQ09NTUEgOg0KLQkJCXJldHVybiAiLCIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiLCI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVG9rZW5OYW1lRE9UIDoNCi0JCQlyZXR1cm4gIi4iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIi4iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZUVRVUFMIDoNCi0JCQlyZXR1cm4gIj0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIj0iOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRva2VuTmFtZUVPRiA6DQotCQkJcmV0dXJuICJFT0YiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkVPRiI7IC8vJE5PTi1OTFMtMSQNCiAJCWRlZmF1bHQgOg0KLQkJCXJldHVybiAibm90LWEtdG9rZW4iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIm5vdC1hLXRva2VuIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIA0KIHB1YmxpYyBTY2FubmVyKGJvb2xlYW4gdG9rZW5pemVDb21tZW50cywgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIGJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgew0KKwl0aGlzKHRva2VuaXplQ29tbWVudHMsIHRva2VuaXplV2hpdGVTcGFjZSwgY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywgZmFsc2UpOw0KK30NCisNCitwdWJsaWMgU2Nhbm5lcihib29sZWFuIHRva2VuaXplQ29tbWVudHMsIGJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlLCBib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIGJvb2xlYW4gYXNzZXJ0TW9kZSkgew0KIAl0aGlzLmVvZlBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7DQogCXRoaXMudG9rZW5pemVDb21tZW50cyA9IHRva2VuaXplQ29tbWVudHM7DQogCXRoaXMudG9rZW5pemVXaGl0ZVNwYWNlID0gdG9rZW5pemVXaGl0ZVNwYWNlOw0KIAl0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMgPSBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzOw0KKwl0aGlzLmFzc2VydE1vZGUgPSBhc3NlcnRNb2RlOw0KK30NCisNCitwcml2YXRlIHZvaWQgY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpICB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsNCisJaWYgKGN1cnJlbnRMaW5lID09IG51bGwgfHwgY3VycmVudExpbmVOciAhPSBsaW5lUHRyKQ0KKwkJcmV0dXJuOw0KKwlwYXJzZVRhZ3MoY3VycmVudExpbmUpOw0KK30NCisNCitwcml2YXRlIHZvaWQgcGFyc2VUYWdzKE5MU0xpbmUgbGluZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7DQorCVN0cmluZyBzID0gbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7DQorCWludCBwb3MgPSBzLmluZGV4T2YoVEFHX1BSRUZJWCk7DQorCWludCBsaW5lTGVuZ3RoID0gbGluZS5zaXplKCk7DQorCXdoaWxlIChwb3MgIT0gLTEpIHsNCisJCWludCBzdGFydCA9IHBvcyArIFRBR19QUkVGSVhfTEVOR1RIOw0KKwkJaW50IGVuZCA9IHMuaW5kZXhPZihUQUdfUE9TVEZJWCwgc3RhcnQpOw0KKwkJU3RyaW5nIGluZGV4ID0gcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7DQorCQlpbnQgaSA9IDA7DQorCQl0cnkgew0KKwkJCWkgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGV4KSAtIDE7IC8vIFRhZ3MgYXJlIG9uZSBiYXNlZCBub3QgemVybyBiYXNlZC4NCisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQorCQkJaSA9IC0xOyAvLyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoaXMgYXMgYSB2YWxpZCBOTFMgdGFnDQorCQl9DQorCQlpbnQgbGlzdEluZGV4ID0gbGluZUxlbmd0aCAtIGkgLSAxOw0KKwkJaWYgKGxpbmUuZXhpc3RzKGxpc3RJbmRleCkpIHsNCisJCQlsaW5lLnNldChsaXN0SW5kZXgsIG51bGwpOw0KKwkJfQ0KKwkJcG9zID0gcy5pbmRleE9mKFRBR19QUkVGSVgsIHN0YXJ0KTsNCisJfQ0KKw0KKwl0aGlzLm5vbk5MU1N0cmluZ3MgPSBuZXcgU3RyaW5nTGl0ZXJhbFtsaW5lTGVuZ3RoXTsNCisJaW50IG5vbk5MU0NvdW50ZXIgPSAwOw0KKwlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGluZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgew0KKwkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gKFN0cmluZ0xpdGVyYWwpIGl0ZXJhdG9yLm5leHQoKTsNCisJCWlmIChsaXRlcmFsICE9IG51bGwpIHsNCisJCQl0aGlzLm5vbk5MU1N0cmluZ3Nbbm9uTkxTQ291bnRlcisrXSA9IGxpdGVyYWw7DQorCQl9DQorCX0NCisJaWYgKG5vbk5MU0NvdW50ZXIgPT0gMCkgew0KKwkJdGhpcy5ub25OTFNTdHJpbmdzID0gbnVsbDsNCisJCWN1cnJlbnRMaW5lID0gbnVsbDsNCisJCXJldHVybjsNCisJfSANCisJd2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IHRydWU7DQorCWlmIChub25OTFNDb3VudGVyICE9IGxpbmVMZW5ndGgpIHsNCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5ub25OTFNTdHJpbmdzLCAwLCAodGhpcy5ub25OTFNTdHJpbmdzID0gbmV3IFN0cmluZ0xpdGVyYWxbbm9uTkxTQ291bnRlcl0pLCAwLCBub25OTFNDb3VudGVyKTsNCisJfQ0KKwljdXJyZW50TGluZSA9IG51bGw7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZVR5cGVDb252ZXJ0ZXIuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhCmluZGV4IDQwYmRjN2IuLjVjYzAxOTMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhCkBAIC0yNSwyODUgKzI1LDI5NyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQogDQogcHVibGljIGNsYXNzIFNvdXJjZVR5cGVDb252ZXJ0ZXIgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycyB7DQotLyoNCi0gKiBDb252ZXJ0IGEgc291cmNlIGVsZW1lbnQgdHlwZSBpbnRvIGEgcGFyc2VkIHR5cGUgZGVjbGFyYXRpb24NCi0gKg0KLSAqIENhbiBvcHRpb25hbGx5IGlnbm9yZSBmaWVsZHMgJiBtZXRob2RzDQotICoNCi0gKiBAZGVwcmVjYXRlZCAtIHNob3VsZCB1c2UgdGhlIG90aGVyIEFQSSB3aXRoIG9uZSBleHRyYSBib29sZWFuDQotICovDQotcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBidWlsZENvbXBpbGF0aW9uVW5pdCgNCi0JSVNvdXJjZVR5cGUgc291cmNlVHlwZSwNCi0JYm9vbGVhbiBuZWVkRmllbGRzQW5kTWV0aG9kcywNCi0JUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwNCi0JQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsNCiANCi0JcmV0dXJuIGJ1aWxkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVR5cGUsIG5lZWRGaWVsZHNBbmRNZXRob2RzLCB0cnVlLCBwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0KTsNCi19DQotLyoNCi0gKiBDb252ZXJ0IGEgc291cmNlIGVsZW1lbnQgdHlwZSBpbnRvIGEgcGFyc2VkIHR5cGUgZGVjbGFyYXRpb24NCi0gKg0KLSAqIENhbiBvcHRpb25hbGx5IGlnbm9yZSBmaWVsZHMgJiBtZXRob2RzIG9yIG1lbWJlciB0eXBlcw0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gYnVpbGRDb21waWxhdGlvblVuaXQoDQotCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUsDQotCWJvb2xlYW4gbmVlZEZpZWxkc0FuZE1ldGhvZHMsDQotCWJvb2xlYW4gbmVlZE1lbWJlclR5cGVzLA0KLQlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLA0KLQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgew0KLQ0KLQlpZiAoc291cmNlVHlwZS5nZXROYW1lKCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGRvIGEgYmFzaWMgdGVzdCB0aGF0IHRoZSBzb3VyY2VUeXBlIGlzIHZhbGlkDQotDQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IA0KLQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgY29tcGlsYXRpb25SZXN1bHQsIDApOyAvLyBub3QgZmlsbGVkIGF0IHRoaXMgcG9pbnQNCi0NCi0JLyogb25seSBwb3NpdGlvbnMgYXZhaWxhYmxlICovDQotCWludCBzdGFydCA9IHNvdXJjZVR5cGUuZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7DQotCWludCBlbmQgPSBzb3VyY2VUeXBlLmdldE5hbWVTb3VyY2VFbmQoKTsNCi0JCQ0KLQkvKiBjb252ZXJ0IHBhY2thZ2UgYW5kIGltcG9ydHMgKi8NCi0JaWYgKHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsICYmIHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGggPiAwKSAvLyBpZiBpdHMgbnVsbCB0aGVuIGl0IGlzIGRlZmluZWQgaW4gdGhlIGRlZmF1bHQgcGFja2FnZQ0KLQkJY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0gY3JlYXRlSW1wb3J0UmVmZXJlbmNlKHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKSwgc3RhcnQsIGVuZCk7DQotCWNoYXJbXVtdIGltcG9ydE5hbWVzID0gc291cmNlVHlwZS5nZXRJbXBvcnRzKCk7DQotCWludCBpbXBvcnRDb3VudCA9IGltcG9ydE5hbWVzID09IG51bGwgPyAwIDogaW1wb3J0TmFtZXMubGVuZ3RoOw0KLQljb21waWxhdGlvblVuaXQuaW1wb3J0cyA9IG5ldyBJbXBvcnRSZWZlcmVuY2VbaW1wb3J0Q291bnRdOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydENvdW50OyBpKyspDQotCQljb21waWxhdGlvblVuaXQuaW1wb3J0c1tpXSA9IGNyZWF0ZUltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lc1tpXSwgc3RhcnQsIGVuZCk7DQotCS8qIGNvbnZlcnQgdHlwZSAqLw0KLQljb21waWxhdGlvblVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW10ge2NvbnZlcnQoc291cmNlVHlwZSwgbmVlZEZpZWxkc0FuZE1ldGhvZHMsIG5lZWRNZW1iZXJUeXBlcyl9OyANCi0NCi0JcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsNCi19DQotLyoNCi0gKiBDb252ZXJ0IGEgZmllbGQgc291cmNlIGVsZW1lbnQgaW50byBhIHBhcnNlZCBmaWVsZCBkZWNsYXJhdGlvbg0KLSAqLw0KLQ0KLXByaXZhdGUgc3RhdGljIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJU291cmNlRmllbGQgc291cmNlRmllbGQpIHsNCi0NCi0JRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7DQotDQotCWludCBzdGFydCA9IHNvdXJjZUZpZWxkLmdldE5hbWVTb3VyY2VTdGFydCgpOw0KLQlpbnQgZW5kID0gc291cmNlRmllbGQuZ2V0TmFtZVNvdXJjZUVuZCgpOw0KLQ0KLQlmaWVsZC5uYW1lID0gc291cmNlRmllbGQuZ2V0TmFtZSgpOw0KLQlmaWVsZC5zb3VyY2VTdGFydCA9IHN0YXJ0Ow0KLQlmaWVsZC5zb3VyY2VFbmQgPSBlbmQ7DQotCWZpZWxkLnR5cGUgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHNvdXJjZUZpZWxkLmdldFR5cGVOYW1lKCksIHN0YXJ0LCBlbmQpOw0KLQlmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc291cmNlRmllbGQuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpOw0KLQlmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUZpZWxkLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7DQotCWZpZWxkLm1vZGlmaWVycyA9IHNvdXJjZUZpZWxkLmdldE1vZGlmaWVycygpOw0KLQkNCi0JLyogY29udmVyc2lvbiBvZiBmaWVsZCBjb25zdGFudDogaWYgbm90IHByZXNlbnQsIHRoZW4gY2Fubm90IGdlbmVyYXRlIGJpbmFyeSBhZ2FpbnN0IA0KLQkJY29udmVydGVkIHBhcnNlIG5vZGVzICovDQogCS8qDQotCWlmIChmaWVsZC5tb2RpZmllcnMgJiBBY2NGaW5hbCl7DQotCQljaGFyW10gaW5pdGlhbGl6YXRpb25Tb3VyY2UgPSBzb3VyY2VGaWVsZC5nZXRJbml0aWFsaXphdGlvblNvdXJjZSgpOw0KLQl9DQotCSovDQotCXJldHVybiBmaWVsZDsNCi19DQotLyoNCi0gKiBDb252ZXJ0IGEgbWV0aG9kIHNvdXJjZSBlbGVtZW50IGludG8gYSBwYXJzZWQgbWV0aG9kL2NvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIA0KLSAqLw0KLXByaXZhdGUgc3RhdGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gY29udmVydChJU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCkgew0KKwkgKiBDb252ZXJ0IGEgc2V0IG9mIHNvdXJjZSBlbGVtZW50IHR5cGVzIGludG8gYSBwYXJzZWQgY29tcGlsYXRpb24gdW5pdCBkZWNsYXJhdGlvbg0KKwkgKiBUaGUgYXJndW1lbnQgdHlwZXMgYXJlIHRoZW4gYWxsIGdyb3VwZWQgaW4gdGhlIHNhbWUgdW5pdC4gVGhlIGFyZ3VtZW50IHR5cGVzIG11c3QgDQorCSAqIGF0IGxlYXN0IGNvbnRhaW4gb25lIHR5cGUuDQorCSAqIENhbiBvcHRpb25hbGx5IGlnbm9yZSBmaWVsZHMgJiBtZXRob2RzIG9yIG1lbWJlciB0eXBlcw0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBidWlsZENvbXBpbGF0aW9uVW5pdCgNCisJCUlTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsDQorCQlib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLA0KKwkJYm9vbGVhbiBuZWVkTWVtYmVyVHlwZXMsDQorCQlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLA0KKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsNCiANCi0JQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2Q7DQorCQlJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gc291cmNlVHlwZXNbMF07DQorCQlpZiAoc291cmNlVHlwZS5nZXROYW1lKCkgPT0gbnVsbCkNCisJCQlyZXR1cm4gbnVsbDsgLy8gZG8gYSBiYXNpYyB0ZXN0IHRoYXQgdGhlIHNvdXJjZVR5cGUgaXMgdmFsaWQNCiANCi0JLyogb25seSBzb3VyY2UgcG9zaXRpb25zIGF2YWlsYWJsZSAqLw0KLQlpbnQgc3RhcnQgPSBzb3VyY2VNZXRob2QuZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7DQotCWludCBlbmQgPSBzb3VyY2VNZXRob2QuZ2V0TmFtZVNvdXJjZUVuZCgpOw0KKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0NCisJCQluZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24ocHJvYmxlbVJlcG9ydGVyLCBjb21waWxhdGlvblJlc3VsdCwgMCk7DQorCQkvLyBub3QgZmlsbGVkIGF0IHRoaXMgcG9pbnQNCiANCi0JaWYgKHNvdXJjZU1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsNCi0JCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCk7DQotCQlkZWNsLmlzRGVmYXVsdENvbnN0cnVjdG9yID0gZmFsc2U7DQotCQltZXRob2QgPSBkZWNsOw0KLQl9IGVsc2Ugew0KLQkJTWV0aG9kRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbigpOw0KLQkJLyogY29udmVydCByZXR1cm4gdHlwZSAqLw0KLQkJZGVjbC5yZXR1cm5UeXBlID0gDQotCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShzb3VyY2VNZXRob2QuZ2V0UmV0dXJuVHlwZU5hbWUoKSwgc3RhcnQsIGVuZCk7IA0KLQkJbWV0aG9kID0gZGVjbDsNCi0JfQ0KLQltZXRob2Quc2VsZWN0b3IgPSBzb3VyY2VNZXRob2QuZ2V0U2VsZWN0b3IoKTsNCi0JbWV0aG9kLm1vZGlmaWVycyA9IHNvdXJjZU1ldGhvZC5nZXRNb2RpZmllcnMoKTsNCi0JbWV0aG9kLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7DQotCW1ldGhvZC5zb3VyY2VFbmQgPSBlbmQ7DQotCW1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc291cmNlTWV0aG9kLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsNCi0JbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc291cmNlTWV0aG9kLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7DQorCQkvKiBvbmx5IHBvc2l0aW9ucyBhdmFpbGFibGUgKi8NCisJCWludCBzdGFydCA9IHNvdXJjZVR5cGUuZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7DQorCQlpbnQgZW5kID0gc291cmNlVHlwZS5nZXROYW1lU291cmNlRW5kKCk7DQogDQotCS8qIGNvbnZlcnQgYXJndW1lbnRzICovDQotCWNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzID0gc291cmNlTWV0aG9kLmdldEFyZ3VtZW50VHlwZU5hbWVzKCk7DQotCWNoYXJbXVtdIGFyZ3VtZW50TmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0QXJndW1lbnROYW1lcygpOw0KLQlpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3VtZW50VHlwZU5hbWVzID09IG51bGwgPyAwIDogYXJndW1lbnRUeXBlTmFtZXMubGVuZ3RoOw0KLQlsb25nIHBvc2l0aW9uID0gKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kOw0KLQltZXRob2QuYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50W2FyZ3VtZW50Q291bnRdOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnQ7IGkrKykgew0KLQkJbWV0aG9kLmFyZ3VtZW50c1tpXSA9IA0KLQkJCW5ldyBBcmd1bWVudCgNCi0JCQkJYXJndW1lbnROYW1lc1tpXSwgDQotCQkJCXBvc2l0aW9uLCANCi0JCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShhcmd1bWVudFR5cGVOYW1lc1tpXSwgc3RhcnQsIGVuZCksIA0KLQkJCQlBY2NEZWZhdWx0KTsgLy8gZG8gbm90IGNhcmUgd2hldGhlciB3YXMgZmluYWwgb3Igbm90DQotCX0NCi0NCi0JLyogY29udmVydCB0aHJvd24gZXhjZXB0aW9ucyAqLw0KLQljaGFyW11bXSBleGNlcHRpb25UeXBlTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCk7DQotCWludCBleGNlcHRpb25Db3VudCA9IGV4Y2VwdGlvblR5cGVOYW1lcyA9PSBudWxsID8gMCA6IGV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGg7DQotCW1ldGhvZC50aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVSZWZlcmVuY2VbZXhjZXB0aW9uQ291bnRdOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyBpKyspIHsNCi0JCW1ldGhvZC50aHJvd25FeGNlcHRpb25zW2ldID0gDQotCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShleGNlcHRpb25UeXBlTmFtZXNbaV0sIHN0YXJ0LCBlbmQpOyANCi0JfQ0KLQlyZXR1cm4gbWV0aG9kOw0KLX0NCi0vKg0KLSAqIENvbnZlcnQgYSBzb3VyY2UgZWxlbWVudCB0eXBlIGludG8gYSBwYXJzZWQgdHlwZSBkZWNsYXJhdGlvbg0KLSAqDQotICogQ2FuIG9wdGlvbmFsbHkgaWdub3JlIGZpZWxkcyAmIG1ldGhvZHMNCi0gKi8NCi1wcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gY29udmVydChJU291cmNlVHlwZSBzb3VyY2VUeXBlLCBib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLCBib29sZWFuIG5lZWRNZW1iZXJUeXBlcykgew0KLQ0KLQkvKiBjcmVhdGUgdHlwZSBkZWNsYXJhdGlvbiAtIGNhbiBiZSBtZW1iZXIgdHlwZSAqLw0KLQlUeXBlRGVjbGFyYXRpb24gdHlwZTsNCi0JaWYgKHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpID09IG51bGwpew0KLQkJdHlwZSA9IG5ldyBUeXBlRGVjbGFyYXRpb24oKTsNCi0JfSBlbHNlIHsNCi0JCXR5cGUgPSBuZXcgTWVtYmVyVHlwZURlY2xhcmF0aW9uKCk7DQotCX0NCi0JdHlwZS5uYW1lID0gc291cmNlVHlwZS5nZXROYW1lKCk7DQotCWludCBzdGFydCwgZW5kOyAvLyBvbmx5IHBvc2l0aW9ucyBhdmFpbGFibGUNCi0JdHlwZS5zb3VyY2VTdGFydCA9IHN0YXJ0ID0gc291cmNlVHlwZS5nZXROYW1lU291cmNlU3RhcnQoKTsNCi0JdHlwZS5zb3VyY2VFbmQgPSBlbmQgPSBzb3VyY2VUeXBlLmdldE5hbWVTb3VyY2VFbmQoKTsNCi0JdHlwZS5tb2RpZmllcnMgPSBzb3VyY2VUeXBlLmdldE1vZGlmaWVycygpOw0KLQl0eXBlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsNCi0JdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZVR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKTsNCi0NCi0JLyogc2V0IHN1cGVyY2xhc3MgYW5kIHN1cGVyaW50ZXJmYWNlcyAqLw0KLQlpZiAoc291cmNlVHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpICE9IG51bGwpDQotCQl0eXBlLnN1cGVyY2xhc3MgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKSwgc3RhcnQsIGVuZCk7DQotCWNoYXJbXVtdIGludGVyZmFjZU5hbWVzID0gc291cmNlVHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpOw0KLQlpbnQgaW50ZXJmYWNlQ291bnQgPSBpbnRlcmZhY2VOYW1lcyA9PSBudWxsID8gMCA6IGludGVyZmFjZU5hbWVzLmxlbmd0aDsNCi0JdHlwZS5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtpbnRlcmZhY2VDb3VudF07DQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlQ291bnQ7IGkrKyl7DQotCQl0eXBlLnN1cGVySW50ZXJmYWNlc1tpXSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50ZXJmYWNlTmFtZXNbaV0sIHN0YXJ0LCBlbmQpOw0KLQl9CQ0KLQkvKiBjb252ZXJ0IG1lbWJlciB0eXBlcyAqLw0KLQlpZiAobmVlZE1lbWJlclR5cGVzKXsNCi0JCUlTb3VyY2VUeXBlW10gc291cmNlTWVtYmVyVHlwZXMgPSBzb3VyY2VUeXBlLmdldE1lbWJlclR5cGVzKCk7DQotCQlpbnQgc291cmNlTWVtYmVyVHlwZUNvdW50ID0gc291cmNlTWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VNZW1iZXJUeXBlcy5sZW5ndGg7DQotCQl0eXBlLm1lbWJlclR5cGVzID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbltzb3VyY2VNZW1iZXJUeXBlQ291bnRdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VNZW1iZXJUeXBlQ291bnQ7IGkrKykgew0KLQkJCXR5cGUubWVtYmVyVHlwZXNbaV0gPSAoTWVtYmVyVHlwZURlY2xhcmF0aW9uKSBjb252ZXJ0KHNvdXJjZU1lbWJlclR5cGVzW2ldLCBuZWVkRmllbGRzQW5kTWV0aG9kcywgdHJ1ZSk7DQorCQkvKiBjb252ZXJ0IHBhY2thZ2UgYW5kIGltcG9ydHMgKi8NCisJCWlmIChzb3VyY2VUeXBlLmdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbA0KKwkJCSYmIHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGggPiAwKQ0KKwkJCS8vIGlmIGl0cyBudWxsIHRoZW4gaXQgaXMgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlDQorCQkJY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0NCisJCQkJY3JlYXRlSW1wb3J0UmVmZXJlbmNlKHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKSwgc3RhcnQsIGVuZCk7DQorCQljaGFyW11bXSBpbXBvcnROYW1lcyA9IHNvdXJjZVR5cGUuZ2V0SW1wb3J0cygpOw0KKwkJaW50IGltcG9ydENvdW50ID0gaW1wb3J0TmFtZXMgPT0gbnVsbCA/IDAgOiBpbXBvcnROYW1lcy5sZW5ndGg7DQorCQljb21waWxhdGlvblVuaXQuaW1wb3J0cyA9IG5ldyBJbXBvcnRSZWZlcmVuY2VbaW1wb3J0Q291bnRdOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRDb3VudDsgaSsrKQ0KKwkJCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzW2ldID0gY3JlYXRlSW1wb3J0UmVmZXJlbmNlKGltcG9ydE5hbWVzW2ldLCBzdGFydCwgZW5kKTsNCisJCS8qIGNvbnZlcnQgdHlwZShzKSAqLw0KKwkJaW50IHR5cGVDb3VudCA9IHNvdXJjZVR5cGVzLmxlbmd0aDsNCisJCWNvbXBpbGF0aW9uVW5pdC50eXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bdHlwZUNvdW50XTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUNvdW50OyBpKyspIHsNCisJCQljb21waWxhdGlvblVuaXQudHlwZXNbaV0gPQ0KKwkJCQljb252ZXJ0KHNvdXJjZVR5cGVzW2ldLCBuZWVkRmllbGRzQW5kTWV0aG9kcywgbmVlZE1lbWJlclR5cGVzKTsNCiAJCX0NCisJCXJldHVybiBjb21waWxhdGlvblVuaXQ7DQogCX0NCi0JLyogY29udmVydCBmaWVsZHMgYW5kIG1ldGhvZHMgKi8NCi0JaWYgKG5lZWRGaWVsZHNBbmRNZXRob2RzKSB7DQotCQkvKiBjb252ZXJ0IGZpZWxkcyAqLw0KLQkJSVNvdXJjZUZpZWxkW10gc291cmNlRmllbGRzID0gc291cmNlVHlwZS5nZXRGaWVsZHMoKTsNCi0JCWludCBzb3VyY2VGaWVsZENvdW50ID0gc291cmNlRmllbGRzID09IG51bGwgPyAwIDogc291cmNlRmllbGRzLmxlbmd0aDsNCi0JCXR5cGUuZmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bc291cmNlRmllbGRDb3VudF07DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpZWxkQ291bnQ7IGkrKykgew0KLQkJCXR5cGUuZmllbGRzW2ldID0gY29udmVydChzb3VyY2VGaWVsZHNbaV0pOw0KKwkNCisJLyoNCisJICogQ29udmVydCBhIGZpZWxkIHNvdXJjZSBlbGVtZW50IGludG8gYSBwYXJzZWQgZmllbGQgZGVjbGFyYXRpb24NCisJICovDQorCXByaXZhdGUgc3RhdGljIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJU291cmNlRmllbGQgc291cmNlRmllbGQpIHsNCisNCisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOw0KKw0KKwkJaW50IHN0YXJ0ID0gc291cmNlRmllbGQuZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7DQorCQlpbnQgZW5kID0gc291cmNlRmllbGQuZ2V0TmFtZVNvdXJjZUVuZCgpOw0KKw0KKwkJZmllbGQubmFtZSA9IHNvdXJjZUZpZWxkLmdldE5hbWUoKTsNCisJCWZpZWxkLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7DQorCQlmaWVsZC5zb3VyY2VFbmQgPSBlbmQ7DQorCQlmaWVsZC50eXBlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShzb3VyY2VGaWVsZC5nZXRUeXBlTmFtZSgpLCBzdGFydCwgZW5kKTsNCisJCWZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VGaWVsZC5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCk7DQorCQlmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUZpZWxkLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7DQorCQlmaWVsZC5tb2RpZmllcnMgPSBzb3VyY2VGaWVsZC5nZXRNb2RpZmllcnMoKTsNCisNCisJCS8qIGNvbnZlcnNpb24gb2YgZmllbGQgY29uc3RhbnQ6IGlmIG5vdCBwcmVzZW50LCB0aGVuIGNhbm5vdCBnZW5lcmF0ZSBiaW5hcnkgYWdhaW5zdCANCisJCQljb252ZXJ0ZWQgcGFyc2Ugbm9kZXMgKi8NCisJCS8qDQorCQlpZiAoZmllbGQubW9kaWZpZXJzICYgQWNjRmluYWwpew0KKwkJCWNoYXJbXSBpbml0aWFsaXphdGlvblNvdXJjZSA9IHNvdXJjZUZpZWxkLmdldEluaXRpYWxpemF0aW9uU291cmNlKCk7DQorCQl9DQorCQkqLw0KKwkJcmV0dXJuIGZpZWxkOw0KKwl9DQorDQorCS8qDQorCSAqIENvbnZlcnQgYSBtZXRob2Qgc291cmNlIGVsZW1lbnQgaW50byBhIHBhcnNlZCBtZXRob2QvY29uc3RydWN0b3IgZGVjbGFyYXRpb24gDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGNvbnZlcnQoSVNvdXJjZU1ldGhvZCBzb3VyY2VNZXRob2QpIHsNCisNCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kOw0KKw0KKwkJLyogb25seSBzb3VyY2UgcG9zaXRpb25zIGF2YWlsYWJsZSAqLw0KKwkJaW50IHN0YXJ0ID0gc291cmNlTWV0aG9kLmdldE5hbWVTb3VyY2VTdGFydCgpOw0KKwkJaW50IGVuZCA9IHNvdXJjZU1ldGhvZC5nZXROYW1lU291cmNlRW5kKCk7DQorDQorCQlpZiAoc291cmNlTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgew0KKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCk7DQorCQkJZGVjbC5pc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOw0KKwkJCW1ldGhvZCA9IGRlY2w7DQorCQl9IGVsc2Ugew0KKwkJCU1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oKTsNCisJCQkvKiBjb252ZXJ0IHJldHVybiB0eXBlICovDQorCQkJZGVjbC5yZXR1cm5UeXBlID0NCisJCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShzb3VyY2VNZXRob2QuZ2V0UmV0dXJuVHlwZU5hbWUoKSwgc3RhcnQsIGVuZCk7DQorCQkJbWV0aG9kID0gZGVjbDsNCisJCX0NCisJCW1ldGhvZC5zZWxlY3RvciA9IHNvdXJjZU1ldGhvZC5nZXRTZWxlY3RvcigpOw0KKwkJbWV0aG9kLm1vZGlmaWVycyA9IHNvdXJjZU1ldGhvZC5nZXRNb2RpZmllcnMoKTsNCisJCW1ldGhvZC5zb3VyY2VTdGFydCA9IHN0YXJ0Ow0KKwkJbWV0aG9kLnNvdXJjZUVuZCA9IGVuZDsNCisJCW1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc291cmNlTWV0aG9kLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsNCisJCW1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZU1ldGhvZC5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpOw0KKw0KKwkJLyogY29udmVydCBhcmd1bWVudHMgKi8NCisJCWNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzID0gc291cmNlTWV0aG9kLmdldEFyZ3VtZW50VHlwZU5hbWVzKCk7DQorCQljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gc291cmNlTWV0aG9kLmdldEFyZ3VtZW50TmFtZXMoKTsNCisJCWludCBhcmd1bWVudENvdW50ID0gYXJndW1lbnRUeXBlTmFtZXMgPT0gbnVsbCA/IDAgOiBhcmd1bWVudFR5cGVOYW1lcy5sZW5ndGg7DQorCQlsb25nIHBvc2l0aW9uID0gKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kOw0KKwkJbWV0aG9kLmFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFthcmd1bWVudENvdW50XTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3VudDsgaSsrKSB7DQorCQkJbWV0aG9kLmFyZ3VtZW50c1tpXSA9DQorCQkJCW5ldyBBcmd1bWVudCgNCisJCQkJCWFyZ3VtZW50TmFtZXNbaV0sDQorCQkJCQlwb3NpdGlvbiwNCisJCQkJCWNyZWF0ZVR5cGVSZWZlcmVuY2UoYXJndW1lbnRUeXBlTmFtZXNbaV0sIHN0YXJ0LCBlbmQpLA0KKwkJCQkJQWNjRGVmYXVsdCk7DQorCQkJLy8gZG8gbm90IGNhcmUgd2hldGhlciB3YXMgZmluYWwgb3Igbm90DQogCQl9DQogDQotCQkvKiBjb252ZXJ0IG1ldGhvZHMgLSBuZWVkIHRvIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGlmIG5lY2Vzc2FyeSAqLw0KLQkJSVNvdXJjZU1ldGhvZFtdIHNvdXJjZU1ldGhvZHMgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsNCi0JCWludCBzb3VyY2VNZXRob2RDb3VudCA9IHNvdXJjZU1ldGhvZHMgPT0gbnVsbCA/IDAgOiBzb3VyY2VNZXRob2RzLmxlbmd0aDsNCisJCS8qIGNvbnZlcnQgdGhyb3duIGV4Y2VwdGlvbnMgKi8NCisJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVOYW1lcyA9IHNvdXJjZU1ldGhvZC5nZXRFeGNlcHRpb25UeXBlTmFtZXMoKTsNCisJCWludCBleGNlcHRpb25Db3VudCA9IGV4Y2VwdGlvblR5cGVOYW1lcyA9PSBudWxsID8gMCA6IGV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGg7DQorCQltZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW2V4Y2VwdGlvbkNvdW50XTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ291bnQ7IGkrKykgew0KKwkJCW1ldGhvZC50aHJvd25FeGNlcHRpb25zW2ldID0NCisJCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShleGNlcHRpb25UeXBlTmFtZXNbaV0sIHN0YXJ0LCBlbmQpOw0KKwkJfQ0KKwkJcmV0dXJuIG1ldGhvZDsNCisJfQ0KIA0KLQkJLyogc291cmNlIHR5cGUgaGFzIGEgY29uc3RydWN0b3IgPyAgICAgICAgICAgKi8NCi0JCS8qIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IG9uZSBpcyBuZWVkZWQuICovDQotCQlpbnQgbmVlZGVkQ291bnQgPSAxOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VNZXRob2RDb3VudDsgaSsrKSB7DQotCQkJaWYgKHNvdXJjZU1ldGhvZHNbaV0uaXNDb25zdHJ1Y3RvcigpKSB7DQotCQkJCW5lZWRlZENvdW50ID0gMDsgLy8gRG9lcyBub3QgbmVlZCB0aGUgZXh0cmEgY29uc3RydWN0b3Igc2luY2Ugb25lIGNvbnN0cnVjdG9yIGFscmVhZHkgZXhpc3RzLg0KLQkJCQlicmVhazsNCisJLyoNCisJICogQ29udmVydCBhIHNvdXJjZSBlbGVtZW50IHR5cGUgaW50byBhIHBhcnNlZCB0eXBlIGRlY2xhcmF0aW9uDQorCSAqDQorCSAqIENhbiBvcHRpb25hbGx5IGlnbm9yZSBmaWVsZHMgJiBtZXRob2RzDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gY29udmVydCgNCisJCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUsDQorCQlib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLA0KKwkJYm9vbGVhbiBuZWVkTWVtYmVyVHlwZXMpIHsNCisJCS8qIGNyZWF0ZSB0eXBlIGRlY2xhcmF0aW9uIC0gY2FuIGJlIG1lbWJlciB0eXBlICovDQorCQlUeXBlRGVjbGFyYXRpb24gdHlwZTsNCisJCWlmIChzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKSA9PSBudWxsKSB7DQorCQkJdHlwZSA9IG5ldyBUeXBlRGVjbGFyYXRpb24oKTsNCisJCX0gZWxzZSB7DQorCQkJdHlwZSA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb24oKTsNCisJCX0NCisJCXR5cGUubmFtZSA9IHNvdXJjZVR5cGUuZ2V0TmFtZSgpOw0KKwkJaW50IHN0YXJ0LCBlbmQ7IC8vIG9ubHkgcG9zaXRpb25zIGF2YWlsYWJsZQ0KKwkJdHlwZS5zb3VyY2VTdGFydCA9IHN0YXJ0ID0gc291cmNlVHlwZS5nZXROYW1lU291cmNlU3RhcnQoKTsNCisJCXR5cGUuc291cmNlRW5kID0gZW5kID0gc291cmNlVHlwZS5nZXROYW1lU291cmNlRW5kKCk7DQorCQl0eXBlLm1vZGlmaWVycyA9IHNvdXJjZVR5cGUuZ2V0TW9kaWZpZXJzKCk7DQorCQl0eXBlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsNCisJCXR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzb3VyY2VUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7DQorDQorCQkvKiBzZXQgc3VwZXJjbGFzcyBhbmQgc3VwZXJpbnRlcmZhY2VzICovDQorCQlpZiAoc291cmNlVHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpICE9IG51bGwpDQorCQkJdHlwZS5zdXBlcmNsYXNzID0NCisJCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NOYW1lKCksIHN0YXJ0LCBlbmQpOw0KKwkJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBzb3VyY2VUeXBlLmdldEludGVyZmFjZU5hbWVzKCk7DQorCQlpbnQgaW50ZXJmYWNlQ291bnQgPSBpbnRlcmZhY2VOYW1lcyA9PSBudWxsID8gMCA6IGludGVyZmFjZU5hbWVzLmxlbmd0aDsNCisJCXR5cGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbaW50ZXJmYWNlQ291bnRdOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VDb3VudDsgaSsrKSB7DQorCQkJdHlwZS5zdXBlckludGVyZmFjZXNbaV0gPSBjcmVhdGVUeXBlUmVmZXJlbmNlKGludGVyZmFjZU5hbWVzW2ldLCBzdGFydCwgZW5kKTsNCisJCX0NCisJCS8qIGNvbnZlcnQgbWVtYmVyIHR5cGVzICovDQorCQlpZiAobmVlZE1lbWJlclR5cGVzKSB7DQorCQkJSVNvdXJjZVR5cGVbXSBzb3VyY2VNZW1iZXJUeXBlcyA9IHNvdXJjZVR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsNCisJCQlpbnQgc291cmNlTWVtYmVyVHlwZUNvdW50ID0NCisJCQkJc291cmNlTWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VNZW1iZXJUeXBlcy5sZW5ndGg7DQorCQkJdHlwZS5tZW1iZXJUeXBlcyA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb25bc291cmNlTWVtYmVyVHlwZUNvdW50XTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU1lbWJlclR5cGVDb3VudDsgaSsrKSB7DQorCQkJCXR5cGUubWVtYmVyVHlwZXNbaV0gPQ0KKwkJCQkJKE1lbWJlclR5cGVEZWNsYXJhdGlvbikgY29udmVydChzb3VyY2VNZW1iZXJUeXBlc1tpXSwNCisJCQkJCQluZWVkRmllbGRzQW5kTWV0aG9kcywNCisJCQkJCQl0cnVlKTsNCiAJCQl9DQogCQl9DQotCQl0eXBlLm1ldGhvZHMgPSANCi0JCQluZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltzb3VyY2VNZXRob2RDb3VudCArIG5lZWRlZENvdW50XTsgDQotCQlpZiAobmVlZGVkQ291bnQgIT0gMCl7IC8vIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGluIGZpcnN0IHBvc2l0aW9uDQotCQkJdHlwZS5tZXRob2RzWzBdID0gdHlwZS5jcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcihmYWxzZSwgZmFsc2UpOw0KKwkJLyogY29udmVydCBmaWVsZHMgYW5kIG1ldGhvZHMgKi8NCisJCWlmIChuZWVkRmllbGRzQW5kTWV0aG9kcykgew0KKwkJCS8qIGNvbnZlcnQgZmllbGRzICovDQorCQkJSVNvdXJjZUZpZWxkW10gc291cmNlRmllbGRzID0gc291cmNlVHlwZS5nZXRGaWVsZHMoKTsNCisJCQlpbnQgc291cmNlRmllbGRDb3VudCA9IHNvdXJjZUZpZWxkcyA9PSBudWxsID8gMCA6IHNvdXJjZUZpZWxkcy5sZW5ndGg7DQorCQkJdHlwZS5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltzb3VyY2VGaWVsZENvdW50XTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpZWxkQ291bnQ7IGkrKykgew0KKwkJCQl0eXBlLmZpZWxkc1tpXSA9IGNvbnZlcnQoc291cmNlRmllbGRzW2ldKTsNCisJCQl9DQorDQorCQkJLyogY29udmVydCBtZXRob2RzIC0gbmVlZCB0byBhZGQgZGVmYXVsdCBjb25zdHJ1Y3RvciBpZiBuZWNlc3NhcnkgKi8NCisJCQlJU291cmNlTWV0aG9kW10gc291cmNlTWV0aG9kcyA9IHNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpOw0KKwkJCWludCBzb3VyY2VNZXRob2RDb3VudCA9IHNvdXJjZU1ldGhvZHMgPT0gbnVsbCA/IDAgOiBzb3VyY2VNZXRob2RzLmxlbmd0aDsNCisNCisJCQkvKiBzb3VyY2UgdHlwZSBoYXMgYSBjb25zdHJ1Y3RvciA/ICAgICAgICAgICAqLw0KKwkJCS8qIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IG9uZSBpcyBuZWVkZWQuICovDQorCQkJaW50IG5lZWRlZENvdW50ID0gMTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU1ldGhvZENvdW50OyBpKyspIHsNCisJCQkJaWYgKHNvdXJjZU1ldGhvZHNbaV0uaXNDb25zdHJ1Y3RvcigpKSB7DQorCQkJCQluZWVkZWRDb3VudCA9IDA7DQorCQkJCQkvLyBEb2VzIG5vdCBuZWVkIHRoZSBleHRyYSBjb25zdHJ1Y3RvciBzaW5jZSBvbmUgY29uc3RydWN0b3IgYWxyZWFkeSBleGlzdHMuDQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCQl0eXBlLm1ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltzb3VyY2VNZXRob2RDb3VudCArIG5lZWRlZENvdW50XTsNCisJCQlpZiAobmVlZGVkQ291bnQgIT0gMCkgeyAvLyBhZGQgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBmaXJzdCBwb3NpdGlvbg0KKwkJCQl0eXBlLm1ldGhvZHNbMF0gPSB0eXBlLmNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yKGZhbHNlLCBmYWxzZSk7DQorCQkJfQ0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTWV0aG9kQ291bnQ7IGkrKykgew0KKwkJCQl0eXBlLm1ldGhvZHNbbmVlZGVkQ291bnQgKyBpXSA9IGNvbnZlcnQoc291cmNlTWV0aG9kc1tpXSk7DQorCQkJfQ0KIAkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VNZXRob2RDb3VudDsgaSsrKSB7DQotCQkJdHlwZS5tZXRob2RzW25lZWRlZENvdW50ICsgaV0gPSBjb252ZXJ0KHNvdXJjZU1ldGhvZHNbaV0pOw0KLQkJfQ0KKwkJcmV0dXJuIHR5cGU7DQogCX0NCi0JcmV0dXJuIHR5cGU7DQotfQ0KLS8qDQotICogQnVpbGQgYW4gaW1wb3J0IHJlZmVyZW5jZSBmcm9tIGFuIGltcG9ydCBuYW1lLCBlLmcuIGphdmEubGFuZy4qDQotICovDQotcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUltcG9ydFJlZmVyZW5jZSgNCi0JY2hhcltdIGltcG9ydE5hbWUsIA0KLQlpbnQgc3RhcnQsIA0KLQlpbnQgZW5kKSB7DQogDQotCS8qIGNvdW50IGlkZW50aWZpZXJzICovDQotCWludCBtYXggPSBpbXBvcnROYW1lLmxlbmd0aDsNCi0JaW50IGlkZW50Q291bnQgPSAwOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7DQotCQlpZiAoaW1wb3J0TmFtZVtpXSA9PSAnLicpIGlkZW50Q291bnQrKzsNCi0JfQ0KLQkvKiBpbXBvcnQgb24gZGVtYW5kPyAqLw0KLQlib29sZWFuIG9uRGVtYW5kID0gaW1wb3J0TmFtZVttYXgtMV0gPT0gJyonOw0KLQlpZiAoIW9uRGVtYW5kKSBpZGVudENvdW50Kys7IC8vIG9uZSBtb3JlIGlkZW50IHRoYW4gZG90cw0KKwkvKg0KKwkgKiBCdWlsZCBhbiBpbXBvcnQgcmVmZXJlbmNlIGZyb20gYW4gaW1wb3J0IG5hbWUsIGUuZy4gamF2YS5sYW5nLioNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVJbXBvcnRSZWZlcmVuY2UoDQorCQljaGFyW10gaW1wb3J0TmFtZSwNCisJCWludCBzdGFydCwNCisJCWludCBlbmQpIHsNCiANCi0JbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOw0KLQlsb25nIHBvc2l0aW9uID0gKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50Q291bnQ7IGkrKyl7DQotCQlwb3NpdGlvbnNbaV0gPSBwb3NpdGlvbjsNCi0JfQ0KLQlyZXR1cm4gbmV3IEltcG9ydFJlZmVyZW5jZSggDQotCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBpbXBvcnROYW1lLCAwLCBtYXggLSAob25EZW1hbmQgPyAzIDogMSkpLA0KLQkJcG9zaXRpb25zLA0KLQkJb25EZW1hbmQpOw0KLX0NCi0vKg0KLSAqIEJ1aWxkIGEgdHlwZSByZWZlcmVuY2UgZnJvbSBhIHJlYWRhYmxlIG5hbWUsIGUuZy4gamF2YS5sYW5nLk9iamVjdFtdW10NCi0gKi8NCi1wcml2YXRlIHN0YXRpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoDQotCWNoYXJbXSB0eXBlU2lnbmF0dXJlLCANCi0JaW50IHN0YXJ0LCANCi0JaW50IGVuZCkgew0KLQ0KLQkvKiBjb3VudCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLw0KLQlpbnQgbWF4ID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7DQotCWludCBkaW1TdGFydCA9IG1heDsNCi0JaW50IGRpbSA9IDA7DQotCWludCBpZGVudENvdW50ID0gMTsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KLQkJc3dpdGNoICh0eXBlU2lnbmF0dXJlW2ldKSB7DQotCQkJY2FzZSAnWycgOg0KLQkJCQlpZiAoZGltID09IDApDQotCQkJCQlkaW1TdGFydCA9IGk7DQotCQkJCWRpbSsrOw0KLQkJCQlicmVhazsNCi0JCQljYXNlICcuJyA6DQorCQkvKiBjb3VudCBpZGVudGlmaWVycyAqLw0KKwkJaW50IG1heCA9IGltcG9ydE5hbWUubGVuZ3RoOw0KKwkJaW50IGlkZW50Q291bnQgPSAwOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKwkJCWlmIChpbXBvcnROYW1lW2ldID09ICcuJykNCiAJCQkJaWRlbnRDb3VudCsrOw0KLQkJCQlicmVhazsNCiAJCX0NCi0JfQ0KLQkvKiByZWJ1aWxkIGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovDQotCWlmIChpZGVudENvdW50ID09IDEpIHsgLy8gc2ltcGxlIHR5cGUgcmVmZXJlbmNlDQotCQlpZiAoZGltID09IDApIHsNCi0JCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UodHlwZVNpZ25hdHVyZSwgKGxvbmcpc3RhcnQgPDwgMzIgICsgZW5kKTsNCi0JCX0gZWxzZSB7DQotCQkJY2hhcltdIGlkZW50aWZpZXIgPSBuZXcgY2hhcltkaW1TdGFydF07DQotCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlU2lnbmF0dXJlLCAwLCBpZGVudGlmaWVyLCAwLCBkaW1TdGFydCk7DQotCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoaWRlbnRpZmllciwgZGltLCAobG9uZylzdGFydCA8PCAzMiAgKyBlbmQpOw0KLQkJfQ0KLQl9IGVsc2UgeyAvLyBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UNCisJCS8qIGltcG9ydCBvbiBkZW1hbmQ/ICovDQorCQlib29sZWFuIG9uRGVtYW5kID0gaW1wb3J0TmFtZVttYXggLSAxXSA9PSAnKic7DQorCQlpZiAoIW9uRGVtYW5kKQ0KKwkJCWlkZW50Q291bnQrKzsgLy8gb25lIG1vcmUgaWRlbnQgdGhhbiBkb3RzDQorDQogCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbaWRlbnRDb3VudF07DQotCQlsb25nIHBvcyA9IChsb25nKXN0YXJ0IDw8IDMyICArIGVuZDsNCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspew0KLQkJCXBvc2l0aW9uc1tpXSA9IHBvczsNCisJCWxvbmcgcG9zaXRpb24gPSAobG9uZykgc3RhcnQgPDwgMzIgKyBlbmQ7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50Q291bnQ7IGkrKykgew0KKwkJCXBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uOw0KIAkJfQ0KLQkJY2hhcltdW10gaWRlbnRpZmllcnMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlU2lnbmF0dXJlLCAwLCBkaW1TdGFydCAtIDEpOw0KLQkJaWYgKGRpbSA9PSAwKXsNCi0JCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIHBvc2l0aW9ucyk7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBkaW0sIHBvc2l0aW9ucyk7CQkJDQorCQlyZXR1cm4gbmV3IEltcG9ydFJlZmVyZW5jZSgNCisJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBpbXBvcnROYW1lLCAwLCBtYXggLSAob25EZW1hbmQgPyAzIDogMSkpLA0KKwkJCXBvc2l0aW9ucywNCisJCQlvbkRlbWFuZCk7DQorCX0NCisNCisJLyoNCisJICogQnVpbGQgYSB0eXBlIHJlZmVyZW5jZSBmcm9tIGEgcmVhZGFibGUgbmFtZSwgZS5nLiBqYXZhLmxhbmcuT2JqZWN0W11bXQ0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVUeXBlUmVmZXJlbmNlKA0KKwkJY2hhcltdIHR5cGVTaWduYXR1cmUsDQorCQlpbnQgc3RhcnQsDQorCQlpbnQgZW5kKSB7DQorDQorCQkvKiBjb3VudCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLw0KKwkJaW50IG1heCA9IHR5cGVTaWduYXR1cmUubGVuZ3RoOw0KKwkJaW50IGRpbVN0YXJ0ID0gbWF4Ow0KKwkJaW50IGRpbSA9IDA7DQorCQlpbnQgaWRlbnRDb3VudCA9IDE7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7DQorCQkJc3dpdGNoICh0eXBlU2lnbmF0dXJlW2ldKSB7DQorCQkJCWNhc2UgJ1snIDoNCisJCQkJCWlmIChkaW0gPT0gMCkNCisJCQkJCQlkaW1TdGFydCA9IGk7DQorCQkJCQlkaW0rKzsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlICcuJyA6DQorCQkJCQlpZGVudENvdW50Kys7DQorCQkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQkvKiByZWJ1aWxkIGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovDQorCQlpZiAoaWRlbnRDb3VudCA9PSAxKSB7IC8vIHNpbXBsZSB0eXBlIHJlZmVyZW5jZQ0KKwkJCWlmIChkaW0gPT0gMCkgew0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UodHlwZVNpZ25hdHVyZSwgKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kKTsNCisJCQl9IGVsc2Ugew0KKwkJCQljaGFyW10gaWRlbnRpZmllciA9IG5ldyBjaGFyW2RpbVN0YXJ0XTsNCisJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlU2lnbmF0dXJlLCAwLCBpZGVudGlmaWVyLCAwLCBkaW1TdGFydCk7DQorCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXIsIGRpbSwgKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kKTsNCisJCQl9DQorCQl9IGVsc2UgeyAvLyBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UNCisJCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbaWRlbnRDb3VudF07DQorCQkJbG9uZyBwb3MgPSAobG9uZykgc3RhcnQgPDwgMzIgKyBlbmQ7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsNCisJCQkJcG9zaXRpb25zW2ldID0gcG9zOw0KKwkJCX0NCisJCQljaGFyW11bXSBpZGVudGlmaWVycyA9DQorCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVTaWduYXR1cmUsIDAsIGRpbVN0YXJ0IC0gMSk7DQorCQkJaWYgKGRpbSA9PSAwKSB7DQorCQkJCXJldHVybiBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgcG9zaXRpb25zKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgZGltLCBwb3NpdGlvbnMpOw0KKwkJCX0NCiAJCX0NCiAJfQ0KLX0NCi19DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVGVybWluYWxTeW1ib2xzLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1Rlcm1pbmFsU3ltYm9scy5qYXZhCmluZGV4IGYyODExNzkuLjcxM2I3MTcgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVGVybWluYWxTeW1ib2xzLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9UZXJtaW5hbFN5bWJvbHMuamF2YQpAQCAtMTAsMTA5ICsxMCwxMTAgQEAKIA0KIHB1YmxpYyBpbnRlcmZhY2UgVGVybWluYWxTeW1ib2xzIHsNCiANCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQNCi0JICBUb2tlbk5hbWVJZGVudGlmaWVyID0gNSwNCi0JICBUb2tlbk5hbWVhYnN0cmFjdCA9IDkyLA0KLQkgIFRva2VuTmFtZWJvb2xlYW4gPSAxOCwNCi0JICBUb2tlbk5hbWVicmVhayA9IDExOCwNCi0JICBUb2tlbk5hbWVieXRlID0gMTksDQotCSAgVG9rZW5OYW1lY2FzZSA9IDIxMSwNCi0JICBUb2tlbk5hbWVjYXRjaCA9IDIyNSwNCi0JICBUb2tlbk5hbWVjaGFyID0gMjAsDQotCSAgVG9rZW5OYW1lY2xhc3MgPSAxNjMsDQotCSAgVG9rZW5OYW1lY29udGludWUgPSAxMTksDQotCSAgVG9rZW5OYW1lZGVmYXVsdCA9IDIxMiwNCi0JICBUb2tlbk5hbWVkbyA9IDEyMCwNCi0JICBUb2tlbk5hbWVkb3VibGUgPSAyMSwNCi0JICBUb2tlbk5hbWVlbHNlID0gMjEzLA0KLQkgIFRva2VuTmFtZWV4dGVuZHMgPSAyNDEsDQotCSAgVG9rZW5OYW1lZmFsc2UgPSAzNywNCi0JICBUb2tlbk5hbWVmaW5hbCA9IDkzLA0KLQkgIFRva2VuTmFtZWZpbmFsbHkgPSAyMjYsDQotCSAgVG9rZW5OYW1lZmxvYXQgPSAyMiwNCi0JICBUb2tlbk5hbWVmb3IgPSAxMjEsDQotCSAgVG9rZW5OYW1laWYgPSAxMjIsDQotCSAgVG9rZW5OYW1laW1wbGVtZW50cyA9IDI2NSwNCi0JICBUb2tlbk5hbWVpbXBvcnQgPSAxOTAsDQotCSAgVG9rZW5OYW1laW5zdGFuY2VvZiA9IDY1LA0KLQkgIFRva2VuTmFtZWludCA9IDIzLA0KLQkgIFRva2VuTmFtZWludGVyZmFjZSA9IDE4NCwNCi0JICBUb2tlbk5hbWVsb25nID0gMjQsDQotCSAgVG9rZW5OYW1lbmF0aXZlID0gOTQsDQotCSAgVG9rZW5OYW1lbmV3ID0gMzMsDQotCSAgVG9rZW5OYW1lbnVsbCA9IDM4LA0KLQkgIFRva2VuTmFtZXBhY2thZ2UgPSAyMTQsDQotCSAgVG9rZW5OYW1lcHJpdmF0ZSA9IDk1LA0KLQkgIFRva2VuTmFtZXByb3RlY3RlZCA9IDk2LA0KLQkgIFRva2VuTmFtZXB1YmxpYyA9IDk3LA0KLQkgIFRva2VuTmFtZXJldHVybiA9IDEyMywNCi0JICBUb2tlbk5hbWVzaG9ydCA9IDI1LA0KLQkgIFRva2VuTmFtZXN0YXRpYyA9IDk4LA0KLQkgIFRva2VuTmFtZXN0cmljdGZwID0gOTksDQotCSAgVG9rZW5OYW1lc3VwZXIgPSAzNSwNCi0JICBUb2tlbk5hbWVzd2l0Y2ggPSAxMjQsDQotCSAgVG9rZW5OYW1lc3luY2hyb25pemVkID0gODQsDQotCSAgVG9rZW5OYW1ldGhpcyA9IDM2LA0KLQkgIFRva2VuTmFtZXRocm93ID0gMTI1LA0KLQkgIFRva2VuTmFtZXRocm93cyA9IDIyNywNCi0JICBUb2tlbk5hbWV0cmFuc2llbnQgPSAxMDAsDQotCSAgVG9rZW5OYW1ldHJ1ZSA9IDM5LA0KLQkgIFRva2VuTmFtZXRyeSA9IDEyNiwNCi0JICBUb2tlbk5hbWV2b2lkID0gMjYsDQotCSAgVG9rZW5OYW1ldm9sYXRpbGUgPSAxMDEsDQotCSAgVG9rZW5OYW1ld2hpbGUgPSAxMTcsDQotCSAgVG9rZW5OYW1lSW50ZWdlckxpdGVyYWwgPSA0MCwNCi0JICBUb2tlbk5hbWVMb25nTGl0ZXJhbCA9IDQxLA0KLQkgIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsID0gNDIsDQotCSAgVG9rZW5OYW1lRG91YmxlTGl0ZXJhbCA9IDQzLA0KLQkgIFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgPSA0NCwNCi0JICBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsID0gNDUsDQotCSAgVG9rZW5OYW1lUExVU19QTFVTID0gMSwNCi0JICBUb2tlbk5hbWVNSU5VU19NSU5VUyA9IDIsDQotCSAgVG9rZW5OYW1lRVFVQUxfRVFVQUwgPSAzMiwNCi0JICBUb2tlbk5hbWVMRVNTX0VRVUFMID0gNjYsDQotCSAgVG9rZW5OYW1lR1JFQVRFUl9FUVVBTCA9IDY3LA0KLQkgIFRva2VuTmFtZU5PVF9FUVVBTCA9IDM0LA0KLQkgIFRva2VuTmFtZUxFRlRfU0hJRlQgPSAxMywNCi0JICBUb2tlbk5hbWVSSUdIVF9TSElGVCA9IDExLA0KLQkgIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUID0gMTIsDQotCSAgVG9rZW5OYW1lUExVU19FUVVBTCA9IDE2NiwNCi0JICBUb2tlbk5hbWVNSU5VU19FUVVBTCA9IDE2NywNCi0JICBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA9IDE2OCwNCi0JICBUb2tlbk5hbWVESVZJREVfRVFVQUwgPSAxNjksDQotCSAgVG9rZW5OYW1lQU5EX0VRVUFMID0gMTcwLA0KLQkgIFRva2VuTmFtZU9SX0VRVUFMID0gMTcxLA0KLQkgIFRva2VuTmFtZVhPUl9FUVVBTCA9IDE3MiwNCi0JICBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgPSAxNzMsDQotCSAgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA9IDE3NCwNCi0JICBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA9IDE3NSwNCi0JICBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA9IDE3NiwNCi0JICBUb2tlbk5hbWVPUl9PUiA9IDc5LA0KLQkgIFRva2VuTmFtZUFORF9BTkQgPSA3OCwNCi0JICBUb2tlbk5hbWVQTFVTID0gMywNCi0JICBUb2tlbk5hbWVNSU5VUyA9IDQsDQotCSAgVG9rZW5OYW1lTk9UID0gNzEsDQotCSAgVG9rZW5OYW1lUkVNQUlOREVSID0gOCwNCi0JICBUb2tlbk5hbWVYT1IgPSA2MywNCi0JICBUb2tlbk5hbWVBTkQgPSA2MiwNCi0JICBUb2tlbk5hbWVNVUxUSVBMWSA9IDcsDQotCSAgVG9rZW5OYW1lT1IgPSA3MCwNCi0JICBUb2tlbk5hbWVUV0lERExFID0gNzIsDQotCSAgVG9rZW5OYW1lRElWSURFID0gOSwNCi0JICBUb2tlbk5hbWVHUkVBVEVSID0gNjgsDQotCSAgVG9rZW5OYW1lTEVTUyA9IDY5LA0KLQkgIFRva2VuTmFtZUxQQVJFTiA9IDEwLA0KLQkgIFRva2VuTmFtZVJQQVJFTiA9IDg2LA0KLQkgIFRva2VuTmFtZUxCUkFDRSA9IDEwOSwNCi0JICBUb2tlbk5hbWVSQlJBQ0UgPSAxMDIsDQotCSAgVG9rZW5OYW1lTEJSQUNLRVQgPSAxNCwNCi0JICBUb2tlbk5hbWVSQlJBQ0tFVCA9IDE2NCwNCi0JICBUb2tlbk5hbWVTRU1JQ09MT04gPSA2NCwNCi0JICBUb2tlbk5hbWVRVUVTVElPTiA9IDgwLA0KLQkgIFRva2VuTmFtZUNPTE9OID0gMTUzLA0KLQkgIFRva2VuTmFtZUNPTU1BID0gODgsDQotCSAgVG9rZW5OYW1lRE9UID0gNiwNCi0JICBUb2tlbk5hbWVFUVVBTCA9IDE2NSwNCi0JICBUb2tlbk5hbWVFT0YgPSAxNTYsDQotCSAgVG9rZW5OYW1lRVJST1IgPSAzMDQ7DQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50DQorICAgICAgVG9rZW5OYW1lSWRlbnRpZmllciA9IDUsDQorICAgICAgVG9rZW5OYW1lYWJzdHJhY3QgPSA5OCwNCisgICAgICBUb2tlbk5hbWVhc3NlcnQgPSAxMTgsDQorICAgICAgVG9rZW5OYW1lYm9vbGVhbiA9IDE4LA0KKyAgICAgIFRva2VuTmFtZWJyZWFrID0gMTE5LA0KKyAgICAgIFRva2VuTmFtZWJ5dGUgPSAxOSwNCisgICAgICBUb2tlbk5hbWVjYXNlID0gMjExLA0KKyAgICAgIFRva2VuTmFtZWNhdGNoID0gMjI1LA0KKyAgICAgIFRva2VuTmFtZWNoYXIgPSAyMCwNCisgICAgICBUb2tlbk5hbWVjbGFzcyA9IDE2NSwNCisgICAgICBUb2tlbk5hbWVjb250aW51ZSA9IDEyMCwNCisgICAgICBUb2tlbk5hbWVkZWZhdWx0ID0gMjEyLA0KKyAgICAgIFRva2VuTmFtZWRvID0gMTIxLA0KKyAgICAgIFRva2VuTmFtZWRvdWJsZSA9IDIxLA0KKyAgICAgIFRva2VuTmFtZWVsc2UgPSAyMTMsDQorICAgICAgVG9rZW5OYW1lZXh0ZW5kcyA9IDI0MywNCisgICAgICBUb2tlbk5hbWVmYWxzZSA9IDM3LA0KKyAgICAgIFRva2VuTmFtZWZpbmFsID0gOTksDQorICAgICAgVG9rZW5OYW1lZmluYWxseSA9IDIyNiwNCisgICAgICBUb2tlbk5hbWVmbG9hdCA9IDIyLA0KKyAgICAgIFRva2VuTmFtZWZvciA9IDEyMiwNCisgICAgICBUb2tlbk5hbWVpZiA9IDEyMywNCisgICAgICBUb2tlbk5hbWVpbXBsZW1lbnRzID0gMjY3LA0KKyAgICAgIFRva2VuTmFtZWltcG9ydCA9IDE5MSwNCisgICAgICBUb2tlbk5hbWVpbnN0YW5jZW9mID0gNjUsDQorICAgICAgVG9rZW5OYW1laW50ID0gMjMsDQorICAgICAgVG9rZW5OYW1laW50ZXJmYWNlID0gMTgwLA0KKyAgICAgIFRva2VuTmFtZWxvbmcgPSAyNCwNCisgICAgICBUb2tlbk5hbWVuYXRpdmUgPSAxMDAsDQorICAgICAgVG9rZW5OYW1lbmV3ID0gMzIsDQorICAgICAgVG9rZW5OYW1lbnVsbCA9IDM4LA0KKyAgICAgIFRva2VuTmFtZXBhY2thZ2UgPSAyMTQsDQorICAgICAgVG9rZW5OYW1lcHJpdmF0ZSA9IDEwMSwNCisgICAgICBUb2tlbk5hbWVwcm90ZWN0ZWQgPSAxMDIsDQorICAgICAgVG9rZW5OYW1lcHVibGljID0gMTAzLA0KKyAgICAgIFRva2VuTmFtZXJldHVybiA9IDEyNCwNCisgICAgICBUb2tlbk5hbWVzaG9ydCA9IDI1LA0KKyAgICAgIFRva2VuTmFtZXN0YXRpYyA9IDk0LA0KKyAgICAgIFRva2VuTmFtZXN0cmljdGZwID0gMTA0LA0KKyAgICAgIFRva2VuTmFtZXN1cGVyID0gMzQsDQorICAgICAgVG9rZW5OYW1lc3dpdGNoID0gMTI1LA0KKyAgICAgIFRva2VuTmFtZXN5bmNocm9uaXplZCA9IDg1LA0KKyAgICAgIFRva2VuTmFtZXRoaXMgPSAzNSwNCisgICAgICBUb2tlbk5hbWV0aHJvdyA9IDEyNiwNCisgICAgICBUb2tlbk5hbWV0aHJvd3MgPSAyMjcsDQorICAgICAgVG9rZW5OYW1ldHJhbnNpZW50ID0gMTA1LA0KKyAgICAgIFRva2VuTmFtZXRydWUgPSAzOSwNCisgICAgICBUb2tlbk5hbWV0cnkgPSAxMjcsDQorICAgICAgVG9rZW5OYW1ldm9pZCA9IDI2LA0KKyAgICAgIFRva2VuTmFtZXZvbGF0aWxlID0gMTA2LA0KKyAgICAgIFRva2VuTmFtZXdoaWxlID0gMTE3LA0KKyAgICAgIFRva2VuTmFtZUludGVnZXJMaXRlcmFsID0gNDAsDQorICAgICAgVG9rZW5OYW1lTG9uZ0xpdGVyYWwgPSA0MSwNCisgICAgICBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA9IDQyLA0KKyAgICAgIFRva2VuTmFtZURvdWJsZUxpdGVyYWwgPSA0MywNCisgICAgICBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsID0gNDQsDQorICAgICAgVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCA9IDQ1LA0KKyAgICAgIFRva2VuTmFtZVBMVVNfUExVUyA9IDEsDQorICAgICAgVG9rZW5OYW1lTUlOVVNfTUlOVVMgPSAyLA0KKyAgICAgIFRva2VuTmFtZUVRVUFMX0VRVUFMID0gMzMsDQorICAgICAgVG9rZW5OYW1lTEVTU19FUVVBTCA9IDY2LA0KKyAgICAgIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgPSA2NywNCisgICAgICBUb2tlbk5hbWVOT1RfRVFVQUwgPSAzNiwNCisgICAgICBUb2tlbk5hbWVMRUZUX1NISUZUID0gMTQsDQorICAgICAgVG9rZW5OYW1lUklHSFRfU0hJRlQgPSAxMSwNCisgICAgICBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA9IDEyLA0KKyAgICAgIFRva2VuTmFtZVBMVVNfRVFVQUwgPSAxNjgsDQorICAgICAgVG9rZW5OYW1lTUlOVVNfRVFVQUwgPSAxNjksDQorICAgICAgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgPSAxNzAsDQorICAgICAgVG9rZW5OYW1lRElWSURFX0VRVUFMID0gMTcxLA0KKyAgICAgIFRva2VuTmFtZUFORF9FUVVBTCA9IDE3MiwNCisgICAgICBUb2tlbk5hbWVPUl9FUVVBTCA9IDE3MywNCisgICAgICBUb2tlbk5hbWVYT1JfRVFVQUwgPSAxNzQsDQorICAgICAgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMID0gMTc1LA0KKyAgICAgIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgPSAxNzYsDQorICAgICAgVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUwgPSAxNzcsDQorICAgICAgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgPSAxNzgsDQorICAgICAgVG9rZW5OYW1lT1JfT1IgPSA4MCwNCisgICAgICBUb2tlbk5hbWVBTkRfQU5EID0gNzksDQorICAgICAgVG9rZW5OYW1lUExVUyA9IDMsDQorICAgICAgVG9rZW5OYW1lTUlOVVMgPSA0LA0KKyAgICAgIFRva2VuTmFtZU5PVCA9IDcxLA0KKyAgICAgIFRva2VuTmFtZVJFTUFJTkRFUiA9IDksDQorICAgICAgVG9rZW5OYW1lWE9SID0gNjMsDQorICAgICAgVG9rZW5OYW1lQU5EID0gNjIsDQorICAgICAgVG9rZW5OYW1lTVVMVElQTFkgPSA4LA0KKyAgICAgIFRva2VuTmFtZU9SID0gNzAsDQorICAgICAgVG9rZW5OYW1lVFdJRERMRSA9IDcyLA0KKyAgICAgIFRva2VuTmFtZURJVklERSA9IDEwLA0KKyAgICAgIFRva2VuTmFtZUdSRUFURVIgPSA2OCwNCisgICAgICBUb2tlbk5hbWVMRVNTID0gNjksDQorICAgICAgVG9rZW5OYW1lTFBBUkVOID0gNywNCisgICAgICBUb2tlbk5hbWVSUEFSRU4gPSA4NiwNCisgICAgICBUb2tlbk5hbWVMQlJBQ0UgPSAxMTAsDQorICAgICAgVG9rZW5OYW1lUkJSQUNFID0gOTUsDQorICAgICAgVG9rZW5OYW1lTEJSQUNLRVQgPSAxNSwNCisgICAgICBUb2tlbk5hbWVSQlJBQ0tFVCA9IDE2NiwNCisgICAgICBUb2tlbk5hbWVTRU1JQ09MT04gPSA2NCwNCisgICAgICBUb2tlbk5hbWVRVUVTVElPTiA9IDgxLA0KKyAgICAgIFRva2VuTmFtZUNPTE9OID0gMTU0LA0KKyAgICAgIFRva2VuTmFtZUNPTU1BID0gOTAsDQorICAgICAgVG9rZW5OYW1lRE9UID0gNiwNCisgICAgICBUb2tlbk5hbWVFUVVBTCA9IDE2NywNCisgICAgICBUb2tlbk5hbWVFT0YgPSAxNTgsDQorICAgICAgVG9rZW5OYW1lRVJST1IgPSAzMDc7DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMS5yc2MgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjCmluZGV4IDQ4ZWFiMTAuLjg1YTZlZWYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMS5yc2MKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIucnNjIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYwppbmRleCA0MzQ2ODBkLi44ZjJkZDM5IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIucnNjCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMy5yc2MKaW5kZXggYjlkYTZmZi4uOTlmYzllNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYworKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjMucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNC5yc2MgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjQucnNjCmluZGV4IGY2MGRlMzkuLjdkNTMyZTYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNC5yc2MKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjUucnNjIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYwppbmRleCBkMTgwYzhkLi5iZmU3Y2I0IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjUucnNjCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW0uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtLmphdmEKaW5kZXggMWQ0Nzc2ZC4uZjVhNWMxOSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW0uamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbS5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAJLy9zYW5pdHkgLi4uLi4NCiAJaWYgKChzdGFydFBvc2l0aW9uID4gZW5kUG9zaXRpb24pDQogCQl8fCAoKHN0YXJ0UG9zaXRpb24gPD0gMCkgJiYgKGVuZFBvc2l0aW9uIDw9IDApKSkNCi0JCXJldHVybiBVdGlsLmJpbmQoInByb2JsZW0ubm9Tb3VyY2VJbmZvcm1hdGlvbiIvKm5vbk5MUyovKTsNCisJCXJldHVybiBVdGlsLmJpbmQoInByb2JsZW0ubm9Tb3VyY2VJbmZvcm1hdGlvbiIpOyAvLyROT04tTkxTLTEkDQogDQogCS8vcmVndWxhciBiZWhhdmlvci4uLi4oc2xvdyBjb2RlKQ0KIA0KQEAgLTExMSw4ICsxMTEsOCBAQAogCS8vcmVzaXplIHVuZGVybmVhdGh0byByZW1vdmUgJ251bGwnIGNoYXJzDQogCVN5c3RlbS5hcnJheWNvcHkodW5kZXJuZWF0aCwgMCwgdW5kZXJuZWF0aCA9IG5ldyBjaGFyW3Bvc10sIDAsIHBvcyk7DQogDQotCXJldHVybiAiICIvKm5vbk5MUyovICsgVXRpbC5iaW5kKCJwcm9ibGVtLmF0TGluZSIvKm5vbk5MUyovLFN0cmluZy52YWx1ZU9mKGxpbmUpKSArDQotCSJcblx0Ii8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKGV4dHJhY3QpICsgIlxuXHQiLypub25OTFMqLyArIG5ldyBTdHJpbmcodW5kZXJuZWF0aCk7DQorCXJldHVybiAiICIgKyBVdGlsLmJpbmQoInByb2JsZW0uYXRMaW5lIixTdHJpbmcudmFsdWVPZihsaW5lKSkgKyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJIlxuXHQiICsgbmV3IFN0cmluZyhleHRyYWN0KSArICJcblx0IiArIG5ldyBTdHJpbmcodW5kZXJuZWF0aCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBBbnN3ZXIgYmFjayB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHJlY29yZGVkIGludG8gdGhlIHByb2JsZW0uDQpAQCAtMjEyLDEzICsyMTIsMTMgQEAKIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIA0KLQlTdHJpbmcgcyA9ICJQYigiLypub25OTFMqLyArIChpZCAmIElnbm9yZUNhdGVnb3JpZXNNYXNrKSArICIpICIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICJQYigiICsgKGlkICYgSWdub3JlQ2F0ZWdvcmllc01hc2spICsgIikgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCWlmIChtZXNzYWdlICE9IG51bGwpIHsNCiAJCXMgKz0gbWVzc2FnZTsNCiAJfSBlbHNlIHsNCiAJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkNCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykNCi0JCQkJcyArPSAiICIvKm5vbk5MUyovICsgYXJndW1lbnRzW2ldOw0KKwkJCQlzICs9ICIgIiArIGFyZ3VtZW50c1tpXTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXJldHVybiBzOw0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCmluZGV4IDQxOGJiOGYuLjQwMzg1MTAgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCkBAIC03MCw5ICs3MCw5IEBACiAJU3RyaW5nIG1lc3NhZ2UgPSANCiAJCW1lc3NhZ2VUZW1wbGF0ZXNbKGlkICYgUHJvYmxlbUlycml0YW50cy5JZ25vcmVDYXRlZ29yaWVzTWFzayldOyANCiAJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgew0KLQkJcmV0dXJuICJVbmFibGUgdG8gcmV0cmlldmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW0gaWQ6ICIvKm5vbk5MUyovDQorCQlyZXR1cm4gIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbSBpZDogIiAvLyROT04tTkxTLTEkDQogCQkJKyBpZA0KLQkJCSsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiIvKm5vbk5MUyovOyANCisJCQkrICIuIENoZWNrIGNvbXBpbGVyIHJlc291cmNlcy4iOyAgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCWludCBsZW5ndGggPSBtZXNzYWdlLmxlbmd0aCgpOw0KQEAgLTg3LDkgKzg3LDkgQEAKIAkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQogCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOw0KIAkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuICJDb3JydXB0ZWQgY29tcGlsZXIgcmVzb3VyY2VzIGZvciBwcm9ibGVtIGlkOiAiLypub25OTFMqLw0KKwkJCQkJcmV0dXJuICJDb3JydXB0ZWQgY29tcGlsZXIgcmVzb3VyY2VzIGZvciBwcm9ibGVtIGlkOiAiIC8vJE5PTi1OTFMtMSQNCiAJCQkJCQkrIChpZCAmIFByb2JsZW1JcnJpdGFudHMuSWdub3JlQ2F0ZWdvcmllc01hc2spDQotCQkJCQkJKyAiLiBDaGVjayBjb21waWxlciByZXNvdXJjZXMuIi8qbm9uTkxTKi87IA0KKwkJCQkJCSsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiI7ICAvLyROT04tTkxTLTEkDQogCQkJCX0NCiAJCQl9IGVsc2Ugew0KIAkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7DQpAQCAtMTE1LDcgKzExNSw3IEBACiAgKiB0byB0aGUgY3VycmVudCBMb2NhbGUuDQogICovDQogcHVibGljIHN0YXRpYyBTdHJpbmdbXSBsb2FkTWVzc2FnZVRlbXBsYXRlcyhMb2NhbGUgbG9jKSB7DQotCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0ubWVzc2FnZXMiLypub25OTFMqLywgbG9jKTsNCisJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5tZXNzYWdlcyIsIGxvYyk7IC8vJE5PTi1OTFMtMSQNCiAJU3RyaW5nW10gdGVtcGxhdGVzID0gbmV3IFN0cmluZ1s1MDBdOw0KIAlmb3IgKGludCBpID0gMCwgbWF4ID0gdGVtcGxhdGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQogCQl0cnkgew0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1JcnJpdGFudHMuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1JcnJpdGFudHMuamF2YQppbmRleCBlNDEzMDA1Li5lN2VmMWMwIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSXJyaXRhbnRzLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbUlycml0YW50cy5qYXZhCkBAIC0yNzMsNyArMjczLDExIEBACiAJZmluYWwgaW50IENvZGVTbmlwcGV0TWlzc2luZ0NsYXNzID0gSW50ZXJuYWwgKyA0MjA7DQogCWZpbmFsIGludCBDb2RlU25pcHBldE1pc3NpbmdNZXRob2QgPSBJbnRlcm5hbCArIDQyMTsNCiAJZmluYWwgaW50IE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSBJbnRlcm5hbCArIDI2MTsNCi0NCisJZmluYWwgaW50IENhbm5vdFVzZVN1cGVySW5Db2RlU25pcHBldCA9IEludGVybmFsICsgNDIyOw0KKwkNCiAJLy9jb25zdGFudCBwb29sDQogCWZpbmFsIGludCBUb29NYW55Q29uc3RhbnRzSW5Db25zdGFudFBvb2wgPSBJbnRlcm5hbCArIDQzMDsNCisJDQorCS8vIGlkZW50aWZpZXJzIDEuNCBhc3NlcnQgZmVhdHVyZQ0KKwlmaW5hbCBpbnQgVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIgPSBJbnRlcm5hbCArIDQ0MDsNCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YQppbmRleCBkZjIyMjJjLi4xOTk4ZjFmIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJdGhpcy5oYW5kbGUoDQogCQlGaW5hbEZpZWxkQXNzaWdubWVudCwNCiAJCW5ldyBTdHJpbmdbXSB7DQotCQkJKGZpZWxkLmRlY2xhcmluZ0NsYXNzID09IG51bGwgPyAiYXJyYXkiLypub25OTFMqLyA6IG5ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpKSwNCisJCQkoZmllbGQuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCA/ICJhcnJheSIgOiBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSksIC8vJE5PTi1OTFMtMSQNCiAJCQluZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sDQogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCgpLA0KIAkJbG9jYXRpb24uc291cmNlRW5kKCkpOw0KQEAgLTI0OSw2ICsyNDksMTQgQEAKIAkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LA0KIAkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7DQogfQ0KK3B1YmxpYyB2b2lkIGNhbm5vdFVzZVN1cGVySW5Db2RlU25pcHBldChpbnQgc3RhcnQsIGludCBlbmQpIHsNCisJdGhpcy5oYW5kbGUoDQorCQlDYW5ub3RVc2VTdXBlckluQ29kZVNuaXBwZXQsDQorCQluZXcgU3RyaW5nWzBdLA0KKwkJRXJyb3IgfCBBYm9ydCwNCisJCXN0YXJ0LA0KKwkJZW5kKTsNCit9DQogcHVibGljIHZvaWQgY2FzZUV4cHJlc3Npb25NdXN0QmVDb25zdGFudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsNCiAJdGhpcy5oYW5kbGUoDQogCQlOb25Db25zdGFudEV4cHJlc3Npb24sDQpAQCAtNDI4LDcgKzQzNiwxNCBAQAogCQkJCXJldHVybiBXYXJuaW5nOw0KIAkJCX0NCiAJCQlyZXR1cm4gSWdub3JlOw0KLQkJDQorCQljYXNlIFVzZUFzc2VydEFzQW5JZGVudGlmaWVyIDoNCisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyKSAhPSAwKXsNCisJCQkJcmV0dXJuIEVycm9yOw0KKwkJCX0NCisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIpICE9IDApew0KKwkJCQlyZXR1cm4gV2FybmluZzsNCisJCQl9DQorCQkJcmV0dXJuIElnbm9yZTsJCQ0KIAkJZGVmYXVsdDoNCiAJCQlyZXR1cm4gRXJyb3I7DQogCX0NCkBAIC00NTksMTAgKzQ3NCwxMCBAQAogCQkJZmluYWwgaW50IHJhZGl4Ow0KIAkJCWlmICgoc291cmNlWzFdID09ICd4JykgfHwgKHNvdXJjZVsxXSA9PSAnWCcpKSB7DQogCQkJCXJhZGl4ID0gMTY7DQotCQkJCVJhZGl4ID0gIkhleGEiLypub25OTFMqLzsNCisJCQkJUmFkaXggPSAiSGV4YSI7IC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KIAkJCQlyYWRpeCA9IDg7DQotCQkJCVJhZGl4ID0gIk9jdGFsIi8qbm9uTkxTKi87DQorCQkJCVJhZGl4ID0gIk9jdGFsIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQkvL2xvb2sgZm9yIHRoZSBmaXJzdCBkaWdpdCB0aGF0IGlzIGluY29ycmVjdA0KIAkJCWludCBwbGFjZSA9IC0xOw0KQEAgLTQ3NSw3ICs0OTAsNyBAQAogDQogCQkJdGhpcy5oYW5kbGUoDQogCQkJCU51bWVyaWNWYWx1ZU91dE9mUmFuZ2UsDQotCQkJCW5ldyBTdHJpbmdbXSB7UmFkaXggKyAiICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhzb3VyY2UpICsgIiAoZGlnaXQgIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKG5ldyBjaGFyW10ge3NvdXJjZVtwbGFjZV19KSArICIpIi8qbm9uTkxTKi99LA0KKwkJCQluZXcgU3RyaW5nW10ge1JhZGl4ICsgIiAiICsgbmV3IFN0cmluZyhzb3VyY2UpICsgIiAoZGlnaXQgIiArIG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7c291cmNlW3BsYWNlXX0pICsgIikifSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCiAJCQkJbGl0LnNvdXJjZVN0YXJ0LA0KIAkJCQlsaXQuc291cmNlRW5kKTsNCiAJCQlyZXR1cm47DQpAQCAtNjQwLDcgKzY1NSw3IEBACiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJaWYgKGkgIT0gMCkNCi0JCQlidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQlidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcocGFyYW1zW2ldLnJlYWRhYmxlTmFtZSgpKSk7DQogCX0NCiANCkBAIC02NTMsNyArNjY4LDcgQEAKIHB1YmxpYyB2b2lkIGVycm9yVGhpc1N1cGVySW5TdGF0aWMoQXN0Tm9kZSByZWZlcmVuY2UpIHsNCiAJdGhpcy5oYW5kbGUoDQogCQlUaGlzSW5TdGF0aWNDb250ZXh0LA0KLQkJbmV3IFN0cmluZ1tdIHtyZWZlcmVuY2UuaXNTdXBlcigpID8gInN1cGVyIi8qbm9uTkxTKi8gOiAidGhpcyIvKm5vbk5MUyovfSwNCisJCW5ldyBTdHJpbmdbXSB7cmVmZXJlbmNlLmlzU3VwZXIoKSA/ICJzdXBlciIgOiAidGhpcyJ9LCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwNCiAJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOw0KIH0NCkBAIC03ODksNyArODA0LDcgQEAKIHB1YmxpYyB2b2lkIGhpZXJhcmNoeUNpcmN1bGFyaXR5KFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlLCBUeXBlUmVmZXJlbmNlIHJlZmVyZW5jZSkgew0KIAlpbnQgc3RhcnQgPSAwOw0KIAlpbnQgZW5kID0gMDsNCi0JU3RyaW5nIHR5cGVOYW1lID0gIiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgdHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAlpZiAocmVmZXJlbmNlID09IG51bGwpIHsJLy8gY2FuIG9ubHkgaGFwcGVuIHdoZW4gamF2YS5sYW5nLk9iamVjdCBpcyBidXN0ZWQNCiAJCXN0YXJ0ID0gc291cmNlVHlwZS5zb3VyY2VTdGFydCgpOw0KQEAgLTEwNzMsNyArMTA4OCw3IEBACiAJCQkuYXBwZW5kKCcuJykNCiAJCQkuYXBwZW5kKGluaGVyaXRlZE1ldGhvZHNbaV0ucmVhZGFibGVOYW1lKCkpOw0KIAkJaWYgKGkgIT0gMCkNCi0JCQltZXRob2RTaWduYXR1cmVzLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJbWV0aG9kU2lnbmF0dXJlcy5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIA0KIAl0aGlzLmhhbmRsZSgNCkBAIC0xMTg4LDcgKzEyMDMsNyBAQAogDQogCXRoaXMuaGFuZGxlKA0KIAkJZmxhZywNCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIuIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwNCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIuIiArIG5ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSl9LCAvLyROT04tTkxTLTEkDQogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LA0KIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOw0KIH0NCkBAIC0xMzk5LDcgKzE0MTQsNyBAQAogCQlJbnZhbGlkT3BlcmF0b3IsDQogCQluZXcgU3RyaW5nW10gew0KIAkJCWV4cHJlc3Npb24ub3BlcmF0b3JUb1N0cmluZygpLA0KLQkJCW5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpICsgIiwgIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LA0KKwkJCW5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpICsgIiwgIiArIG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sIC8vJE5PTi1OTFMtMSQNCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsDQogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7DQogfQ0KQEAgLTE0MDgsNyArMTQyMyw3IEBACiAJCUludmFsaWRPcGVyYXRvciwNCiAJCW5ldyBTdHJpbmdbXSB7DQogCQkJYXNzaWduLm9wZXJhdG9yVG9TdHJpbmcoKSwNCi0JCQluZXcgU3RyaW5nKGxlZnRUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIsICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpfSwNCisJCQluZXcgU3RyaW5nKGxlZnRUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIsICIgKyBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LCAvLyROT04tTkxTLTEkDQogCQlhc3NpZ24uc291cmNlU3RhcnQsDQogCQlhc3NpZ24uc291cmNlRW5kKTsNCiB9DQpAQCAtMTYwNCw3ICsxNjE5LDcgQEAKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQoKSk7DQogfQ0KIHB1YmxpYyB2b2lkIG5lZWRJbXBsZW1lbnRhdGlvbigpIHsNCi0JdGhpcy5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihVdGlsLmJpbmQoImFib3J0Lm1pc3NpbmdDb2RlIi8qbm9uTkxTKi8pKTsNCisJdGhpcy5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihVdGlsLmJpbmQoImFib3J0Lm1pc3NpbmdDb2RlIikpOyAvLyROT04tTkxTLTEkDQogfQ0KIHB1YmxpYyB2b2lkIG5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MoRmllbGRCaW5kaW5nIGZpZWxkLCBBc3ROb2RlIGxvY2F0aW9uKSB7DQogCXRoaXMuaGFuZGxlKA0KQEAgLTE3MjAsNyArMTczNSw3IEBACiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KIAkJaWYgKGkgIT0gMCkNCi0JCQlidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQlidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcocGFyYW1zW2ldLnJlYWRhYmxlTmFtZSgpKSk7DQogCX0NCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KQEAgLTE3NTAsMjAgKzE3NjUsMjAgQEAKIAlTdHJpbmdCdWZmZXIgbGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KIAlmb3IgKGludCBpID0gMCwgbWF4ID0gcG9zc2libGVUb2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCiAJCWlmIChpID4gMCkNCi0JCQlsaXN0LmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJbGlzdC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWxpc3QuYXBwZW5kKCciJyk7DQogCQlsaXN0LmFwcGVuZChwb3NzaWJsZVRva2Vuc1tpXSk7DQogCQlsaXN0LmFwcGVuZCgnIicpOw0KIAl9DQogDQogCS8vZXh0cmFjdCB0aGUgbGl0ZXJhbCB3aGVuIGl0J3MgYSBsaXRlcmFsICANCi0JaWYgKChlcnJvclRva2VuTmFtZS5lcXVhbHMoIkludGVnZXJMaXRlcmFsIi8qbm9uTkxTKi8pKSB8fA0KLQkJKGVycm9yVG9rZW5OYW1lLmVxdWFscygiTG9uZ0xpdGVyYWwiLypub25OTFMqLykpIHx8DQotCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJGbG9hdGluZ1BvaW50TGl0ZXJhbCIvKm5vbk5MUyovKSkgfHwNCi0JCShlcnJvclRva2VuTmFtZS5lcXVhbHMoIkRvdWJsZUxpdGVyYWwiLypub25OTFMqLykpIHx8DQotCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJTdHJpbmdMaXRlcmFsIi8qbm9uTkxTKi8pKSB8fA0KLQkJKGVycm9yVG9rZW5OYW1lLmVxdWFscygiQ2hhcmFjdGVyTGl0ZXJhbCIvKm5vbk5MUyovKSkgfHwNCi0JCShlcnJvclRva2VuTmFtZS5lcXVhbHMoIklkZW50aWZpZXIiLypub25OTFMqLykpKSB7DQorCWlmICgoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJJbnRlZ2VyTGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkDQorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJMb25nTGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkDQorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJGbG9hdGluZ1BvaW50TGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkDQorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJEb3VibGVMaXRlcmFsIikpIHx8IC8vJE5PTi1OTFMtMSQNCisJCShlcnJvclRva2VuTmFtZS5lcXVhbHMoIlN0cmluZ0xpdGVyYWwiKSkgfHwgLy8kTk9OLU5MUy0xJA0KKwkJKGVycm9yVG9rZW5OYW1lLmVxdWFscygiQ2hhcmFjdGVyTGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkDQorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJJZGVudGlmaWVyIikpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQllcnJvclRva2VuTmFtZSA9IG5ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKTsNCiAJfQ0KIA0KQEAgLTIxNTUsNiArMjE3MCwxNSBAQAogCQlsb2NhbERlY2wuc291cmNlU3RhcnQsDQogCQlsb2NhbERlY2wuc291cmNlRW5kKTsNCiB9DQorDQorcHVibGljIHZvaWQgdXNlQXNzZXJ0QXNBbklkZW50aWZpZXIoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7DQorCXRoaXMuaGFuZGxlKA0KKwkJVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIsDQorCQluZXcgU3RyaW5nWzBdLA0KKwkJc291cmNlU3RhcnQsDQorCQlzb3VyY2VFbmQpOwkNCit9DQorDQogcHVibGljIHZvaWQgdmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJEZWNsKSB7DQogCXRoaXMuaGFuZGxlKA0KIAkJVmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkLA0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IGRkN2Y0MmYuLjlkY2ZjZjkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMjMxLDUgKzIzMSw3IEBACiANCiA0MjAgPSBDb2RlIHNuaXBwZXQgc3VwcG9ydCBjYW5ub3QgZmluZCB0aGUgY2xhc3MgezB9DQogNDIxID0gQ29kZSBzbmlwcGV0IHN1cHBvcnQgY2Fubm90IGZpbmQgdGhlIG1ldGhvZCB7MH0uezF9KHsyfSkgDQorNDIyID0gc3VwZXIgY2Fubm90IGJlIHVzZWQgaW4gdGhlIGNvZGUgc25pcHBldCBjb2RlDQorNDMwID0gVG9vIG1hbnkgY29uc3RhbnRzLCB0aGUgY29uc3RhbnQgcG9vbCBmb3IgezB9IHdvdWxkIGV4Y2VlZCA2NTUzNiBlbnRyaWVzLg0KIA0KLTQzMCA9IFRvbyBtYW55IGNvbnN0YW50cywgdGhlIGNvbnN0YW50IHBvb2wgZm9yIHswfSB3b3VsZCBleGNlZWQgNjU1MzYgZW50cmllcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis0NDAgPSAnYXNzZXJ0JyB3aWxsIGJlIGEgcmVzZXJ2ZWQga2V5d29yZCBmcm9tIHJlbGVhc2UgMS40IG9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YQppbmRleCBhNjZkZTljLi4xMTZjMzhiIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9DaGFyT3BlcmF0aW9uLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvQ2hhck9wZXJhdGlvbi5qYXZhCkBAIC01NDIsNyArNTQyLDcgQEAKIGZpbmFsIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXVtdIGFycmF5KSB7DQogCWNoYXJbXSByZXN1bHQgPSBjb25jYXRXaXRoKGFycmF5LCAnLicpOw0KIAlpZiAocmVzdWx0ID09IG51bGwpDQotCQlyZXR1cm4gIiIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkludC5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnQuamF2YQppbmRleCBlMWI4NzBkLi45MGMyMGU3IDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkludC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEKQEAgLTc3LDExICs3NywxMSBAQAogCXJldHVybiBlbGVtZW50U2l6ZTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JU3RyaW5nIHMgPSAiIi8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQNCiAJT2JqZWN0IG9iamVjdDsNCiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspDQogCQlpZiAoKG9iamVjdCA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpDQotCQkJcyArPSBrZXlUYWJsZVtpXSArICIgLT4gIi8qbm9uTkxTKi8gKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiIvKm5vbk5MUyovOw0KKwkJCXMgKz0ga2V5VGFibGVbaV0gKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCmluZGV4IDgxNDNhOTMuLjExOTFjMmMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZPYmplY3QuamF2YQpAQCAtNzgsMTEgKzc4LDExIEBACiAJcmV0dXJuIGVsZW1lbnRTaXplOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAlPYmplY3Qgb2JqZWN0Ow0KIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAJCWlmICgob2JqZWN0ID0gdmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkNCi0JCQlzICs9IG5ldyBTdHJpbmcoa2V5VGFibGVbaV0pICsgIiAtPiAiLypub25OTFMqLyArIG9iamVjdC50b1N0cmluZygpICsgIlxuIi8qbm9uTkxTKi87DQorCQkJcyArPSBuZXcgU3RyaW5nKGtleVRhYmxlW2ldKSArICIgLT4gIiArIG9iamVjdC50b1N0cmluZygpICsgIlxuIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlBhY2thZ2UuamF2YQppbmRleCAyZTQzMDhmLi44OTkwMzgzIDEwMDY0NAotLS0gYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlBhY2thZ2UuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlBhY2thZ2UuamF2YQpAQCAtNzksMTEgKzc5LDExIEBACiAJcmV0dXJuIGVsZW1lbnRTaXplOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmcgcyA9ICIiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAlQYWNrYWdlQmluZGluZyBwa2c7DQogCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KIAkJaWYgKChwa2cgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQ0KLQkJCXMgKz0gcGtnLnRvU3RyaW5nKCkgKyAiXG4iLypub25OTFMqLzsNCisJCQlzICs9IHBrZy50b1N0cmluZygpICsgIlxuIjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gczsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mVHlwZS5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEKaW5kZXggNDg3Yjg0MS4uNjBiZGM4ZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEKKysrIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEKQEAgLTc5LDExICs3OSwxMSBAQAogCXJldHVybiBlbGVtZW50U2l6ZTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JU3RyaW5nIHMgPSAiIi8qbm9uTkxTKi87DQorCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQNCiAJUmVmZXJlbmNlQmluZGluZyB0eXBlOw0KIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAJCWlmICgodHlwZSA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpDQotCQkJcyArPSB0eXBlLnRvU3RyaW5nKCkgKyAiXG4iLypub25OTFMqLzsNCisJCQlzICs9IHR5cGUudG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIHM7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YSBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL09iamVjdFZlY3Rvci5qYXZhCmluZGV4IGM0N2UwYWIuLmEzMGU2OGQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL09iamVjdFZlY3Rvci5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL09iamVjdFZlY3Rvci5qYXZhCkBAIC02MSw5ICs2MSw5IEBACiAJc2l6ZSA9IDA7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCVN0cmluZyBzID0gIiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KLQkJcyArPSBlbGVtZW50c1tpXS50b1N0cmluZygpICsgIlxuIi8qbm9uTkxTKi87DQorCQlzICs9IGVsZW1lbnRzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTmFtZVZlY3Rvci5qYXZhIGIvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTmFtZVZlY3Rvci5qYXZhCmluZGV4IDFjYjM4ZTMuLjBiN2YwZDIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZU5hbWVWZWN0b3IuamF2YQorKysgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVOYW1lVmVjdG9yLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQotCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRzW2ldKS5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZChlbGVtZW50c1tpXSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCmRpZmYgLS1naXQgYS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEgYi9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEKaW5kZXggMWU0YmNkYy4uZmU3NzQ4MyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvVXRpbC5qYXZhCisrKyBiL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1V0aWwuamF2YQpAQCAtMTEsNyArMTEsNyBAQAogcHVibGljIGNsYXNzIFV0aWwgew0KIAkvKiBCdW5kbGUgY29udGFpbmluZyBtZXNzYWdlcyAqLw0KIAlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwubWVzc2FnZXMiLypub25OTFMqLzsNCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQogCXN0YXRpYyB7DQogCQlyZWxvY2FsaXplKCk7DQogCX0NCkBAIC0zNSwxNCArMzUsMTQgQEAKICAqLw0KIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmdbXSBiaW5kaW5ncykgew0KIAlpZiAoaWQgPT0gbnVsbCkNCi0JCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiLypub25OTFMqLzsNCisJCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiOyAvLyROT04tTkxTLTEkDQogCVN0cmluZyBtZXNzYWdlID0gbnVsbDsNCiAJdHJ5IHsNCiAJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsNCiAJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCiAJCS8vIElmIHdlIGdvdCBhbiBleGNlcHRpb24gbG9va2luZyBmb3IgdGhlIG1lc3NhZ2UsIGZhaWwgZ3JhY2VmdWxseSBieSBqdXN0IHJldHVybmluZw0KIAkJLy8gdGhlIGlkIHdlIHdlcmUgbG9va2luZyBmb3IuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgc2VtaS1pbmZvcm1hdGl2ZSBzbyBpcyBub3QgdG9vIGJhZC4NCi0JCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiLypub25OTFMqLyArIGlkICsgIiBpbjogIi8qbm9uTkxTKi8gKyBidW5kbGVOYW1lOw0KKwkJcmV0dXJuICJNaXNzaW5nIG1lc3NhZ2U6ICIgKyBpZCArICIgaW46ICIgKyBidW5kbGVOYW1lOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoYmluZGluZ3MgPT0gbnVsbCkNCiAJCXJldHVybiBtZXNzYWdlOw0KQEAgLTYxLDcgKzYxLDcgQEAKIAkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQogCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOw0KIAkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIi8qbm9uTkxTKi8gKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSArICJ9Ii8qbm9uTkxTKi8pOw0KKwkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpICsgIn0iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCX0NCiAJCQl9IGVsc2Ugew0KIAkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7DQpAQCAtODcsNiArODcsNiBAQAogCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsNCiB9DQogcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKXsNCi0JU3lzdGVtLm91dC5wcmludGxuKGJpbmQoInRlc3QiLypub25OTFMqLykpOw0KKwlTeXN0ZW0ub3V0LnByaW50bG4oYmluZCgidGVzdCIpKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29tcGlsZXIuamF2YQppbmRleCAwMGY4ZGQ3Li43YTk4NTdlIDEwMDY0NAotLS0gYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29tcGlsZXIuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29tcGlsZXIuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCQlpbnQgY29kZVNuaXBwZXRFbmQpIHsNCiAJc3VwZXIoZW52aXJvbm1lbnQsIHBvbGljeSwgc2V0dGluZ3MsIHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnkpOw0KIAl0aGlzLnBhcnNlciA9IA0KLQkJbmV3IENvZGVTbmlwcGV0UGFyc2VyKHByb2JsZW1SZXBvcnRlciwgZXZhbHVhdGlvbkNvbnRleHQsIHRoaXMub3B0aW9ucy5wYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzLCBjb2RlU25pcHBldFN0YXJ0LCBjb2RlU25pcHBldEVuZCk7DQorCQluZXcgQ29kZVNuaXBwZXRQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBldmFsdWF0aW9uQ29udGV4dCwgdGhpcy5vcHRpb25zLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMsIHRoaXMub3B0aW9ucy5nZXRBc3NlcnRNb2RlKCksIGNvZGVTbmlwcGV0U3RhcnQsIGNvZGVTbmlwcGV0RW5kKTsNCiAJdGhpcy5wYXJzZVRocmVzaG9sZCA9IDE7IC8vIGZ1bGx5IHBhcnNlIG9ubHkgdGhlIGNvZGUgc25pcHBldCBjb21waWxhdGlvbiB1bml0DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29uc3RhbnRQb29sLmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29uc3RhbnRQb29sLmphdmEKaW5kZXggMGQzZDkyMy4uODA1MjI3MCAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbnN0YW50UG9vbC5qYXZhCisrKyBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb25zdGFudFBvb2wuamF2YQpAQCAtMTUsODIgKzE1LDgyIEBACiBwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRDb25zdGFudFBvb2wgZXh0ZW5kcyBDb25zdGFudFBvb2wgaW1wbGVtZW50cyBUeXBlQ29uc3RhbnRzIHsNCiANCiAJLy8gcHJlZGVmaW5lZCB0eXBlIGNvbnN0YW50IG5hbWVzDQotCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRCA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkZpZWxkIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQotCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9BQ0NFU1NJQkxFT0JKRUNUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCAiQWNjZXNzaWJsZU9iamVjdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCl9Ow0KLQlmaW5hbCBzdGF0aWMgY2hhcltdW10gSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCAiTWV0aG9kIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQotCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9BUlJBWSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkFycmF5Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKX07DQorCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRCA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkZpZWxkIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdW10gSkFWQV9MQU5HX1JFRkxFQ1RfQUNDRVNTSUJMRU9CSkVDVCA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkFjY2Vzc2libGVPYmplY3QiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9NRVRIT0QgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIFJFRkxFQ1QsICJNZXRob2QiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9BUlJBWSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkFycmF5Ii50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvLyBwcmVkZWZpbmVkIG1ldGhvZHMgY29uc3RhbnQgbmFtZXMNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRERUNMQVJFREZJRUxEX05BTUUgPSAiZ2V0RGVjbGFyZWRGaWVsZCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURGSUVMRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTRVRBQ0NFU1NJQkxFX05BTUUgPSAic2V0QWNjZXNzaWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUQUNDRVNTSUJMRV9TSUdOQVRVUkUgPSAiKFopViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gSkFWQUxBTkdSRUZMRUNURklFTERfQ09OU1RBTlRQT09MTkFNRSA9ICJqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gSkFWQUxBTkdSRUZMRUNUQUNDRVNTSUJMRU9CSkVDVF9DT05TVEFOVFBPT0xOQU1FID0gImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVEFSUkFZX0NPTlNUQU5UUE9PTE5BTUUgPSAiamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVE1FVEhPRF9DT05TVEFOVFBPT0xOQU1FID0gImphdmEvbGFuZy9yZWZsZWN0L01ldGhvZCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0lOVF9NRVRIT0RfTkFNRSA9ICJnZXRJbnQiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9MT05HX01FVEhPRF9OQU1FID0gImdldExvbmciLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9ET1VCTEVfTUVUSE9EX05BTUUgPSAiZ2V0RG91YmxlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRkxPQVRfTUVUSE9EX05BTUUgPSAiZ2V0RmxvYXQiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CWVRFX01FVEhPRF9OQU1FID0gImdldEJ5dGUiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9DSEFSX01FVEhPRF9OQU1FID0gImdldENoYXIiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CT09MRUFOX01FVEhPRF9OQU1FID0gImdldEJvb2xlYW4iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9PQkpFQ1RfTUVUSE9EX05BTUUgPSAiZ2V0Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfU0hPUlRfTUVUSE9EX05BTUUgPSAiZ2V0U2hvcnQiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEFSUkFZX05FV0lOU1RBTkNFX05BTUUgPSAibmV3SW5zdGFuY2UiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9JTlRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUkiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9MT05HX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylKIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRE9VQkxFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylEIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUYiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CWVRFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylCIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDspQyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVoiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylTIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfSU5UX01FVEhPRF9OQU1FID0gInNldEludCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0xPTkdfTUVUSE9EX05BTUUgPSAic2V0TG9uZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0RPVUJMRV9NRVRIT0RfTkFNRSA9ICJzZXREb3VibGUiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9GTE9BVF9NRVRIT0RfTkFNRSA9ICJzZXRGbG9hdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JZVEVfTUVUSE9EX05BTUUgPSAic2V0Qnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0NIQVJfTUVUSE9EX05BTUUgPSAic2V0Q2hhciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUgPSAic2V0Qm9vbGVhbiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX09CSkVDVF9NRVRIT0RfTkFNRSA9ICJzZXQiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9TSE9SVF9NRVRIT0RfTkFNRSA9ICJzZXRTaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUQ0xBU1NfT0JKRUNUX01FVEhPRF9OQU1FID0gImdldENsYXNzIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfSU5UX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0kpViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0xPTkdfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7SilWIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfRE9VQkxFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0QpViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0ZMT0FUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0YpViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JZVEVfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7QilWIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtDKVYiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9CT09MRUFOX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O1opViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX09CSkVDVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O1MpViIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURNRVRIT0RfTkFNRSA9ICJnZXREZWNsYXJlZE1ldGhvZCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURNRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEFSUkFZX05FV0lOU1RBTkNFX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9DbGFzcztbSSlMamF2YS9sYW5nL09iamVjdDsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVENMQVNTX09CSkVDVF9NRVRIT0RfU0lHTkFUVVJFID0gIigpTGphdmEvbGFuZy9DbGFzczsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIElOVk9LRV9NRVRIT0RfTUVUSE9EX05BTUUgPSAiaW52b2tlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBJTlZPS0VfTUVUSE9EX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBCWVRFVkFMVUVfQllURV9NRVRIT0RfTkFNRSA9ICJieXRlVmFsdWUiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIEJZVEVWQUxVRV9CWVRFX01FVEhPRF9TSUdOQVRVUkUgPSAiKClCIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FID0gInNob3J0VmFsdWUiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RfTkFNRSA9ICJkb3VibGVWYWx1ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfTkFNRSA9ICJmbG9hdFZhbHVlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FID0gImludFZhbHVlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9OQU1FID0gImNoYXJWYWx1ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX05BTUUgPSAiYm9vbGVhblZhbHVlIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBMT05HVkFMVUVfTE9OR19NRVRIT0RfTkFNRSA9ICJsb25nVmFsdWUiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIFNIT1JUVkFMVUVfU0hPUlRfTUVUSE9EX1NJR05BVFVSRSA9ICIoKVMiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RfU0lHTkFUVVJFID0gIigpRCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfU0lHTkFUVVJFID0gIigpRiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gSU5UVkFMVUVfSU5URUdFUl9NRVRIT0RfU0lHTkFUVVJFID0gIigpSSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gQ0hBUlZBTFVFX0NIQVJBQ1RFUl9NRVRIT0RfU0lHTkFUVVJFID0gIigpQyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSA9ICIoKVoiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlmaW5hbCBzdGF0aWMgY2hhcltdIExPTkdWQUxVRV9MT05HX01FVEhPRF9TSUdOQVRVUkUgPSAiKClKIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JZmluYWwgc3RhdGljIGNoYXJbXSBHRVRERUNMQVJFRENPTlNUUlVDVE9SX05BTUUgPSAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvciIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURDT05TVFJVQ1RPUl9TSUdOQVRVUkUgPSAiKFtMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRERUNMQVJFREZJRUxEX05BTUUgPSAiZ2V0RGVjbGFyZWRGaWVsZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVERklFTERfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVEFDQ0VTU0lCTEVfTkFNRSA9ICJzZXRBY2Nlc3NpYmxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUQUNDRVNTSUJMRV9TSUdOQVRVUkUgPSAiKFopViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVEZJRUxEX0NPTlNUQU5UUE9PTE5BTUUgPSAiamF2YS9sYW5nL3JlZmxlY3QvRmllbGQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBKQVZBTEFOR1JFRkxFQ1RBQ0NFU1NJQkxFT0JKRUNUX0NPTlNUQU5UUE9PTE5BTUUgPSAiamF2YS9sYW5nL3JlZmxlY3QvQWNjZXNzaWJsZU9iamVjdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVEFSUkFZX0NPTlNUQU5UUE9PTE5BTUUgPSAiamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBKQVZBTEFOR1JFRkxFQ1RNRVRIT0RfQ09OU1RBTlRQT09MTkFNRSA9ICJqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfSU5UX01FVEhPRF9OQU1FID0gImdldEludCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9MT05HX01FVEhPRF9OQU1FID0gImdldExvbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRE9VQkxFX01FVEhPRF9OQU1FID0gImdldERvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9GTE9BVF9NRVRIT0RfTkFNRSA9ICJnZXRGbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CWVRFX01FVEhPRF9OQU1FID0gImdldEJ5dGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfQ0hBUl9NRVRIT0RfTkFNRSA9ICJnZXRDaGFyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0JPT0xFQU5fTUVUSE9EX05BTUUgPSAiZ2V0Qm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9PQkpFQ1RfTUVUSE9EX05BTUUgPSAiZ2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX1NIT1JUX01FVEhPRF9OQU1FID0gImdldFNob3J0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gQVJSQVlfTkVXSU5TVEFOQ0VfTkFNRSA9ICJuZXdJbnN0YW5jZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9JTlRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfTE9OR19NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDspSiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9ET1VCTEVfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfQllURV9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDspQiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9DSEFSX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylDIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVoiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfT0JKRUNUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfU0hPUlRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfSU5UX01FVEhPRF9OQU1FID0gInNldEludCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9MT05HX01FVEhPRF9OQU1FID0gInNldExvbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfRE9VQkxFX01FVEhPRF9OQU1FID0gInNldERvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9GTE9BVF9NRVRIT0RfTkFNRSA9ICJzZXRGbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9CWVRFX01FVEhPRF9OQU1FID0gInNldEJ5dGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQ0hBUl9NRVRIT0RfTkFNRSA9ICJzZXRDaGFyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUgPSAic2V0Qm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9PQkpFQ1RfTUVUSE9EX05BTUUgPSAic2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX1NIT1JUX01FVEhPRF9OQU1FID0gInNldFNob3J0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUQ0xBU1NfT0JKRUNUX01FVEhPRF9OQU1FID0gImdldENsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0lOVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtJKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfTE9OR19NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtKKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfRE9VQkxFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0QpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9GTE9BVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtGKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQllURV9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtCKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtDKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQk9PTEVBTl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtaKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfT0JKRUNUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O1MpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVETUVUSE9EX05BTUUgPSAiZ2V0RGVjbGFyZWRNZXRob2QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRERUNMQVJFRE1FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEFSUkFZX05FV0lOU1RBTkNFX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9DbGFzcztbSSlMamF2YS9sYW5nL09iamVjdDsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRDTEFTU19PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUxqYXZhL2xhbmcvQ2xhc3M7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gSU5WT0tFX01FVEhPRF9NRVRIT0RfTkFNRSA9ICJpbnZva2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBJTlZPS0VfTUVUSE9EX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gQllURVZBTFVFX0JZVEVfTUVUSE9EX05BTUUgPSAiYnl0ZVZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gQllURVZBTFVFX0JZVEVfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FID0gInNob3J0VmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX05BTUUgPSAiZG91YmxlVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBGTE9BVFZBTFVFX0ZMT0FUX01FVEhPRF9OQU1FID0gImZsb2F0VmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FID0gImludFZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gQ0hBUlZBTFVFX0NIQVJBQ1RFUl9NRVRIT0RfTkFNRSA9ICJjaGFyVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRSA9ICJib29sZWFuVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBMT05HVkFMVUVfTE9OR19NRVRIT0RfTkFNRSA9ICJsb25nVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKClTIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gRE9VQkxFVkFMVUVfRE9VQkxFX01FVEhPRF9TSUdOQVRVUkUgPSAiKClEIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfU0lHTkFUVVJFID0gIigpRiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIElOVFZBTFVFX0lOVEVHRVJfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9TSUdOQVRVUkUgPSAiKClDIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSA9ICIoKVoiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJZmluYWwgc3RhdGljIGNoYXJbXSBMT05HVkFMVUVfTE9OR19NRVRIT0RfU0lHTkFUVVJFID0gIigpSiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVEQ09OU1RSVUNUT1JfTkFNRSA9ICJnZXREZWNsYXJlZENvbnN0cnVjdG9yIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURDT05TVFJVQ1RPUl9TSUdOQVRVUkUgPSAiKFtMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCQ0KIAkvLyBwcmVkZWZpbmVkIGNvbnN0YW50IGluZGV4IGZvciB3ZWxsIGtub3duIHR5cGVzDQogCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1JFRkxFQ1RfRklFTERfVFlQRSA9IDA7DQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFBhcnNlci5qYXZhIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFBhcnNlci5qYXZhCmluZGV4IDRkNDNiYjkuLmM4NDFjMDUgMTAwNjQ0Ci0tLSBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRQYXJzZXIuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEKQEAgLTIzLDggKzIzLDggQEAKIC8qKg0KICAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IHBhcnNlci4NCiAgKi8NCi1wdWJsaWMgQ29kZVNuaXBwZXRQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQsIGJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscywgaW50IGNvZGVTbmlwcGV0U3RhcnQsIGludCBjb2RlU25pcHBldEVuZCkgew0KLQlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIG9wdGltaXplU3RyaW5nTGl0ZXJhbHMpOw0KK3B1YmxpYyBDb2RlU25pcHBldFBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCwgYm9vbGVhbiBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLCBib29sZWFuIGFzc2VydE1vZGUsIGludCBjb2RlU25pcHBldFN0YXJ0LCBpbnQgY29kZVNuaXBwZXRFbmQpIHsNCisJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLCBhc3NlcnRNb2RlKTsNCiAJdGhpcy5jb2RlU25pcHBldFN0YXJ0ID0gY29kZVNuaXBwZXRTdGFydDsNCiAJdGhpcy5jb2RlU25pcHBldEVuZCA9IGNvZGVTbmlwcGV0RW5kOw0KIAl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7DQpAQCAtMTQwLDcgKzE0MCw4IEBACiAJaWYgKGlzU3VwZXJBY2Nlc3MpIHsNCiAJCS8vY29uc2lkZXJhdGVzIHRoZSBmaWVsZFJlZmVyZW5jZSBiZWdpbm5pbmcgYXQgdGhlICdzdXBlcicgLi4uLgkNCiAJCWZyLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOw0KLQkJZnIucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZnIuc291cmNlU3RhcnQsIGVuZFBvc2l0aW9uKTsNCisJCXByb2JsZW1SZXBvcnRlcigpLmNvZGVTbmlwcGV0TWlzc2luZ0NsYXNzKG51bGwsMCwgMCk7DQorCQlmci5yZWNlaXZlciA9IG5ldyBDb2RlU25pcHBldFN1cGVyUmVmZXJlbmNlKGZyLnNvdXJjZVN0YXJ0LCBlbmRQb3NpdGlvbiwgZXZhbHVhdGlvbkNvbnRleHQpOw0KIAkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGZyKTsNCiAJfSBlbHNlIHsNCiAJCS8vb3B0aW1pemUgcHVzaC9wb3ANCkBAIC0yODEsNiArMjgyLDcgQEAKIAkJbWV0aG9kRGVjbC5zdGF0ZW1lbnRzID0gbmV3U3RhdGVtZW50czsNCiAJfQ0KIH0NCisNCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKSB7DQogCS8vIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScNCiANCkBAIC0zMDgsNiArMzEwLDIwIEBACiAJCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOw0KIAl9DQogfQ0KKw0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKSB7DQorCS8vIE1ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJw0KKw0KKwlNZXNzYWdlU2VuZCBtID0gbmV3TWVzc2FnZVNlbmQoKTsNCisJbS5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsNCisJbS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7DQorCW0ubmFtZVNvdXJjZVBvc2l0aW9uID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl07DQorCW0uc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsNCisJaWRlbnRpZmllckxlbmd0aFB0ci0tOw0KKwltLnJlY2VpdmVyID0gbmV3IENvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UobS5zb3VyY2VTdGFydCwgZW5kUG9zaXRpb24sIHRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOw0KKwlwdXNoT25FeHByZXNzaW9uU3RhY2sobSk7DQorfQ0KKw0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVRoaXMoKSB7DQogCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSAndGhpcycNCiANCkBAIC0zMTUsNyArMzMxLDcgQEAKIAkJJiYgc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IGNvZGVTbmlwcGV0RW5kICsgMQ0KIAkJJiYgaXNUb3BMZXZlbFR5cGUoKSkgew0KIAkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKA0KLQkJCW5ldyBDb2RlU25pcHBldFRoaXNSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dLCBlbmRQb3NpdGlvbiwgZXZhbHVhdGlvbkNvbnRleHQsIGZhbHNlKSk7DQorCQkJbmV3IENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0sIGVuZFBvc2l0aW9uLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LCBmYWxzZSkpOw0KIAl9IGVsc2Ugew0KIAkJc3VwZXIuY29uc3VtZVByaW1hcnlOb05ld0FycmF5VGhpcygpOw0KIAl9DQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRRdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggM2Y5ZmUzNy4uZjlmMjRmZiAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC01MDEsMTcgKzUwMSwyNCBAQAogCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOw0KIAl9DQogDQotCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUZpZWxkQmluZGluZyAmJiAoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdEZvdW5kKXsNCi0JCS8vIHdpbGwgbm90IHN1cHBvcnQgaW5uZXJjbGFzcyBlbXVsYXRpb24gaW5zaWRlIGRlbGVnYXRlDQotCQliaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQoZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW5zWzBdLCB0aGlzKTsNCi0JCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSByZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOw0KLQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOw0KLQl9DQotDQotCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUJpbmRpbmcgJiYgKChQcm9ibGVtQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpew0KKwlpZiAoKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nICYmICgoUHJvYmxlbUZpZWxkQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpDQorCQl8fCAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1CaW5kaW5nICYmICgoUHJvYmxlbUJpbmRpbmcpIGJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdEZvdW5kKSl7DQogCQkvLyB3aWxsIG5vdCBzdXBwb3J0IGlubmVyY2xhc3MgZW11bGF0aW9uIGluc2lkZSBkZWxlZ2F0ZQ0KIAkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHNjb3BlLmdldEZpZWxkKGRlbGVnYXRlVGhpcy50eXBlLCB0aGlzLnRva2Vuc1swXSwgdGhpcyk7DQotCQlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSByZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOw0KKwkJaWYgKCFmaWVsZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgew0KKwkJCWlmICgoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGZpZWxkQmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkgew0KKwkJCQkvLyBtYW5hZ2UgdGhlIGFjY2VzcyB0byBhIHByaXZhdGUgZmllbGQgb2YgdGhlIGVuY2xvc2luZyB0eXBlDQorCQkJCUNvZGVTbmlwcGV0U2NvcGUgbG9jYWxTY29wZSA9IG5ldyBDb2RlU25pcHBldFNjb3BlKHNjb3BlKTsNCisJCQkJYmluZGluZyA9IGxvY2FsU2NvcGUuZ2V0RmllbGRGb3JDb2RlU25pcHBldChkZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbnNbMF0sIHRoaXMpOw0KKwkJCQlpZiAoYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7DQorCQkJCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CQkJCQkJDQorCQkJCX0gZWxzZSB7DQorCQkJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOw0KKwkJCQl9DQorCQkJfSBlbHNlIHsNCisJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsNCisJCQl9DQorCQl9DQogCQliaW5kaW5nID0gZmllbGRCaW5kaW5nOw0KIAkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOw0KIAl9DQpAQCAtNTI5LDcgKzUzNiw2IEBACiANCiAJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsNCiB9DQotDQogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlVmlzaWJpbGl0eShCbG9ja1Njb3BlIHNjb3BlKSB7DQogCS8vIGZpZWxkIGFuZC9vciBsb2NhbCBhcmUgZG9uZSBiZWZvcmUgdHlwZSBsb29rdXBzDQogDQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFJldHVyblN0YXRlbWVudC5qYXZhIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFJldHVyblN0YXRlbWVudC5qYXZhCmluZGV4IDExYzNmNjcuLmM0ZWJjNDggMTAwNjQ0Ci0tLSBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50LmphdmEKQEAgLTIxLDYgKzIxLDE1IEBACiBwdWJsaWMgQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByLCBpbnQgcywgaW50IGUsIEV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0KSB7DQogCXN1cGVyKGV4cHIsIHMsIGUpOw0KIH0NCisNCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgew0KKwlGbG93SW5mbyBpbmZvID0gc3VwZXIuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOw0KKwkvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGlzIG9wdGltaXphdGlvbiBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBpbmxpbmluZyBvZiB0aGUgcmV0dXJuIGJ5dGVjb2RlDQorCS8vIDFHSDBBVTc6IElUUEpDT1JFOkFMTCAtIEV2YWwgLSBWZXJpZnlFcnJvciBpbiBzY3JhcGJvb2sgcGFnZQ0KKwl0aGlzLmV4cHJlc3Npb24uYml0cyAmPSB+VmFsdWVGb3JSZXR1cm5NQVNLOw0KKwlyZXR1cm4gaW5mbzsNCit9DQorDQogLyoqDQogICogRHVtcCB0aGUgc3VpdGFibGUgcmV0dXJuIGJ5dGVjb2RlIGZvciBhIHJldHVybiBzdGF0ZW1lbnQNCiAgKg0KQEAgLTgyLDEyICs5MSwxMiBAQAogCQlpZiAoKHRoaXMuZXhwcmVzc2lvblR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpKSAhPSBudWxsKSB7DQogCQkJVHlwZUJpbmRpbmcgamF2YUxhbmdDbGFzcyA9IHNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKTsNCiAJCQlpZiAoIWphdmFMYW5nQ2xhc3MuaXNWYWxpZEJpbmRpbmcoKSkgew0KLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb2RlU25pcHBldE1pc3NpbmdDbGFzcygiamF2YS5sYW5nLkNsYXNzIi8qbm9uTkxTKi8sIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsNCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MoImphdmEubGFuZy5DbGFzcyIsIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlyZXR1cm47DQogCQkJfQ0KIAkJCVR5cGVCaW5kaW5nIGphdmFMYW5nT2JqZWN0ID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsNCiAJCQlpZiAoIWphdmFMYW5nT2JqZWN0LmlzVmFsaWRCaW5kaW5nKCkpIHsNCi0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MoImphdmEubGFuZy5PYmplY3QiLypub25OTFMqLywgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOw0KKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb2RlU25pcHBldE1pc3NpbmdDbGFzcygiamF2YS5sYW5nLk9iamVjdCIsIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlyZXR1cm47DQogCQkJfQ0KIAkJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tdIHtqYXZhTGFuZ09iamVjdCwgamF2YUxhbmdDbGFzc307DQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQppbmRleCBjMDZiNDhlLi4yYzY0ZmIwIDEwMDY0NAotLS0gYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQpAQCAtMTcsMjAgKzE3LDIwIEBACiBwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRTa2VsZXRvbiBpbXBsZW1lbnRzIElCaW5hcnlUeXBlLCBFdmFsdWF0aW9uQ29uc3RhbnRzIHsNCiAJSUJpbmFyeU1ldGhvZFtdIG1ldGhvZHMgPSBuZXcgSUJpbmFyeU1ldGhvZFtdIHsNCiAJCW5ldyBCaW5hcnlNZXRob2RTa2VsZXRvbigNCi0JCQkiPGluaXQ+Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwNCi0JCQkiKClWIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwNCisJCQkiPGluaXQ+Ii50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkDQorCQkJIigpViIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJA0KIAkJCW5ldyBjaGFyW11bXSB7fSwNCiAJCQl0cnVlDQogCQkpLA0KIAkJbmV3IEJpbmFyeU1ldGhvZFNrZWxldG9uKA0KLQkJCSJydW4iLypub25OTFMqLy50b0NoYXJBcnJheSgpLA0KLQkJCSIoKVYiLypub25OTFMqLy50b0NoYXJBcnJheSgpLA0KLQkJCW5ldyBjaGFyW11bXSB7ImphdmEvbGFuZy9UaHJvd2FibGUiLypub25OTFMqLy50b0NoYXJBcnJheSgpfSwNCisJCQkicnVuIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkDQorCQkJIigpViIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJA0KKwkJCW5ldyBjaGFyW11bXSB7ImphdmEvbGFuZy9UaHJvd2FibGUiLnRvQ2hhckFycmF5KCl9LCAvLyROT04tTkxTLTEkDQogCQkJZmFsc2UNCiAJCSksDQogCQluZXcgQmluYXJ5TWV0aG9kU2tlbGV0b24oDQotCQkJInNldFJlc3VsdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCksDQotCQkJIihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzOylWIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwNCisJCQkic2V0UmVzdWx0Ii50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkDQorCQkJIihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzOylWIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkDQogCQkJbmV3IGNoYXJbXVtdIHt9LA0KIAkJCWZhbHNlDQogCQkpDQpAQCAtODcsNyArODcsNyBAQAogCXJldHVybiBudWxsOw0KIH0NCiBwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgew0KLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ09ERV9TTklQUEVUX05BTUUsICIuamF2YSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCkpOw0KKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ09ERV9TTklQUEVUX05BTUUsICIuamF2YSIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogcHVibGljIGNoYXJbXVtdIGdldEludGVyZmFjZU5hbWVzKCkgew0KIAlyZXR1cm4gbnVsbDsNCkBAIC0xMTYsNCArMTE2LDggQEAKIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgew0KIAlyZXR1cm4gZmFsc2U7DQogfQ0KKw0KK3B1YmxpYyBjaGFyW10gc291cmNlRmlsZU5hbWUoKSB7DQorCXJldHVybiBudWxsOw0KK30NCiB9DQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YSBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggNDdmZTAyMy4uYWQ5OTExMCAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZS5qYXZhCkBAIC03NSw2ICs3NSw2IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsNCiAJY2hhcltdIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lOw0KLQlyZXR1cm4gIigiLypub25OTFMqLyArIChkZWNsYXJpbmdUeXBlID09IG51bGwgPyAiPE5PIERFQ0xBUklORyBUWVBFPiIvKm5vbk5MUyovIDogbmV3IFN0cmluZyhkZWNsYXJpbmdUeXBlKSkgKyAiKXRoaXMiLypub25OTFMqLzsNCisJcmV0dXJuICIoIiArIChkZWNsYXJpbmdUeXBlID09IG51bGwgPyAiPE5PIERFQ0xBUklORyBUWVBFPiIgOiBuZXcgU3RyaW5nKGRlY2xhcmluZ1R5cGUpKSArICIpdGhpcyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YQppbmRleCBmZDk2NjE2Li5kYzY0ZjY5IDEwMDY0NAotLS0gYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhCisrKyBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUb0N1TWFwcGVyLmphdmEKQEAgLTY2LDQyICs2Niw0MiBAQAogDQogCS8vIHBhY2thZ2UgZGVjbGFyYXRpb24NCiAJaWYgKHRoaXMucGFja2FnZU5hbWUgIT0gbnVsbCAmJiB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCAhPSAwKSB7DQotCQlidWZmZXIuYXBwZW5kKCJwYWNrYWdlICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQodGhpcy5wYWNrYWdlTmFtZSk7DQotCQlidWZmZXIuYXBwZW5kKCI7Ii8qbm9uTkxTKi8pLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJCWJ1ZmZlci5hcHBlbmQoIjsiKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQNCiAJCXRoaXMubGluZU51bWJlck9mZnNldCsrOw0KIAl9DQogDQogCS8vIGltcG9ydCBkZWNsYXJhdGlvbnMNCiAJY2hhcltdW10gaW1wb3J0cyA9IHRoaXMuaW1wb3J0czsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7DQotCQlidWZmZXIuYXBwZW5kKCJpbXBvcnQgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiaW1wb3J0ICIpOyAvLyROT04tTkxTLTEkDQogCQlidWZmZXIuYXBwZW5kKGltcG9ydHNbaV0pOw0KIAkJYnVmZmVyLmFwcGVuZCgnOycpLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCiAJCXRoaXMubGluZU51bWJlck9mZnNldCsrOw0KIAl9DQogDQogCS8vIGNsYXNzIGRlY2xhcmF0aW9uDQotCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyBjbGFzcyAiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJA0KIAlidWZmZXIuYXBwZW5kKHRoaXMuY2xhc3NOYW1lKTsNCiANCiAJLy8gc3VwZXIgY2xhc3MgaXMgZWl0aGVyIGEgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzIG9yIHRoZSBDb2RlU25pcHBldCBjbGFzcw0KIAlpZiAodGhpcy52YXJDbGFzc05hbWUgIT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQodGhpcy52YXJDbGFzc05hbWUpOw0KIAl9IGVsc2Ugew0KLQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQoUEFDS0FHRV9OQU1FKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIi4iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQoUk9PVF9DTEFTU19OQU1FKTsNCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCIgeyIvKm5vbk5MUyovKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQorCWJ1ZmZlci5hcHBlbmQoIiB7IikuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkDQogCXRoaXMubGluZU51bWJlck9mZnNldCsrOw0KIA0KIAlpZiAodGhpcy5kZWNsYXJpbmdUeXBlTmFtZSAhPSBudWxsKXsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmZmVyLmFwcGVuZCh0aGlzLmRlY2xhcmluZ1R5cGVOYW1lKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQoREVMRUdBVEVfVEhJUyk7IC8vIHZhbCR0aGlzDQogCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KIAkJdGhpcy5saW5lTnVtYmVyT2Zmc2V0Kys7DQpAQCAtMTA5LDkgKzEwOSw5IEBACiAJLy8gYWRkIHNvbWUgc3RvcmFnZSBsb2NhdGlvbiBmb3IgbG9jYWwgdmFyaWFibGUgcGVyc2lzdGVkIHN0YXRlDQogCWlmIChsb2NhbFZhck5hbWVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBsb2NhbFZhck5hbWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiICAgICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIgICAgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKGxvY2FsVmFyVHlwZU5hbWVzW2ldKTsNCi0JCQlidWZmZXIuYXBwZW5kKCIgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJ1ZmZlci5hcHBlbmQoTE9DQUxfVkFSX1BSRUZJWCk7IC8vIHZhbCQuLi4NCiAJCQlidWZmZXIuYXBwZW5kKGxvY2FsVmFyTmFtZXNbaV0pOw0KIAkJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQpAQCAtMTE5LDcgKzExOSw3IEBACiAJCX0NCiAJfQ0KIAkvLyBydW4oKSBtZXRob2QgZGVjbGFyYXRpb24NCi0JYnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIFRocm93YWJsZSB7Ii8qbm9uTkxTKi8pLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJYnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIFRocm93YWJsZSB7IikuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkDQogCXRoaXMubGluZU51bWJlck9mZnNldCsrOw0KIAlzdGFydFBvc09mZnNldCA9IGJ1ZmZlci5sZW5ndGgoKTsNCiAJYnVmZmVyLmFwcGVuZChjb2RlU25pcHBldCk7DQpAQCAtMTczLDcgKzE3Myw3IEBACiAJCQkvLyBSZW1vdmUgY29tcGxldGlvbiBvbiBnZW5lcmF0ZWQgbWV0aG9kDQogCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMucGFja2FnZU5hbWUpIA0KIAkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLmNsYXNzTmFtZSkNCi0JCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCAicnVuIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSkpIHJldHVybjsNCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCAicnVuIi50b0NoYXJBcnJheSgpKSkgcmV0dXJuOyAvLyROT04tTkxTLTEkDQogCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcywgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCk7DQogCQl9DQogCQlwdWJsaWMgdm9pZCBhY2NlcHRNb2RpZmllcihjaGFyW10gbW9kaWZpZXJOYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCkgew0KZGlmZiAtLWdpdCBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKaW5kZXggNTEwMDQ0NS4uZGQ5MDBiNyAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKKysrIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKQEAgLTcsMTkgKzcsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOw0KIA0KIHB1YmxpYyBpbnRlcmZhY2UgRXZhbHVhdGlvbkNvbnN0YW50cyB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENPREVfU05JUFBFVF9DTEFTU19OQU1FX1BSRUZJWCA9ICJDb2RlU25pcHBldF8iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBHTE9CQUxfVkFSU19DTEFTU19OQU1FX1BSRUZJWCA9ICJHbG9iYWxWYXJpYWJsZXNfIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLnRhcmdldCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENPREVfU05JUFBFVF9OQU1FID0gIm9yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL3RhcmdldC9Db2RlU25pcHBldCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFJPT1RfQ0xBU1NfTkFNRSA9ICJDb2RlU25pcHBldCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRlVMTF9DTEFTU19OQU1FID0gbmV3IFN0cmluZyhQQUNLQUdFX05BTUUpICsgIi4iLypub25OTFMqLyArIG5ldyBTdHJpbmcoUk9PVF9DTEFTU19OQU1FKTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VUUkVTVUxUX1NFTEVDVE9SID0gInNldFJlc3VsdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFNFVFJFU1VMVF9BUkdVTUVOVFMgPSAiTGphdmEubGFuZy5PYmplY3Q7TGphdmEubGFuZy5DbGFzczsiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDT0RFX1NOSVBQRVRfQ0xBU1NfTkFNRV9QUkVGSVggPSAiQ29kZVNuaXBwZXRfIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEdMT0JBTF9WQVJTX0NMQVNTX05BTUVfUFJFRklYID0gIkdsb2JhbFZhcmlhYmxlc18iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLnRhcmdldCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDT0RFX1NOSVBQRVRfTkFNRSA9ICJvcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC90YXJnZXQvQ29kZVNuaXBwZXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUk9PVF9DTEFTU19OQU1FID0gIkNvZGVTbmlwcGV0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRlVMTF9DTEFTU19OQU1FID0gbmV3IFN0cmluZyhQQUNLQUdFX05BTUUpICsgIi4iICsgbmV3IFN0cmluZyhST09UX0NMQVNTX05BTUUpOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFNFVFJFU1VMVF9TRUxFQ1RPUiA9ICJzZXRSZXN1bHQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VUUkVTVUxUX0FSR1VNRU5UUyA9ICJMamF2YS5sYW5nLk9iamVjdDtMamF2YS5sYW5nLkNsYXNzOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIFJPT1RfQ09NUE9VTkRfTkFNRSA9IENoYXJPcGVyYXRpb24uYXJyYXlDb25jYXQoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgUEFDS0FHRV9OQU1FKSwgUk9PVF9DTEFTU19OQU1FKTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX01FVEhPRCA9ICJydW4iLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1ZBTFVFX0ZJRUxEID0gInJlc3VsdFZhbHVlIi8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9UWVBFX0ZJRUxEID0gInJlc3VsdFR5cGUiLypub25OTFMqLzsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gTE9DQUxfVkFSX1BSRUZJWCA9ICJ2YWwkIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gREVMRUdBVEVfVEhJUyA9ICJ2YWwkdGhpcyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9NRVRIT0QgPSAicnVuIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfVkFMVUVfRklFTEQgPSAicmVzdWx0VmFsdWUiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9UWVBFX0ZJRUxEID0gInJlc3VsdFR5cGUiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIExPQ0FMX1ZBUl9QUkVGSVggPSAidmFsJCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBERUxFR0FURV9USElTID0gInZhbCR0aGlzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCQ0KIH0NCmRpZmYgLS1naXQgYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db250ZXh0LmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db250ZXh0LmphdmEKaW5kZXggYmYyYzAxMS4uMTViYjIwNiAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29udGV4dC5qYXZhCisrKyBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnRleHQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogICoJCXNldCBvZiBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjb2RlIGFzc2lzdCBlbmdpbmUuDQogICovDQogcHVibGljIHZvaWQgY29tcGxldGUoY2hhcltdIGNvZGVTbmlwcGV0LCBpbnQgY29tcGxldGlvblBvc2l0aW9uLCBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLCBDb25maWd1cmFibGVPcHRpb25bXSBvcHRpb25zKSB7DQotCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRDb21wbGV0aW9uIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCisJZmluYWwgY2hhcltdIGNsYXNzTmFtZSA9ICJDb2RlU25pcHBldENvbXBsZXRpb24iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJZmluYWwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IG5ldyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoDQogCQljb2RlU25pcHBldCwgDQogCQl0aGlzLnBhY2thZ2VOYW1lLCANCkBAIC05MSw3ICs5MSw3IEBACiAJKTsNCiAJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IElDb21waWxhdGlvblVuaXQoKSB7DQogCQlwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgew0KLQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWUsICJqYXZhIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSwgJy4nKTsNCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoY2xhc3NOYW1lLCAiamF2YSIudG9DaGFyQXJyYXkoKSwgJy4nKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsNCiAJCQlyZXR1cm4gbWFwcGVyLmdldENVU291cmNlKCk7DQpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQlpZiAoVElNSU5HKSB7DQogCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCiAJCQkJY2xhc3NlcyA9IGV2YWx1YXRvci5nZXRDbGFzc2VzKCk7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0byBjb21waWxlIFsiLypub25OTFMqLyArIG5ldyBTdHJpbmcoY29kZVNuaXBwZXQpICsgIl0gd2FzICIvKm5vbk5MUyovICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIm1zIi8qbm9uTkxTKi8pOw0KKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gY29tcGlsZSBbIiArIG5ldyBTdHJpbmcoY29kZVNuaXBwZXQpICsgIl0gd2FzICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KIAkJCQljbGFzc2VzID0gZXZhbHVhdG9yLmdldENsYXNzZXMoKTsNCiAJCQl9DQpAQCAtMzYyLDUwICszNjIsNTAgQEAKICAqLw0KIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvZGVTbmlwcGV0U291cmNlKCkgew0KIAlyZXR1cm4NCi0JCSJwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLnRhcmdldDtcbiIvKm5vbk5MUyovICsNCi0JCSJcbiIvKm5vbk5MUyovICsNCi0JCSIvKlxuIi8qbm9uTkxTKi8gKw0KLQkJIiAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuXG4iLypub25OTFMqLyArDQotCQkiICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiIvKm5vbk5MUyovICsNCi0JCSIgKi9cbiIvKm5vbk5MUyovICsNCi0JCSIvKipcbiIvKm5vbk5MUyovICsNCi0JCSIgKiBUaGUgcm9vdCBvZiBhbGwgY29kZSBzbmlwcGV0IGNsYXNzZXMuIENvZGUgc25pcHBldCBjbGFzc2VzXG4iLypub25OTFMqLyArDQotCQkiICogYXJlIHN1cHBvc2VkIHRvIG92ZXJpZGUgdGhlIHJ1bigpIG1ldGhvZC5cbiIvKm5vbk5MUyovICsNCi0JCSIgKiA8cD5cbiIvKm5vbk5MUyovICsNCi0JCSIgKiBJTVBPUlRBTlQgTk9URTpcbiIvKm5vbk5MUyovICsNCi0JCSIgKiBBbGwgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG11c3QgYmUgcHVibGljIHNpbmNlIHRoaXMgY2xhc3MgaXMgZ29pbmcgdG8gYmUgbG9hZGVkIGJ5IHRoZVxuIi8qbm9uTkxTKi8gKw0KLQkJIiAqIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIsIGFuZCB0aGUgb3RoZXIgY29kZSBzbmlwcGV0IHN1cHBvcnQgY2xhc3NlcyBtaWdodCBiZSBsb2FkZWQgYnkgXG4iLypub25OTFMqLyArDQotCQkiICogYW5vdGhlciBjbGFzcyBsb2FkZXIgKHNvIHRoZWlyIHJ1bnRpbWUgcGFja2FnZXMgYXJlIGdvaW5nIHRvIGJlIGRpZmZlcmVudCkuXG4iLypub25OTFMqLyArDQotCQkiICovXG4iLypub25OTFMqLyArDQotCQkicHVibGljIGNsYXNzIENvZGVTbmlwcGV0IHtcbiIvKm5vbk5MUyovICsNCi0JCSIJcHJpdmF0ZSBDbGFzcyByZXN1bHRUeXBlID0gdm9pZC5jbGFzcztcbiIvKm5vbk5MUyovICsNCi0JCSIJcHJpdmF0ZSBPYmplY3QgcmVzdWx0VmFsdWUgPSBudWxsO1xuIi8qbm9uTkxTKi8gKw0KLQkJIi8qKlxuIi8qbm9uTkxTKi8gKw0KLQkJIiAqIFJldHVybnMgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBjb2RlIHNuaXBwZXQgZXZhbHVhdGlvbi5cbiIvKm5vbk5MUyovICsNCi0JCSIgKi9cbiIvKm5vbk5MUyovICsNCi0JCSJwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0VHlwZSgpIHtcbiIvKm5vbk5MUyovICsNCi0JCSIJcmV0dXJuIHRoaXMucmVzdWx0VHlwZTtcbiIvKm5vbk5MUyovICsNCi0JCSJ9XG4iLypub25OTFMqLyArDQotCQkiLyoqXG4iLypub25OTFMqLyArDQotCQkiICogUmV0dXJucyB0aGUgcmVzdWx0IHZhbHVlIG9mIHRoZSBjb2RlIHNuaXBwZXQgZXZhbHVhdGlvbi5cbiIvKm5vbk5MUyovICsNCi0JCSIgKi9cbiIvKm5vbk5MUyovICsNCi0JCSJwdWJsaWMgT2JqZWN0IGdldFJlc3VsdFZhbHVlKCkge1xuIi8qbm9uTkxTKi8gKw0KLQkJIglyZXR1cm4gdGhpcy5yZXN1bHRWYWx1ZTtcbiIvKm5vbk5MUyovICsNCi0JCSJ9XG4iLypub25OTFMqLyArDQotCQkiLyoqXG4iLypub25OTFMqLyArDQotCQkiICogVGhlIGNvZGUgc25pcHBldC4gU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggYSB0cmFuc2Zvcm1lZCBjb2RlIHNuaXBwZXRcbiIvKm5vbk5MUyovICsNCi0JCSIgKiB0aGF0IHN0b3JlcyB0aGUgcmVzdWx0IHVzaW5nIHNldFJlc3VsdChDbGFzcywgT2JqZWN0KS5cbiIvKm5vbk5MUyovICsNCi0JCSIgKi9cbiIvKm5vbk5MUyovICsNCi0JCSJwdWJsaWMgdm9pZCBydW4oKSB7XG4iLypub25OTFMqLyArDQotCQkifVxuIi8qbm9uTkxTKi8gKw0KLQkJIi8qKlxuIi8qbm9uTkxTKi8gKw0KLQkJIiAqIFN0b3JlcyB0aGUgcmVzdWx0IHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBjb2RlIHNuaXBwZXQgZXZhbHVhdGlvbi5cbiIvKm5vbk5MUyovICsNCi0JCSIgKi9cbiIvKm5vbk5MUyovICsNCi0JCSJwdWJsaWMgdm9pZCBzZXRSZXN1bHQoT2JqZWN0IHJlc3VsdFZhbHVlLCBDbGFzcyByZXN1bHRUeXBlKSB7XG4iLypub25OTFMqLyArDQotCQkiCXRoaXMucmVzdWx0VmFsdWUgPSByZXN1bHRWYWx1ZTtcbiIvKm5vbk5MUyovICsNCi0JCSIJdGhpcy5yZXN1bHRUeXBlID0gcmVzdWx0VHlwZTtcbiIvKm5vbk5MUyovICsNCi0JCSJ9XG4iLypub25OTFMqLyArDQotCQkifVxuIi8qbm9uTkxTKi87DQorCQkicGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQ7XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIvKlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkDQorCQkiLyoqXG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIiAqIFRoZSByb290IG9mIGFsbCBjb2RlIHNuaXBwZXQgY2xhc3Nlcy4gQ29kZSBzbmlwcGV0IGNsYXNzZXNcbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICogYXJlIHN1cHBvc2VkIHRvIG92ZXJpZGUgdGhlIHJ1bigpIG1ldGhvZC5cbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICogPHA+XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIiAqIElNUE9SVEFOVCBOT1RFOlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBBbGwgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG11c3QgYmUgcHVibGljIHNpbmNlIHRoaXMgY2xhc3MgaXMgZ29pbmcgdG8gYmUgbG9hZGVkIGJ5IHRoZVxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBib290c3RyYXAgY2xhc3MgbG9hZGVyLCBhbmQgdGhlIG90aGVyIGNvZGUgc25pcHBldCBzdXBwb3J0IGNsYXNzZXMgbWlnaHQgYmUgbG9hZGVkIGJ5IFxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBhbm90aGVyIGNsYXNzIGxvYWRlciAoc28gdGhlaXIgcnVudGltZSBwYWNrYWdlcyBhcmUgZ29pbmcgdG8gYmUgZGlmZmVyZW50KS5cbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICovXG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJInB1YmxpYyBjbGFzcyBDb2RlU25pcHBldCB7XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIglwcml2YXRlIENsYXNzIHJlc3VsdFR5cGUgPSB2b2lkLmNsYXNzO1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIJcHJpdmF0ZSBPYmplY3QgcmVzdWx0VmFsdWUgPSBudWxsO1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIvKipcbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICogUmV0dXJucyB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkDQorCQkicHVibGljIENsYXNzIGdldFJlc3VsdFR5cGUoKSB7XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIglyZXR1cm4gdGhpcy5yZXN1bHRUeXBlO1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSJ9XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIi8qKlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBSZXR1cm5zIHRoZSByZXN1bHQgdmFsdWUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkDQorCQkicHVibGljIE9iamVjdCBnZXRSZXN1bHRWYWx1ZSgpIHtcbiIgKyAvLyROT04tTkxTLTEkDQorCQkiCXJldHVybiB0aGlzLnJlc3VsdFZhbHVlO1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSJ9XG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJIi8qKlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiBUaGUgY29kZSBzbmlwcGV0LiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBhIHRyYW5zZm9ybWVkIGNvZGUgc25pcHBldFxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKiB0aGF0IHN0b3JlcyB0aGUgcmVzdWx0IHVzaW5nIHNldFJlc3VsdChDbGFzcywgT2JqZWN0KS5cbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICovXG4iICsgLy8kTk9OLU5MUy0xJA0KKwkJInB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAvLyROT04tTkxTLTEkDQorCQkifVxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIvKipcbiIgKyAvLyROT04tTkxTLTEkDQorCQkiICogU3RvcmVzIHRoZSByZXN1bHQgdHlwZSBhbmQgdmFsdWUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkDQorCQkicHVibGljIHZvaWQgc2V0UmVzdWx0KE9iamVjdCByZXN1bHRWYWx1ZSwgQ2xhc3MgcmVzdWx0VHlwZSkge1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIJdGhpcy5yZXN1bHRWYWx1ZSA9IHJlc3VsdFZhbHVlO1xuIiArIC8vJE5PTi1OTFMtMSQNCisJCSIJdGhpcy5yZXN1bHRUeXBlID0gcmVzdWx0VHlwZTtcbiIgKyAvLyROT04tTkxTLTEkDQorCQkifVxuIiArIC8vJE5PTi1OTFMtMSQNCisJCSJ9XG4iOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIGltcG9ydHMgb2YgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIEFuIGltcG9ydCBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UNCkBAIC00NDAsNyArNDQwLDcgQEAKIHByaXZhdGUgU3RyaW5nIGdldFN1cHBvcnRDbGFzc0ZpbGVOYW1lKFN0cmluZyBzaW1wbGVOYW1lKSB7DQogCWNoYXIgc2VwYXJhdG9yID0gRmlsZS5zZXBhcmF0b3JDaGFyOw0KIAljaGFyW11bXSBjb21wb3VuZFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgUEFDS0FHRV9OQU1FKTsNCi0JcmV0dXJuIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kUGFja2FnZU5hbWUsIHNlcGFyYXRvcikpICsgc2VwYXJhdG9yICsgc2ltcGxlTmFtZSArICIuY2xhc3MiLypub25OTFMqLzsNCisJcmV0dXJuIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kUGFja2FnZU5hbWUsIHNlcGFyYXRvcikpICsgc2VwYXJhdG9yICsgc2ltcGxlTmFtZSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIENyZWF0ZXMgYSBuZXcgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIHR5cGUgYW5kIGluaXRpYWxpemVyLg0KQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCUlTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLA0KIAlDb25maWd1cmFibGVPcHRpb25bXSBvcHRpb25zKSB7DQogCQkNCi0JZmluYWwgY2hhcltdIGNsYXNzTmFtZSA9ICJDb2RlU25pcHBldFNlbGVjdGlvbiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRTZWxlY3Rpb24iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJZmluYWwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IG5ldyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoDQogCQljb2RlU25pcHBldCwgDQogCQl0aGlzLnBhY2thZ2VOYW1lLCANCkBAIC01MDEsNyArNTAxLDcgQEAKIAkpOw0KIAlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsNCiAJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7DQotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGNsYXNzTmFtZSwgImphdmEiLypub25OTFMqLy50b0NoYXJBcnJheSgpLCAnLicpOw0KKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWUsICJqYXZhIi50b0NoYXJBcnJheSgpLCAnLicpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgew0KIAkJCXJldHVybiBtYXBwZXIuZ2V0Q1VTb3VyY2UoKTsNCmRpZmYgLS1naXQgYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YSBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCmluZGV4IGUwZjdlZTMuLjFkMGUzOTMgMTAwNjQ0Ci0tLSBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCisrKyBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCkBAIC0xODcsMzcgKzE4NywzNyBAQAogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogCXN3aXRjaCAodGhpcy5ldmFsdWF0aW9uVHlwZSkgew0KIAkJY2FzZSBUX0NPREVfU05JUFBFVDoNCi0JCQlidWZmZXIuYXBwZW5kKCJDb2RlIHNuaXBwZXQiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiQ29kZSBzbmlwcGV0Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVF9JTVBPUlQ6DQotCQkJYnVmZmVyLmFwcGVuZCgiSW1wb3J0Ii8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkltcG9ydCIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRfSU5URVJOQUw6DQotCQkJYnVmZmVyLmFwcGVuZCgiSW50ZXJuYWwgcHJvYmxlbSIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJJbnRlcm5hbCBwcm9ibGVtIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVF9QQUNLQUdFOg0KLQkJCWJ1ZmZlci5hcHBlbmQoIlBhY2thZ2UiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiUGFja2FnZSIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRfVkFSSUFCTEU6DQotCQkJYnVmZmVyLmFwcGVuZCgiR2xvYmFsIHZhcmlhYmxlIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkdsb2JhbCB2YXJpYWJsZSIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCi0JYnVmZmVyLmFwcGVuZCgiOiAiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZCh0aGlzLmV2YWx1YXRpb25JRCk7DQotCWJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCWlmIChoYXNQcm9ibGVtcygpKSB7DQotCQlidWZmZXIuYXBwZW5kKCJQcm9ibGVtczpcbiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIlByb2JsZW1zOlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtcy5sZW5ndGg7IGkrKykgew0KIAkJCWJ1ZmZlci5hcHBlbmQodGhpcy5wcm9ibGVtc1tpXS50b1N0cmluZygpKTsNCiAJCX0NCiAJfSBlbHNlIHsNCiAJCWlmIChoYXNWYWx1ZSgpKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiKCIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZU5hbWUpOw0KLQkJCWJ1ZmZlci5hcHBlbmQoIikgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKHRoaXMuZGlzcGxheVN0cmluZyk7DQogCQl9IGVsc2Ugew0KLQkJCWJ1ZmZlci5hcHBlbmQoIihObyBleHBsaWNpdCByZXR1cm4gdmFsdWUpIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIihObyBleHBsaWNpdCByZXR1cm4gdmFsdWUpIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQpkaWZmIC0tZ2l0IGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0b3IuamF2YSBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdG9yLmphdmEKaW5kZXggZjgzOGE2OS4uZmNiOGUwZiAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0b3IuamF2YQorKysgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAKIAljb21waWxlci5jb21waWxlKG5ldyBJQ29tcGlsYXRpb25Vbml0W10ge25ldyBJQ29tcGlsYXRpb25Vbml0KCkgew0KIAkJcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsNCiAJCQkgLy8gTmFtZSBvZiBjbGFzcyBpcyBuYW1lIG9mIENVDQotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KEV2YWx1YXRvci50aGlzLmdldENsYXNzTmFtZSgpLCAiLmphdmEiLypub25OTFMqLy50b0NoYXJBcnJheSgpKTsNCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoRXZhbHVhdG9yLnRoaXMuZ2V0Q2xhc3NOYW1lKCksICIuamF2YSIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7DQogCQkJcmV0dXJuIHNvdXJjZTsNCmRpZmYgLS1naXQgYS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0dsb2JhbFZhcmlhYmxlLmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0dsb2JhbFZhcmlhYmxlLmphdmEKaW5kZXggOGI5OTRmYS4uMjcyZGJiZCAxMDA2NDQKLS0tIGEvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9HbG9iYWxWYXJpYWJsZS5qYXZhCisrKyBiL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvR2xvYmFsVmFyaWFibGUuamF2YQpAQCAtNTIsMTMgKzUyLDEzIEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KIAlidWZmZXIuYXBwZW5kKHRoaXMudHlwZU5hbWUpOw0KLQlidWZmZXIuYXBwZW5kKCIgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZCh0aGlzLm5hbWUpOw0KIAlpZiAodGhpcy5pbml0aWFsaXplciAhPSBudWxsKSB7DQotCQlidWZmZXIuYXBwZW5kKCI9ICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIj0gIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQodGhpcy5pbml0aWFsaXplcik7DQogCX0NCi0JYnVmZmVyLmFwcGVuZCgiOyIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiOyIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzRXZhbHVhdG9yLmphdmEgYi9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhCmluZGV4IDJlMzE3MzEuLjBkM2M1ODIgMTAwNjQ0Ci0tLSBhL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzRXZhbHVhdG9yLmphdmEKKysrIGIvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9WYXJpYWJsZXNFdmFsdWF0b3IuamF2YQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJLy8gcGFja2FnZSBkZWNsYXJhdGlvbg0KIAljaGFyW10gcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOw0KIAlpZiAocGFja2FnZU5hbWUubGVuZ3RoICE9IDApIHsNCi0JCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgicGFja2FnZSAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmZmVyLmFwcGVuZChwYWNrYWdlTmFtZSk7DQogCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KIAkJbGluZU51bWJlck9mZnNldCsrOw0KQEAgLTE4NSwyMCArMTg1LDIwIEBACiAJLy8gaW1wb3J0IGRlY2xhcmF0aW9ucw0KIAljaGFyW11bXSBpbXBvcnRzID0gdGhpcy5jb250ZXh0LmltcG9ydHM7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgew0KLQkJYnVmZmVyLmFwcGVuZCgiaW1wb3J0ICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImltcG9ydCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmZmVyLmFwcGVuZChpbXBvcnRzW2ldKTsNCiAJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQogCQlsaW5lTnVtYmVyT2Zmc2V0Kys7DQogCX0NCiANCiAJLy8gY2xhc3MgZGVjbGFyYXRpb24NCi0JYnVmZmVyLmFwcGVuZCgicHVibGljIGNsYXNzICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgicHVibGljIGNsYXNzICIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3NOYW1lKCkpOw0KLQlidWZmZXIuYXBwZW5kKCIgZXh0ZW5kcyAiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoUEFDS0FHRV9OQU1FKTsNCi0JYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoUk9PVF9DTEFTU19OQU1FKTsNCi0JYnVmZmVyLmFwcGVuZCgiIHsiLypub25OTFMqLykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KKwlidWZmZXIuYXBwZW5kKCIgeyIpLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJA0KIAlsaW5lTnVtYmVyT2Zmc2V0Kys7DQogCXN0YXJ0UG9zT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCgpOw0KIA0KQEAgLTIwNywxMCArMjA3LDEwIEBACiAJVmFyaWFibGVzSW5mbyBpbnN0YWxsZWRWYXJzID0gdGhpcy5jb250ZXh0Lmluc3RhbGxlZFZhcnM7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb250ZXh0LnZhcmlhYmxlQ291bnQ7IGkrKyl7DQogCQlHbG9iYWxWYXJpYWJsZSB2YXIgPSB2YXJzW2ldOw0KLQkJYnVmZmVyLmFwcGVuZCgiXHRwdWJsaWMgc3RhdGljICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIlx0cHVibGljIHN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJdmFyLmRlY2xhcmF0aW9uU3RhcnQgPSBidWZmZXIubGVuZ3RoKCk7DQogCQlidWZmZXIuYXBwZW5kKHZhci50eXBlTmFtZSk7DQotCQlidWZmZXIuYXBwZW5kKCIgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkDQogCQljaGFyW10gdmFyTmFtZSA9IHZhci5uYW1lOw0KIAkJYnVmZmVyLmFwcGVuZCh2YXJOYW1lKTsNCiAJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQpAQCAtMjE4LDcgKzIxOCw3IEBACiAJfQ0KIA0KIAkvLyBmaWVsZCBpbml0aWFsaXphdGlvbnMNCi0JYnVmZmVyLmFwcGVuZCgiXHRzdGF0aWMgeyIvKm5vbk5MUyovKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQorCWJ1ZmZlci5hcHBlbmQoIlx0c3RhdGljIHsiKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQNCiAJbGluZU51bWJlck9mZnNldCsrOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY29udGV4dC52YXJpYWJsZUNvdW50OyBpKyspew0KIAkJR2xvYmFsVmFyaWFibGUgdmFyID0gdmFyc1tpXTsNCkBAIC0yMjgsNDAgKzIyOCw0MCBAQAogCQkJLy8gSW5pdGlhbGl6ZSB3aXRoIGluaXRpYWxpemVyIGlmIHRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZQ0KIAkJCWNoYXJbXSBpbml0aWFsaXplciA9IHZhci5pbml0aWFsaXplcjsNCiAJCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdFx0dHJ5IHsiLypub25OTFMqLykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KKwkJCQlidWZmZXIuYXBwZW5kKCJcdFx0dHJ5IHsiKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJbGluZU51bWJlck9mZnNldCsrOw0KIAkJCQl2YXIuaW5pdGlhbGl6ZXJMaW5lU3RhcnQgPSBsaW5lTnVtYmVyT2Zmc2V0Ow0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdFx0XHQiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIlx0XHRcdCIpOyAvLyROT04tTkxTLTEkDQogCQkJCXZhci5pbml0aWFsaXplclN0YXJ0ID0gYnVmZmVyLmxlbmd0aCgpOw0KIAkJCQlidWZmZXIuYXBwZW5kKHZhck5hbWUpOw0KLQkJCQlidWZmZXIuYXBwZW5kKCI9ICIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgiPSAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl2YXIuaW5pdEV4cHJlc3Npb25TdGFydCA9IGJ1ZmZlci5sZW5ndGgoKTsNCiAJCQkJYnVmZmVyLmFwcGVuZChpbml0aWFsaXplcik7DQogCQkJCWxpbmVOdW1iZXJPZmZzZXQgKz0gbnVtYmVyT2ZDUnMoaW5pdGlhbGl6ZXIpOw0KIAkJCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdFx0fSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsiLypub25OTFMqLykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdFx0XHRlLnByaW50U3RhY2tUcmFjZSgpOyIvKm5vbk5MUyovKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0XHR9Ii8qbm9uTkxTKi8pLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgiXHRcdH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7IikuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkDQorCQkJCWJ1ZmZlci5hcHBlbmQoIlx0XHRcdGUucHJpbnRTdGFja1RyYWNlKCk7IikuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkDQorCQkJCWJ1ZmZlci5hcHBlbmQoIlx0XHR9IikuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkDQogCQkJCWxpbmVOdW1iZXJPZmZzZXQgKz0gNDsgLy8gNCBDUnMNCiAJCQl9DQogCQl9IGVsc2Ugew0KIAkJCS8vIEluaXRpYWxpemUgd2l0aCBwcmV2aW91cyB2YWx1ZSBpZiBuYW1lIGFuZCB0eXBlIGFyZSB0aGUgc2FtZQ0KLQkJCWJ1ZmZlci5hcHBlbmQoIlx0XHQiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiXHRcdCIpOyAvLyROT04tTkxTLTEkDQogCQkJYnVmZmVyLmFwcGVuZCh2YXJOYW1lKTsNCi0JCQlidWZmZXIuYXBwZW5kKCI9ICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCI9ICIpOyAvLyROT04tTkxTLTEkDQogCQkJY2hhcltdIGluc3RhbGxlZFBhY2thZ2VOYW1lID0gaW5zdGFsbGVkVmFycy5wYWNrYWdlTmFtZTsNCiAJCQlpZiAoaW5zdGFsbGVkUGFja2FnZU5hbWUgIT0gbnVsbCAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZS5sZW5ndGggIT0gMCkgew0KIAkJCQlidWZmZXIuYXBwZW5kKGluc3RhbGxlZFBhY2thZ2VOYW1lKTsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiLiIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCWJ1ZmZlci5hcHBlbmQoaW5zdGFsbGVkVmFycy5jbGFzc05hbWUpOw0KLQkJCWJ1ZmZlci5hcHBlbmQoIi4iLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkDQogCQkJYnVmZmVyLmFwcGVuZCh2YXJOYW1lKTsNCiAJCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KIAkJCWxpbmVOdW1iZXJPZmZzZXQrKzsNCiAJCX0NCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCJcdH0iLypub25OTFMqLykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KKwlidWZmZXIuYXBwZW5kKCJcdH0iKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQNCiAJDQogCS8vIGVuZCBvZiBjbGFzcyBkZWNsYXJhdGlvbg0KIAlidWZmZXIuYXBwZW5kKCd9JykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KZGlmZiAtLWdpdCBhL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YSBiL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YQppbmRleCA4YzVkYWM1Li44YTYzOGE3IDEwMDY0NAotLS0gYS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyLmphdmEKKysrIGIvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlci5qYXZhCkBAIC0xLDE0ICsxLDE4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7DQogDQogLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorICogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNLA0KKyAqIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoDQorICogKGMpIENvcHlyaWdodCBJQk0gQ29ycCAyMDAwDQogICovDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuaW1wbC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxTeW1ib2xzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29uZmlndXJhYmxlT3B0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmltcGwuRm9ybWF0dGVyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5pbXBsLlNwbGl0TGluZTsNCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCiAvKiogPGgyPkhvdyB0byBmb3JtYXQgYSBwaWVjZSBvZiBjb2RlID88L2gyPg0KICAqIDx1bD48bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPkNvZGVGb3JtYXR0ZXI8L2NvZGU+DQogICogPGxpPlVzZSB0aGUgbWV0aG9kIDxjb2RlPnZvaWQgZm9ybWF0KGFTdHJpbmcpPC9jb2RlPg0KQEAgLTE4LDExMiArMjIsMTEyIEBACiANCiBwdWJsaWMgY2xhc3MgQ29kZUZvcm1hdHRlciBpbXBsZW1lbnRzIFRlcm1pbmFsU3ltYm9scyB7DQogDQotCXB1YmxpYyBGb3JtYXR0ZXJPcHRpb25zIG9wdGlvbnM7DQorIHB1YmxpYyBGb3JtYXR0ZXJPcHRpb25zIG9wdGlvbnM7DQogDQotCS8qKiANCi0JICogUmVwcmVzZW50cyBhIGJsb2NrIGluIHRoZSA8Y29kZT5jb25zdHJ1Y3Rpb25zPC9jb2RlPiBzdGFjay4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMT0NLID0gVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRTsNCi0JLyoqIA0KLQkgKiBSZXByZXNlbnRzIGEgYmxvY2sgZm9sbG93aW5nIGEgY29udHJvbCBzdGF0ZW1lbnQgaW4gdGhlIDxjb2RlPmNvbnN0cnVjdGlvbnM8L2NvZGU+IHN0YWNrLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OSU5ERU5UX0JMT0NLID0gLTEwMDsNCi0JLyoqIA0KLQkgKiBDb250YWlucyB0aGUgZm9ybWF0dGVkIG91dHB1dC4NCi0JICovDQotCVN0cmluZ0J1ZmZlciBmb3JtYXR0ZWRTb3VyY2U7DQotCS8qKiANCi0JICogQ29udGFpbnMgdGhlIGN1cnJlbnQgbGluZS48YnI+DQotCSAqIFdpbGwgYmUgZHVtcGVkIGF0IHRoZSBuZXh0ICJuZXdsaW5lIg0KLQkgKi8NCi0JU3RyaW5nQnVmZmVyIGN1cnJlbnRMaW5lQnVmZmVyOw0KKyAvKiogDQorICAqIFJlcHJlc2VudHMgYSBibG9jayBpbiB0aGUgPGNvZGU+Y29uc3RydWN0aW9uczwvY29kZT4gc3RhY2suDQorICAqLw0KKyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSyA9IFRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0U7DQorIC8qKiANCisgICogUmVwcmVzZW50cyBhIGJsb2NrIGZvbGxvd2luZyBhIGNvbnRyb2wgc3RhdGVtZW50IGluIHRoZSA8Y29kZT5jb25zdHJ1Y3Rpb25zPC9jb2RlPiBzdGFjay4NCisgICovDQorIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTklOREVOVF9CTE9DSyA9IC0xMDA7DQorIC8qKiANCisgICogQ29udGFpbnMgdGhlIGZvcm1hdHRlZCBvdXRwdXQuDQorICAqLw0KKyBTdHJpbmdCdWZmZXIgZm9ybWF0dGVkU291cmNlOw0KKyAvKiogDQorICAqIENvbnRhaW5zIHRoZSBjdXJyZW50IGxpbmUuPGJyPg0KKyAgKiBXaWxsIGJlIGR1bXBlZCBhdCB0aGUgbmV4dCAibmV3bGluZSINCisgICovDQorIFN0cmluZ0J1ZmZlciBjdXJyZW50TGluZUJ1ZmZlcjsNCiANCi0JLyoqIA0KLQkgKiBVc2VkIGR1cmluZyB0aGUgZm9ybWF0dGluZyB0byBnZXQgZWFjaCB0b2tlbi4NCi0JICovDQotCVNjYW5uZXIgc2Nhbm5lcjsNCisgLyoqIA0KKyAgKiBVc2VkIGR1cmluZyB0aGUgZm9ybWF0dGluZyB0byBnZXQgZWFjaCB0b2tlbi4NCisgICovDQorIFNjYW5uZXIgc2Nhbm5lcjsNCiANCi0JLyoqIA0KLQkgKiBDb250YWlucyB0aGUgdG9rZW5zIHJlc3BvbnNpYmxlIGZvciB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbA0KLQkgKiBhbmQgdGhlIGJsb2NrcyBub3QgY2xvc2VkIHlldC4NCi0JICovDQotCXByaXZhdGUgaW50W10gY29uc3RydWN0aW9uczsNCi0JLyoqIA0KLQkgKiBJbmRleCBpbiB0aGUgPGNvZGU+Y29uc3RydWN0aW9uczwvY29kZT4gYXJyYXkuDQotCSAqLw0KLQlwcml2YXRlIGludCBjb25zdHJ1Y3Rpb25zQ291bnQ7DQotCS8qKiANCi0JICogTGV2ZWwgb2YgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG51bWJlciBvZiB0YWIgY2hhciBwdXQgaW4gZnJvbnQgb2YgaXQpLg0KLQkgKi8NCi0JcHJpdmF0ZSBpbnQgaW5kZW50YXRpb25MZXZlbDsNCisgLyoqIA0KKyAgKiBDb250YWlucyB0aGUgdG9rZW5zIHJlc3BvbnNpYmxlIGZvciB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbA0KKyAgKiBhbmQgdGhlIGJsb2NrcyBub3QgY2xvc2VkIHlldC4NCisgICovDQorIHByaXZhdGUgaW50W10gY29uc3RydWN0aW9uczsNCisgLyoqIA0KKyAgKiBJbmRleCBpbiB0aGUgPGNvZGU+Y29uc3RydWN0aW9uczwvY29kZT4gYXJyYXkuDQorICAqLw0KKyBwcml2YXRlIGludCBjb25zdHJ1Y3Rpb25zQ291bnQ7DQorIC8qKiANCisgICogTGV2ZWwgb2YgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG51bWJlciBvZiB0YWIgY2hhciBwdXQgaW4gZnJvbnQgb2YgaXQpLg0KKyAgKi8NCisgcHJpdmF0ZSBpbnQgaW5kZW50YXRpb25MZXZlbDsNCiANCi0JLyoqIA0KLQkgKiBSZWd1bGFyIGxldmVsIG9mIGluZGVudGF0aW9uIG9mIGFsbCB0aGUgbGluZXMNCi0JICovDQotCXByaXZhdGUgaW50IGluaXRpYWxJbmRlbnRhdGlvbkxldmVsOw0KKyAvKiogDQorICAqIFJlZ3VsYXIgbGV2ZWwgb2YgaW5kZW50YXRpb24gb2YgYWxsIHRoZSBsaW5lcw0KKyAgKi8NCisgcHJpdmF0ZSBpbnQgaW5pdGlhbEluZGVudGF0aW9uTGV2ZWw7DQogDQotCS8qKiANCi0JICogVXNlZCB0byBzcGxpdCBhIGxpbmUuDQotCSAqLw0KLQlTY2FubmVyIHNwbGl0U2Nhbm5lcjsNCi0JLyoqIA0KLQkgKiBUbyByZW1lbWJlciB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBhbmQgdGhlDQotCSAqIGJlZ2lubmluZyBvZiB0aGUgY29tbWVudC4NCi0JICovDQotCWludCBjdXJyZW50Q29tbWVudE9mZnNldDsNCi0JaW50IGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbDsNCi0JaW50IG1heExpbmVTaXplID0gMzA7DQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc09wZW5DbG9zZUJyYWNlczsNCi0JcHJpdmF0ZSBpbnQgaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlczsNCisgLyoqIA0KKyAgKiBVc2VkIHRvIHNwbGl0IGEgbGluZS4NCisgICovDQorIFNjYW5uZXIgc3BsaXRTY2FubmVyOw0KKyAvKiogDQorICAqIFRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGFuZCB0aGUNCisgICogYmVnaW5uaW5nIG9mIHRoZSBjb21tZW50Lg0KKyAgKi8NCisgaW50IGN1cnJlbnRDb21tZW50T2Zmc2V0Ow0KKyBpbnQgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsOw0KKyBpbnQgbWF4TGluZVNpemUgPSAzMDsNCisgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzOw0KKyBwcml2YXRlIGludCBpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzOw0KIA0KLQkvKioNCi0JICogQ29sbGVjdGlvbnMgb2YgcG9zaXRpb25zIHRvIG1hcA0KLQkgKi8NCi0JcHJpdmF0ZSBpbnRbXSBwb3NpdGlvbnNUb01hcDsNCi0JDQotCS8qKg0KLQkgKiBDb2xsZWN0aW9ucyBvZiBtYXBwZWQgcG9zaXRpb25zDQotCSAqLw0KLQlwcml2YXRlIGludFtdIG1hcHBlZFBvc2l0aW9uczsNCisgLyoqDQorICAqIENvbGxlY3Rpb25zIG9mIHBvc2l0aW9ucyB0byBtYXANCisgICovDQorIHByaXZhdGUgaW50W10gcG9zaXRpb25zVG9NYXA7DQorIA0KKyAvKioNCisgICogQ29sbGVjdGlvbnMgb2YgbWFwcGVkIHBvc2l0aW9ucw0KKyAgKi8NCisgcHJpdmF0ZSBpbnRbXSBtYXBwZWRQb3NpdGlvbnM7DQogDQotCXByaXZhdGUgaW50IGluZGV4VG9NYXA7DQorIHByaXZhdGUgaW50IGluZGV4VG9NYXA7DQogDQotCXByaXZhdGUgaW50IGluZGV4SW5NYXA7DQotCQ0KLQlwcml2YXRlIGludCBnbG9iYWxEZWx0YTsNCisgcHJpdmF0ZSBpbnQgaW5kZXhJbk1hcDsNCisgDQorIHByaXZhdGUgaW50IGdsb2JhbERlbHRhOw0KIA0KLQlwcml2YXRlIGludCBsaW5lRGVsdGE7DQorIHByaXZhdGUgaW50IGxpbmVEZWx0YTsNCiANCi0JcHJpdmF0ZSBpbnQgc3BsaXREZWx0YTsNCisgcHJpdmF0ZSBpbnQgc3BsaXREZWx0YTsNCiANCi0JcHJpdmF0ZSBpbnQgYmVnaW5uaW5nT2ZMaW5lSW5kZXg7DQorIHByaXZhdGUgaW50IGJlZ2lubmluZ09mTGluZUluZGV4Ow0KIC8qKiANCiAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIENvZGUgRm9ybWF0dGVyIHVzaW5nIHRoZSBGb3JtYXR0aW5nT3B0aW9ucyBvYmplY3QNCiAgKiBnaXZlbiBhcyBhcmd1bWVudA0KICAqIEBkZXByZWNhdGVkIFVzZSBDb2RlRm9ybWF0dGVyKENvbmZpZ3VyYWJsZU9wdGlvbltdKSBpbnN0ZWFkDQogICovDQogcHVibGljIENvZGVGb3JtYXR0ZXIoKSB7DQotCXRoaXMobnVsbCk7DQorIHRoaXMobnVsbCk7DQogfQ0KIC8qKiANCiAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIENvZGUgRm9ybWF0dGVyIHVzaW5nIHRoZSBnaXZlbiBzZXR0aW5ncy4NCiAgKi8NCiBwdWJsaWMgQ29kZUZvcm1hdHRlcihDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncykgew0KIA0KLQkvLyBpbml0aWFsaXplIGludGVybmFsIHN0YXRlDQotCWNvbnN0cnVjdGlvbnNDb3VudCA9IDA7DQotCWNvbnN0cnVjdGlvbnMgPSBuZXcgaW50WzEwXTsNCi0JY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCA9IGluaXRpYWxJbmRlbnRhdGlvbkxldmVsOw0KLQljdXJyZW50Q29tbWVudE9mZnNldCA9IC0xOw0KLQkNCi0JLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgc2Nhbm5lcnMNCi0Jc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsdHJ1ZSk7CQkvLyByZWd1bGFyIHNjYW5uZXIgZm9yIGZvcm1pbmcgbGluZXMNCi0Jc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsJCS8vIHRvIHJlbWluZCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4NCi0Jc3BsaXRTY2FubmVyID0gbmV3IFNjYW5uZXIodHJ1ZSx0cnVlKTsJLy8gc2Vjb25kYXJ5IHNjYW5uZXIgdG8gc3BsaXQgbG9uZyBsaW5lcyBmb3JtZWQgYnkgcHJpbWFyeSBzY2FubmluZw0KKyAvLyBpbml0aWFsaXplIGludGVybmFsIHN0YXRlDQorIGNvbnN0cnVjdGlvbnNDb3VudCA9IDA7DQorIGNvbnN0cnVjdGlvbnMgPSBuZXcgaW50WzEwXTsNCisgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCA9IGluaXRpYWxJbmRlbnRhdGlvbkxldmVsOw0KKyBjdXJyZW50Q29tbWVudE9mZnNldCA9IC0xOw0KKyANCisgLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgc2Nhbm5lcnMNCisgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsdHJ1ZSk7ICAvLyByZWd1bGFyIHNjYW5uZXIgZm9yIGZvcm1pbmcgbGluZXMNCisgc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsgIC8vIHRvIHJlbWluZCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4NCisgc3BsaXRTY2FubmVyID0gbmV3IFNjYW5uZXIodHJ1ZSx0cnVlKTsgLy8gc2Vjb25kYXJ5IHNjYW5uZXIgdG8gc3BsaXQgbG9uZyBsaW5lcyBmb3JtZWQgYnkgcHJpbWFyeSBzY2FubmluZw0KIA0KLQkvLyBpbml0aWFsaXplIGN1cnJlbnQgbGluZSBidWZmZXINCi0JY3VycmVudExpbmVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCXRoaXMub3B0aW9ucyA9IG5ldyBGb3JtYXR0ZXJPcHRpb25zKHNldHRpbmdzKTsNCisgLy8gaW5pdGlhbGl6ZSBjdXJyZW50IGxpbmUgYnVmZmVyDQorIGN1cnJlbnRMaW5lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyB0aGlzLm9wdGlvbnMgPSBuZXcgRm9ybWF0dGVyT3B0aW9ucyhzZXR0aW5ncyk7DQogfQ0KIC8qKiANCiAgKiBTZXRzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZvcm1hdHRlciBhYm91dCB0aGUgYnJhY2VzIHVzaW5nIHRoZSBnaXZlbiBmbGFnLjxicj4NCkBAIC0xMzYsNzU0ICsxNDAsNzYxIEBACiANCiAgLyoqICAqLw0KIHB1YmxpYyB2b2lkIGFkZE5ld0xpbmVPbk9wZW5pbmdCcmFjZShib29sZWFuIGZsYWcpIHsNCi0Jb3B0aW9ucy5zZXROZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZShmbGFnKTsNCisgb3B0aW9ucy5zZXROZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZShmbGFnKTsNCiB9DQogLyoqDQogICogUmV0dXJucyB0cnVlIGlmIGEgbGluZVNlcGFyYXRvciBoYXMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIDxjb2RlPm9wZXJhdG9yPC9jb2RlPg0KICAqIGZhbHNlIG90aGVyd2lzZS4NCiAgKi8NCiBwcml2YXRlIHN0YXRpYyBib29sZWFuIGJyZWFrTGluZUJlZm9yZU9wZXJhdG9yKGludCBvcGVyYXRvcikgew0KLQlzd2l0Y2ggKG9wZXJhdG9yKSB7DQotCQljYXNlIFRva2VuTmFtZUNPTU1BIDoNCi0JCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoNCi0JCWNhc2UgVG9rZW5OYW1lRVFVQUwgOg0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWRlZmF1bHQgOg0KLQkJCXJldHVybiB0cnVlOw0KLQl9DQorIHN3aXRjaCAob3BlcmF0b3IpIHsNCisgIGNhc2UgVG9rZW5OYW1lQ09NTUEgOg0KKyAgY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOg0KKyAgY2FzZSBUb2tlbk5hbWVFUVVBTCA6DQorICAgcmV0dXJuIGZhbHNlOw0KKyAgZGVmYXVsdCA6DQorICAgcmV0dXJuIHRydWU7DQorIH0NCiB9DQogLyoqIA0KICAqIFJldHVybnMgdGhlIGVuZCBvZiB0aGUgc291cmNlIGNvZGUuDQogICovDQogcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29weVJlbWFpbmluZ1NvdXJjZSgpIHsNCi0JY2hhciBzdHJbXSA9IHNjYW5uZXIuc291cmNlOw0KLQlpbnQgc3RhcnRQb3NpdGlvbiA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCi0JaW50IGxlbmd0aCA9IHN0ci5sZW5ndGggLSBzdGFydFBvc2l0aW9uOw0KLQlTdHJpbmdCdWZmZXIgYnVmciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsNCi0JaWYgKHN0YXJ0UG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7DQotCQlidWZyLmFwcGVuZChzdHIsIHN0YXJ0UG9zaXRpb24sIGxlbmd0aCk7DQotCX0NCi0JcmV0dXJuIChidWZyLnRvU3RyaW5nKCkpOw0KKyBjaGFyIHN0cltdID0gc2Nhbm5lci5zb3VyY2U7DQorIGludCBzdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KKyBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCAtIHN0YXJ0UG9zaXRpb247DQorIFN0cmluZ0J1ZmZlciBidWZyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOw0KKyBpZiAoc3RhcnRQb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHsNCisgIGJ1ZnIuYXBwZW5kKHN0ciwgc3RhcnRQb3NpdGlvbiwgbGVuZ3RoKTsNCisgfQ0KKyByZXR1cm4gKGJ1ZnIudG9TdHJpbmcoKSk7DQogfQ0KIC8qKg0KICAqIEluc2VydHMgPGNvZGU+dGFiQ291bnQ8L2NvZGU+IHRhYiBjaGFyYWN0ZXIgb3IgdGhlaXIgZXF1aXZhbGVudCBudW1iZXIgb2Ygc3BhY2VzLg0KICAqLw0KIHByaXZhdGUgdm9pZCBkdW1wVGFiKGludCB0YWJDb3VudCkgew0KLQlpZiAob3B0aW9ucy5pbmRlbnRXaXRoVGFiKSB7DQotCQlmb3IgKGludCBqID0gMDsgaiA8IHRhYkNvdW50OyBqKyspIHsNCi0JCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCdcdCcpOw0KLQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBvcHRpb25zLnRhYlNpemUgKiB0YWJDb3VudDsgaSA8IG1heDsgaSsrKSB7DQotCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KLQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsNCi0JCX0NCi0JfQ0KKyBpZiAob3B0aW9ucy5pbmRlbnRXaXRoVGFiKSB7DQorICBmb3IgKGludCBqID0gMDsgaiA8IHRhYkNvdW50OyBqKyspIHsNCisgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCdcdCcpOw0KKyAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgIH0NCisgfSBlbHNlIHsNCisgIGZvciAoaW50IGkgPSAwLCBtYXggPSBvcHRpb25zLnRhYlNpemUgKiB0YWJDb3VudDsgaSA8IG1heDsgaSsrKSB7DQorICAgZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KKyAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgIH0NCisgfQ0KIH0NCiAvKioNCiAgKiBEdW1wcyA8Y29kZT5jdXJyZW50TGluZUJ1ZmZlcjwvY29kZT4gaW50byB0aGUgZm9ybWF0dGVkIHN0cmluZy4NCiAgKi8NCiBwcml2YXRlIHZvaWQgZmx1c2hCdWZmZXIoKSB7DQotCVN0cmluZyBjdXJyZW50U3RyaW5nID0gY3VycmVudExpbmVCdWZmZXIudG9TdHJpbmcoKTsNCi0Jc3BsaXREZWx0YSA9IDA7DQotCWJlZ2lubmluZ09mTGluZUluZGV4ID0gZm9ybWF0dGVkU291cmNlLmxlbmd0aCgpOwkNCi0JaWYgKG9wdGlvbnMubWF4TGluZUxlbmd0aCE9MCl7DQotCQlpZiAoY29udGFpbnNPcGVuQ2xvc2VCcmFjZXMpIHsNCi0JCQljb250YWluc09wZW5DbG9zZUJyYWNlcyA9IGZhbHNlOw0KLQkJCW91dHB1dExpbmUoY3VycmVudFN0cmluZywNCi0JCQkJZmFsc2UsDQotCQkJCWluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMsDQotCQkJCTAsDQotCQkJCS0xLA0KLQkJCQludWxsLA0KLQkJCQkwKTsNCi0JCQkJaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlcyA9IGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbDsNCi0JCX0gZWxzZSB7DQotCQkJb3V0cHV0TGluZShjdXJyZW50U3RyaW5nLA0KLQkJCQlmYWxzZSwNCi0JCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsLA0KLQkJCQkwLA0KLQkJCQktMSwNCi0JCQkJbnVsbCwNCi0JCQkJMCk7DQotCQl9CQkNCi0JfSBlbHNlIHsNCi0JCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoY3VycmVudFN0cmluZyk7DQotCX0NCisgU3RyaW5nIGN1cnJlbnRTdHJpbmcgPSBjdXJyZW50TGluZUJ1ZmZlci50b1N0cmluZygpOw0KKyBzcGxpdERlbHRhID0gMDsNCisgYmVnaW5uaW5nT2ZMaW5lSW5kZXggPSBmb3JtYXR0ZWRTb3VyY2UubGVuZ3RoKCk7IA0KKyBpZiAob3B0aW9ucy5tYXhMaW5lTGVuZ3RoIT0wKXsNCisgIGlmIChjb250YWluc09wZW5DbG9zZUJyYWNlcykgew0KKyAgIGNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzID0gZmFsc2U7DQorICAgb3V0cHV0TGluZShjdXJyZW50U3RyaW5nLA0KKyAgICBmYWxzZSwNCisgICAgaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlcywNCisgICAgMCwNCisgICAgLTEsDQorICAgIG51bGwsDQorICAgIDApOw0KKyAgICBpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzID0gY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsOw0KKyAgfSBlbHNlIHsNCisgICBvdXRwdXRMaW5lKGN1cnJlbnRTdHJpbmcsDQorICAgIGZhbHNlLA0KKyAgICBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwsDQorICAgIDAsDQorICAgIC0xLA0KKyAgICBudWxsLA0KKyAgICAwKTsNCisgIH0gIA0KKyB9IGVsc2Ugew0KKyAgZm9ybWF0dGVkU291cmNlLmFwcGVuZChjdXJyZW50U3RyaW5nKTsNCisgfQ0KIH0NCiAvKiogDQogICogRm9ybWF0cyB0aGUgaW5wdXQgc3RyaW5nLg0KICAqLw0KIHByaXZhdGUgdm9pZCBmb3JtYXQoKSB7DQotCWludCB0b2tlbiA9IDA7DQotCWludCBwcmV2aW91c1Rva2VuID0gMDsNCi0JaW50IHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID0gMDsNCisgaW50IHRva2VuID0gMDsNCisgaW50IHByZXZpb3VzVG9rZW4gPSAwOw0KKyBpbnQgcHJldmlvdXNDb21waWxhYmxlVG9rZW4gPSAwOw0KIA0KLQlpbnQgaW5kZW50YXRpb25PZmZzZXQgPSAwOw0KKyBpbnQgaW5kZW50YXRpb25PZmZzZXQgPSAwOw0KIA0KLQlpbnQgbmV3TGluZXNJbldoaXRlc3BhY2UgPSAwOw0KLQkvLyBudW1iZXIgb2YgbmV3IGxpbmVzIGluIHRoZSBwcmV2aW91cyB3aGl0ZXNwYWNlIHRva2VuDQotCS8vICh1c2VkIHRvIGxlYXZlIGJsYW5rIGxpbmVzIGJlZm9yZSBjb21tZW50cykNCi0JaW50IHBlbmRpbmdOZXdMaW5lcyA9IDA7DQotCWJvb2xlYW4gZXhwZWN0aW5nT3BlbkJyYWNlID0gZmFsc2U7DQotCWJvb2xlYW4gY2xlYXJOb25CbG9ja0luZGVudHMgPSBmYWxzZTsNCi0JLy8gdHJ1ZSBpZiBhbGwgaW5kZW50YXRpb25zIHRpbGwgdGhlIDFzdCB7ICh1c2VmdWxsIGFmdGVyIH0gb3IgOykNCi0JYm9vbGVhbiBwZW5kaW5nU3BhY2UgPSB0cnVlOw0KLQlib29sZWFuIHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IGZhbHNlOw0KLQkvLyB0cnVlIHdoZW4gYSBjciBpcyB0byBiZSBwdXQgYWZ0ZXIgYSApIChpbiBjb25kaXRpb25hbCBzdGF0ZW1lbnRzKQ0KLQlib29sZWFuIGluQXNzaWdubWVudCA9IGZhbHNlOw0KLQlib29sZWFuIGluQXJyYXlBc3NpZ25tZW50ID0gZmFsc2U7DQotCWJvb2xlYW4gaW5UaHJvd3NDbGF1c2UgPSBmYWxzZTsNCi0JYm9vbGVhbiBpbkNsYXNzT3JJbnRlcmZhY2VIZWFkZXIgPSBmYWxzZTsNCisgaW50IG5ld0xpbmVzSW5XaGl0ZXNwYWNlID0gMDsNCisgLy8gbnVtYmVyIG9mIG5ldyBsaW5lcyBpbiB0aGUgcHJldmlvdXMgd2hpdGVzcGFjZSB0b2tlbg0KKyAvLyAodXNlZCB0byBsZWF2ZSBibGFuayBsaW5lcyBiZWZvcmUgY29tbWVudHMpDQorIGludCBwZW5kaW5nTmV3TGluZXMgPSAwOw0KKyBib29sZWFuIGV4cGVjdGluZ09wZW5CcmFjZSA9IGZhbHNlOw0KKyBib29sZWFuIGNsZWFyTm9uQmxvY2tJbmRlbnRzID0gZmFsc2U7DQorIC8vIHRydWUgaWYgYWxsIGluZGVudGF0aW9ucyB0aWxsIHRoZSAxc3QgeyAodXNlZnVsbCBhZnRlciB9IG9yIDspDQorIGJvb2xlYW4gcGVuZGluZ1NwYWNlID0gdHJ1ZTsNCisgYm9vbGVhbiBwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSBmYWxzZTsNCisgLy8gdHJ1ZSB3aGVuIGEgY3IgaXMgdG8gYmUgcHV0IGFmdGVyIGEgKSAoaW4gY29uZGl0aW9uYWwgc3RhdGVtZW50cykNCisgYm9vbGVhbiBpbkFzc2lnbm1lbnQgPSBmYWxzZTsNCisgYm9vbGVhbiBpbkFycmF5QXNzaWdubWVudCA9IGZhbHNlOw0KKyBib29sZWFuIGluVGhyb3dzQ2xhdXNlID0gZmFsc2U7DQorIGJvb2xlYW4gaW5DbGFzc09ySW50ZXJmYWNlSGVhZGVyID0gZmFsc2U7DQogDQotCS8vIG9wZW5CcmFja2V0Q291bnQgaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gYnJhY2tldHMgbm90IGNsb3NlZCB5ZXQuDQotCWludCBvcGVuQnJhY2tldENvdW50ID0gMDsNCi0JDQotCWludCB1bmFyeVNpZ25Nb2RpZmllciA9IDA7DQorIC8vIG9wZW5CcmFja2V0Q291bnQgaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gYnJhY2tldHMgbm90IGNsb3NlZCB5ZXQuDQorIGludCBvcGVuQnJhY2tldENvdW50ID0gMDsNCisgDQorICBpbnQgdW5hcnlTaWduTW9kaWZpZXIgPSAwOw0KIA0KLQkvLyBvcGVuUGFyZW50aGVzaXNbMF0gaXMgdXNlZCB0byBjb3VudCB0aGUgcGFyZW50aGVzaXMgbm90IGJlbG9uZ2luZyB0byBhIGNvbmRpdGlvbg0KLQkvLyAoZWcgZm9vKCk7KS4gcGFyZW50aGVzaXMgaW4gZm9yICguLi4pIGFyZSBjb3VudCBlbHNld2hlcmUgaW4gdGhlIGFycmF5Lg0KLQlpbnQgb3BlblBhcmVudGhlc2lzQ291bnQgPSAxOw0KLQlpbnRbXSBvcGVuUGFyZW50aGVzaXMgPSBuZXcgaW50WzEwXTsNCisgLy8gb3BlblBhcmVudGhlc2lzWzBdIGlzIHVzZWQgdG8gY291bnQgdGhlIHBhcmVudGhlc2lzIG5vdCBiZWxvbmdpbmcgdG8gYSBjb25kaXRpb24NCisgLy8gKGVnIGZvbygpOykuIHBhcmVudGhlc2lzIGluIGZvciAoLi4uKSBhcmUgY291bnQgZWxzZXdoZXJlIGluIHRoZSBhcnJheS4NCisgaW50IG9wZW5QYXJlbnRoZXNpc0NvdW50ID0gMTsNCisgaW50W10gb3BlblBhcmVudGhlc2lzID0gbmV3IGludFsxMF07DQogDQotCS8vIHRva2VuQmVmb3JlQ29sb24gaXMgdXNlZCB0byBrbm93IHdoYXQgdG9rZW4gZ29lcyBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IDoNCi0JLy8gaXQgY2FuIGJlIGNhc2Ugb3IgPw0KLQlpbnQgdG9rZW5CZWZvcmVDb2xvbkNvdW50ID0gMDsNCi0JaW50W10gdG9rZW5CZWZvcmVDb2xvbiA9IG5ldyBpbnRbMTBdOw0KKyAvLyB0b2tlbkJlZm9yZUNvbG9uIGlzIHVzZWQgdG8ga25vdyB3aGF0IHRva2VuIGdvZXMgYWxvbmcgd2l0aCB0aGUgY3VycmVudCA6DQorIC8vIGl0IGNhbiBiZSBjYXNlIG9yID8NCisgaW50IHRva2VuQmVmb3JlQ29sb25Db3VudCA9IDA7DQorIGludFtdIHRva2VuQmVmb3JlQ29sb24gPSBuZXcgaW50WzEwXTsNCiANCi0JY29uc3RydWN0aW9uc0NvdW50ID0gMDsgLy8gaW5pdGlhbGl6ZXMgdGhlIGNvbnN0cnVjdGlvbnMgY291bnQuDQorIGNvbnN0cnVjdGlvbnNDb3VudCA9IDA7IC8vIGluaXRpYWxpemVzIHRoZSBjb25zdHJ1Y3Rpb25zIGNvdW50Lg0KIA0KLQkvLyBjb250YWlucyBETyBpZiBpbiBhIERPLi5XSElMRSBzdGF0ZW1lbnQsIFVOSVRJQUxJWkVEIG90aGVyd2lzZS4NCi0JaW50IG5saWNzVG9rZW4gPSAwOw0KKyAvLyBjb250YWlucyBETyBpZiBpbiBhIERPLi5XSElMRSBzdGF0ZW1lbnQsIFVOSVRJQUxJWkVEIG90aGVyd2lzZS4NCisgaW50IG5saWNzVG9rZW4gPSAwOw0KIA0KLQkvLyBmaXggZm9yIDFGRjE3WFk6IExGQ09NOkFMTCAtIEZvcm1hdCBwcm9ibGVtIG9uIG5vdCBtYXRjaGluZyB9IGFuZCBlbHNlIA0KLQlib29sZWFuIHNwZWNpYWxFbHNlID0gZmFsc2U7DQorIC8vIGZpeCBmb3IgMUZGMTdYWTogTEZDT006QUxMIC0gRm9ybWF0IHByb2JsZW0gb24gbm90IG1hdGNoaW5nIH0gYW5kIGVsc2UgDQorIGJvb2xlYW4gc3BlY2lhbEVsc2UgPSBmYWxzZTsNCiANCi0JLy8gT1BUSU9OIChJbmRlbnRhdGlvbkxldmVsKTogaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbCBtYXkgYmUgbm9uLXplcm8uDQotCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCArPSBjb25zdHJ1Y3Rpb25zQ291bnQ7DQorIC8vIE9QVElPTiAoSW5kZW50YXRpb25MZXZlbCk6IGluaXRpYWwgaW5kZW50YXRpb24gbGV2ZWwgbWF5IGJlIG5vbi16ZXJvLg0KKyBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgKz0gY29uc3RydWN0aW9uc0NvdW50Ow0KIA0KLQkNCi0JLy8gQW4gSW52YWxpZElucHV0RXhjZXB0aW9uIGV4Y2VwdGlvbiBtaWdodCBjYXVzZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBsb29wLg0KLQl0cnkgew0KLQkJd2hpbGUgKHRydWUpIHsNCi0JCQkvLyBHZXQgdGhlIG5leHQgdG9rZW4uICBDYXRjaCBpbnZhbGlkIGlucHV0IGFuZCBvdXRwdXQgaXQNCi0JCQkvLyB3aXRoIG1pbmltYWwgZm9ybWF0dGluZywgYWxzbyBjYXRjaCBlbmQgb2YgaW5wdXQgYW5kDQotCQkJLy8gZXhpdCB0aGUgbG9vcC4NCi0JCQl0cnkgew0KLQkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7DQotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCi0JCQkJaWYgKCFoYW5kbGVJbnZhbGlkVG9rZW4oZSkpIHsNCi0JCQkJCXRocm93IGU7DQotCQkJCX0NCi0JCQkJdG9rZW4gPSAwOw0KLQkJCX0NCi0JCQlpZiAodG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpDQotCQkJCWJyZWFrOw0KKyANCisgLy8gQW4gSW52YWxpZElucHV0RXhjZXB0aW9uIGV4Y2VwdGlvbiBtaWdodCBjYXVzZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBsb29wLg0KKyB0cnkgew0KKyAgd2hpbGUgKHRydWUpIHsNCisgICAvLyBHZXQgdGhlIG5leHQgdG9rZW4uICBDYXRjaCBpbnZhbGlkIGlucHV0IGFuZCBvdXRwdXQgaXQNCisgICAvLyB3aXRoIG1pbmltYWwgZm9ybWF0dGluZywgYWxzbyBjYXRjaCBlbmQgb2YgaW5wdXQgYW5kDQorICAgLy8gZXhpdCB0aGUgbG9vcC4NCisgICB0cnkgew0KKyAgICB0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7DQorICAgfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCisgICAgaWYgKCFoYW5kbGVJbnZhbGlkVG9rZW4oZSkpIHsNCisgICAgIHRocm93IGU7DQorICAgIH0NCisgICAgdG9rZW4gPSAwOw0KKyAgIH0NCisgICBpZiAodG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpDQorICAgIGJyZWFrOw0KIA0KLQkJCS8qICMjIE1PRElGWUlORyB0aGUgaW5kZW50YXRpb24gbGV2ZWwgYmVmb3JlIGdlbmVyYXRpbmcgbmV3IGxpbmVzDQotCQkJYW5kIGluZGVudGF0aW9uIGluIHRoZSBvdXRwdXQgc3RyaW5nDQotCQkJKi8NCisgICAvKiAjIyBNT0RJRllJTkcgdGhlIGluZGVudGF0aW9uIGxldmVsIGJlZm9yZSBnZW5lcmF0aW5nIG5ldyBsaW5lcw0KKyAgIGFuZCBpbmRlbnRhdGlvbiBpbiB0aGUgb3V0cHV0IHN0cmluZw0KKyAgICovDQogDQotCQkJLy8gUmVtb3ZlcyBhbGwgdGhlIGluZGVudGF0aW9ucyBtYWRlIGJ5IHN0YXRlbWVudHMgbm90IGZvbGxvd2VkIGJ5IGEgYmxvY2sNCi0JCQkvLyBleGNlcHQgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgRUxTRSwgQ0FUQ0ggb3IgaWYgd2UgYXJlIGluIGEgc3dpdGNoL2Nhc2UNCisgICAvLyBSZW1vdmVzIGFsbCB0aGUgaW5kZW50YXRpb25zIG1hZGUgYnkgc3RhdGVtZW50cyBub3QgZm9sbG93ZWQgYnkgYSBibG9jaw0KKyAgIC8vIGV4Y2VwdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBFTFNFLCBDQVRDSCBvciBpZiB3ZSBhcmUgaW4gYSBzd2l0Y2gvY2FzZQ0KIA0KLQkJCWlmIChjbGVhck5vbkJsb2NrSW5kZW50cyAmJiAodG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSkgew0KKyAgIGlmIChjbGVhck5vbkJsb2NrSW5kZW50cyAmJiAodG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSkgew0KIA0KLQkJCQlzd2l0Y2ggKHRva2VuKSB7DQotCQkJCQljYXNlIFRva2VuTmFtZWVsc2UgOg0KLQkJCQkJCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPiAwICYmIGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTFdID09IFRva2VuTmFtZWVsc2Upew0KLQkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOw0KLQkJCQkJCQlzcGVjaWFsRWxzZSA9IHRydWU7DQotCQkJCQkJfQ0KLQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWwoVG9rZW5OYW1laWYpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJY2FzZSBUb2tlbk5hbWVjYXRjaCA6DQotCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3BJbmNsdXNpdmVVbnRpbChUb2tlbk5hbWVjYXRjaCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQljYXNlIFRva2VuTmFtZWZpbmFsbHkgOg0KLQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWwoVG9rZW5OYW1lY2F0Y2gpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJY2FzZSBUb2tlbk5hbWV3aGlsZSA6DQotCQkJCQkJaWYgKG5saWNzVG9rZW4gPT0gVG9rZW5OYW1lZG8pIHsNCi0JCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3AoVG9rZW5OYW1lZG8pOw0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQlkZWZhdWx0IDoNCi0JCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcEV4Y2x1c2l2ZVVudGlsQmxvY2tPckNhc2UoKTsNCi0JCQkJCQkvLyBjbGVhciB1bnRpbCBhIENBU0UsIERFRkFVTFQgb3IgQkxPQ0sgaXMgZW5jb3VudGVyZWQuDQotCQkJCQkJLy8gVGh1cywgdGhlIGluZGVudGF0aW9uTGV2ZWwgaXMgY29ycmVjdGx5IGNsZWFyZWQgZWl0aGVyDQotCQkJCQkJLy8gaW4gYSBzd2l0Y2gvY2FzZSBzdGF0ZW1lbnQgb3IgaW4gYW55IG90aGVyIHNpdHVhdGlvbi4NCi0JCQkJfQ0KLQkJCQljbGVhck5vbkJsb2NrSW5kZW50cyA9IGZhbHNlOw0KLQkJCX0NCisgICAgc3dpdGNoICh0b2tlbikgew0KKyAgICAgY2FzZSBUb2tlbk5hbWVlbHNlIDoNCisgICAgICBpZiAoY29uc3RydWN0aW9uc0NvdW50ID4gMCAmJiBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXSA9PSBUb2tlbk5hbWVlbHNlKXsNCisgICAgICAgcGVuZGluZ05ld0xpbmVzID0gMTsNCisgICAgICAgc3BlY2lhbEVsc2UgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbmRlbnRhdGlvbkxldmVsICs9IHBvcEluY2x1c2l2ZVVudGlsKFRva2VuTmFtZWlmKTsNCisgICAgICBicmVhazsNCisgICAgIGNhc2UgVG9rZW5OYW1lY2F0Y2ggOg0KKyAgICAgIGluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWwoVG9rZW5OYW1lY2F0Y2gpOw0KKyAgICAgIGJyZWFrOw0KKyAgICAgY2FzZSBUb2tlbk5hbWVmaW5hbGx5IDoNCisgICAgICBpbmRlbnRhdGlvbkxldmVsICs9IHBvcEluY2x1c2l2ZVVudGlsKFRva2VuTmFtZWNhdGNoKTsNCisgICAgICBicmVhazsNCisgICAgIGNhc2UgVG9rZW5OYW1ld2hpbGUgOg0KKyAgICAgIGlmIChubGljc1Rva2VuID09IFRva2VuTmFtZWRvKSB7DQorICAgICAgIGluZGVudGF0aW9uTGV2ZWwgKz0gcG9wKFRva2VuTmFtZWRvKTsNCisgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgZGVmYXVsdCA6DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwb3BFeGNsdXNpdmVVbnRpbEJsb2NrT3JDYXNlKCk7DQorICAgICAgLy8gY2xlYXIgdW50aWwgYSBDQVNFLCBERUZBVUxUIG9yIEJMT0NLIGlzIGVuY291bnRlcmVkLg0KKyAgICAgIC8vIFRodXMsIHRoZSBpbmRlbnRhdGlvbkxldmVsIGlzIGNvcnJlY3RseSBjbGVhcmVkIGVpdGhlcg0KKyAgICAgIC8vIGluIGEgc3dpdGNoL2Nhc2Ugc3RhdGVtZW50IG9yIGluIGFueSBvdGhlciBzaXR1YXRpb24uDQorICAgIH0NCisgICAgY2xlYXJOb25CbG9ja0luZGVudHMgPSBmYWxzZTsNCisgICB9DQogDQotCQkJLy8gcmV0dXJucyB0byB0aGUgaW5kZW50YXRpb24gbGV2ZWwgY3JlYXRlZCBieSB0aGUgU1dJVENIIGtleXdvcmQNCi0JCQkvLyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIENBU0Ugb3IgYSBERUZBVUxUDQorICAgLy8gcmV0dXJucyB0byB0aGUgaW5kZW50YXRpb24gbGV2ZWwgY3JlYXRlZCBieSB0aGUgU1dJVENIIGtleXdvcmQNCisgICAvLyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIENBU0Ugb3IgYSBERUZBVUxUDQogDQotCQkJaWYgKHRva2VuID09IFRva2VuTmFtZWNhc2UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lZGVmYXVsdCkgew0KLQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcChUb2tlbk5hbWVjYXNlKTsNCi0JCQl9DQorICAgaWYgKHRva2VuID09IFRva2VuTmFtZWNhc2UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lZGVmYXVsdCkgew0KKyAgICBpbmRlbnRhdGlvbkxldmVsICs9IHBvcChUb2tlbk5hbWVjYXNlKTsNCisgICB9DQogDQotCQkJaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1ldGhyb3dzKSB7DQotCQkJCWluVGhyb3dzQ2xhdXNlID0gdHJ1ZTsNCi0JCQl9DQorICAgaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1ldGhyb3dzKSB7DQorICAgIGluVGhyb3dzQ2xhdXNlID0gdHJ1ZTsNCisgICB9DQogDQotCQkJaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lY2xhc3MgfHwgdG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVpbnRlcmZhY2UpIHsNCi0JCQkJaW5DbGFzc09ySW50ZXJmYWNlSGVhZGVyID0gdHJ1ZTsNCi0JCQl9DQotCQkJLyogIyMgQVBQRU5EIG5ld2xpbmVzIGFuZCBpbmRlbnRhdGlvbnMgdG8gdGhlIG91dHB1dCBzdHJpbmcNCi0JCQkqLw0KKyAgIGlmICh0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZWNsYXNzIHx8IHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1laW50ZXJmYWNlKSB7DQorICAgIGluQ2xhc3NPckludGVyZmFjZUhlYWRlciA9IHRydWU7DQorICAgfQ0KKyAgIC8qICMjIEFQUEVORCBuZXdsaW5lcyBhbmQgaW5kZW50YXRpb25zIHRvIHRoZSBvdXRwdXQgc3RyaW5nDQorICAgKi8NCiANCi0JCQkvLyBEbyBub3QgYWRkIGEgbmV3IGxpbmUgYmV0d2VlbiBFTFNFIGFuZCBJRiwgaWYgdGhlIG9wdGlvbiBlbHNlSWZPblNhbWVMaW5lIGlzIHRydWUuDQotCQkJLy8gRml4IGZvciAxRVRMV1BaOiBJVkpDT006QUxMIC0gaW5jb3JyZWN0ICJlbHNlIGlmIiBmb3JtYXR0aW5nDQotCQkJaWYgKHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiAmJiBwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVlbHNlICYmIHRva2VuID09IFRva2VuTmFtZWlmICYmIG9wdGlvbnMuY29tcGFjdEVsc2VJZk1vZGUpew0KLQkJCQlwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSBmYWxzZTsNCi0JCQkJcGVuZGluZ05ld0xpbmVzID0gMDsNCi0JCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3AoVG9rZW5OYW1lZWxzZSk7DQotCQkJCS8vIGJlY2F1c2UgZWxzZSBpZiBpcyBub3cgb25lIHNpbmdsZSBzdGF0ZW1lbnQsDQotCQkJCS8vIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBhZnRlciBpdCBpcyBpbmNyZWFzZWQgYnkgb25lIGFuZCBub3QgYnkgMg0KLQkJCQkvLyAoZWxzZSA9IDEgaW5kZW50LCBpZiA9IDEgaW5kZW50LCBidXQgZWxzZSBpZiA9IDEgaW5kZW50LCBub3QgMikuDQotCQkJfQ0KLQkJCQ0KLQkJCS8vIEFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgdG8gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugc3RyaW5nIGlmDQotCQkJLy8gYSBmb3IvaWYtZWxzZS93aGlsZSBzdGF0ZW1lbnQgd2FzIHNjYW5uZWQgYW5kIHRoZXJlIGlzIG5vIGJsb2NrDQotCQkJLy8gZm9sbG93aW5nIGl0Lg0KLQkJCQ0KLQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiB8fCAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lUlBBUkVOICYmIHRva2VuID09IFRva2VuTmFtZUxCUkFDRSk7DQotCQkJaWYgKHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiAmJiB0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UpIHsNCi0JCQkJcGVuZGluZ05ld2xpbmVBZnRlclBhcmVuID0gZmFsc2U7DQorICAgLy8gRG8gbm90IGFkZCBhIG5ldyBsaW5lIGJldHdlZW4gRUxTRSBhbmQgSUYsIGlmIHRoZSBvcHRpb24gZWxzZUlmT25TYW1lTGluZSBpcyB0cnVlLg0KKyAgIC8vIEZpeCBmb3IgMUVUTFdQWjogSVZKQ09NOkFMTCAtIGluY29ycmVjdCAiZWxzZSBpZiIgZm9ybWF0dGluZw0KKyAgIGlmIChwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gJiYgcHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lZWxzZSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVpZiAmJiBvcHRpb25zLmNvbXBhY3RFbHNlSWZNb2RlKXsNCisgICAgcGVuZGluZ05ld2xpbmVBZnRlclBhcmVuID0gZmFsc2U7DQorICAgIHBlbmRpbmdOZXdMaW5lcyA9IDA7DQorICAgIGluZGVudGF0aW9uTGV2ZWwgKz0gcG9wKFRva2VuTmFtZWVsc2UpOw0KKyAgICAvLyBiZWNhdXNlIGVsc2UgaWYgaXMgbm93IG9uZSBzaW5nbGUgc3RhdGVtZW50LA0KKyAgICAvLyB0aGUgaW5kZW50YXRpb24gbGV2ZWwgYWZ0ZXIgaXQgaXMgaW5jcmVhc2VkIGJ5IG9uZSBhbmQgbm90IGJ5IDINCisgICAgLy8gKGVsc2UgPSAxIGluZGVudCwgaWYgPSAxIGluZGVudCwgYnV0IGVsc2UgaWYgPSAxIGluZGVudCwgbm90IDIpLg0KKyAgIH0NCisgICANCisgICAvLyBBZGQgYSBuZXdsaW5lICYgaW5kZW50IHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZyBpZg0KKyAgIC8vIGEgZm9yL2lmLWVsc2Uvd2hpbGUgc3RhdGVtZW50IHdhcyBzY2FubmVkIGFuZCB0aGVyZSBpcyBubyBibG9jaw0KKyAgIC8vIGZvbGxvd2luZyBpdC4NCisgICANCisgICBwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSBwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTiAmJiB0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpOw0KKyAgIGlmIChwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gJiYgdG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7DQorICAgIHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IGZhbHNlOw0KIA0KLQkJCQkvLyBEbyB0byBhZGQgYSBuZXdsaW5lICYgaW5kZW50IHNlcXVlbmNlIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGFuDQotCQkJCS8vIG9wZW4gYnJhY2Ugb3IgYSBwZXJpb2Qgb3IgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBzZW1pLWNvbG9uIGFuZCB0aGUNCi0JCQkJLy8gcHJldmlvdXMgdG9rZW4gaXMgYSBjbG9zZSBwYXJlbi4NCi0JCQkJLy8gYWRkIGEgbmV3IGxpbmUgaWYgYSBwYXJlbnRoZXNpcyBiZWxvbmdpbmcgdG8gYSBmb3IoKSBzdGF0ZW1lbnQNCi0JCQkJLy8gaGFzIGJlZW4gY2xvc2VkIGFuZCB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgYW4gb3BlbmluZyBicmFjZQ0KKyAgICAvLyBEbyB0byBhZGQgYSBuZXdsaW5lICYgaW5kZW50IHNlcXVlbmNlIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGFuDQorICAgIC8vIG9wZW4gYnJhY2Ugb3IgYSBwZXJpb2Qgb3IgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBzZW1pLWNvbG9uIGFuZCB0aGUNCisgICAgLy8gcHJldmlvdXMgdG9rZW4gaXMgYSBjbG9zZSBwYXJlbi4NCisgICAgLy8gYWRkIGEgbmV3IGxpbmUgaWYgYSBwYXJlbnRoZXNpcyBiZWxvbmdpbmcgdG8gYSBmb3IoKSBzdGF0ZW1lbnQNCisgICAgLy8gaGFzIGJlZW4gY2xvc2VkIGFuZCB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgYW4gb3BlbmluZyBicmFjZQ0KIA0KLQkJCQlpZiAodG9rZW4gIT0gVG9rZW5OYW1lTEJSQUNFICYmICFpc0NvbW1lbnQodG9rZW4pDQotCQkJCS8vIHRvIGF2b2lkIGFkZGluZyBuZXcgbGluZSBiZXR3ZWVuIGVsc2UgYW5kIGEgY29tbWVudA0KLQkJCQkJCSYmIHRva2VuICE9IFRva2VuTmFtZURPVA0KLQkJCQkJCSYmICEgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTg0KLQkJCQkJCQkmJiB0b2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pKSB7DQotCQkJCQluZXdMaW5lKDEpOw0KLQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsICs9IGluZGVudGF0aW9uTGV2ZWw7DQotCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAwOw0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlpZiAodG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFICYmIG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUpIHsNCi0JCQkJCQluZXdMaW5lKDEpOw0KLQkJCQkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7DQotCQkJCQkJcGVuZGluZ05ld0xpbmVzID0gMDsNCi0JCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCisgICAgaWYgKHRva2VuICE9IFRva2VuTmFtZUxCUkFDRSAmJiAhaXNDb21tZW50KHRva2VuKQ0KKyAgICAvLyB0byBhdm9pZCBhZGRpbmcgbmV3IGxpbmUgYmV0d2VlbiBlbHNlIGFuZCBhIGNvbW1lbnQNCisgICAgICAmJiB0b2tlbiAhPSBUb2tlbk5hbWVET1QNCisgICAgICAmJiAhIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSUEFSRU4NCisgICAgICAgJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKSkgew0KKyAgICAgbmV3TGluZSgxKTsNCisgICAgIGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7DQorICAgICBwZW5kaW5nTmV3TGluZXMgPSAwOw0KKyAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgIH0gZWxzZSB7DQorICAgICBpZiAodG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFICYmIG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUpIHsNCisgICAgICBuZXdMaW5lKDEpOw0KKyAgICAgIGlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPiAwDQorICAgICAgICYmIGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gIT0gQkxPQ0sNCisgICAgICAgJiYgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSAhPSBOT05JTkRFTlRfQkxPQ0spIHsNCisgICAgICAgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCAtIDE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbDsNCisgICAgICB9DQorICAgICAgcGVuZGluZ05ld0xpbmVzID0gMDsNCisgICAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCisgICAgIH0NCisgICAgfQ0KKyAgIH0NCiANCi0JCQkvLyBzZWUgUFIgMUc1RzhFQw0KLQkJCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgaW5UaHJvd3NDbGF1c2UpIHsNCi0JCQkJaW5UaHJvd3NDbGF1c2UgPSBmYWxzZTsgICAgICANCi0JCQkJaWYgKG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUpIHsNCi0JCQkJCW5ld0xpbmUoMSk7DQotCQkJCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsOw0KLQkJCQkJcGVuZGluZ05ld0xpbmVzID0gMDsNCi0JCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIHNlZSBQUiAxRzVHODJHDQotCQkJaWYgKHRva2VuID09IFRva2VuTmFtZUxCUkFDRSAmJiBpbkNsYXNzT3JJbnRlcmZhY2VIZWFkZXIpIHsNCi0JCQkJaW5DbGFzc09ySW50ZXJmYWNlSGVhZGVyID0gZmFsc2U7DQotCQkJCWlmIChvcHRpb25zLm5ld0xpbmVCZWZvcmVPcGVuaW5nQnJhY2VNb2RlKSB7DQotCQkJCQluZXdMaW5lKDEpOw0KLQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbDsNCi0JCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDA7DQotCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0gICAgICAgICAgICANCi0JCQkvLyBBZGQgcGVuZGluZyBuZXcgbGluZXMgdG8gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugc3RyaW5nLg0KLQkJCS8vIE5vdGU6IHBlbmRpbmcgbmV3IGxpbmVzIGFyZSBub3QgYWRkZWQgaWYgdGhlIGN1cnJlbnQgdG9rZW4NCi0JCQkvLyBpcyBhIHNpbmdsZSBsaW5lIGNvbW1lbnQgb3Igd2hpdGVzcGFjZS4NCi0JCQkvLyBpZiB0aGUgY29tbWVudCBpcyBiZXR3ZWVuIHBhcmVudGhlc2lzLCB0aGVyZSBpcyBubyBibGFuayBsaW5lIHByZXNlcnZhdGlvbg0KLQkJCS8vIChpZiBpdCdzIGEgb25lLWxpbmUgY29tbWVudCwgYSBibGFuayBsaW5lIGlzIGFkZGVkIGFmdGVyIGl0KS4NCisgICBpZiAodG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFDQorICAgICYmIG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUNCisgICAgJiYgY29uc3RydWN0aW9uc0NvdW50ID4gMA0KKyAgICAmJiBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IFRva2VuTmFtZWRvKSB7DQorICAgIG5ld0xpbmUoMSk7DQorICAgIGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgLSAxOw0KKyAgICBwZW5kaW5nTmV3TGluZXMgPSAwOw0KKyAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCisgICB9DQogDQotCQkJaWYgKCgocGVuZGluZ05ld0xpbmVzID4gMCAmJiAoIWlzQ29tbWVudCh0b2tlbikpKQ0KLQkJCQkJfHwgKG5ld0xpbmVzSW5XaGl0ZXNwYWNlID4gMA0KLQkJCQkJCQkmJiAob3BlblBhcmVudGhlc2lzQ291bnQgPD0gMSAmJiBpc0NvbW1lbnQodG9rZW4pKSkNCi0JCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkNCi0JCQkJJiYgdG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7DQorICAgLy8gc2VlIFBSIDFHNUc4RUMNCisgICBpZiAodG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFICYmIGluVGhyb3dzQ2xhdXNlKSB7DQorICAgIGluVGhyb3dzQ2xhdXNlID0gZmFsc2U7ICAgICAgDQorICAgIGlmIChvcHRpb25zLm5ld0xpbmVCZWZvcmVPcGVuaW5nQnJhY2VNb2RlKSB7DQorICAgICBuZXdMaW5lKDEpOw0KKyAgICAgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbDsNCisgICAgIHBlbmRpbmdOZXdMaW5lcyA9IDA7DQorICAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCisgICAgfQ0KKyAgIH0NCisgICANCisgICAvLyBzZWUgUFIgMUc1RzgyRw0KKyAgIGlmICh0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgaW5DbGFzc09ySW50ZXJmYWNlSGVhZGVyKSB7DQorICAgIGluQ2xhc3NPckludGVyZmFjZUhlYWRlciA9IGZhbHNlOw0KKyAgICBpZiAob3B0aW9ucy5uZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZSkgew0KKyAgICAgbmV3TGluZSgxKTsNCisgICAgIGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7DQorICAgICBwZW5kaW5nTmV3TGluZXMgPSAwOw0KKyAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgIH0NCisgICB9ICAgICAgICAgICAgDQorICAgLy8gQWRkIHBlbmRpbmcgbmV3IGxpbmVzIHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZy4NCisgICAvLyBOb3RlOiBwZW5kaW5nIG5ldyBsaW5lcyBhcmUgbm90IGFkZGVkIGlmIHRoZSBjdXJyZW50IHRva2VuDQorICAgLy8gaXMgYSBzaW5nbGUgbGluZSBjb21tZW50IG9yIHdoaXRlc3BhY2UuDQorICAgLy8gaWYgdGhlIGNvbW1lbnQgaXMgYmV0d2VlbiBwYXJlbnRoZXNpcywgdGhlcmUgaXMgbm8gYmxhbmsgbGluZSBwcmVzZXJ2YXRpb24NCisgICAvLyAoaWYgaXQncyBhIG9uZS1saW5lIGNvbW1lbnQsIGEgYmxhbmsgbGluZSBpcyBhZGRlZCBhZnRlciBpdCkuDQogDQotCQkJCS8vIERvIG5vdCBhZGQgbmV3bGluZSAmIGluZGVudCBiZXR3ZWVuIGFuIGFkam9pbmluZyBjbG9zZSBicmFjZSBhbmQNCi0JCQkJLy8gY2xvc2UgcGFyZW4uICBBbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBtYXkgdXNlIHRoaXMgZm9ybS4NCisgICBpZiAoKChwZW5kaW5nTmV3TGluZXMgPiAwICYmICghaXNDb21tZW50KHRva2VuKSkpDQorICAgICB8fCAobmV3TGluZXNJbldoaXRlc3BhY2UgPiAwDQorICAgICAgICYmIChvcGVuUGFyZW50aGVzaXNDb3VudCA8PSAxICYmIGlzQ29tbWVudCh0b2tlbikpKQ0KKyAgICAgfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZUxCUkFDRSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UpKQ0KKyAgICAmJiB0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UpIHsNCiANCi0JCQkJYm9vbGVhbiBjbG9zZUJyYWNlQW5kQ2xvc2VQYXJlbiA9IA0KLQkJCQkJCXByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZVJQQVJFTjsgDQorICAgIC8vIERvIG5vdCBhZGQgbmV3bGluZSAmIGluZGVudCBiZXR3ZWVuIGFuIGFkam9pbmluZyBjbG9zZSBicmFjZSBhbmQNCisgICAgLy8gY2xvc2UgcGFyZW4uICBBbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBtYXkgdXNlIHRoaXMgZm9ybS4NCiANCi0JCQkJLy8gT1BUSU9OIChOZXdMaW5lSW5Db21wb3VuZFN0YXRlbWVudCk6IGRvIG5vdCBhZGQgbmV3bGluZSAmIGluZGVudA0KLQkJCQkvLyBiZXR3ZWVuIGNsb3NlIGJyYWNlIGFuZCBlbHNlLCAoZG8pIHdoaWxlLCBjYXRjaCwgYW5kIGZpbmFsbHkgaWYNCi0JCQkJLy8gbmV3bGluZUluQ29tcG91bmRTdGF0ZW1lbnQgaXMgdHJ1ZS4NCisgICAgYm9vbGVhbiBjbG9zZUJyYWNlQW5kQ2xvc2VQYXJlbiA9IA0KKyAgICAgIHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZVJQQVJFTjsgDQogDQotCQkJCWJvb2xlYW4gbmxpY3NPcHRpb24gPSANCi0JCQkJCQlwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZVJCUkFDRQ0KLQkJCQkJCQkmJiAhb3B0aW9ucy5uZXdsaW5lSW5Db250cm9sU3RhdGVtZW50TW9kZQ0KLQkJCQkJCQkmJiAodG9rZW4gPT0gVG9rZW5OYW1lZWxzZQ0KLQkJCQkJCQkJfHwgKHRva2VuID09IFRva2VuTmFtZXdoaWxlICYmIG5saWNzVG9rZW4gPT0gVG9rZW5OYW1lZG8pDQotCQkJCQkJCQl8fCB0b2tlbiA9PSBUb2tlbk5hbWVjYXRjaA0KLQkJCQkJCQkJfHwgdG9rZW4gPT0gVG9rZW5OYW1lZmluYWxseSk7DQorICAgIC8vIE9QVElPTiAoTmV3TGluZUluQ29tcG91bmRTdGF0ZW1lbnQpOiBkbyBub3QgYWRkIG5ld2xpbmUgJiBpbmRlbnQNCisgICAgLy8gYmV0d2VlbiBjbG9zZSBicmFjZSBhbmQgZWxzZSwgKGRvKSB3aGlsZSwgY2F0Y2gsIGFuZCBmaW5hbGx5IGlmDQorICAgIC8vIG5ld2xpbmVJbkNvbXBvdW5kU3RhdGVtZW50IGlzIHRydWUuDQogDQotCQkJCS8vIERvIG5vdCBhZGQgYSBuZXdsaW5lICYgaW5kZW50IGJldHdlZW4gYSBjbG9zZSBicmFjZSBhbmQgc2VtaS1jb2xvbi4NCiANCi0JCQkJYm9vbGVhbiBzZW1pQ29sb25BbmRDbG9zZUJyYWNlID0gDQotCQkJCQkJcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OOyANCisgICAgYm9vbGVhbiBubGljc09wdGlvbiA9IA0KKyAgICAgIHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFDQorICAgICAgICYmICFvcHRpb25zLm5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnRNb2RlDQorICAgICAgICYmICh0b2tlbiA9PSBUb2tlbk5hbWVlbHNlDQorICAgICAgICB8fCAodG9rZW4gPT0gVG9rZW5OYW1ld2hpbGUgJiYgbmxpY3NUb2tlbiA9PSBUb2tlbk5hbWVkbykNCisgICAgICAgIHx8IHRva2VuID09IFRva2VuTmFtZWNhdGNoDQorICAgICAgICB8fCB0b2tlbiA9PSBUb2tlbk5hbWVmaW5hbGx5KTsNCiANCi0JCQkJLy8gRG8gbm90IGFkZCBhIG5ldyBsaW5lICYgaW5kZW50IGJldHdlZW4gYSBtdWx0aWxpbmUgY29tbWVudCBhbmQgYSBvcGVuaW5nIGJyYWNlDQorICAgIC8vIERvIG5vdCBhZGQgYSBuZXdsaW5lICYgaW5kZW50IGJldHdlZW4gYSBjbG9zZSBicmFjZSBhbmQgc2VtaS1jb2xvbi4NCiANCi0JCQkJYm9vbGVhbiBjb21tZW50QW5kT3BlbkJyYWNlID0gcHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgJiYgdG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFOw0KLQkJCQkNCi0JCQkJLy8gRG8gbm90IGFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgYmV0d2VlbiBhIGNsb3NlIGJyYWNlIGFuZCBhIGNvbG9uIChpbiBhcnJheSBhc3NpZ25tZW50cywgZm9yIGV4YW1wbGUpLg0KLQkJCQkNCi0JCQkJYm9vbGVhbiBjb21tYUFuZENsb3NlQnJhY2UgPQ0KLQkJCQkJCXByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZUNPTU1BOyANCisgICAgYm9vbGVhbiBzZW1pQ29sb25BbmRDbG9zZUJyYWNlID0gDQorICAgICAgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OOyANCiANCi0JCQkJLy8gQWRkIGEgbmV3bGluZSBhbmQgaW5kZW50LCBpZiBhcHByb3ByaWF0ZS4NCisgICAgLy8gRG8gbm90IGFkZCBhIG5ldyBsaW5lICYgaW5kZW50IGJldHdlZW4gYSBtdWx0aWxpbmUgY29tbWVudCBhbmQgYSBvcGVuaW5nIGJyYWNlDQogDQotCQkJCWlmIChzcGVjaWFsRWxzZSB8fCAoIWNvbW1lbnRBbmRPcGVuQnJhY2UgJiYgIWNsb3NlQnJhY2VBbmRDbG9zZVBhcmVuICYmICFubGljc09wdGlvbiAmJiAhc2VtaUNvbG9uQW5kQ2xvc2VCcmFjZSAmJiAhY29tbWFBbmRDbG9zZUJyYWNlKSkgew0KLQkJCQkJLy8gaWYgY2xlYXJBbGxCbGFua0xpbmVzTW9kZT1mYWxzZSwgbGVhdmVzIHRoZSBibGFuayBsaW5lcw0KLQkJCQkJLy8gaW5zZXJ0ZWQgYnkgdGhlIHVzZXINCi0JCQkJCS8vIGlmIGNsZWFyQWxsQmxhbmtMaW5lc01vZGU9dHJ1ZSwgcmVtb3ZlcyBhbGwgb2YgdGhlbg0KLQkJCQkJLy8gYW5kIGluc2VydCBvbmx5IGJsYW5rIGxpbmVzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXR0aW5nLg0KLQkJCQkJaWYgKCFvcHRpb25zLmNsZWFyQWxsQmxhbmtMaW5lc01vZGUpIHsNCi0JCQkJCQlwZW5kaW5nTmV3TGluZXMgPSANCi0JCQkJCQkJCShwZW5kaW5nTmV3TGluZXMgPCBuZXdMaW5lc0luV2hpdGVzcGFjZSkNCisgICAgYm9vbGVhbiBjb21tZW50QW5kT3BlbkJyYWNlID0gcHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgJiYgdG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFOw0KKyAgICANCisgICAgLy8gRG8gbm90IGFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgYmV0d2VlbiBhIGNsb3NlIGJyYWNlIGFuZCBhIGNvbG9uIChpbiBhcnJheSBhc3NpZ25tZW50cywgZm9yIGV4YW1wbGUpLg0KKyAgICANCisgICAgYm9vbGVhbiBjb21tYUFuZENsb3NlQnJhY2UgPQ0KKyAgICAgIHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZUNPTU1BOyANCisNCisgICAgLy8gQWRkIGEgbmV3bGluZSBhbmQgaW5kZW50LCBpZiBhcHByb3ByaWF0ZS4NCisNCisgICAgaWYgKHNwZWNpYWxFbHNlIHx8ICghY29tbWVudEFuZE9wZW5CcmFjZSAmJiAhY2xvc2VCcmFjZUFuZENsb3NlUGFyZW4gJiYgIW5saWNzT3B0aW9uICYmICFzZW1pQ29sb25BbmRDbG9zZUJyYWNlICYmICFjb21tYUFuZENsb3NlQnJhY2UpKSB7DQorICAgICAvLyBpZiBjbGVhckFsbEJsYW5rTGluZXNNb2RlPWZhbHNlLCBsZWF2ZXMgdGhlIGJsYW5rIGxpbmVzDQorICAgICAvLyBpbnNlcnRlZCBieSB0aGUgdXNlcg0KKyAgICAgLy8gaWYgY2xlYXJBbGxCbGFua0xpbmVzTW9kZT10cnVlLCByZW1vdmVzIGFsbCBvZiB0aGVuDQorICAgICAvLyBhbmQgaW5zZXJ0IG9ubHkgYmxhbmsgbGluZXMgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdHRpbmcuDQorICAgICBpZiAoIW9wdGlvbnMuY2xlYXJBbGxCbGFua0xpbmVzTW9kZSkgew0KKyAgICAgIHBlbmRpbmdOZXdMaW5lcyA9IA0KKyAgICAgICAgKHBlbmRpbmdOZXdMaW5lcyA8IG5ld0xpbmVzSW5XaGl0ZXNwYWNlKQ0KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzQ29tbWVudCh0b2tlbikpDQotCQkJCQkJCQkJPyBuZXdMaW5lc0luV2hpdGVzcGFjZSANCi0JCQkJCQkJCQk6IHBlbmRpbmdOZXdMaW5lczsNCi0JCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAocGVuZGluZ05ld0xpbmVzID4gMikgPyAyIDogcGVuZGluZ05ld0xpbmVzOw0KLQkJCQkJfQ0KKyAgICAgICAgID8gbmV3TGluZXNJbldoaXRlc3BhY2UgDQorICAgICAgICAgOiBwZW5kaW5nTmV3TGluZXM7DQorICAgICAgcGVuZGluZ05ld0xpbmVzID0gKHBlbmRpbmdOZXdMaW5lcyA+IDIpID8gMiA6IHBlbmRpbmdOZXdMaW5lczsNCisgICAgIH0NCiANCi0JCQkJCWlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSB7DQotCQkJCQkJY29udGFpbnNPcGVuQ2xvc2VCcmFjZXMgPSB0cnVlOw0KLQkJCQkJCWluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMgPSBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWw7DQotCQkJCQkJaWYgKGlzQ29tbWVudChwcmV2aW91c1Rva2VuKSkgew0KLQkJCQkJCQluZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7DQotCQkJCQkJfSBlbHNlIHsNCisgICAgIGlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSB7DQorICAgICAgY29udGFpbnNPcGVuQ2xvc2VCcmFjZXMgPSB0cnVlOw0KKyAgICAgIGluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMgPSBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWw7DQorICAgICAgaWYgKGlzQ29tbWVudChwcmV2aW91c1Rva2VuKSkgew0KKyAgICAgICBuZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7DQorICAgICAgfSBlbHNlIHsNCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29uc3RydWN0aW9uc0NvdW50ID4gMQ0KLQkJCQkJCQkJJiYgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMV0gPT0gTk9OSU5ERU5UX0JMT0NLDQotCQkJCQkJCQkmJiAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMl0gPT0gVG9rZW5OYW1lZm9yIA0KLQkJCQkJCQkJCXx8IGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTJdID09IFRva2VuTmFtZXdoaWxlKSkpIHsqLw0KLQkJCQkJCQlpZiAob3B0aW9ucy5uZXdMaW5lSW5FbXB0eUJsb2NrTW9kZSkgew0KLQkJCQkJCQkJaWYgKGluQXJyYXlBc3NpZ25tZW50KSB7DQotCQkJCQkJCQkJbmV3TGluZSgxKTsgLy8gYXJyYXkgYXNzaWdtZW50IHdpdGggYW4gZW1wdHkgYmxvY2sNCi0JCQkJCQkJCX0gZWxzZSB7DQotCQkJCQkJCQkJbmV3TGluZShwZW5kaW5nTmV3TGluZXMpOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQl9DQorICAgICAgICAmJiBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXSA9PSBOT05JTkRFTlRfQkxPQ0sNCisgICAgICAgICYmIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0yXSA9PSBUb2tlbk5hbWVmb3IgDQorICAgICAgICAgfHwgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMl0gPT0gVG9rZW5OYW1ld2hpbGUpKSkgeyovDQorICAgICAgIGlmIChvcHRpb25zLm5ld0xpbmVJbkVtcHR5QmxvY2tNb2RlKSB7DQorICAgICAgICBpZiAoaW5BcnJheUFzc2lnbm1lbnQpIHsNCisgICAgICAgICBuZXdMaW5lKDEpOyAvLyBhcnJheSBhc3NpZ21lbnQgd2l0aCBhbiBlbXB0eSBibG9jaw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICBuZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7DQorICAgICAgICB9DQorICAgICAgIH0NCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQkJCQkJCX0NCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gc2VlIFBSIDFGS0tDM1U6IExGQ09NOldJTk5UIC0gRm9ybWF0IHByb2JsZW0gd2l0aCBhIGNvbW1lbnQgYmVmb3JlIHRoZSAnOycNCi0JCQkJCQlpZiAoISgocHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgfHwgcHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQykgJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKSkgew0KLQkJCQkJCQluZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7ICAgICAgICAgICAgICAgICAgICAgICANCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlpZiAoKChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pDQotCQkJCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpDQotCQkJCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UpDQotCQkJCQkJCXx8IChpc0NvbW1lbnQocHJldmlvdXNUb2tlbikpKQ0KLQkJCQkJCSYmICh0b2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UpKSB7DQotCQkJCQkJaW5kZW50YXRpb25PZmZzZXQgPSAtMTsNCi0JCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcEV4Y2x1c2l2ZVVudGlsQmxvY2soKTsNCi0JCQkJCX0NCisgICAgICB9DQorICAgICB9IGVsc2Ugew0KKyAgICAgIC8vIHNlZSBQUiAxRktLQzNVOiBMRkNPTTpXSU5OVCAtIEZvcm1hdCBwcm9ibGVtIHdpdGggYSBjb21tZW50IGJlZm9yZSB0aGUgJzsnDQorICAgICAgaWYgKCEoKHByZXZpb3VzVG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIHx8IHByZXZpb3VzVG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MpICYmIHRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikpIHsNCisgICAgICAgbmV3TGluZShwZW5kaW5nTmV3TGluZXMpOyAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgfQ0KKyAgICAgfQ0KKyAgICAgaWYgKCgocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQ0KKyAgICAgICB8fCAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKQ0KKyAgICAgICB8fCAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKQ0KKyAgICAgICB8fCAoaXNDb21tZW50KHByZXZpb3VzVG9rZW4pKSkNCisgICAgICAmJiAodG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkgew0KKyAgICAgIGluZGVudGF0aW9uT2Zmc2V0ID0gLTE7DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwb3BFeGNsdXNpdmVVbnRpbEJsb2NrKCk7DQorICAgICB9DQogDQotCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSAmJiBpbkFzc2lnbm1lbnQpIHsNCi0JCQkJCQkvLyBQUiAxRkk1SVBPDQotCQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsKys7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgKyBpbmRlbnRhdGlvbk9mZnNldDsNCi0JCQkJCX0NCisgICAgIGlmIChwcmV2aW91c1Rva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FICYmIGluQXNzaWdubWVudCkgew0KKyAgICAgIC8vIFBSIDFGSTVJUE8NCisgICAgICBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwrKzsNCisgICAgIH0gZWxzZSB7DQorICAgICAgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCArIGluZGVudGF0aW9uT2Zmc2V0Ow0KKyAgICAgfQ0KIA0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQlpbmRlbnRhdGlvbk9mZnNldCA9IDA7DQotCQkJCX0NCi0JCQkJcGVuZGluZ05ld0xpbmVzID0gMDsNCi0JCQkJbmV3TGluZXNJbldoaXRlc3BhY2UgPSAwOw0KLQkJCQlzcGVjaWFsRWxzZSA9IGZhbHNlOw0KKyAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgICBpbmRlbnRhdGlvbk9mZnNldCA9IDA7DQorICAgIH0NCisgICAgcGVuZGluZ05ld0xpbmVzID0gMDsNCisgICAgbmV3TGluZXNJbldoaXRlc3BhY2UgPSAwOw0KKyAgICBzcGVjaWFsRWxzZSA9IGZhbHNlOw0KIA0KLQkJCQlpZiAobmxpY3NUb2tlbiA9PSBUb2tlbk5hbWVkbyAmJiB0b2tlbiA9PSBUb2tlbk5hbWV3aGlsZSkgew0KLQkJCQkJbmxpY3NUb2tlbiA9IDA7DQotCQkJCX0NCi0JCQl9DQorICAgIGlmIChubGljc1Rva2VuID09IFRva2VuTmFtZWRvICYmIHRva2VuID09IFRva2VuTmFtZXdoaWxlKSB7DQorICAgICBubGljc1Rva2VuID0gMDsNCisgICAgfQ0KKyAgIH0NCiANCi0JCQlzd2l0Y2ggKHRva2VuKSB7DQotCQkJCWNhc2UgVG9rZW5OYW1lZWxzZSA6DQotCQkJCWNhc2UgVG9rZW5OYW1lZmluYWxseSA6DQotCQkJCQlleHBlY3RpbmdPcGVuQnJhY2UgPSB0cnVlOw0KLQkJCQkJcGVuZGluZ05ld2xpbmVBZnRlclBhcmVuID0gdHJ1ZTsNCi0JCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaENvbnRyb2xTdGF0ZW1lbnQodG9rZW4pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lY2FzZSA6DQotCQkJCWNhc2UgVG9rZW5OYW1lZGVmYXVsdCA6DQotCQkJCQlpZiAodG9rZW5CZWZvcmVDb2xvbkNvdW50ID09IHRva2VuQmVmb3JlQ29sb24ubGVuZ3RoKSB7DQotCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCi0JCQkJCQkJCXRva2VuQmVmb3JlQ29sb24sIA0KLQkJCQkJCQkJMCwgDQotCQkJCQkJCQkodG9rZW5CZWZvcmVDb2xvbiA9IG5ldyBpbnRbdG9rZW5CZWZvcmVDb2xvbkNvdW50ICogMl0pLCANCi0JCQkJCQkJCTAsIA0KLQkJCQkJCQkJdG9rZW5CZWZvcmVDb2xvbkNvdW50KTsgDQotCQkJCQl9DQotCQkJCQl0b2tlbkJlZm9yZUNvbG9uW3Rva2VuQmVmb3JlQ29sb25Db3VudCsrXSA9IFRva2VuTmFtZWNhc2U7DQotCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KFRva2VuTmFtZWNhc2UpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOg0KLQkJCQkJaWYgKHRva2VuQmVmb3JlQ29sb25Db3VudCA9PSB0b2tlbkJlZm9yZUNvbG9uLmxlbmd0aCkgew0KLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQotCQkJCQkJCQl0b2tlbkJlZm9yZUNvbG9uLCANCi0JCQkJCQkJCTAsIA0KLQkJCQkJCQkJKHRva2VuQmVmb3JlQ29sb24gPSBuZXcgaW50W3Rva2VuQmVmb3JlQ29sb25Db3VudCAqIDJdKSwgDQotCQkJCQkJCQkwLCANCi0JCQkJCQkJCXRva2VuQmVmb3JlQ29sb25Db3VudCk7IA0KLQkJCQkJfQ0KLQkJCQkJdG9rZW5CZWZvcmVDb2xvblt0b2tlbkJlZm9yZUNvbG9uQ291bnQrK10gPSB0b2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFRva2VuTmFtZXN3aXRjaCA6DQotCQkJCWNhc2UgVG9rZW5OYW1lZm9yIDoNCi0JCQkJY2FzZSBUb2tlbk5hbWVpZiA6DQotCQkJCWNhc2UgVG9rZW5OYW1ld2hpbGUgOg0KLQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc0NvdW50ID09IG9wZW5QYXJlbnRoZXNpcy5sZW5ndGgpIHsNCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KLQkJCQkJCQkJb3BlblBhcmVudGhlc2lzLCANCi0JCQkJCQkJCTAsIA0KLQkJCQkJCQkJKG9wZW5QYXJlbnRoZXNpcyA9IG5ldyBpbnRbb3BlblBhcmVudGhlc2lzQ291bnQgKiAyXSksIA0KLQkJCQkJCQkJMCwgDQotCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNDb3VudCk7IA0KLQkJCQkJfQ0KLQkJCQkJb3BlblBhcmVudGhlc2lzW29wZW5QYXJlbnRoZXNpc0NvdW50KytdID0gMDsNCi0JCQkJCWV4cGVjdGluZ09wZW5CcmFjZSA9IHRydWU7DQotCQkJCQkNCi0JCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaENvbnRyb2xTdGF0ZW1lbnQodG9rZW4pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1ldHJ5IDoNCi0JCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHRydWU7DQotCQkJCWNhc2UgVG9rZW5OYW1lY2F0Y2ggOg0KLQkJCQkJLy8gc2V2ZXJhbCBDQVRDSCBzdGF0ZW1lbnRzIGNhbiBiZSBjb250aWd1b3VzLg0KLQkJCQkJLy8gYSBDQVRDSCBpcyBlbmNvdW50ZXJlZCBwb3AgdW50aWwgZmlyc3QgQ0FUQ0ggKGlmIGEgQ0FUQ0ggZm9sbG93cyBhIFRSWSBpdCB3b3JrcyB0aGUgc2FtZSB3YXksDQotCQkJCQkvLyBhcyBDQVRDSCBhbmQgVFJZIGFyZSB0aGUgc2FtZSB0b2tlbiBpbiB0aGUgc3RhY2spLg0KLQkJCQkJZXhwZWN0aW5nT3BlbkJyYWNlID0gdHJ1ZTsNCi0JCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaENvbnRyb2xTdGF0ZW1lbnQoVG9rZW5OYW1lY2F0Y2gpOw0KLQkJCQkJYnJlYWs7DQorICAgc3dpdGNoICh0b2tlbikgew0KKyAgICBjYXNlIFRva2VuTmFtZWVsc2UgOg0KKyAgICBjYXNlIFRva2VuTmFtZWZpbmFsbHkgOg0KKyAgICAgZXhwZWN0aW5nT3BlbkJyYWNlID0gdHJ1ZTsNCisgICAgIHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHRydWU7DQorICAgICBpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHRva2VuKTsNCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZWNhc2UgOg0KKyAgICBjYXNlIFRva2VuTmFtZWRlZmF1bHQgOg0KKyAgICAgaWYgKHRva2VuQmVmb3JlQ29sb25Db3VudCA9PSB0b2tlbkJlZm9yZUNvbG9uLmxlbmd0aCkgew0KKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoDQorICAgICAgICB0b2tlbkJlZm9yZUNvbG9uLCANCisgICAgICAgIDAsIA0KKyAgICAgICAgKHRva2VuQmVmb3JlQ29sb24gPSBuZXcgaW50W3Rva2VuQmVmb3JlQ29sb25Db3VudCAqIDJdKSwgDQorICAgICAgICAwLCANCisgICAgICAgIHRva2VuQmVmb3JlQ29sb25Db3VudCk7IA0KKyAgICAgfQ0KKyAgICAgdG9rZW5CZWZvcmVDb2xvblt0b2tlbkJlZm9yZUNvbG9uQ291bnQrK10gPSBUb2tlbk5hbWVjYXNlOw0KKyAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwdXNoQ29udHJvbFN0YXRlbWVudChUb2tlbk5hbWVjYXNlKTsNCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZVFVRVNUSU9OIDoNCisgICAgIGlmICh0b2tlbkJlZm9yZUNvbG9uQ291bnQgPT0gdG9rZW5CZWZvcmVDb2xvbi5sZW5ndGgpIHsNCisgICAgICBTeXN0ZW0uYXJyYXljb3B5KA0KKyAgICAgICAgdG9rZW5CZWZvcmVDb2xvbiwgDQorICAgICAgICAwLCANCisgICAgICAgICh0b2tlbkJlZm9yZUNvbG9uID0gbmV3IGludFt0b2tlbkJlZm9yZUNvbG9uQ291bnQgKiAyXSksIA0KKyAgICAgICAgMCwgDQorICAgICAgICB0b2tlbkJlZm9yZUNvbG9uQ291bnQpOyANCisgICAgIH0NCisgICAgIHRva2VuQmVmb3JlQ29sb25bdG9rZW5CZWZvcmVDb2xvbkNvdW50KytdID0gdG9rZW47DQorICAgICBicmVhazsNCisgICAgY2FzZSBUb2tlbk5hbWVzd2l0Y2ggOg0KKyAgICBjYXNlIFRva2VuTmFtZWZvciA6DQorICAgIGNhc2UgVG9rZW5OYW1laWYgOg0KKyAgICBjYXNlIFRva2VuTmFtZXdoaWxlIDoNCisgICAgIGlmIChvcGVuUGFyZW50aGVzaXNDb3VudCA9PSBvcGVuUGFyZW50aGVzaXMubGVuZ3RoKSB7DQorICAgICAgU3lzdGVtLmFycmF5Y29weSgNCisgICAgICAgIG9wZW5QYXJlbnRoZXNpcywgDQorICAgICAgICAwLCANCisgICAgICAgIChvcGVuUGFyZW50aGVzaXMgPSBuZXcgaW50W29wZW5QYXJlbnRoZXNpc0NvdW50ICogMl0pLCANCisgICAgICAgIDAsIA0KKyAgICAgICAgb3BlblBhcmVudGhlc2lzQ291bnQpOyANCisgICAgIH0NCisgICAgIG9wZW5QYXJlbnRoZXNpc1tvcGVuUGFyZW50aGVzaXNDb3VudCsrXSA9IDA7DQorICAgICBleHBlY3RpbmdPcGVuQnJhY2UgPSB0cnVlOw0KKyAgICAgDQorICAgICBpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHRva2VuKTsNCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZXRyeSA6DQorICAgICBwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSB0cnVlOw0KKyAgICBjYXNlIFRva2VuTmFtZWNhdGNoIDoNCisgICAgIC8vIHNldmVyYWwgQ0FUQ0ggc3RhdGVtZW50cyBjYW4gYmUgY29udGlndW91cy4NCisgICAgIC8vIGEgQ0FUQ0ggaXMgZW5jb3VudGVyZWQgcG9wIHVudGlsIGZpcnN0IENBVENIIChpZiBhIENBVENIIGZvbGxvd3MgYSBUUlkgaXQgd29ya3MgdGhlIHNhbWUgd2F5LA0KKyAgICAgLy8gYXMgQ0FUQ0ggYW5kIFRSWSBhcmUgdGhlIHNhbWUgdG9rZW4gaW4gdGhlIHN0YWNrKS4NCisgICAgIGV4cGVjdGluZ09wZW5CcmFjZSA9IHRydWU7DQorICAgICBpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KFRva2VuTmFtZWNhdGNoKTsNCisgICAgIGJyZWFrOw0KIA0KLQkJCQljYXNlIFRva2VuTmFtZWRvIDoNCi0JCQkJCWV4cGVjdGluZ09wZW5CcmFjZSA9IHRydWU7DQotCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHRva2VuKTsNCi0JCQkJCW5saWNzVG9rZW4gPSB0b2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFRva2VuTmFtZW5ldyA6DQorICAgIGNhc2UgVG9rZW5OYW1lZG8gOg0KKyAgICAgZXhwZWN0aW5nT3BlbkJyYWNlID0gdHJ1ZTsNCisgICAgIGluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaENvbnRyb2xTdGF0ZW1lbnQodG9rZW4pOw0KKyAgICAgbmxpY3NUb2tlbiA9IHRva2VuOw0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lbmV3IDoNCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZUxQQVJFTiA6DQogDQotCQkJCQkvLyBUaGUgZmxhZyBpbkFzc2lnbWVudCBpcyB1c2VkIHRvIHByb3Blcmx5IGZvcm1hdA0KLQkJCQkJLy8gYXJyYXkgYXNzaWdubWVudHMsIGFuZCBpZiBhIG5vbi1hcnJheSBhc3NpZ25tZW50DQotCQkJCQkvLyBzdGF0ZW1lbnQgaXMgaW4gcHJvZ3Jlc3MsIGl0IGlzIG5vIGxvbmdlcg0KLQkJCQkJLy8gYmVuZWZpY2lhbCB0byBrbm93IHRoaXMsIHNvIHNldCB0aGUgZmxhZyB0byBmYWxzZS4NCisgICAgIC8vIFB1dCBhIHNwYWNlIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHRva2VuIGlmIHRoZQ0KKyAgICAgLy8gcHJldmlvdXMgdG9rZW4gd2FzIG5vdCBhIGtleXdvcmQsIG9wZW4gcGFyZW4sIGxvZ2ljYWwNCisgICAgIC8vIGNvbXBsaW1lbnQgKGVnOiAhKSwgc2VtaS1jb2xvbiwgb3BlbiBicmFjZSwgY2xvc2UgYnJhY2UsDQorICAgICAvLyBzdXBlciwgb3IgdGhpcy4NCiANCi0vKiAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheUFzc2lnbm1lbnQpIHsNCi0JCQkJCQlpbkFzc2lnbm1lbnQgPSBmYWxzZTsNCi0JCQkJCX0qLw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lTFBBUkVOIDoNCisgICAgIGlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiAhPSBUb2tlbk5hbWVMQlJBQ0tFVA0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lSWRlbnRpZmllcg0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gMA0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lTk9UDQorICAgICAgJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVMUEFSRU4NCisgICAgICAmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVRXSURETEUNCisgICAgICAmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVNFTUlDT0xPTg0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lTEJSQUNFDQorICAgICAgJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVSQlJBQ0UNCisgICAgICAmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZXN1cGVyDQorICAgICAgJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWV0aGlzKSB7DQorICAgICAgc3BhY2UoKTsNCisgICAgIH0NCiANCi0JCQkJCS8vIFB1dCBhIHNwYWNlIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHRva2VuIGlmIHRoZQ0KLQkJCQkJLy8gcHJldmlvdXMgdG9rZW4gd2FzIG5vdCBhIGtleXdvcmQsIG9wZW4gcGFyZW4sIGxvZ2ljYWwNCi0JCQkJCS8vIGNvbXBsaW1lbnQgKGVnOiAhKSwgc2VtaS1jb2xvbiwgb3BlbiBicmFjZSwgY2xvc2UgYnJhY2UsDQotCQkJCQkvLyBzdXBlciwgb3IgdGhpcy4NCisgICAgIC8vIElmIGluIGEgZm9yL2lmL3doaWxlIHN0YXRlbWVudCwgaW5jcmVhc2UgdGhlIHBhcmVudGhlc2lzIGNvdW50DQorICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgb3BlblBhcmVudGhlc2lzQ291bnQNCisgICAgIC8vIGVsc2UgaW5jcmVhc2UgdGhlIGNvdW50IGZvciBzdGFuZCBhbG9uZSBwYXJlbnRoZXNpcy4NCisgICAgIGlmIChvcGVuUGFyZW50aGVzaXNDb3VudCA+IDApDQorICAgICAgb3BlblBhcmVudGhlc2lzW29wZW5QYXJlbnRoZXNpc0NvdW50IC0gMV0rKzsNCisgICAgIGVsc2UNCisgICAgICBvcGVuUGFyZW50aGVzaXNbMF0rKzsNCiANCi0JCQkJCWlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiAhPSBUb2tlbk5hbWVMQlJBQ0tFVA0KLQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lSWRlbnRpZmllcg0KLQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gMA0KLQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lTk9UDQotCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVMUEFSRU4NCi0JCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVRXSURETEUNCi0JCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVNFTUlDT0xPTg0KLQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lTEJSQUNFDQotCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVSQlJBQ0UNCi0JCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZXN1cGVyDQotCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWV0aGlzKSB7DQotCQkJCQkJc3BhY2UoKTsNCi0JCQkJCX0NCisgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lUlBBUkVOIDoNCiANCi0JCQkJCS8vIElmIGluIGEgZm9yL2lmL3doaWxlIHN0YXRlbWVudCwgaW5jcmVhc2UgdGhlIHBhcmVudGhlc2lzIGNvdW50DQotCQkJCQkvLyBmb3IgdGhlIGN1cnJlbnQgb3BlblBhcmVudGhlc2lzQ291bnQNCi0JCQkJCS8vIGVsc2UgaW5jcmVhc2UgdGhlIGNvdW50IGZvciBzdGFuZCBhbG9uZSBwYXJlbnRoZXNpcy4NCi0JCQkJCWlmIChvcGVuUGFyZW50aGVzaXNDb3VudCA+IDApDQotCQkJCQkJb3BlblBhcmVudGhlc2lzW29wZW5QYXJlbnRoZXNpc0NvdW50IC0gMV0rKzsNCi0JCQkJCWVsc2UNCi0JCQkJCQlvcGVuUGFyZW50aGVzaXNbMF0rKzsNCisgICAgIC8vIERlY3JlYXNlIHRoZSBwYXJlbnRoZXNpcyBjb3VudA0KKyAgICAgLy8gaWYgdGhlcmUgaXMgbm8gbW9yZSB1bmNsb3NlZCBwYXJlbnRoZXNpcywNCisgICAgIC8vIGEgbmV3IGxpbmUgYW5kIGluZGVudCBtYXkgYmUgYXBwZW5kIChkZXBlbmRpbmcgb24gdGhlIG5leHQgdG9rZW4pLg0KIA0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOg0KKyAgICAgaWYgKChvcGVuUGFyZW50aGVzaXNDb3VudCA+IDEpDQorICAgICAgJiYgKG9wZW5QYXJlbnRoZXNpc1tvcGVuUGFyZW50aGVzaXNDb3VudCAtIDFdID4gMCkpIHsNCisgICAgICBvcGVuUGFyZW50aGVzaXNbb3BlblBhcmVudGhlc2lzQ291bnQgLSAxXS0tOw0KKyAgICAgIGlmIChvcGVuUGFyZW50aGVzaXNbb3BlblBhcmVudGhlc2lzQ291bnQgLSAxXSA8PSAwKSB7DQorICAgICAgIHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHRydWU7DQorICAgICAgIGluQXNzaWdubWVudCA9IGZhbHNlOw0KKyAgICAgICBvcGVuUGFyZW50aGVzaXNDb3VudC0tOw0KIA0KLQkJCQkJLy8gRGVjcmVhc2UgdGhlIHBhcmVudGhlc2lzIGNvdW50DQotCQkJCQkvLyBpZiB0aGVyZSBpcyBubyBtb3JlIHVuY2xvc2VkIHBhcmVudGhlc2lzLA0KLQkJCQkJLy8gYSBuZXcgbGluZSBhbmQgaW5kZW50IG1heSBiZSBhcHBlbmQgKGRlcGVuZGluZyBvbiB0aGUgbmV4dCB0b2tlbikuDQorICAgICAgfQ0KKyAgICAgfSBlbHNlIHsNCisgICAgICBvcGVuUGFyZW50aGVzaXNbMF0tLTsNCisgICAgIH0NCiANCi0JCQkJCWlmICgob3BlblBhcmVudGhlc2lzQ291bnQgPiAxKQ0KLQkJCQkJCSYmIChvcGVuUGFyZW50aGVzaXNbb3BlblBhcmVudGhlc2lzQ291bnQgLSAxXSA+IDApKSB7DQotCQkJCQkJb3BlblBhcmVudGhlc2lzW29wZW5QYXJlbnRoZXNpc0NvdW50IC0gMV0tLTsNCi0JCQkJCQlpZiAob3BlblBhcmVudGhlc2lzW29wZW5QYXJlbnRoZXNpc0NvdW50IC0gMV0gPD0gMCkgew0KLQkJCQkJCQlwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSB0cnVlOw0KLQkJCQkJCQlpbkFzc2lnbm1lbnQgPSBmYWxzZTsNCi0JCQkJCQkJb3BlblBhcmVudGhlc2lzQ291bnQtLTsNCi0NCi0JCQkJCQl9DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCW9wZW5QYXJlbnRoZXNpc1swXS0tOw0KLQkJCQkJfQ0KLQ0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOg0KLQkJCQkJaWYgKChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZUVRVUFMKSkgew0KKyAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgICBicmVhazsNCisgICAgY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOg0KKyAgICAgaWYgKChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZUVRVUFMKSkgew0KIC8vICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJCUkFDS0VUKSB7DQotCQkJCQkJaW5BcnJheUFzc2lnbm1lbnQgPSB0cnVlOw0KLQkJCQkJCWluQXNzaWdubWVudCA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKGluQXJyYXlBc3NpZ25tZW50KSB7DQotCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwdXNoQmxvY2soKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gQWRkIG5ldyBsaW5lIGFuZCBpbmNyZWFzZSBpbmRlbnRhdGlvbiBsZXZlbCBhZnRlciBvcGVuIGJyYWNlLg0KLQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7DQotCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwdXNoQmxvY2soKTsNCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6DQotCQkJCQlpZiAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lUlBBUkVOKSB7DQotCQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCQlpZiAoaW5BcnJheUFzc2lnbm1lbnQpIHsNCi0JCQkJCQlpbkFycmF5QXNzaWdubWVudCA9IGZhbHNlOw0KLQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7DQotCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3BJbmNsdXNpdmVVbnRpbEJsb2NrKCk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7DQotCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3BJbmNsdXNpdmVVbnRpbEJsb2NrKCk7DQorICAgICAgaW5BcnJheUFzc2lnbm1lbnQgPSB0cnVlOw0KKyAgICAgIGluQXNzaWdubWVudCA9IGZhbHNlOw0KKyAgICAgfQ0KKyAgICAgaWYgKGluQXJyYXlBc3NpZ25tZW50KSB7DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwdXNoQmxvY2soKTsNCisgICAgIH0gZWxzZSB7DQorICAgICAgLy8gQWRkIG5ldyBsaW5lIGFuZCBpbmNyZWFzZSBpbmRlbnRhdGlvbiBsZXZlbCBhZnRlciBvcGVuIGJyYWNlLg0KKyAgICAgIHBlbmRpbmdOZXdMaW5lcyA9IDE7DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwdXNoQmxvY2soKTsNCisgICAgIH0NCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZVJCUkFDRSA6DQorICAgICBpZiAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lUlBBUkVOKSB7DQorICAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgICB9DQorICAgICBpZiAoaW5BcnJheUFzc2lnbm1lbnQpIHsNCisgICAgICBpbkFycmF5QXNzaWdubWVudCA9IGZhbHNlOw0KKyAgICAgIHBlbmRpbmdOZXdMaW5lcyA9IDE7DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwb3BJbmNsdXNpdmVVbnRpbEJsb2NrKCk7DQorICAgICB9IGVsc2Ugew0KKyAgICAgIHBlbmRpbmdOZXdMaW5lcyA9IDE7DQorICAgICAgaW5kZW50YXRpb25MZXZlbCArPSBwb3BJbmNsdXNpdmVVbnRpbEJsb2NrKCk7DQogDQotCQkJCQkJaWYgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTil7DQotCQkJCQkJCS8vIGZpeCBmb3IgMUZHRERWNjogTEZDT006V0lOOTggLSBXZWlyZCBzcGxpdHRpbmcgb24gbWVzc2FnZSBleHByZXNzaW9uDQotCQkJCQkJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7DQotCQkJCQkJCWluY3JlYXNlTGluZURlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLQkJCQkJCX0NCisgICAgICBpZiAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lUlBBUkVOKXsNCisgICAgICAgLy8gZml4IGZvciAxRkdERFY2OiBMRkNPTTpXSU45OCAtIFdlaXJkIHNwbGl0dGluZyBvbiBtZXNzYWdlIGV4cHJlc3Npb24NCisgICAgICAgY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsNCisgICAgICAgaW5jcmVhc2VMaW5lRGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgfQ0KIA0KLQkJCQkJCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPiAwKSB7DQotCQkJCQkJCXN3aXRjaCAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSkgew0KLQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVmb3IgOg0KLQkJCQkJCQkJCS8vaW5kZW50YXRpb25MZXZlbCArPSBwb3BFeGNsdXNpdmVVbnRpbEJsb2NrKCk7DQotCQkJCQkJCQkJLy9icmVhazsNCi0JCQkJCQkJCWNhc2UgVG9rZW5OYW1lc3dpdGNoIDoNCi0JCQkJCQkJCWNhc2UgVG9rZW5OYW1laWYgOg0KLQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVlbHNlIDoNCi0JCQkJCQkJCWNhc2UgVG9rZW5OYW1ldHJ5IDoNCi0JCQkJCQkJCWNhc2UgVG9rZW5OYW1lY2F0Y2ggOg0KLQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVmaW5hbGx5IDoNCi0JCQkJCQkJCWNhc2UgVG9rZW5OYW1ld2hpbGUgOg0KLQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVkbyA6DQotCQkJCQkJCQkJY2xlYXJOb25CbG9ja0luZGVudHMgPSB0cnVlOw0KLQkJCQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQorICAgICAgaWYgKGNvbnN0cnVjdGlvbnNDb3VudCA+IDApIHsNCisgICAgICAgc3dpdGNoIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdKSB7DQorICAgICAgICBjYXNlIFRva2VuTmFtZWZvciA6DQorICAgICAgICAgLy9pbmRlbnRhdGlvbkxldmVsICs9IHBvcEV4Y2x1c2l2ZVVudGlsQmxvY2soKTsNCisgICAgICAgICAvL2JyZWFrOw0KKyAgICAgICAgY2FzZSBUb2tlbk5hbWVzd2l0Y2ggOg0KKyAgICAgICAgY2FzZSBUb2tlbk5hbWVpZiA6DQorICAgICAgICBjYXNlIFRva2VuTmFtZWVsc2UgOg0KKyAgICAgICAgY2FzZSBUb2tlbk5hbWV0cnkgOg0KKyAgICAgICAgY2FzZSBUb2tlbk5hbWVjYXRjaCA6DQorICAgICAgICBjYXNlIFRva2VuTmFtZWZpbmFsbHkgOg0KKyAgICAgICAgY2FzZSBUb2tlbk5hbWV3aGlsZSA6DQorICAgICAgICBjYXNlIFRva2VuTmFtZWRvIDoNCisgICAgICAgICBjbGVhck5vbkJsb2NrSW5kZW50cyA9IHRydWU7DQorICAgICAgICBkZWZhdWx0IDoNCisgICAgICAgICBicmVhazsNCisgICAgICAgfQ0KKyAgICAgIH0NCiANCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFRva2VuTmFtZUxCUkFDS0VUIDoNCi0JCQkJCW9wZW5CcmFja2V0Q291bnQrKzsNCi0JCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lUkJSQUNLRVQgOg0KLQkJCQkJb3BlbkJyYWNrZXRDb3VudC09KG9wZW5CcmFja2V0Q291bnQ+MCk/MTowOw0KLQkJCQkJLy8gaWYgdGhlcmUgaXMgbm8gbGVmdCBicmFja2V0IHRvIGNsb3NlLCB0aGUgcmlnaHQgYnJhY2tldCBpcyBpZ25vcmVkLg0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBUb2tlbk5hbWVDT01NQSA6DQotCQkJCWNhc2UgVG9rZW5OYW1lRE9UIDoNCi0JCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoNCisgICAgIH0NCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZUxCUkFDS0VUIDoNCisgICAgIG9wZW5CcmFja2V0Q291bnQrKzsNCisgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lUkJSQUNLRVQgOg0KKyAgICAgb3BlbkJyYWNrZXRDb3VudC09KG9wZW5CcmFja2V0Q291bnQ+MCk/MTowOw0KKyAgICAgLy8gaWYgdGhlcmUgaXMgbm8gbGVmdCBicmFja2V0IHRvIGNsb3NlLCB0aGUgcmlnaHQgYnJhY2tldCBpcyBpZ25vcmVkLg0KKyAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7DQorICAgICBicmVhazsNCisgICAgY2FzZSBUb2tlbk5hbWVDT01NQSA6DQorICAgIGNhc2UgVG9rZW5OYW1lRE9UIDoNCisgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoNCiANCi0JCQkJCS8vIERvIG5vdCBnZW5lcmF0ZSBsaW5lIHRlcm1pbmF0b3JzIGluIHRoZSBkZWZpbml0aW9uIG9mDQotCQkJCQkvLyB0aGUgZm9yIHN0YXRlbWVudC4NCi0JCQkJCS8vIGlmIG5vdCBpbiB0aGlzIGNhc2UsIGp1bXAgYSBsaW5lIGFuZCByZWR1Y2UgaW5kZW50YXRpb24gYWZ0ZXIgdGhlIGJyYWNlDQotCQkJCQkvLyBpZiB0aGUgYmxvY2sgaXQgY2xvc2VzIGJlbG9uZ3MgdG8gYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgKGlmLCB3aGlsZSwgZG8uLi4pLg0KKyAgICAgLy8gRG8gbm90IGdlbmVyYXRlIGxpbmUgdGVybWluYXRvcnMgaW4gdGhlIGRlZmluaXRpb24gb2YNCisgICAgIC8vIHRoZSBmb3Igc3RhdGVtZW50Lg0KKyAgICAgLy8gaWYgbm90IGluIHRoaXMgY2FzZSwganVtcCBhIGxpbmUgYW5kIHJlZHVjZSBpbmRlbnRhdGlvbiBhZnRlciB0aGUgYnJhY2UNCisgICAgIC8vIGlmIHRoZSBibG9jayBpdCBjbG9zZXMgYmVsb25ncyB0byBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCAoaWYsIHdoaWxlLCBkby4uLikuDQogDQotCQkJCQlpZiAob3BlblBhcmVudGhlc2lzQ291bnQgPD0gMSkgew0KLQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7DQotCQkJCQkJaWYgKGV4cGVjdGluZ09wZW5CcmFjZSkgew0KLQkJCQkJCQljbGVhck5vbkJsb2NrSW5kZW50cyA9IHRydWU7DQotCQkJCQkJCWV4cGVjdGluZ09wZW5CcmFjZSA9IGZhbHNlOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWluQXNzaWdubWVudCA9IGZhbHNlOw0KLQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBUb2tlbk5hbWVQTFVTX1BMVVMgOg0KLQkJCQljYXNlIFRva2VuTmFtZU1JTlVTX01JTlVTIDoNCisgICAgIGlmIChvcGVuUGFyZW50aGVzaXNDb3VudCA8PSAxKSB7DQorICAgICAgcGVuZGluZ05ld0xpbmVzID0gMTsNCisgICAgICBpZiAoZXhwZWN0aW5nT3BlbkJyYWNlKSB7DQorICAgICAgIGNsZWFyTm9uQmxvY2tJbmRlbnRzID0gdHJ1ZTsNCisgICAgICAgZXhwZWN0aW5nT3BlbkJyYWNlID0gZmFsc2U7DQorICAgICAgfQ0KKyAgICAgfQ0KKyAgICAgaW5Bc3NpZ25tZW50ID0gZmFsc2U7DQorICAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZVBMVVNfUExVUyA6DQorICAgIGNhc2UgVG9rZW5OYW1lTUlOVVNfTUlOVVMgOg0KIA0KLQkJCQkJLy8gRG8gbm90IHB1dCBhIHNwYWNlIGJldHdlZW4gYSBwb3N0LWluY3JlbWVudC9kZWNyZW1lbnQNCi0JCQkJCS8vIGFuZCB0aGUgaWRlbnRpZmllciBiZWluZyBtb2RpZmllZC4NCisgICAgIC8vIERvIG5vdCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgcG9zdC1pbmNyZW1lbnQvZGVjcmVtZW50DQorICAgICAvLyBhbmQgdGhlIGlkZW50aWZpZXIgYmVpbmcgbW9kaWZpZWQuDQogDQotCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyDQotCQkJCQkJfHwgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgew0KLQkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lUExVUyA6IC8vIHByZXZpb3VzbHkgQURESVRJT04NCi0JCQkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6DQorICAgICBpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyDQorICAgICAgfHwgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgew0KKyAgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOw0KKyAgICAgfQ0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lUExVUyA6IC8vIHByZXZpb3VzbHkgQURESVRJT04NCisgICAgY2FzZSBUb2tlbk5hbWVNSU5VUyA6DQogDQotCQkJCQkvLyBIYW5kbGUgdGhlIHVuYXJ5IG9wZXJhdG9ycyBwbHVzIGFuZCBtaW51cyB2aWEgYSAzLXN0YXRlIGZsYWcuDQorICAgICAvLyBIYW5kbGUgdGhlIHVuYXJ5IG9wZXJhdG9ycyBwbHVzIGFuZCBtaW51cyB2aWEgYSBmbGFnDQogDQotCQkJCQlpZiAoIWlzTGl0ZXJhbFRva2VuKHByZXZpb3VzVG9rZW4pDQotCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVJZGVudGlmaWVyDQotCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVSUEFSRU4NCi0JCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVJCUkFDS0VUKSB7DQotCQkJCQkJdW5hcnlTaWduTW9kaWZpZXIgPSAyOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lQ09MT04gOg0KKyAgICAgaWYgKCFpc0xpdGVyYWxUb2tlbihwcmV2aW91c1Rva2VuKQ0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lSWRlbnRpZmllcg0KKyAgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lUlBBUkVODQorICAgICAgJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVSQlJBQ0tFVCkgew0KKyAgICAgIHVuYXJ5U2lnbk1vZGlmaWVyID0gMTsNCisgICAgIH0NCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZUNPTE9OIDoNCisgICAgIC8vIEluIGEgc3dpdGNoL2Nhc2Ugc3RhdGVtZW50LCBhZGQgYSBuZXdsaW5lICYgaW5kZW50DQorICAgICAvLyB3aGVuIGEgY29sb24gaXMgZW5jb3VudGVyZWQuDQorICAgICBpZiAodG9rZW5CZWZvcmVDb2xvbkNvdW50ID4gMCkgew0KKyAgICAgIGlmICh0b2tlbkJlZm9yZUNvbG9uW3Rva2VuQmVmb3JlQ29sb25Db3VudCAtIDFdID09IFRva2VuTmFtZWNhc2UpIHsNCisgICAgICAgcGVuZGluZ05ld0xpbmVzID0gMTsNCisgICAgICB9DQorICAgICAgdG9rZW5CZWZvcmVDb2xvbkNvdW50LS07DQorICAgICB9DQorICAgICBicmVhazsNCisgICAgY2FzZSBUb2tlbk5hbWVFUVVBTCA6DQorICAgICBpbkFzc2lnbm1lbnQgPSB0cnVlOw0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOg0KKyAgICAgcGVuZGluZ05ld0xpbmVzID0gMTsNCisgICAgIGlmIChpbkFzc2lnbm1lbnQpIHsNCisgICAgICBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwrKzsNCisgICAgIH0NCisgICAgIGJyZWFrOyAvLyBhIGxpbmUgaXMgYWx3YXlzIGluc2VydGVkIGFmdGVyIGEgb25lLWxpbmUgY29tbWVudA0KKyAgICBjYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoNCisgICAgY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOg0KKyAgICAgY3VycmVudENvbW1lbnRPZmZzZXQgPSBnZXRDdXJyZW50Q29tbWVudE9mZnNldCgpOw0KKyAgICAgaWYgKG9wZW5QYXJlbnRoZXNpc1swXT09MCAmJiBvcGVuQnJhY2tldENvdW50IDwgMSl7DQorICAgICAgcGVuZGluZ05ld0xpbmVzID0gMTsNCisgICAgICAvLyBhIG5ldyBsaW5lIGlzIGluc2VydGVkIG9ubHkgaWYgdGhlIGNvbW1lbnQgaXMgbm90IGJldHdlZW4gcGFyZW50aGVzaXMuDQorICAgICB9DQorICAgICBicmVhazsNCisgICAgY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UgOg0KIA0KLQkJCQkJLy8gSW4gYSBzd2l0Y2gvY2FzZSBzdGF0ZW1lbnQsIGFkZCBhIG5ld2xpbmUgJiBpbmRlbnQNCi0JCQkJCS8vIHdoZW4gYSBjb2xvbiBpcyBlbmNvdW50ZXJlZC4NCi0JCQkJCWlmICh0b2tlbkJlZm9yZUNvbG9uQ291bnQgPiAwKSB7DQotCQkJCQkJaWYgKHRva2VuQmVmb3JlQ29sb25bdG9rZW5CZWZvcmVDb2xvbkNvdW50IC0gMV0gPT0gVG9rZW5OYW1lY2FzZSkgew0KLQkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOw0KLQkJCQkJCX0NCi0JCQkJCQl0b2tlbkJlZm9yZUNvbG9uQ291bnQtLTsNCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFRva2VuTmFtZUVRVUFMIDoNCi0JCQkJCWluQXNzaWdubWVudCA9IHRydWU7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSA6DQotCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOw0KLQkJCQkJaWYgKGluQXNzaWdubWVudCkgew0KLQkJCQkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCsrOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7IC8vIGEgbGluZSBpcyBhbHdheXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBvbmUtbGluZSBjb21tZW50DQotCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOg0KLQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6DQotCQkJCQljdXJyZW50Q29tbWVudE9mZnNldCA9IGdldEN1cnJlbnRDb21tZW50T2Zmc2V0KCk7DQotCQkJCQlpZiAob3BlblBhcmVudGhlc2lzWzBdPT0wICYmIG9wZW5CcmFja2V0Q291bnQgPCAxKXsNCi0JCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOw0KLQkJCQkJCS8vIGEgbmV3IGxpbmUgaXMgaW5zZXJ0ZWQgb25seSBpZiB0aGUgY29tbWVudCBpcyBub3QgYmV0d2VlbiBwYXJlbnRoZXNpcy4NCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSA6DQorICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmUgdGVybWluYXRvcnMgaW4gdGhlIHdoaXRlc3BhY2Ugc28NCisgICAgIC8vIGxpbmUgc3BhY2luZyBjYW4gYmUgcHJlc2VydmVkIG5lYXIgY29tbWVudHMuDQogDQotCQkJCQkvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmUgdGVybWluYXRvcnMgaW4gdGhlIHdoaXRlc3BhY2Ugc28NCi0JCQkJCS8vIGxpbmUgc3BhY2luZyBjYW4gYmUgcHJlc2VydmVkIG5lYXIgY29tbWVudHMuDQorICAgICBjaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7DQorICAgICBuZXdMaW5lc0luV2hpdGVzcGFjZSA9IDA7DQorICAgICBmb3IgKA0KKyAgICAgIGludCBpID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBtYXggPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsgDQorICAgICAgaSA8IG1heDsgDQorICAgICAgaSsrKSB7DQorICAgICAgaWYgKHNvdXJjZVtpXSA9PSAnXG4nKSB7DQorICAgICAgIG5ld0xpbmVzSW5XaGl0ZXNwYWNlKys7DQorICAgICAgfQ0KKyAgICAgfQ0KKyAgICAgaW5jcmVhc2VMaW5lRGVsdGEoc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOw0KKyAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQgOg0KKyAgICAgaWYgKCh0b2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyKQ0KKyAgICAgIHx8IGlzTGl0ZXJhbFRva2VuKHRva2VuKQ0KKyAgICAgIHx8IHRva2VuID09IFRva2VuTmFtZXN1cGVyDQorICAgICAgfHwgdG9rZW4gPT0gVG9rZW5OYW1ldGhpcykgew0KIA0KLQkJCQkJY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KLQkJCQkJbmV3TGluZXNJbldoaXRlc3BhY2UgPSAwOw0KLQkJCQkJZm9yICgNCi0JCQkJCQlpbnQgaSA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgbWF4ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247IA0KLQkJCQkJCWkgPCBtYXg7IA0KLQkJCQkJCWkrKykgew0KLQkJCQkJCWlmIChzb3VyY2VbaV0gPT0gJ1xuJykgew0KLQkJCQkJCQluZXdMaW5lc0luV2hpdGVzcGFjZSsrOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWluY3JlYXNlTGluZURlbHRhKHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQlkZWZhdWx0IDoNCi0JCQkJCWlmICgodG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcikNCi0JCQkJCQl8fCBpc0xpdGVyYWxUb2tlbih0b2tlbikNCi0JCQkJCQl8fCB0b2tlbiA9PSBUb2tlbk5hbWVzdXBlcg0KLQkJCQkJCXx8IHRva2VuID09IFRva2VuTmFtZXRoaXMpIHsNCisgICAgICAvLyBEbyBub3QgcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHVuYXJ5IG9wZXJhdG9yDQorICAgICAgLy8gKGVnOiArKywgLS0sICssIC0pIGFuZCB0aGUgaWRlbnRpZmllciBiZWluZyBtb2RpZmllZC4NCisgICAgICBpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVQTFVTX1BMVVMNCisgICAgICAgfHwgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVNSU5VU19NSU5VUw0KKyAgICAgICB8fCAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVQTFVTICYmIHVuYXJ5U2lnbk1vZGlmaWVyID4gMCkNCisgICAgICAgfHwgKHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lTUlOVVMgJiYgdW5hcnlTaWduTW9kaWZpZXIgPiAwKSkgew0KKyAgICAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCisgICAgICB9DQorICAgICAgdW5hcnlTaWduTW9kaWZpZXIgPSAwOw0KKyAgICAgfQ0KKyAgICAgYnJlYWs7DQorICAgfQ0KIA0KLQkJCQkJCS8vIERvIG5vdCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgdW5hcnkgb3BlcmF0b3INCi0JCQkJCQkvLyAoZWc6ICsrLCAtLSwgKywgLSkgYW5kIHRoZSBpZGVudGlmaWVyIGJlaW5nIG1vZGlmaWVkLg0KKyAgIC8vIERvIG5vdCBvdXRwdXQgd2hpdGVzcGFjZSB0b2tlbnMuDQogDQotCQkJCQkJdW5hcnlTaWduTW9kaWZpZXIgLT0gKHVuYXJ5U2lnbk1vZGlmaWVyID4gMCkgPyAxIDogMDsNCi0JCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVQTFVTX1BMVVMNCi0JCQkJCQkJfHwgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVNSU5VU19NSU5VUw0KLQkJCQkJCQl8fCAodW5hcnlTaWduTW9kaWZpZXIgPiAwKSkgew0KLQkJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlicmVhazsNCi0JCQl9DQorICAgaWYgKHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSkgew0KIA0KLQkJCS8vIERvIG5vdCBvdXRwdXQgd2hpdGVzcGFjZSB0b2tlbnMuDQorICAgIC8qIEFkZCBwZW5kaW5nIHNwYWNlIHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZy4NCisgICAgRG8gbm90IG91dHB1dCBhIHNwYWNlIHVuZGVyIHRoZSBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlczoNCisgICAgMSkgdGhpcyBpcyB0aGUgZmlyc3QgcGFzcw0KKyAgICAyKSBwcmV2aW91cyB0b2tlbiBpcyBhbiBvcGVuIHBhcmVuDQorICAgIDMpIHByZXZpb3VzIHRva2VuIGlzIGEgcGVyaW9kDQorICAgIDQpIHByZXZpb3VzIHRva2VuIGlzIHRoZSBsb2dpY2FsIGNvbXBsaW1lbnQgKGVnOiAhKQ0KKyAgICA1KSBwcmV2aW91cyB0b2tlbiBpcyB0aGUgYml0d2lzZSBjb21wbGltZW50IChlZzogfikNCisgICAgNikgcHJldmlvdXMgdG9rZW4gaXMgdGhlIG9wZW4gYnJhY2tldCAoZWc6IFspDQorICAgIDcpIGluIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LCBpZiB0aGUgcHJldmlvdXMgdG9rZW4gaXMgYW4gDQorICAgIG9wZW4gYnJhY2Ugb3IgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBjbG9zZSBicmFjZQ0KKyAgICA4KSBwcmV2aW91cyB0b2tlbiBpcyBhIHNpbmdsZSBsaW5lIGNvbW1lbnQNCisgICAgKi8NCiANCi0JCQlpZiAodG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7DQorICAgIGJvb2xlYW4gb3BlbkFuZENsb3NlQnJhY2UgPSBwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFOw0KIA0KLQkJCQkvKiBBZGQgcGVuZGluZyBzcGFjZSB0byB0aGUgZm9ybWF0dGVkIHNvdXJjZSBzdHJpbmcuDQotCQkJCURvIG5vdCBvdXRwdXQgYSBzcGFjZSB1bmRlciB0aGUgZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6DQotCQkJCTEpIHRoaXMgaXMgdGhlIGZpcnN0IHBhc3MNCi0JCQkJMikgcHJldmlvdXMgdG9rZW4gaXMgYW4gb3BlbiBwYXJlbg0KLQkJCQkzKSBwcmV2aW91cyB0b2tlbiBpcyBhIHBlcmlvZA0KLQkJCQk0KSBwcmV2aW91cyB0b2tlbiBpcyB0aGUgbG9naWNhbCBjb21wbGltZW50IChlZzogISkNCi0JCQkJNSkgcHJldmlvdXMgdG9rZW4gaXMgdGhlIGJpdHdpc2UgY29tcGxpbWVudCAoZWc6IH4pDQotCQkJCTYpIHByZXZpb3VzIHRva2VuIGlzIHRoZSBvcGVuIGJyYWNrZXQgKGVnOiBbKQ0KLQkJCQk3KSBpbiBhbiBhc3NpZ25tZW50IHN0YXRlbWVudCwgaWYgdGhlIHByZXZpb3VzIHRva2VuIGlzIGFuIA0KLQkJCQlvcGVuIGJyYWNlIG9yIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgY2xvc2UgYnJhY2UNCi0JCQkJOCkgcHJldmlvdXMgdG9rZW4gaXMgYSBzaW5nbGUgbGluZSBjb21tZW50DQotCQkJCSovDQorICAgIC8vIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmljZXIgY29uZGl0aW9uLg0KKyAgIA0KKyAgICBpZiAocGVuZGluZ1NwYWNlDQorICAgICAmJiBpbnNlcnRTcGFjZUFmdGVyKHByZXZpb3VzVG9rZW4pDQorICAgICAmJiAhIChpbkFzc2lnbm1lbnQNCisgICAgICAmJiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkNCisgICAgICYmIHByZXZpb3VzVG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUpIHsNCisgICAgIGlmICgoISAob3B0aW9ucy5jb21wYWN0QXNzaWdubWVudE1vZGUgJiYgdG9rZW4gPT0gVG9rZW5OYW1lRVFVQUwpKSAmJiAhb3BlbkFuZENsb3NlQnJhY2UpDQorICAgICAgc3BhY2UoKTsNCisgICAgfQ0KIA0KLQkJCQlib29sZWFuIG9wZW5BbmRDbG9zZUJyYWNlID0gcHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZVJCUkFDRTsNCisgICAgLy8gQWRkIHRoZSBuZXh0IHRva2VuIHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZy4NCiANCi0JCQkJLy8gdG8gYmUgcmVwbGFjZWQgYnkgYSBuaWNlciBjb25kaXRpb24uDQotCQkJDQotCQkJCWlmIChwZW5kaW5nU3BhY2UNCi0JCQkJCSYmIGluc2VydFNwYWNlQWZ0ZXIocHJldmlvdXNUb2tlbikNCi0JCQkJCSYmICEgKGluQXNzaWdubWVudA0KLQkJCQkJCSYmIChwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZUxCUkFDRSB8fCB0b2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UpKQ0KLQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSkgew0KLQkJCQkJaWYgKCghIChvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVFUVVBTCkpICYmICFvcGVuQW5kQ2xvc2VCcmFjZSkNCi0JCQkJCQlzcGFjZSgpOw0KLQkJCQl9DQorICAgIG91dHB1dEN1cnJlbnRUb2tlbih0b2tlbik7DQorICAgIGlmICh0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSAmJiBvcGVuUGFyZW50aGVzaXNDb3VudCA+IDEpew0KKyAgICAgcGVuZGluZ05ld0xpbmVzID0gMDsNCisgICAgIGN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7DQorICAgICBpbmNyZWFzZUxpbmVEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgDQorICAgIH0NCisgICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsNCisgICB9DQogDQotCQkJCS8vIEFkZCB0aGUgbmV4dCB0b2tlbiB0byB0aGUgZm9ybWF0dGVkIHNvdXJjZSBzdHJpbmcuDQorICAgLy8gV2hpdGVzcGFjZSB0b2tlbnMgZG8gbm90IG5lZWQgdG8gYmUgcmVtZW1iZXJlZC4NCiANCi0JCQkJb3V0cHV0Q3VycmVudFRva2VuKHRva2VuKTsNCi0JCQkJaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FICYmIG9wZW5QYXJlbnRoZXNpc0NvdW50ID4gMSl7DQotCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAwOw0KLQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsNCi0JCQkJCWluY3JlYXNlTGluZURlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICANCi0JCQkJfQ0KLQkJCQlwZW5kaW5nU3BhY2UgPSB0cnVlOw0KLQkJCX0NCisgICBpZiAodG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7DQorICAgIHByZXZpb3VzVG9rZW4gPSB0b2tlbjsNCisgICAgaWYgKHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSw0KKyAgICAgJiYgdG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUNCisgICAgICYmIHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DKSB7DQorICAgICBwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9IHRva2VuOw0KKyAgICB9DQorICAgfQ0KIA0KLQkJCS8vIFdoaXRlc3BhY2UgdG9rZW5zIGRvIG5vdCBuZWVkIHRvIGJlIHJlbWVtYmVyZWQuDQotDQotCQkJaWYgKHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSkgew0KLQkJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47DQotCQkJCWlmICh0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sNCi0JCQkJCSYmIHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FDQotCQkJCQkmJiB0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQykgew0KLQkJCQkJcHJldmlvdXNDb21waWxhYmxlVG9rZW4gPSB0b2tlbjsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCX0NCi0JCW91dHB1dChjb3B5UmVtYWluaW5nU291cmNlKCkpOw0KLQkJZmx1c2hCdWZmZXIoKTsgLy8gZHVtcCB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgc291cmNlIGluIHRoZSBmb3JtYXR0ZWQgb3V0cHV0Lg0KLQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgew0KLQkJb3V0cHV0KGNvcHlSZW1haW5pbmdTb3VyY2UoKSk7DQotCQlmbHVzaEJ1ZmZlcigpOyAvLyBkdW1wIHRoZSBsYXN0IHRva2VuIG9mIHRoZSBzb3VyY2UgaW4gdGhlIGZvcm1hdHRlZCBvdXRwdXQuDQotCX0NCisgIH0NCisgIG91dHB1dChjb3B5UmVtYWluaW5nU291cmNlKCkpOw0KKyAgZmx1c2hCdWZmZXIoKTsgLy8gZHVtcCB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgc291cmNlIGluIHRoZSBmb3JtYXR0ZWQgb3V0cHV0Lg0KKyB9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgew0KKyAgb3V0cHV0KGNvcHlSZW1haW5pbmdTb3VyY2UoKSk7DQorICBmbHVzaEJ1ZmZlcigpOyAvLyBkdW1wIHRoZSBsYXN0IHRva2VuIG9mIHRoZSBzb3VyY2UgaW4gdGhlIGZvcm1hdHRlZCBvdXRwdXQuDQorIH0NCiB9DQogLyoqIA0KICAqIEZvcm1hdHMgYSBnaXZlbiBzb3VyY2Ugc3RyaW5nLCBzdGFydGluZyBpbmRlbnRpbmcgaXQgYXQgZGVwdGggMA0KICAqIHVzaW5nIGRlZmF1bHQgb3B0aW9ucy4NCiAgKi8NCiBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHNvdXJjZVN0cmluZykgew0KLQlyZXR1cm4gZm9ybWF0KHNvdXJjZVN0cmluZywgMCwgbnVsbCk7DQorIHJldHVybiBmb3JtYXQoc291cmNlU3RyaW5nLCAwLCBudWxsKTsNCiB9DQogLyoqIA0KICAqIEZvcm1hdHMgYSBnaXZlbiBzb3VyY2Ugc3RyaW5nLCBzdGFydGluZyBpbmRlbnRpbmcgaXQgYXQgYSBwYXJ0aWN1bGFyIA0KICAqIGRlcHRoIGFuZCB1c2luZyB0aGUgZ2l2ZW4gb3B0aW9ucw0KICAqLw0KIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgaW5pdGlhbEluZGVudGF0aW9uTGV2ZWwsIENvbmZpZ3VyYWJsZU9wdGlvbltdIG9wdGlvbnMpIHsNCi0JQ29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQ29kZUZvcm1hdHRlcihvcHRpb25zKTsNCi0JZm9ybWF0dGVyLnNldEluaXRpYWxJbmRlbnRhdGlvbkxldmVsKGluaXRpYWxJbmRlbnRhdGlvbkxldmVsKTsNCi0JcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRTb3VyY2VTdHJpbmcoc291cmNlU3RyaW5nKTsNCisgQ29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQ29kZUZvcm1hdHRlcihvcHRpb25zKTsNCisgZm9ybWF0dGVyLnNldEluaXRpYWxJbmRlbnRhdGlvbkxldmVsKGluaXRpYWxJbmRlbnRhdGlvbkxldmVsKTsNCisgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRTb3VyY2VTdHJpbmcoc291cmNlU3RyaW5nKTsNCiB9DQogLyoqIA0KICAqIEZvcm1hdHMgdGhlIGNoYXIgYXJyYXkgPGNvZGU+c291cmNlU3RyaW5nPC9jb2RlPiwNCkBAIC04OTEsNTggKzkwMiw2NiBAQAogICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG91cHV0Lg0KICAqLw0KIHB1YmxpYyBTdHJpbmcgZm9ybWF0U291cmNlU3RyaW5nKFN0cmluZyBzb3VyY2VTdHJpbmcpIHsNCi0JY2hhcltdIHNvdXJjZUNoYXJzID0gc291cmNlU3RyaW5nLnRvQ2hhckFycmF5KCk7DQotCWZvcm1hdHRlZFNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlQ2hhcnMubGVuZ3RoKTsNCi0Jc2Nhbm5lci5zZXRTb3VyY2VCdWZmZXIoc291cmNlQ2hhcnMpOw0KLQlmb3JtYXQoKTsNCi0JcmV0dXJuIGZvcm1hdHRlZFNvdXJjZS50b1N0cmluZygpOw0KKyBjaGFyW10gc291cmNlQ2hhcnMgPSBzb3VyY2VTdHJpbmcudG9DaGFyQXJyYXkoKTsNCisgZm9ybWF0dGVkU291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2VDaGFycy5sZW5ndGgpOw0KKyBzY2FubmVyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VDaGFycyk7DQorIGZvcm1hdCgpOw0KKyByZXR1cm4gZm9ybWF0dGVkU291cmNlLnRvU3RyaW5nKCk7DQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFuZCB0YWIgY2hhciBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUNCiAgKiBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tbWVudC4NCiAgKi8NCiBwcml2YXRlIGludCBnZXRDdXJyZW50Q29tbWVudE9mZnNldCgpIHsNCi0JaW50IGxpbmVQdHIgPSBzY2FubmVyLmxpbmVQdHI7DQotCS8vIGlmIHRoZXJlIGlzIG5vIGJlZ2lubmluZyBvZiBsaW5lLCByZXR1cm4gMC4NCi0JaWYgKGxpbmVQdHIgPCAwKQ0KLQkJcmV0dXJuIDA7DQotCWludCBvZmZzZXQgPSAwOw0KLQlpbnQgYmVnaW5uaW5nT2ZMaW5lID0gc2Nhbm5lci5saW5lRW5kc1tsaW5lUHRyXTsNCi0JaW50IGN1cnJlbnRTdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQljaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7DQotCQ0KLQkvLyBmaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQNCi0Jd2hpbGUgKGJlZ2lubmluZ09mTGluZSA+IGN1cnJlbnRTdGFydFBvc2l0aW9uKSB7DQotCQlpZiAobGluZVB0ciA+IDApIHsNCi0JCQliZWdpbm5pbmdPZkxpbmUgPSBzY2FubmVyLmxpbmVFbmRzWy0tbGluZVB0cl07DQotCQl9IGVsc2Ugew0KLQkJCWJlZ2lubmluZ09mTGluZSA9IDA7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCisgaW50IGxpbmVQdHIgPSBzY2FubmVyLmxpbmVQdHI7DQorIC8vIGlmIHRoZXJlIGlzIG5vIGJlZ2lubmluZyBvZiBsaW5lLCByZXR1cm4gMC4NCisgaWYgKGxpbmVQdHIgPCAwKQ0KKyAgcmV0dXJuIDA7DQorIGludCBvZmZzZXQgPSAwOw0KKyBpbnQgYmVnaW5uaW5nT2ZMaW5lID0gc2Nhbm5lci5saW5lRW5kc1tsaW5lUHRyXTsNCisgaW50IGN1cnJlbnRTdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KKyBjaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7DQorIA0KKyAvLyBmaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQNCisgd2hpbGUgKGJlZ2lubmluZ09mTGluZSA+IGN1cnJlbnRTdGFydFBvc2l0aW9uKSB7DQorICBpZiAobGluZVB0ciA+IDApIHsNCisgICBiZWdpbm5pbmdPZkxpbmUgPSBzY2FubmVyLmxpbmVFbmRzWy0tbGluZVB0cl07DQorICB9IGVsc2Ugew0KKyAgIGJlZ2lubmluZ09mTGluZSA9IDA7DQorICAgYnJlYWs7DQorICB9DQorIH0NCiANCi0JZm9yIChpbnQgaSA9IGJlZ2lubmluZ09mTGluZSA7IGkgPCBjdXJyZW50U3RhcnRQb3NpdGlvbiA7IGkrKyl7DQotCQljaGFyIGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbaV07DQotCQlzd2l0Y2goY3VycmVudENoYXJhY3Rlcil7DQotCQkJY2FzZSAnXHQnOg0KLQkJCQlvZmZzZXQgKz0gb3B0aW9ucy50YWJTaXplOw0KLQkJCWNhc2UgJ1xuJzoNCi0JCQljYXNlICdccic6DQotCQkJCWJyZWFrOw0KLQkJCWRlZmF1bHQ6DQotCQkJCW9mZnNldCsrOw0KLQkJfQ0KLQl9DQotCQ0KLQlyZXR1cm4gb2Zmc2V0Ow0KKyBmb3IgKGludCBpID0gYmVnaW5uaW5nT2ZMaW5lIDsgaSA8IGN1cnJlbnRTdGFydFBvc2l0aW9uIDsgaSsrKXsNCisgIGNoYXIgY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtpXTsNCisgIHN3aXRjaChjdXJyZW50Q2hhcmFjdGVyKXsNCisgICBjYXNlICdcdCc6DQorICAgIG9mZnNldCArPSBvcHRpb25zLnRhYlNpemU7DQorICAgY2FzZSAnXG4nOg0KKyAgIGNhc2UgJ1xyJzoNCisgICAgYnJlYWs7DQorICAgZGVmYXVsdDoNCisgICAgb2Zmc2V0Kys7DQorICB9DQorIH0NCisgDQorIHJldHVybiBvZmZzZXQ7DQogfQ0KIC8qKg0KLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGVzY3JpcHRpb25zIGZvciB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMuDQotICogVGhlIGRlc2NyaXB0aW9ucyBtYXkgYmUgY2hhbmdlZCBhbmQgcGFzc2VkIGJhY2sgdG8gYSBkaWZmZXJlbnQNCi0gKiBjb21waWxlci4NCisgKiBSZXR1cm5zIGFsbCB0aGUgb3B0aW9ucyBvZiB0aGUgQ29kZSBGb3JtYXR0ZXIgdG8gYmUgc2hvd24gYnkgdGhlIFVJDQorICoNCisgKiBAcGFyYW0gbG9jYWxlIGphdmEudXRpbC5Mb2NhbGUNCisgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5qYXZhLkNvbmZpZ3VyYWJsZU9wdGlvbltdDQogICovDQogcHVibGljIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQotCXJldHVybiBuZXcgRm9ybWF0dGVyT3B0aW9ucygpLmdldENvbmZpZ3VyYWJsZU9wdGlvbnMobG9jYWxlKTsNCisgU3RyaW5nW10gaWRzID0gQ29uZmlndXJhYmxlT3B0aW9uLmdldElEcyhDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKSxsb2NhbGUpOw0KKyANCisgQ29uZmlndXJhYmxlT3B0aW9uW10gcmVzdWx0ID0gbmV3IENvbmZpZ3VyYWJsZU9wdGlvbltpZHMubGVuZ3RoXTsNCisgZm9yKGludCBpID0gMCA7IGkgPCBpZHMubGVuZ3RoIDsgaSsrKXsNCisgIHJlc3VsdFtpXSA9IG5ldyBDb25maWd1cmFibGVPcHRpb24oaWRzW2ldLGxvY2FsZSk7DQorIH0NCisgDQorIHJldHVybiByZXN1bHQ7DQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG1hcHBlZCBwb3NpdGlvbnMuDQpAQCAtOTUwLDcgKzk2OSw3IEBACiAgKiBAcmV0dXJuIGludFtdDQogICovDQogcHVibGljIGludFtdIGdldE1hcHBlZFBvc2l0aW9ucygpIHsNCi0JcmV0dXJuIG1hcHBlZFBvc2l0aW9uczsNCisgcmV0dXJuIG1hcHBlZFBvc2l0aW9uczsNCiB9DQogLyoqDQogICogUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRva2VuIGdpdmVuIGFzIGFyZ3VtZW50PGJyPg0KQEAgLTk1OSwxMDQgKzk3OCwxMDQgQEAKICAqIEBwYXJhbSB0b2tlbiB0aGUgdG9rZW4gb2Ygd2hpY2ggdGhlIHByaW9yaXR5IGlzIHJlcXVlc3RlZA0KICAqLw0KIHByaXZhdGUgc3RhdGljIGludCBnZXRUb2tlblByaW9yaXR5KGludCB0b2tlbikgew0KLQlzd2l0Y2ggKHRva2VuKSB7DQotCQljYXNlIFRva2VuTmFtZWV4dGVuZHM6DQotCQljYXNlIFRva2VuTmFtZWltcGxlbWVudHM6DQotCQljYXNlIFRva2VuTmFtZXRocm93czoNCi0JCQlyZXR1cm4gMTA7DQotCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6IC8vIDsNCi0JCQlyZXR1cm4gMjA7IA0KLQkJY2FzZSBUb2tlbk5hbWVDT01NQSA6IC8vICwNCi0JCQlyZXR1cm4gMjU7DQotCQljYXNlIFRva2VuTmFtZUVRVUFMIDogLy8gPQ0KLQkJCXJldHVybiAzMDsgDQotCQljYXNlIFRva2VuTmFtZUFORF9BTkQgOiAvLyAmJiANCi0JCWNhc2UgVG9rZW5OYW1lT1JfT1IgOiAvLyB8fCANCi0JCQlyZXR1cm4gNDA7DQotCQljYXNlIFRva2VuTmFtZVFVRVNUSU9OIDogLy8gPyANCi0JCWNhc2UgVG9rZW5OYW1lQ09MT04gOiAvLyA6DQotCQkJcmV0dXJuIDUwOyAvLyBpdCdzIGJldHRlciBjdXR0aW5nIG9uID86IHRoYW4gb24gOw0KLQkJY2FzZSBUb2tlbk5hbWVFUVVBTF9FUVVBTCA6IC8vID09IA0KLQkJY2FzZSBUb2tlbk5hbWVOT1RfRVFVQUwgOiAvLyAhPSANCi0JCQlyZXR1cm4gNjA7DQotCQljYXNlIFRva2VuTmFtZUxFU1MgOiAvLyA8IA0KLQkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDogLy8gPD0gDQotCQljYXNlIFRva2VuTmFtZUdSRUFURVIgOiAvLyA+IA0KLQkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDogLy8gPj0gDQotCQljYXNlIFRva2VuTmFtZWluc3RhbmNlb2YgOiAvLyBpbnN0YW5jZW9mDQotCQkJcmV0dXJuIDcwOw0KLQkJY2FzZSBUb2tlbk5hbWVQTFVTIDogLy8gKyANCi0JCWNhc2UgVG9rZW5OYW1lTUlOVVMgOiAvLyAtIA0KLQkJCXJldHVybiA4MDsNCi0JCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOiAvLyAqIA0KLQkJY2FzZSBUb2tlbk5hbWVESVZJREUgOiAvLyAvIA0KLQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOiAvLyAlIA0KLQkJCXJldHVybiA5MDsNCi0JCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVCA6IC8vIDw8IA0KLQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVCA6IC8vID4+IA0KLQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6IC8vID4+PiANCi0JCQlyZXR1cm4gMTAwOw0KLQkJY2FzZSBUb2tlbk5hbWVBTkQgOiAvLyAmDQotCQljYXNlIFRva2VuTmFtZU9SIDogLy8gfCANCi0JCWNhc2UgVG9rZW5OYW1lWE9SIDogLy8gXiANCi0JCQlyZXR1cm4gMTEwOw0KLQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA6IC8vICo9IA0KLQkJY2FzZSBUb2tlbk5hbWVESVZJREVfRVFVQUwgOiAvLyAvPSANCi0JCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMIDogLy8gJT0gDQotCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOiAvLyArPSANCi0JCWNhc2UgVG9rZW5OYW1lTUlOVVNfRVFVQUwgOiAvLyAtPSANCi0JCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA6IC8vIDw8PSANCi0JCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUwgOiAvLyA+Pj0gDQotCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDogLy8gPj4+PQ0KLQkJY2FzZSBUb2tlbk5hbWVBTkRfRVFVQUwgOiAvLyAmPSANCi0JCWNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDogLy8gXj0gDQotCQljYXNlIFRva2VuTmFtZU9SX0VRVUFMIDogLy8gfD0gDQotCQkJcmV0dXJuIDEyMDsNCi0JCWNhc2UgVG9rZW5OYW1lRE9UIDogLy8gLg0KLQkJCXJldHVybiAxMzA7DQotCQlkZWZhdWx0IDoNCi0JCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7DQotCX0NCisgc3dpdGNoICh0b2tlbikgew0KKyAgY2FzZSBUb2tlbk5hbWVleHRlbmRzOg0KKyAgY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzOg0KKyAgY2FzZSBUb2tlbk5hbWV0aHJvd3M6DQorICAgcmV0dXJuIDEwOw0KKyAgY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOiAvLyA7DQorICAgcmV0dXJuIDIwOyANCisgIGNhc2UgVG9rZW5OYW1lQ09NTUEgOiAvLyAsDQorICAgcmV0dXJuIDI1Ow0KKyAgY2FzZSBUb2tlbk5hbWVFUVVBTCA6IC8vID0NCisgICByZXR1cm4gMzA7IA0KKyAgY2FzZSBUb2tlbk5hbWVBTkRfQU5EIDogLy8gJiYgDQorICBjYXNlIFRva2VuTmFtZU9SX09SIDogLy8gfHwgDQorICAgcmV0dXJuIDQwOw0KKyAgY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gDQorICBjYXNlIFRva2VuTmFtZUNPTE9OIDogLy8gOg0KKyAgIHJldHVybiA1MDsgLy8gaXQncyBiZXR0ZXIgY3V0dGluZyBvbiA/OiB0aGFuIG9uIDsNCisgIGNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOiAvLyA9PSANCisgIGNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gDQorICAgcmV0dXJuIDYwOw0KKyAgY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCANCisgIGNhc2UgVG9rZW5OYW1lTEVTU19FUVVBTCA6IC8vIDw9IA0KKyAgY2FzZSBUb2tlbk5hbWVHUkVBVEVSIDogLy8gPiANCisgIGNhc2UgVG9rZW5OYW1lR1JFQVRFUl9FUVVBTCA6IC8vID49IA0KKyAgY2FzZSBUb2tlbk5hbWVpbnN0YW5jZW9mIDogLy8gaW5zdGFuY2VvZg0KKyAgIHJldHVybiA3MDsNCisgIGNhc2UgVG9rZW5OYW1lUExVUyA6IC8vICsgDQorICBjYXNlIFRva2VuTmFtZU1JTlVTIDogLy8gLSANCisgICByZXR1cm4gODA7DQorICBjYXNlIFRva2VuTmFtZU1VTFRJUExZIDogLy8gKiANCisgIGNhc2UgVG9rZW5OYW1lRElWSURFIDogLy8gLyANCisgIGNhc2UgVG9rZW5OYW1lUkVNQUlOREVSIDogLy8gJSANCisgICByZXR1cm4gOTA7DQorICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlQgOiAvLyA8PCANCisgIGNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOiAvLyA+PiANCisgIGNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQgOiAvLyA+Pj4gDQorICAgcmV0dXJuIDEwMDsNCisgIGNhc2UgVG9rZW5OYW1lQU5EIDogLy8gJg0KKyAgY2FzZSBUb2tlbk5hbWVPUiA6IC8vIHwgDQorICBjYXNlIFRva2VuTmFtZVhPUiA6IC8vIF4gDQorICAgcmV0dXJuIDExMDsNCisgIGNhc2UgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgOiAvLyAqPSANCisgIGNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDogLy8gLz0gDQorICBjYXNlIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTCA6IC8vICU9IA0KKyAgY2FzZSBUb2tlbk5hbWVQTFVTX0VRVUFMIDogLy8gKz0gDQorICBjYXNlIFRva2VuTmFtZU1JTlVTX0VRVUFMIDogLy8gLT0gDQorICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgOiAvLyA8PD0gDQorICBjYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMIDogLy8gPj49IA0KKyAgY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+Pj0NCisgIGNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDogLy8gJj0gDQorICBjYXNlIFRva2VuTmFtZVhPUl9FUVVBTCA6IC8vIF49IA0KKyAgY2FzZSBUb2tlbk5hbWVPUl9FUVVBTCA6IC8vIHw9IA0KKyAgIHJldHVybiAxMjA7DQorICBjYXNlIFRva2VuTmFtZURPVCA6IC8vIC4NCisgICByZXR1cm4gMTMwOw0KKyAgZGVmYXVsdCA6DQorICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOw0KKyB9DQogfQ0KIC8qKg0KICAqIEhhbmRsZXMgdGhlIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBpbnZhbGlkIHRva2VuIGlzIGVuY291bnRlcmVkLg0KICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhcyBiZWVuIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4NCiAgKi8NCiBwcml2YXRlIGJvb2xlYW4gaGFuZGxlSW52YWxpZFRva2VuKEV4Y2VwdGlvbiBlKSB7DQotCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCkNCi0JCXx8IGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhTY2FubmVyLklOVkFMSURfQ0hBUl9JTl9TVFJJTkcpDQotCQl8fCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0VTQ0FQRSkpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQlyZXR1cm4gZmFsc2U7DQorIGlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCkNCisgIHx8IGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhTY2FubmVyLklOVkFMSURfQ0hBUl9JTl9TVFJJTkcpDQorICB8fCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0VTQ0FQRSkpIHsNCisgIHJldHVybiB0cnVlOw0KKyB9DQorICByZXR1cm4gZmFsc2U7DQogfQ0KIHByaXZhdGUgZmluYWwgdm9pZCBpbmNyZWFzZUdsb2JhbERlbHRhKGludCBvZmZzZXQpIHsNCi0JZ2xvYmFsRGVsdGEgKz0gb2Zmc2V0Ow0KKyBnbG9iYWxEZWx0YSArPSBvZmZzZXQ7DQogfQ0KIHByaXZhdGUgZmluYWwgdm9pZCBpbmNyZWFzZUxpbmVEZWx0YShpbnQgb2Zmc2V0KSB7DQotCWxpbmVEZWx0YSArPSBvZmZzZXQ7DQorIGxpbmVEZWx0YSArPSBvZmZzZXQ7DQogfQ0KIHByaXZhdGUgZmluYWwgdm9pZCBpbmNyZWFzZVNwbGl0RGVsdGEoaW50IG9mZnNldCkgew0KLQlzcGxpdERlbHRhICs9IG9mZnNldDsNCisgc3BsaXREZWx0YSArPSBvZmZzZXQ7DQogfQ0KIC8qKg0KICAqIFJldHVybnMgdHJ1ZSBpZiBhIHNwYWNlIGhhcyB0byBiZSBpbnNlcnRlZCBhZnRlciA8Y29kZT5vcGVyYXRvcjwvY29kZT4NCiAgKiBmYWxzZSBvdGhlcndpc2UuDQogICovDQogcHJpdmF0ZSBib29sZWFuIGluc2VydFNwYWNlQWZ0ZXIoaW50IHRva2VuKSB7DQotCXN3aXRjaCAodG9rZW4pew0KLQkJY2FzZSBUb2tlbk5hbWVMUEFSRU46DQotCQljYXNlIFRva2VuTmFtZU5PVDoNCi0JCWNhc2UgVG9rZW5OYW1lVFdJRERMRToNCi0JCWNhc2UgVG9rZW5OYW1lRE9UIDoNCi0JCWNhc2UgMDogLy8gbm8gdG9rZW4NCi0JCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQ6DQotCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FOg0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWRlZmF1bHQ6DQotCQkJcmV0dXJuIHRydWU7DQotCX0NCi0JCQ0KKyBzd2l0Y2ggKHRva2VuKXsNCisgIGNhc2UgVG9rZW5OYW1lTFBBUkVOOg0KKyAgY2FzZSBUb2tlbk5hbWVOT1Q6DQorICBjYXNlIFRva2VuTmFtZVRXSURETEU6DQorICBjYXNlIFRva2VuTmFtZURPVCA6DQorICBjYXNlIDA6IC8vIG5vIHRva2VuDQorICBjYXNlIFRva2VuTmFtZUxCUkFDS0VUOg0KKyAgY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORToNCisgICByZXR1cm4gZmFsc2U7DQorICBkZWZhdWx0Og0KKyAgIHJldHVybiB0cnVlOw0KKyB9DQorICANCiB9DQogLyoqDQogICogUmV0dXJucyB0cnVlIGlmIGEgc3BhY2UgaGFzIHRvIGJlIGluc2VydGVkIGJlZm9yZSA8Y29kZT5vcGVyYXRvcjwvY29kZT4NCkBAIC0xMDY1LDI5ICsxMDg0LDI5IEBACiAgKiAodG8ga25vdyBpZiB0aGUgY29tcGFjdCBhc3NpZ25tZW50IG1vZGUgaXMgb24pLg0KICAqLw0KIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRTcGFjZUJlZm9yZShpbnQgdG9rZW4pIHsNCi0Jc3dpdGNoICh0b2tlbikgew0KLQkJY2FzZSBUb2tlbk5hbWVFUVVBTDoNCi0JCQlyZXR1cm4gKCFvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSk7DQotCQlkZWZhdWx0IDoNCi0JCQlyZXR1cm4gZmFsc2U7DQotCX0NCisgc3dpdGNoICh0b2tlbikgew0KKyAgY2FzZSBUb2tlbk5hbWVFUVVBTDoNCisgICByZXR1cm4gKCFvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSk7DQorICBkZWZhdWx0IDoNCisgICByZXR1cm4gZmFsc2U7DQorIH0NCiB9DQogcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbW1lbnQoaW50IHRva2VuKSB7DQotCWJvb2xlYW4gcmVzdWx0ID0NCi0JdG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIHx8DQotCXRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FIHx8DQotCXRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DOw0KLQlyZXR1cm4gcmVzdWx0Ow0KKyBib29sZWFuIHJlc3VsdCA9DQorIHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyB8fA0KKyB0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSB8fA0KKyB0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQzsNCisgcmV0dXJuIHJlc3VsdDsNCiB9DQogcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpdGVyYWxUb2tlbihpbnQgdG9rZW4pIHsNCi0JYm9vbGVhbiByZXN1bHQgPQ0KLQkJICB0b2tlbiA9PSBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCB8fA0KLQkJICB0b2tlbiA9PSBUb2tlbk5hbWVMb25nTGl0ZXJhbCB8fA0KLQkJICB0b2tlbiA9PSBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCB8fA0KLQkJICB0b2tlbiA9PSBUb2tlbk5hbWVEb3VibGVMaXRlcmFsIHx8DQotCQkgIHRva2VuID09IFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgfHwNCi0JCSAgdG9rZW4gPT0gVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDsNCi0JcmV0dXJuIHJlc3VsdDsNCisgYm9vbGVhbiByZXN1bHQgPQ0KKyAgICB0b2tlbiA9PSBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCB8fA0KKyAgICB0b2tlbiA9PSBUb2tlbk5hbWVMb25nTGl0ZXJhbCB8fA0KKyAgICB0b2tlbiA9PSBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCB8fA0KKyAgICB0b2tlbiA9PSBUb2tlbk5hbWVEb3VibGVMaXRlcmFsIHx8DQorICAgIHRva2VuID09IFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgfHwNCisgICAgdG9rZW4gPT0gVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDsNCisgcmV0dXJuIHJlc3VsdDsNCiB9DQogLyoqDQogICogSWYgdGhlIGxlbmd0aCBvZiA8Y29kZT5vbmVMaW5lQnVmZmVyPC9jb2RlPiBleGNlZWRzIDxjb2RlPm1heExpbmVMZW5ndGg8L2NvZGU+LA0KQEAgLTEwOTYsMjQxICsxMTE1LDI0MSBAQAogICovDQogcHJpdmF0ZSB2b2lkIG5ld0xpbmUoaW50IG5ld0xpbmVDb3VudCkgew0KIA0KLQkvLyBmb3JtYXQgY3VycmVudCBsaW5lDQotCXNwbGl0RGVsdGEgPSAwOw0KLQliZWdpbm5pbmdPZkxpbmVJbmRleCA9IGZvcm1hdHRlZFNvdXJjZS5sZW5ndGgoKTsNCi0JU3RyaW5nIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmVCdWZmZXIudG9TdHJpbmcoKTsNCi0JaWYgKGNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzKSB7DQotCQljb250YWluc09wZW5DbG9zZUJyYWNlcyA9IGZhbHNlOw0KLQkJb3V0cHV0TGluZShjdXJyZW50TGluZSwNCi0JCQlmYWxzZSwNCi0JCQlpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzLA0KLQkJCTAsDQotCQkJLTEsDQotCQkJbnVsbCwNCi0JCQkwKTsNCi0JCWluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMgPSBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWw7DQotCX0gZWxzZSB7DQotCQlvdXRwdXRMaW5lKGN1cnJlbnRMaW5lLA0KLQkJCWZhbHNlLA0KLQkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCwNCi0JCQkwLA0KLQkJCS0xLA0KLQkJCW51bGwsDQotCQkJMCk7DQotCX0NCi0JLy8gZHVtcCBsaW5lIGJyZWFrKHMpDQotCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3TGluZUNvdW50OyBpKyspIHsNCi0JCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOw0KLQkJaW5jcmVhc2VTcGxpdERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7DQotCX0NCi0JLy8gcmVzZXQgZm9ybWF0dGVyIGZvciBuZXh0IGxpbmUNCi0JaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TGluZS5sZW5ndGgoKTsNCi0JY3VycmVudExpbmVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKA0KLQkJCQkJCQljdXJyZW50TGVuZ3RoID4gbWF4TGluZVNpemUNCi0JCQkJCQkJCT8gbWF4TGluZVNpemUgPSBjdXJyZW50TGVuZ3RoDQotCQkJCQkJCQk6IG1heExpbmVTaXplKTsNCi0JDQotCWluY3JlYXNlR2xvYmFsRGVsdGEoc3BsaXREZWx0YSk7DQotCWluY3JlYXNlR2xvYmFsRGVsdGEobGluZURlbHRhKTsNCi0JbGluZURlbHRhID0gMDsNCi0JY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5pdGlhbEluZGVudGF0aW9uTGV2ZWw7DQorIC8vIGZvcm1hdCBjdXJyZW50IGxpbmUNCisgc3BsaXREZWx0YSA9IDA7DQorIGJlZ2lubmluZ09mTGluZUluZGV4ID0gZm9ybWF0dGVkU291cmNlLmxlbmd0aCgpOw0KKyBTdHJpbmcgY3VycmVudExpbmUgPSBjdXJyZW50TGluZUJ1ZmZlci50b1N0cmluZygpOw0KKyBpZiAoY29udGFpbnNPcGVuQ2xvc2VCcmFjZXMpIHsNCisgIGNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzID0gZmFsc2U7DQorICBvdXRwdXRMaW5lKGN1cnJlbnRMaW5lLA0KKyAgIGZhbHNlLA0KKyAgIGluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMsDQorICAgMCwNCisgICAtMSwNCisgICBudWxsLA0KKyAgIDApOw0KKyAgaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlcyA9IGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbDsNCisgfSBlbHNlIHsNCisgIG91dHB1dExpbmUoY3VycmVudExpbmUsDQorICAgZmFsc2UsDQorICAgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsLA0KKyAgIDAsDQorICAgLTEsDQorICAgbnVsbCwNCisgICAwKTsNCisgfQ0KKyAvLyBkdW1wIGxpbmUgYnJlYWsocykNCisgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdMaW5lQ291bnQ7IGkrKykgew0KKyAgZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7DQorICBpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsNCisgfQ0KKyAvLyByZXNldCBmb3JtYXR0ZXIgZm9yIG5leHQgbGluZQ0KKyBpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnRMaW5lLmxlbmd0aCgpOw0KKyBjdXJyZW50TGluZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoDQorICAgICAgIGN1cnJlbnRMZW5ndGggPiBtYXhMaW5lU2l6ZQ0KKyAgICAgICAgPyBtYXhMaW5lU2l6ZSA9IGN1cnJlbnRMZW5ndGgNCisgICAgICAgIDogbWF4TGluZVNpemUpOw0KKyANCisgaW5jcmVhc2VHbG9iYWxEZWx0YShzcGxpdERlbHRhKTsNCisgaW5jcmVhc2VHbG9iYWxEZWx0YShsaW5lRGVsdGEpOw0KKyBsaW5lRGVsdGEgPSAwOw0KKyBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbml0aWFsSW5kZW50YXRpb25MZXZlbDsNCiB9DQogcHJpdmF0ZSBTdHJpbmcgb3BlcmF0b3JTdHJpbmcoaW50IG9wZXJhdG9yKSB7DQotCXN3aXRjaCAob3BlcmF0b3IpIHsNCi0JCWNhc2UgVG9rZW5OYW1lZXh0ZW5kcyA6DQotCQkJcmV0dXJuICJleHRlbmRzIi8qbm9uTkxTKi87DQorIHN3aXRjaCAob3BlcmF0b3IpIHsNCisgIGNhc2UgVG9rZW5OYW1lZXh0ZW5kcyA6DQorICAgcmV0dXJuICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoNCi0JCQlyZXR1cm4gImltcGxlbWVudHMiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1laW1wbGVtZW50cyA6DQorICAgcmV0dXJuICJpbXBsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWV0aHJvd3MgOg0KLQkJCXJldHVybiAidGhyb3dzIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZXRocm93cyA6DQorICAgcmV0dXJuICJ0aHJvd3MiOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6IC8vIDsNCi0JCQlyZXR1cm4gIjsiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDogLy8gOw0KKyAgIHJldHVybiAiOyI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lQ09NTUEgOiAvLyAsDQotCQkJcmV0dXJuICIsIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUNPTU1BIDogLy8gLA0KKyAgIHJldHVybiAiLCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lRVFVQUwgOiAvLyA9DQotCQkJcmV0dXJuICI9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUVRVUFMIDogLy8gPQ0KKyAgIHJldHVybiAiPSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lQU5EX0FORCA6IC8vICYmICgxNS4yMikNCi0JCQlyZXR1cm4gIiYmIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUFORF9BTkQgOiAvLyAmJiAoMTUuMjIpDQorICAgcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lT1JfT1IgOiAvLyB8fCAoMTUuMjMpDQotCQkJcmV0dXJuICJ8fCIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVPUl9PUiA6IC8vIHx8ICgxNS4yMykNCisgICByZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gKDE1LjI0KQ0KLQkJCXJldHVybiAiPyIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gKDE1LjI0KQ0KKyAgIHJldHVybiAiPyI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lQ09MT04gOiAvLyA6ICgxNS4yNCkNCi0JCQlyZXR1cm4gIjoiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lQ09MT04gOiAvLyA6ICgxNS4yNCkNCisgICByZXR1cm4gIjoiOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMIDogLy8gPT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQ0KLQkJCXJldHVybiAiPT0iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOiAvLyA9PSAoMTUuMjAsIDE1LjIwLjEsIDE1LjIwLjIsIDE1LjIwLjMpDQorICAgcmV0dXJuICI9PSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQ0KLQkJCXJldHVybiAiIT0iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQ0KKyAgIHJldHVybiAiIT0iOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZUxFU1MgOiAvLyA8ICgxNS4xOS4xKQ0KLQkJCXJldHVybiAiPCIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCAoMTUuMTkuMSkNCisgICByZXR1cm4gIjwiOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZUxFU1NfRVFVQUwgOiAvLyA8PSAoMTUuMTkuMSkNCi0JCQlyZXR1cm4gIjw9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUxFU1NfRVFVQUwgOiAvLyA8PSAoMTUuMTkuMSkNCisgICByZXR1cm4gIjw9IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSIDogLy8gPiAoMTUuMTkuMSkNCi0JCQlyZXR1cm4gIj4iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6IC8vID4gKDE1LjE5LjEpDQorICAgcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDogLy8gPj0gKDE1LjE5LjEpDQotCQkJcmV0dXJuICI+PSIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDogLy8gPj0gKDE1LjE5LjEpDQorICAgcmV0dXJuICI+PSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1laW5zdGFuY2VvZiA6IC8vIGluc3RhbmNlb2YNCi0JCQlyZXR1cm4gImluc3RhbmNlb2YiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1laW5zdGFuY2VvZiA6IC8vIGluc3RhbmNlb2YNCisgICByZXR1cm4gImluc3RhbmNlb2YiOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZVBMVVMgOiAvLyArICgxNS4xNywgMTUuMTcuMikNCi0JCQlyZXR1cm4gIisiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lUExVUyA6IC8vICsgKDE1LjE3LCAxNS4xNy4yKQ0KKyAgIHJldHVybiAiKyI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lTUlOVVMgOiAvLyAtICgxNS4xNy4yKQ0KLQkJCXJldHVybiAiLSIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVNSU5VUyA6IC8vIC0gKDE1LjE3LjIpDQorICAgcmV0dXJuICItIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWSA6IC8vICogKDE1LjE2LjEpDQotCQkJcmV0dXJuICIqIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZU1VTFRJUExZIDogLy8gKiAoMTUuMTYuMSkNCisgICByZXR1cm4gIioiOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZURJVklERSA6IC8vIC8gKDE1LjE2LjIpDQotCQkJcmV0dXJuICIvIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZURJVklERSA6IC8vIC8gKDE1LjE2LjIpDQorICAgcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOiAvLyAlICgxNS4xNi4zKQ0KLQkJCXJldHVybiAiJSIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOiAvLyAlICgxNS4xNi4zKQ0KKyAgIHJldHVybiAiJSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVCA6IC8vIDw8ICgxNS4xOCkNCi0JCQlyZXR1cm4gIjw8Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlQgOiAvLyA8PCAoMTUuMTgpDQorICAgcmV0dXJuICI8PCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOiAvLyA+PiAoMTUuMTgpDQotCQkJcmV0dXJuICI+PiIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVCA6IC8vID4+ICgxNS4xOCkNCisgICByZXR1cm4gIj4+IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6IC8vID4+PiAoMTUuMTgpDQotCQkJcmV0dXJuICI+Pj4iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQgOiAvLyA+Pj4gKDE1LjE4KQ0KKyAgIHJldHVybiAiPj4+IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVBTkQgOiAvLyAmICgxNS4yMSwgMTUuMjEuMSwgMTUuMjEuMikNCi0JCQlyZXR1cm4gIiYiLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lQU5EIDogLy8gJiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQorICAgcmV0dXJuICImIjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVPUiA6IC8vIHwgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KLQkJCXJldHVybiAifCIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVPUiA6IC8vIHwgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KKyAgIHJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lWE9SIDogLy8gXiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQotCQkJcmV0dXJuICJeIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZVhPUiA6IC8vIF4gKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KKyAgIHJldHVybiAiXiI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgOiAvLyAqPSAoMTUuMjUuMikNCi0JCQlyZXR1cm4gIio9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDogLy8gKj0gKDE1LjI1LjIpDQorICAgcmV0dXJuICIqPSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDogLy8gLz0gKDE1LjI1LjIpDQotCQkJcmV0dXJuICIvPSIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVESVZJREVfRVFVQUwgOiAvLyAvPSAoMTUuMjUuMikNCisgICByZXR1cm4gIi89IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgOiAvLyAlPSAoMTUuMjUuMikNCi0JCQlyZXR1cm4gIiU9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTCA6IC8vICU9ICgxNS4yNS4yKQ0KKyAgIHJldHVybiAiJT0iOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOiAvLyArPSAoMTUuMjUuMikNCi0JCQlyZXR1cm4gIis9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOiAvLyArPSAoMTUuMjUuMikNCisgICByZXR1cm4gIis9IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6IC8vIC09ICgxNS4yNS4yKQ0KLQkJCXJldHVybiAiLT0iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lTUlOVVNfRVFVQUwgOiAvLyAtPSAoMTUuMjUuMikNCisgICByZXR1cm4gIi09IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMIDogLy8gPDw9ICgxNS4yNS4yKQ0KLQkJCXJldHVybiAiPDw9Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgOiAvLyA8PD0gKDE1LjI1LjIpDQorICAgcmV0dXJuICI8PD0iOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMIDogLy8gPj49ICgxNS4yNS4yKQ0KLQkJCXJldHVybiAiPj49Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMIDogLy8gPj49ICgxNS4yNS4yKQ0KKyAgIHJldHVybiAiPj49IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+Pj0gKDE1LjI1LjIpDQotCQkJcmV0dXJuICI+Pj49Ii8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDogLy8gPj4+PSAoMTUuMjUuMikNCisgICByZXR1cm4gIj4+Pj0iOyAvLyROT04tTkxTLTEkDQogDQotCQljYXNlIFRva2VuTmFtZUFORF9FUVVBTCA6IC8vICY9ICgxNS4yNS4yKQ0KLQkJCXJldHVybiAiJj0iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDogLy8gJj0gKDE1LjI1LjIpDQorICAgcmV0dXJuICImPSI7IC8vJE5PTi1OTFMtMSQNCiANCi0JCWNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDogLy8gXj0gKDE1LjI1LjIpDQotCQkJcmV0dXJuICJePSIvKm5vbk5MUyovOw0KKyAgY2FzZSBUb2tlbk5hbWVYT1JfRVFVQUwgOiAvLyBePSAoMTUuMjUuMikNCisgICByZXR1cm4gIl49IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVPUl9FUVVBTCA6IC8vIHw9ICgxNS4yNS4yKQ0KLQkJCXJldHVybiAifD0iLypub25OTFMqLzsNCisgIGNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOiAvLyB8PSAoMTUuMjUuMikNCisgICByZXR1cm4gInw9IjsgLy8kTk9OLU5MUy0xJA0KIA0KLQkJY2FzZSBUb2tlbk5hbWVET1QgOiAvLyAuDQotCQkJcmV0dXJuICIuIi8qbm9uTkxTKi87DQorICBjYXNlIFRva2VuTmFtZURPVCA6IC8vIC4NCisgICByZXR1cm4gIi4iOyAvLyROT04tTkxTLTEkDQogDQotCQlkZWZhdWx0IDoNCi0JCQlyZXR1cm4gIiIvKm5vbk5MUyovOw0KLQl9DQorICBkZWZhdWx0IDoNCisgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisgfQ0KIH0NCiAvKiogDQogICogQXBwZW5kcyA8Y29kZT5zdHJpbmdUb091dHB1dDwvY29kZT4gdG8gdGhlIGZvcm1hdHRlZCBvdXRwdXQuPGJyPg0KICAqIElmIGl0IGNvbnRhaW5zIFxuLCBhcHBlbmQgYSBMSU5FX1NFUEFSQVRPUiBhbmQgaW5kZW50IGFmdGVyIGl0Lg0KICAqLw0KIHByaXZhdGUgdm9pZCBvdXRwdXQoU3RyaW5nIHN0cmluZ1RvT3V0cHV0KSB7DQotCWNoYXIgY3VycmVudENoYXJhY3RlcjsNCi0JZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0cmluZ1RvT3V0cHV0Lmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsNCi0JCWN1cnJlbnRDaGFyYWN0ZXIgPSBzdHJpbmdUb091dHB1dC5jaGFyQXQoaSk7DQotCQlpZiAoY3VycmVudENoYXJhY3RlciAhPSAnXHQnKSB7DQotCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOw0KLQkJfQ0KLQl9DQotCXVwZGF0ZU1hcHBlZFBvc2l0aW9ucyhzY2FubmVyLnN0YXJ0UG9zaXRpb24pOw0KKyBjaGFyIGN1cnJlbnRDaGFyYWN0ZXI7DQorIGZvciAoaW50IGkgPSAwLCBtYXggPSBzdHJpbmdUb091dHB1dC5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKSB7DQorICBjdXJyZW50Q2hhcmFjdGVyID0gc3RyaW5nVG9PdXRwdXQuY2hhckF0KGkpOw0KKyAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1x0Jykgew0KKyAgIGN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsNCisgIH0NCisgfQ0KKyB1cGRhdGVNYXBwZWRQb3NpdGlvbnMoc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsNCiB9DQogLyoqIA0KICAqIEFwcGVuZHMgPGNvZGU+dG9rZW48L2NvZGU+IHRvIHRoZSBmb3JtYXR0ZWQgb3V0cHV0Ljxicj4NCiAgKiBJZiBpdCBjb250YWlucyA8Y29kZT5cbjwvY29kZT4sIGFwcGVuZCBhIExJTkVfU0VQQVJBVE9SIGFuZCBpbmRlbnQgYWZ0ZXIgaXQuDQogICovDQogcHJpdmF0ZSB2b2lkIG91dHB1dEN1cnJlbnRUb2tlbihpbnQgdG9rZW4pIHsNCi0JY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KLQlpbnQgc3RhcnRQb3NpdGlvbiA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCisgY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KKyBpbnQgc3RhcnRQb3NpdGlvbiA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCiANCi0Jc3dpdGNoKHRva2VuKSB7DQotCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoNCi0JCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIDoNCi0JCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOg0KLQkJCWJvb2xlYW4gZW5kT2ZMaW5lID0gZmFsc2U7DQotCQkJaW50IGN1cnJlbnRDb21tZW50T2Zmc2V0ID0gZ2V0Q3VycmVudENvbW1lbnRPZmZzZXQoKTsNCi0JCQlpbnQgYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID0gMDsNCi0JCQlmb3IgKGludCBpID0gc3RhcnRQb3NpdGlvbiwgbWF4ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247IGkgPCBtYXg7IGkrKykgew0KLQkJCQljaGFyIGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbaV07DQotCQkJCXN3aXRjaChjdXJyZW50Q2hhcmFjdGVyKSB7DQotCQkJCQljYXNlICdccicgOg0KLQkJCQkJY2FzZSAnXG4nIDoNCi0JCQkJCQkgZW5kT2ZMaW5lID0gdHJ1ZTsNCi0JCQkJCQkgY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOw0KLQkJCQkJCSBiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOw0KLQkJCQkJCSBicmVhazsNCi0JCQkJCWNhc2UgJ1x0JyA6DQotCQkJCQkJaWYgKGVuZE9mTGluZSkgew0KLQkJCQkJCQkvLyB3ZSByZW1vdmUgYSBtYXhpbXVtIG9mIGN1cnJlbnRDb21tZW50T2Zmc2V0IGNoYXJhY3RlcnMgKHRhYnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZSBudW1iZXJzKS4NCi0JCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzKz1vcHRpb25zLnRhYlNpemU7DQotCQkJCQkJCWlmIChiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPiBjdXJyZW50Q29tbWVudE9mZnNldCkNCi0JCQkJCQkJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsJCQkJCQkNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7DQotCQkJCQkJfQ0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJY2FzZSAnICcgOg0KLQkJCQkJCWlmIChlbmRPZkxpbmUpIHsNCi0JCQkJCQkJLy8gd2UgcmVtb3ZlIGEgbWF4aW11bSBvZiBjdXJyZW50Q29tbWVudE9mZnNldCBjaGFyYWN0ZXJzICh0YWJzIGFyZSBjb252ZXJ0ZWQgdG8gc3BhY2UgbnVtYmVycykuDQotCQkJCQkJCWJlZ2lubmluZ09mTGluZVNwYWNlcysrOw0KLQkJCQkJCQlpZiAoYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID4gY3VycmVudENvbW1lbnRPZmZzZXQpDQotCQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7CQkJCQkJDQotCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOw0KLQkJCQkJCX0NCi0JCQkJCQlicmVhazsNCi0JCQkJCWRlZmF1bHQ6DQotCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID0gMDsNCi0JCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7DQotCQkJCQkJZW5kT2ZMaW5lID0gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChzb3VyY2UsIHN0YXJ0UG9zaXRpb24sIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbik7DQotCX0NCi0JdXBkYXRlTWFwcGVkUG9zaXRpb25zKHN0YXJ0UG9zaXRpb24pOw0KKyBzd2l0Y2godG9rZW4pIHsNCisgIGNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOg0KKyAgY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOg0KKyAgY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSA6DQorICAgYm9vbGVhbiBlbmRPZkxpbmUgPSBmYWxzZTsNCisgICBpbnQgY3VycmVudENvbW1lbnRPZmZzZXQgPSBnZXRDdXJyZW50Q29tbWVudE9mZnNldCgpOw0KKyAgIGludCBiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOw0KKyAgIGZvciAoaW50IGkgPSBzdGFydFBvc2l0aW9uLCBtYXggPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsgaSA8IG1heDsgaSsrKSB7DQorICAgIGNoYXIgY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtpXTsNCisgICAgc3dpdGNoKGN1cnJlbnRDaGFyYWN0ZXIpIHsNCisgICAgIGNhc2UgJ1xyJyA6DQorICAgICBjYXNlICdcbicgOg0KKyAgICAgICBlbmRPZkxpbmUgPSB0cnVlOw0KKyAgICAgICBjdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7DQorICAgICAgIGJlZ2lubmluZ09mTGluZVNwYWNlcyA9IDA7DQorICAgICAgIGJyZWFrOw0KKyAgICAgY2FzZSAnXHQnIDoNCisgICAgICBpZiAoZW5kT2ZMaW5lKSB7DQorICAgICAgIC8vIHdlIHJlbW92ZSBhIG1heGltdW0gb2YgY3VycmVudENvbW1lbnRPZmZzZXQgY2hhcmFjdGVycyAodGFicyBhcmUgY29udmVydGVkIHRvIHNwYWNlIG51bWJlcnMpLg0KKyAgICAgICBiZWdpbm5pbmdPZkxpbmVTcGFjZXMrPW9wdGlvbnMudGFiU2l6ZTsNCisgICAgICAgaWYgKGJlZ2lubmluZ09mTGluZVNwYWNlcyA+IGN1cnJlbnRDb21tZW50T2Zmc2V0KQ0KKyAgICAgICAgY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOyAgICAgIA0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgIGN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgICBjYXNlICcgJyA6DQorICAgICAgaWYgKGVuZE9mTGluZSkgew0KKyAgICAgICAvLyB3ZSByZW1vdmUgYSBtYXhpbXVtIG9mIGN1cnJlbnRDb21tZW50T2Zmc2V0IGNoYXJhY3RlcnMgKHRhYnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZSBudW1iZXJzKS4NCisgICAgICAgYmVnaW5uaW5nT2ZMaW5lU3BhY2VzKys7DQorICAgICAgIGlmIChiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPiBjdXJyZW50Q29tbWVudE9mZnNldCkNCisgICAgICAgIGN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsgICAgICANCisgICAgICB9IGVsc2Ugew0KKyAgICAgICBjdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICAgZGVmYXVsdDoNCisgICAgICBiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOw0KKyAgICAgIGN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsNCisgICAgICBlbmRPZkxpbmUgPSBmYWxzZTsNCisgICAgfQ0KKyAgIH0NCisgICBicmVhazsNCisgIGRlZmF1bHQ6DQorICAgY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKHNvdXJjZSwgc3RhcnRQb3NpdGlvbiwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKTsNCisgfQ0KKyB1cGRhdGVNYXBwZWRQb3NpdGlvbnMoc3RhcnRQb3NpdGlvbik7DQogfQ0KIC8qKg0KICAqIE91dHB1dHMgPGNvZGU+Y3VycmVudFN0cmluZzwvY29kZT46PGJyPg0KQEAgLTEzNDIsMjQ0ICsxMzYxLDI0NCBAQAogICogQHBhcmFtIG9wZXJhdG9yIHZhbHVlIG9mIHRoZSBvcGVyYXRvciBiZWxvbmdpbmcgdG8gPGNvZGU+Y3VycmVudFN0cmluZzwvY29kZT4uDQogICovDQogcHJpdmF0ZSB2b2lkIG91dHB1dExpbmUoDQotCVN0cmluZyBjdXJyZW50U3RyaW5nLCANCi0JYm9vbGVhbiBwcmVJbmRlbnRlZCwgDQotCWludCBkZXB0aCwgDQotCWludCBvcGVyYXRvciwgDQotCWludCBzdWJzdHJpbmdJbmRleCwgDQotCWludFtdIHN0YXJ0U3Vic3RyaW5nSW5kZXhlcywgDQotCWludCBvZmZzZXRJbkdsb2JhbExpbmUpIHsNCisgU3RyaW5nIGN1cnJlbnRTdHJpbmcsIA0KKyBib29sZWFuIHByZUluZGVudGVkLCANCisgaW50IGRlcHRoLCANCisgaW50IG9wZXJhdG9yLCANCisgaW50IHN1YnN0cmluZ0luZGV4LCANCisgaW50W10gc3RhcnRTdWJzdHJpbmdJbmRleGVzLCANCisgaW50IG9mZnNldEluR2xvYmFsTGluZSkgew0KIA0KLQlib29sZWFuIGVtcHR5Rmlyc3RTdWJTdHJpbmcgPSBmYWxzZTsNCi0JU3RyaW5nIG9wZXJhdG9yU3RyaW5nID0gb3BlcmF0b3JTdHJpbmcob3BlcmF0b3IpOw0KLQlib29sZWFuIHBsYWNlT3BlcmF0b3JCZWhpbmQgPSAhYnJlYWtMaW5lQmVmb3JlT3BlcmF0b3Iob3BlcmF0b3IpOw0KLQlib29sZWFuIHBsYWNlT3BlcmF0b3JBaGVhZCA9ICFwbGFjZU9wZXJhdG9yQmVoaW5kOw0KKyBib29sZWFuIGVtcHR5Rmlyc3RTdWJTdHJpbmcgPSBmYWxzZTsNCisgU3RyaW5nIG9wZXJhdG9yU3RyaW5nID0gb3BlcmF0b3JTdHJpbmcob3BlcmF0b3IpOw0KKyBib29sZWFuIHBsYWNlT3BlcmF0b3JCZWhpbmQgPSAhYnJlYWtMaW5lQmVmb3JlT3BlcmF0b3Iob3BlcmF0b3IpOw0KKyBib29sZWFuIHBsYWNlT3BlcmF0b3JBaGVhZCA9ICFwbGFjZU9wZXJhdG9yQmVoaW5kOw0KIA0KLQkvLyBkdW1wIHByZWZpeCBvcGVyYXRvcj8NCi0JaWYgKHBsYWNlT3BlcmF0b3JBaGVhZCkgew0KLQkJaWYgKCFwcmVJbmRlbnRlZCkgew0KLQkJCWR1bXBUYWIoZGVwdGgpOw0KLQkJCXByZUluZGVudGVkID0gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvcGVyYXRvciAhPSAwKSB7DQotCQkJaWYgKGluc2VydFNwYWNlQmVmb3JlKG9wZXJhdG9yKSkgew0KLQkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCcgJyk7DQotCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsNCi0JCQl9DQotCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcGVyYXRvclN0cmluZyk7DQotCQkJaW5jcmVhc2VTcGxpdERlbHRhKG9wZXJhdG9yU3RyaW5nLmxlbmd0aCgpKTsNCisgLy8gZHVtcCBwcmVmaXggb3BlcmF0b3I/DQorIGlmIChwbGFjZU9wZXJhdG9yQWhlYWQpIHsNCisgIGlmICghcHJlSW5kZW50ZWQpIHsNCisgICBkdW1wVGFiKGRlcHRoKTsNCisgICBwcmVJbmRlbnRlZCA9IHRydWU7DQorICB9DQorICBpZiAob3BlcmF0b3IgIT0gMCkgew0KKyAgIGlmIChpbnNlcnRTcGFjZUJlZm9yZShvcGVyYXRvcikpIHsNCisgICAgZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KKyAgICBpbmNyZWFzZVNwbGl0RGVsdGEoMSk7DQorICAgfQ0KKyAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3BlcmF0b3JTdHJpbmcpOw0KKyAgIGluY3JlYXNlU3BsaXREZWx0YShvcGVyYXRvclN0cmluZy5sZW5ndGgoKSk7DQogDQotCQkJaWYgKGluc2VydFNwYWNlQWZ0ZXIob3BlcmF0b3IpDQotCQkJCSYmIG9wZXJhdG9yICE9IFRva2VuTmFtZWltcGxlbWVudHMNCi0JCQkJJiYgb3BlcmF0b3IgIT0gVG9rZW5OYW1lZXh0ZW5kcw0KLQkJCQkmJiBvcGVyYXRvciAhPSBUb2tlbk5hbWV0aHJvd3MpIHsNCi0JCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KLQkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCVNwbGl0TGluZSBzcGxpdExpbmUgPSBudWxsOw0KLQlpZiAob3B0aW9ucy5tYXhMaW5lTGVuZ3RoID09IDANCi0JCXx8IGN1cnJlbnRTdHJpbmcubGVuZ3RoKCkgPCBvcHRpb25zLm1heExpbmVMZW5ndGgNCi0JCXx8IChzcGxpdExpbmUgPSBzcGxpdChjdXJyZW50U3RyaW5nLCBvZmZzZXRJbkdsb2JhbExpbmUpKSA9PSBudWxsKSB7DQotCQkvLyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2Ygb3BlcmF0b3IsIG91dHB1dHMgbmV3IGxpbmUgYmVmb3JlIG9mIGFmdGVyIGR1bXBpbmcgaXQNCi0JCS8vIGluZGVudCBiZWZvcmUgcG9zdGZpeCBvcGVyYXRvcg0KLQkJLy8gaW5kZW50IGFsc28gd2hlbiB0aGUgbGluZSBjYW5ub3QgYmUgc3BsaXQNCisgICBpZiAoaW5zZXJ0U3BhY2VBZnRlcihvcGVyYXRvcikNCisgICAgJiYgb3BlcmF0b3IgIT0gVG9rZW5OYW1laW1wbGVtZW50cw0KKyAgICAmJiBvcGVyYXRvciAhPSBUb2tlbk5hbWVleHRlbmRzDQorICAgICYmIG9wZXJhdG9yICE9IFRva2VuTmFtZXRocm93cykgew0KKyAgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCcgJyk7DQorICAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgICB9DQorICB9DQorIH0NCisgU3BsaXRMaW5lIHNwbGl0TGluZSA9IG51bGw7DQorIGlmIChvcHRpb25zLm1heExpbmVMZW5ndGggPT0gMA0KKyAgfHwgY3VycmVudFN0cmluZy5sZW5ndGgoKSA8IG9wdGlvbnMubWF4TGluZUxlbmd0aA0KKyAgfHwgKHNwbGl0TGluZSA9IHNwbGl0KGN1cnJlbnRTdHJpbmcsIG9mZnNldEluR2xvYmFsTGluZSkpID09IG51bGwpIHsNCisgIC8vIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBvcGVyYXRvciwgb3V0cHV0cyBuZXcgbGluZSBiZWZvcmUgb2YgYWZ0ZXIgZHVtcGluZyBpdA0KKyAgLy8gaW5kZW50IGJlZm9yZSBwb3N0Zml4IG9wZXJhdG9yDQorICAvLyBpbmRlbnQgYWxzbyB3aGVuIHRoZSBsaW5lIGNhbm5vdCBiZSBzcGxpdA0KIA0KLQkJaWYgKG9wZXJhdG9yID09IFRva2VuTmFtZWV4dGVuZHMNCi0JCQl8fCBvcGVyYXRvciA9PSBUb2tlbk5hbWVpbXBsZW1lbnRzDQotCQkJfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1ldGhyb3dzKSB7DQotCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KLQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsNCi0JCX0NCisgIGlmIChvcGVyYXRvciA9PSBUb2tlbk5hbWVleHRlbmRzDQorICAgfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1laW1wbGVtZW50cw0KKyAgIHx8IG9wZXJhdG9yID09IFRva2VuTmFtZXRocm93cykgew0KKyAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCisgICBpbmNyZWFzZVNwbGl0RGVsdGEoMSk7DQorICB9DQogDQotCQlpZiAocGxhY2VPcGVyYXRvckJlaGluZCkgew0KLQkJCWlmICghcHJlSW5kZW50ZWQpIHsNCi0JCQkJZHVtcFRhYihkZXB0aCk7DQotCQkJfQ0KLQkJfQ0KKyAgaWYgKHBsYWNlT3BlcmF0b3JCZWhpbmQpIHsNCisgICBpZiAoIXByZUluZGVudGVkKSB7DQorICAgIGR1bXBUYWIoZGVwdGgpOw0KKyAgIH0NCisgIH0NCiANCi0JCWJvb2xlYW4gY29udGFpbnNNdWx0aUxpbmVDb21tZW50ID0gY3VycmVudFN0cmluZy5sYXN0SW5kZXhPZigiLyoiLypub25OTFMqLykgIT0gLTE7DQotCQlpbnQgbnVtYmVyT2ZTcGFjZXMgPSAwOw0KLQkJaW50IG1heCA9IGN1cnJlbnRTdHJpbmcubGVuZ3RoKCk7DQotCQl1cGRhdGVNYXBwZWRQb3NpdGlvbnNXaGlsZVNwbGl0dGluZygNCi0JCQliZWdpbm5pbmdPZkxpbmVJbmRleCwgDQotCQkJYmVnaW5uaW5nT2ZMaW5lSW5kZXggKyBtYXgpOyANCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCi0JCQljaGFyIGN1cnJlbnRDaGFyID0gY3VycmVudFN0cmluZy5jaGFyQXQoaSk7DQotCQkJc3dpdGNoIChjdXJyZW50Q2hhcikgew0KLQkJCQljYXNlICdccicgOg0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgJ1xuJyA6DQotCQkJCQlpZiAoaSAhPSBtYXggLSAxKSB7DQotCQkJCQkJLy8gZml4IGZvciAxRkZZTDVDOiBMRkNPTTpBTEwgLSBJbmNvcnJlY3QgaW5kZW50YXRpb24gd2hlbiBzcGxpdCB3aXRoIGEgY29tbWVudCBpbnNpZGUgYSBjb25kaXRpb24NCi0JCQkJCQkvLyBhIHN1YnN0cmluZyBjYW5ub3QgZW5kIHdpdGggYSBsaW5lU2VwYXJhdG9yU2VxdWVuY2UsDQotCQkJCQkJLy8gZXhjZXB0IGlmIGl0IGhhcyBiZWVuIGFkZGVkIGJ5IGZvcm1hdCgpIGFmdGVyIGEgb25lLWxpbmUgY29tbWVudA0KLQkJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOw0KLQkJCQkJCWluY3JlYXNlU3BsaXREZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOw0KKyAgYm9vbGVhbiBjb250YWluc011bHRpTGluZUNvbW1lbnQgPSBjdXJyZW50U3RyaW5nLmxhc3RJbmRleE9mKCIvKiIpICE9IC0xOyAvLyROT04tTkxTLTEkDQorICBpbnQgbnVtYmVyT2ZTcGFjZXMgPSAwOw0KKyAgaW50IG1heCA9IGN1cnJlbnRTdHJpbmcubGVuZ3RoKCk7DQorICB1cGRhdGVNYXBwZWRQb3NpdGlvbnNXaGlsZVNwbGl0dGluZygNCisgICBiZWdpbm5pbmdPZkxpbmVJbmRleCwgDQorICAgYmVnaW5uaW5nT2ZMaW5lSW5kZXggKyBtYXgpOyANCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICBjaGFyIGN1cnJlbnRDaGFyID0gY3VycmVudFN0cmluZy5jaGFyQXQoaSk7DQorICAgc3dpdGNoIChjdXJyZW50Q2hhcikgew0KKyAgICBjYXNlICdccicgOg0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1xuJyA6DQorICAgICBpZiAoaSAhPSBtYXggLSAxKSB7DQorICAgICAgLy8gZml4IGZvciAxRkZZTDVDOiBMRkNPTTpBTEwgLSBJbmNvcnJlY3QgaW5kZW50YXRpb24gd2hlbiBzcGxpdCB3aXRoIGEgY29tbWVudCBpbnNpZGUgYSBjb25kaXRpb24NCisgICAgICAvLyBhIHN1YnN0cmluZyBjYW5ub3QgZW5kIHdpdGggYSBsaW5lU2VwYXJhdG9yU2VxdWVuY2UsDQorICAgICAgLy8gZXhjZXB0IGlmIGl0IGhhcyBiZWVuIGFkZGVkIGJ5IGZvcm1hdCgpIGFmdGVyIGEgb25lLWxpbmUgY29tbWVudA0KKyAgICAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOw0KKyAgICAgIGluY3JlYXNlU3BsaXREZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOw0KIA0KLQkJCQkJCWlmIChjb250YWluc011bHRpTGluZUNvbW1lbnQpIHsNCi0JCQkJCQkJLy8gZml4IGZvciAxRkdHUUNOOiBMRkNPTTpBTEwgLSBTcGFjZSBtYW5hZ2VtZW50IGluIGNvbW1lbnRzIGZvciB0aGUgZm9ybWF0dGVyDQotCQkJCQkJCWR1bXBUYWIoY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsKTsNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQkvLyAxRkdERFY2OiBMRkNPTTpXSU45OCAtIFdlaXJkIHNwbGl0dGluZyBvbiBtZXNzYWdlIGV4cHJlc3Npb24NCi0JCQkJCQkJZHVtcFRhYihkZXB0aCAtIDEpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQlkZWZhdWx0IDoNCi0JCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoY3VycmVudENoYXIpOw0KLQkJCX0NCi0JCX0NCisgICAgICBpZiAoY29udGFpbnNNdWx0aUxpbmVDb21tZW50KSB7DQorICAgICAgIC8vIGZpeCBmb3IgMUZHR1FDTjogTEZDT006QUxMIC0gU3BhY2UgbWFuYWdlbWVudCBpbiBjb21tZW50cyBmb3IgdGhlIGZvcm1hdHRlcg0KKyAgICAgICBkdW1wVGFiKGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgLy8gMUZHRERWNjogTEZDT006V0lOOTggLSBXZWlyZCBzcGxpdHRpbmcgb24gbWVzc2FnZSBleHByZXNzaW9uDQorICAgICAgIGR1bXBUYWIoZGVwdGggLSAxKTsNCisgICAgICB9DQorICAgICB9DQorICAgICBicmVhazsNCisgICAgZGVmYXVsdCA6DQorICAgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKGN1cnJlbnRDaGFyKTsNCisgICB9DQorICB9DQogDQotCQkvLyB1cGRhdGUgcG9zaXRpb25zIGluc2lkZSB0aGUgbWFwcGVkUG9zaXRpb25zIHRhYmxlDQotCQlpZiAoc3Vic3RyaW5nSW5kZXggIT0gLTEpIHsNCi0JCQlpbnQgc3RhcnRQb3NpdGlvbiA9IA0KLQkJCQliZWdpbm5pbmdPZkxpbmVJbmRleCArIHN0YXJ0U3Vic3RyaW5nSW5kZXhlc1tzdWJzdHJpbmdJbmRleF07IA0KLQkJCXVwZGF0ZU1hcHBlZFBvc2l0aW9uc1doaWxlU3BsaXR0aW5nKHN0YXJ0UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBtYXgpOw0KKyAgLy8gdXBkYXRlIHBvc2l0aW9ucyBpbnNpZGUgdGhlIG1hcHBlZFBvc2l0aW9ucyB0YWJsZQ0KKyAgaWYgKHN1YnN0cmluZ0luZGV4ICE9IC0xKSB7DQorICAgaW50IHN0YXJ0UG9zaXRpb24gPSANCisgICAgYmVnaW5uaW5nT2ZMaW5lSW5kZXggKyBzdGFydFN1YnN0cmluZ0luZGV4ZXNbc3Vic3RyaW5nSW5kZXhdOyANCisgICB1cGRhdGVNYXBwZWRQb3NpdGlvbnNXaGlsZVNwbGl0dGluZyhzdGFydFBvc2l0aW9uLCBzdGFydFBvc2l0aW9uICsgbWF4KTsNCiANCi0JCQkvLyBjb21wdXRlIHRoZSBzcGxpdERlbHRhIHJlc3VsdGluZyB3aXRoIHRoZSBvcGVyYXRvciBhbmQgYmxhbmsgcmVtb3ZhbA0KLQkJCWlmIChzdWJzdHJpbmdJbmRleCArIDEgIT0gc3RhcnRTdWJzdHJpbmdJbmRleGVzLmxlbmd0aCkgew0KLQkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoDQotCQkJCQlzdGFydFN1YnN0cmluZ0luZGV4ZXNbc3Vic3RyaW5nSW5kZXhdDQotCQkJCQkJKyBtYXgNCi0JCQkJCQktIHN0YXJ0U3Vic3RyaW5nSW5kZXhlc1tzdWJzdHJpbmdJbmRleA0KLQkJCQkJCSsgMV0pOyANCi0JCQl9DQotCQl9DQotCQkvLyBkdW1wIHBvc3RmaXggb3BlcmF0b3I/DQotCQlpZiAocGxhY2VPcGVyYXRvckJlaGluZCkgew0KLQkJCWlmIChpbnNlcnRTcGFjZUJlZm9yZShvcGVyYXRvcikpIHsNCi0JCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KLQkJCQlpZiAob3BlcmF0b3IgIT0gMCkgew0KLQkJCQkJaW5jcmVhc2VTcGxpdERlbHRhKDEpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3BlcmF0b3JTdHJpbmcpOw0KLQkJCWlmIChvcGVyYXRvciAhPSAwKSB7DQotCQkJCWluY3JlYXNlU3BsaXREZWx0YShvcGVyYXRvclN0cmluZy5sZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuOw0KLQl9DQorICAgLy8gY29tcHV0ZSB0aGUgc3BsaXREZWx0YSByZXN1bHRpbmcgd2l0aCB0aGUgb3BlcmF0b3IgYW5kIGJsYW5rIHJlbW92YWwNCisgICBpZiAoc3Vic3RyaW5nSW5kZXggKyAxICE9IHN0YXJ0U3Vic3RyaW5nSW5kZXhlcy5sZW5ndGgpIHsNCisgICAgaW5jcmVhc2VTcGxpdERlbHRhKA0KKyAgICAgc3RhcnRTdWJzdHJpbmdJbmRleGVzW3N1YnN0cmluZ0luZGV4XQ0KKyAgICAgICsgbWF4DQorICAgICAgLSBzdGFydFN1YnN0cmluZ0luZGV4ZXNbc3Vic3RyaW5nSW5kZXgNCisgICAgICArIDFdKTsgDQorICAgfQ0KKyAgfQ0KKyAgLy8gZHVtcCBwb3N0Zml4IG9wZXJhdG9yPw0KKyAgaWYgKHBsYWNlT3BlcmF0b3JCZWhpbmQpIHsNCisgICBpZiAoaW5zZXJ0U3BhY2VCZWZvcmUob3BlcmF0b3IpKSB7DQorICAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCisgICAgaWYgKG9wZXJhdG9yICE9IDApIHsNCisgICAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgICAgfQ0KKyAgIH0NCisgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsNCisgICBpZiAob3BlcmF0b3IgIT0gMCkgew0KKyAgICBpbmNyZWFzZVNwbGl0RGVsdGEob3BlcmF0b3JTdHJpbmcubGVuZ3RoKCkpOw0KKyAgIH0NCisgIH0NCisgIHJldHVybjsNCisgfQ0KIA0KLQkvLyBmaXggZm9yIDFGRzBCQTM6IExGQ09NOldJTjk4IC0gV2VpcmQgc3BsaXR0aW5nIG9uIGludGVyZmFjZXMNCi0JLy8gZXh0ZW5kcyBoYXMgdG8gc3RhbmQgYWxvbmUgb24gYSBsaW5lIHdoZW4gY3VycmVudFN0cmluZyBoYXMgYmVlbiBzcGxpdC4NCi0JaWYgKG9wdGlvbnMubWF4TGluZUxlbmd0aCAhPSAwDQotCQkmJiBzcGxpdExpbmUgIT0gbnVsbA0KLQkJJiYgKG9wZXJhdG9yID09IFRva2VuTmFtZWV4dGVuZHMNCi0JCQl8fCBvcGVyYXRvciA9PSBUb2tlbk5hbWVpbXBsZW1lbnRzDQotCQkJfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1ldGhyb3dzKSkgew0KLQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7DQotCQlpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsNCisgLy8gZml4IGZvciAxRkcwQkEzOiBMRkNPTTpXSU45OCAtIFdlaXJkIHNwbGl0dGluZyBvbiBpbnRlcmZhY2VzDQorIC8vIGV4dGVuZHMgaGFzIHRvIHN0YW5kIGFsb25lIG9uIGEgbGluZSB3aGVuIGN1cnJlbnRTdHJpbmcgaGFzIGJlZW4gc3BsaXQuDQorIGlmIChvcHRpb25zLm1heExpbmVMZW5ndGggIT0gMA0KKyAgJiYgc3BsaXRMaW5lICE9IG51bGwNCisgICYmIChvcGVyYXRvciA9PSBUb2tlbk5hbWVleHRlbmRzDQorICAgfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1laW1wbGVtZW50cw0KKyAgIHx8IG9wZXJhdG9yID09IFRva2VuTmFtZXRocm93cykpIHsNCisgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOw0KKyAgaW5jcmVhc2VTcGxpdERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7DQogDQotCQlkdW1wVGFiKGRlcHRoICsgMSk7DQotCX0gZWxzZSB7DQotCQlpZiAob3BlcmF0b3IgPT0gVG9rZW5OYW1lZXh0ZW5kcw0KLQkJCXx8IG9wZXJhdG9yID09IFRva2VuTmFtZWltcGxlbWVudHMNCi0JCQl8fCBvcGVyYXRvciA9PSBUb2tlbk5hbWV0aHJvd3MpIHsNCi0JCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCcgJyk7DQotCQkJaW5jcmVhc2VTcGxpdERlbHRhKDEpOw0KLQkJfQ0KLQl9DQorICBkdW1wVGFiKGRlcHRoICsgMSk7DQorIH0gZWxzZSB7DQorICBpZiAob3BlcmF0b3IgPT0gVG9rZW5OYW1lZXh0ZW5kcw0KKyAgIHx8IG9wZXJhdG9yID09IFRva2VuTmFtZWltcGxlbWVudHMNCisgICB8fCBvcGVyYXRvciA9PSBUb2tlbk5hbWV0aHJvd3MpIHsNCisgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCcgJyk7DQorICAgaW5jcmVhc2VTcGxpdERlbHRhKDEpOw0KKyAgfQ0KKyB9DQogDQotCS8vIHBlcmZvcm0gYWN0dWFsIHNwbGl0dGluZw0KLQlTdHJpbmcgcmVzdWx0W10gPSBzcGxpdExpbmUuc3Vic3RyaW5nczsNCi0JaW50W10gc3BsaXRPcGVyYXRvcnMgPSBzcGxpdExpbmUub3BlcmF0b3JzOw0KLQlpbnRbXSBzcGxpdExpbmVTdGFydEluZGV4ZXMgPSBzcGxpdExpbmUuc3RhcnRTdWJzdHJpbmdzSW5kZXhlczsNCisgLy8gcGVyZm9ybSBhY3R1YWwgc3BsaXR0aW5nDQorIFN0cmluZyByZXN1bHRbXSA9IHNwbGl0TGluZS5zdWJzdHJpbmdzOw0KKyBpbnRbXSBzcGxpdE9wZXJhdG9ycyA9IHNwbGl0TGluZS5vcGVyYXRvcnM7DQorIGludFtdIHNwbGl0TGluZVN0YXJ0SW5kZXhlcyA9IHNwbGl0TGluZS5zdGFydFN1YnN0cmluZ3NJbmRleGVzOw0KIA0KLQlpZiAocmVzdWx0WzBdLmxlbmd0aCgpID09IDApIHsNCi0JCS8vIHdoZW4gdGhlIHN1YnN0cmluZyAwIGlzIG51bGwsIHRoZSBzdWJzdHJpbmcgMSBpcyBjb3JyZWN0bHkgaW5kZW50ZWQuDQotCQlkZXB0aC0tOw0KLQkJZW1wdHlGaXJzdFN1YlN0cmluZyA9IHRydWU7DQotCX0NCi0JLy8gdGhlIG9wZXJhdG9yIGdvaW5nIGluIGZyb250IG9mIHRoZSByZXN1bHRbMF0gc3RyaW5nIGlzIHRoZSBvcGVyYXRvciBwYXJhbWV0ZXINCisgaWYgKHJlc3VsdFswXS5sZW5ndGgoKSA9PSAwKSB7DQorICAvLyB3aGVuIHRoZSBzdWJzdHJpbmcgMCBpcyBudWxsLCB0aGUgc3Vic3RyaW5nIDEgaXMgY29ycmVjdGx5IGluZGVudGVkLg0KKyAgZGVwdGgtLTsNCisgIGVtcHR5Rmlyc3RTdWJTdHJpbmcgPSB0cnVlOw0KKyB9DQorIC8vIHRoZSBvcGVyYXRvciBnb2luZyBpbiBmcm9udCBvZiB0aGUgcmVzdWx0WzBdIHN0cmluZyBpcyB0aGUgb3BlcmF0b3IgcGFyYW1ldGVyDQogDQotCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXN1bHQubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsNCi0JCS8vIHRoZSBuZXcgZGVwdGggaXMgdGhlIGN1cnJlbnQgb25lIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnN0cmluZywNCi0JCS8vIHRoZSBjdXJyZW50IG9uZSArIDEgb3RoZXJ3aXNlLg0KKyBmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorICAvLyB0aGUgbmV3IGRlcHRoIGlzIHRoZSBjdXJyZW50IG9uZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzdHJpbmcsDQorICAvLyB0aGUgY3VycmVudCBvbmUgKyAxIG90aGVyd2lzZS4NCiANCi0JCS8vIGlmIHRoZSBzdWJzdHJpbmcgaXMgYSBjb21tZW50LCB1c2UgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gTGV2ZWwgaW5zdGVhZCBvZiB0aGUgZGVwdGgNCi0JCS8vICgtMSBiZWNhdXNlIHRoZSBvdXB1dGxpbmUgaW5jcmVhc2VzIGRlcHRoKS4NCi0JCS8vIChmaXggZm9yIDFGRkM3MlI6IExGQ09NOkFMTCAtIEluY29ycmVjdCBsaW5lIHNwbGl0IGluIHByZXNlbmNlIG9mIGxpbmUgY29tbWVudHMpDQotCQlTdHJpbmcgY3VycmVudFJlc3VsdCA9IHJlc3VsdFtpXTsNCisgIC8vIGlmIHRoZSBzdWJzdHJpbmcgaXMgYSBjb21tZW50LCB1c2UgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gTGV2ZWwgaW5zdGVhZCBvZiB0aGUgZGVwdGgNCisgIC8vICgtMSBiZWNhdXNlIHRoZSBvdXB1dGxpbmUgaW5jcmVhc2VzIGRlcHRoKS4NCisgIC8vIChmaXggZm9yIDFGRkM3MlI6IExGQ09NOkFMTCAtIEluY29ycmVjdCBsaW5lIHNwbGl0IGluIHByZXNlbmNlIG9mIGxpbmUgY29tbWVudHMpDQorICBTdHJpbmcgY3VycmVudFJlc3VsdCA9IHJlc3VsdFtpXTsNCiANCi0JCWlmIChjdXJyZW50UmVzdWx0Lmxlbmd0aCgpICE9IDAgfHwgc3BsaXRPcGVyYXRvcnNbaV0gIT0gMCkgew0KLQkJCWludCBuZXdEZXB0aCA9IA0KLQkJCQkoY3VycmVudFJlc3VsdC5zdGFydHNXaXRoKCIvKiIvKm5vbk5MUyovKSB8fCBjdXJyZW50UmVzdWx0LnN0YXJ0c1dpdGgoIi8vIi8qbm9uTkxTKi8pKQ0KLQkJCQkJPyBpbmRlbnRhdGlvbkxldmVsIC0gMQ0KLQkJCQkJOiBkZXB0aDsgDQotCQkJb3V0cHV0TGluZSgNCi0JCQkJY3VycmVudFJlc3VsdCwgDQotCQkJCWkgPT0gMCB8fCAoaSA9PSAxICYmIGVtcHR5Rmlyc3RTdWJTdHJpbmcpID8gcHJlSW5kZW50ZWQgOiBmYWxzZSwgDQotCQkJCWkgPT0gMCA/IG5ld0RlcHRoIDogbmV3RGVwdGggKyAxLCANCi0JCQkJc3BsaXRPcGVyYXRvcnNbaV0sIA0KLQkJCQlpLCANCi0JCQkJc3BsaXRMaW5lLnN0YXJ0U3Vic3RyaW5nc0luZGV4ZXMsIA0KLQkJCQljdXJyZW50U3RyaW5nLmluZGV4T2YoY3VycmVudFJlc3VsdCkpOyANCi0JCQlpZiAoaSAhPSBtYXggLSAxKSB7DQotCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOw0KLQkJCQlpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JaWYgKHJlc3VsdC5sZW5ndGggPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoIC0gMSkgew0KLQkgICAgaW50IGxhc3RPcGVyYXRvciA9IHNwbGl0T3BlcmF0b3JzW3Jlc3VsdC5sZW5ndGhdOw0KLQkgICAgU3RyaW5nIGxhc3RPcGVyYXRvclN0cmluZyA9IG9wZXJhdG9yU3RyaW5nKGxhc3RPcGVyYXRvcik7DQotCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsNCi0JCWluY3JlYXNlU3BsaXREZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOw0KKyAgaWYgKGN1cnJlbnRSZXN1bHQubGVuZ3RoKCkgIT0gMCB8fCBzcGxpdE9wZXJhdG9yc1tpXSAhPSAwKSB7DQorICAgaW50IG5ld0RlcHRoID0gDQorICAgIChjdXJyZW50UmVzdWx0LnN0YXJ0c1dpdGgoIi8qIikgfHwgY3VycmVudFJlc3VsdC5zdGFydHNXaXRoKCIvLyIpKSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisgICAgID8gaW5kZW50YXRpb25MZXZlbCAtIDENCisgICAgIDogZGVwdGg7IA0KKyAgIG91dHB1dExpbmUoDQorICAgIGN1cnJlbnRSZXN1bHQsIA0KKyAgICBpID09IDAgfHwgKGkgPT0gMSAmJiBlbXB0eUZpcnN0U3ViU3RyaW5nKSA/IHByZUluZGVudGVkIDogZmFsc2UsIA0KKyAgICBpID09IDAgPyBuZXdEZXB0aCA6IG5ld0RlcHRoICsgMSwgDQorICAgIHNwbGl0T3BlcmF0b3JzW2ldLCANCisgICAgaSwgDQorICAgIHNwbGl0TGluZS5zdGFydFN1YnN0cmluZ3NJbmRleGVzLCANCisgICAgY3VycmVudFN0cmluZy5pbmRleE9mKGN1cnJlbnRSZXN1bHQpKTsgDQorICAgaWYgKGkgIT0gbWF4IC0gMSkgew0KKyAgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsNCisgICAgaW5jcmVhc2VTcGxpdERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7DQorICAgfQ0KKyAgfQ0KKyB9DQorIGlmIChyZXN1bHQubGVuZ3RoID09IHNwbGl0T3BlcmF0b3JzLmxlbmd0aCAtIDEpIHsNCisgICAgIGludCBsYXN0T3BlcmF0b3IgPSBzcGxpdE9wZXJhdG9yc1tyZXN1bHQubGVuZ3RoXTsNCisgICAgIFN0cmluZyBsYXN0T3BlcmF0b3JTdHJpbmcgPSBvcGVyYXRvclN0cmluZyhsYXN0T3BlcmF0b3IpOw0KKyAgZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7DQorICBpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsNCiANCi0JCWlmIChicmVha0xpbmVCZWZvcmVPcGVyYXRvcihsYXN0T3BlcmF0b3IpKSB7DQotCQkJZHVtcFRhYihkZXB0aCArIDEpOw0KLQkJCWlmIChsYXN0T3BlcmF0b3IgIT0gMCkgew0KLQkJCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmUobGFzdE9wZXJhdG9yKSkgew0KLQkJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOw0KLQkJCQkJaW5jcmVhc2VTcGxpdERlbHRhKDEpOw0KLQkJCQl9DQotCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQobGFzdE9wZXJhdG9yU3RyaW5nKTsNCi0JCQkJaW5jcmVhc2VTcGxpdERlbHRhKGxhc3RPcGVyYXRvclN0cmluZy5sZW5ndGgoKSk7DQorICBpZiAoYnJlYWtMaW5lQmVmb3JlT3BlcmF0b3IobGFzdE9wZXJhdG9yKSkgew0KKyAgIGR1bXBUYWIoZGVwdGggKyAxKTsNCisgICBpZiAobGFzdE9wZXJhdG9yICE9IDApIHsNCisgICAgaWYgKGluc2VydFNwYWNlQmVmb3JlKGxhc3RPcGVyYXRvcikpIHsNCisgICAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCisgICAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgICAgfQ0KKyAgICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKGxhc3RPcGVyYXRvclN0cmluZyk7DQorICAgIGluY3JlYXNlU3BsaXREZWx0YShsYXN0T3BlcmF0b3JTdHJpbmcubGVuZ3RoKCkpOw0KIA0KLQkJCQlpZiAoaW5zZXJ0U3BhY2VBZnRlcihsYXN0T3BlcmF0b3IpDQotCQkJCQkmJiBsYXN0T3BlcmF0b3IgIT0gVG9rZW5OYW1laW1wbGVtZW50cw0KLQkJCQkJJiYgbGFzdE9wZXJhdG9yICE9IFRva2VuTmFtZWV4dGVuZHMNCi0JCQkJCSYmIGxhc3RPcGVyYXRvciAhPSBUb2tlbk5hbWV0aHJvd3MpIHsNCi0JCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCi0JCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAocGxhY2VPcGVyYXRvckJlaGluZCkgew0KLQkJaWYgKGluc2VydFNwYWNlQmVmb3JlKG9wZXJhdG9yKSkgew0KLQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCi0JCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7DQotCQl9DQotCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsNCi0JCS8vaW5jcmVhc2VTcGxpdERlbHRhKG9wZXJhdG9yU3RyaW5nLmxlbmd0aCgpKTsNCi0JfQ0KKyAgICBpZiAoaW5zZXJ0U3BhY2VBZnRlcihsYXN0T3BlcmF0b3IpDQorICAgICAmJiBsYXN0T3BlcmF0b3IgIT0gVG9rZW5OYW1laW1wbGVtZW50cw0KKyAgICAgJiYgbGFzdE9wZXJhdG9yICE9IFRva2VuTmFtZWV4dGVuZHMNCisgICAgICYmIGxhc3RPcGVyYXRvciAhPSBUb2tlbk5hbWV0aHJvd3MpIHsNCisgICAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCisgICAgIGluY3JlYXNlU3BsaXREZWx0YSgxKTsNCisgICAgfQ0KKyAgIH0NCisgIH0NCisgfQ0KKyBpZiAocGxhY2VPcGVyYXRvckJlaGluZCkgew0KKyAgaWYgKGluc2VydFNwYWNlQmVmb3JlKG9wZXJhdG9yKSkgew0KKyAgIGZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsNCisgICBpbmNyZWFzZVNwbGl0RGVsdGEoMSk7DQorICB9DQorICBmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsNCisgIC8vaW5jcmVhc2VTcGxpdERlbHRhKG9wZXJhdG9yU3RyaW5nLmxlbmd0aCgpKTsNCisgfQ0KIH0NCiAvKioNCiAgKiBQb3BzIHRoZSB0b3Agc3RhdGVtZW50IG9mIHRoZSBzdGFjayBpZiBpdCBpcyA8Y29kZT50b2tlbjwvY29kZT4NCiAgKi8NCiBwcml2YXRlIGludCBwb3AoaW50IHRva2VuKSB7DQotCWludCBkZWx0YT0wOw0KLQlpZiAoKGNvbnN0cnVjdGlvbnNDb3VudD4wKSAmJiAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMV09PXRva2VuKSl7DQotCQlkZWx0YS0tOw0KLQkJY29uc3RydWN0aW9uc0NvdW50LS07DQotCX0NCi0JcmV0dXJuIGRlbHRhOw0KKyBpbnQgZGVsdGE9MDsNCisgaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQ+MCkgJiYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTFdPT10b2tlbikpew0KKyAgZGVsdGEtLTsNCisgIGNvbnN0cnVjdGlvbnNDb3VudC0tOw0KKyB9DQorIHJldHVybiBkZWx0YTsNCiB9DQogLyoqDQogICogUG9wcyB0aGUgdG9wIHN0YXRlbWVudCBvZiB0aGUgc3RhY2sgaWYgaXQgaXMgYSA8Y29kZT5CTE9DSzwvY29kZT4gb3IgYSA8Y29kZT5OT05JTkRFTlRfQkxPQ0s8L2NvZGU+Lg0KICAqLw0KIHByaXZhdGUgaW50IHBvcEJsb2NrKCkgew0KLQlpbnQgZGVsdGE9MDsNCi0JaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQ+MCkgJiYgKChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09QkxPQ0spIHx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09Tk9OSU5ERU5UX0JMT0NLKSkpew0KLQkJaWYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTFdPT1CTE9DSykNCi0JCQlkZWx0YS0tOw0KLQkJY29uc3RydWN0aW9uc0NvdW50LS07DQotCX0NCi0JcmV0dXJuIGRlbHRhOw0KKyBpbnQgZGVsdGE9MDsNCisgaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQ+MCkgJiYgKChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09QkxPQ0spIHx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09Tk9OSU5ERU5UX0JMT0NLKSkpew0KKyAgaWYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTFdPT1CTE9DSykNCisgICBkZWx0YS0tOw0KKyAgY29uc3RydWN0aW9uc0NvdW50LS07DQorIH0NCisgcmV0dXJuIGRlbHRhOw0KIH0NCiAvKioNCiAgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMgPGNvZGU+dG9rZW48L2NvZGU+Ljxicj4NCkBAIC0xNTg3LDE0ICsxNjA2LDE0IEBACiAgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHRvIGJlIGxlZnQgYXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sNCiAgKi8NCiBwcml2YXRlIGludCBwb3BFeGNsdXNpdmVVbnRpbChpbnQgdG9rZW4pIHsNCi0JaW50IGRlbHRhPTA7DQotCWludCBzdGFydENvdW50PWNvbnN0cnVjdGlvbnNDb3VudDsNCi0JZm9yIChpbnQgaSA9IHN0YXJ0Q291bnQtMTsgaSA+PSAwICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gdG9rZW47IGktLSl7DQotCQlpZiAoY29uc3RydWN0aW9uc1tpXSE9Tk9OSU5ERU5UX0JMT0NLKQ0KLQkJCWRlbHRhLS07DQotCQljb25zdHJ1Y3Rpb25zQ291bnQtLTsNCi0JfQ0KLQlyZXR1cm4gZGVsdGE7DQorIGludCBkZWx0YT0wOw0KKyBpbnQgc3RhcnRDb3VudD1jb25zdHJ1Y3Rpb25zQ291bnQ7DQorIGZvciAoaW50IGkgPSBzdGFydENvdW50LTE7IGkgPj0gMCAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IHRva2VuOyBpLS0pew0KKyAgaWYgKGNvbnN0cnVjdGlvbnNbaV0hPU5PTklOREVOVF9CTE9DSykNCisgICBkZWx0YS0tOw0KKyAgY29uc3RydWN0aW9uc0NvdW50LS07DQorIH0NCisgcmV0dXJuIGRlbHRhOw0KIH0NCiAvKioNCiAgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMNCkBAIC0xNjAyLDEzICsxNjIxLDEzIEBACiAgKiBEb2VzIG5vdCByZW1vdmUgaXQgZnJvbSB0aGUgc3RhY2suDQogICovDQogcHJpdmF0ZSBpbnQgcG9wRXhjbHVzaXZlVW50aWxCbG9jaygpew0KLQlpbnQgc3RhcnRDb3VudD1jb25zdHJ1Y3Rpb25zQ291bnQ7DQotCWludCBkZWx0YT0wOw0KLQlmb3IgKGludCBpID0gc3RhcnRDb3VudC0xOyBpID49IDAgJiYgY29uc3RydWN0aW9uc1tpXSAhPSBCTE9DSyAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IE5PTklOREVOVF9CTE9DSzsgaS0tKXsNCi0JCWNvbnN0cnVjdGlvbnNDb3VudC0tOw0KLQkJZGVsdGEtLTsNCi0JfQ0KLQlyZXR1cm4gZGVsdGE7DQorIGludCBzdGFydENvdW50PWNvbnN0cnVjdGlvbnNDb3VudDsNCisgaW50IGRlbHRhPTA7DQorIGZvciAoaW50IGkgPSBzdGFydENvdW50LTE7IGkgPj0gMCAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IEJMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gTk9OSU5ERU5UX0JMT0NLOyBpLS0pew0KKyAgY29uc3RydWN0aW9uc0NvdW50LS07DQorICBkZWx0YS0tOw0KKyB9DQorIHJldHVybiBkZWx0YTsNCiB9DQogLyoqDQogICogUG9wcyBlbGVtZW50cyB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkgb3IgdGhlIHRvcCBlbGVtZW50IGlzDQpAQCAtMTYxNiwxMyArMTYzNSwxMyBAQAogICogRG9lcyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlIHN0YWNrLg0KICAqLw0KIHByaXZhdGUgaW50IHBvcEV4Y2x1c2l2ZVVudGlsQmxvY2tPckNhc2UoKXsNCi0JaW50IHN0YXJ0Q291bnQ9Y29uc3RydWN0aW9uc0NvdW50Ow0KLQlpbnQgZGVsdGE9MDsNCi0JZm9yIChpbnQgaSA9IHN0YXJ0Q291bnQtMTsgaSA+PSAwICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gQkxPQ0sgJiYgY29uc3RydWN0aW9uc1tpXSAhPSBOT05JTkRFTlRfQkxPQ0sgJiYgY29uc3RydWN0aW9uc1tpXSE9VG9rZW5OYW1lY2FzZTsgaS0tKXsNCi0JCWNvbnN0cnVjdGlvbnNDb3VudC0tOw0KLQkJZGVsdGEtLTsNCi0JfQ0KLQlyZXR1cm4gZGVsdGE7DQorIGludCBzdGFydENvdW50PWNvbnN0cnVjdGlvbnNDb3VudDsNCisgaW50IGRlbHRhPTA7DQorIGZvciAoaW50IGkgPSBzdGFydENvdW50LTE7IGkgPj0gMCAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IEJMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gTk9OSU5ERU5UX0JMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0hPVRva2VuTmFtZWNhc2U7IGktLSl7DQorICBjb25zdHJ1Y3Rpb25zQ291bnQtLTsNCisgIGRlbHRhLS07DQorIH0NCisgcmV0dXJuIGRlbHRhOw0KIH0NCiAvKioNCiAgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMgPGNvZGU+dG9rZW48L2NvZGU+Ljxicj4NCkBAIC0xNjMwLDE5ICsxNjQ5LDE5IEBACiAgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHRvIHJlbW92ZSBmcm9tIHRoZSBzdGFjaw0KICAqLw0KIHByaXZhdGUgaW50IHBvcEluY2x1c2l2ZVVudGlsKGludCB0b2tlbikgew0KLQlpbnQgc3RhcnRDb3VudD1jb25zdHJ1Y3Rpb25zQ291bnQ7DQotCWludCBkZWx0YT0wOw0KLQlmb3IgKGludCBpID0gc3RhcnRDb3VudC0xOyBpID49IDAgJiYgY29uc3RydWN0aW9uc1tpXSAhPSB0b2tlbjsgaS0tKXsNCi0JCWlmIChjb25zdHJ1Y3Rpb25zW2ldIT1OT05JTkRFTlRfQkxPQ0spDQotCQkJZGVsdGEtLTsNCi0JCWNvbnN0cnVjdGlvbnNDb3VudC0tOw0KLQl9DQotCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQ+MCl7DQotCQlpZiAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMV0hPU5PTklOREVOVF9CTE9DSykNCi0JCQlkZWx0YS0tOw0KLQkJY29uc3RydWN0aW9uc0NvdW50LS07DQotCX0NCi0JcmV0dXJuIGRlbHRhOw0KKyBpbnQgc3RhcnRDb3VudD1jb25zdHJ1Y3Rpb25zQ291bnQ7DQorIGludCBkZWx0YT0wOw0KKyBmb3IgKGludCBpID0gc3RhcnRDb3VudC0xOyBpID49IDAgJiYgY29uc3RydWN0aW9uc1tpXSAhPSB0b2tlbjsgaS0tKXsNCisgIGlmIChjb25zdHJ1Y3Rpb25zW2ldIT1OT05JTkRFTlRfQkxPQ0spDQorICAgZGVsdGEtLTsNCisgIGNvbnN0cnVjdGlvbnNDb3VudC0tOw0KKyB9DQorIGlmIChjb25zdHJ1Y3Rpb25zQ291bnQ+MCl7DQorICBpZiAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMV0hPU5PTklOREVOVF9CTE9DSykNCisgICBkZWx0YS0tOw0KKyAgY29uc3RydWN0aW9uc0NvdW50LS07DQorIH0NCisgcmV0dXJuIGRlbHRhOw0KIH0NCiAvKioNCiAgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMNCkBAIC0xNjUwLDE4ICsxNjY5LDE4IEBACiAgKiBEb2VzIG5vdCByZW1vdmUgaXQgZnJvbSB0aGUgc3RhY2suDQogICovDQogcHJpdmF0ZSBpbnQgcG9wSW5jbHVzaXZlVW50aWxCbG9jaygpIHsNCi0JaW50IHN0YXJ0Q291bnQ9Y29uc3RydWN0aW9uc0NvdW50Ow0KLQlpbnQgZGVsdGE9MDsNCi0JZm9yIChpbnQgaSA9IHN0YXJ0Q291bnQtMTsgaSA+PSAwICYmIChjb25zdHJ1Y3Rpb25zW2ldICE9IEJMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0hPU5PTklOREVOVF9CTE9DSyk7IGktLSl7DQotCQlkZWx0YS0tOw0KLQkJY29uc3RydWN0aW9uc0NvdW50LS07DQotCX0NCi0JaWYgKGNvbnN0cnVjdGlvbnNDb3VudD4wKXsNCi0JCWlmIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09QkxPQ0spDQotCQkJZGVsdGEtLTsNCi0JCWNvbnN0cnVjdGlvbnNDb3VudC0tOw0KLQl9DQotCXJldHVybiBkZWx0YTsNCisgaW50IHN0YXJ0Q291bnQ9Y29uc3RydWN0aW9uc0NvdW50Ow0KKyBpbnQgZGVsdGE9MDsNCisgZm9yIChpbnQgaSA9IHN0YXJ0Q291bnQtMTsgaSA+PSAwICYmIChjb25zdHJ1Y3Rpb25zW2ldICE9IEJMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0hPU5PTklOREVOVF9CTE9DSyk7IGktLSl7DQorICBkZWx0YS0tOw0KKyAgY29uc3RydWN0aW9uc0NvdW50LS07DQorIH0NCisgaWYgKGNvbnN0cnVjdGlvbnNDb3VudD4wKXsNCisgIGlmIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudC0xXT09QkxPQ0spDQorICAgZGVsdGEtLTsNCisgIGNvbnN0cnVjdGlvbnNDb3VudC0tOw0KKyB9DQorIHJldHVybiBkZWx0YTsNCiB9DQogLyoqIA0KICAqIFB1c2hlcyBhIGJsb2NrIGluIHRoZSBzdGFjay48YnI+DQpAQCAtMTY3MCw0NSArMTY4OSw0NSBAQAogICogQ3JlYXRlcyBhIG5ldyBiaWdnZXIgYXJyYXkgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuDQogICovDQogcHJpdmF0ZSBpbnQgcHVzaEJsb2NrKCkgew0KLQlpbnQgZGVsdGEgPSAwOw0KLQlpZiAoY29uc3RydWN0aW9uc0NvdW50ID09IGNvbnN0cnVjdGlvbnMubGVuZ3RoKQ0KLQkJU3lzdGVtDQotCQkJCS5hcnJheWNvcHkoY29uc3RydWN0aW9ucywgDQotCQkJCQkwLCANCi0JCQkJCShjb25zdHJ1Y3Rpb25zID0gbmV3IGludFtjb25zdHJ1Y3Rpb25zQ291bnQgKiAyXSksIA0KLQkJCQkJMCwgDQotCQkJCQljb25zdHJ1Y3Rpb25zQ291bnQpOyANCisgaW50IGRlbHRhID0gMDsNCisgaWYgKGNvbnN0cnVjdGlvbnNDb3VudCA9PSBjb25zdHJ1Y3Rpb25zLmxlbmd0aCkNCisgIFN5c3RlbQ0KKyAgICAuYXJyYXljb3B5KGNvbnN0cnVjdGlvbnMsIA0KKyAgICAgMCwgDQorICAgICAoY29uc3RydWN0aW9ucyA9IG5ldyBpbnRbY29uc3RydWN0aW9uc0NvdW50ICogMl0pLCANCisgICAgIDAsIA0KKyAgICAgY29uc3RydWN0aW9uc0NvdW50KTsgDQogDQotCWlmICgoY29uc3RydWN0aW9uc0NvdW50ID09IDApDQotCQl8fCAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSA9PSBCTE9DSykNCi0JCXx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IE5PTklOREVOVF9CTE9DSykNCi0JCXx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IFRva2VuTmFtZWNhc2UpKSB7DQotCQlkZWx0YSsrOw0KLQkJY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQrK10gPSBCTE9DSzsNCi0JfQ0KLQllbHNlIHsNCi0JCWNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50KytdID0gTk9OSU5ERU5UX0JMT0NLOw0KLQl9DQotCXJldHVybiBkZWx0YTsNCisgaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQgPT0gMCkNCisgIHx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IEJMT0NLKQ0KKyAgfHwgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gTk9OSU5ERU5UX0JMT0NLKQ0KKyAgfHwgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gVG9rZW5OYW1lY2FzZSkpIHsNCisgIGRlbHRhKys7DQorICBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCsrXSA9IEJMT0NLOw0KKyB9DQorIGVsc2Ugew0KKyAgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQrK10gPSBOT05JTkRFTlRfQkxPQ0s7DQorIH0NCisgcmV0dXJuIGRlbHRhOw0KIH0NCiAvKiogDQogICogUHVzaGVzIDxjb2RlPnRva2VuPC9jb2RlPi48YnI+DQogICogQ3JlYXRlcyBhIG5ldyBiaWdnZXIgYXJyYXkgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuDQogICovDQogcHJpdmF0ZSBpbnQgcHVzaENvbnRyb2xTdGF0ZW1lbnQoaW50IHRva2VuKSB7DQotCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPT0gY29uc3RydWN0aW9ucy5sZW5ndGgpDQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnN0cnVjdGlvbnMsIDAsIChjb25zdHJ1Y3Rpb25zID0gbmV3IGludFtjb25zdHJ1Y3Rpb25zQ291bnQgKiAyXSksIDAsIGNvbnN0cnVjdGlvbnNDb3VudCk7DQotCWNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50KytdID0gdG9rZW47DQotCXJldHVybiAxOw0KKyBpZiAoY29uc3RydWN0aW9uc0NvdW50ID09IGNvbnN0cnVjdGlvbnMubGVuZ3RoKQ0KKyAgU3lzdGVtLmFycmF5Y29weShjb25zdHJ1Y3Rpb25zLCAwLCAoY29uc3RydWN0aW9ucyA9IG5ldyBpbnRbY29uc3RydWN0aW9uc0NvdW50ICogMl0pLCAwLCBjb25zdHJ1Y3Rpb25zQ291bnQpOw0KKyBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCsrXSA9IHRva2VuOw0KKyByZXR1cm4gMTsNCiB9DQogcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZUZpcnN0QXJndW1lbnRPbihpbnQgY3VycmVudFRva2VuKSB7DQotCS8vcmV0dXJuIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTik7DQotCXJldHVybiBjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1laWYNCi0JCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVMUEFSRU4NCi0JCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVOT1QNCi0JCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWV3aGlsZQ0KLQkJJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZWZvcg0KLQkJJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZXN3aXRjaDsgDQorIC8vcmV0dXJuIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTik7DQorIHJldHVybiBjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1laWYNCisgICYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVMUEFSRU4NCisgICYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVOT1QNCisgICYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWV3aGlsZQ0KKyAgJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZWZvcg0KKyAgJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZXN3aXRjaDsgDQogfQ0KIC8qKiANCiAgKiBTZXRzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZvcm1hdHRlciBhYm91dCB0aGUgYnJhY2VzDQpAQCAtMTcyNCw3ICsxNzQzLDcgQEAKICAqIEBzZWUgYWRkTmV3TGluZU9uT3BlbmluZ0JyYWNlKGJvb2xlYW4pDQogICovDQogcHVibGljIHZvaWQgc2V0QnJhY2VJbmRlbnRhdGlvbkxldmVsKGludCBuZXdCcmFjZUluZGVudGF0aW9uTGV2ZWwpIHsNCi0Jb3B0aW9ucy5zZXROZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZShuZXdCcmFjZUluZGVudGF0aW9uTGV2ZWw9PTApOw0KKyBvcHRpb25zLnNldE5ld0xpbmVCZWZvcmVPcGVuaW5nQnJhY2VNb2RlKG5ld0JyYWNlSW5kZW50YXRpb25MZXZlbD09MCk7DQogfQ0KIC8qKg0KICAqIFNldHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZm9ybWF0dGVyIHJlZ2FyZGluZyB0aGUgd2hpdGVzcGFjZXMNCkBAIC0xNzM1LDcgKzE3NTQsNyBAQAogICogQGRlcHJlY2F0ZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIFZBSg0KICAqLw0KIHB1YmxpYyB2b2lkIHNldENsZWFyQmxhbmtMaW5lcyhib29sZWFuIG5ld0NsZWFyQmxhbmtMaW5lcykgew0KLQlvcHRpb25zLnNldENsZWFyQWxsQmxhbmtMaW5lc01vZGUobmV3Q2xlYXJCbGFua0xpbmVzKTsNCisgb3B0aW9ucy5zZXRDbGVhckFsbEJsYW5rTGluZXNNb2RlKG5ld0NsZWFyQmxhbmtMaW5lcyk7DQogfQ0KIC8qKiANCiAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgc3BhY2VzIHVzZWQgdG8gcmVwbGFjZSB0aGUgdGFiIGNoYXINCkBAIC0xNzQ1LDcgKzE3NjQsNyBAQAogICogQGRlcHJlY2F0ZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIFZBSg0KICAqLw0KIHB1YmxpYyB2b2lkIHNldEluZGVudGF0aW9uTGVuZ3RoKGludCBuZXdJbmRlbnRhdGlvbkxlbmd0aCkgew0KLQlvcHRpb25zLnNldFRhYlNpemUobmV3SW5kZW50YXRpb25MZW5ndGgpOw0KKyBvcHRpb25zLnNldFRhYlNpemUobmV3SW5kZW50YXRpb25MZW5ndGgpOw0KIH0NCiAvKiogDQogICogU2V0cyB0aGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbA0KQEAgLTE3NTQsNyArMTc3Myw3IEBACiAgKiBAZGVwcmVjYXRlZA0KICAqLw0KIHB1YmxpYyB2b2lkIHNldEluaXRpYWxJbmRlbnRhdGlvbkxldmVsKGludCBuZXdJbmRlbnRhdGlvbkxldmVsKSB7DQotCXRoaXMuaW5pdGlhbEluZGVudGF0aW9uTGV2ZWwgPSBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsID0gbmV3SW5kZW50YXRpb25MZXZlbDsNCisgdGhpcy5pbml0aWFsSW5kZW50YXRpb25MZXZlbCA9IGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgPSBuZXdJbmRlbnRhdGlvbkxldmVsOw0KIH0NCiAvKiogDQogICogU2V0cyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBzY2FubmVyLjxicj4NCkBAIC0xNzY3LDcgKzE3ODYsNyBAQAogICogQGRlcHJlY2F0ZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIFZBSg0KICAqLw0KIHB1YmxpYyB2b2lkIHNldE5ld2xpbmVJbkNvbXBvdW5kU3RhdGVtZW50KGJvb2xlYW4gZmxhZykgew0KLQlvcHRpb25zLnNldE5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnRNb2RlKGZsYWcpOw0KKyBvcHRpb25zLnNldE5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnRNb2RlKGZsYWcpOw0KIH0NCiAvKioNCiAgKiBTZXQgdGhlIHBvc2l0aW9ucyB0byBtYXAuIFRoZSBtYXBwZWQgcG9zaXRpb25zIHNob3VsZCBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlDQpAQCAtMTc3NiwxNyArMTc5NSwxNyBAQAogICogQHBhcmFtIHBvc2l0aW9ucyBpbnRbXQ0KICAqLw0KIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uc1RvTWFwKGludFtdIHBvc2l0aW9ucykgew0KLQlwb3NpdGlvbnNUb01hcCA9IHBvc2l0aW9uczsNCi0JbGluZURlbHRhID0gMDsNCi0JZ2xvYmFsRGVsdGEgPSAwOw0KLQltYXBwZWRQb3NpdGlvbnMgPSBuZXcgaW50W3Bvc2l0aW9ucy5sZW5ndGhdOw0KKyBwb3NpdGlvbnNUb01hcCA9IHBvc2l0aW9uczsNCisgbGluZURlbHRhID0gMDsNCisgZ2xvYmFsRGVsdGEgPSAwOw0KKyBtYXBwZWRQb3NpdGlvbnMgPSBuZXcgaW50W3Bvc2l0aW9ucy5sZW5ndGhdOw0KIH0NCiAvKiogDQogICogQXBwZW5kcyBhIHNwYWNlIGNoYXJhY3RlciB0byB0aGUgY3VycmVudCBsaW5lIGJ1ZmZlci4NCiAgKi8NCiBwcml2YXRlIHZvaWQgc3BhY2UoKSB7DQotCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZCgnICcpOw0KLQlpbmNyZWFzZUxpbmVEZWx0YSgxKTsNCisgY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKCcgJyk7DQorIGluY3JlYXNlTGluZURlbHRhKDEpOw0KIH0NCiAvKioNCiAgKiBTcGxpdHMgPGNvZGU+c3RyaW5nVG9TcGxpdDwvY29kZT4gb24gdGhlIHRvcCBsZXZlbCB0b2tlbjxicj4NCkBAIC0xNzk2LDcgKzE4MTUsNyBAQAogICogb3IgbnVsbCBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdA0KICAqLw0KIHB1YmxpYyBTcGxpdExpbmUgc3BsaXQoU3RyaW5nIHN0cmluZ1RvU3BsaXQpIHsNCi0JcmV0dXJuIHNwbGl0KHN0cmluZ1RvU3BsaXQsIDApOw0KKyByZXR1cm4gc3BsaXQoc3RyaW5nVG9TcGxpdCwgMCk7DQogfQ0KIC8qKg0KICAqIFNwbGl0cyA8Y29kZT5zdHJpbmdUb1NwbGl0PC9jb2RlPiBvbiB0aGUgdG9wIGxldmVsIHRva2VuPGJyPg0KQEAgLTE4MDYsNDc2ICsxODI1LDQ3NiBAQAogICogb3IgbnVsbCBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdA0KICAqLw0KIHB1YmxpYyBTcGxpdExpbmUgc3BsaXQoU3RyaW5nIHN0cmluZ1RvU3BsaXQsIGludCBvZmZzZXRJbkdsb2JhbExpbmUpIHsNCi0JLy8gbG9jYWwgdmFyaWFibGVzDQotCWludCBjdXJyZW50VG9rZW4gPSAwOw0KLQlpbnQgc3BsaXRUb2tlblR5cGUgPSAwOw0KLQlpbnQgc3BsaXRUb2tlbkRlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7DQotCWludCBzcGxpdFRva2VuUHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsNCisgLy8gbG9jYWwgdmFyaWFibGVzDQorIGludCBjdXJyZW50VG9rZW4gPSAwOw0KKyBpbnQgc3BsaXRUb2tlblR5cGUgPSAwOw0KKyBpbnQgc3BsaXRUb2tlbkRlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7DQorIGludCBzcGxpdFRva2VuUHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsNCiANCi0JaW50W10gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFsxMF07DQotCS8vIGNvbnRhaW5zIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBzdWJzdHJpbmdzDQotCWludFtdIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50WzEwXTsNCi0JLy8gY29udGFpbnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHN1YnN0cmluZ3MNCi0JaW50IHN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQ0KLQlpbnRbXSBzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbMTBdOw0KLQkvLyBjb250YWlucyB0aGUgc3RhcnQgcG9zaXRpb24gb2Ygc3Vic3RyaW5ncw0KLQlpbnQgc3BsaXRPcGVyYXRvcnNDb3VudCA9IDA7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQ0KLQlpbnRbXSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA9IG5ldyBpbnRbMTBdOw0KLQlpbnQgb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9IDA7DQotCWludCBwb3NpdGlvbiA9IDA7DQotCWludCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSAtMTsNCi0JLy8gdXNlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIDFzdCBvcGVuIHBhcmVudGhlc2lzDQotCS8vIG5lZWRlZCBmb3IgYSBwYXR0ZXJuIGxpa2U6IEEuQihDKTsgd2Ugd2FudCBmb3JtYXR0ZWQgbGlrZSBBLkIoIHNwbGl0IEMpOw0KLQkvLyBzZXR1cCB0aGUgc2Nhbm5lciB3aXRoIGEgbmV3IHNvdXJjZQ0KLQlpbnQgbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID0gLTE7DQotCS8vIHRvIHJlbWVtYmVyIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjb21tZW50DQotCWludCBmaXJzdFRva2VuT25MaW5lID0gLTE7DQotCS8vIHRvIHJlbWVtYmVyIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgbGluZQ0KLQlpbnQgcHJldmlvdXNUb2tlbiA9IC0xOw0KLQkvLyB0byByZW1lbWJlciB0aGUgcHJldmlvdXMgdG9rZW4uDQotCXNwbGl0U2Nhbm5lci5zZXRTb3VyY2VCdWZmZXIoc3RyaW5nVG9TcGxpdC50b0NoYXJBcnJheSgpKTsNCisgaW50W10gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFsxMF07DQorIC8vIGNvbnRhaW5zIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBzdWJzdHJpbmdzDQorIGludFtdIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50WzEwXTsNCisgLy8gY29udGFpbnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHN1YnN0cmluZ3MNCisgaW50IHN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQ0KKyBpbnRbXSBzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbMTBdOw0KKyAvLyBjb250YWlucyB0aGUgc3RhcnQgcG9zaXRpb24gb2Ygc3Vic3RyaW5ncw0KKyBpbnQgc3BsaXRPcGVyYXRvcnNDb3VudCA9IDA7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQ0KKyBpbnRbXSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA9IG5ldyBpbnRbMTBdOw0KKyBpbnQgb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9IDA7DQorIGludCBwb3NpdGlvbiA9IDA7DQorIGludCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSAtMTsNCisgLy8gdXNlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIDFzdCBvcGVuIHBhcmVudGhlc2lzDQorIC8vIG5lZWRlZCBmb3IgYSBwYXR0ZXJuIGxpa2U6IEEuQihDKTsgd2Ugd2FudCBmb3JtYXR0ZWQgbGlrZSBBLkIoIHNwbGl0IEMpOw0KKyAvLyBzZXR1cCB0aGUgc2Nhbm5lciB3aXRoIGEgbmV3IHNvdXJjZQ0KKyBpbnQgbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID0gLTE7DQorIC8vIHRvIHJlbWVtYmVyIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjb21tZW50DQorIGludCBmaXJzdFRva2VuT25MaW5lID0gLTE7DQorIC8vIHRvIHJlbWVtYmVyIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgbGluZQ0KKyBpbnQgcHJldmlvdXNUb2tlbiA9IC0xOw0KKyAvLyB0byByZW1lbWJlciB0aGUgcHJldmlvdXMgdG9rZW4uDQorIHNwbGl0U2Nhbm5lci5zZXRTb3VyY2VCdWZmZXIoc3RyaW5nVG9TcGxpdC50b0NoYXJBcnJheSgpKTsNCiANCi0JdHJ5IHsNCi0JCS8vIHN0YXJ0IHRoZSBsb29wDQotCQl3aGlsZSAodHJ1ZSkgew0KLQkJCS8vIHRha2VzIHRoZSBuZXh0IHRva2VuDQotCQkJdHJ5IHsNCi0JCQkJaWYgKGN1cnJlbnRUb2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UpDQotCQkJCQlwcmV2aW91c1Rva2VuID0gY3VycmVudFRva2VuOw0KLQkJCQljdXJyZW50VG9rZW4gPSBzcGxpdFNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7DQotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCi0JCQkJaWYgKCFoYW5kbGVJbnZhbGlkVG9rZW4oZSkpDQotCQkJCQl0aHJvdyBlOw0KLQkJCQljdXJyZW50VG9rZW4gPSAwOyAvLyB0aGlzIHZhbHVlIGlzIG5vdCBtb2RpZnkgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkLg0KLQkJCX0NCi0JCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUVPRikNCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWlmIChmaXJzdFRva2VuT25MaW5lID09IC0xKXsNCi0JCQkJZmlyc3RUb2tlbk9uTGluZSA9IGN1cnJlbnRUb2tlbjsNCi0JCQl9DQotCQkJDQotCQkJCQ0KLQkJCXN3aXRjaCAoY3VycmVudFRva2VuKSB7DQotCQkJCWNhc2UgVG9rZW5OYW1lUkJSQUNFOg0KLQkJCQljYXNlIFRva2VuTmFtZVJQQVJFTiA6DQotCQkJCQlpZiAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA+IDApIHsNCi0JCQkJCQlpZiAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSAxICYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA8IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdKSB7DQotCQkJCQkJCWxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdOw0KLQkJCQkJCX0gZWxzZQ0KLQkJCQkJCQlpZiAoKHNwbGl0VG9rZW5EZXB0aCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0JCQkJCQkJCXx8IChzcGxpdFRva2VuRGVwdGggPiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50DQotCQkJCQkJCQkJJiYgb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSAxKSkgew0KLQkJCQkJCQkJc3BsaXRUb2tlblR5cGUgPSAwOw0KLQkJCQkJCQkJc3BsaXRUb2tlbkRlcHRoID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudDsNCi0JCQkJCQkJCXNwbGl0VG9rZW5Qcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOw0KLQkJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zWzBdID0gMDsNCi0JCQkJCQkJCS8vIGJldHRlciB0b2tlbiBtZWFucyB0aGUgd2hvbGUgbGluZSB1bnRpbCBub3cgaXMgdGhlIGZpcnN0IHN1YnN0cmluZw0KLQkJCQkJCQkJc3Vic3RyaW5nc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzdWJzdHJpbmdzDQorIHRyeSB7DQorICAvLyBzdGFydCB0aGUgbG9vcA0KKyAgd2hpbGUgKHRydWUpIHsNCisgICAvLyB0YWtlcyB0aGUgbmV4dCB0b2tlbg0KKyAgIHRyeSB7DQorICAgIGlmIChjdXJyZW50VG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKQ0KKyAgICAgcHJldmlvdXNUb2tlbiA9IGN1cnJlbnRUb2tlbjsNCisgICAgY3VycmVudFRva2VuID0gc3BsaXRTY2FubmVyLmdldE5leHRUb2tlbigpOw0KKyAgIH0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7DQorICAgIGlmICghaGFuZGxlSW52YWxpZFRva2VuKGUpKQ0KKyAgICAgdGhyb3cgZTsNCisgICAgY3VycmVudFRva2VuID0gMDsgLy8gdGhpcyB2YWx1ZSBpcyBub3QgbW9kaWZ5IHdoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4NCisgICB9DQorICAgaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVFT0YpDQorICAgIGJyZWFrOw0KKyAgICANCisgICBpZiAoZmlyc3RUb2tlbk9uTGluZSA9PSAtMSl7DQorICAgIGZpcnN0VG9rZW5PbkxpbmUgPSBjdXJyZW50VG9rZW47DQorICAgfQ0KKyAgIA0KKyAgICANCisgICBzd2l0Y2ggKGN1cnJlbnRUb2tlbikgew0KKyAgICBjYXNlIFRva2VuTmFtZVJCUkFDRToNCisgICAgY2FzZSBUb2tlbk5hbWVSUEFSRU4gOg0KKyAgICAgaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPiAwKSB7DQorICAgICAgaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gMSAmJiBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPCBvcGVuUGFyZW50aGVzaXNQb3NpdGlvblswXSkgew0KKyAgICAgICBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvblswXTsNCisgICAgICB9IGVsc2UNCisgICAgICAgaWYgKChzcGxpdFRva2VuRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpDQorICAgICAgICB8fCAoc3BsaXRUb2tlbkRlcHRoID4gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudA0KKyAgICAgICAgICYmIG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gMSkpIHsNCisgICAgICAgIHNwbGl0VG9rZW5UeXBlID0gMDsNCisgICAgICAgIHNwbGl0VG9rZW5EZXB0aCA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQ7DQorICAgICAgICBzcGxpdFRva2VuUHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsNCisgICAgICAgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1swXSA9IDA7DQorICAgICAgICAvLyBiZXR0ZXIgdG9rZW4gbWVhbnMgdGhlIHdob2xlIGxpbmUgdW50aWwgbm93IGlzIHRoZSBmaXJzdCBzdWJzdHJpbmcNCisgICAgICAgIHN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3Vic3RyaW5ncw0KIA0KLQkJCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdOw0KLQkJCQkJCQkJLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQNCi0JCQkJCQkJCXBvc2l0aW9uID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25bMF07DQotCQkJCQkJCQkvLyB0aGUgc3RyaW5nIG11c3RuJ3QgYmUgY3V0IGJlZm9yZSB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyBidXQgYWZ0ZXIgdGhlIG9wZW5pbmcgb25lLg0KLQkJCQkJCQkJc3BsaXRPcGVyYXRvcnNDb3VudCA9IDE7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3BsaXQgb3BlcmF0b3JzDQotCQkJCQkJCQlzcGxpdE9wZXJhdG9yc1swXSA9IDA7DQotCQkJCQkJCX0NCi0JCQkJCQlvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50LS07DQotCQkJCQl9DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBUb2tlbk5hbWVMQlJBQ0U6DQotCQkJCWNhc2UgVG9rZW5OYW1lTFBBUkVOIDoNCi0JCQkJCWlmIChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uLmxlbmd0aCkgew0KLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQotCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiwgDQotCQkJCQkJCQkwLCANCi0JCQkJCQkJCShvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA9IG5ldyBpbnRbb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCAqIDJdKSwgDQotCQkJCQkJCQkwLCANCi0JCQkJCQkJCW9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQpOyANCi0JCQkJCX0NCi0JCQkJCW9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW29wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQrK10gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOw0KLQkJCQkJaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMUEFSRU4gJiYgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSUEFSRU4pew0KLQkJCQkJCW9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW29wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgLSAxXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDogLy8gOw0KLQkJCQljYXNlIFRva2VuTmFtZUNPTU1BIDogLy8gLA0KLQkJCQljYXNlIFRva2VuTmFtZUVRVUFMIDogLy8gPQ0KLQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPCBzcGxpdFRva2VuRGVwdGgNCi0JCQkJCQl8fCAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSBzcGxpdFRva2VuRGVwdGgNCi0JCQkJCQkJJiYgc3BsaXRUb2tlblByaW9yaXR5ID4gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKSkgew0KLQkJCQkJCS8vIHRoZSBjdXJyZW50IHRva2VuIGlzIGJldHRlciB0aGFuIHRoZSBvbmUgd2UgY3VycmVudGx5IGhhdmUNCi0JCQkJCQkvLyAoaW4gbGV2ZWwgb3IgaW4gcHJpb3JpdHkgaWYgc2FtZSBsZXZlbCkNCi0JCQkJCQkvLyByZXNldCB0aGUgc3Vic3RyaW5nc0NvdW50DQotCQkJCQkJc3BsaXRUb2tlbkRlcHRoID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudDsNCi0JCQkJCQlzcGxpdFRva2VuVHlwZSA9IGN1cnJlbnRUb2tlbjsNCi0JCQkJCQlzcGxpdFRva2VuUHJpb3JpdHkgPSBnZXRUb2tlblByaW9yaXR5KGN1cnJlbnRUb2tlbik7DQotCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zWzBdID0gMDsNCi0JCQkJCQkvLyBiZXR0ZXIgdG9rZW4gbWVhbnMgdGhlIHdob2xlIGxpbmUgdW50aWwgbm93IGlzIHRoZSBmaXJzdCBzdWJzdHJpbmcNCisgICAgICAgIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbMF0gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvblswXTsNCisgICAgICAgIC8vIHN1YnN0cmluZyBlbmRzIG9uIG9wZXJhdG9yIHN0YXJ0DQorICAgICAgICBwb3NpdGlvbiA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdOw0KKyAgICAgICAgLy8gdGhlIHN0cmluZyBtdXN0bid0IGJlIGN1dCBiZWZvcmUgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgYnV0IGFmdGVyIHRoZSBvcGVuaW5nIG9uZS4NCisgICAgICAgIHNwbGl0T3BlcmF0b3JzQ291bnQgPSAxOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHNwbGl0IG9wZXJhdG9ycw0KKyAgICAgICAgc3BsaXRPcGVyYXRvcnNbMF0gPSAwOw0KKyAgICAgICB9DQorICAgICAgb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudC0tOw0KKyAgICAgfQ0KKyAgICAgYnJlYWs7DQorICAgIGNhc2UgVG9rZW5OYW1lTEJSQUNFOg0KKyAgICBjYXNlIFRva2VuTmFtZUxQQVJFTiA6DQorICAgICBpZiAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbi5sZW5ndGgpIHsNCisgICAgICBTeXN0ZW0uYXJyYXljb3B5KA0KKyAgICAgICAgb3BlblBhcmVudGhlc2lzUG9zaXRpb24sIA0KKyAgICAgICAgMCwgDQorICAgICAgICAob3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSBuZXcgaW50W29wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgKiAyXSksIA0KKyAgICAgICAgMCwgDQorICAgICAgICBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50KTsgDQorICAgICB9DQorICAgICBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50KytdID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsNCisgICAgIGlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTFBBUkVOICYmIHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUlBBUkVOKXsNCisgICAgICBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50IC0gMV0gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCisgICAgIH0NCisgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6IC8vIDsNCisgICAgY2FzZSBUb2tlbk5hbWVDT01NQSA6IC8vICwNCisgICAgY2FzZSBUb2tlbk5hbWVFUVVBTCA6IC8vID0NCisgICAgIGlmIChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50IDwgc3BsaXRUb2tlbkRlcHRoDQorICAgICAgfHwgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoDQorICAgICAgICYmIHNwbGl0VG9rZW5Qcmlvcml0eSA+IGdldFRva2VuUHJpb3JpdHkoY3VycmVudFRva2VuKSkpIHsNCisgICAgICAvLyB0aGUgY3VycmVudCB0b2tlbiBpcyBiZXR0ZXIgdGhhbiB0aGUgb25lIHdlIGN1cnJlbnRseSBoYXZlDQorICAgICAgLy8gKGluIGxldmVsIG9yIGluIHByaW9yaXR5IGlmIHNhbWUgbGV2ZWwpDQorICAgICAgLy8gcmVzZXQgdGhlIHN1YnN0cmluZ3NDb3VudA0KKyAgICAgIHNwbGl0VG9rZW5EZXB0aCA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQ7DQorICAgICAgc3BsaXRUb2tlblR5cGUgPSBjdXJyZW50VG9rZW47DQorICAgICAgc3BsaXRUb2tlblByaW9yaXR5ID0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pOw0KKyAgICAgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1swXSA9IDA7DQorICAgICAgLy8gYmV0dGVyIHRva2VuIG1lYW5zIHRoZSB3aG9sZSBsaW5lIHVudGlsIG5vdyBpcyB0aGUgZmlyc3Qgc3Vic3RyaW5nDQogDQotCQkJCQkJaWYgKHNlcGFyYXRlRmlyc3RBcmd1bWVudE9uKGZpcnN0VG9rZW5PbkxpbmUpDQotCQkJCQkJCSYmIG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPiAwKSB7DQotCQkJCQkJCXN1YnN0cmluZ3NDb3VudCA9IDI7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3Vic3RyaW5ncw0KKyAgICAgIGlmIChzZXBhcmF0ZUZpcnN0QXJndW1lbnRPbihmaXJzdFRva2VuT25MaW5lKQ0KKyAgICAgICAmJiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID4gMCkgew0KKyAgICAgICBzdWJzdHJpbmdzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MNCiANCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW3NwbGl0VG9rZW5EZXB0aCAtIDFdOw0KLQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbMV0gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltzcGxpdFRva2VuRGVwdGggLSAxXTsNCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1sxXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50ID0gMjsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMNCi0JCQkJCQkJc3BsaXRPcGVyYXRvcnNbMF0gPSAwOw0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc1sxXSA9IGN1cnJlbnRUb2tlbjsNCi0JCQkJCQkJcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOw0KLQkJCQkJCQkvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kDQotCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJc3Vic3RyaW5nc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzdWJzdHJpbmdzDQorICAgICAgIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbMF0gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltzcGxpdFRva2VuRGVwdGggLSAxXTsNCisgICAgICAgc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zWzFdID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25bc3BsaXRUb2tlbkRlcHRoIC0gMV07DQorICAgICAgIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbMV0gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCisgICAgICAgc3BsaXRPcGVyYXRvcnNDb3VudCA9IDI7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3BsaXQgb3BlcmF0b3JzDQorICAgICAgIHNwbGl0T3BlcmF0b3JzWzBdID0gMDsNCisgICAgICAgc3BsaXRPcGVyYXRvcnNbMV0gPSBjdXJyZW50VG9rZW47DQorICAgICAgIHBvc2l0aW9uID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsNCisgICAgICAgLy8gbmV4dCBzdWJzdHJpbmcgd2lsbCBzdGFydCBmcm9tIG9wZXJhdG9yIGVuZA0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgIHN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3Vic3RyaW5ncw0KIA0KLQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzBdID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247DQotCQkJCQkJCS8vIHN1YnN0cmluZyBlbmRzIG9uIG9wZXJhdG9yIHN0YXJ0DQotCQkJCQkJCXBvc2l0aW9uID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsNCi0JCQkJCQkJLy8gbmV4dCBzdWJzdHJpbmcgd2lsbCBzdGFydCBmcm9tIG9wZXJhdG9yIGVuZA0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMNCi0JCQkJCQkJc3BsaXRPcGVyYXRvcnNbMF0gPSBjdXJyZW50VG9rZW47DQotCQkJCQkJfQ0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlpZiAoKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoDQotCQkJCQkJCQkmJiBzcGxpdFRva2VuUHJpb3JpdHkgPT0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKQ0KLQkJCQkJCQkmJiBzcGxpdFRva2VuVHlwZSE9VG9rZW5OYW1lRVFVQUwgJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZUVRVUFMKSB7DQotCQkJCQkJCS8vIGZpeCBmb3IgMUZHMEJDTjogTEZDT006V0lOOTggLSBNaXNzaW5nIG9uZSBpbmRlbnRhdGlvbiBhZnRlciBzcGxpdA0KLQkJCQkJCQkvLyB0YWtlIG9ubHkgdGhlIDFzdCA9IGludG8gYWNjb3VudC4NCi0JCQkJCQkJLy8gaWYgYW5vdGhlciB0b2tlbiB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGlzIGZvdW5kLA0KLQkJCQkJCQkvLyBwdXNoIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3Vic3RyaW5nIGFuZA0KLQkJCQkJCQkvLyBwdXNoIHRoZSB0b2tlbiBpbnRvIHRoZSBzdGFjay4NCi0JCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFycmF5IG9iamVjdCBpZiB0aGUgY3VycmVudCBvbmUgaXMgZnVsbC4NCi0JCQkJCQkJaWYgKHN1YnN0cmluZ3NDb3VudCA9PSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMubGVuZ3RoKSB7DQotCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KA0KLQkJCQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsIA0KLQkJCQkJCQkJCQkwLCANCi0JCQkJCQkJCQkJKHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50ICogMl0pLCANCi0JCQkJCQkJCQkJMCwgDQotCQkJCQkJCQkJCXN1YnN0cmluZ3NDb3VudCk7IA0KLQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCi0JCQkJCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywgDQotCQkJCQkJCQkJCTAsIA0KLQkJCQkJCQkJCQkoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50ICogMl0pLCANCi0JCQkJCQkJCQkJMCwgDQotCQkJCQkJCQkJCXN1YnN0cmluZ3NDb3VudCk7IA0KLQkJCQkJCQl9DQotCQkJCQkJCWlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID09IHNwbGl0T3BlcmF0b3JzLmxlbmd0aCkgew0KLQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCi0JCQkJCQkJCQkJc3BsaXRPcGVyYXRvcnMsIA0KLQkJCQkJCQkJCQkwLCANCi0JCQkJCQkJCQkJKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLCANCi0JCQkJCQkJCQkJMCwgDQotCQkJCQkJCQkJCXNwbGl0T3BlcmF0b3JzQ291bnQpOyANCi0JCQkJCQkJfQ0KLQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbc3Vic3RyaW5nc0NvdW50XSA9IHBvc2l0aW9uOw0KLQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudCsrXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQkJCQkJCQkvLyBzdWJzdHJpbmcgZW5kcyBvbiBvcGVyYXRvciBzdGFydA0KLQkJCQkJCQlwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQotCQkJCQkJCS8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCi0JCQkJCQkJc3BsaXRPcGVyYXRvcnNbc3BsaXRPcGVyYXRvcnNDb3VudCsrXSA9IGN1cnJlbnRUb2tlbjsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlicmVhazsNCi0JCQkJCQ0KLQkJCQljYXNlIFRva2VuTmFtZUNPTE9OIDogLy8gOiAoMTUuMjQpDQotCQkJCQkvLyBzZWUgMUZLN0M1Uiwgd2Ugb25seSBzcGxpdCBvbiBhIGNvbG9uLCB3aGVuIGl0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXN0aW9uLW1hcmsuDQotCQkJCQkvLyBpbmRlZWQgaXQgbWlnaHQgYXBwZWFyIGFsc28gYmVoaW5kIGEgY2FzZSBzdGF0ZW1lbnQsIGFuZCB3ZSBkbyBub3QgdG8gYnJlYWsgYXQgdGhpcyBwb2ludC4NCi0JCQkJCWlmICgoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSAwKSB8fCBzcGxpdE9wZXJhdG9yc1tzcGxpdE9wZXJhdG9yc0NvdW50LTFdICE9IFRva2VuTmFtZVFVRVNUSU9OKXsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoNCi0JCQkJY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoNCi0JCQkJY2FzZSBUb2tlbk5hbWV0aHJvd3MgOg0KKyAgICAgICBzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzBdID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247DQorICAgICAgIC8vIHN1YnN0cmluZyBlbmRzIG9uIG9wZXJhdG9yIHN0YXJ0DQorICAgICAgIHBvc2l0aW9uID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsNCisgICAgICAgLy8gbmV4dCBzdWJzdHJpbmcgd2lsbCBzdGFydCBmcm9tIG9wZXJhdG9yIGVuZA0KKyAgICAgICBzcGxpdE9wZXJhdG9yc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMNCisgICAgICAgc3BsaXRPcGVyYXRvcnNbMF0gPSBjdXJyZW50VG9rZW47DQorICAgICAgfQ0KKyAgICAgfSBlbHNlIHsNCisgICAgICBpZiAoKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoDQorICAgICAgICAmJiBzcGxpdFRva2VuUHJpb3JpdHkgPT0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKQ0KKyAgICAgICAmJiBzcGxpdFRva2VuVHlwZSE9VG9rZW5OYW1lRVFVQUwgJiYgY3VycmVudFRva2VuICE9IFRva2VuTmFtZUVRVUFMKSB7DQorICAgICAgIC8vIGZpeCBmb3IgMUZHMEJDTjogTEZDT006V0lOOTggLSBNaXNzaW5nIG9uZSBpbmRlbnRhdGlvbiBhZnRlciBzcGxpdA0KKyAgICAgICAvLyB0YWtlIG9ubHkgdGhlIDFzdCA9IGludG8gYWNjb3VudC4NCisgICAgICAgLy8gaWYgYW5vdGhlciB0b2tlbiB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGlzIGZvdW5kLA0KKyAgICAgICAvLyBwdXNoIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3Vic3RyaW5nIGFuZA0KKyAgICAgICAvLyBwdXNoIHRoZSB0b2tlbiBpbnRvIHRoZSBzdGFjay4NCisgICAgICAgLy8gY3JlYXRlIGEgbmV3IGFycmF5IG9iamVjdCBpZiB0aGUgY3VycmVudCBvbmUgaXMgZnVsbC4NCisgICAgICAgaWYgKHN1YnN0cmluZ3NDb3VudCA9PSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMubGVuZ3RoKSB7DQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KA0KKyAgICAgICAgICBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsIA0KKyAgICAgICAgICAwLCANCisgICAgICAgICAgKHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50ICogMl0pLCANCisgICAgICAgICAgMCwgDQorICAgICAgICAgIHN1YnN0cmluZ3NDb3VudCk7IA0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSgNCisgICAgICAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywgDQorICAgICAgICAgIDAsIA0KKyAgICAgICAgICAoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50ICogMl0pLCANCisgICAgICAgICAgMCwgDQorICAgICAgICAgIHN1YnN0cmluZ3NDb3VudCk7IA0KKyAgICAgICB9DQorICAgICAgIGlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID09IHNwbGl0T3BlcmF0b3JzLmxlbmd0aCkgew0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSgNCisgICAgICAgICAgc3BsaXRPcGVyYXRvcnMsIA0KKyAgICAgICAgICAwLCANCisgICAgICAgICAgKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLCANCisgICAgICAgICAgMCwgDQorICAgICAgICAgIHNwbGl0T3BlcmF0b3JzQ291bnQpOyANCisgICAgICAgfQ0KKyAgICAgICBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbc3Vic3RyaW5nc0NvdW50XSA9IHBvc2l0aW9uOw0KKyAgICAgICBzdWJzdHJpbmdzRW5kUG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudCsrXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KKyAgICAgICAvLyBzdWJzdHJpbmcgZW5kcyBvbiBvcGVyYXRvciBzdGFydA0KKyAgICAgICBwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQorICAgICAgIC8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCisgICAgICAgc3BsaXRPcGVyYXRvcnNbc3BsaXRPcGVyYXRvcnNDb3VudCsrXSA9IGN1cnJlbnRUb2tlbjsNCisgICAgICB9DQorICAgICB9DQorICAgICBicmVhazsNCisgICAgIA0KKyAgICBjYXNlIFRva2VuTmFtZUNPTE9OIDogLy8gOiAoMTUuMjQpDQorICAgICAvLyBzZWUgMUZLN0M1Uiwgd2Ugb25seSBzcGxpdCBvbiBhIGNvbG9uLCB3aGVuIGl0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXN0aW9uLW1hcmsuDQorICAgICAvLyBpbmRlZWQgaXQgbWlnaHQgYXBwZWFyIGFsc28gYmVoaW5kIGEgY2FzZSBzdGF0ZW1lbnQsIGFuZCB3ZSBkbyBub3QgdG8gYnJlYWsgYXQgdGhpcyBwb2ludC4NCisgICAgIGlmICgoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSAwKSB8fCBzcGxpdE9wZXJhdG9yc1tzcGxpdE9wZXJhdG9yc0NvdW50LTFdICE9IFRva2VuTmFtZVFVRVNUSU9OKXsNCisgICAgICBicmVhazsNCisgICAgIH0NCisgICAgY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoNCisgICAgY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoNCisgICAgY2FzZSBUb2tlbk5hbWV0aHJvd3MgOg0KIA0KLQkJCQljYXNlIFRva2VuTmFtZURPVCA6IC8vIC4NCi0JCQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWSA6IC8vICogKDE1LjE2LjEpDQotCQkJCWNhc2UgVG9rZW5OYW1lRElWSURFIDogLy8gLyAoMTUuMTYuMikNCi0JCQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOiAvLyAlICgxNS4xNi4zKQ0KLQkJCQljYXNlIFRva2VuTmFtZVBMVVMgOiAvLyArICgxNS4xNywgMTUuMTcuMikNCi0JCQkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6IC8vIC0gKDE1LjE3LjIpDQotCQkJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVCA6IC8vIDw8ICgxNS4xOCkNCi0JCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVCA6IC8vID4+ICgxNS4xOCkNCi0JCQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6IC8vID4+PiAoMTUuMTgpDQotCQkJCWNhc2UgVG9rZW5OYW1lTEVTUyA6IC8vIDwgKDE1LjE5LjEpDQotCQkJCWNhc2UgVG9rZW5OYW1lTEVTU19FUVVBTCA6IC8vIDw9ICgxNS4xOS4xKQ0KLQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVIgOiAvLyA+ICgxNS4xOS4xKQ0KLQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgOiAvLyA+PSAoMTUuMTkuMSkNCi0JCQkJY2FzZSBUb2tlbk5hbWVpbnN0YW5jZW9mIDogLy8gaW5zdGFuY2VvZg0KLQkJCQljYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMIDogLy8gPT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQ0KLQkJCQljYXNlIFRva2VuTmFtZU5PVF9FUVVBTCA6IC8vICE9ICgxNS4yMCwgMTUuMjAuMSwgMTUuMjAuMiwgMTUuMjAuMykNCi0JCQkJY2FzZSBUb2tlbk5hbWVBTkQgOiAvLyAmICgxNS4yMSwgMTUuMjEuMSwgMTUuMjEuMikNCi0JCQkJY2FzZSBUb2tlbk5hbWVPUiA6IC8vIHwgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZVhPUiA6IC8vIF4gKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZUFORF9BTkQgOiAvLyAmJiAoMTUuMjIpDQotCQkJCWNhc2UgVG9rZW5OYW1lT1JfT1IgOiAvLyB8fCAoMTUuMjMpDQotCQkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOiAvLyA/ICgxNS4yNCkNCi0JCQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA6IC8vICo9ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZURJVklERV9FUVVBTCA6IC8vIC89ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTCA6IC8vICU9ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOiAvLyArPSAoMTUuMjUuMikNCi0JCQkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6IC8vIC09ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgOiAvLyA8PD0gKDE1LjI1LjIpDQotCQkJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUwgOiAvLyA+Pj0gKDE1LjI1LjIpDQotCQkJCWNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgOiAvLyA+Pj49ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZUFORF9FUVVBTCA6IC8vICY9ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZVhPUl9FUVVBTCA6IC8vIF49ICgxNS4yNS4yKQ0KLQkJCQljYXNlIFRva2VuTmFtZU9SX0VRVUFMIDogLy8gfD0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lRE9UIDogLy8gLg0KKyAgICBjYXNlIFRva2VuTmFtZU1VTFRJUExZIDogLy8gKiAoMTUuMTYuMSkNCisgICAgY2FzZSBUb2tlbk5hbWVESVZJREUgOiAvLyAvICgxNS4xNi4yKQ0KKyAgICBjYXNlIFRva2VuTmFtZVJFTUFJTkRFUiA6IC8vICUgKDE1LjE2LjMpDQorICAgIGNhc2UgVG9rZW5OYW1lUExVUyA6IC8vICsgKDE1LjE3LCAxNS4xNy4yKQ0KKyAgICBjYXNlIFRva2VuTmFtZU1JTlVTIDogLy8gLSAoMTUuMTcuMikNCisgICAgY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDogLy8gPDwgKDE1LjE4KQ0KKyAgICBjYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUIDogLy8gPj4gKDE1LjE4KQ0KKyAgICBjYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDogLy8gPj4+ICgxNS4xOCkNCisgICAgY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCAoMTUuMTkuMSkNCisgICAgY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDogLy8gPD0gKDE1LjE5LjEpDQorICAgIGNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6IC8vID4gKDE1LjE5LjEpDQorICAgIGNhc2UgVG9rZW5OYW1lR1JFQVRFUl9FUVVBTCA6IC8vID49ICgxNS4xOS4xKQ0KKyAgICBjYXNlIFRva2VuTmFtZWluc3RhbmNlb2YgOiAvLyBpbnN0YW5jZW9mDQorICAgIGNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOiAvLyA9PSAoMTUuMjAsIDE1LjIwLjEsIDE1LjIwLjIsIDE1LjIwLjMpDQorICAgIGNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQ0KKyAgICBjYXNlIFRva2VuTmFtZUFORCA6IC8vICYgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KKyAgICBjYXNlIFRva2VuTmFtZU9SIDogLy8gfCAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQorICAgIGNhc2UgVG9rZW5OYW1lWE9SIDogLy8gXiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQorICAgIGNhc2UgVG9rZW5OYW1lQU5EX0FORCA6IC8vICYmICgxNS4yMikNCisgICAgY2FzZSBUb2tlbk5hbWVPUl9PUiA6IC8vIHx8ICgxNS4yMykNCisgICAgY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gKDE1LjI0KQ0KKyAgICBjYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDogLy8gKj0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDogLy8gLz0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMIDogLy8gJT0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lUExVU19FUVVBTCA6IC8vICs9ICgxNS4yNS4yKQ0KKyAgICBjYXNlIFRva2VuTmFtZU1JTlVTX0VRVUFMIDogLy8gLT0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA6IC8vIDw8PSAoMTUuMjUuMikNCisgICAgY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+PSAoMTUuMjUuMikNCisgICAgY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+Pj0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDogLy8gJj0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDogLy8gXj0gKDE1LjI1LjIpDQorICAgIGNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOiAvLyB8PSAoMTUuMjUuMikNCiANCi0JCQkJCWlmICgob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA8IHNwbGl0VG9rZW5EZXB0aA0KLQkJCQkJCXx8IChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IHNwbGl0VG9rZW5EZXB0aA0KLQkJCQkJCQkmJiBzcGxpdFRva2VuUHJpb3JpdHkgPiBnZXRUb2tlblByaW9yaXR5KGN1cnJlbnRUb2tlbikpKQ0KLQkJCQkJCSYmDQotCQkJCQkJCSEoKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVQTFVTIHx8IGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVNSU5VUykNCi0JCQkJCQkJCSYmIChwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZUxCUkFDRSB8fCBwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZUxCUkFDS0VUIHx8IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uID09IDApKSl7DQotCQkJCQkJLy8gdGhlIGN1cnJlbnQgdG9rZW4gaXMgYmV0dGVyIHRoYW4gdGhlIG9uZSB3ZSBjdXJyZW50bHkgaGF2ZQ0KLQkJCQkJCS8vIChpbiBsZXZlbCBvciBpbiBwcmlvcml0eSBpZiBzYW1lIGxldmVsKQ0KLQkJCQkJCS8vIHJlc2V0IHRoZSBzdWJzdHJpbmdzQ291bnQNCi0JCQkJCQlzcGxpdFRva2VuRGVwdGggPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50Ow0KLQkJCQkJCXNwbGl0VG9rZW5UeXBlID0gY3VycmVudFRva2VuOw0KLQkJCQkJCXNwbGl0VG9rZW5Qcmlvcml0eSA9IGdldFRva2VuUHJpb3JpdHkoY3VycmVudFRva2VuKTsNCi0JCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbMF0gPSAwOw0KLQkJCQkJCS8vIGJldHRlciB0b2tlbiBtZWFucyB0aGUgd2hvbGUgbGluZSB1bnRpbCBub3cgaXMgdGhlIGZpcnN0IHN1YnN0cmluZw0KKyAgICAgaWYgKChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50IDwgc3BsaXRUb2tlbkRlcHRoDQorICAgICAgfHwgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoDQorICAgICAgICYmIHNwbGl0VG9rZW5Qcmlvcml0eSA+IGdldFRva2VuUHJpb3JpdHkoY3VycmVudFRva2VuKSkpDQorICAgICAgJiYNCisgICAgICAgISgoY3VycmVudFRva2VuID09IFRva2VuTmFtZVBMVVMgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZU1JTlVTKQ0KKyAgICAgICAgJiYgKHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFIHx8IHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNLRVQgfHwgc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb24gPT0gMCkpKXsNCisgICAgICAvLyB0aGUgY3VycmVudCB0b2tlbiBpcyBiZXR0ZXIgdGhhbiB0aGUgb25lIHdlIGN1cnJlbnRseSBoYXZlDQorICAgICAgLy8gKGluIGxldmVsIG9yIGluIHByaW9yaXR5IGlmIHNhbWUgbGV2ZWwpDQorICAgICAgLy8gcmVzZXQgdGhlIHN1YnN0cmluZ3NDb3VudA0KKyAgICAgIHNwbGl0VG9rZW5EZXB0aCA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQ7DQorICAgICAgc3BsaXRUb2tlblR5cGUgPSBjdXJyZW50VG9rZW47DQorICAgICAgc3BsaXRUb2tlblByaW9yaXR5ID0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pOw0KKyAgICAgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1swXSA9IDA7DQorICAgICAgLy8gYmV0dGVyIHRva2VuIG1lYW5zIHRoZSB3aG9sZSBsaW5lIHVudGlsIG5vdyBpcyB0aGUgZmlyc3Qgc3Vic3RyaW5nDQogDQotCQkJCQkJaWYgKHNlcGFyYXRlRmlyc3RBcmd1bWVudE9uKGZpcnN0VG9rZW5PbkxpbmUpDQotCQkJCQkJCSYmIG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPiAwKSB7DQotCQkJCQkJCXN1YnN0cmluZ3NDb3VudCA9IDI7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3Vic3RyaW5ncw0KKyAgICAgIGlmIChzZXBhcmF0ZUZpcnN0QXJndW1lbnRPbihmaXJzdFRva2VuT25MaW5lKQ0KKyAgICAgICAmJiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID4gMCkgew0KKyAgICAgICBzdWJzdHJpbmdzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MNCiANCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW3NwbGl0VG9rZW5EZXB0aCAtIDFdOw0KLQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbMV0gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltzcGxpdFRva2VuRGVwdGggLSAxXTsNCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1sxXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50ID0gMzsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMNCi0JCQkJCQkJc3BsaXRPcGVyYXRvcnNbMF0gPSAwOw0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc1sxXSA9IDA7DQotCQkJCQkJCXNwbGl0T3BlcmF0b3JzWzJdID0gY3VycmVudFRva2VuOw0KLQkJCQkJCQlwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQotCQkJCQkJCS8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQlzdWJzdHJpbmdzQ291bnQgPSAxOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MNCisgICAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW3NwbGl0VG9rZW5EZXB0aCAtIDFdOw0KKyAgICAgICBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbMV0gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbltzcGxpdFRva2VuRGVwdGggLSAxXTsNCisgICAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1sxXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KKyAgICAgICBzcGxpdE9wZXJhdG9yc0NvdW50ID0gMzsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMNCisgICAgICAgc3BsaXRPcGVyYXRvcnNbMF0gPSAwOw0KKyAgICAgICBzcGxpdE9wZXJhdG9yc1sxXSA9IDA7DQorICAgICAgIHNwbGl0T3BlcmF0b3JzWzJdID0gY3VycmVudFRva2VuOw0KKyAgICAgICBwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQorICAgICAgIC8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICBzdWJzdHJpbmdzQ291bnQgPSAxOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MNCiANCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KLQkJCQkJCQkvLyBzdWJzdHJpbmcgZW5kcyBvbiBvcGVyYXRvciBzdGFydA0KLQkJCQkJCQlwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQotCQkJCQkJCS8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCi0JCQkJCQkJc3BsaXRPcGVyYXRvcnNDb3VudCA9IDI7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3BsaXQgb3BlcmF0b3JzDQotCQkJCQkJCXNwbGl0T3BlcmF0b3JzWzBdID0gMDsNCi0JCQkJCQkJLy8gbm90aGluZyBmb3IgZmlyc3Qgb3BlcmFuZCBzaW5jZSBvcGVyYXRvciB3aWxsIGJlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBzZWNvbmQgb3BlcmFuZA0KLQkJCQkJCQlzcGxpdE9wZXJhdG9yc1sxXSA9IGN1cnJlbnRUb2tlbjsNCisgICAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOw0KKyAgICAgICAvLyBzdWJzdHJpbmcgZW5kcyBvbiBvcGVyYXRvciBzdGFydA0KKyAgICAgICBwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQorICAgICAgIC8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQNCisgICAgICAgc3BsaXRPcGVyYXRvcnNDb3VudCA9IDI7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3BsaXQgb3BlcmF0b3JzDQorICAgICAgIHNwbGl0T3BlcmF0b3JzWzBdID0gMDsNCisgICAgICAgLy8gbm90aGluZyBmb3IgZmlyc3Qgb3BlcmFuZCBzaW5jZSBvcGVyYXRvciB3aWxsIGJlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBzZWNvbmQgb3BlcmFuZA0KKyAgICAgICBzcGxpdE9wZXJhdG9yc1sxXSA9IGN1cnJlbnRUb2tlbjsNCiANCi0JCQkJCQl9DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWlmIChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IHNwbGl0VG9rZW5EZXB0aA0KLQkJCQkJCQkmJiBzcGxpdFRva2VuUHJpb3JpdHkgPT0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKSB7DQotCQkJCQkJCS8vIGlmIGFub3RoZXIgdG9rZW4gd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyBmb3VuZCwNCi0JCQkJCQkJLy8gcHVzaCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHN1YnN0cmluZyBhbmQNCi0JCQkJCQkJLy8gcHVzaCB0aGUgdG9rZW4gaW50byB0aGUgc3RhY2suDQotCQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhcnJheSBvYmplY3QgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuDQotCQkJCQkJCWlmIChzdWJzdHJpbmdzQ291bnQgPT0gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLmxlbmd0aCkgew0KLQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgNCi0JCQkJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLCANCi0JCQkJCQkJCQkJMCwgDQotCQkJCQkJCQkJCShzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQotCQkJCQkJCQkJCTAsIA0KLQkJCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQpOyANCi0JCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQotCQkJCQkJCQkJCXN1YnN0cmluZ3NFbmRQb3NpdGlvbnMsIA0KLQkJCQkJCQkJCQkwLCANCi0JCQkJCQkJCQkJKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQotCQkJCQkJCQkJCTAsIA0KLQkJCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQpOyANCi0JCQkJCQkJfQ0KLQkJCQkJCQlpZiAoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSBzcGxpdE9wZXJhdG9ycy5sZW5ndGgpIHsNCi0JCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQotCQkJCQkJCQkJCXNwbGl0T3BlcmF0b3JzLCANCi0JCQkJCQkJCQkJMCwgDQotCQkJCQkJCQkJCShzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudCAqIDJdKSwgDQotCQkJCQkJCQkJCTAsIA0KLQkJCQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50KTsgDQotCQkJCQkJCX0NCi0JCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudF0gPSBwb3NpdGlvbjsNCi0JCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnQrK10gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCi0JCQkJCQkJLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQNCi0JCQkJCQkJcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOw0KLQkJCQkJCQkvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kDQotCQkJCQkJCXNwbGl0T3BlcmF0b3JzW3NwbGl0T3BlcmF0b3JzQ291bnQrK10gPSBjdXJyZW50VG9rZW47DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWlmIChpc0NvbW1lbnQoY3VycmVudFRva2VuKSkgew0KLQkJCQlsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCi0JCQl9IGVsc2Ugew0KLQkJCQlsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPSAtMTsNCi0JCQl9DQotCQl9DQotCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvLyBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdCwgcmV0dXJuIG51bGwuDQotCWlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID09IDApDQotCQlyZXR1cm4gbnVsbDsNCisgICAgICB9DQorICAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IHNwbGl0VG9rZW5EZXB0aA0KKyAgICAgICAmJiBzcGxpdFRva2VuUHJpb3JpdHkgPT0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKSB7DQorICAgICAgIC8vIGlmIGFub3RoZXIgdG9rZW4gd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyBmb3VuZCwNCisgICAgICAgLy8gcHVzaCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHN1YnN0cmluZyBhbmQNCisgICAgICAgLy8gcHVzaCB0aGUgdG9rZW4gaW50byB0aGUgc3RhY2suDQorICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBhcnJheSBvYmplY3QgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuDQorICAgICAgIGlmIChzdWJzdHJpbmdzQ291bnQgPT0gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLmxlbmd0aCkgew0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSgNCisgICAgICAgICAgc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLCANCisgICAgICAgICAgMCwgDQorICAgICAgICAgIChzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQorICAgICAgICAgIDAsIA0KKyAgICAgICAgICBzdWJzdHJpbmdzQ291bnQpOyANCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoDQorICAgICAgICAgIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMsIA0KKyAgICAgICAgICAwLCANCisgICAgICAgICAgKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQorICAgICAgICAgIDAsIA0KKyAgICAgICAgICBzdWJzdHJpbmdzQ291bnQpOyANCisgICAgICAgfQ0KKyAgICAgICBpZiAoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSBzcGxpdE9wZXJhdG9ycy5sZW5ndGgpIHsNCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoDQorICAgICAgICAgIHNwbGl0T3BlcmF0b3JzLCANCisgICAgICAgICAgMCwgDQorICAgICAgICAgIChzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudCAqIDJdKSwgDQorICAgICAgICAgIDAsIA0KKyAgICAgICAgICBzcGxpdE9wZXJhdG9yc0NvdW50KTsgDQorICAgICAgIH0NCisgICAgICAgc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudF0gPSBwb3NpdGlvbjsNCisgICAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnQrK10gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCisgICAgICAgLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQNCisgICAgICAgcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOw0KKyAgICAgICAvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kDQorICAgICAgIHNwbGl0T3BlcmF0b3JzW3NwbGl0T3BlcmF0b3JzQ291bnQrK10gPSBjdXJyZW50VG9rZW47DQorICAgICAgfQ0KKyAgICAgfQ0KKyAgICAgZGVmYXVsdCA6DQorICAgICAgYnJlYWs7DQorICAgfQ0KKyAgIGlmIChpc0NvbW1lbnQoY3VycmVudFRva2VuKSkgew0KKyAgICBsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsNCisgICB9IGVsc2Ugew0KKyAgICBsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPSAtMTsNCisgICB9DQorICB9DQorIH0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7DQorICByZXR1cm4gbnVsbDsNCisgfQ0KKyAvLyBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdCwgcmV0dXJuIG51bGwuDQorIGlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID09IDApDQorICByZXR1cm4gbnVsbDsNCiANCi0JLy8gIyMgU1BFQ0lBTCBDQVNFUyBCRUdJTg0KLQlpZiAoKChzcGxpdE9wZXJhdG9yc0NvdW50ID09IDIgJiYgc3BsaXRPcGVyYXRvcnNbMV0gPT0gVG9rZW5OYW1lRE9UICYmIHNwbGl0VG9rZW5EZXB0aCA9PSAwICYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA+IC0xKQ0KLQkJCXx8IChzcGxpdE9wZXJhdG9yc0NvdW50ID4gMiAmJiBzcGxpdE9wZXJhdG9yc1sxXSA9PSBUb2tlbk5hbWVET1QgJiYgc3BsaXRUb2tlbkRlcHRoID09IDAgJiYgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uID4gLTEgJiYgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uIDw9IG9wdGlvbnMubWF4TGluZUxlbmd0aCkNCi0JCQl8fCAoc2VwYXJhdGVGaXJzdEFyZ3VtZW50T24oZmlyc3RUb2tlbk9uTGluZSkgJiYgc3BsaXRUb2tlbkRlcHRoID4gMCAmJiBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPiAtMSkpDQotCQkmJiAobGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uPHNwbGl0U2Nhbm5lci5zb3VyY2UubGVuZ3RoICYmIHNwbGl0U2Nhbm5lci5zb3VyY2VbbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uXSE9JyknKSl7DQotCQkJLy8gZml4IGZvciAxRkg0SjJIOiBMRkNPTTpXSU5OVCAtIEZvcm1hdHRlciAtIEVtcHR5IHBhcmVudGhlc2lzIHNob3VsZCBub3QgYmUgYnJva2VuIG9uIHR3byBsaW5lcw0KLQkJLy8gb25seSBvbmUgc3BsaXQgb24gYSB0b3AgbGV2ZWwgLg0KLQkJLy8gb3IgbW9yZSB0aGFuIG9uZSBzcGxpdCBvbiAuIGFuZCBzdWJzdHJpbmcgYmVmb3JlIG9wZW4gcGFyZW50aGVzaXMgZml0cyBvbmUgbGluZS4NCi0JCS8vIG9yIHNwbGl0IGluc2lkZSBwYXJlbnRoZXNpcyBhbmQgZmlyc3QgdG9rZW4gaXMgbm90IGEgZm9yL3doaWxlL2lmDQotCQlTcGxpdExpbmUgc2wgPSBzcGxpdChzdHJpbmdUb1NwbGl0LnN1YnN0cmluZyhsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pLCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pOw0KLQkJaWYgKHNsID09IG51bGwgfHwgc2wub3BlcmF0b3JzWzBdICE9IFRva2VuTmFtZUNPTU1BKSB7DQotCQkJLy8gdHJpbSgpIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBibGFua3MgYXQgdGhlIGVuZCBvZiB0aGUgc3Vic3RyaW5nLiBTZWUgUFIgMUZHWVBJMQ0KLQkJCXJldHVybiBuZXcgU3BsaXRMaW5lKA0KLQkJCQkJbmV3IGludFtdIHswLCAwfSwgDQotCQkJCQluZXcgU3RyaW5nW10gew0KLQkJCQkJCXN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKDAsIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbikudHJpbSgpLCANCi0JCQkJCQlzdHJpbmdUb1NwbGl0LnN1YnN0cmluZyhsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pfSwNCi0JCQkJCW5ldyBpbnRbXSB7b2Zmc2V0SW5HbG9iYWxMaW5lLCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gKyBvZmZzZXRJbkdsb2JhbExpbmV9KTsgDQotCQl9IGVsc2Ugew0KLQkJCQ0KLQkJCS8vIHJpZ2h0IHN1YnN0cmluZyBjYW4gYmUgc3BsaXQgYW5kIGlzIHNwbGl0IG9uIGNvbW1hDQotCQkJLy8gY29weSBzdWJzdHJpbmdzIGFuZCBvcGVyYXRvcnMNCi0JCQkvLyBleGNlcHQgaWYgdGhlIDFzdCBzdHJpbmcgaXMgZW1wdHkuDQorIC8vICMjIFNQRUNJQUwgQ0FTRVMgQkVHSU4NCisgaWYgKCgoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSAyICYmIHNwbGl0T3BlcmF0b3JzWzFdID09IFRva2VuTmFtZURPVCAmJiBzcGxpdFRva2VuRGVwdGggPT0gMCAmJiBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPiAtMSkNCisgICB8fCAoc3BsaXRPcGVyYXRvcnNDb3VudCA+IDIgJiYgc3BsaXRPcGVyYXRvcnNbMV0gPT0gVG9rZW5OYW1lRE9UICYmIHNwbGl0VG9rZW5EZXB0aCA9PSAwICYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA+IC0xICYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA8PSBvcHRpb25zLm1heExpbmVMZW5ndGgpDQorICAgfHwgKHNlcGFyYXRlRmlyc3RBcmd1bWVudE9uKGZpcnN0VG9rZW5PbkxpbmUpICYmIHNwbGl0VG9rZW5EZXB0aCA+IDAgJiYgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uID4gLTEpKQ0KKyAgJiYgKGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbjxzcGxpdFNjYW5uZXIuc291cmNlLmxlbmd0aCAmJiBzcGxpdFNjYW5uZXIuc291cmNlW2xhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbl0hPScpJykpew0KKyAgIC8vIGZpeCBmb3IgMUZINEoySDogTEZDT006V0lOTlQgLSBGb3JtYXR0ZXIgLSBFbXB0eSBwYXJlbnRoZXNpcyBzaG91bGQgbm90IGJlIGJyb2tlbiBvbiB0d28gbGluZXMNCisgIC8vIG9ubHkgb25lIHNwbGl0IG9uIGEgdG9wIGxldmVsIC4NCisgIC8vIG9yIG1vcmUgdGhhbiBvbmUgc3BsaXQgb24gLiBhbmQgc3Vic3RyaW5nIGJlZm9yZSBvcGVuIHBhcmVudGhlc2lzIGZpdHMgb25lIGxpbmUuDQorICAvLyBvciBzcGxpdCBpbnNpZGUgcGFyZW50aGVzaXMgYW5kIGZpcnN0IHRva2VuIGlzIG5vdCBhIGZvci93aGlsZS9pZg0KKyAgU3BsaXRMaW5lIHNsID0gc3BsaXQoc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcobGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKSwgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKTsNCisgIGlmIChzbCA9PSBudWxsIHx8IHNsLm9wZXJhdG9yc1swXSAhPSBUb2tlbk5hbWVDT01NQSkgew0KKyAgIC8vIHRyaW0oKSBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgZXh0cmEgYmxhbmtzIGF0IHRoZSBlbmQgb2YgdGhlIHN1YnN0cmluZy4gU2VlIFBSIDFGR1lQSTENCisgICByZXR1cm4gbmV3IFNwbGl0TGluZSgNCisgICAgIG5ldyBpbnRbXSB7MCwgMH0sIA0KKyAgICAgbmV3IFN0cmluZ1tdIHsNCisgICAgICBzdHJpbmdUb1NwbGl0LnN1YnN0cmluZygwLCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pLnRyaW0oKSwgDQorICAgICAgc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcobGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKX0sDQorICAgICBuZXcgaW50W10ge29mZnNldEluR2xvYmFsTGluZSwgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uICsgb2Zmc2V0SW5HbG9iYWxMaW5lfSk7IA0KKyAgfSBlbHNlIHsNCisgICANCisgICAvLyByaWdodCBzdWJzdHJpbmcgY2FuIGJlIHNwbGl0IGFuZCBpcyBzcGxpdCBvbiBjb21tYQ0KKyAgIC8vIGNvcHkgc3Vic3RyaW5ncyBhbmQgb3BlcmF0b3JzDQorICAgLy8gZXhjZXB0IGlmIHRoZSAxc3Qgc3RyaW5nIGlzIGVtcHR5Lg0KIA0KLQkJCWludCBzdGFydEluZGV4ID0gKHNsLnN1YnN0cmluZ3NbMF0ubGVuZ3RoKCk9PTApPzE6MDsNCisgICBpbnQgc3RhcnRJbmRleCA9IChzbC5zdWJzdHJpbmdzWzBdLmxlbmd0aCgpPT0wKT8xOjA7DQogDQotCQkJaW50IHN1YlN0cmluZ3NMZW5ndGggPSBzbC5zdWJzdHJpbmdzLmxlbmd0aCArIDEgLSBzdGFydEluZGV4Ow0KLQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc3ViU3RyaW5nc0xlbmd0aF07DQotCQkJaW50W10gc3RhcnRJbmRleGVzID0gbmV3IGludFtzdWJTdHJpbmdzTGVuZ3RoXTsNCi0JCQlpbnQgb3BlcmF0b3JzTGVuZ3RoID0gc2wub3BlcmF0b3JzLmxlbmd0aCArIDEgLSBzdGFydEluZGV4Ow0KLQkJCWludFtdIG9wZXJhdG9ycyA9IG5ldyBpbnRbb3BlcmF0b3JzTGVuZ3RoXTsNCisgICBpbnQgc3ViU3RyaW5nc0xlbmd0aCA9IHNsLnN1YnN0cmluZ3MubGVuZ3RoICsgMSAtIHN0YXJ0SW5kZXg7DQorICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzdWJTdHJpbmdzTGVuZ3RoXTsNCisgICBpbnRbXSBzdGFydEluZGV4ZXMgPSBuZXcgaW50W3N1YlN0cmluZ3NMZW5ndGhdOw0KKyAgIGludCBvcGVyYXRvcnNMZW5ndGggPSBzbC5vcGVyYXRvcnMubGVuZ3RoICsgMSAtIHN0YXJ0SW5kZXg7DQorICAgaW50W10gb3BlcmF0b3JzID0gbmV3IGludFtvcGVyYXRvcnNMZW5ndGhdOw0KIA0KLQkJCXJlc3VsdFswXSA9IHN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKDAsIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbik7DQotCQkJb3BlcmF0b3JzWzBdID0gMDsNCisgICByZXN1bHRbMF0gPSBzdHJpbmdUb1NwbGl0LnN1YnN0cmluZygwLCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pOw0KKyAgIG9wZXJhdG9yc1swXSA9IDA7DQogDQotCQkJU3lzdGVtLmFycmF5Y29weShzbC5zdGFydFN1YnN0cmluZ3NJbmRleGVzLCBzdGFydEluZGV4LCBzdGFydEluZGV4ZXMsIDEsIHN1YlN0cmluZ3NMZW5ndGggLSAxKTsNCi0JCQlmb3IgKGludCBpID0gc3ViU3RyaW5nc0xlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQotCQkJCXN0YXJ0SW5kZXhlc1tpXSArPSBvZmZzZXRJbkdsb2JhbExpbmU7DQotCQkJfQ0KLQkJCVN5c3RlbS5hcnJheWNvcHkoc2wuc3Vic3RyaW5ncywgc3RhcnRJbmRleCwgcmVzdWx0LCAxLCBzdWJTdHJpbmdzTGVuZ3RoIC0gMSk7DQotCQkJU3lzdGVtLmFycmF5Y29weShzbC5vcGVyYXRvcnMsIHN0YXJ0SW5kZXgsIG9wZXJhdG9ycywgMSwgb3BlcmF0b3JzTGVuZ3RoIC0gMSk7DQorICAgU3lzdGVtLmFycmF5Y29weShzbC5zdGFydFN1YnN0cmluZ3NJbmRleGVzLCBzdGFydEluZGV4LCBzdGFydEluZGV4ZXMsIDEsIHN1YlN0cmluZ3NMZW5ndGggLSAxKTsNCisgICBmb3IgKGludCBpID0gc3ViU3RyaW5nc0xlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgIHN0YXJ0SW5kZXhlc1tpXSArPSBvZmZzZXRJbkdsb2JhbExpbmU7DQorICAgfQ0KKyAgIFN5c3RlbS5hcnJheWNvcHkoc2wuc3Vic3RyaW5ncywgc3RhcnRJbmRleCwgcmVzdWx0LCAxLCBzdWJTdHJpbmdzTGVuZ3RoIC0gMSk7DQorICAgU3lzdGVtLmFycmF5Y29weShzbC5vcGVyYXRvcnMsIHN0YXJ0SW5kZXgsIG9wZXJhdG9ycywgMSwgb3BlcmF0b3JzTGVuZ3RoIC0gMSk7DQogDQotCQkJcmV0dXJuIG5ldyBTcGxpdExpbmUob3BlcmF0b3JzLCByZXN1bHQsIHN0YXJ0SW5kZXhlcyk7DQotCQl9DQotCX0NCisgICByZXR1cm4gbmV3IFNwbGl0TGluZShvcGVyYXRvcnMsIHJlc3VsdCwgc3RhcnRJbmRleGVzKTsNCisgIH0NCisgfQ0KIA0KLQkvLyBpZiB0aGUgbGFzdCB0b2tlbiBpcyBhIGNvbW1lbnQgYW5kIHRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBjb21tZW50IGZpdHMgb24gYSBsaW5lLA0KLQkvLyBzcGxpdCBiZWZvcmUgdGhlIGNvbW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0Lg0KLQlpZiAobGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID4gLTENCi0JCSYmIGxhc3RDb21tZW50U3RhcnRQb3NpdGlvbiA8IG9wdGlvbnMubWF4TGluZUxlbmd0aA0KLQkJJiYgc3BsaXRUb2tlblByaW9yaXR5ID4gNTApIHsNCi0JCWludCBlbmQgPSBsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb247DQotCQlpbnQgc3RhcnQgPSBsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb247DQotCQlpZiAoc3RyaW5nVG9TcGxpdC5jaGFyQXQoZW5kIC0gMSkgPT0gJyAnKSB7DQotCQkJZW5kLS07DQotCQl9DQotCQlpZiAoc3RhcnQgIT0gZW5kICYmIHN0cmluZ1RvU3BsaXQuY2hhckF0KHN0YXJ0KSA9PSAnICcpIHsNCi0JCQlzdGFydCsrOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBTcGxpdExpbmUoDQotCQkJCW5ldyBpbnRbXSB7MCwgMH0sIA0KLQkJCQluZXcgU3RyaW5nW10gew0KLQkJCQkJc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcoMCwgZW5kKSwgDQotCQkJCQlzdHJpbmdUb1NwbGl0LnN1YnN0cmluZyhzdGFydCl9LA0KLQkJCQluZXcgaW50W10gezAsIHN0YXJ0fSk7IA0KLQl9DQorIC8vIGlmIHRoZSBsYXN0IHRva2VuIGlzIGEgY29tbWVudCBhbmQgdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGNvbW1lbnQgZml0cyBvbiBhIGxpbmUsDQorIC8vIHNwbGl0IGJlZm9yZSB0aGUgY29tbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuDQorIGlmIChsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPiAtMQ0KKyAgJiYgbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uIDwgb3B0aW9ucy5tYXhMaW5lTGVuZ3RoDQorICAmJiBzcGxpdFRva2VuUHJpb3JpdHkgPiA1MCkgew0KKyAgaW50IGVuZCA9IGxhc3RDb21tZW50U3RhcnRQb3NpdGlvbjsNCisgIGludCBzdGFydCA9IGxhc3RDb21tZW50U3RhcnRQb3NpdGlvbjsNCisgIGlmIChzdHJpbmdUb1NwbGl0LmNoYXJBdChlbmQgLSAxKSA9PSAnICcpIHsNCisgICBlbmQtLTsNCisgIH0NCisgIGlmIChzdGFydCAhPSBlbmQgJiYgc3RyaW5nVG9TcGxpdC5jaGFyQXQoc3RhcnQpID09ICcgJykgew0KKyAgIHN0YXJ0Kys7DQorICB9DQorICByZXR1cm4gbmV3IFNwbGl0TGluZSgNCisgICAgbmV3IGludFtdIHswLCAwfSwgDQorICAgIG5ldyBTdHJpbmdbXSB7DQorICAgICBzdHJpbmdUb1NwbGl0LnN1YnN0cmluZygwLCBlbmQpLCANCisgICAgIHN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKHN0YXJ0KX0sDQorICAgIG5ldyBpbnRbXSB7MCwgc3RhcnR9KTsgDQorIH0NCiANCi0JaWYgKHBvc2l0aW9uICE9IHN0cmluZ1RvU3BsaXQubGVuZ3RoKCkpIHsNCi0JCQ0KLQkJaWYgKHN1YnN0cmluZ3NDb3VudCA9PSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMubGVuZ3RoKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weSgNCi0JCQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucywgDQotCQkJCQkwLCANCi0JCQkJCShzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQotCQkJCQkwLCANCi0JCQkJCXN1YnN0cmluZ3NDb3VudCk7IA0KLQkJCVN5c3RlbS5hcnJheWNvcHkoDQotCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zLCANCi0JCQkJCTAsIA0KLQkJCQkJKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwgDQotCQkJCQkwLCANCi0JCQkJCXN1YnN0cmluZ3NDb3VudCk7IA0KLQkJfQ0KLQkJLy8gYXZvaWQgZW1wdHkgZXh0cmEgc3Vic3RyaW5nLCBlLmcuIGxpbmUgdGVybWluYXRlZCB3aXRoIGEgc2VtaS1jb2xvbg0KLQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudF0gPSBwb3NpdGlvbjsNCi0JCXN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbc3Vic3RyaW5nc0NvdW50KytdID0gc3RyaW5nVG9TcGxpdC5sZW5ndGgoKTsNCi0JfQ0KLQkNCi0JaWYgKHNwbGl0T3BlcmF0b3JzQ291bnQgPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoKSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KA0KLQkJCQlzcGxpdE9wZXJhdG9ycywgDQotCQkJCTAsIA0KLQkJCQkoc3BsaXRPcGVyYXRvcnMgPSBuZXcgaW50W3NwbGl0T3BlcmF0b3JzQ291bnQgKiAyXSksIA0KLQkJCQkwLCANCi0JCQkJc3BsaXRPcGVyYXRvcnNDb3VudCk7IA0KLQl9DQorIGlmIChwb3NpdGlvbiAhPSBzdHJpbmdUb1NwbGl0Lmxlbmd0aCgpKSB7DQorICANCisgIGlmIChzdWJzdHJpbmdzQ291bnQgPT0gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLmxlbmd0aCkgew0KKyAgIFN5c3RlbS5hcnJheWNvcHkoDQorICAgICBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsIA0KKyAgICAgMCwgDQorICAgICAoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnQgKiAyXSksIA0KKyAgICAgMCwgDQorICAgICBzdWJzdHJpbmdzQ291bnQpOyANCisgICBTeXN0ZW0uYXJyYXljb3B5KA0KKyAgICAgc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywgDQorICAgICAwLCANCisgICAgIChzdWJzdHJpbmdzRW5kUG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnQgKiAyXSksIA0KKyAgICAgMCwgDQorICAgICBzdWJzdHJpbmdzQ291bnQpOyANCisgIH0NCisgIC8vIGF2b2lkIGVtcHR5IGV4dHJhIHN1YnN0cmluZywgZS5nLiBsaW5lIHRlcm1pbmF0ZWQgd2l0aCBhIHNlbWktY29sb24NCisgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnRdID0gcG9zaXRpb247DQorICBzdWJzdHJpbmdzRW5kUG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudCsrXSA9IHN0cmluZ1RvU3BsaXQubGVuZ3RoKCk7DQorIH0NCisgDQorIGlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID09IHNwbGl0T3BlcmF0b3JzLmxlbmd0aCkgew0KKyAgU3lzdGVtLmFycmF5Y29weSgNCisgICAgc3BsaXRPcGVyYXRvcnMsIA0KKyAgICAwLCANCisgICAgKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLCANCisgICAgMCwgDQorICAgIHNwbGl0T3BlcmF0b3JzQ291bnQpOyANCisgfQ0KIA0KLQlzcGxpdE9wZXJhdG9yc1tzcGxpdE9wZXJhdG9yc0NvdW50XSA9IDA7DQorIHNwbGl0T3BlcmF0b3JzW3NwbGl0T3BlcmF0b3JzQ291bnRdID0gMDsNCiANCi0JLy8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgc3RhY2sgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgU3RyaW5nVG9TUGxpdA0KLQkvLyArMSBiZWNhdXNlIHRoZSBzdWJzdHJpbmcgbWV0aG9kIGV4Y2x1ZGVzIHRoZSBsYXN0IGNoYXJhY3Rlcg0KLQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3N1YnN0cmluZ3NDb3VudF07DQotCWZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RyaW5nc0NvdW50OyBpKyspIHsNCi0JCWludCBzdGFydCA9IHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXTsNCi0JCWludCBlbmQgPSBzdWJzdHJpbmdzRW5kUG9zaXRpb25zW2ldOw0KLQkJaWYgKHN0cmluZ1RvU3BsaXQuY2hhckF0KHN0YXJ0KSA9PSAnICcpIHsNCi0JCQlzdGFydCsrOw0KLQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXSsrOw0KLQkJfQ0KLQkJaWYgKGVuZCAhPSBzdGFydCAmJiBzdHJpbmdUb1NwbGl0LmNoYXJBdChlbmQgLSAxKSA9PSAnICcpIHsNCi0JCQllbmQtLTsNCi0JCX0NCisgLy8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgc3RhY2sgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgU3RyaW5nVG9TUGxpdA0KKyAvLyArMSBiZWNhdXNlIHRoZSBzdWJzdHJpbmcgbWV0aG9kIGV4Y2x1ZGVzIHRoZSBsYXN0IGNoYXJhY3Rlcg0KKyBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3N1YnN0cmluZ3NDb3VudF07DQorIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RyaW5nc0NvdW50OyBpKyspIHsNCisgIGludCBzdGFydCA9IHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXTsNCisgIGludCBlbmQgPSBzdWJzdHJpbmdzRW5kUG9zaXRpb25zW2ldOw0KKyAgaWYgKHN0cmluZ1RvU3BsaXQuY2hhckF0KHN0YXJ0KSA9PSAnICcpIHsNCisgICBzdGFydCsrOw0KKyAgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXSsrOw0KKyAgfQ0KKyAgaWYgKGVuZCAhPSBzdGFydCAmJiBzdHJpbmdUb1NwbGl0LmNoYXJBdChlbmQgLSAxKSA9PSAnICcpIHsNCisgICBlbmQtLTsNCisgIH0NCiANCi0JCXJlc3VsdFtpXSA9IHN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOw0KLQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW2ldICs9IG9mZnNldEluR2xvYmFsTGluZTsNCi0JfQ0KLQlpZiAoc3BsaXRPcGVyYXRvcnNDb3VudCA+IHN1YnN0cmluZ3NDb3VudCkgew0KLQkJU3lzdGVtLmFycmF5Y29weShzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsIDAsIChzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMgPSBuZXcgaW50W3NwbGl0T3BlcmF0b3JzQ291bnRdKSwgMCwgc3Vic3RyaW5nc0NvdW50KTsNCi0JCVN5c3RlbS5hcnJheWNvcHkoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywgMCwgKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3NwbGl0T3BlcmF0b3JzQ291bnRdKSwgMCwgc3Vic3RyaW5nc0NvdW50KTsNCi0JCWZvciAoaW50IGkgPSBzdWJzdHJpbmdzQ291bnQ7IGkgPCBzcGxpdE9wZXJhdG9yc0NvdW50OyBpKyspIHsNCi0JCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbaV0gPSBwb3NpdGlvbjsNCi0JCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zW2ldID0gcG9zaXRpb247DQotCQl9DQotCQlTeXN0ZW0uYXJyYXljb3B5KHNwbGl0T3BlcmF0b3JzLCAwLCAoc3BsaXRPcGVyYXRvcnMgPSBuZXcgaW50W3NwbGl0T3BlcmF0b3JzQ291bnRdKSwgMCwgc3BsaXRPcGVyYXRvcnNDb3VudCk7DQotCX0gZWxzZSB7DQotCQlTeXN0ZW0uYXJyYXljb3B5KHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucywgMCwgKHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50XSksIDAsIHN1YnN0cmluZ3NDb3VudCk7DQotCQlTeXN0ZW0uYXJyYXljb3B5KHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMsIDAsIChzdWJzdHJpbmdzRW5kUG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnRdKSwgMCwgc3Vic3RyaW5nc0NvdW50KTsJDQotCQlTeXN0ZW0uYXJyYXljb3B5KHNwbGl0T3BlcmF0b3JzLCAwLCAoc3BsaXRPcGVyYXRvcnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudF0pLCAwLCBzdWJzdHJpbmdzQ291bnQpOw0KLQl9DQotCQ0KLQlTcGxpdExpbmUgc3BsaXRMaW5lID0gbmV3IFNwbGl0TGluZShzcGxpdE9wZXJhdG9ycywgcmVzdWx0LCBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMpOw0KLQlyZXR1cm4gc3BsaXRMaW5lOw0KKyAgcmVzdWx0W2ldID0gc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7DQorICBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbaV0gKz0gb2Zmc2V0SW5HbG9iYWxMaW5lOw0KKyB9DQorIGlmIChzcGxpdE9wZXJhdG9yc0NvdW50ID4gc3Vic3RyaW5nc0NvdW50KSB7DQorICBTeXN0ZW0uYXJyYXljb3B5KHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucywgMCwgKHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudF0pLCAwLCBzdWJzdHJpbmdzQ291bnQpOw0KKyAgU3lzdGVtLmFycmF5Y29weShzdWJzdHJpbmdzRW5kUG9zaXRpb25zLCAwLCAoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudF0pLCAwLCBzdWJzdHJpbmdzQ291bnQpOw0KKyAgZm9yIChpbnQgaSA9IHN1YnN0cmluZ3NDb3VudDsgaSA8IHNwbGl0T3BlcmF0b3JzQ291bnQ7IGkrKykgew0KKyAgIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uOw0KKyAgIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbaV0gPSBwb3NpdGlvbjsNCisgIH0NCisgIFN5c3RlbS5hcnJheWNvcHkoc3BsaXRPcGVyYXRvcnMsIDAsIChzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudF0pLCAwLCBzcGxpdE9wZXJhdG9yc0NvdW50KTsNCisgfSBlbHNlIHsNCisgIFN5c3RlbS5hcnJheWNvcHkoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLCAwLCAoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnRdKSwgMCwgc3Vic3RyaW5nc0NvdW50KTsNCisgIFN5c3RlbS5hcnJheWNvcHkoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywgMCwgKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudF0pLCAwLCBzdWJzdHJpbmdzQ291bnQpOyANCisgIFN5c3RlbS5hcnJheWNvcHkoc3BsaXRPcGVyYXRvcnMsIDAsIChzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50XSksIDAsIHN1YnN0cmluZ3NDb3VudCk7DQorIH0NCisgDQorIFNwbGl0TGluZSBzcGxpdExpbmUgPSBuZXcgU3BsaXRMaW5lKHNwbGl0T3BlcmF0b3JzLCByZXN1bHQsIHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyk7DQorIHJldHVybiBzcGxpdExpbmU7DQogDQogfQ0KIHByaXZhdGUgdm9pZCB1cGRhdGVNYXBwZWRQb3NpdGlvbnMoaW50IHN0YXJ0UG9zaXRpb24pIHsNCi0JaWYgKHBvc2l0aW9uc1RvTWFwID09IG51bGwpCXJldHVybjsNCi0JY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KLQlpbnQgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aDsNCi0Jd2hpbGUgKGluZGV4VG9NYXAgPCBwb3NpdGlvbnNUb01hcC5sZW5ndGggJiYgcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF0gPD0gc3RhcnRQb3NpdGlvbikgew0KLQkJaW50IHBvc1RvTWFwID0gcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF07DQotCQlpZiAocG9zVG9NYXAgPCAwIHx8IHBvc1RvTWFwID49IHNvdXJjZUxlbmd0aCl7IC8vIHByb3RlY3Rpb24gYWdhaW5zdCBvdXQgb2YgYm91bmRzIHBvc2l0aW9uDQotCQkJaW5kZXhUb01hcCA9IHBvc2l0aW9uc1RvTWFwLmxlbmd0aDsgLy8gbm8gbW9yZSBtYXBwaW5nDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc291cmNlW3Bvc1RvTWFwXSkpIHsNCi0JCQltYXBwZWRQb3NpdGlvbnNbaW5kZXhUb01hcF0gPSBzdGFydFBvc2l0aW9uICsgZ2xvYmFsRGVsdGEgKyBsaW5lRGVsdGE7DQotCQl9IGVsc2Ugew0KLQkJCW1hcHBlZFBvc2l0aW9uc1tpbmRleFRvTWFwXSA9IHBvc1RvTWFwICsgZ2xvYmFsRGVsdGEgKyBsaW5lRGVsdGE7DQotCQl9DQotCQlpbmRleFRvTWFwKys7DQotCX0NCisgaWYgKHBvc2l0aW9uc1RvTWFwID09IG51bGwpIHJldHVybjsNCisgY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOw0KKyBpbnQgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aDsNCisgd2hpbGUgKGluZGV4VG9NYXAgPCBwb3NpdGlvbnNUb01hcC5sZW5ndGggJiYgcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF0gPD0gc3RhcnRQb3NpdGlvbikgew0KKyAgaW50IHBvc1RvTWFwID0gcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF07DQorICBpZiAocG9zVG9NYXAgPCAwIHx8IHBvc1RvTWFwID49IHNvdXJjZUxlbmd0aCl7IC8vIHByb3RlY3Rpb24gYWdhaW5zdCBvdXQgb2YgYm91bmRzIHBvc2l0aW9uDQorICAgaW5kZXhUb01hcCA9IHBvc2l0aW9uc1RvTWFwLmxlbmd0aDsgLy8gbm8gbW9yZSBtYXBwaW5nDQorICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc291cmNlW3Bvc1RvTWFwXSkpIHsNCisgICBtYXBwZWRQb3NpdGlvbnNbaW5kZXhUb01hcF0gPSBzdGFydFBvc2l0aW9uICsgZ2xvYmFsRGVsdGEgKyBsaW5lRGVsdGE7DQorICB9IGVsc2Ugew0KKyAgIG1hcHBlZFBvc2l0aW9uc1tpbmRleFRvTWFwXSA9IHBvc1RvTWFwICsgZ2xvYmFsRGVsdGEgKyBsaW5lRGVsdGE7DQorICB9DQorICBpbmRleFRvTWFwKys7DQorIH0NCiB9DQogcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcHBlZFBvc2l0aW9uc1doaWxlU3BsaXR0aW5nKGludCBzdGFydFBvc2l0aW9uLCBpbnQgZW5kUG9zaXRpb24pIHsNCi0JaWYgKG1hcHBlZFBvc2l0aW9ucyA9PSBudWxsIHx8IG1hcHBlZFBvc2l0aW9ucy5sZW5ndGggPT0gaW5kZXhJbk1hcCkgcmV0dXJuOw0KKyBpZiAobWFwcGVkUG9zaXRpb25zID09IG51bGwgfHwgbWFwcGVkUG9zaXRpb25zLmxlbmd0aCA9PSBpbmRleEluTWFwKSByZXR1cm47DQogDQotCXdoaWxlKGluZGV4SW5NYXAgPCBtYXBwZWRQb3NpdGlvbnMubGVuZ3RoDQotCQkmJiBzdGFydFBvc2l0aW9uIDw9IG1hcHBlZFBvc2l0aW9uc1tpbmRleEluTWFwXQ0KLQkJJiYgbWFwcGVkUG9zaXRpb25zW2luZGV4SW5NYXBdIDwgZW5kUG9zaXRpb24NCi0JCSYmIGluZGV4SW5NYXAgPCBpbmRleFRvTWFwKSB7DQotCQkJbWFwcGVkUG9zaXRpb25zW2luZGV4SW5NYXBdKz0gc3BsaXREZWx0YTsNCi0JCQlpbmRleEluTWFwKys7DQotCX0NCisgd2hpbGUoaW5kZXhJbk1hcCA8IG1hcHBlZFBvc2l0aW9ucy5sZW5ndGgNCisgICYmIHN0YXJ0UG9zaXRpb24gPD0gbWFwcGVkUG9zaXRpb25zW2luZGV4SW5NYXBdDQorICAmJiBtYXBwZWRQb3NpdGlvbnNbaW5kZXhJbk1hcF0gPCBlbmRQb3NpdGlvbg0KKyAgJiYgaW5kZXhJbk1hcCA8IGluZGV4VG9NYXApIHsNCisgICBtYXBwZWRQb3NpdGlvbnNbaW5kZXhJbk1hcF0rPSBzcGxpdERlbHRhOw0KKyAgIGluZGV4SW5NYXArKzsNCisgfQ0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9Gb3JtYXR0ZXJPcHRpb25zLmphdmEgYi9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQppbmRleCBmZDZiN2FlLi4xNzVkOTY3IDEwMDY0NAotLS0gYS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQorKysgYi9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQpAQCAtOCw4ICs4LDIxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci4qOw0KIGltcG9ydCBqYXZhLnV0aWwuKjsNCiANCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGVyT3B0aW9ucyB7DQorcHVibGljIGNsYXNzIEZvcm1hdHRlck9wdGlvbnMgewkNCiANCisJLyoqDQorCSAqIE9wdGlvbiBJRHMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9JbnNlcnROZXdsaW5lQmVmb3JlT3BlbmluZ0JyYWNlID0gQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkgKyAiLm5ld2xpbmVPcGVuaW5nQnJhY2UiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9JbnNlcnROZXdsaW5lSW5Db250cm9sU3RhdGVtZW50ID0gQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkgKyAiLm5ld2xpbmVDb250cm9sU3RhdGVtZW50IjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fSW5zZXJ0TmV3TGluZUJldHdlZW5FbHNlQW5kSWYgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKSArICIubmV3bGluZUVsc2VJZiI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0luc2VydE5ld0xpbmVJbkVtcHR5QmxvY2sgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKSArICIubmV3bGluZUVtcHR5QmxvY2siOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9DbGVhckFsbEJsYW5rTGluZXMgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKSArICIubmV3bGluZUNsZWFyQWxsIjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU3BsaXRMaW5lRXhjZWVkaW5nTGVuZ3RoID0gQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkgKyAiLmxpbmVTcGxpdCI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0NvbXBhY3RBc3NpZ25tZW50ID0gQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkgKyAiLmNvbXBhY3RBc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVGFidWxhdGlvbkNoYXIgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKSArICIudGFidWxhdGlvbkNoYXIiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UYWJ1bGF0aW9uU2l6ZSA9IENvZGVGb3JtYXR0ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi50YWJ1bGF0aW9uU2l6ZSI7IC8vJE5PTi1OTFMtMSQNCisJDQogCS8vIGJ5IGRlZmF1bHQsIGRvIG5vdCBpbnNlcnQgYmxhbmsgbGluZSBiZWZvcmUgb3BlbmluZyBicmFjZQ0KIAlwdWJsaWMgYm9vbGVhbiBuZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZSA9IGZhbHNlOw0KIA0KQEAgLTMxLDcgKzQ0LDcgQEAKIAlwdWJsaWMgYm9vbGVhbiBjb21wYWN0RWxzZUlmTW9kZSA9IGZhbHNlOyAvLyBpZiB0cnVlLCBlbHNlIGFuZCBpZiBhcmUga2VwdCBvbiB0aGUgc2FtZSBsaW5lLg0KIAlwdWJsaWMgYm9vbGVhbiBuZXdMaW5lSW5FbXB0eUJsb2NrTW9kZSA9IHRydWU7IC8vIGlmIGZhbHNlLCBubyBuZXcgbGluZSBpbiB7fSBpZiBpdCdzIGVtcHR5Lg0KIAkNCi0JcHVibGljIGNoYXJbXSBsaW5lU2VwYXJhdG9yU2VxdWVuY2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIi8qbm9uTkxTKi8pLnRvQ2hhckFycmF5KCk7DQorCXB1YmxpYyBjaGFyW10gbGluZVNlcGFyYXRvclNlcXVlbmNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAvKiogDQogICogSW5pdGlhbGl6aW5nIHRoZSBmb3JtYXR0ZXIgb3B0aW9ucyB3aXRoIGRlZmF1bHQgc2V0dGluZ3MNCiAgKi8NCkBAIC00Miw3ICs1NSw4IEBACiAgKi8NCiBwdWJsaWMgRm9ybWF0dGVyT3B0aW9ucyhDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncyl7DQogCWlmIChzZXR0aW5ncyA9PSBudWxsKSByZXR1cm47DQotCS8vIGZpbHRlciBvcHRpb25zIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBjb21waWxlciBjb21wb25lbnQNCisNCisJLy8gZmlsdGVyIG9wdGlvbnMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIGZvcm1hdHRlciBjb21wb25lbnQNCiAJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKTsNCiAJZm9yIChpbnQgaSA9IDAsIG1heCA9IHNldHRpbmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsNCiAJCWlmIChzZXR0aW5nc1tpXS5nZXRDb21wb25lbnROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKXsNCkBAIC01MCwyNiArNjQsNyBAQAogCQl9DQogCX0NCiB9DQotLyoqDQotICogUmV0dXJucyBhbGwgdGhlIG9wdGlvbnMgb2YgdGhlIENvZGUgRm9ybWF0dGVyIHRvIGJlIHNob3duIGJ5IHRoZSBVSQ0KLSAqDQotICogQHBhcmFtIGxvY2FsZSBqYXZhLnV0aWwuTG9jYWxlDQotICogQHJldHVybiBjb20uaWJtLmNvbXBpbGVyLmphdmEuQ29uZmlndXJhYmxlT3B0aW9uW10NCi0gKi8NCi1wdWJsaWMgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0Q29uZmlndXJhYmxlT3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQotCVN0cmluZyBjb21wb25lbnROYW1lID0gQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCk7DQotCXJldHVybiBuZXcgQ29uZmlndXJhYmxlT3B0aW9uW10gew0KLQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAibmV3bGluZS5vcGVuaW5nQnJhY2UiLypub25OTFMqLywgIGxvY2FsZSwgbmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUgPyAwIDogMSksDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJuZXdsaW5lLmNvbnRyb2xTdGF0ZW1lbnQiLypub25OTFMqLywgIGxvY2FsZSwgbmV3bGluZUluQ29udHJvbFN0YXRlbWVudE1vZGUgPyAwIDogMSksDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJuZXdsaW5lLmNsZWFyQWxsIi8qbm9uTkxTKi8sICBsb2NhbGUsIGNsZWFyQWxsQmxhbmtMaW5lc01vZGUgPyAwIDogMSksDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJuZXdsaW5lLmVsc2VJZiIvKm5vbk5MUyovLCAgbG9jYWxlLCBjb21wYWN0RWxzZUlmTW9kZSA/IDAgOiAxKSwNCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgIm5ld2xpbmUuZW1wdHlCbG9jayIvKm5vbk5MUyovLCAgbG9jYWxlLCBuZXdMaW5lSW5FbXB0eUJsb2NrTW9kZSA/IDAgOiAxKSwNCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgImxpbmUuc3BsaXQiLypub25OTFMqLywgIGxvY2FsZSwgbWF4TGluZUxlbmd0aCksDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJzdHlsZS5jb21wYWN0QXNzaWdubWVudCIvKm5vbk5MUyovLCAgbG9jYWxlLCBjb21wYWN0QXNzaWdubWVudE1vZGUgPyAwIDogMSksDQotCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJ0YWJ1bGF0aW9uLmNoYXIiLypub25OTFMqLywgIGxvY2FsZSwgaW5kZW50V2l0aFRhYiA/IDAgOiAxKSwNCi0JCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgInRhYnVsYXRpb24uc2l6ZSIvKm5vbk5MUyovLCAgbG9jYWxlLCB0YWJTaXplKQkNCi0JfTsNCi19DQorDQogLyoqDQogICogDQogICogQHJldHVybiBpbnQNCkBAIC0xNjAsMzcgKzE1NSwzNiBAQAogICogQHBhcmFtIG5ld1ZhbHVlIDxDT0RFPmludDwvQ09ERT4NCiAgKi8NCiBwdWJsaWMgdm9pZCBzZXRPcHRpb24oQ29uZmlndXJhYmxlT3B0aW9uIHNldHRpbmcpIHsNCi0NCi0Jc3dpdGNoIChzZXR0aW5nLmdldElEKCkpIHsNCi0JCWNhc2UgMSA6IC8vIGluc2VydCBibGFuayBsaW5lIGJlZm9yZSBvcGVuaW5nIGJyYWNlDQotCQkJc2V0TmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAyIDogLy8gaW5zZXJ0IGJsYW5rIGxpbmUgYmVoaW5kIGtleXdvcmRzIChFTFNFLCBDQVRDSCwgRklOQUxMWSwuLi4pIGluIGNvbnRyb2wgc3RhdGVtZW50cw0KLQkJCXNldE5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnRNb2RlKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMyA6IC8vIGZsdXNoIGFsbCBibGFuayBsaW5lcw0KLQkJCXNldENsZWFyQWxsQmxhbmtMaW5lc01vZGUoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpID09IDApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSA0IDogLy8gcHV0cyBlbHNlIGlmIG9uIHRoZSBzYW1lIGxpbmUNCi0JCQlzZXRDb21wYWN0RWxzZUlmTW9kZShzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQlicmVhazsNCi0JCWNhc2UgNSA6IC8vIGFkZCBhIG5ldyBsaW5lIGluc2lkZSBhbiBlbXB0eSBibG9jay4NCi0JCQlzZXROZXdMaW5lSW5FbXB0eUJsb2NrTW9kZShzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQlicmVhazsNCi0JCWNhc2UgNiA6IC8vIGxpbmUgc3BsaXR0aW5nIHdpbGwgb2NjdXIgd2hlbiBsaW5lIGV4Y2VlZHMgdGhpcyBsZW5ndGggKDAgLT4gbm8gc3BsaXR0aW5nKQ0KLQkJCXNldE1heExpbmVMZW5ndGgoc2V0dGluZy5nZXRDdXJyZW50VmFsdWVJbmRleCgpKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgNyA6IC8vIGlmIGlzVHJ1ZSwgYXNzaWdubWVudHMgbG9vayBsaWtlIHg9IDEyIChub3QgbGlrZSB4ID0gMTIpOw0KLQkJCXNldENvbXBhY3RBc3NpZ25tZW50TW9kZShzZXR0aW5nLmdldEN1cnJlbnRWYWx1ZUluZGV4KCkgPT0gMCk7DQotCQkJYnJlYWs7DQotCQljYXNlIDkgOiAvLyBzaG91bGQgdXNlIHRhYiBvciBzcGFjZXMgdG8gaW5kZW50DQotCQkJc2V0SW5kZW50YXRpb25Vc2VzVGFiKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSA9PSAwKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgMTAgOiAvLyBhbW91bnQgb2Ygc3BhY2VzIGZvciBhIHRhYnVsYXRpb24NCi0JCQlzZXRUYWJTaXplKHNldHRpbmcuZ2V0Q3VycmVudFZhbHVlSW5kZXgoKSk7DQotCQkJYnJlYWs7DQorCQ0KKwlTdHJpbmcgb3B0aW9uSUQgPSBzZXR0aW5nLmdldElEKCk7DQorCQ0KKwlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0luc2VydE5ld2xpbmVCZWZvcmVPcGVuaW5nQnJhY2UpKXsNCisJCXNldE5ld0xpbmVCZWZvcmVPcGVuaW5nQnJhY2VNb2RlKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpID09IDApOw0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0luc2VydE5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnQpKXsNCisJCXNldE5ld2xpbmVJbkNvbnRyb2xTdGF0ZW1lbnRNb2RlKHNldHRpbmcuZ2V0VmFsdWVJbmRleCgpID09IDApOw0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0NsZWFyQWxsQmxhbmtMaW5lcykpew0KKwkJc2V0Q2xlYXJBbGxCbGFua0xpbmVzTW9kZShzZXR0aW5nLmdldFZhbHVlSW5kZXgoKSA9PSAwKTsNCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9JbnNlcnROZXdMaW5lQmV0d2VlbkVsc2VBbmRJZikpew0KKwkJc2V0Q29tcGFjdEVsc2VJZk1vZGUoc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkgPT0gMSk7DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fSW5zZXJ0TmV3TGluZUluRW1wdHlCbG9jaykpew0KKwkJc2V0TmV3TGluZUluRW1wdHlCbG9ja01vZGUoc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkgPT0gMCk7DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fU3BsaXRMaW5lRXhjZWVkaW5nTGVuZ3RoKSl7DQorCQl0cnkgew0KKwkJCXNldE1heExpbmVMZW5ndGgoSW50ZWdlci5wYXJzZUludChzZXR0aW5nLmdldFZhbHVlKCkpKTsNCisJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpew0KKwkJfQ0KKwl9ZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0NvbXBhY3RBc3NpZ25tZW50KSl7DQorCQlzZXRDb21wYWN0QXNzaWdubWVudE1vZGUoc2V0dGluZy5nZXRWYWx1ZUluZGV4KCkgPT0gMCk7DQorCX1lbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fVGFidWxhdGlvbkNoYXIpKXsNCisJCXNldEluZGVudGF0aW9uVXNlc1RhYihzZXR0aW5nLmdldFZhbHVlSW5kZXgoKSA9PSAwKTsNCisJfWVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9UYWJ1bGF0aW9uU2l6ZSkpew0KKwkJdHJ5IHsNCisJCQlzZXRUYWJTaXplKEludGVnZXIucGFyc2VJbnQoc2V0dGluZy5nZXRWYWx1ZSgpKSk7DQorCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsNCisJCX0NCiAJfQ0KIH0NCisNCiBwdWJsaWMgdm9pZCBzZXRSZXVzZUV4aXN0aW5nTGF5b3V0TW9kZShib29sZWFuIGZsYWcpIHsNCiB9DQogcHVibGljIHZvaWQgc2V0VGFiU2l6ZShpbnQgc2l6ZSkgew0KZGlmZiAtLWdpdCBhL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2ltcGwvU3BsaXRMaW5lLmphdmEgYi9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL1NwbGl0TGluZS5qYXZhCmluZGV4IDkxMmRhNjAuLmRmYWFiNDIgMTAwNjQ0Ci0tLSBhL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2ltcGwvU3BsaXRMaW5lLmphdmEKKysrIGIvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9TcGxpdExpbmUuamF2YQpAQCAtNDUsMTUxICs0NSwxNTEgQEAKIA0KIAlzd2l0Y2ggKGN1cnJlbnRPcGVyYXRvcil7DQogCQljYXNlIFRva2VuTmFtZWV4dGVuZHM6DQotCQkJb3BlcmF0b3JTdHJpbmc9ImV4dGVuZHMiLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1laW1wbGVtZW50czoNCi0JCQlvcGVyYXRvclN0cmluZz0iaW1wbGVtZW50cyIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSJpbXBsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWV0aHJvd3M6DQotCQkJb3BlcmF0b3JTdHJpbmc9InRocm93cyIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSJ0aHJvd3MiOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6IC8vIDsNCi0JCQlvcGVyYXRvclN0cmluZz0iOyIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI7IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVDT01NQSA6IC8vICwNCi0JCQlvcGVyYXRvclN0cmluZz0iLCIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSIsIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVFUVVBTCA6IC8vID0NCi0JCQlvcGVyYXRvclN0cmluZz0iPSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI9IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVBTkRfQU5EIDogLy8gJiYgKDE1LjIyKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSImJiIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSImJiI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1lT1JfT1IgOiAvLyB8fCAoMTUuMjMpDQotCQkJb3BlcmF0b3JTdHJpbmc9Inx8Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Inx8IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gKDE1LjI0KQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSI/Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ij8iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZUNPTE9OIDogLy8gOiAoMTUuMjQpDQotCQkJb3BlcmF0b3JTdHJpbmc9IjoiLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iOiI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOiAvLyA9PSAoMTUuMjAsIDE1LjIwLjEsIDE1LjIwLjIsIDE1LjIwLjMpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ij09Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ij09IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVOT1RfRVFVQUwgOiAvLyAhPSAoMTUuMjAsIDE1LjIwLjEsIDE1LjIwLjIsIDE1LjIwLjMpDQotCQkJb3BlcmF0b3JTdHJpbmc9IiE9Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9IiE9IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCAoMTUuMTkuMSkNCi0JCQlvcGVyYXRvclN0cmluZz0iPCIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI8IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDogLy8gPD0gKDE1LjE5LjEpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ijw9Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ijw9IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSIDogLy8gPiAoMTUuMTkuMSkNCi0JCQlvcGVyYXRvclN0cmluZz0iPiIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI+IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDogLy8gPj0gKDE1LjE5LjEpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ij49Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ij49IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVpbnN0YW5jZW9mIDogLy8gaW5zdGFuY2VvZg0KLQkJCW9wZXJhdG9yU3RyaW5nPSJpbnN0YW5jZW9mIi8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Imluc3RhbmNlb2YiOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRva2VuTmFtZVBMVVMgOiAvLyArICgxNS4xNywgMTUuMTcuMikNCi0JCQlvcGVyYXRvclN0cmluZz0iKyIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSIrIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6IC8vIC0gKDE1LjE3LjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ii0iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iLSI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOiAvLyAqICgxNS4xNi4xKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSIqIi8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9IioiOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZURJVklERSA6IC8vIC8gKDE1LjE2LjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ii8iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iLyI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSIDogLy8gJSAoMTUuMTYuMykNCi0JCQlvcGVyYXRvclN0cmluZz0iJSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSIlIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDogLy8gPDwgKDE1LjE4KQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSI8PCIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI8PCI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOiAvLyA+PiAoMTUuMTgpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ij4+Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ij4+IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6IC8vID4+PiAoMTUuMTgpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ij4+PiIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj4iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRva2VuTmFtZUFORCA6IC8vICYgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSImIi8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9IiYiOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZU9SIDogLy8gfCAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9InwiLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0ifCI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lWE9SIDogLy8gXiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9Il4iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iXiI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgOiAvLyAqPSAoMTUuMjUuMikNCi0JCQlvcGVyYXRvclN0cmluZz0iKj0iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iKj0iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZURJVklERV9FUVVBTCA6IC8vIC89ICgxNS4yNS4yKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSIvPSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSIvPSI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMIDogLy8gJT0gKDE1LjI1LjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9IiU9Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9IiU9IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVQTFVTX0VRVUFMIDogLy8gKz0gKDE1LjI1LjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9Iis9Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Iis9IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6IC8vIC09ICgxNS4yNS4yKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSItPSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSItPSI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA6IC8vIDw8PSAoMTUuMjUuMikNCi0JCQlvcGVyYXRvclN0cmluZz0iPDw9Ii8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9Ijw8PSI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUwgOiAvLyA+Pj0gKDE1LjI1LjIpDQotCQkJb3BlcmF0b3JTdHJpbmc9Ij4+PSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj0iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDogLy8gPj4+PSAoMTUuMjUuMikNCi0JCQlvcGVyYXRvclN0cmluZz0iPj4+PSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj49IjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJY2FzZSBUb2tlbk5hbWVBTkRfRVFVQUwgOiAvLyAmPSAoMTUuMjUuMikNCi0JCQlvcGVyYXRvclN0cmluZz0iJj0iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0iJj0iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogDQogCQljYXNlIFRva2VuTmFtZVhPUl9FUVVBTCA6IC8vIF49ICgxNS4yNS4yKQ0KLQkJCW9wZXJhdG9yU3RyaW5nPSJePSIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSJePSI7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiANCiAJCWNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOiAvLyB8PSAoMTUuMjUuMikNCi0JCQlvcGVyYXRvclN0cmluZz0ifD0iLypub25OTFMqLzsNCisJCQlvcGVyYXRvclN0cmluZz0ifD0iOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFRva2VuTmFtZURPVCA6IC8vIC4NCi0JCQlvcGVyYXRvclN0cmluZz0iLiIvKm5vbk5MUyovOw0KKwkJCW9wZXJhdG9yU3RyaW5nPSIuIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIA0KIAkJZGVmYXVsdDoNCi0JCQlvcGVyYXRvclN0cmluZz0iIi8qbm9uTkxTKi87DQorCQkJb3BlcmF0b3JTdHJpbmc9IiI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAkJaWYgKHBsYWNlT3BlcmF0b3JBaGVhZCl7DQogCQkJcmVzdWx0LmFwcGVuZChvcGVyYXRvclN0cmluZyk7DQpAQCAtMjAwLDYgKzIwMCw2IEBACiAJCX0NCiAJCXJlc3VsdC5hcHBlbmQoJ1xuJyk7DQogCX0NCi0JcmV0dXJuICIiLypub25OTFMqLzsNCisJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9vcHRpb25zLnByb3BlcnRpZXMgYi9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9vcHRpb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWIzZDguLjAwMDAwMDAKLS0tIGEvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvb3B0aW9ucy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotbmV3bGluZS5vcGVuaW5nQnJhY2UubnVtYmVyPTENCi1uZXdsaW5lLm9wZW5pbmdCcmFjZS5jYXRlZ29yeT1OZXdsaW5lDQotbmV3bGluZS5vcGVuaW5nQnJhY2UubmFtZT1JJm5zZXJ0IG5ldyBsaW5lIGJlZm9yZSBvcGVuaW5nIGJyYWNlDQotbmV3bGluZS5vcGVuaW5nQnJhY2UucG9zc2libGVWYWx1ZXM9MnxJbnNlcnR8RG8gbm90IGluc2VydA0KLW5ld2xpbmUub3BlbmluZ0JyYWNlLmRlc2NyaXB0aW9uPVdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJlZm9yZSBhbiBvcGVuaW5nIGJyYWNlLCBvdGhlcndpc2Ugbm90aGluZyBpcyBpbnNlcnRlZA0KLQ0KLW5ld2xpbmUuY29udHJvbFN0YXRlbWVudC5udW1iZXI9Mg0KLW5ld2xpbmUuY29udHJvbFN0YXRlbWVudC5jYXRlZ29yeT1OZXdsaW5lDQotbmV3bGluZS5jb250cm9sU3RhdGVtZW50Lm5hbWU9SW5zZXJ0IG5ldyAmbGluZSBpbiBjb250cm9sIHN0YXRlbWVudA0KLW5ld2xpbmUuY29udHJvbFN0YXRlbWVudC5wb3NzaWJsZVZhbHVlcz0yfEluc2VydHxEbyBub3QgaW5zZXJ0DQotbmV3bGluZS5jb250cm9sU3RhdGVtZW50LmRlc2NyaXB0aW9uPVdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJldHdlZW4gfSBhbmQgZWxzZSwgY2F0Y2gsIGZpbmFsbHkNCi0NCi1uZXdsaW5lLmNsZWFyQWxsLm51bWJlcj0zDQotbmV3bGluZS5jbGVhckFsbC5jYXRlZ29yeT1OZXdsaW5lDQotbmV3bGluZS5jbGVhckFsbC5uYW1lPUNsZWFyIGFsbCAmYmxhbmsgbGluZXMNCi1uZXdsaW5lLmNsZWFyQWxsLnBvc3NpYmxlVmFsdWVzPTJ8Q2xlYXJ8UHJlc2VydmUgb25lDQotbmV3bGluZS5jbGVhckFsbC5kZXNjcmlwdGlvbj1XaGVuIENsZWFyLCBhbGwgYmxhbmsgbGluZXMgYXJlIHJlbW92ZWQuIFdoZW4gUHJlc2VydmUgb25lLCBvbmx5IG9uZSBpcyBrZXB0IGFuZCBhbGwgb3RoZXJzIHJlbW92ZWQuDQotDQotbmV3bGluZS5lbHNlSWYubnVtYmVyPTQNCi1uZXdsaW5lLmVsc2VJZi5jYXRlZ29yeT1OZXdsaW5lDQotbmV3bGluZS5lbHNlSWYubmFtZT0mS2VlcCBlbHNlIGlmIG9uIHRoZSBzYW1lIGxpbmUNCi1uZXdsaW5lLmVsc2VJZi5wb3NzaWJsZVZhbHVlcz0yfFllc3xObw0KLW5ld2xpbmUuZWxzZUlmLmRlc2NyaXB0aW9uPVdoZW4gWWVzLCBhIGJsYW5rIGxpbmUgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBhIGVsc2UgYW5kIGEgaWYgd2hlbiB0aGV5IGFyZSBjb250aWd1b3VzDQotDQotbmV3bGluZS5lbXB0eUJsb2NrLm51bWJlcj01DQotbmV3bGluZS5lbXB0eUJsb2NrLmNhdGVnb3J5PU5ld2xpbmUNCi1uZXdsaW5lLmVtcHR5QmxvY2submFtZT1JbiZzZXJ0IGEgbmV3IGxpbmUgaW5zaWRlIGFuIGVtcHR5IGJsb2NrDQotbmV3bGluZS5lbXB0eUJsb2NrLnBvc3NpYmxlVmFsdWVzPTJ8SW5zZXJ0fERvIG5vdCBpbnNlcnQNCi1uZXdsaW5lLmVtcHR5QmxvY2suZGVzY3JpcHRpb249V2hlbiBpbnNlcnQsIGEgbGluZSBicmVhayBpcyBpbnNlcnRlZCBiZXR3ZWVuIGNvbnRpZ3VvdXMgeyBhbmQgfSwgaWYgfSBpcyBub3QgZm9sbG93ZWQgYnkgYSBrZXl3b3JkLg0KLQ0KLWxpbmUuc3BsaXQubnVtYmVyPTYNCi1saW5lLnNwbGl0LmNhdGVnb3J5PUxpbmUgc3BsaXR0aW5nDQotbGluZS5zcGxpdC5uYW1lPU1hJnhpbXVtIGxpbmUgbGVuZ3RoDQotbGluZS5zcGxpdC5wb3NzaWJsZVZhbHVlcz0tMQ0KLWxpbmUuc3BsaXQuZGVzY3JpcHRpb249RW5hYmxlIHNwbGl0dGluZyBvZiBsb25nIGxpbmVzIChleGNlZWRpbmcgdGhlIGNvbmZpZ3VyYWJsZSBsZW5ndGgpLiBMZW5ndGggb2YgMCB3aWxsIGRpc2FibGUgbGluZSBzcGxpdHRpbmcNCi0NCi1zdHlsZS5jb21wYWN0QXNzaWdubWVudC5udW1iZXI9Nw0KLXN0eWxlLmNvbXBhY3RBc3NpZ25tZW50LmNhdGVnb3J5PVN0eWxlDQotc3R5bGUuY29tcGFjdEFzc2lnbm1lbnQubmFtZT0mQ29tcGFjdCBhc3NpZ25tZW50DQotc3R5bGUuY29tcGFjdEFzc2lnbm1lbnQucG9zc2libGVWYWx1ZXM9MnxDb21wYWN0fE5vcm1hbA0KLXN0eWxlLmNvbXBhY3RBc3NpZ25tZW50LmRlc2NyaXB0aW9uPUFzc2lnbm1lbnRzIGNhbiBiZSBmb3JtYXR0ZWQgYXN5bW1ldHJpY2FsbHksIGUuZy4gJ2ludCB4PSAyOycsIHdoZW4gTm9ybWFsLCBhIHNwYWNlIGlzIGluc2VydGVkIGJlZm9yZSB0aGUgYXNzaWdubWVudCBvcGVyYXRvcg0KLQ0KLXN0eWxlLnJldXNlRXhpc3RpbmdMYXlvdXQubnVtYmVyPTgNCi1zdHlsZS5yZXVzZUV4aXN0aW5nTGF5b3V0LmNhdGVnb3J5PVN0eWxlDQotc3R5bGUucmV1c2VFeGlzdGluZ0xheW91dC5uYW1lPSZSZXVzZSBleGlzdGluZyBsYXlvdXQNCi1zdHlsZS5yZXVzZUV4aXN0aW5nTGF5b3V0LnBvc3NpYmxlVmFsdWVzPTJ8UmV1c2V8RG8gbm90IHJldXNlDQotc3R5bGUucmV1c2VFeGlzdGluZ0xheW91dC5kZXNjcmlwdGlvbj1JZiB0aGUgdXNlciBoYXMgZm9ybWF0dGVkIGhpcyBjb2RlIGEgY2VydGFpbiB3YXksIHRoZSBmb3JtYXR0ZXIgZG9lcyBub3QgdHJ5IHRvIHJlZm9ybWF0IGl0DQotDQotdGFidWxhdGlvbi5jaGFyLm51bWJlcj05DQotdGFidWxhdGlvbi5jaGFyLmNhdGVnb3J5PVN0eWxlDQotdGFidWxhdGlvbi5jaGFyLm5hbWU9SW5kZW50YXRpb24gaXMgcmVwcmVzZW50ZWQgYnkgJnRhYg0KLXRhYnVsYXRpb24uY2hhci5wb3NzaWJsZVZhbHVlcz0yfFRhYnxTcGFjZXMNCi10YWJ1bGF0aW9uLmNoYXIuZGVzY3JpcHRpb249RWl0aGVyIGNob29zZSB0byBpbmRlbnQgd2l0aCB0YWIgY2hhcmFjdGVycyBvciBzcGFjZXMNCi0NCi10YWJ1bGF0aW9uLnNpemUubnVtYmVyPTEwDQotdGFidWxhdGlvbi5zaXplLmNhdGVnb3J5PVN0eWxlDQotdGFidWxhdGlvbi5zaXplLm5hbWU9JkFtb3VudCBvZiBzcGFjZXMgcmVwcmVzZW50aW5nIGEgdGFiDQotdGFidWxhdGlvbi5zaXplLnBvc3NpYmxlVmFsdWVzPS0xDQotdGFidWxhdGlvbi5zaXplLmRlc2NyaXB0aW9uPVRhYnVsYXRpb24gc2l6ZSBpbiB0ZXJtIG9mIHNwYWNlIGNoYXJhY3RlcnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9GbGFncy5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRmxhZ3MuamF2YQppbmRleCBiMmExNzM3Li4yZGYyZDg0IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9GbGFncy5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEKQEAgLTE2OSwyMCArMTY5LDIwIEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGZsYWdzKSB7DQogCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogDQotCQlpZiAoaXNQdWJsaWMoZmxhZ3MpKQlzYi5hcHBlbmQoInB1YmxpYyAiLypub25OTFMqLyk7DQotCQlpZiAoaXNQcm90ZWN0ZWQoZmxhZ3MpKSBzYi5hcHBlbmQoInByb3RlY3RlZCAiLypub25OTFMqLyk7DQotCQlpZiAoaXNQcml2YXRlKGZsYWdzKSkJc2IuYXBwZW5kKCJwcml2YXRlICIvKm5vbk5MUyovKTsNCi0JCWlmIChpc1N0YXRpYyhmbGFncykpIHNiLmFwcGVuZCgic3RhdGljICIvKm5vbk5MUyovKTsNCi0JCWlmIChpc0Fic3RyYWN0KGZsYWdzKSkgc2IuYXBwZW5kKCJhYnN0cmFjdCAiLypub25OTFMqLyk7DQotCQlpZiAoaXNGaW5hbChmbGFncykpIHNiLmFwcGVuZCgiZmluYWwgIi8qbm9uTkxTKi8pOw0KLQkJaWYgKGlzTmF0aXZlKGZsYWdzKSkgc2IuYXBwZW5kKCJuYXRpdmUgIi8qbm9uTkxTKi8pOw0KLQkJaWYgKGlzU3luY2hyb25pemVkKGZsYWdzKSkgc2IuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIi8qbm9uTkxTKi8pOw0KLQkJaWYgKGlzVHJhbnNpZW50KGZsYWdzKSkgc2IuYXBwZW5kKCJ0cmFuc2llbnQgIi8qbm9uTkxTKi8pOw0KLQkJaWYgKGlzVm9sYXRpbGUoZmxhZ3MpKSBzYi5hcHBlbmQoInZvbGF0aWxlICIvKm5vbk5MUyovKTsNCi0JCWlmIChpc1N0cmljdGZwKGZsYWdzKSkgc2IuYXBwZW5kKCJzdHJpY3RmcCAiLypub25OTFMqLyk7DQorCQlpZiAoaXNQdWJsaWMoZmxhZ3MpKQlzYi5hcHBlbmQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGlzUHJvdGVjdGVkKGZsYWdzKSkgc2IuYXBwZW5kKCJwcm90ZWN0ZWQgIik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChpc1ByaXZhdGUoZmxhZ3MpKQlzYi5hcHBlbmQoInByaXZhdGUgIik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChpc1N0YXRpYyhmbGFncykpIHNiLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoaXNBYnN0cmFjdChmbGFncykpIHNiLmFwcGVuZCgiYWJzdHJhY3QgIik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChpc0ZpbmFsKGZsYWdzKSkgc2IuYXBwZW5kKCJmaW5hbCAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGlzTmF0aXZlKGZsYWdzKSkgc2IuYXBwZW5kKCJuYXRpdmUgIik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChpc1N5bmNocm9uaXplZChmbGFncykpIHNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoaXNUcmFuc2llbnQoZmxhZ3MpKSBzYi5hcHBlbmQoInRyYW5zaWVudCAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGlzVm9sYXRpbGUoZmxhZ3MpKSBzYi5hcHBlbmQoInZvbGF0aWxlICIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoaXNTdHJpY3RmcChmbGFncykpIHNiLmFwcGVuZCgic3RyaWN0ZnAgIik7IC8vJE5PTi1OTFMtMSQNCiANCiAJCWludCBsZW4gPSBzYi5sZW5ndGgoKTsNCi0JCWlmIChsZW4gPT0gMCkgcmV0dXJuICIiLypub25OTFMqLzsNCisJCWlmIChsZW4gPT0gMCkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogCQlzYi5zZXRMZW5ndGgobGVuLTEpOw0KIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQogCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEKaW5kZXggMzBhZjIwNS4uY2JlNDY0MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbE1hcmtlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YQpAQCAtMTksNyArMTksNyBAQAogCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplIHRob3NlIG1hcmtlcnMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGZsYWcgcHJvYmxlbXMgDQogCSAqIGRldGVjdGVkIGJ5IHRoZSBKYXZhIHRvb2xpbmcgZHVyaW5nIGNvbXBpbGF0aW9uLg0KIAkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIucHJvYmxlbSIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX01PREVMX1BST0JMRU1fTUFSS0VSID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5wcm9ibGVtIjsgLy8kTk9OLU5MUy0xJA0KIA0KIA0KIAkvKioNCkBAIC0yOCwxOSArMjgsMTkgQEAKIAkgKiBwcm9ibGVtcyBkZXRlY3RlZCBieSB0aGUgSmF2YSB0b29saW5nIChzdWNoIGFzIGEgY3ljbGUgaW4gdGhlIGJ1aWxkIHBhdGgsIGEgcHJvYmxlbQ0KIAkgKiBkZXRlY3RlZCBieSB0aGUgb3V0bGluZXIsIG9yIGEgcHJvYmxlbSBkZXRlY3RlZCBkdXJpbmcgYSBjb2RlIGNvbXBsZXRpb24pDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lFTlRfUFJPQkxFTSA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIudHJhbnNpZW50X3Byb2JsZW0iLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJRU5UX1BST0JMRU0gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLnRyYW5zaWVudF9wcm9ibGVtIjsgLy8kTk9OLU5MUy0xJA0KICAgICANCiAJLyoqIA0KIAkgKiBJZCBtYXJrZXIgYXR0cmlidXRlICh2YWx1ZSA8Y29kZT4iaWQiPC9jb2RlPikuDQogCSAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLg0KIAkgKi8NCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIi8qbm9uTkxTKi87DQorCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqIA0KIAkgKiBGbGFncyBtYXJrZXIgYXR0cmlidXRlICh2YWx1ZSA8Y29kZT4iZmxhZ3MiPC9jb2RlPikuDQogCSAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLg0KIAkgKi8NCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdTID0gImZsYWdzIi8qbm9uTkxTKi87DQorCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHUyA9ICJmbGFncyI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqIA0KIAkgKiBDeWNsZSBkZXRlY3RlZCBtYXJrZXIgYXR0cmlidXRlICh2YWx1ZSA8Y29kZT4iY3ljbGVEZXRlY3RlZCI8L2NvZGU+KS4NCkBAIC00OCwxMSArNDgsMTEgQEAKIAkgKiBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCBjYXVzZWQgYSANCiAJICogY3ljbGUgaW4gdGhlIHByb2plY3RzIGNsYXNzcGF0aHMuDQogCSAqLw0KLQkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1lDTEVfREVURUNURUQgPSAiY3ljbGVEZXRlY3RlZCIvKm5vbk5MUyovOw0KKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1lDTEVfREVURUNURUQgPSAiY3ljbGVEZXRlY3RlZCI7IC8vJE5PTi1OTFMtMSQNCiAJLyoqDQogCSAqIEJ1aWxkIHBhdGggcHJvYmxlbSBtYXJrZXIgdHlwZSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkcGF0aF9wcm9ibGVtIjwvY29kZT4pLg0KIAkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSB0aG9zZSBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBmbGFnIHByb2JsZW1zIA0KIAkgKiBkZXRlY3RlZCBieSB0aGUgSmF2YSB0b29saW5nIGR1cmluZyBjbGFzc3BhdGggc2V0dGluZy4NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuYnVpbGRwYXRoX3Byb2JsZW0iLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5idWlsZHBhdGhfcHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQNCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5qYXZhCmluZGV4IDYyOTc5OTYuLjI3ZGZhYTEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEKQEAgLTIyNyw0ICsyMjcsMTMgQEAKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IHdhcyBpbnZhbGlkDQogCSAqLw0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NMQVNTUEFUSCA9IDk2NDsNCisJLyoqDQorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSB2YWx1ZSBpcyBub3QgYSBwb3NzaWJsZSB2YWx1ZQ0KKwkgKiBmb3IgYW4gb3B0aW9uLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9PUFRJT05fVkFMVUUgPSA5NjM7DQorCS8qKg0KKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGFuIG9wdGlvbiBpcyBub3QgYW4gZXhpc3Rpbmcgb3B0aW9uLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9PUFRJT04gPSA5NjI7DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnQuamF2YQppbmRleCBmZGU0NjNkLi5hNjNmNjA5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAJICogc3RyaW5nLCA8Y29kZT4iIjwvY29kZT4pLg0KIAkgKiA8L3A+DQogIAkqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0VfTkFNRSA9ICIiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIC8qKg0KICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZyYWdtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBKYXZhIHJlc291cmNlLg0KICAqLw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCmluZGV4IGVkODkzYWYuLjlkZTQ0MjEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpAQCAtNDAsNyArNDAsNyBAQAogCS8qKg0KIAkgKiBFbXB0eSByb290IHBhdGgNCiAJICovDQotCVN0cmluZyBERUZBVUxUX1BBQ0tBR0VST09UX1BBVEggPSAiIi8qbm9uTkxTKi87DQorCVN0cmluZyBERUZBVUxUX1BBQ0tBR0VST09UX1BBVEggPSAiIjsgLy8kTk9OLU5MUy0xJA0KIA0KIC8qKg0KICAqIEF0dGFjaGVzIHRoZSBzb3VyY2UgYXJjaGl2ZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIHRvIHRoaXMNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29udmVudGlvbnMuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCmluZGV4IDUwMjY3MjYuLjAwYWFjYTAgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKi8NCiBwdWJsaWMgZmluYWwgY2xhc3MgSmF2YUNvbnZlbnRpb25zIHsNCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhciBmZ0RvdD0gJy4nOw0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmdKQVZBPSAiSkFWQSIvKm5vbk5MUyovOw0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZmdKQVZBPSAiSkFWQSI7IC8vJE5PTi1OTFMtMSQNCiAvKioNCiAgKiBOb3QgaW5zdGFudGlhYmxlLg0KICAqLw0KQEAgLTQ4LDggKzQ4LDggQEAKIAl9DQogCVN0cmluZyBleHRlbnNpb24xID0gcm9vdFBhdGgxLmdldEZpbGVFeHRlbnNpb24oKTsNCiAJU3RyaW5nIGV4dGVuc2lvbjIgPSByb290UGF0aDIuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQlTdHJpbmcgamFyRXh0ZW5zaW9uID0gIkpBUiIvKm5vbk5MUyovOw0KLQlTdHJpbmcgemlwRXh0ZW5zaW9uID0gIlpJUCIvKm5vbk5MUyovOw0KKwlTdHJpbmcgamFyRXh0ZW5zaW9uID0gIkpBUiI7IC8vJE5PTi1OTFMtMSQNCisJU3RyaW5nIHppcEV4dGVuc2lvbiA9ICJaSVAiOyAvLyROT04tTkxTLTEkDQogCWlmIChleHRlbnNpb24xICE9IG51bGwgJiYgKGV4dGVuc2lvbjEuZXF1YWxzSWdub3JlQ2FzZShqYXJFeHRlbnNpb24pIHx8IGV4dGVuc2lvbjEuZXF1YWxzSWdub3JlQ2FzZSh6aXBFeHRlbnNpb24pKSkgew0KIAkJcmV0dXJuIGZhbHNlOw0KIAl9IA0KQEAgLTExMSwxNCArMTExLDE0IEBACiAgKi8NCiBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKFN0cmluZyBuYW1lKSB7DQogCWlmIChuYW1lID09IG51bGwpIHsNCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi51bml0Lm51bGxOYW1lIi8qbm9uTkxTKi8pLCBudWxsKTsNCisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi51bml0Lm51bGxOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJU3RyaW5nIGV4dGVuc2lvbjsNCiAJU3RyaW5nIGlkZW50aWZpZXI7DQogCWludCBpbmRleDsNCiAJaW5kZXggPSBuYW1lLmluZGV4T2YoJy4nKTsNCiAJaWYgKGluZGV4ID09IC0xKSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlkZW50aWZpZXIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7DQogCWV4dGVuc2lvbiA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7DQpAQCAtMTI3LDkgKzEyNyw5IEBACiAJCXJldHVybiBzdGF0dXM7DQogCX0NCiAJaWYgKCFVdGlsLmlzSmF2YUZpbGVOYW1lKG5hbWUpKSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQotCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIvKm5vbk5MUyovLCBudWxsKTsNCisJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpZWxkIG5hbWUuDQpAQCAtMTU5LDkgKzE1OSw5IEBACiAgKi8NCiBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVJZGVudGlmaWVyKFN0cmluZyBpZCkgew0KIAlpZiAoc2Nhbm5lZElkZW50aWZpZXIoaWQpICE9IG51bGwpIHsNCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIvKm5vbk5MUyovLCBudWxsKTsNCisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIiLypub25OTFMqLywgaWQpLCBudWxsKTsNCisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbGxlZ2FsSWRlbnRpZmllciIsIGlkKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0xNzgsMTMgKzE3OCwxMyBAQAogICovDQogcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsNCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbXBvcnQubnVsbEltcG9ydCIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaW1wb3J0Lm51bGxJbXBvcnQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJfSANCiAJaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsNCiAJCWlmIChuYW1lLmNoYXJBdChuYW1lLmxlbmd0aCgpIC0gMikgPT0gJy4nKSB7DQogCQkJcmV0dXJuIHZhbGlkYXRlUGFja2FnZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpKTsNCiAJCX0gZWxzZSB7DQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmltcG9ydC51bnF1YWxpZmllZEltcG9ydCIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmltcG9ydC51bnF1YWxpZmllZEltcG9ydCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCXJldHVybiB2YWxpZGF0ZVBhY2thZ2VOYW1lKG5hbWUpOw0KQEAgLTIwNCwxMSArMjA0LDExIEBACiAgKi8NCiBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUubnVsbE5hbWUiLypub25OTFMqLyksIG51bGwpOw0KKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlTdHJpbmcgdHJpbW1lZCA9IG5hbWUudHJpbSgpOw0KIAlpZiAoIW5hbWUuZXF1YWxzKHRyaW1tZWQpKSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5uYW1lV2l0aEJsYW5rcyIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5uYW1lV2l0aEJsYW5rcyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCiAJY2hhcltdIHNjYW5uZWRJRDsNCkBAIC0yMjgsMTQgKzIyOCwxNCBAQAogDQogCWlmIChzY2FubmVkSUQgIT0gbnVsbCkgew0KIAkJaWYgKENoYXJPcGVyYXRpb24uY29udGFpbnMoJyQnLCBzY2FubmVkSUQpKSB7DQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5kb2xsYXJOYW1lIi8qbm9uTkxTKi8pLCBudWxsKTsNCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmRvbGxhck5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWlmICgoc2Nhbm5lZElELmxlbmd0aCA+IDAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHNjYW5uZWRJRFswXSkpKSB7DQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5sb3dlcmNhc2VOYW1lIi8qbm9uTkxTKi8pLCBudWxsKTsNCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmxvd2VyY2FzZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIvKm5vbk5MUyovLCBudWxsKTsNCisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5pbnZhbGlkTmFtZSIvKm5vbk5MUyovLCBuYW1lKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5pbnZhbGlkTmFtZSIsIG5hbWUpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTI2NiwyMiArMjY2LDIyIEBACiAgKi8NCiBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVQYWNrYWdlTmFtZShTdHJpbmcgbmFtZSkgew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5udWxsTmFtZSIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWludCBsZW5ndGg7DQogCWlmICgobGVuZ3RoID0gbmFtZS5sZW5ndGgoKSkgPT0gMCkgew0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZW1wdHlOYW1lIi8qbm9uTkxTKi8pLCBudWxsKTsNCisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLmVtcHR5TmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChuYW1lLmNoYXJBdCgwKSA9PSBmZ0RvdCB8fCBuYW1lLmNoYXJBdChsZW5ndGgtMSkgPT0gZmdEb3QpIHsNCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLmRvdE5hbWUiLypub25OTFMqLyksIG51bGwpOw0KKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZG90TmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KDApKSB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSkpIHsNCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLm5hbWVXaXRoQmxhbmtzIi8qbm9uTkxTKi8pLCBudWxsKTs7DQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5uYW1lV2l0aEJsYW5rcyIpLCBudWxsKTs7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpbnQgZG90ID0gMDsNCiAJd2hpbGUgKGRvdCAhPSAtMSAmJiBkb3QgPCBsZW5ndGgtMSkgew0KIAkJaWYgKChkb3QgPSBuYW1lLmluZGV4T2YoZmdEb3QsIGRvdCsxKSkgIT0gLTEgJiYgZG90IDwgbGVuZ3RoLTEgJiYgbmFtZS5jaGFyQXQoZG90KzEpID09IGZnRG90KSB7DQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuY29uc2VjdXRpdmVEb3RzTmFtZSIvKm5vbk5MUyovKSwgbnVsbCk7DQorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuY29uc2VjdXRpdmVEb3RzTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJfQ0KIAlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUsIG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7ZmdEb3R9KSk7DQpAQCAtMjkzLDcgKzI5MywxNzggQEAKIAkJCXJldHVybiBzdGF0dXM7DQogCQl9DQogCX0NCi0JcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIi8qbm9uTkxTKi8sIG51bGwpOw0KKwlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiANCisvKioNCisgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24uDQorICogLSBTb3VyY2UgZm9sZGVycyBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYmluYXJ5IG91dHB1dCwgYW5kIHJlY2lwcm9jYWxseS4gVGhleSBjYW4gY29pbmNpZGF0ZS4NCisgKiAtIFNvdXJjZSBmb2xkZXJzIGNhbm5vdCBiZSBuZXN0ZWQgaW4gZWFjaCBvdGhlci4NCisgKiAtIE91dHB1dCBsb2NhdGlvbiBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgcHJvamVjdC4NCisgDQorICogQHBhcmFtIGNsYXNzcGF0aCBhIGdpdmVuIGNsYXNzcGF0aA0KKyAqIEBwYXJhbSBvdXRwdXRMb2NhdGlvbiBhIGdpdmVuIG91dHB1dCBsb2NhdGlvbg0KKyAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZg0KKyAqCQl0aGUgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gYXJlIGNvbXBhdGlibGUsIG90aGVyd2lzZSBhIHN0YXR1cyANCisgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBjbGFzc3BhdGggb3Igb3V0cHV0IGxvY2F0aW9uDQorICovDQorcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgew0KKw0KKwlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOw0KKwlJUGF0aCBwcm9qZWN0UGF0aD0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOw0KKw0KKwkvKiB2YWxpZGF0ZSBvdXRwdXQgbG9jYXRpb24gKi8NCisJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsNCisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTlVMTF9QQVRIKTsNCisJfQ0KKwlpZiAob3V0cHV0TG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7DQorCQlpZiAoIXByb2plY3RQYXRoLmlzUHJlZml4T2Yob3V0cHV0TG9jYXRpb24pKSB7DQorCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5QQVRIX09VVFNJREVfUFJPSkVDVCwgamF2YVByb2plY3QsIG91dHB1dExvY2F0aW9uLnRvU3RyaW5nKCkpOw0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUxBVElWRV9QQVRILCBvdXRwdXRMb2NhdGlvbik7DQorCX0NCisNCisJCQ0KKwkJDQorCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbA0KKwlib29sZWFuIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gZmFsc2U7DQorCWJvb2xlYW4gaGFzU291cmNlID0gZmFsc2U7DQorCWZvciAoaW50IGkgPSAwIDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgew0KKwkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgaGFzU291cmNlID0gdHJ1ZTsNCisJCWlmIChjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpew0KKwkJCWFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKwlpZiAoIWhhc1NvdXJjZSkgYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSB0cnVlOyAvLyBpZiBubyBzb3VyY2UsIHRoZW4gYWxsb3dlZA0KKwkNCisJLy8gY2hlY2sgYWxsIGVudHJpZXMNCisJZm9yIChpbnQgaSA9IDAgOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7DQorCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07DQorCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7DQorDQorCQkvLyBubyBmdXJ0aGVyIGNoZWNrIGlmIGVudHJ5IGNvaW5jaWRhdGVzIHdpdGggcHJvamVjdCBvciBvdXRwdXQgbG9jYXRpb24NCisJCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSkgY29udGludWU7DQorCQlpZiAoZW50cnlQYXRoLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIGNvbnRpbnVlOw0KKwkJDQorCQkvLyBwcmV2ZW50IG5lc3Rpbmcgc291cmNlIGVudHJpZXMgaW4gZWFjaCBvdGhlcg0KKwkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKXsNCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aC5sZW5ndGg7IGorKyl7DQorCQkJCUlDbGFzc3BhdGhFbnRyeSBvdGhlckVudHJ5ID0gY2xhc3NwYXRoW2pdOw0KKwkJCQlpZiAoZW50cnkgIT0gb3RoZXJFbnRyeSAmJiBvdGhlckVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKXsNCisJCQkJCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihvdGhlckVudHJ5LmdldFBhdGgoKSkpew0KKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdE5lc3RTb3VyY2VGb2xkZXJJblNvdXJjZSIsZW50cnlQYXRoLnRvU3RyaW5nKCksIG90aGVyRW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJLy8gcHJldmVudCBuZXN0aW5nIG91dHB1dCBsb2NhdGlvbiBpbnNpZGUgZW50cnkNCisJCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihvdXRwdXRMb2NhdGlvbikpIHsNCisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0U291cmNlRm9sZGVySW5PdXRwdXQiLGVudHJ5UGF0aC50b1N0cmluZygpLCBvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisNCisJCS8vIHByZXZlbnQgbmVzdGluZyBlbnRyeSBpbnNpZGUgb3V0cHV0IGxvY2F0aW9uIC0gd2hlbiBkaXN0aW5jdCBmcm9tIHByb2plY3Qgb3IgYSBzb3VyY2UgZm9sZGVyDQorCQlpZiAoIWFsbG93TmVzdGluZ0luT3V0cHV0ICYmIG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoZW50cnlQYXRoKSkgew0KKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdE5lc3RPdXB1dEluU291cmNlRm9sZGVyIiwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSwgZW50cnlQYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CQ0KK30NCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0gcmVsYXRlZCB0byB0aGlzIGNsYXNzcGF0aCBlbnRyeSBpZiBhbnksIG9yIG51bGwgaWYgZW50cnkgaXMgZmluZSANCisJICogKGkuZS4gaWYgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgdmFsaWQgZWxlbWVudCB0byBiZSByZWZlcmVuY2VkIG9udG8gYSBjbGFzc3BhdGgpLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGJvb2xlYW4gY2hlY2tTb3VyY2VBdHRhY2htZW50KXsNCisJCQ0KKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CQkJDQorCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOw0KKwkJDQorCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpew0KKw0KKwkJCS8vIHZhcmlhYmxlIGVudHJ5IGNoZWNrDQorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoNCisJCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID49IDEpew0KKwkJCQkJZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsNCisJCQkJCWlmIChlbnRyeSA9PSBudWxsKXsNCisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kVmFyaWFibGVQYXRoIiwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0NCisJCQkJCXJldHVybiB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KGphdmFQcm9qZWN0LCBlbnRyeSwgY2hlY2tTb3VyY2VBdHRhY2htZW50KTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxWYXJpYWJsZVBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsJCQkJCSAvLyROT04tTkxTLTEkDQorCQkJCX0NCisNCisJCQkvLyBsaWJyYXJ5IGVudHJ5IGNoZWNrDQorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOg0KKwkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGguaXNBYnNvbHV0ZSgpICYmICFwYXRoLmlzRW1wdHkoKSkgew0KKwkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7DQorCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBwYXRoLCB0cnVlKTsNCisJCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2Upew0KKwkJCQkJCUlSZXNvdXJjZSByZXNvbHZlZFJlc291cmNlID0gKElSZXNvdXJjZSkgdGFyZ2V0Ow0KKwkJCQkJCXN3aXRjaChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSl7DQorCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOg0KKwkJCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOw0KKwkJCQkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSB8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpeyAvLyBpbnRlcm5hbCBiaW5hcnkgYXJjaGl2ZSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJCQlpZiAoY2hlY2tTb3VyY2VBdHRhY2htZW50IA0KKwkJCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwNCisJCQkJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpDQorCQkJCQkJCQkJCSYmIEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgc291cmNlQXR0YWNobWVudCwgdHJ1ZSkgPT0gbnVsbCl7DQorCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50Iiwgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJCQl9DQorCQkJCQkJCQl9DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoJLy8gaW50ZXJuYWwgYmluYXJ5IGZvbGRlcg0KKwkJCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCANCisJCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwgDQorCQkJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpDQorCQkJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsNCisJCQkJCQkJCQlyZXR1cm4gIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLCBzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmlsZSl7DQorCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCANCisJCQkJCQkJJiYgc291cmNlQXR0YWNobWVudCAhPSBudWxsIA0KKwkJCQkJCQkmJiAhc291cmNlQXR0YWNobWVudC5pc0VtcHR5KCkNCisJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsNCisJCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50Iiwgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQl9DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRMaWJyYXJ5IiwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxMaWJyYXJ5UGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkDQorCQkJCX0NCisJCQkJYnJlYWs7DQorDQorCQkJLy8gcHJvamVjdCBlbnRyeSBjaGVjaw0KKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoNCisJCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsNCisJCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpIHx8ICFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKXsNCisJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFByb2plY3QiLCBwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJfQ0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsNCisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kUHJvamVjdCIsIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxQcm9qZWN0UGF0aCIsIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJfQ0KKwkJCQlicmVhazsNCisNCisJCQkvLyBwcm9qZWN0IHNvdXJjZSBmb2xkZXINCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoNCisJCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsNCisJCQkJCUlQYXRoIHByb2plY3RQYXRoPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsNCisJCQkJCWlmICghcHJvamVjdFBhdGguaXNQcmVmaXhPZihwYXRoKSB8fCBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIHRydWUpID09IG51bGwpew0KKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VGb2xkZXIiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJfQ0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFNvdXJjZUZvbGRlclBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwkJDQorfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuamF2YQppbmRleCAwODk1NWFkLi5jMTQ2ZTMzIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb3JlLmphdmEKQEAgLTQsMTQgKzQsMTggQEAKICAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAgKi8NCi0gDQorDQogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOw0KIA0KIGltcG9ydCBqYXZhLmlvLio7DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCiBpbXBvcnQgamF2YS51dGlsLio7DQogDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuQ29tcGxldGlvbk9wdGlvbnM7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLio7DQpAQCAtMTksNiArMjMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuaW1wbC4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLmltcGwuUHJvYmxlbUZhY3Rvcnk7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuaW1wbC5Gb3JtYXR0ZXJPcHRpb25zOw0KIA0KIC8qKg0KICAqIFRoZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MgZm9yIHRoZSBKYXZhIG1vZGVsIHBsdWctaW4gY29udGFpbmluZyB0aGUgY29yZQ0KQEAgLTM4LDI1ICs0NCwyNSBAQAogICovDQogcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb3JlIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24gew0KIA0KLQ0KIAlwcml2YXRlIHN0YXRpYyBQbHVnaW4gSkFWQV9DT1JFX1BMVUdJTiA9IG51bGw7DQogCS8qKg0KIAkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIGNvcmUgc3VwcG9ydA0KIAkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlIjwvY29kZT4pLg0KIAkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlIi8qbm9uTkxTKi87IC8vIGdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZSIgOyAvLyROT04tTkxTLTEkDQorCS8vIGdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQogDQogCS8qKg0KIAkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEphdmEgYnVpbGRlcg0KIAkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyIjwvY29kZT4pLg0KIAkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9IFBMVUdJTl9JRCArICIuamF2YWJ1aWxkZXIiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9IFBMVUdJTl9JRCArICIuamF2YWJ1aWxkZXIiIDsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKioNCiAJICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBKYXZhIG1vZGVsDQogCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW1vZGVsIjwvY29kZT4pLg0KIAkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSBQTFVHSU5fSUQgKyAiLmphdmFtb2RlbCIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9JRCA9IFBMVUdJTl9JRCArICIuamF2YW1vZGVsIiA7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqDQogCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSmF2YSBuYXR1cmUNCkBAIC02NiwzNDcgKzcyLDM1MyBAQAogCSAqDQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QjaGFzTmF0dXJlDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSUQgPSBQTFVHSU5fSUQgKyAiLmphdmFuYXR1cmUiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gUExVR0lOX0lEICsgIi5qYXZhbmF0dXJlIiA7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqDQogCSAqIE5hbWUgb2YgdGhlIGhhbmRsZSBpZCBhdHRyaWJ1dGUgaW4gYSBKYXZhIG1hcmtlcg0KIAkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IQU5ETEVfSUQ9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyLmhhbmRsZUlkIi8qbm9uTkxTKi87DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEFORExFX0lEID0NCisJCSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyLmhhbmRsZUlkIiA7IC8vJE5PTi1OTFMtMSQNCiANCi0JLyoqDQotCSAqIE5hbWVzIG9mIHJlY29nbml6ZWQgY29uZmlndXJhYmxlIG9wdGlvbnMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX0xPQ0FMX1ZBUklBQkxFX0FUVFIgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGUiLypub25OTFMqLzsNCi0JCS8vIHBvc3NpYmxlIHZhbHVlcyBhcmUgR0VORVJBVEUgb3IgRE9fTk9UX0dFTkVSQVRFIChkZWZhdWx0IGlzIERPX05PVF9HRU5FUkFURSkNCi0JCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9MSU5FX05VTUJFUl9BVFRSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlICBHRU5FUkFURSBvciBET19OT1RfR0VORVJBVEUgKGRlZmF1bHQgaXMgR0VORVJBVEUpDQotCQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfU09VUkNFX0ZJTEVfQVRUUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSAgR0VORVJBVEUgb3IgRE9fTk9UX0dFTkVSQVRFIChkZWZhdWx0IGlzIEdFTkVSQVRFKQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBQUkVTRVJWRSBvciBPUFRJTUlaRV9PVVQJKGRlZmF1bHQgaXMgT1BUSU1JWkVfT1VUKQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBWRVJTSU9OXzFfMSBvciBWRVJTSU9OXzFfMgkoZGVmYXVsdCBpcyBWRVJTSU9OXzFfMSkNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiLypub25OTFMqLzsNCi0JCS8vIHBvc3NpYmxlIHZhbHVlcyBhcmUgRVJST1Igb3IgV0FSTklORwkoZGVmYXVsdCBpcyBFUlJPUikNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5WQUxJRF9JTVBPUlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEltcG9ydCIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBFUlJPUiBvciBXQVJOSU5HCShkZWZhdWx0IGlzIEVSUk9SKQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9PVkVSUklESU5HX1BBQ0tBR0VfREVGQVVMVF9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlIFdBUk5JTkcgb3IgSUdOT1JFIChkZWZhdWx0IGlzIFdBUk5JTkcpDQotCQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUVUSE9EX1dJVEhfQ09OU1RSVUNUT1JfTkFNRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlIFdBUk5JTkcgb3IgSUdOT1JFIChkZWZhdWx0IGlzIFdBUk5JTkcpDQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlIFdBUk5JTkcgb3IgSUdOT1JFIChkZWZhdWx0IGlzIFdBUk5JTkcpDQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlIFdBUk5JTkcgb3IgSUdOT1JFIChkZWZhdWx0IGlzIFdBUk5JTkcpDQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9MT0NBTCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbCIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBXQVJOSU5HIG9yIElHTk9SRSAoZGVmYXVsdCBpcyBXQVJOSU5HKQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIvKm5vbk5MUyovOw0KLQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBXQVJOSU5HIG9yIElHTk9SRSAoZGVmYXVsdCBpcyBXQVJOSU5HKQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9TWU5USEVUSUNfQUNDRVNTX0VNVUxBVElPTiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24iLypub25OTFMqLzsNCi0JCS8vIHBvc3NpYmxlIHZhbHVlcyBhcmUgV0FSTklORyBvciBJR05PUkUgKGRlZmF1bHQgaXMgSUdOT1JFKQkNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9PUkRFUiA9IFBMVUdJTl9JRCArICIuY29tcHV0ZUphdmFCdWlsZE9yZGVyIi8qbm9uTkxTKi87DQotCQkvLyBwb3NzaWJsZSB2YWx1ZXMgYXJlIENPTVBVVEUgb3IgSUdOT1JFIChkZWZhdWx0IGlzIENPTVBVVEUpDQotCS8qKg0KLQkgKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURSA9ICJnZW5lcmF0ZSIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19OT1RfR0VORVJBVEUgPSAiZG8gbm90IGdlbmVyYXRlIi8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFID0gInByZXNlcnZlIi8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElNSVpFX09VVCA9ICJvcHRpbWl6ZSBvdXQiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl8xXzEgPSAiMS4xIi8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV8yID0gIjEuMiIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJlcnJvciIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFID0gImlnbm9yZSIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QVVRFID0gImNvbXB1dGUiLypub25OTFMqLzsNCi0JDQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBDb25maWd1cmFibGVPcHRpb25zOw0KIAlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgVmFyaWFibGVzID0gbmV3IEhhc2h0YWJsZSg1KTsNCi0JCS8vIHBvc3NpYmxlIHZhbHVlcyBhcmUgV0FSTklORyBvciBJR05PUkUgKGRlZmF1bHQgaXMgSUdOT1JFKQ0KIA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9OT05fRVhURVJOQUxJWkVEX1NUUklOR19MSVRFUkFMID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwiLypub25OTFMqLzsNCisJLyoqDQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gbmFtZXMuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgZmlsZSBuYW1lZCBKYXZhLmluaQ0KKwkgKi8NCiANCi0vKioNCi0gKiBDcmVhdGVzIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbi4NCi0gKi8NCi1wdWJsaWMgSmF2YUNvcmUoSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvcikgew0KLQlzdXBlcihwbHVnaW5EZXNjcmlwdG9yKTsNCi0JSkFWQV9DT1JFX1BMVUdJTiA9IHRoaXM7DQotfQ0KLS8qKg0KLSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMuDQotICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLg0KLSAqDQotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOw0KLX0NCi0vKioNCi0gKiBDb25maWd1cmVzIHRoZSBnaXZlbiBtYXJrZXIgYXR0cmlidXRlIG1hcCBmb3IgdGhlIGdpdmVuIEphdmEgZWxlbWVudC4NCi0gKiBVc2VkIGZvciBtYXJrZXJzIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLg0KLSAqDQotICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIG11dGFibGUgbWFya2VyIGF0dHJpYnV0ZSBtYXAgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LA0KLSAqICAgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikNCi0gKiBAcGFyYW0gZWxlbWVudCB0aGUgSmF2YSBlbGVtZW50IGZvciB3aGljaCB0aGUgbWFya2VyIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQNCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkSmF2YUVsZW1lbnRNYXJrZXJBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgew0KLQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIA0KLQkJZWxlbWVudD0gKChJTWVtYmVyKSBlbGVtZW50KS5nZXRDbGFzc0ZpbGUoKTsNCi0JaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBlbGVtZW50ICE9IG51bGwpDQotCQlhdHRyaWJ1dGVzLnB1dChBVFRfSEFORExFX0lELCBlbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKSk7DQotfQ0KLS8qKg0KLSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG1hcmtlciBmb3IgdGhlIGdpdmVuIEphdmEgZWxlbWVudC4NCi0gKiBVc2VkIGZvciBtYXJrZXJzIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLg0KLSAqDQotICogQHBhcmFtIG1hcmtlciB0aGUgbWFya2VyIHRvIGJlIGNvbmZpZ3VyZWQNCi0gKiBAcGFyYW0gZWxlbWVudCB0aGUgSmF2YSBlbGVtZW50IGZvciB3aGljaCB0aGUgbWFya2VyIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQNCi0gKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIDxjb2RlPklNYXJrZXIuc2V0QXR0cmlidXRlPC9jb2RlPiBvbiB0aGUgbWFya2VyIGZhaWxzDQotICovDQotcHVibGljIHZvaWQgY29uZmlndXJlSmF2YUVsZW1lbnRNYXJrZXIoSU1hcmtlciBtYXJrZXIsIElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikNCi0JCWVsZW1lbnQ9ICgoSU1lbWJlcillbGVtZW50KS5nZXRDbGFzc0ZpbGUoKTsNCi0JaWYgKG1hcmtlciAhPSBudWxsICYmIGVsZW1lbnQgIT0gbnVsbCkNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUX0hBTkRMRV9JRCwgZWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCkpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBKYXZhIG1vZGVsIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaGFuZGxlIGlkZW50aWZpZXINCi0gKiBnZW5lcmF0ZWQgYnkgPGNvZGU+SUphdmFFbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKTwvY29kZT4sIG9yDQotICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShTdHJpbmcgaGFuZGxlSWRlbnRpZmllcikgew0KLQlpZiAoaGFuZGxlSWRlbnRpZmllciA9PSBudWxsKSB7DQotCQlyZXR1cm4gbnVsbDsNCisJLy8gRmlsZSBjb250YWluaW5nIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NPUkVfSU5JVCA9ICJKYXZhQ29yZS5pbmkiOyAvLyROT04tTkxTLTEkDQorCQ0KKwkvKioNCisJICogQ29tcGlsZXIgb3B0aW9ucw0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGU7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlID0gQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSA9IENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWw7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnJlYWNoYWJsZUNvZGUgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVucmVhY2hhYmxlQ29kZTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEludmFsaWRJbXBvcnQgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRJbXBvcnQ7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lID0gQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kID0gQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnREZXByZWNhdGlvbiA9IENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb247DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrID0gQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkTG9jYWwgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyID0gQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UYXJnZXRQbGF0Zm9ybSA9IENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm07DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24gPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Tb3VyY2UgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIgPSBDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXI7DQorDQorCS8qKg0KKwkgKiBDb2RlIEZvcm1hdHRlciBvcHRpb25zDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fSW5zZXJ0TmV3bGluZUJlZm9yZU9wZW5pbmdCcmFjZSA9IEZvcm1hdHRlck9wdGlvbnMuT1BUSU9OX0luc2VydE5ld2xpbmVCZWZvcmVPcGVuaW5nQnJhY2U7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9JbnNlcnROZXdsaW5lSW5Db250cm9sU3RhdGVtZW50ID0gRm9ybWF0dGVyT3B0aW9ucy5PUFRJT05fSW5zZXJ0TmV3bGluZUluQ29udHJvbFN0YXRlbWVudDsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0luc2VydE5ld0xpbmVCZXR3ZWVuRWxzZUFuZElmID0gRm9ybWF0dGVyT3B0aW9ucy5PUFRJT05fSW5zZXJ0TmV3TGluZUJldHdlZW5FbHNlQW5kSWY7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9JbnNlcnROZXdMaW5lSW5FbXB0eUJsb2NrID0gRm9ybWF0dGVyT3B0aW9ucy5PUFRJT05fSW5zZXJ0TmV3TGluZUluRW1wdHlCbG9jazsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0NsZWFyQWxsQmxhbmtMaW5lcyA9IEZvcm1hdHRlck9wdGlvbnMuT1BUSU9OX0NsZWFyQWxsQmxhbmtMaW5lczsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NwbGl0TGluZUV4Y2VlZGluZ0xlbmd0aCA9IEZvcm1hdHRlck9wdGlvbnMuT1BUSU9OX1NwbGl0TGluZUV4Y2VlZGluZ0xlbmd0aDsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0NvbXBhY3RBc3NpZ25tZW50ID0gRm9ybWF0dGVyT3B0aW9ucy5PUFRJT05fQ29tcGFjdEFzc2lnbm1lbnQ7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UYWJ1bGF0aW9uQ2hhciA9IEZvcm1hdHRlck9wdGlvbnMuT1BUSU9OX1RhYnVsYXRpb25DaGFyOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVGFidWxhdGlvblNpemUgPSBGb3JtYXR0ZXJPcHRpb25zLk9QVElPTl9UYWJ1bGF0aW9uU2l6ZTsNCisJDQorCS8qKg0KKwkgKiBDb21wbGV0aW9uIEVuZ2luZSBvcHRpb25zDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVmlzaWJpbGl0eVNlbnNpdGl2aXR5ID0gQ29tcGxldGlvbk9wdGlvbnMuT1BUSU9OX1BlcmZvcm1WaXNpYmlsaXR5Q2hlY2s7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9FbnRpcmVXb3JkUmVwbGFjZW1lbnQgPSBDb21wbGV0aW9uT3B0aW9ucy5PUFRJT05fRW50aXJlV29yZFJlcGxhY2VtZW50Ow0KKwkNCisJLyoqDQorCSAqIEphdmFDb3JlIG9wdGlvbnMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Db21wdXRlQnVpbGRPcmRlciA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5jb21wdXRlSmF2YUJ1aWxkT3JkZXIiOyAvLyROT04tTkxTLTEkDQorCQ0KKwkvKioNCisJICogQ29kZSBBc3Npc3Qgb3B0aW9ucw0KKwkgKi8NCisJDQorCS8qKg0KKwkgKiBDcmVhdGVzIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbi4NCisJICovDQorCXB1YmxpYyBKYXZhQ29yZShJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yKSB7DQorCQlzdXBlcihwbHVnaW5EZXNjcmlwdG9yKTsNCisJCUpBVkFfQ09SRV9QTFVHSU4gPSB0aGlzOw0KIAl9DQotCXRyeSB7DQotCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SGFuZGxlRnJvbU1lbWVudG8oaGFuZGxlSWRlbnRpZmllcik7DQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQlyZXR1cm4gbnVsbDsNCisNCisJLyoqDQorCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMuDQorCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4NCisJICoNCisJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOw0KIAl9DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWxlLCBvcg0KLSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZpbGUNCi0gKiB3aXRoIGEgSmF2YSBlbGVtZW50Lg0KLSAqDQotICogPHA+VGhlIGZpbGUgbXVzdCBiZSBvbmUgb2Y6PHVsPg0KLSAqCTxsaT5hIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT48L2xpPg0KLSAqCTxsaT5hIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+PC9saT4NCi0gKgk8bGk+YSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+PC9saT4NCi0gKgk8L3VsPg0KLSAqIDxwPg0KLSAqIENyZWF0aW5nIGEgSmF2YSBlbGVtZW50IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQ0KLSAqIGVsZW1lbnQncyBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCB5ZXQgb3Blbi4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoSUZpbGUgZmlsZSkgew0KLQlpZiAoZmlsZSA9PSBudWxsKSB7DQotCQlyZXR1cm4gbnVsbDsNCisNCisJLyoqDQorCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG1hcmtlciBhdHRyaWJ1dGUgbWFwIGZvciB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50Lg0KKwkgKiBVc2VkIGZvciBtYXJrZXJzIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLg0KKwkgKg0KKwkgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgbXV0YWJsZSBtYXJrZXIgYXR0cmlidXRlIG1hcCAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4sDQorCSAqICAgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikNCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIEphdmEgZWxlbWVudCBmb3Igd2hpY2ggdGhlIG1hcmtlciBuZWVkcyB0byBiZSBjb25maWd1cmVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSmF2YUVsZW1lbnRNYXJrZXJBdHRyaWJ1dGVzKA0KKwkJTWFwIGF0dHJpYnV0ZXMsDQorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKQ0KKwkJCWVsZW1lbnQgPSAoKElNZW1iZXIpIGVsZW1lbnQpLmdldENsYXNzRmlsZSgpOw0KKwkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBlbGVtZW50ICE9IG51bGwpDQorCQkJYXR0cmlidXRlcy5wdXQoQVRUX0hBTkRMRV9JRCwgZWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCkpOw0KIAl9DQotCVN0cmluZyBleHRlbnNpb249IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmdldEZpbGVFeHRlbnNpb24oKTsNCi0JaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7DQotCQlleHRlbnNpb249IGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpOw0KLQkJaWYgKGV4dGVuc2lvbi5lcXVhbHMoImphdmEiLypub25OTFMqLykpIHsNCi0JCQlyZXR1cm4gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsNCi0JCX0gZWxzZSBpZiAoZXh0ZW5zaW9uLmVxdWFscygiY2xhc3MiLypub25OTFMqLykpIHsNCi0JCQlyZXR1cm4gY3JlYXRlQ2xhc3NGaWxlRnJvbShmaWxlKTsNCi0JCX0gZWxzZSBpZiAoZXh0ZW5zaW9uLmVxdWFscygiamFyIi8qbm9uTkxTKi8pIHx8IGV4dGVuc2lvbi5lcXVhbHMoInppcCIvKm5vbk5MUyovKSkgew0KLQkJCXJldHVybiBjcmVhdGVKYXJQYWNrYWdlRnJhZ21lbnRSb290RnJvbShmaWxlKTsNCisJLyoqDQorCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG1hcmtlciBmb3IgdGhlIGdpdmVuIEphdmEgZWxlbWVudC4NCisJICogVXNlZCBmb3IgbWFya2VycyB3aGljaCBkZW5vdGUgYSBKYXZhIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSByZXNvdXJjZS4NCisJICoNCisJICogQHBhcmFtIG1hcmtlciB0aGUgbWFya2VyIHRvIGJlIGNvbmZpZ3VyZWQNCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIEphdmEgZWxlbWVudCBmb3Igd2hpY2ggdGhlIG1hcmtlciBuZWVkcyB0byBiZSBjb25maWd1cmVkDQorCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SU1hcmtlci5zZXRBdHRyaWJ1dGU8L2NvZGU+IG9uIHRoZSBtYXJrZXIgZmFpbHMNCisJICovDQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUphdmFFbGVtZW50TWFya2VyKElNYXJrZXIgbWFya2VyLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkNCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikNCisJCQllbGVtZW50ID0gKChJTWVtYmVyKSBlbGVtZW50KS5nZXRDbGFzc0ZpbGUoKTsNCisJCWlmIChtYXJrZXIgIT0gbnVsbCAmJiBlbGVtZW50ICE9IG51bGwpDQorCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRfSEFORExFX0lELCBlbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKSk7DQorCX0NCisJLyoqDQorCSAqIFJldHVybnMgdGhlIEphdmEgbW9kZWwgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBoYW5kbGUgaWRlbnRpZmllcg0KKwkgKiBnZW5lcmF0ZWQgYnkgPGNvZGU+SUphdmFFbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKTwvY29kZT4sIG9yDQorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgZWxlbWVudC4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShTdHJpbmcgaGFuZGxlSWRlbnRpZmllcikgew0KKwkJaWYgKGhhbmRsZUlkZW50aWZpZXIgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KIAkJfQ0KLQl9CQ0KLQlyZXR1cm4gbnVsbDsJDQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgb3IgcGFja2FnZSBmcmFnbWVudCByb290IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZvbGRlciwgb3INCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBmb2xkZXIgd2l0aCBhIEphdmEgZWxlbWVudC4NCi0gKiA8cD4NCi0gKiBOb3RlIHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgcmV0dXJuZWQgcmF0aGVyIHRoYW4gYSBkZWZhdWx0IHBhY2thZ2UuDQotICogPHA+DQotICogQ3JlYXRpbmcgYSBKYXZhIGVsZW1lbnQgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhbmQgb3BlbmluZyBhbGwgb2YgdGhlDQotICogZWxlbWVudCdzIHBhcmVudHMgaWYgdGhleSBhcmUgbm90IHlldCBvcGVuLg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShJRm9sZGVyIGZvbGRlcikgew0KLQlpZiAoZm9sZGVyID09IG51bGwpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCWlmIChmb2xkZXIuZ2V0TmFtZSgpLmluZGV4T2YoJy4nKSA8IDApIHsNCi0JCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGNyZWF0ZShmb2xkZXIuZ2V0UHJvamVjdCgpKTsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwpIHJldHVybiBudWxsOw0KLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZXRlcm1pbmVJZk9uQ2xhc3NwYXRoKGZvbGRlciwgcHJvamVjdCk7CQ0KIAkJdHJ5IHsNCi0JCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsNCi0JCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7DQotCQkJaWYgKG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoZm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7DQotCQkJCWlmIChwcm9qZWN0LmdldENsYXNzcGF0aEVudHJ5Rm9yKG91dHB1dExvY2F0aW9uKSAhPSBudWxsKSB7DQotCQkJCQkvLyBpZiB0aGUgb3V0cHV0IGxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIGFuIGlucHV0IGxvY2F0aW9uLCByZXR1cm4gdGhlIGVsZW1lbnQNCi0JCQkJCXJldHVybiBlbGVtZW50Ow0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJLy8gb3RoZXJ3aXNlLCBkbyBub3QgY3JlYXRlIGVsZW1lbnRzIGZvciBmb2xkZXJzIGluIHRoZSBvdXRwdXQgbG9jYXRpb24NCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJcmV0dXJuIGVsZW1lbnQ7DQotCQkJfQ0KKwkJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRIYW5kbGVGcm9tTWVtZW50bygNCisJCQkJaGFuZGxlSWRlbnRpZmllcik7DQogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJCXJldHVybiBudWxsOw0KIAkJfQ0KIAl9DQotCXJldHVybiBudWxsOwkJCQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCwgb3INCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBwcm9qZWN0DQotICogd2l0aCBhIEphdmEgcHJvamVjdC4NCi0gKiA8cD4NCi0gKiBDcmVhdGluZyBhIEphdmEgUHJvamVjdCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGFsbCBvZiB0aGUNCi0gKiBwcm9qZWN0J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uDQotICovDQotcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsNCi0JaWYgKHByb2plY3QgPT0gbnVsbCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JSmF2YU1vZGVsIGphdmFNb2RlbD0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWwocHJvamVjdC5nZXRXb3Jrc3BhY2UoKSk7DQotCXJldHVybiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiByZXNvdXJjZSwgb3INCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiByZXNvdXJjZQ0KLSAqIHdpdGggYSBKYXZhIGVsZW1lbnQuDQotICogPHA+DQotICogVGhlIHJlc291cmNlIG11c3QgYmUgb25lIG9mOjx1bD4NCi0gKgk8bGk+YSBwcm9qZWN0IC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPjwvbGk+DQotICoJPGxpPmEgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPjwvbGk+DQotICoJPGxpPmEgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT48L2xpPg0KLSAqCTxsaT5hIDxjb2RlPi5qYXI8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT48L2xpPg0KLSAqICA8bGk+YSBmb2xkZXIgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4NCi0gKgkJCW9yIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+PC9saT4NCi0gKiAgPGxpPnRoZSB3b3Jrc3BhY2Ugcm9vdCByZXNvdXJjZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPjwvbGk+DQotICoJPC91bD4NCi0gKiA8cD4NCi0gKiBDcmVhdGluZyBhIEphdmEgZWxlbWVudCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGFsbCBvZiB0aGUNCi0gKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uDQotICovDQotcHVibGljIHN0YXRpYyBJSmF2YUVsZW1lbnQgY3JlYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgew0KLQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JaW50IHR5cGU9IHJlc291cmNlLmdldFR5cGUoKTsNCi0Jc3dpdGNoICh0eXBlKSB7DQotCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUOg0KLQkJCXJldHVybiBjcmVhdGUoKElQcm9qZWN0KXJlc291cmNlKTsNCi0JCWNhc2UgSVJlc291cmNlLkZJTEU6DQotCQkJcmV0dXJuIGNyZWF0ZSgoSUZpbGUpcmVzb3VyY2UpOwkNCi0JCWNhc2UgSVJlc291cmNlLkZPTERFUjoNCi0JCQlyZXR1cm4gY3JlYXRlKChJRm9sZGVyKXJlc291cmNlKTsJCQ0KLQkJY2FzZSBJUmVzb3VyY2UuUk9PVDoNCi0JCQlyZXR1cm4gY3JlYXRlKChJV29ya3NwYWNlUm9vdClyZXNvdXJjZSk7DQotCQlkZWZhdWx0Og0KKwkvKioNCisJICogUmV0dXJucyB0aGUgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZpbGUsIG9yDQorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZpbGUNCisJICogd2l0aCBhIEphdmEgZWxlbWVudC4NCisJICoNCisJICogPHA+VGhlIGZpbGUgbXVzdCBiZSBvbmUgb2Y6PHVsPg0KKwkgKgk8bGk+YSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4NCisJICoJPGxpPmEgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT48L2xpPg0KKwkgKgk8bGk+YSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+PC9saT4NCisJICoJPC91bD4NCisJICogPHA+DQorCSAqIENyZWF0aW5nIGEgSmF2YSBlbGVtZW50IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQ0KKwkgKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoSUZpbGUgZmlsZSkgew0KKwkJaWYgKGZpbGUgPT0gbnVsbCkgew0KIAkJCXJldHVybiBudWxsOw0KLQl9DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIEphdmEgbW9kZWwuDQotICovDQotcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsIGNyZWF0ZShJV29ya3NwYWNlUm9vdCByb290KSB7DQotCWlmIChyb290ID09IG51bGwpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbChyb290LmdldFdvcmtzcGFjZSgpKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsYXNzIGZpbGUgZWxlbWVudCBmb3INCi0gKiB0aGUgZ2l2ZW4gPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZQ0KLSAqIHRvIHJlY29nbml6ZSB0aGUgY2xhc3MgZmlsZS4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIElDbGFzc0ZpbGUgY3JlYXRlQ2xhc3NGaWxlRnJvbShJRmlsZSBmaWxlKSB7DQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsNCi0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZGV0ZXJtaW5lSWZPbkNsYXNzcGF0aChmaWxlLCBwcm9qZWN0KTsNCi0JaWYgKHBrZyA9PSBudWxsKSB7DQotCQkvLyBmaXggZm9yIDFGVlM3V0UNCi0JCS8vIG5vdCBvbiBjbGFzc3BhdGggLSBtYWtlIHRoZSByb290IGl0cyBmb2xkZXIsIGFuZCBhIGRlZmF1bHQgcGFja2FnZQ0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZpbGUuZ2V0UGFyZW50KCkpOw0KLQkJcGtnPSByb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsNCi0JfQ0KLQlyZXR1cm4gcGtnLmdldENsYXNzRmlsZShmaWxlLmdldE5hbWUoKSk7DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjb21waWxhdGlvbiB1bml0IGVsZW1lbnQgZm9yDQotICogdGhlIGdpdmVuIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZQ0KLSAqIHRvIHJlY29nbml6ZSB0aGUgY29tcGlsYXRpb24gdW5pdC4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7DQotCUlQcm9qZWN0IGZpbGVQcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7DQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgY3JlYXRlKGZpbGVQcm9qZWN0KTsNCi0JSVBhY2thZ2VGcmFnbWVudCBwa2c9IChJUGFja2FnZUZyYWdtZW50KWRldGVybWluZUlmT25DbGFzc3BhdGgoZmlsZSwgcHJvamVjdCk7DQotCWlmIChwa2cgPT0gbnVsbCkgew0KLQkJLy8gZml4IGZvciAxRlZTN1dFDQotCQkvLyBub3Qgb24gY2xhc3NwYXRoIC0gbWFrZSB0aGUgcm9vdCBpdHMgZm9sZGVyLCBhbmQgYSBkZWZhdWx0IHBhY2thZ2UNCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmaWxlLmdldFBhcmVudCgpKTsNCi0JCXBrZz0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7DQotCX0gDQotCXJldHVybiBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KGZpbGUuZ2V0TmFtZSgpKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIGdpdmVuIEpBUiBmaWxlLg0KLSAqIFRoZSBKYXZhIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFSJ3MgcHJvamVjdCBtYXkgYmUNCi0gKiBjcmVhdGVkIGFzIGEgc2lkZSBlZmZlY3QuIA0KLSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEpBUiBwYWNrYWdlIGZyYWdtZW50IHJvb3QuDQotICogKGZvciBleGFtcGxlLCBpZiB0aGUgSkFSIGZpbGUgcmVwcmVzZW50cyBhIG5vbi1KYXZhIHJlc291cmNlKQ0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlSmFyUGFja2FnZUZyYWdtZW50Um9vdEZyb20oSUZpbGUgZmlsZSkgew0KLQlJSmF2YVByb2plY3QgcHJvamVjdD0gKElKYXZhUHJvamVjdCljcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOw0KLQ0KLQkvLyBDcmVhdGUgYSBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IG9ubHkgaWYgb24gdGhlIGNsYXNzcGF0aA0KLQlJUGF0aCByZXNvdXJjZVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7DQotCXRyeSB7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsNCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsNCi0JCQlJUGF0aCByb290UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsNCi0JCQlpZiAocm9vdFBhdGguZXF1YWxzKHJlc291cmNlUGF0aCkpIHsNCi0JCQkJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmaWxlKTsNCisJCX0NCisJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQorCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsNCisJCQlleHRlbnNpb24gPSBleHRlbnNpb24udG9Mb3dlckNhc2UoKTsNCisJCQlpZiAoZXh0ZW5zaW9uLmVxdWFscygiamF2YSIgIC8vJE5PTi1OTFMtMSQNCisJCQkJKSkgew0KKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsNCisJCQl9IGVsc2UgaWYgKGV4dGVuc2lvbi5lcXVhbHMoImNsYXNzIiAgLy8kTk9OLU5MUy0xJA0KKwkJCQkpKSB7DQorCQkJCXJldHVybiBjcmVhdGVDbGFzc0ZpbGVGcm9tKGZpbGUpOw0KKwkJCX0gZWxzZSBpZiAoZXh0ZW5zaW9uLmVxdWFscygiamFyIiAgLy8kTk9OLU5MUy0xJA0KKwkJCQkpIHx8IGV4dGVuc2lvbi5lcXVhbHMoInppcCIgIC8vJE5PTi1OTFMtMSQNCisJCQkJKSkgew0KKwkJCQlyZXR1cm4gY3JlYXRlSmFyUGFja2FnZUZyYWdtZW50Um9vdEZyb20oZmlsZSk7DQogCQkJfQ0KIAkJfQ0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KKwkJcmV0dXJuIG51bGw7DQogCX0NCi0JcmV0dXJuIG51bGw7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCByZXByZXNlbnRlZCBieSB0aGUgcmVzb3VyY2UsIG9yDQotICogdGhlIHBhY2thZ2UgZnJhZ21lbnQgdGhlIGdpdmVuIHJlc291cmNlIGlzIGxvY2F0ZWQgaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotICogaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBnaXZlbiBwcm9qZWN0Lg0KLSAqLw0KLXByaXZhdGUgc3RhdGljIElKYXZhRWxlbWVudCBkZXRlcm1pbmVJZk9uQ2xhc3NwYXRoKElSZXNvdXJjZSByZXNvdXJjZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsNCi0JSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsNCi0JdHJ5IHsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsNCi0JCQlJUGF0aCByb290UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsNCi0JCQlpZiAocm9vdFBhdGguZXF1YWxzKHJlc291cmNlUGF0aCkpIHsNCi0JCQkJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSk7DQotCQkJfSBlbHNlDQotCQkJCWlmIChyb290UGF0aC5pc1ByZWZpeE9mKHJlc291cmNlUGF0aCkpIHsNCi0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoKEphdmFQcm9qZWN0KXByb2plY3QpLmdldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdFBhdGgpOw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCBvciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZm9sZGVyLCBvcg0KKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBmb2xkZXIgd2l0aCBhIEphdmEgZWxlbWVudC4NCisJICogPHA+DQorCSAqIE5vdGUgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiBhIGRlZmF1bHQgcGFja2FnZS4NCisJICogPHA+DQorCSAqIENyZWF0aW5nIGEgSmF2YSBlbGVtZW50IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQ0KKwkgKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoSUZvbGRlciBmb2xkZXIpIHsNCisJCWlmIChmb2xkZXIgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJaWYgKGZvbGRlci5nZXROYW1lKCkuaW5kZXhPZignLicpIDwgMCkgew0KKwkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGNyZWF0ZShmb2xkZXIuZ2V0UHJvamVjdCgpKTsNCisJCQlpZiAocHJvamVjdCA9PSBudWxsKQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRldGVybWluZUlmT25DbGFzc3BhdGgoZm9sZGVyLCBwcm9qZWN0KTsNCisJCQl0cnkgew0KKwkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsNCisJCQkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpDQorCQkJCQlyZXR1cm4gbnVsbDsNCisJCQkJaWYgKG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoZm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7DQorCQkJCQlpZiAocHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihvdXRwdXRMb2NhdGlvbikgIT0gbnVsbCkgew0KKwkJCQkJCS8vIGlmIHRoZSBvdXRwdXQgbG9jYXRpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgbG9jYXRpb24sIHJldHVybiB0aGUgZWxlbWVudA0KKwkJCQkJCXJldHVybiBlbGVtZW50Ow0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQkvLyBvdGhlcndpc2UsIGRvIG5vdCBjcmVhdGUgZWxlbWVudHMgZm9yIGZvbGRlcnMgaW4gdGhlIG91dHB1dCBsb2NhdGlvbg0KKwkJCQkJCXJldHVybiBudWxsOw0KKwkJCQkJfQ0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmV0dXJuIGVsZW1lbnQ7DQorCQkJCX0NCisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QsIG9yDQorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIHByb2plY3QNCisJICogd2l0aCBhIEphdmEgcHJvamVjdC4NCisJICogPHA+DQorCSAqIENyZWF0aW5nIGEgSmF2YSBQcm9qZWN0IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQ0KKwkgKiBwcm9qZWN0J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgew0KKwkJaWYgKHByb2plY3QgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsKHByb2plY3QuZ2V0V29ya3NwYWNlKCkpOw0KKwkJcmV0dXJuIGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsNCisJfQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHJlc291cmNlLCBvcg0KKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiByZXNvdXJjZQ0KKwkgKiB3aXRoIGEgSmF2YSBlbGVtZW50Lg0KKwkgKiA8cD4NCisJICogVGhlIHJlc291cmNlIG11c3QgYmUgb25lIG9mOjx1bD4NCisJICoJPGxpPmEgcHJvamVjdCAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT48L2xpPg0KKwkgKgk8bGk+YSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4NCisJICoJPGxpPmEgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT48L2xpPg0KKwkgKgk8bGk+YSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+PC9saT4NCisJICogIDxsaT5hIGZvbGRlciAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPg0KKwkgKgkJCW9yIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+PC9saT4NCisJICogIDxsaT50aGUgd29ya3NwYWNlIHJvb3QgcmVzb3VyY2UgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgPGNvZGU+SUphdmFNb2RlbDwvY29kZT48L2xpPg0KKwkgKgk8L3VsPg0KKwkgKiA8cD4NCisJICogQ3JlYXRpbmcgYSBKYXZhIGVsZW1lbnQgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhbmQgb3BlbmluZyBhbGwgb2YgdGhlDQorCSAqIGVsZW1lbnQncyBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCB5ZXQgb3Blbi4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlpbnQgdHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsNCisJCXN3aXRjaCAodHlwZSkgew0KKwkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOg0KKwkJCQlyZXR1cm4gY3JlYXRlKChJUHJvamVjdCkgcmVzb3VyY2UpOw0KKwkJCWNhc2UgSVJlc291cmNlLkZJTEUgOg0KKwkJCQlyZXR1cm4gY3JlYXRlKChJRmlsZSkgcmVzb3VyY2UpOw0KKwkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6DQorCQkJCXJldHVybiBjcmVhdGUoKElGb2xkZXIpIHJlc291cmNlKTsNCisJCQljYXNlIElSZXNvdXJjZS5ST09UIDoNCisJCQkJcmV0dXJuIGNyZWF0ZSgoSVdvcmtzcGFjZVJvb3QpIHJlc291cmNlKTsNCisJCQlkZWZhdWx0IDoNCisJCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCX0NCisJLyoqDQorCSAqIFJldHVybnMgdGhlIEphdmEgbW9kZWwuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWwgY3JlYXRlKElXb3Jrc3BhY2VSb290IHJvb3QpIHsNCisJCWlmIChyb290ID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbChyb290LmdldFdvcmtzcGFjZSgpKTsNCisJfQ0KKwkvKioNCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsYXNzIGZpbGUgZWxlbWVudCBmb3INCisJICogdGhlIGdpdmVuIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZS4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUNCisJICogdG8gcmVjb2duaXplIHRoZSBjbGFzcyBmaWxlLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlIGNyZWF0ZUNsYXNzRmlsZUZyb20oSUZpbGUgZmlsZSkgew0KKwkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBjcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOw0KKwkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZGV0ZXJtaW5lSWZPbkNsYXNzcGF0aChmaWxlLCBwcm9qZWN0KTsNCisJCWlmIChwa2cgPT0gbnVsbCkgew0KKwkJCS8vIGZpeCBmb3IgMUZWUzdXRQ0KKwkJCS8vIG5vdCBvbiBjbGFzc3BhdGggLSBtYWtlIHRoZSByb290IGl0cyBmb2xkZXIsIGFuZCBhIGRlZmF1bHQgcGFja2FnZQ0KKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZmlsZS5nZXRQYXJlbnQoKSk7DQorCQkJcGtnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7DQorCQl9DQorCQlyZXR1cm4gcGtnLmdldENsYXNzRmlsZShmaWxlLmdldE5hbWUoKSk7DQorCX0NCisJLyoqDQorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjb21waWxhdGlvbiB1bml0IGVsZW1lbnQgZm9yDQorCSAqIHRoZSBnaXZlbiA8Y29kZT4uamF2YTwvY29kZT4gZmlsZS4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUNCisJICogdG8gcmVjb2duaXplIHRoZSBjb21waWxhdGlvbiB1bml0Lg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgew0KKwkJSVByb2plY3QgZmlsZVByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsNCisJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgY3JlYXRlKGZpbGVQcm9qZWN0KTsNCisJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGRldGVybWluZUlmT25DbGFzc3BhdGgoZmlsZSwgcHJvamVjdCk7DQorCQlpZiAocGtnID09IG51bGwpIHsNCisJCQkvLyBmaXggZm9yIDFGVlM3V0UNCisJCQkvLyBub3Qgb24gY2xhc3NwYXRoIC0gbWFrZSB0aGUgcm9vdCBpdHMgZm9sZGVyLCBhbmQgYSBkZWZhdWx0IHBhY2thZ2UNCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZpbGUuZ2V0UGFyZW50KCkpOw0KKwkJCXBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOw0KKwkJfQ0KKwkJcmV0dXJuIHBrZy5nZXRDb21waWxhdGlvblVuaXQoZmlsZS5nZXROYW1lKCkpOw0KKwl9DQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gSkFSIGZpbGUuDQorCSAqIFRoZSBKYXZhIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFSJ3MgcHJvamVjdCBtYXkgYmUNCisJICogY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0LiANCisJICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gY3JlYXRlIGEgSkFSIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4NCisJICogKGZvciBleGFtcGxlLCBpZiB0aGUgSkFSIGZpbGUgcmVwcmVzZW50cyBhIG5vbi1KYXZhIHJlc291cmNlKQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBjcmVhdGVKYXJQYWNrYWdlRnJhZ21lbnRSb290RnJvbShJRmlsZSBmaWxlKSB7DQorCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IChJSmF2YVByb2plY3QpIGNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7DQorDQorCQkvLyBDcmVhdGUgYSBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IG9ubHkgaWYgb24gdGhlIGNsYXNzcGF0aA0KKwkJSVBhdGggcmVzb3VyY2VQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOw0KKwkJdHJ5IHsNCisJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsNCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOw0KKwkJCQlJUGF0aCByb290UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsNCisJCQkJaWYgKHJvb3RQYXRoLmVxdWFscyhyZXNvdXJjZVBhdGgpKSB7DQorCQkJCQlyZXR1cm4gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZpbGUpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcmVwcmVzZW50ZWQgYnkgdGhlIHJlc291cmNlLCBvcg0KKwkgKiB0aGUgcGFja2FnZSBmcmFnbWVudCB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgbG9jYXRlZCBpbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCisJICogaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBnaXZlbiBwcm9qZWN0Lg0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgSUphdmFFbGVtZW50IGRldGVybWluZUlmT25DbGFzc3BhdGgoDQorCQlJUmVzb3VyY2UgcmVzb3VyY2UsDQorCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KKwkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsNCisJCXRyeSB7DQorCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7DQorCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07DQorCQkJCUlQYXRoIHJvb3RQYXRoID0gZW50cnkuZ2V0UGF0aCgpOw0KKwkJCQlpZiAocm9vdFBhdGguZXF1YWxzKHJlc291cmNlUGF0aCkpIHsNCisJCQkJCXJldHVybiBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UpOw0KKwkJCQl9IGVsc2UgaWYgKHJvb3RQYXRoLmlzUHJlZml4T2YocmVzb3VyY2VQYXRoKSkgew0KKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9DQorCQkJCQkJKChKYXZhUHJvamVjdCkgcHJvamVjdCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyb290UGF0aCk7DQogCQkJCQlJUGF0aCBwa2dQYXRoID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdFBhdGguc2VnbWVudENvdW50KCkpOw0KIAkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KIAkJCQkJCS8vIGlmIHRoZSByZXNvdXJjZSBpcyBhIGZpbGUsIHRoZW4gcmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgd2hpY2gNCiAJCQkJCQkvLyBpcyB0aGUgZmlsZSBuYW1lIGluIHRoZSBwYWNrYWdlDQotCQkJCQkJcGtnUGF0aD0gcGtnUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7DQorCQkJCQkJcGtnUGF0aCA9IHBrZ1BhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOw0KIAkJCQkJfQ0KIAkJCQkJU3RyaW5nQnVmZmVyIHBrZ05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOw0KIAkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IHBrZ1BhdGguc2VnbWVudENvdW50KCk7IGogPCBtYXg7IGorKykgew0KQEAgLTQxNiw2NjIgKzQyOCw5MzYgQEAKIAkJCQkJCX0NCiAJCQkJCQlwa2dOYW1lLmFwcGVuZChzZWdtZW50KTsNCiAJCQkJCQlpZiAoaiA8IHBrZ1BhdGguc2VnbWVudENvdW50KCkgLSAxKSB7DQotCQkJCQkJCXBrZ05hbWUuYXBwZW5kKCIuIi8qbm9uTkxTKi8pOw0KKwkJCQkJCQlwa2dOYW1lLmFwcGVuZCgiLiIgKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCX0NCiAJCQkJCX0NCiAJCQkJCXJldHVybiByb290LmdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lLnRvU3RyaW5nKCkpOw0KIAkJCQl9DQorCQkJfQ0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgew0KKwkJCXJldHVybiBudWxsOw0KIAkJfQ0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7DQogCQlyZXR1cm4gbnVsbDsNCiAJfQ0KLQlyZXR1cm4gbnVsbDsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgcGF0aCBoZWxkIGluIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuDQotICogUmV0dXJucyA8bm9kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYmluZC4NCi0gKiA8cD4NCi0gKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgDQotICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4NCi0gKiA8cD4NCi0gKg0KLSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQ0KLSAqIEByZXR1cm4gdGhlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgDQotICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUNCi0gKi8NCi1wdWJsaWMgc3RhdGljIElQYXRoIGdldENsYXNzcGF0aFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHsNCi0JcmV0dXJuIChJUGF0aClWYXJpYWJsZXMuZ2V0KHZhcmlhYmxlTmFtZSk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCBrbm93biBjbGFzc3BhdGggdmFyaWFibGVzLg0KLSAqIDxwPg0KLSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCANCi0gKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KLSAqIDxwPg0KLSAqDQotICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc3BhdGggdmFyaWFibGUgbmFtZXMNCi0gKiBAc2VlICNzZXRDbGFzc3BhdGhWYXJpYWJsZQ0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoVmFyaWFibGVOYW1lcygpIHsNCi0JaW50IGxlbmd0aCA9IFZhcmlhYmxlcy5zaXplKCk7DQotCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsNCi0JRW51bWVyYXRpb24gdmFycyA9IFZhcmlhYmxlcy5rZXlzKCk7DQotCWludCBpbmRleCA9IDA7DQotCXdoaWxlICh2YXJzLmhhc01vcmVFbGVtZW50cygpKXsNCi0JCXJlc3VsdFtpbmRleCsrXSA9IChTdHJpbmcpdmFycy5uZXh0RWxlbWVudCgpOw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcGF0aCBoZWxkIGluIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuDQorCSAqIFJldHVybnMgPG5vZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGJpbmQuDQorCSAqIDxwPg0KKwkgKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgDQorCSAqIGFyZSBwcmVzZXJ2ZWQgZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24uDQorCSAqIDxwPg0KKwkgKg0KKwkgKiBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggdmFyaWFibGUNCisJICogQHJldHVybiB0aGUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSANCisJICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSkgew0KKwkJcmV0dXJuIChJUGF0aCkgVmFyaWFibGVzLmdldCh2YXJpYWJsZU5hbWUpOw0KIAl9DQotCXJldHVybiByZXN1bHQ7DQotfQ0KLS8qKg0KLSAqIEFuc3dlcnMgYSBzZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcy4NCi0gKiBUaGVzZSBvcHRpb25zIGFsbG93IHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgY29tcG9uZW50cy4NCi0gKiANCi0gKiBSZWNvZ25pemVkIG9wdGlvbnMgYXJlIGxpc3RlZCBiZWxvdywgb3B0aW9uTmFtZSA9IHBvc3NpYmxlVmFsdWUxIC8gcG9zc2libGVWYWx1ZTINCi0gKiB3aGVyZSBbXSBhcmUgZW5jbG9zaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbi4NCi0gKg0KLSAqIE5vdGU6IG1vcmUgb3B0aW9ucyBtaWdodCBiZSBhZGRlZCBpbiBmdXJ0aGVyIHJlbGVhc2VzLg0KLSAqDQotICogUkVDT0dOSVpFRCBPUFRJT05TOg0KLSAqDQotICoJQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUiA9IFtHRU5FUkFURV0gfCBET19OT1RfR0VORVJBVEUNCi0gKiAgCVdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSBsb2NhbCB2YXJpYWJsZSBuYW1lcyB0byBiZSBkaXNwbGF5ZWQgDQotICogCQlpbiBkZWJ1Z2dlciwgb25seSBpbiBwbGFjZSB3aGVyZSB2YXJpYWJsZXMgYXJlIGRlZmluaXRlbHkgYXNzaWduZWQgDQotICoJCSguY2xhc3MgZmlsZSBpcyB0aGVuIGJpZ2dlcikNCi0gKg0KLSAqICBDT01QSUxFUl9MSU5FX05VTUJFUl9BVFRSID0gW0dFTkVSQVRFXSB8IERPX05PVF9HRU5FUkFURSANCi0gKgkJV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHNvdXJjZSBjb2RlIGhpZ2hsaWdodGluZyBpbiBkZWJ1Z2dlciANCi0gKgkJKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKS4NCi0gKgkJDQotICogIENPTVBJTEVSX1NPVVJDRV9GSUxFX0FUVFIgPSBbR0VORVJBVEVdIHwgRE9fTk9UX0dFTkVSQVRFDQotICoJCVdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSB0aGUgZGVidWdnZXIgdG8gcHJlc2VudCB0aGUgDQotICoJCWNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuDQotICoNCi0gKiAgQ09NUElMRVJfQ09ERUdFTl9VTlVTRURfTE9DQUwgPSBbUFJFU0VSVkVdIHwgT1BUSU1JWkVfT1VUDQotICoJCVVubGVzcyByZXF1ZXN0ZWQgdG8gcHJlc2VydmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyAoaS5lLiBuZXZlciByZWFkKSwgdGhlIA0KLSAqCQljb21waWxlciB3aWxsIG9wdGltaXplIHRoZW0gb3V0LCBwb3RlbnRpYWxseSBhbHRlcmluZyBkZWJ1Z2dpbmcNCi0gKiANCi0gKiAgQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0gPSBbVkVSU0lPTl8xXzFdIHwgVkVSU0lPTl8xXzINCi0gKiAJCUdlbmVyYXRlIC5jbGFzcyBmaWxlcyBlaXRoZXIgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIEpWTSAxLjEgb3Igb25seSBleGVjdXRhYmxlIA0KLSAqCQlvbiBKVk0gMS4yIGFuZCBsYXRlcg0KLSAqDQotICoJQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSA9IFtFUlJPUl0gfCBXQVJOSU5HDQotICoJCVVucmVhY2hhYmxlIGNvZGUgY2FuIGVpdGhlciBiZSByZXBvcnRlZCBhcyBhbiBlcnJvciBvciBhIHdhcm5pbmcNCi0gKg0KLSAqCUNPTVBJTEVSX1BCX0lOVkFMSURfSU1QT1JUID0gW0VSUk9SXSB8IFdBUk5JTkcNCi0gKgkJQW4gaW1wb3J0IHN0YXRlbWVudCB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBtaWdodCBlaXRoZXIgYmUgcmVwb3J0ZWQgDQotICoJCWVpdGhlciBhcyBhbiBlcnJvciBvciBhcyBhIHdhcm5pbmcNCi0gKg0KLSAqCUNPTVBJTEVSX1BCX09WRVJSSURJTkdfUEFDS0FHRV9ERUZBVUxUX01FVEhPRCA9IFtXQVJOSU5HXSB8IElHTk9SRQ0KLSAqCQlBIHBhY2thZ2UgZGVmYXVsdCBtZXRob2QgaXMgbm90IHZpc2libGUgaW4gYSBkaWZmZXJlbnQgcGFja2FnZSwgYW5kIHRodXMgDQotICoJCWNhbm5vdCBiZSBvdmVycmlkZW4uIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCANCi0gKgkJc3VjaCBzY2VuYXJpaS4NCi0gKg0KLSAqICBDT01QSUxFUl9QQl9NRVRIT0RfV0lUSF9DT05TVFJVQ1RPUl9OQU1FID0gW1dBUk5JTkddIHwgSUdOT1JFDQotICogCQlOYW1pbmcgYSBtZXRob2Qgd2l0aCBhIGNvbnN0cnVjdG9yIG5hbWUgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgcG9vciANCi0gKgkJc3R5bGUgcHJvZ3JhbW1pbmcuIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCBzdWNoIA0KLSAqCQlzY2VuYXJpaQ0KLSAqDQotICogIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OID0gW1dBUk5JTkddIHwgSUdOT1JFDQotICoJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVzZSBvZiBkZXByZWNhdGVkIEFQSS4NCi0gKg0KLSAqCUNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSyA9IFtXQVJOSU5HXSB8IElHTk9SRQ0KLSAqCQlMb2NhbGx5IHRvIGEgdHJ5IHN0YXRlbWVudCwgc29tZSBjYXRjaCBibG9ja3MgbWF5IGhpZGUgb3RoZXJzIA0KLSAqCQkoZS5nLiAJdHJ5IHsJdGhyb3cgbmV3IGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKTsNCi0gKgkJCQl9IGNhdGNoIChqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uIGUpIHsNCi0gKgkJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHt9KS4gDQotICoJCVdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGEgd2FybmluZyBmb3IgaGlkZGVuIGNhdGNoIA0KLSAqCQlibG9ja3MgY29ycmVzcG9uZGluZyB0byBjaGVja2VkIGV4Y2VwdGlvbnMNCi0gKg0KLSAqICBDT01QSUxFUl9QQl9VTlVTRURfTE9DQUwgPSBXQVJOSU5HIHwgW0lHTk9SRV0NCi0gKiAJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB3YXJuaW5nIGZvciB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIA0KLSAqCQkoaS5lLiB2YXJpYWJsZXMgbmV2ZXIgcmVhZCBmcm9tKQ0KLSAqDQotICoJQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUiA9IFdBUk5JTkcgfCBbSUdOT1JFXQ0KLSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGEgd2FybmluZyBmb3IgdW51c2VkIG1ldGhvZCBwYXJhbWV0ZXJzIA0KLSAqCQkoaS5lLiBwYXJhbWV0ZXJzIG5ldmVyIHJlYWQgZnJvbSkNCi0gKg0KLSAqCUNPTVBJTEVSX1BCX1NZTlRIRVRJQ19BQ0NFU1NfRU1VTEFUSU9OID0gV0FSTklORyB8IFtJR05PUkVdDQotICoJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW5ldmVyIGl0IGVtdWxhdGVzIGFjY2VzcyANCi0gKgkJdG8gYSBub24tYWNjZXNzaWJsZSBtZW1iZXIgb2YgYW4gZW5jbG9zaW5nIHR5cGUNCi0gKg0KLSAqCUNPUkVfSkFWQV9CVUlMRF9PUkRFUiA9IFtDT01QVVRFXSB8IElHTk9SRQ0KLSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBidWlsZCBvcmRlciBpcyBhdXRvbWF0aWNhbGx5IHJlZmxlY3RpbmcgdGhlIGNsYXNzcGF0aCBvbiBlYWNoDQotICoJCWNsYXNzcGF0aCBjaGFuZ2UgYWN0aW9uLiBJdCBjYW4gc3RpbGwgYmUgbW9kaWZpZWQgbWFudWFsbHkgYWZ0ZXJ3YXJkcy4NCi0gKi8NCi0gDQotcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0RGVmYXVsdE9wdGlvbnMoKXsNCi0NCi0JSGFzaHRhYmxlIGRlZmF1bHRPcHRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7DQotDQotCS8vIENvbXBpbGVyIHNldHRpbmdzDQotCWRlZmF1bHRPcHRpb25zLnB1dChDT01QSUxFUl9MT0NBTF9WQVJJQUJMRV9BVFRSLCAJCQkJCUdFTkVSQVRFKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX0xJTkVfTlVNQkVSX0FUVFIsIAkJCQkJCUdFTkVSQVRFKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX1NPVVJDRV9GSUxFX0FUVFIsCQkJCQkJR0VORVJBVEUpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfQ09ERUdFTl9VTlVTRURfTE9DQUwsCQkJCQlQUkVTRVJWRSk7DQotCWRlZmF1bHRPcHRpb25zLnB1dChDT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwJCQkJVkVSU0lPTl8xXzEpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSwJCQkJCUVSUk9SKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX1BCX0lOVkFMSURfSU1QT1JULAkJCQkJCUVSUk9SKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX1BCX09WRVJSSURJTkdfUEFDS0FHRV9ERUZBVUxUX01FVEhPRCwgCVdBUk5JTkcpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfUEJfTUVUSE9EX1dJVEhfQ09OU1RSVUNUT1JfTkFNRSwJCVdBUk5JTkcpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfUEJfREVQUkVDQVRJT04sCQkJCQkJCVdBUk5JTkcpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLLAkJCQkJV0FSTklORyk7DQotCWRlZmF1bHRPcHRpb25zLnB1dChDT01QSUxFUl9QQl9VTlVTRURfTE9DQUwsCQkJCQkJSUdOT1JFKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX1BCX1VOVVNFRF9QQVJBTUVURVIsCQkJCQlJR05PUkUpOw0KLQlkZWZhdWx0T3B0aW9ucy5wdXQoQ09NUElMRVJfUEJfU1lOVEhFVElDX0FDQ0VTU19FTVVMQVRJT04sCQkJSUdOT1JFKTsNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPTVBJTEVSX1BCX05PTl9FWFRFUk5BTElaRURfU1RSSU5HX0xJVEVSQUwsCQlJR05PUkUpOw0KLQkNCi0JLy8gSmF2YUNvcmUgc2V0dGluZ3MNCi0JZGVmYXVsdE9wdGlvbnMucHV0KENPUkVfSkFWQV9CVUlMRF9PUkRFUiwJCQkJCQkJSUdOT1JFKTsNCi0NCi0JcmV0dXJuIGRlZmF1bHRPcHRpb25zOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIEphdmEgY29yZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuDQotICogRXF1aXZhbGVudCB0byA8Y29kZT4oSmF2YUNvcmUpIGdldFBsdWdpbigpPC9jb2RlPi4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIEphdmFDb3JlIGdldEphdmFDb3JlKCkgew0KLQlyZXR1cm4gKEphdmFDb3JlKSBnZXRQbHVnaW4oKTsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlDQotICogZ2l2ZW4gPGNvZGU+SVByb2plY3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUNCi0gKiBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBKYXZhIG5hdHVyZS4NCi0gKi8NCi1wcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7DQotCXRyeSB7DQotCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoTkFUVVJFX0lEKSkgew0KLQkJCUphdmFNb2RlbCBtb2RlbD0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWwocHJvamVjdC5nZXRXb3Jrc3BhY2UoKSk7DQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsNCi0JCQkJcmV0dXJuIG1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3QpOw0KLQkJCX0NCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCBrbm93biBjbGFzc3BhdGggdmFyaWFibGVzLg0KKwkgKiA8cD4NCisJICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIA0KKwkgKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KKwkgKiA8cD4NCisJICoNCisJICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc3BhdGggdmFyaWFibGUgbmFtZXMNCisJICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoVmFyaWFibGVOYW1lcygpIHsNCisJCWludCBsZW5ndGggPSBWYXJpYWJsZXMuc2l6ZSgpOw0KKwkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsZW5ndGhdOw0KKwkJRW51bWVyYXRpb24gdmFycyA9IFZhcmlhYmxlcy5rZXlzKCk7DQorCQlpbnQgaW5kZXggPSAwOw0KKwkJd2hpbGUgKHZhcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCisJCQlyZXN1bHRbaW5kZXgrK10gPSAoU3RyaW5nKSB2YXJzLm5leHRFbGVtZW50KCk7DQogCQl9DQotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJcmV0dXJuIHJlc3VsdDsNCiAJfQ0KLQlyZXR1cm4gbnVsbDsNCi19DQotLyoqDQotICogQW5zd2VycyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgSmF2YSBjb3JlLg0KLSAqIFRoZXNlIG9wdGlvbnMgYWxsb3cgdG8gY29uZmlndXJlIHRoZSBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBjb21wb25lbnRzLg0KLSAqDQotICogQ2hhbmdlcyBvbiB0aGUgc2V0IG9mIG9wdGlvbnMgYXJlIG5vdCBjb21taXR0ZWQgdW50aWwgaW52b2tpbmcgPGNvZGU+SmF2YUNvcmUuc2V0T3B0aW9uczwvY29kZT4NCi0gKg0KLSAqIEZvciBhIGxpc3Qgb2YgcmVjb2duaXplZCBvcHRpb25zLCByZWZlciB0byA8Y29kZT5KYXZhQ29yZS5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXRPcHRpb25zKCl7DQogDQotCWlmIChDb25maWd1cmFibGVPcHRpb25zID09IG51bGwpIHJldHVybiBDb25maWd1cmFibGVPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsNCi0JcmV0dXJuIChIYXNodGFibGUpQ29uZmlndXJhYmxlT3B0aW9ucy5jbG9uZSgpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIEphdmEgY29yZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuDQotICovDQotcHVibGljIHN0YXRpYyBQbHVnaW4gZ2V0UGx1Z2luKCkgew0KLQlyZXR1cm4gSkFWQV9DT1JFX1BMVUdJTjsNCi19DQotLyoqDQotICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGRlbm90ZWQgDQotICogYnkgYSBnaXZlbiBlbnRyeSAoaWYgaXQgaXMgYSB2YXJpYWJsZSBlbnRyeSkuIEl0IGlzIG9idGFpbmVkIGJ5IHJlc29sdmluZyB0aGUgdmFyaWFibGUgDQotICogcmVmZXJlbmNlIGluIHRoZSBmaXJzdCBzZWdtZW50LiBSZXR1cm5zIDxub2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZXNvbHZlIHVzaW5nIA0KLSAqIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOg0KLSAqIDx1bD4NCi0gKiA8bGk+IGlmIHZhcmlhYmxlIHNlZ21lbnQgY2Fubm90IGJlIHJlc29sdmVkLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4NCi0gKiA8bGk+IGZpbmRzIGEgcHJvamVjdCwgSkFSIG9yIGJpbmFyeSBmb2xkZXIgaW4gdGhlIHdvcmtzcGFjZSBhdCB0aGUgcmVzb2x2ZWQgcGF0aCBsb2NhdGlvbjwvbGk+DQotICogPGxpPiBpZiBub25lIGZpbmRzIGFuIGV4dGVybmFsIEpBUiBmaWxlIG9yIGZvbGRlciBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgYXQgdGhlIHJlc29sdmVkIHBhdGggbG9jYXRpb24gPC9saT4NCi0gKiA8bGk+IGlmIG5vbmUgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPjwvbGk+DQotICogPC91bD4NCi0gKiA8cD4NCi0gKiBWYXJpYWJsZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIGFuZCByb290IHBhdGggYXJlIGFsc28gcmVzb2x2ZWQgYW5kIHJlY29yZGVkIGluIHRoZSByZXN1bHRpbmcgY2xhc3NwYXRoIGVudHJ5Lg0KLSAqIDxwPg0KLSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGxpYnJhcnkgb3IgcHJvamVjdCBjbGFzc3BhdGggZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotICogICBpZiB0aGUgZ2l2ZW4gdmFyaWFibGUgZW50cnkgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGEgdmFsaWQgY2xhc3NwYXRoIGVudHJ5DQotICovDQotcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsNCisJcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0SW5zdGFsbExvY2F0aW9uKCkgew0KKwkJcmV0dXJuIG5ldyBQYXRoKGdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCkuZ2V0RmlsZSgpKTsNCisJfQ0KIA0KLQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSkgcmV0dXJuIGVudHJ5Ow0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbiBydW50aW1lIGNsYXNzLg0KKwkgKiBFcXVpdmFsZW50IHRvIDxjb2RlPihKYXZhQ29yZSkgZ2V0UGx1Z2luKCk8L2NvZGU+Lg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBKYXZhQ29yZSBnZXRKYXZhQ29yZSgpIHsNCisJCXJldHVybiAoSmF2YUNvcmUpIGdldFBsdWdpbigpOw0KKwl9DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUNCisJICogZ2l2ZW4gPGNvZGU+SVByb2plY3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUNCisJICogcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgSmF2YSBuYXR1cmUuDQorCSAqLw0KKwlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7DQorCQl0cnkgew0KKwkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShOQVRVUkVfSUQpKSB7DQorCQkJCUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsKHByb2plY3QuZ2V0V29ya3NwYWNlKCkpOw0KKwkJCQlpZiAobW9kZWwgIT0gbnVsbCkgew0KKwkJCQkJcmV0dXJuIG1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3QpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgSmF2YSBjb3JlIHBsdWctaW4gcnVudGltZSBjbGFzcy4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgUGx1Z2luIGdldFBsdWdpbigpIHsNCisJCXJldHVybiBKQVZBX0NPUkVfUExVR0lOOw0KKwl9DQogDQotCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOw0KLQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOw0KLQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpIHJldHVybiBudWxsOw0KKwkvKioNCisJICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGRlbm90ZWQgDQorCSAqIGJ5IGEgZ2l2ZW4gZW50cnkgKGlmIGl0IGlzIGEgdmFyaWFibGUgZW50cnkpLiBJdCBpcyBvYnRhaW5lZCBieSByZXNvbHZpbmcgdGhlIHZhcmlhYmxlIA0KKwkgKiByZWZlcmVuY2UgaW4gdGhlIGZpcnN0IHNlZ21lbnQuIFJldHVybnMgPG5vZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlc29sdmUgdXNpbmcgDQorCSAqIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOg0KKwkgKiA8dWw+DQorCSAqIDxsaT4gaWYgdmFyaWFibGUgc2VnbWVudCBjYW5ub3QgYmUgcmVzb2x2ZWQsIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT48L2xpPg0KKwkgKiA8bGk+IGZpbmRzIGEgcHJvamVjdCwgSkFSIG9yIGJpbmFyeSBmb2xkZXIgaW4gdGhlIHdvcmtzcGFjZSBhdCB0aGUgcmVzb2x2ZWQgcGF0aCBsb2NhdGlvbjwvbGk+DQorCSAqIDxsaT4gaWYgbm9uZSBmaW5kcyBhbiBleHRlcm5hbCBKQVIgZmlsZSBvciBmb2xkZXIgb3V0c2lkZSB0aGUgd29ya3NwYWNlIGF0IHRoZSByZXNvbHZlZCBwYXRoIGxvY2F0aW9uIDwvbGk+DQorCSAqIDxsaT4gaWYgbm9uZSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4NCisJICogPC91bD4NCisJICogPHA+DQorCSAqIFZhcmlhYmxlIHNvdXJjZSBhdHRhY2htZW50IHBhdGggYW5kIHJvb3QgcGF0aCBhcmUgYWxzbyByZXNvbHZlZCBhbmQgcmVjb3JkZWQgaW4gdGhlIHJlc3VsdGluZyBjbGFzc3BhdGggZW50cnkuDQorCSAqIDxwPg0KKwkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBsaWJyYXJ5IG9yIHByb2plY3QgY2xhc3NwYXRoIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPg0KKwkgKiAgIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBlbnRyeSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYSB2YWxpZCBjbGFzc3BhdGggZW50cnkNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IGdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7DQogDQotCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHJlc29sdmVkUGF0aCwgZmFsc2UpOw0KLQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiBudWxsOw0KKwkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpDQorCQkJcmV0dXJuIGVudHJ5Ow0KIA0KLQkvLyBpbnNpZGUgdGhlIHdvcmtzcGFjZQ0KLQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsJDQotCQlJUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsNCi0JCWlmIChyZXNvbHZlZFJlc291cmNlICE9IG51bGwpew0KLQkJCXN3aXRjaChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSl7DQotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOg0KLQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShyZXNvbHZlZFBhdGgpOyAvLyBpbnRlcm5hbCBwcm9qZWN0DQotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOg0KLQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJCQkJaWYgKCJqYXIiLypub25OTFMqLy5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgfHwgInppcCIvKm5vbk5MUyovLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSl7IC8vIGludGVybmFsIGJpbmFyeSBhcmNoaXZlDQotCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSggDQorCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsNCisJCUlQYXRoIHJlc29sdmVkUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFBhdGgoKSk7DQorCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpDQorCQkJcmV0dXJuIG51bGw7DQorDQorCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCByZXNvbHZlZFBhdGgsIGZhbHNlKTsNCisJCWlmICh0YXJnZXQgPT0gbnVsbCkNCisJCQlyZXR1cm4gbnVsbDsNCisNCisJCS8vIGluc2lkZSB0aGUgd29ya3NwYWNlDQorCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7DQorCQkJSVJlc291cmNlIHJlc29sdmVkUmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7DQorCQkJaWYgKHJlc29sdmVkUmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQlzd2l0Y2ggKHJlc29sdmVkUmVzb3VyY2UuZ2V0VHlwZSgpKSB7DQorCQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoNCisJCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHJlc29sdmVkUGF0aCk7IC8vIGludGVybmFsIHByb2plY3QNCisJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOg0KKwkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvbHZlZFJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsNCisJCQkJCQlpZiAoImphciIgIC8vJE5PTi1OTFMtMSQNCisJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSB8fCAiemlwIiAgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSB7IC8vIGludGVybmFsIGJpbmFyeSBhcmNoaXZlDQorCQkJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoDQogCQkJCQkJCQlyZXNvbHZlZFBhdGgsDQogCQkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSwNCi0JCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSk7IA0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CS8vIGludGVybmFsIGJpbmFyeSBmb2xkZXINCi0JCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoIA0KKwkJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpKTsNCisJCQkJCQl9DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOiAvLyBpbnRlcm5hbCBiaW5hcnkgZm9sZGVyDQorCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgNCiAJCQkJCQkJcmVzb2x2ZWRQYXRoLA0KIAkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSwNCi0JCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpKTsgDQorCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSk7DQorCQkJCX0NCiAJCQl9DQogCQl9DQotCX0NCi0JLy8gb3V0c2lkZSB0aGUgd29ya3NwYWNlDQotCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKXsNCi0JCUZpbGUgZXh0ZXJuYWxGaWxlID0gKEZpbGUpIHRhcmdldDsNCi0JCWlmIChleHRlcm5hbEZpbGUuaXNGaWxlKCkpew0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IGV4dGVybmFsRmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsNCi0JCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiLypub25OTFMqLykgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiLypub25OTFMqLykpeyAvLyBleHRlcm5hbCBiaW5hcnkgYXJjaGl2ZQ0KLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KCANCisJCS8vIG91dHNpZGUgdGhlIHdvcmtzcGFjZQ0KKwkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsNCisJCQlGaWxlIGV4dGVybmFsRmlsZSA9IChGaWxlKSB0YXJnZXQ7DQorCQkJaWYgKGV4dGVybmFsRmlsZS5pc0ZpbGUoKSkgew0KKwkJCQlTdHJpbmcgZmlsZU5hbWUgPSBleHRlcm5hbEZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7DQorCQkJCWlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIgIC8vJE5PTi1OTFMtMSQNCisJCQkJCSkgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiICAvLyROT04tTkxTLTEkDQorCQkJCQkpKSB7IC8vIGV4dGVybmFsIGJpbmFyeSBhcmNoaXZlDQorCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KA0KIAkJCQkJCXJlc29sdmVkUGF0aCwNCiAJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSwNCi0JCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSkpOyANCisJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSkpOw0KKwkJCQl9DQorCQkJfSBlbHNlIHsgLy8gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcg0KKwkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KA0KKwkJCQkJcmVzb2x2ZWRQYXRoLA0KKwkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksDQorCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSkpOw0KIAkJCX0NCi0JCX0gZWxzZSB7IC8vIGV4dGVybmFsIGJpbmFyeSBmb2xkZXINCi0JCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KCANCi0JCQkJCQlyZXNvbHZlZFBhdGgsDQotCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksDQotCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpKTsgDQogCQl9DQorCQlyZXR1cm4gbnVsbDsNCiAJfQ0KLQlyZXR1cm4gbnVsbDsNCi19DQotLyoqDQotICogUmVzb2x2ZSBhIHZhcmlhYmxlIHBhdGggKGhlbHBlciBtZXRob2QpDQotICovDQotcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChJUGF0aCB2YXJpYWJsZVBhdGgpIHsNCiANCi0JaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKSByZXR1cm4gbnVsbDsNCi0JaW50IGNvdW50ID0gdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpOw0KLQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7DQorCS8qKg0KKwkgKiBSZXNvbHZlIGEgdmFyaWFibGUgcGF0aCAoaGVscGVyIG1ldGhvZCkNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoSVBhdGggdmFyaWFibGVQYXRoKSB7DQogDQotCS8vIGxvb2t1cCB2YXJpYWJsZQkNCi0JU3RyaW5nIHZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlUGF0aC5zZWdtZW50KDApOw0KLQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOw0KLQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwgfHwgcmVzb2x2ZWRQYXRoLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7DQorCQlpZiAodmFyaWFibGVQYXRoID09IG51bGwpDQorCQkJcmV0dXJuIG51bGw7DQorCQlpbnQgY291bnQgPSB2YXJpYWJsZVBhdGguc2VnbWVudENvdW50KCk7DQorCQlpZiAoY291bnQgPT0gMCkNCisJCQlyZXR1cm4gbnVsbDsNCiANCi0JLy8gYXBwZW5kIHBhdGggc3VmZml4DQotCWlmIChjb3VudCA+IDEpew0KLQkJcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZWRQYXRoLmFwcGVuZCh2YXJpYWJsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7DQorCQkvLyBsb29rdXAgdmFyaWFibGUJDQorCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gdmFyaWFibGVQYXRoLnNlZ21lbnQoMCk7DQorCQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOw0KKwkJaWYgKHJlc29sdmVkUGF0aCA9PSBudWxsIHx8IHJlc29sdmVkUGF0aC5pc0VtcHR5KCkpDQorCQkJcmV0dXJuIG51bGw7DQorDQorCQkvLyBhcHBlbmQgcGF0aCBzdWZmaXgNCisJCWlmIChjb3VudCA+IDEpIHsNCisJCQlyZXNvbHZlZFBhdGggPSByZXNvbHZlZFBhdGguYXBwZW5kKHZhcmlhYmxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsNCisJCX0NCisJCXJldHVybiByZXNvbHZlZFBhdGg7DQogCX0NCi0JcmV0dXJuIHJlc29sdmVkUGF0aDsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrZXIgcmVmZXJlbmNlcyB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50Lg0KLSAqIFVzZWQgZm9yIG1hcmtlcnMgd2hpY2ggZGVub3RlIGEgSmF2YSBlbGVtZW50IHJhdGhlciB0aGFuIGEgcmVzb3VyY2UuDQotICoNCi0gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudA0KLSAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlcg0KLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hcmtlciByZWZlcmVuY2VzIHRoZSBlbGVtZW50DQotICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5JTWFya2VyLmdldEF0dHJpYnV0ZTwvY29kZT4gb24gdGhlIG1hcmtlciBmYWlscyAJIA0KLSAqLw0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQnkoSUphdmFFbGVtZW50IGVsZW1lbnQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotIAlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpDQotIAkJZWxlbWVudD0gKChJTWVtYmVyKWVsZW1lbnQpLmdldENsYXNzRmlsZSgpOw0KLSAJcmV0dXJuIChlbGVtZW50ICE9IG51bGwgDQotCSAJCSYmIG1hcmtlciAhPSBudWxsDQotCSAJCSYmIGVsZW1lbnQuZ2V0SGFuZGxlSWRlbnRpZmllcigpLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVF9IQU5ETEVfSUQpKSk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIGRlbHRhIHJlZmVyZW5jZXMgdGhlIGdpdmVuIEphdmEgZWxlbWVudC4NCi0gKiBVc2VkIGZvciBtYXJrZXJzIGRlbHRhcyB3aGljaCBkZW5vdGUgYSBKYXZhIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSByZXNvdXJjZS4NCi0gKg0KLSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50DQotICogQHBhcmFtIG1hcmtlckRlbHRhIHRoZSBtYXJrZXIgZGVsdGENCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXJrZXIgZGVsdGEgcmVmZXJlbmNlcyB0aGUgZWxlbWVudA0KLSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgIDxjb2RlPklNYXJrZXJEZWx0YS5nZXRBdHRyaWJ1dGU8L2NvZGU+IG9uIHRoZSBtYXJrZXIgZGVsdGEgZmFpbHMgCSANCi0gKi8NCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQnkoSUphdmFFbGVtZW50IGVsZW1lbnQsIElNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpCWVsZW1lbnQ9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0Q2xhc3NGaWxlKCk7DQotCXJldHVybiBlbGVtZW50ICE9IG51bGwgDQotCQkJJiYgbWFya2VyRGVsdGEgIT0gbnVsbCANCisNCisJLyoqDQorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWFya2VyIHJlZmVyZW5jZXMgdGhlIGdpdmVuIEphdmEgZWxlbWVudC4NCisJICogVXNlZCBmb3IgbWFya2VycyB3aGljaCBkZW5vdGUgYSBKYXZhIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSByZXNvdXJjZS4NCisJICoNCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQNCisJICogQHBhcmFtIG1hcmtlciB0aGUgbWFya2VyDQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hcmtlciByZWZlcmVuY2VzIHRoZSBlbGVtZW50DQorCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SU1hcmtlci5nZXRBdHRyaWJ1dGU8L2NvZGU+IG9uIHRoZSBtYXJrZXIgZmFpbHMgCSANCisJICovDQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRCeShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSU1hcmtlciBtYXJrZXIpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpDQorCQkJZWxlbWVudCA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0Q2xhc3NGaWxlKCk7DQorCQlyZXR1cm4gKA0KKwkJCWVsZW1lbnQgIT0gbnVsbA0KKwkJCQkmJiBtYXJrZXIgIT0gbnVsbA0KKwkJCQkmJiBlbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShBVFRfSEFORExFX0lEKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1hcmtlciBkZWx0YSByZWZlcmVuY2VzIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQuDQorCSAqIFVzZWQgZm9yIG1hcmtlcnMgZGVsdGFzIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLg0KKwkgKg0KKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudA0KKwkgKiBAcGFyYW0gbWFya2VyRGVsdGEgdGhlIG1hcmtlciBkZWx0YQ0KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXJrZXIgZGVsdGEgcmVmZXJlbmNlcyB0aGUgZWxlbWVudA0KKwkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlICA8Y29kZT5JTWFya2VyRGVsdGEuZ2V0QXR0cmlidXRlPC9jb2RlPiBvbiB0aGUgbWFya2VyIGRlbHRhIGZhaWxzIAkgDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQnkoDQorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwNCisJCUlNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSkNCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikNCisJCQllbGVtZW50ID0gKChJTWVtYmVyKSBlbGVtZW50KS5nZXRDbGFzc0ZpbGUoKTsNCisJCXJldHVybiBlbGVtZW50ICE9IG51bGwNCisJCQkmJiBtYXJrZXJEZWx0YSAhPSBudWxsDQogCQkJJiYgZWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCkuZXF1YWxzKG1hcmtlckRlbHRhLmdldEF0dHJpYnV0ZShBVFRfSEFORExFX0lEKSk7DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX0xJQlJBUlk8L2NvZGU+IGZvciB0aGUgSkFSIG9yIGZvbGRlcg0KLSAqIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguIFRoaXMgc3BlY2lmaWVzIHRoYXQgYWxsIHBhY2thZ2UgZnJhZ21lbnRzIHdpdGhpbiB0aGUgcm9vdCANCi0gKiB3aWxsIGhhdmUgY2hpbGRyZW4gb2YgdHlwZSA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPi4NCi0gKiA8cD4NCi0gKiBBIGxpYnJhcnkgZW50cnkgaXMgdXNlZCB0byBkZW5vdGUgYSBwcmVyZXF1aXNpdGUgSkFSIG9yIHJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgYmluYXJpZXMuDQotICogVGhlIHRhcmdldCBKQVIgb3IgZm9sZGVyIGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBpbnRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggcmVsYXRpdmUNCi0gKiB0byB0aGUgd29ya3NwYWNlIHJvb3QpIG9yIGV4dGVybmFsbHkgdG8gdGhlIHdvcmtzcGFjZSAoYWJzb2x1dGUgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0pLg0KLSAqDQotICogZS5nLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGJpbmFyeSBwYXRoIHVzYWdlPHVsPg0KLSAqCTxsaT48Y29kZT4gImM6L2pkazEuMi4yL2pyZS9saWIvcnQuamFyIiA8L2NvZGU+IC0gcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIEpBUjwvbGk+DQotICoJPGxpPjxjb2RlPiAiL1Byb2plY3Qvc29tZUxpYi5qYXIiIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwgSkFSIDwvbGk+DQotICoJPGxpPjxjb2RlPiAiYzovY2xhc3Nlcy8iIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcjwvbGk+DQotICogPC91bD4NCi0gKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0byB2YWxpZGF0ZSBvciBhY2Nlc3MgdGhlIA0KLSAqIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuDQotICogPHA+DQotICogQHBhcmFtIHBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGJpbmFyeSBhcmNoaXZlDQotICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCANCi0gKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lDQotICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZQ0KLSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPmFyY2hpdmVQYXRoPC9jb2RlPiBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+DQotICovIA0KKwl9DQogDQotcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpIHsNCi0JQXNzZXJ0LmlzVHJ1ZShwYXRoLmlzQWJzb2x1dGUoKSwgVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIvKm5vbk5MUyovKSk7DQotCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoDQotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlksIA0KLQkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSwgDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPiBmb3IgdGhlIEpBUiBvciBmb2xkZXINCisJICogaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IA0KKwkgKiB3aWxsIGhhdmUgY2hpbGRyZW4gb2YgdHlwZSA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPi4NCisJICogPHA+DQorCSAqIEEgbGlicmFyeSBlbnRyeSBpcyB1c2VkIHRvIGRlbm90ZSBhIHByZXJlcXVpc2l0ZSBKQVIgb3Igcm9vdCBmb2xkZXIgY29udGFpbmluZyBiaW5hcmllcy4NCisJICogVGhlIHRhcmdldCBKQVIgb3IgZm9sZGVyIGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBpbnRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggcmVsYXRpdmUNCisJICogdG8gdGhlIHdvcmtzcGFjZSByb290KSBvciBleHRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtKS4NCisJICoNCisJICogZS5nLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGJpbmFyeSBwYXRoIHVzYWdlPHVsPg0KKwkgKgk8bGk+PGNvZGU+ICJjOi9qZGsxLjIuMi9qcmUvbGliL3J0LmphciIgPC9jb2RlPiAtIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBKQVI8L2xpPg0KKwkgKgk8bGk+PGNvZGU+ICIvUHJvamVjdC9zb21lTGliLmphciIgPC9jb2RlPiAtIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBKQVIgPC9saT4NCisJICoJPGxpPjxjb2RlPiAiYzovY2xhc3Nlcy8iIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcjwvbGk+DQorCSAqIDwvdWw+DQorCSAqIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIHZhbGlkYXRlIG9yIGFjY2VzcyB0aGUgDQorCSAqIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuDQorCSAqIDxwPg0KKwkgKiBAcGFyYW0gcGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgYmluYXJ5IGFyY2hpdmUNCisJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCANCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQ0KKwkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlDQorCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPmFyY2hpdmVQYXRoPC9jb2RlPiBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+DQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoDQorCQlJUGF0aCBwYXRoLA0KKwkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsDQorCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpIHsNCisJCUFzc2VydC5pc1RydWUoDQorCQkJcGF0aC5pc0Fic29sdXRlKCksDQorCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQNCisJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoDQorCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlksDQorCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZLA0KIAkJCUphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpLA0KIAkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoLA0KIAkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCk7DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX1BST0pFQ1Q8L2NvZGU+DQotICogZm9yIHRoZSBwcm9qZWN0IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguDQotICogPHA+DQotICogQSBwcm9qZWN0IGVudHJ5IGlzIHVzZWQgdG8gZGVub3RlIGEgcHJlcmVxdWlzaXRlIHByb2plY3Qgb24gYSBjbGFzc3BhdGguDQotICogVGhlIHJlZmVyZW5jZWQgcHJvamVjdCB3aWxsIGJlIGNvbnRyaWJ1dGVkIGFzIGEgd2hvbGUsIGVpdGhlciBhcyBzb3VyY2VzIChpbiB0aGUgSmF2YSBNb2RlbCwgaXQNCi0gKiBjb250cmlidXRlcyBhbGwgaXRzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMpIG9yIGFzIGJpbmFyaWVzICh3aGVuIGJ1aWxkaW5nLCBpdCBjb250cmlidXRlcyBpdHMgDQotICogd2hvbGUgb3V0cHV0IGxvY2F0aW9uKS4NCi0gKiA8cD4NCi0gKiBBIHByb2plY3QgcmVmZXJlbmNlIGFsbG93cyB0byBpbmRpcmVjdCB0aHJvdWdoIGFub3RoZXIgcHJvamVjdCwgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBpbnRlcm5hbCBsYXlvdXQuIA0KLSAqIDxwPg0KLSAqIFRoZSBwcmVyZXF1aXNpdGUgcHJvamVjdCBpcyByZWZlcnJlZCB0byB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdC4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdQcm9qZWN0RW50cnkoSVBhdGggcGF0aCl7DQotCUFzc2VydC5pc1RydWUocGF0aC5pc0Fic29sdXRlKCksIFV0aWwuYmluZCgiY2xhc3NwYXRoLm5lZWRBYnNvbHV0ZVBhdGgiLypub25OTFMqLykpOw0KLQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLCBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QsIHBhdGgsIG51bGwsIG51bGwpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGEgbmV3IGVtcHR5IHJlZ2lvbi4NCi0gKi8NCi1wdWJsaWMgc3RhdGljIElSZWdpb24gbmV3UmVnaW9uKCkgew0KLQlyZXR1cm4gbmV3IFJlZ2lvbigpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGZvciB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgDQotICogaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgDQotICogaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+Lg0KLSAqIDxwPg0KLSAqIFRoZSBzb3VyY2UgZm9sZGVyIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290LCBlLmcuIDxjb2RlPiIvUHJvamVjdC9zcmMiPC9jb2RlPi4NCi0gKiA8cD4NCi0gKiBBIHNvdXJjZSBlbnRyeSBpcyB1c2VkIHRvIHNldHVwIHRoZSBpbnRlcm5hbCBzb3VyY2UgbGF5b3V0IG9mIGEgcHJvamVjdCwgYW5kIGNhbm5vdCBiZSB1c2VkIG91dCBvZiB0aGUNCi0gKiBjb250ZXh0IG9mIHRoZSBjb250YWluaW5nIHByb2plY3QgKGEgc291cmNlIGVudHJ5ICJQcm9qMS9zcmMiIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGFzc3BhdGggb2YgUHJvajIpLg0KLSAqLyANCi1wdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdTb3VyY2VFbnRyeShJUGF0aCBwYXRoKXsNCi0JQXNzZXJ0LmlzVHJ1ZShwYXRoLmlzQWJzb2x1dGUoKSwgVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIvKm5vbk5MUyovKSk7DQotCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFLCBwYXRoLCBudWxsLCBudWxsKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfVkFSSUFCTEU8L2NvZGU+DQotICogZm9yIHRoZSBnaXZlbiBwYXRoLiBUaGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgdGhlIHBhdGggaXMgdGhlIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUuDQotICogVGhlIHRyYWlsaW5nIHNlZ21lbnRzIG9mIHRoZSBwYXRoIHdpbGwgYmUgYXBwZW5kZWQgdG8gcmVzb2x2ZWQgdmFyaWFibGUgcGF0aC4NCi0gKiA8cD4NCi0gKiBBIHZhcmlhYmxlIGVudHJ5IGFsbG93cyB0byBleHByZXNzIGluZGlyZWN0IHJlZmVyZW5jZXMgb24gYSBjbGFzc3BhdGggdG8gb3RoZXIgcHJvamVjdHMgb3IgbGlicmFyaWVzLA0KLSAqIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBjbGFzc3BhdGggdmFyaWFibGUgaXMgcmVmZXJyaW5nLg0KLSAqIDxwPg0KLSAqIGUuZy4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB2YXJpYWJsZSBwYXRoIHVzYWdlPHVsPg0KLSAqIDxsaT48IkpEVENPUkUiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPkpEVENPUkU8L2NvZGU+IGlzIA0KLSAqCQlib3VuZCB0byAiYzovamFycy9qZHRjb3JlLmphciIuIFRoZSByZXNvdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgbGlicmFyeSAiYzpcamFyc1xqZHRjb3JlLmphciI8L2xpPg0KLSAqIDxsaT4gIkpEVENPUkUiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPkpEVENPUkU8L2NvZGU+IGlzIA0KLSAqCQlib3VuZCB0byAiL1Byb2plY3RfSkRUQ09SRSIuIFRoZSByZXNvdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgcHJvamVjdCAiL1Byb2plY3RfSkRUQ09SRSI8L2xpPg0KLSAqIDxsaT4gIlBMVUdJTlMvY29tLmV4YW1wbGUvZXhhbXBsZS5qYXIiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPlBMVUdJTlM8L2NvZGU+DQotICogICAgICBpcyBib3VuZCB0byAiYzovZWNsaXBzZS9wbHVnaW5zIi4gVGhlIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgbGlicmFyeSAiYzovZWNsaXBzZS9wbHVnaW5zL2NvbS5leGFtcGxlL2V4YW1wbGUuamFyIjwvbGk+DQotICogPC91bD4NCi0gKiA8cD4NCi0gKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0byB2YWxpZGF0ZSBjbGFzc3BhdGggdmFyaWFibGVzDQotICogb3IgYWNjZXNzIHRoZSByZXNvdXJjZXMgYXQgdGhlIGdpdmVuIHBhdGhzLg0KLSAqIDxwPg0KLSAqIEBwYXJhbSB2YXJpYWJsZVBhdGggdGhlIHBhdGggb2YgdGhlIGJpbmFyeSBhcmNoaXZlOyBmaXJzdCBzZWdtZW50IGlzIHRoZQ0KLSAqICAgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZQ0KLSAqIEBwYXJhbSB2YXJpYWJsZVNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCANCi0gKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOyBpZiBwcmVzZW50LCB0aGUgZmlyc3Qgc2VnbWVudCBpcyB0aGUNCi0gKiAgICBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlIChub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgdmFyaWFibGUNCi0gKiAgICBhcyB0aGUgb25lIHRoYXQgYmVnaW5zIDxjb2RlPnZhcmlhYmxlUGF0aDwvY29kZT4pDQotICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZQ0KLSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPmFyY2hpdmVQYXRoPC9jb2RlPiBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+DQotICovDQotcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3VmFyaWFibGVFbnRyeShJUGF0aCB2YXJpYWJsZVBhdGgsIElQYXRoIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCl7DQotCUFzc2VydC5pc1RydWUodmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxWYXJpYWJsZVBhdGgiLypub25OTFMqLykpOw0KLQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KA0KLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsIA0KLQkJCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSwgDQotCQkJCQl2YXJpYWJsZVBhdGgsDQotCQkJCQl2YXJpYWJsZVNvdXJjZUF0dGFjaG1lbnRQYXRoLA0KLQkJCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoKTsNCi19DQotLyoqDQotICogUmVtb3ZlZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLiBEb2VzIG5vdGhpbmcgaWYgbm8gdmFsdWUgd2FzDQotICogc2V0IGZvciB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZS4NCi0gKiA8cD4NCi0gKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLg0KLSAqIDxwPg0KLSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCANCi0gKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KLSAqIDxwPg0KLSAqDQotICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlDQotICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUNCi0gKg0KLSAqIEBkZXByZWNhdGVkIC0gdXNlIHZlcnNpb24gd2l0aCBleHRyYSBJUHJvZ3Jlc3NNb25pdG9yDQotICovDQotcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNsYXNzcGF0aFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHsNCi0NCi0JcmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lLCBudWxsKTsNCi19DQotLyoqDQotICogUmVtb3ZlZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLiBEb2VzIG5vdGhpbmcgaWYgbm8gdmFsdWUgd2FzDQotICogc2V0IGZvciB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZS4NCi0gKiA8cD4NCi0gKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLg0KLSAqIDxwPg0KLSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCANCi0gKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KLSAqIDxwPg0KLSAqDQotICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlDQotICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzDQotICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUNCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotDQotCXRyeSB7DQotCQl1cGRhdGVWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgbnVsbCwgbW9uaXRvcik7DQotCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpew0KIAl9DQotfQ0KLS8qKg0KLSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgY2hhbmdlZCBsaXN0ZW5lci4NCi0gKiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4NCi0gKg0KLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXINCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsNCi19DQotLyoqDQotICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4NCi0gKiBUaGUgcGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQuDQotICogPHA+DQotICogVGhpcyBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkIHdoaWxlIHRoZSByZXNvdXJjZSB0cmVlIGlzIGxvY2tlZC4NCi0gKiA8cD4NCi0gKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgDQotICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4NCi0gKiA8cD4NCi0gKg0KLSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQ0KLSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoDQotICogQHNlZSAjZ2V0Q2xhc3NwYXRoVmFyaWFibGUNCi0gKg0KLSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSB3aXRoIElQcm9ncmVzc01vbml0b3INCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogDQotCXNldENsYXNzcGF0aFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgcGF0aCwgbnVsbCk7DQotfQ0KLS8qKg0KLSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuDQotICogVGhlIHBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Lg0KLSAqIDxwPg0KLSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW5ub3QgYmUgdXNlZCB3aGlsZSB0aGUgcmVzb3VyY2UgdHJlZSBpcyBsb2NrZWQuDQotICogPHA+DQotICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIA0KLSAqIGFyZSBwcmVzZXJ2ZWQgZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24uDQotICogPHA+DQotICoNCi0gKiBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggdmFyaWFibGUNCi0gKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KLSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MNCi0gKiBAc2VlICNnZXRDbGFzc3BhdGhWYXJpYWJsZQ0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc3BhdGhWYXJpYWJsZShTdHJpbmcgdmFyaWFibGVOYW1lLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkvKioNCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4NCisJICogZm9yIHRoZSBwcm9qZWN0IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguDQorCSAqIDxwPg0KKwkgKiBBIHByb2plY3QgZW50cnkgaXMgdXNlZCB0byBkZW5vdGUgYSBwcmVyZXF1aXNpdGUgcHJvamVjdCBvbiBhIGNsYXNzcGF0aC4NCisJICogVGhlIHJlZmVyZW5jZWQgcHJvamVjdCB3aWxsIGJlIGNvbnRyaWJ1dGVkIGFzIGEgd2hvbGUsIGVpdGhlciBhcyBzb3VyY2VzIChpbiB0aGUgSmF2YSBNb2RlbCwgaXQNCisJICogY29udHJpYnV0ZXMgYWxsIGl0cyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzKSBvciBhcyBiaW5hcmllcyAod2hlbiBidWlsZGluZywgaXQgY29udHJpYnV0ZXMgaXRzIA0KKwkgKiB3aG9sZSBvdXRwdXQgbG9jYXRpb24pLg0KKwkgKiA8cD4NCisJICogQSBwcm9qZWN0IHJlZmVyZW5jZSBhbGxvd3MgdG8gaW5kaXJlY3QgdGhyb3VnaCBhbm90aGVyIHByb2plY3QsIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgaW50ZXJuYWwgbGF5b3V0LiANCisJICogPHA+DQorCSAqIFRoZSBwcmVyZXF1aXNpdGUgcHJvamVjdCBpcyByZWZlcnJlZCB0byB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdC4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoKSB7DQorCQlBc3NlcnQuaXNUcnVlKA0KKwkJCXBhdGguaXNBYnNvbHV0ZSgpLA0KKwkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLm5lZWRBYnNvbHV0ZVBhdGgiICkpOyAvLyROT04tTkxTLTEkDQorCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KA0KKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLA0KKwkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwNCisJCQlwYXRoLA0KKwkJCW51bGwsDQorCQkJbnVsbCk7DQorCX0NCiANCi0JQXNzZXJ0LmlzVHJ1ZShwYXRoICE9IG51bGwsIFV0aWwuYmluZCgiY2xhc3NwYXRoLm51bGxWYXJpYWJsZVBhdGgiLypub25OTFMqLykpOw0KLQl1cGRhdGVWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgcGF0aCwgbW9uaXRvcik7DQotfQ0KLS8qIChub24tSmF2YWRvYykNCi0gKiBNZXRob2QgZGVjbGFyZWQgb24gSUV4ZWN1dGFibGVFeHRlbnNpb24uDQotICogUmVjb3JkIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gZGF0YSBmcm9tIHRoZSBwbHVnaW4uDQotICovDQotcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24ge30NCi0vKioNCi0gKiBTZXQgY3VycmVudCBzZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBKYXZhIGNvcmUuDQotICogVGhlc2Ugb3B0aW9ucyBhbGxvdyB0byBjb25maWd1cmUgdGhlIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudHMuDQotICogDQotICogRm9yIGEgbGlzdCBvZiByZWNvZ25pemVkIG9wdGlvbnMsIHJlZmVyIHRvIDxjb2RlPkphdmFDb3JlLmdldERlZmF1bHRPcHRpb25zPC9jb2RlPg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPcHRpb25zKEhhc2h0YWJsZSBjb25maWd1cmFibGVPcHRpb25zKXsNCi0JQ29uZmlndXJhYmxlT3B0aW9ucyA9IChIYXNodGFibGUpIGNvbmZpZ3VyYWJsZU9wdGlvbnMuY2xvbmUoKTsNCi19DQotLyoqDQotICogU2h1dGRvd24gdGhlIEphdmFDb3JlIHBsdWdpbg0KLSAqIDxwPg0KLSAqIERlLXJlZ2lzdGVycyB0aGUgSmF2YU1vZGVsTWFuYWdlciBhcyBhIHJlc291cmNlIGNoYW5nZWQgbGlzdGVuZXIgYW5kIHNhdmUgcGFydGljaXBhbnQuDQotICogPHA+DQotICogQHNlZSBQbHVnaW4jc2h1dGRvd24NCi0gKi8NCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgZW1wdHkgcmVnaW9uLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJUmVnaW9uIG5ld1JlZ2lvbigpIHsNCisJCXJldHVybiBuZXcgUmVnaW9uKCk7DQorCX0NCiANCi0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7DQotCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKTsNCi0Jd29ya3NwYWNlLnJlbW92ZVNhdmVQYXJ0aWNpcGFudCh0aGlzKTsNCisJLyoqDQorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4gZm9yIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlciANCisJICogaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgDQorCSAqIGhhdmUgY2hpbGRyZW4gb2YgdHlwZSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPi4NCisJICogPHA+DQorCSAqIFRoZSBzb3VyY2UgZm9sZGVyIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290LCBlLmcuIDxjb2RlPiIvUHJvamVjdC9zcmMiPC9jb2RlPi4NCisJICogPHA+DQorCSAqIEEgc291cmNlIGVudHJ5IGlzIHVzZWQgdG8gc2V0dXAgdGhlIGludGVybmFsIHNvdXJjZSBsYXlvdXQgb2YgYSBwcm9qZWN0LCBhbmQgY2Fubm90IGJlIHVzZWQgb3V0IG9mIHRoZQ0KKwkgKiBjb250ZXh0IG9mIHRoZSBjb250YWluaW5nIHByb2plY3QgKGEgc291cmNlIGVudHJ5ICJQcm9qMS9zcmMiIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGFzc3BhdGggb2YgUHJvajIpLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3U291cmNlRW50cnkoSVBhdGggcGF0aCkgew0KKwkJQXNzZXJ0LmlzVHJ1ZSgNCisJCQlwYXRoLmlzQWJzb2x1dGUoKSwNCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5uZWVkQWJzb2x1dGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJA0KKwkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeSgNCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwNCisJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSwNCisJCQlwYXRoLA0KKwkJCW51bGwsDQorCQkJbnVsbCk7DQorCX0NCiANCi0JKChKYXZhTW9kZWxNYW5hZ2VyKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSkuc2h1dGRvd24oKTsNCi19DQotLyoqDQotICogSW5pdGlhdGUgdGhlIGJhY2tncm91bmQgaW5kZXhpbmcgcHJvY2Vzcy4NCi0gKiBUaGlzIHNob3VsZCBiZSBkZWZlcnJlZCBhZnRlciB0aGUgcGx1Z2luIGFjdGl2YXRpb24uDQotICovDQotcHJpdmF0ZSB2b2lkIHN0YXJ0SW5kZXhpbmcoKSB7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4NCisJICogZm9yIHRoZSBnaXZlbiBwYXRoLiBUaGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgdGhlIHBhdGggaXMgdGhlIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUuDQorCSAqIFRoZSB0cmFpbGluZyBzZWdtZW50cyBvZiB0aGUgcGF0aCB3aWxsIGJlIGFwcGVuZGVkIHRvIHJlc29sdmVkIHZhcmlhYmxlIHBhdGguDQorCSAqIDxwPg0KKwkgKiBBIHZhcmlhYmxlIGVudHJ5IGFsbG93cyB0byBleHByZXNzIGluZGlyZWN0IHJlZmVyZW5jZXMgb24gYSBjbGFzc3BhdGggdG8gb3RoZXIgcHJvamVjdHMgb3IgbGlicmFyaWVzLA0KKwkgKiBkZXBlbmRpbmcgb24gd2hhdCB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGlzIHJlZmVycmluZy4NCisJICogPHA+DQorCSAqIGUuZy4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB2YXJpYWJsZSBwYXRoIHVzYWdlPHVsPg0KKwkgKiA8bGk+PCJKRFRDT1JFIiB3aGVyZSB2YXJpYWJsZSA8Y29kZT5KRFRDT1JFPC9jb2RlPiBpcyANCisJICoJCWJvdW5kIHRvICJjOi9qYXJzL2pkdGNvcmUuamFyIi4gVGhlIHJlc292ZWQgY2xhc3NwYXRoIGVudHJ5IGlzIGRlbm90aW5nIHRoZSBsaWJyYXJ5ICJjOlxqYXJzXGpkdGNvcmUuamFyIjwvbGk+DQorCSAqIDxsaT4gIkpEVENPUkUiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPkpEVENPUkU8L2NvZGU+IGlzIA0KKwkgKgkJYm91bmQgdG8gIi9Qcm9qZWN0X0pEVENPUkUiLiBUaGUgcmVzb3ZlZCBjbGFzc3BhdGggZW50cnkgaXMgZGVub3RpbmcgdGhlIHByb2plY3QgIi9Qcm9qZWN0X0pEVENPUkUiPC9saT4NCisJICogPGxpPiAiUExVR0lOUy9jb20uZXhhbXBsZS9leGFtcGxlLmphciIgd2hlcmUgdmFyaWFibGUgPGNvZGU+UExVR0lOUzwvY29kZT4NCisJICogICAgICBpcyBib3VuZCB0byAiYzovZWNsaXBzZS9wbHVnaW5zIi4gVGhlIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgbGlicmFyeSAiYzovZWNsaXBzZS9wbHVnaW5zL2NvbS5leGFtcGxlL2V4YW1wbGUuamFyIjwvbGk+DQorCSAqIDwvdWw+DQorCSAqIDxwPg0KKwkgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0byB2YWxpZGF0ZSBjbGFzc3BhdGggdmFyaWFibGVzDQorCSAqIG9yIGFjY2VzcyB0aGUgcmVzb3VyY2VzIGF0IHRoZSBnaXZlbiBwYXRocy4NCisJICogPHA+DQorCSAqIEBwYXJhbSB2YXJpYWJsZVBhdGggdGhlIHBhdGggb2YgdGhlIGJpbmFyeSBhcmNoaXZlOyBmaXJzdCBzZWdtZW50IGlzIHRoZQ0KKwkgKiAgIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUNCisJICogQHBhcmFtIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGggdGhlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIA0KKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOyBpZiBwcmVzZW50LCB0aGUgZmlyc3Qgc2VnbWVudCBpcyB0aGUNCisJICogICAgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZSAobm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIHZhcmlhYmxlDQorCSAqICAgIGFzIHRoZSBvbmUgdGhhdCBiZWdpbnMgPGNvZGU+dmFyaWFibGVQYXRoPC9jb2RlPikNCisJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZQ0KKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5hcmNoaXZlUGF0aDwvY29kZT4gaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3VmFyaWFibGVFbnRyeSgNCisJCUlQYXRoIHZhcmlhYmxlUGF0aCwNCisJCUlQYXRoIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsDQorCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpIHsNCisJCUFzc2VydC5pc1RydWUoDQorCQkJdmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsDQorCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFZhcmlhYmxlUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQNCisJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoDQorCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsDQorCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSwNCisJCQl2YXJpYWJsZVBhdGgsDQorCQkJdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCwNCisJCQlzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOw0KKwl9DQogDQotCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IChKYXZhTW9kZWxNYW5hZ2VyKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsNCi0JSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7IA0KLQlpZiAoaW5kZXhNYW5hZ2VyICE9IG51bGwpIGluZGV4TWFuYWdlci5yZXNldCgpOw0KLQkvKgkNCi0JCS8vIGlmIHRoZXJlIGlzIGEgZGVza3RvcCBkZWZlciB0aGUgc3RhcnQgb2YgdGhlIGluZGV4aW5nIGJ5IHBvc3RpbmcgYSBydW5uYWJsZQ0KLQkJaWYgKGdldERlc2t0b3BQbHVnaW4oKSAhPSBudWxsKSB7DQotCQkJSURlc2t0b3AgZGVza3RvcD0gZ2V0RGVza3RvcCgpOw0KLQkJCUFwcGxpY2F0aW9uV2luZG93IHdpbmRvdz0gKEFwcGxpY2F0aW9uV2luZG93KSBkZXNrdG9wLmdldEFjdGl2ZURlc2t0b3BXaW5kb3coKTsNCi0JCQlEaXNwbGF5IGRpc3BsYXk9IG51bGw7DQotCQkJaWYgKHdpbmRvdyAhPSBudWxsKQ0KLQkJCQlkaXNwbGF5PSB3aW5kb3cuZ2V0RGlzcGxheSgpOw0KLQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsNCi0JCQkJZGlzcGxheS5hc3luY0V4ZWMoc3RhcnQpOw0KLQkJCQlyZXR1cm47DQotCQkJfQ0KKwkvKioNCisJICogUmVtb3ZlZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLiBEb2VzIG5vdGhpbmcgaWYgbm8gdmFsdWUgd2FzDQorCSAqIHNldCBmb3IgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUuDQorCSAqIDxwPg0KKwkgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLg0KKwkgKiA8cD4NCisJICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIA0KKwkgKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KKwkgKiA8cD4NCisJICoNCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlDQorCSAqIEBzZWUgI3NldENsYXNzcGF0aFZhcmlhYmxlDQorCSAqDQorCSAqIEBkZXByZWNhdGVkIC0gdXNlIHZlcnNpb24gd2l0aCBleHRyYSBJUHJvZ3Jlc3NNb25pdG9yDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSkgew0KKwkJcmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lLCBudWxsKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmVtb3ZlZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLiBEb2VzIG5vdGhpbmcgaWYgbm8gdmFsdWUgd2FzDQorCSAqIHNldCBmb3IgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUuDQorCSAqIDxwPg0KKwkgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLg0KKwkgKiA8cD4NCisJICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIA0KKwkgKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLg0KKwkgKiA8cD4NCisJICoNCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlDQorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcw0KKwkgKiBAc2VlICNzZXRDbGFzc3BhdGhWYXJpYWJsZQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNsYXNzcGF0aFZhcmlhYmxlKA0KKwkJU3RyaW5nIHZhcmlhYmxlTmFtZSwNCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKw0KKwkJdHJ5IHsNCisJCQl1cGRhdGVWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgbnVsbCwgbW9uaXRvcik7DQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJfQ0KLQkqLwkJDQotfQ0KLS8qKg0KLSAqIFN0YXJ0dXAgb2YgdGhlIEphdmFDb3JlIHBsdWdpbg0KLSAqIDxwPg0KLSAqIFJlZ2lzdGVycyB0aGUgSmF2YU1vZGVsTWFuYWdlciBhcyBhIHJlc291cmNlIGNoYW5nZWQgbGlzdGVuZXIgYW5kIHNhdmUgcGFydGljaXBhbnQuDQotICogU3RhcnRzIHRoZSBiYWNrZ3JvdW5kIGluZGV4aW5nLCBhbmQgcmVzdG9yZSBzYXZlZCBjbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzLg0KLSAqIDxwPg0KLSAqIEBzZWUgUGx1Z2luI3N0YXJ0dXANCi0gKi8NCi1wdWJsaWMgdm9pZCBzdGFydHVwKCkgew0KLQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7DQotCXRyeSB7DQorCX0NCisNCisJLyoqDQorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgY2hhbmdlZCBsaXN0ZW5lci4NCisJICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuDQorCSAqDQorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXINCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQorCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4NCisJICogVGhlIHBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Lg0KKwkgKiA8cD4NCisJICogVGhpcyBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkIHdoaWxlIHRoZSByZXNvdXJjZSB0cmVlIGlzIGxvY2tlZC4NCisJICogPHA+DQorCSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCANCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4NCisJICogPHA+DQorCSAqDQorCSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQ0KKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KKwkgKiBAc2VlICNnZXRDbGFzc3BhdGhWYXJpYWJsZQ0KKwkgKg0KKwkgKiBAZGVwcmVjYXRlZCAtIHVzZSBBUEkgd2l0aCBJUHJvZ3Jlc3NNb25pdG9yDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgSVBhdGggcGF0aCkNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKw0KKwkJc2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lLCBwYXRoLCBudWxsKTsNCisJfQ0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4NCisJICogVGhlIHBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Lg0KKwkgKiA8cD4NCisJICogVGhpcyBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkIHdoaWxlIHRoZSByZXNvdXJjZSB0cmVlIGlzIGxvY2tlZC4NCisJICogPHA+DQorCSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCANCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4NCisJICogPHA+DQorCSAqDQorCSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQ0KKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KKwkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzDQorCSAqIEBzZWUgI2dldENsYXNzcGF0aFZhcmlhYmxlDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoVmFyaWFibGUoDQorCQlTdHJpbmcgdmFyaWFibGVOYW1lLA0KKwkJSVBhdGggcGF0aCwNCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKw0KKwkJQXNzZXJ0LmlzVHJ1ZShwYXRoICE9IG51bGwsIFV0aWwuYmluZCgiY2xhc3NwYXRoLm51bGxWYXJpYWJsZVBhdGgiICkpOyAvLyROT04tTkxTLTEkDQorCQl1cGRhdGVWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgcGF0aCwgbW9uaXRvcik7DQorCX0NCisNCisJLyogKG5vbi1KYXZhZG9jKQ0KKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUV4ZWN1dGFibGVFeHRlbnNpb24uDQorCSAqIFJlY29yZCBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIGRhdGEgZnJvbSB0aGUgcGx1Z2luLg0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKA0KKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmaWcsDQorCQlTdHJpbmcgcHJvcGVydHlOYW1lLA0KKwkJT2JqZWN0IGRhdGEpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCX0NCisNCisJLyoqDQorCSAqIFNodXRkb3duIHRoZSBKYXZhQ29yZSBwbHVnaW4NCisJICogPHA+DQorCSAqIERlLXJlZ2lzdGVycyB0aGUgSmF2YU1vZGVsTWFuYWdlciBhcyBhIHJlc291cmNlIGNoYW5nZWQgbGlzdGVuZXIgYW5kIHNhdmUgcGFydGljaXBhbnQuDQorCSAqIDxwPg0KKwkgKiBAc2VlIFBsdWdpbiNzaHV0ZG93bg0KKwkgKi8NCisJcHVibGljIHZvaWQgc2h1dGRvd24oKSB7DQorDQogCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBtYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOw0KLQkJaWYgKGluZGV4TWFuYWdlciAhPSBudWxsKSB7DQotCQkJLy8gbmVlZCB0byBpbml0aWFsaXplIHdvcmtiZW5jaCBub3cgc2luY2UgYSBxdWVyeSBtYXkgYmUgZG9uZSBiZWZvcmUgaW5kZXhpbmcgc3RhcnRzDQotCQkJaW5kZXhNYW5hZ2VyLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsNCi0JCX0NCi0JCXdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKA0KLQkJCW1hbmFnZXIsIA0KLQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9BVVRPX0JVSUxEIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgDQotCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSk7DQotCQkNCi0JCXN0YXJ0SW5kZXhpbmcoKTsNCisJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKTsNCisJCXdvcmtzcGFjZS5yZW1vdmVTYXZlUGFydGljaXBhbnQodGhpcyk7DQogDQotCQl3b3Jrc3BhY2UuYWRkU2F2ZVBhcnRpY2lwYW50KHRoaXMsIG1hbmFnZXIpOw0KLQkJbWFuYWdlci5sb2FkVmFyaWFibGVzKCk7DQotCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7DQotCX0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKXsNCi0JCW1hbmFnZXIuc2h1dGRvd24oKTsNCi0JCXRocm93IGU7DQorCQkoKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKS5zaHV0ZG93bigpOw0KIAl9DQotfQ0KLS8qKg0KLSAqIEludGVybmFsIHVwZGF0aW5nIG9mIGEgdmFyaWFibGUgdmFsdWUgKG51bGwgcGF0aCBtZWFuaW5nIHJlbW92YWwpLg0KLSAqLw0KLXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmFyaWFibGVWYWx1ZShTdHJpbmcgdmFyaWFibGVOYW1lLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIA0KLQkvLyBnYXRoZXIgY2xhc3NwYXRoIGluZm9ybWF0aW9uIGZvciB1cGRhdGluZw0KLQlIYXNodGFibGUgYWZmZWN0ZWRQcm9qZWN0cyA9IG5ldyBIYXNodGFibGUoNSk7DQotCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOw0KLQl0cnkgew0KLQkJSUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7DQotCQlpZiAobW9kZWwgIT0gbnVsbCl7DQotCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsNCi0JCQluZXh0UHJvamVjdDogZm9yIChpbnQgaSA9IDAsIG1heCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsNCi0JCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3RzW2ldLmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJCQlmb3IgKGludCBqID0gMCwgY3BsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGNwbGVuZ3RoOyBqKyspew0KLQkJCQkJSUNsYXNzcGF0aEVudHJ5IG9sZEVudHJ5ID0gZW50cmllc1tqXTsNCi0JCQkJCWlmIChvbGRFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKXsNCi0JCQkJCQlJUGF0aCBzb3VyY2VQYXRoLCBzb3VyY2VSb290UGF0aDsNCi0JCQkJCQlpZiAob2xkRW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkuZXF1YWxzKHZhcmlhYmxlTmFtZSkgDQotCQkJCQkJCQl8fCAoKHNvdXJjZVBhdGggPSBvbGRFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSAhPSBudWxsICYmIHNvdXJjZVBhdGguc2VnbWVudCgwKS5lcXVhbHModmFyaWFibGVOYW1lKSkNCi0JCQkJCQkJCXx8ICgoc291cmNlUm9vdFBhdGggPSBvbGRFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSkgIT0gbnVsbCAmJiBzb3VyY2VSb290UGF0aC5zZWdtZW50KDApLmVxdWFscyh2YXJpYWJsZU5hbWUpKSkgew0KLQkJCQkJCQlhZmZlY3RlZFByb2plY3RzLnB1dChwcm9qZWN0c1tpXSwgcHJvamVjdHNbaV0uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkpOw0KLQkJCQkJCQljb250aW51ZSBuZXh0UHJvamVjdDsNCisJLyoqDQorCSAqIEluaXRpYXRlIHRoZSBiYWNrZ3JvdW5kIGluZGV4aW5nIHByb2Nlc3MuDQorCSAqIFRoaXMgc2hvdWxkIGJlIGRlZmVycmVkIGFmdGVyIHRoZSBwbHVnaW4gYWN0aXZhdGlvbi4NCisJICovDQorCXByaXZhdGUgdm9pZCBzdGFydEluZGV4aW5nKCkgew0KKw0KKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0NCisJCQkoSmF2YU1vZGVsTWFuYWdlcikgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7DQorCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gbWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsNCisJCWlmIChpbmRleE1hbmFnZXIgIT0gbnVsbCkNCisJCQlpbmRleE1hbmFnZXIucmVzZXQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogU3RhcnR1cCBvZiB0aGUgSmF2YUNvcmUgcGx1Z2luDQorCSAqIDxwPg0KKwkgKiBSZWdpc3RlcnMgdGhlIEphdmFNb2RlbE1hbmFnZXIgYXMgYSByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyIGFuZCBzYXZlIHBhcnRpY2lwYW50Lg0KKwkgKiBTdGFydHMgdGhlIGJhY2tncm91bmQgaW5kZXhpbmcsIGFuZCByZXN0b3JlIHNhdmVkIGNsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMuDQorCSAqIDxwPg0KKwkgKiBAc2VlIFBsdWdpbiNzdGFydHVwDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzdGFydHVwKCkgew0KKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7DQorCQl0cnkgew0KKwkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KKwkJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBtYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOw0KKwkJCWlmIChpbmRleE1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCQkvLyBuZWVkIHRvIGluaXRpYWxpemUgd29ya2JlbmNoIG5vdyBzaW5jZSBhIHF1ZXJ5IG1heSBiZSBkb25lIGJlZm9yZSBpbmRleGluZyBzdGFydHMNCisJCQkJaW5kZXhNYW5hZ2VyLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsNCisJCQl9DQorCQkJd29ya3NwYWNlLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoDQorCQkJCW1hbmFnZXIsDQorCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9BVVRPX0JVSUxEDQorCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFDQorCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUNCisJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKTsNCisNCisJCQlzdGFydEluZGV4aW5nKCk7DQorDQorCQkJd29ya3NwYWNlLmFkZFNhdmVQYXJ0aWNpcGFudCh0aGlzLCBtYW5hZ2VyKTsNCisJCQltYW5hZ2VyLmxvYWRWYXJpYWJsZXMoKTsNCisJCQltYW5hZ2VyLmxvYWRPcHRpb25zKCk7DQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KKwkJCW1hbmFnZXIuc2h1dGRvd24oKTsNCisJCQl0aHJvdyBlOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBJbnRlcm5hbCB1cGRhdGluZyBvZiBhIHZhcmlhYmxlIHZhbHVlIChudWxsIHBhdGggbWVhbmluZyByZW1vdmFsKS4NCisJICovDQorCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmFyaWFibGVWYWx1ZSgNCisJCVN0cmluZyB2YXJpYWJsZU5hbWUsDQorCQlJUGF0aCBwYXRoLA0KKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQorDQorCQkvLyBnYXRoZXIgY2xhc3NwYXRoIGluZm9ybWF0aW9uIGZvciB1cGRhdGluZw0KKwkJSGFzaHRhYmxlIGFmZmVjdGVkUHJvamVjdHMgPSBuZXcgSGFzaHRhYmxlKDUpOw0KKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7DQorCQl0cnkgew0KKwkJCUlKYXZhTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldEphdmFNb2RlbCgpOw0KKwkJCWlmIChtb2RlbCAhPSBudWxsKSB7DQorCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7DQorCQkJCW5leHRQcm9qZWN0IDogZm9yIChpbnQgaSA9IDAsIG1heCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQorCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdHNbaV0uZ2V0UmF3Q2xhc3NwYXRoKCk7DQorCQkJCQlmb3IgKGludCBqID0gMCwgY3BsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGNwbGVuZ3RoOyBqKyspIHsNCisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgb2xkRW50cnkgPSBlbnRyaWVzW2pdOw0KKwkJCQkJCWlmIChvbGRFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKSB7DQorCQkJCQkJCUlQYXRoIHNvdXJjZVBhdGgsIHNvdXJjZVJvb3RQYXRoOw0KKwkJCQkJCQlpZiAob2xkRW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkuZXF1YWxzKHZhcmlhYmxlTmFtZSkNCisJCQkJCQkJCXx8ICgoc291cmNlUGF0aCA9IG9sZEVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpICE9IG51bGwNCisJCQkJCQkJCQkmJiBzb3VyY2VQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKHZhcmlhYmxlTmFtZSkpDQorCQkJCQkJCQl8fCAoKHNvdXJjZVJvb3RQYXRoID0gb2xkRW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpICE9IG51bGwNCisJCQkJCQkJCQkmJiBzb3VyY2VSb290UGF0aC5zZWdtZW50KDApLmVxdWFscyh2YXJpYWJsZU5hbWUpKSkgew0KKwkJCQkJCQkJYWZmZWN0ZWRQcm9qZWN0cy5wdXQocHJvamVjdHNbaV0sIHByb2plY3RzW2ldLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpKTsNCisJCQkJCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0Ow0KKwkJCQkJCQl9DQogCQkJCQkJfQ0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJfQ0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCiAJCX0NCi0JfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7DQorCQlpZiAocGF0aCA9PSBudWxsKSB7DQorCQkJVmFyaWFibGVzLnJlbW92ZSh2YXJpYWJsZU5hbWUpOw0KKwkJfSBlbHNlIHsNCisJCQkvLyBuZXcgdmFyaWFibGUgdmFsdWUgaXMgYXNzaWduZWQNCisJCQlWYXJpYWJsZXMucHV0KHZhcmlhYmxlTmFtZSwgcGF0aCk7DQorCQl9DQorCQlpZiAoIWFmZmVjdGVkUHJvamVjdHMuaXNFbXB0eSgpKSB7DQorCQkJYm9vbGVhbiB3YXNGaXJpbmcgPSBtYW5hZ2VyLmlzRmlyaW5nKCk7DQorCQkJdHJ5IHsNCisJCQkJaWYgKHdhc0ZpcmluZykNCisJCQkJCW1hbmFnZXIuc3RvcERlbHRhcygpOw0KKwkJCQkvLyBwcm9wYWdhdGUgY2xhc3NwYXRoIGNoYW5nZQ0KKwkJCQlFbnVtZXJhdGlvbiBwcm9qZWN0c1RvVXBkYXRlID0gYWZmZWN0ZWRQcm9qZWN0cy5rZXlzKCk7DQorCQkJCXdoaWxlIChwcm9qZWN0c1RvVXBkYXRlLmhhc01vcmVFbGVtZW50cygpKSB7DQorCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0c1RvVXBkYXRlLm5leHRFbGVtZW50KCk7DQorCQkJCQlwcm9qZWN0DQorCQkJCQkJLnNldFJhd0NsYXNzcGF0aCgNCisJCQkJCQkJcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwNCisJCQkJCQkJbW9uaXRvciwNCisJCQkJCQkJcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpLA0KKwkJCQkJLy8gZm9yY2UgYnVpbGQgaWYgaW4gYXV0byBidWlsZCBtb2RlDQorCQkJCQkgKElDbGFzc3BhdGhFbnRyeVtdKSBhZmZlY3RlZFByb2plY3RzLmdldChwcm9qZWN0KSk7DQorCQkJCX0NCisJCQl9IGZpbmFsbHkgew0KKwkJCQltYW5hZ2VyLm1lcmdlRGVsdGFzKCk7DQorCQkJCWlmICh3YXNGaXJpbmcpIHsNCisJCQkJCW1hbmFnZXIuc3RhcnREZWx0YXMoKTsNCisJCQkJCW1hbmFnZXIuZmlyZSgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KIAl9DQogDQotCWlmIChwYXRoID09IG51bGwpew0KLQkJVmFyaWFibGVzLnJlbW92ZSh2YXJpYWJsZU5hbWUpOw0KLQl9IGVsc2Ugew0KLQkJLy8gbmV3IHZhcmlhYmxlIHZhbHVlIGlzIGFzc2lnbmVkDQotCQlWYXJpYWJsZXMucHV0KHZhcmlhYmxlTmFtZSwgcGF0aCk7DQorCS8qKg0KKwkqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgYW4gb3B0aW9uLg0KKwkqDQorCSogQHJldHVybiBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfT1BUSU9OX1ZBTFVFIGlmIG9wdGlvbiB2YWx1ZQ0KKwkqIGFyZSBub3QgY29ycmVjdCBhbmQgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX09QVElPTiBpZiBvcHRpb24NCisJKiBkb2Vzbid0IGV4aXN0Lg0KKwkqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgc2V0T3B0aW9uVmFsdWUoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsNCisJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVPcHRpb25WYWx1ZShpZCwgdmFsdWUpOw0KKwkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1cy5PSykgew0KKwkJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSAoQ29uZmlndXJhYmxlT3B0aW9uKSBnZXRPcHRpb25zKCkuZ2V0KGlkKTsNCisJCQlpZiAob3B0aW9uICE9IG51bGwpDQorCQkJCW9wdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7DQorCQl9DQorCQlyZXR1cm4gc3RhdHVzOw0KIAl9DQogDQotCWlmICghYWZmZWN0ZWRQcm9qZWN0cy5pc0VtcHR5KCkpew0KLQkJYm9vbGVhbiB3YXNGaXJpbmcgPSBtYW5hZ2VyLmlzRmlyaW5nKCk7DQorCS8qKg0KKwkqIEFuc3dlciB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgYW4gb3B0aW9uLg0KKwkqDQorCSogQHJldHVybiBTdHJpbmcNCisJKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3B0aW9uVmFsdWUoU3RyaW5nIGlkKSB7DQorCQlDb25maWd1cmFibGVPcHRpb24gb3B0aW9uID0gKENvbmZpZ3VyYWJsZU9wdGlvbikgZ2V0T3B0aW9ucygpLmdldChpZCk7DQorDQorCQlpZiAob3B0aW9uICE9IG51bGwpDQorCQkJcmV0dXJuIG9wdGlvbi5nZXRWYWx1ZSgpOw0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBhbiBvcHRpb24uDQorCSoNCisJKiBAcmV0dXJuIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9PUFRJT05fVkFMVUUgaWYgb3B0aW9uIHZhbHVlDQorCSogYXJlIG5vdCBjb3JyZWN0IGFuZCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfT1BUSU9OIGlmIG9wdGlvbg0KKwkqIGRvZXNuJ3QgZXhpc3QuDQorCSovDQorCXByaXZhdGUgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgc2V0T3B0aW9uRGVmYXVsdFZhbHVlKA0KKwkJU3RyaW5nIGlkLA0KKwkJU3RyaW5nIHZhbHVlKSB7DQorCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlT3B0aW9uVmFsdWUoaWQsIHZhbHVlKTsNCisJCWlmIChzdGF0dXMuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXMuT0spIHsNCisJCQlDb25maWd1cmFibGVPcHRpb24gb3B0aW9uID0gKENvbmZpZ3VyYWJsZU9wdGlvbikgZ2V0T3B0aW9ucygpLmdldChpZCk7DQorCQkJaWYgKG9wdGlvbiAhPSBudWxsKQ0KKwkJCQlvcHRpb24uc2V0RGVmYXVsdFZhbHVlKHZhbHVlKTsNCisJCX0NCisJCXJldHVybiBzdGF0dXM7DQorCX0NCisNCisJLyoqDQorCSogQW5zd2VyIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBhbiBvcHRpb24uDQorCSoNCisJKiBAcmV0dXJuIFN0cmluZw0KKwkqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcHRpb25EZWZhdWx0VmFsdWUoU3RyaW5nIGlkKSB7DQorCQlDb25maWd1cmFibGVPcHRpb24gb3B0aW9uID0gKENvbmZpZ3VyYWJsZU9wdGlvbikgZ2V0T3B0aW9ucygpLmdldChpZCk7DQorDQorCQlpZiAob3B0aW9uICE9IG51bGwpDQorCQkJcmV0dXJuIG9wdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsNCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkqIFJldHVybiBhbiBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgZGVzY3JpcHRpb24gb2YgYW4gb3B0aW9uLg0KKwkqDQorCSogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQorCSovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wdGlvbkRlc2NyaXB0aW9uKFN0cmluZyBpZCkgew0KKwkJQ29uZmlndXJhYmxlT3B0aW9uIG9wdGlvbiA9IChDb25maWd1cmFibGVPcHRpb24pIGdldE9wdGlvbnMoKS5nZXQoaWQpOw0KKw0KKwkJaWYgKG9wdGlvbiAhPSBudWxsKQ0KKwkJCXJldHVybiBvcHRpb24uZ2V0RGVzY3JpcHRpb24oKTsNCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorCS8qKg0KKwkqIFJldHVybiBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBuYW1lIG9mIGFuIG9wdGlvbi4NCisJKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCisJKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3B0aW9uTmFtZShTdHJpbmcgaWQpIHsNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSAoQ29uZmlndXJhYmxlT3B0aW9uKSBnZXRPcHRpb25zKCkuZ2V0KGlkKTsNCisNCisJCWlmIChvcHRpb24gIT0gbnVsbCkNCisJCQlyZXR1cm4gb3B0aW9uLmdldE5hbWUoKTsNCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkqIFJldHVybiBhIFN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIGNvbXBvbmVudCBvd25lciBvZiBhbiBvcHRpb24NCisJKiAodHlwaWNhbGx5IHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBpdCBjb3JyZXNwb25kcyB0bykuDQorCSoNCisJKiBlLmcuICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLkNvbXBpbGVyIg0KKwkqDQorCSogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQorCSovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wdGlvbkNvbXBvbmVudE5hbWUoU3RyaW5nIGlkKSB7DQorCQlDb25maWd1cmFibGVPcHRpb24gb3B0aW9uID0gKENvbmZpZ3VyYWJsZU9wdGlvbikgZ2V0T3B0aW9ucygpLmdldChpZCk7DQorDQorCQlpZiAob3B0aW9uICE9IG51bGwpDQorCQkJcmV0dXJuIG9wdGlvbi5nZXRDb21wb25lbnROYW1lKCk7DQorDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWxpemVkIGNhdGVnb3J5IG9mIGFuIG9wdGlvbi4NCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcHRpb25DYXRlZ29yeShTdHJpbmcgaWQpIHsNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSAoQ29uZmlndXJhYmxlT3B0aW9uKSBnZXRPcHRpb25zKCkuZ2V0KGlkKTsNCisNCisJCWlmIChvcHRpb24gIT0gbnVsbCkNCisJCQlyZXR1cm4gb3B0aW9uLmdldENhdGVnb3J5KCk7DQorDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJKiBSZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWxpemVkIHBvc3NpYmxlIHZhbHVlcyBvZiBhbiBvcHRpb24uDQorCSoNCisJKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQ0KKwkqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wdGlvblBvc3NpYmxlVmFsdWVzKFN0cmluZyBpZCkgew0KKwkJQ29uZmlndXJhYmxlT3B0aW9uIG9wdGlvbiA9IChDb25maWd1cmFibGVPcHRpb24pIGdldE9wdGlvbnMoKS5nZXQoaWQpOw0KKw0KKwkJaWYgKG9wdGlvbiAhPSBudWxsKQ0KKwkJCXJldHVybiBvcHRpb24uZ2V0UG9zc2libGVWYWx1ZXMoKTsNCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gdGhlIHR5cGUgb2Ygb3B0aW9uLiBUeXBlIGlzIGEgU3RyaW5nIHdpdGggcG9zc2libGUgdmFsdWUgOg0KKwkgKiA8Y29kZT5kaXNjcmV0ZTwvY29kZT4sPGNvZGU+c3RyaW5nPC9jb2RlPiw8Y29kZT5pbnQ8L2NvZGU+IGFuZA0KKwkgKiA8Y29kZT5mbG9hdDwvY29kZT4uDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcHRpb25UeXBlKFN0cmluZyBpZCkgew0KKwkJQ29uZmlndXJhYmxlT3B0aW9uIG9wdGlvbiA9IChDb25maWd1cmFibGVPcHRpb24pIGdldE9wdGlvbnMoKS5nZXQoaWQpOw0KKw0KKwkJaWYgKG9wdGlvbiAhPSBudWxsKQ0KKwkJCXJldHVybiBvcHRpb24uZ2V0VHlwZSgpOw0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBvZiBvcHRpb24gaWYgb3B0aW9uJ3MgdHlwZSBpcyA8Y29kZT5pbnQ8L2NvZGU+DQorCSAqICBvciA8Y29kZT5mbG9hdDwvY29kZT4uT3RoZXJ3aXNlIHJldHVybiBudWxsLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBOdW1iZXIgZ2V0T3B0aW9uTWF4KFN0cmluZyBpZCkgew0KKwkJQ29uZmlndXJhYmxlT3B0aW9uIG9wdGlvbiA9IChDb25maWd1cmFibGVPcHRpb24pIGdldE9wdGlvbnMoKS5nZXQoaWQpOw0KKw0KKwkJaWYgKG9wdGlvbiAhPSBudWxsKSB7DQorCQkJcmV0dXJuIG9wdGlvbi5nZXRNYXgoKTsNCisJCX0NCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2Ygb3B0aW9uIGlmIG9wdGlvbidzIHR5cGUgaXMgPGNvZGU+aW50PC9jb2RlPg0KKwkgKiAgb3IgPGNvZGU+ZmxvYXQ8L2NvZGU+Lk90aGVyd2lzZSByZXR1cm4gbnVsbC4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgTnVtYmVyIGdldE9wdGlvbk1pbihTdHJpbmcgaWQpIHsNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSAoQ29uZmlndXJhYmxlT3B0aW9uKSBnZXRPcHRpb25zKCkuZ2V0KGlkKTsNCisNCisJCWlmIChvcHRpb24gIT0gbnVsbCkNCisJCQlyZXR1cm4gb3B0aW9uLmdldE1pbigpOw0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEFuc3dlcnMgYSBzZXQgb2Ygb3B0aW9uJ0lEcyB3aGljaCBhcmUgaW4gb3B0aW9uIHNldCBvZiBKYXZhQ29yZQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRPcHRpb25JRHMoKSB7DQorCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRPcHRpb25JRHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQW5zd2VycyBhIHNldCBvZiBvcHRpb24nSURzIHdoaWNoIGFyZSBpbiBvcHRpb24gc2V0IG9mIEphdmFDb3JlDQorCSAqIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBjb21wb25lbnQuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wdGlvbklEcyhTdHJpbmcgY29tcG9uZW50TmFtZSkgew0KKwkJU3RyaW5nW10gaWRzID0gZ2V0T3B0aW9uSURzKCk7DQorDQorCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2lkcy5sZW5ndGhdOw0KKwkJaW50IHJlc3VsdENvdW50ID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7DQorCQkJaWYgKGlkc1tpXS5zdGFydHNXaXRoKGNvbXBvbmVudE5hbWUpKQ0KKwkJCQlyZXN1bHRbcmVzdWx0Q291bnQrK10gPSBpZHNbaV07DQorCQl9DQorDQorCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgcmVzdWx0ID0gbmV3IFN0cmluZ1tyZXN1bHRDb3VudF0sIDAsIHJlc3VsdENvdW50KTsNCisNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEFuc3dlcnMgaWYgYSB2YWx1ZSBpcyB2YWxpZGUgZm9yIGFuIG9wdGlvbg0KKwkgKiANCisJICogQHJldHVybiBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfT1BUSU9OX1ZBTFVFIGlmIG9wdGlvbiB2YWx1ZQ0KKwkgKiBhcmUgbm90IGNvcnJlY3QgYW5kIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9PUFRJT04gaWYgb3B0aW9uDQorCSAqIGRvZXNuJ3QgZXhpc3QuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVPcHRpb25WYWx1ZShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgew0KKwkJQ29uZmlndXJhYmxlT3B0aW9uIG9wdGlvbiA9IChDb25maWd1cmFibGVPcHRpb24pIGdldE9wdGlvbnMoKS5nZXQoaWQpOw0KKw0KKwkJaWYgKG9wdGlvbiAhPSBudWxsKSB7DQorCQkJU3RyaW5nW10gdmFsdWVzID0gb3B0aW9uLmdldFBvc3NpYmxlVmFsdWVzKCk7DQorCQkJaWYgKHZhbHVlcyA9PSBDb25maWd1cmFibGVPcHRpb24uTm9EaXNjcmV0ZVZhbHVlKSB7DQorCQkJCXRyeSB7DQorCQkJCQlpZiAob3B0aW9uLmdldFR5cGUoKS5lcXVhbHMoQ29uZmlndXJhYmxlT3B0aW9uLklOVCkpIHsNCisJCQkJCQlpbnQgbWF4ID0gb3B0aW9uLmdldE1heCgpLmludFZhbHVlKCk7DQorCQkJCQkJaW50IG1pbiA9IG9wdGlvbi5nZXRNaW4oKS5pbnRWYWx1ZSgpOw0KKwkJCQkJCWludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsNCisJCQkJCQlpZiAodmFsID4gbWF4IHx8IHZhbCA8IG1pbikNCisJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX09QVElPTl9WQUxVRSk7DQorCQkJCQl9IGVsc2UgaWYgKG9wdGlvbi5nZXRUeXBlKCkuZXF1YWxzKENvbmZpZ3VyYWJsZU9wdGlvbi5GTE9BVCkpIHsNCisJCQkJCQlmbG9hdCBtYXggPSBvcHRpb24uZ2V0TWF4KCkuZmxvYXRWYWx1ZSgpOw0KKwkJCQkJCWZsb2F0IG1pbiA9IG9wdGlvbi5nZXRNaW4oKS5mbG9hdFZhbHVlKCk7DQorCQkJCQkJZmxvYXQgdmFsID0gRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7DQorCQkJCQkJaWYgKHZhbCA+IG1heCB8fCB2YWwgPCBtaW4pDQorCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9PUFRJT05fVkFMVUUpOw0KKwkJCQkJfQ0KKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX09QVElPTl9WQUxVRSk7DQorCQkJCX0NCisJCQkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsNCisJCQl9IGVsc2Ugew0KKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgew0KKwkJCQkJaWYgKHZhbHVlc1tpXS5lcXVhbHModmFsdWUpKQ0KKwkJCQkJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7DQorCQkJCX0NCisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX09QVElPTl9WQUxVRSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX09QVElPTik7DQorCX0NCisNCisJLyoqDQorCSAqIFJlc2V0IEphdmFDb3JlIG9wdGlvbiB2YWx1ZXMgdG8gZGVmYXVsdHMuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRPcHRpb25zKCkgew0KKwkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7DQorDQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5mT3B0aW9ucyA9PSBudWxsKSB7DQorCQkJSmF2YU1vZGVsTWFuYWdlci5pbml0aWFsaXplT3B0aW9ucygpOw0KKwkJCS8vIFNldCBvcHRpb25zIHRvIEphdmFDb3JlIGRlZmF1bHQgdmFsdWUNCisJCQlzZXRKYXZhQ29yZURlZmF1bHRPcHRpb25zVmFsdWUobG9jYWxlKTsNCisNCisJCX0gZWxzZSB7DQorCQkJQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucyA9DQorCQkJCShDb25maWd1cmFibGVPcHRpb25bXSkgSmF2YU1vZGVsTWFuYWdlci5mT3B0aW9ucy52YWx1ZXMoKS50b0FycmF5KA0KKwkJCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvblswXSk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKQ0KKwkJCQlvcHRpb25zW2ldLnNldFRvRGVmYXVsdCgpOw0KKwkJfQ0KKwl9DQorDQorCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0SmF2YUNvcmVEZWZhdWx0T3B0aW9uc1ZhbHVlKExvY2FsZSBsb2NhbGUpIHsNCisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7DQogCQl0cnkgew0KLQkJCWlmICh3YXNGaXJpbmcpIG1hbmFnZXIuc3RvcERlbHRhcygpOw0KLQkJCS8vIHByb3BhZ2F0ZSBjbGFzc3BhdGggY2hhbmdlDQotCQkJRW51bWVyYXRpb24gcHJvamVjdHNUb1VwZGF0ZSA9IGFmZmVjdGVkUHJvamVjdHMua2V5cygpOw0KLQkJCXdoaWxlIChwcm9qZWN0c1RvVXBkYXRlLmhhc01vcmVFbGVtZW50cygpKXsNCi0JCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClwcm9qZWN0c1RvVXBkYXRlLm5leHRFbGVtZW50KCk7DQotCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKA0KLQkJCQkJcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgDQotCQkJCQltb25pdG9yLCANCi0JCQkJCXByb2plY3QuZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSwgLy8gZm9yY2UgYnVpbGQgaWYgaW4gYXV0byBidWlsZCBtb2RlDQotCQkJCQkoSUNsYXNzcGF0aEVudHJ5W10pYWZmZWN0ZWRQcm9qZWN0cy5nZXQocHJvamVjdCkpOw0KKwkJCXJlYWRlciA9DQorCQkJCW5ldyBCdWZmZXJlZFJlYWRlcigNCisJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihKYXZhQ29yZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKEpBVkFfQ09SRV9JTklUKSkpOw0KKwkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7DQorCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgew0KKwkJCQlpbnQgZXF1YWxJbmRleCA9IGxpbmUuaW5kZXhPZigiPSIgKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQlpZiAoIWxpbmUuc3RhcnRzV2l0aCgiIyIgKSAmJiBlcXVhbEluZGV4ICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJCVN0cmluZyBpZCA9IGxpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTsNCisNCisJCQkJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSBuZXcgQ29uZmlndXJhYmxlT3B0aW9uKGlkLCBsb2NhbGUpOw0KKwkJCQkJaWYgKG9wdGlvbi5nZXRQb3NzaWJsZVZhbHVlcygpICE9IENvbmZpZ3VyYWJsZU9wdGlvbi5Ob0Rpc2NyZXRlVmFsdWUpIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQlpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3Vic3RyaW5nKGVxdWFsSW5kZXggKyAxKS50cmltKCkpOw0KKwkJCQkJCQlvcHRpb24uc2V0RGVmYXVsdFZhbHVlSW5kZXgoaW5kZXgpOw0KKwkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQorCQkJCQkJCS8vIHZhbHVlIGlzIGRlZmF1bHQgZGVmYXVsdCB2YWx1ZQ0KKwkJCQkJCX0NCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJU3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTsNCisJCQkJCQlvcHRpb24uc2V0RGVmYXVsdFZhbHVlKHZhbHVlKTsNCisJCQkJCX0NCisJCQkJCUphdmFNb2RlbE1hbmFnZXIuYWRkT3B0aW9uKG9wdGlvbik7DQorCQkJCX0NCisJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOw0KIAkJCX0NCisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQogCQl9IGZpbmFsbHkgew0KLQkJCW1hbmFnZXIubWVyZ2VEZWx0YXMoKTsNCi0JCQlpZiAod2FzRmlyaW5nKXsNCi0JCQkJbWFuYWdlci5zdGFydERlbHRhcygpOw0KLQkJCQltYW5hZ2VyLmZpcmUoKTsNCisJCQlpZiAocmVhZGVyICE9IG51bGwpIHsNCisJCQkJdHJ5IHsNCisJCQkJCXJlYWRlci5jbG9zZSgpOw0KKwkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpew0KKwkJCQl9DQogCQkJfQ0KIAkJfQ0KIAl9DQotfQ0KLX0NCisNCisJcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdldE9wdGlvbnMoKSB7DQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5mT3B0aW9ucyA9PSBudWxsKQ0KKwkJCXJlc2V0T3B0aW9ucygpOw0KKw0KKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZk9wdGlvbnM7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgYWxsIHRoZSBvcHRpb25zIG9mIEphdmEgQ29yZSB0byBiZSBzaG93biBieSB0aGUgVUkNCisJICoNCisJICogQHBhcmFtIGxvY2FsZSBqYXZhLnV0aWwuTG9jYWxlDQorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbmZpZ3VyYWJsZU9wdGlvbltdDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBnZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUgbG9jYWxlKSB7DQorCQlTdHJpbmdbXSBpZHMgPSBDb25maWd1cmFibGVPcHRpb24uZ2V0SURzKEphdmFDb3JlLmNsYXNzLmdldE5hbWUoKSwgbG9jYWxlKTsNCisNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbltdIHJlc3VsdCA9IG5ldyBDb25maWd1cmFibGVPcHRpb25baWRzLmxlbmd0aF07DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgew0KKwkJCXJlc3VsdFtpXSA9IG5ldyBDb25maWd1cmFibGVPcHRpb24oaWRzW2ldLCBsb2NhbGUpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhTW9kZWxFeGNlcHRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhCmluZGV4IGU3MDE3ZTUuLjBhNmJhOTYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhCkBAIC05OCwxMyArOTgsMTMgQEAKICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCBFeGNlcHRpb246ICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCBFeGNlcHRpb246ICIpOyAvLyROT04tTkxTLTEkDQogCWlmIChnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7DQogCQlpZiAoZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7DQogCQkJQ29yZUV4Y2VwdGlvbiBjPSAoQ29yZUV4Y2VwdGlvbilnZXRFeGNlcHRpb24oKTsNCi0JCQlidWZmZXIuYXBwZW5kKCJDb3JlIEV4Y2VwdGlvbiBbY29kZSAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiQ29yZSBFeGNlcHRpb24gW2NvZGUgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKGMuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsNCi0JCQlidWZmZXIuYXBwZW5kKCJdICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJdICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnVmZmVyLmFwcGVuZChjLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7DQogCQl9IGVsc2Ugew0KIAkJCWJ1ZmZlci5hcHBlbmQoZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQppbmRleCA3YTg3MGRkLi4wYWZhMWFjIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQpAQCAtMTczLDU0ICsxNzMsNTQgQEAKIAkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGJvb2xlYW4uDQogCSAqIFZhbHVlIGlzIDxjb2RlPiJaIjwvY29kZT4uDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQk9PTEVBTiAJCT0gIloiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0JPT0xFQU4gCQk9ICJaIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKioNCiAJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBieXRlLiANCiAJICogVmFsdWUgaXMgPGNvZGU+IkIiPC9jb2RlPi4NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19CWVRFIAkJPSAiQiIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQllURSAJCT0gIkIiOyAvLyROT04tTkxTLTEkDQogDQogCS8qKg0KIAkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGNoYXIuDQogCSAqIFZhbHVlIGlzIDxjb2RlPiJDIjwvY29kZT4uDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQ0hBUiAJCT0gIkMiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0NIQVIgCQk9ICJDIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKioNCiAJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBkb3VibGUuDQogCSAqIFZhbHVlIGlzIDxjb2RlPiJEIjwvY29kZT4uDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRE9VQkxFIAkJPSAiRCIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRE9VQkxFIAkJPSAiRCI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqDQogCSAqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgZmxvYXQuDQogCSAqIFZhbHVlIGlzIDxjb2RlPiJGIjwvY29kZT4uDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRkxPQVQgCQk9ICJGIi8qbm9uTkxTKi87DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19GTE9BVCAJCT0gIkYiOyAvLyROT04tTkxTLTEkDQogDQogCS8qKg0KIAkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGludC4NCiAJICogVmFsdWUgaXMgPGNvZGU+IkkiPC9jb2RlPi4NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19JTlQgCQkJPSAiSSIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfSU5UIAkJCT0gIkkiOyAvLyROT04tTkxTLTEkDQogDQogCS8qKg0KIAkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGxvbmcuDQogCSAqIFZhbHVlIGlzIDxjb2RlPiJKIjwvY29kZT4uDQogCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfTE9ORwkJCT0gIkoiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0xPTkcJCQk9ICJKIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKioNCiAJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBzaG9ydC4NCiAJICogVmFsdWUgaXMgPGNvZGU+IlMiPC9jb2RlPi4NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19TSE9SVAkJPSAiUyIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfU0hPUlQJCT0gIlMiOyAvLyROT04tTkxTLTEkDQogDQogCS8qKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgcmVzdWx0IHR5cGUgdm9pZC4NCiAJICogVmFsdWUgaXMgPGNvZGU+IlYiPC9jb2RlPi4NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19WT0lECQkJPSAiViIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfVk9JRAkJCT0gIlYiOyAvLyROT04tTkxTLTEkDQogCQ0KIC8qKg0KICAqIE5vdCBpbnN0YW50aWFibGUuDQpAQCAtMjM2LDcgKzIzNiw3IEBACiAJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcih0eXBlTmFtZS5sZW5ndGgoKSArIGFycmF5Q291bnQgKiAyKTsNCiAJc2IuYXBwZW5kKHR5cGVOYW1lKTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUNvdW50OyArK2kpIHsNCi0JCXNiLmFwcGVuZCgiW10iLypub25OTFMqLyk7DQorCQlzYi5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gc2IudG9TdHJpbmcoKTsNCiB9DQpAQCAtMzAyLDcgKzMwMiw3IEBACiAJCQkJCXJldHVybiBTSUdfVk9JRDsNCiAJCQljYXNlIDYgOg0KIAkJCQlpZiAodHlwZU5hbWVbMF0gPT0gJ1MnICYmIHR5cGVOYW1lWzFdID09ICd0JyAmJiB0eXBlTmFtZVsyXSA9PSAncicgJiYgdHlwZU5hbWVbM10gPT0gJ2knICYmIHR5cGVOYW1lWzRdID09ICduJyAmJiB0eXBlTmFtZVs1XSA9PSAnZycpDQotCQkJCQlpZiAoIWlzUmVzb2x2ZWQpIHJldHVybiAiUVN0cmluZzsiLypub25OTFMqLzsNCisJCQkJCWlmICghaXNSZXNvbHZlZCkgcmV0dXJuICJRU3RyaW5nOyI7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWJyZWFrOw0KIAkJCWNhc2UgNyA6DQogCQkJCWlmICh0eXBlTmFtZVswXSA9PSAnYicgJiYgdHlwZU5hbWVbMV0gPT0gJ28nICYmIHR5cGVOYW1lWzJdID09ICdvJyAmJiB0eXBlTmFtZVszXSA9PSAnbCcgJiYgdHlwZU5hbWVbNF0gPT0gJ2UnICYmIHR5cGVOYW1lWzVdID09ICdhJyAmJiB0eXBlTmFtZVs2XSA9PSAnbicpDQpAQCAtNjE3LDcgKzYxNyw3IEBACiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWFsaWZpZXIoU3RyaW5nIG5hbWUpIHsNCiAJaW50IGxhc3REb3QgPSBuYW1lLmxhc3RJbmRleE9mKENfRE9UKTsNCiAJaWYgKGxhc3REb3QgPT0gLTEpIHsNCi0JCXJldHVybiAiIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCk7DQogfQ0KQEAgLTcxNSw3ICs3MTUsNyBAQAogICovDQogcHVibGljIHN0YXRpYyBTdHJpbmcgdG9RdWFsaWZpZWROYW1lKFN0cmluZ1tdIHNlZ21lbnRzKSB7DQogCWlmIChzZWdtZW50cy5sZW5ndGggPT0gMCkgew0KLQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChzZWdtZW50cy5sZW5ndGggPT0gMSkgew0KIAkJcmV0dXJuIHNlZ21lbnRzWzBdOw0KQEAgLTc1NSwyOCArNzU1LDI4IEBACiBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgc2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCiAJdHJ5IHsNCiAJCWlmIChzaWduYXR1cmUuY2hhckF0KDApID09IENfUEFSQU1fU1RBUlQpIHsNCi0JCQlyZXR1cm4gdG9TdHJpbmcoc2lnbmF0dXJlLCAiIi8qbm9uTkxTKi8sIG51bGwsIHRydWUsIHRydWUpOw0KKwkJCXJldHVybiB0b1N0cmluZyhzaWduYXR1cmUsICIiLCBudWxsLCB0cnVlLCB0cnVlKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaW50IGFycmF5Q291bnQgPSBnZXRBcnJheUNvdW50KHNpZ25hdHVyZSk7DQogCQlzd2l0Y2ggKHNpZ25hdHVyZS5jaGFyQXQoYXJyYXlDb3VudCkpIHsNCiAJCQljYXNlIENfQk9PTEVBTiA6DQotCQkJCXJldHVybiBhcnJheUlmeSgiYm9vbGVhbiIvKm5vbk5MUyovLCBhcnJheUNvdW50KTsNCisJCQkJcmV0dXJuIGFycmF5SWZ5KCJib29sZWFuIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfQllURSA6DQotCQkJCXJldHVybiBhcnJheUlmeSgiYnl0ZSIvKm5vbk5MUyovLCBhcnJheUNvdW50KTsNCisJCQkJcmV0dXJuIGFycmF5SWZ5KCJieXRlIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfQ0hBUiA6DQotCQkJCXJldHVybiBhcnJheUlmeSgiY2hhciIvKm5vbk5MUyovLCBhcnJheUNvdW50KTsNCisJCQkJcmV0dXJuIGFycmF5SWZ5KCJjaGFyIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfRE9VQkxFIDoNCi0JCQkJcmV0dXJuIGFycmF5SWZ5KCJkb3VibGUiLypub25OTFMqLywgYXJyYXlDb3VudCk7DQorCQkJCXJldHVybiBhcnJheUlmeSgiZG91YmxlIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfRkxPQVQgOg0KLQkJCQlyZXR1cm4gYXJyYXlJZnkoImZsb2F0Ii8qbm9uTkxTKi8sIGFycmF5Q291bnQpOw0KKwkJCQlyZXR1cm4gYXJyYXlJZnkoImZsb2F0IiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfSU5UIDoNCi0JCQkJcmV0dXJuIGFycmF5SWZ5KCJpbnQiLypub25OTFMqLywgYXJyYXlDb3VudCk7DQorCQkJCXJldHVybiBhcnJheUlmeSgiaW50IiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfTE9ORyA6DQotCQkJCXJldHVybiBhcnJheUlmeSgibG9uZyIvKm5vbk5MUyovLCBhcnJheUNvdW50KTsNCisJCQkJcmV0dXJuIGFycmF5SWZ5KCJsb25nIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfU0hPUlQgOg0KLQkJCQlyZXR1cm4gYXJyYXlJZnkoInNob3J0Ii8qbm9uTkxTKi8sIGFycmF5Q291bnQpOw0KKwkJCQlyZXR1cm4gYXJyYXlJZnkoInNob3J0IiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfVk9JRCA6DQotCQkJCXJldHVybiBhcnJheUlmeSgidm9pZCIvKm5vbk5MUyovLCBhcnJheUNvdW50KTsNCisJCQkJcmV0dXJuIGFycmF5SWZ5KCJ2b2lkIiwgYXJyYXlDb3VudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENfUkVTT0xWRUQgOg0KIAkJCWNhc2UgQ19VTlJFU09MVkVEIDoNCiAJCQkJaW50IHNlbWkgPSBzaWduYXR1cmUuaW5kZXhPZihDX1NFTUlDT0xPTiwgYXJyYXlDb3VudCArIDEpOw0KQEAgLTgzOCw3ICs4MzgsNyBAQAogCXNiLmFwcGVuZChDX1BBUkFNX1NUQVJUKTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgKytpKSB7DQogCQlpZiAoaSAhPSAwKQ0KLQkJCXNiLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQlTdHJpbmcgcmVhZGFibGVQYXJhbVR5cGUgPSB0b1N0cmluZyhwYXJhbVR5cGVzW2ldKTsNCiAJCWlmICghZnVsbHlRdWFsaWZ5VHlwZU5hbWVzKSB7DQogCQkJaW50IGxhc3REb3QgPSByZWFkYWJsZVBhcmFtVHlwZS5sYXN0SW5kZXhPZihDX0RPVCk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01GYWN0b3J5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YQppbmRleCBiYjU2MTExLi44Mzc1OGVkIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5Lg0KICAqLw0KIHB1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoKSB7DQotCXJldHVybiBjcmVhdGVGaWVsZCgiT2JqZWN0IGFGaWVsZDsiLypub25OTFMqLysgSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQorCXJldHVybiBjcmVhdGVGaWVsZCgiT2JqZWN0IGFGaWVsZDsiKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKiAobm9uLUphdmFkb2MpDQogICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5Lg0KQEAgLTc3LDcgKzc3LDcgQEAKICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4NCiAgKi8NCiBwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCkgew0KLQlyZXR1cm4gY3JlYXRlSW5pdGlhbGl6ZXIoInN0YXRpYyB7fSIvKm5vbk5MUyovKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJcmV0dXJuIGNyZWF0ZUluaXRpYWxpemVyKCJzdGF0aWMge30iKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKiAobm9uLUphdmFkb2MpDQogICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5Lg0KQEAgLTkyLDcgKzkyLDcgQEAKICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4NCiAgKi8NCiBwdWJsaWMgSURPTU1ldGhvZCBjcmVhdGVNZXRob2QoKSB7DQotCXJldHVybiBjcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG5ld01ldGhvZCgpIHsiLypub25OTFMqLysgSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUisifSIvKm5vbk5MUyovKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJcmV0dXJuIGNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbmV3TWV0aG9kKCkgeyIrIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IrIn0iKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIC8qIChub24tSmF2YWRvYykNCiAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuDQpAQCAtMTIyLDcgKzEyMiw3IEBACiAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuDQogICovDQogcHVibGljIElET01UeXBlIGNyZWF0ZVR5cGUoKSB7DQotCXJldHVybiBjcmVhdGVUeXBlKCJwdWJsaWMgY2xhc3MgQUNsYXNzIHsiLypub25OTFMqLysgSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUiArIn0iLypub25OTFMqLysgSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQorCXJldHVybiBjcmVhdGVUeXBlKCJwdWJsaWMgY2xhc3MgQUNsYXNzIHsiKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SICsifSIrIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiB9DQogLyogKG5vbi1KYXZhZG9jKQ0KICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fzc2VydC5qYXZhCmluZGV4IDcwNzQ5NGMuLjhhZDg3OTIgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fzc2VydC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fzc2VydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQNCiAgKi8NCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsNCi0JcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIvKm5vbk5MUyovKTsNCisJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzDQogICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+DQpAQCAtNDQsNyArNDQsNyBAQAogICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPg0KICAqLw0KIHB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgew0KLQlpc05vdE51bGwob2JqZWN0LCAiIi8qbm9uTkxTKi8pOw0KKwlpc05vdE51bGwob2JqZWN0LCAiIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcw0KICAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KQEAgLTU2LDcgKzU2LDcgQEAKICAqLw0KIHB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsNCiAJaWYgKG9iamVjdCA9PSBudWxsKQ0KLQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihVdGlsLmJpbmQoImFzc2VydC5udWxsQXJndW1lbnQiLypub25OTFMqLyxtZXNzYWdlKSk7DQorCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFV0aWwuYmluZCgiYXNzZXJ0Lm51bGxBcmd1bWVudCIsbWVzc2FnZSkpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMNCiAgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4NCkBAIC02Niw3ICs2Niw3IEBACiAgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpDQogICovDQogcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24pIHsNCi0JcmV0dXJuIGlzVHJ1ZShleHByZXNzaW9uLCAiIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gaXNUcnVlKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzDQogICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQpAQCAtNzksNyArNzksNyBAQAogICovDQogcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7DQogCWlmICghZXhwcmVzc2lvbikNCi0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJhc3NlcnQuZmFpbGVkIi8qbm9uTkxTKi8sIG1lc3NhZ2UpKTsNCisJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJhc3NlcnQuZmFpbGVkIiwgbWVzc2FnZSkpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBleHByZXNzaW9uOw0KIH0NCiANCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmFzaWNDb21waWxhdGlvblVuaXQuamF2YQppbmRleCA3ZjllYzY3Li5jMTk3MmU5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Jhc2ljQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTIxLDExICsyMSwxMSBAQAogCXRoaXMuY29udGVudHMgPSBjb250ZW50czsNCiAJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lLnRvQ2hhckFycmF5KCk7DQogDQotCWludCBzdGFydCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIi8qbm9uTkxTKi8pICsgMTsNCi0JaWYgKHN0YXJ0ID09IDAgfHwgc3RhcnQgPCBmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiLypub25OTFMqLykpDQotCQlzdGFydCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCJcXCIvKm5vbk5MUyovKSArIDE7DQorCWludCBzdGFydCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIikgKyAxOyAvLyROT04tTkxTLTEkDQorCWlmIChzdGFydCA9PSAwIHx8IHN0YXJ0IDwgZmlsZU5hbWUubGFzdEluZGV4T2YoIlxcIikpIC8vJE5PTi1OTFMtMSQNCisJCXN0YXJ0ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIlxcIikgKyAxOyAvLyROT04tTkxTLTEkDQogDQotCWludCBlbmQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIvKm5vbk5MUyovKTsNCisJaW50IGVuZCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGVuZCA9PSAtMSkNCiAJCWVuZCA9IGZpbGVOYW1lLmxlbmd0aCgpOw0KIA0KQEAgLTc1LDYgKzc1LDYgQEAKIAlyZXR1cm4gbWFpblR5cGVOYW1lOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQotCXJldHVybiAiQ29tcGlsYXRpb25Vbml0OiAiLypub25OTFMqLytuZXcgU3RyaW5nKGZpbGVOYW1lKTsNCisJcmV0dXJuICJDb21waWxhdGlvblVuaXQ6ICIrbmV3IFN0cmluZyhmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1ldGhvZC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKaW5kZXggMDYxNmUyNC4uMmJmNDczYiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKQEAgLTExMCw3ICsxMTAsNyBAQAogCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChuZXcgU3RyaW5nKGluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpKSk7DQogCQlmUGFyYW1ldGVyTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtQ291bnRdOw0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUNvdW50OyBpKyspIHsNCi0JCQlmUGFyYW1ldGVyTmFtZXNbaV0gPSAiYXJnIi8qbm9uTkxTKi8gKyBpOw0KKwkJCWZQYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCXJldHVybiBmUGFyYW1ldGVyTmFtZXM7DQpAQCAtMTUxLDE4ICsxNTEsMTggQEAKIHB1YmxpYyBTdHJpbmcgcmVhZGFibGVOYW1lKCkgew0KIA0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5yZWFkYWJsZU5hbWUoKSk7DQotCWJ1ZmZlci5hcHBlbmQoIigiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJA0KIAlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHRoaXMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCiAJaW50IGxlbmd0aDsNCiAJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwgJiYgKGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgPiAwKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pKTsNCiAJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQl9DQogCX0NCi0JYnVmZmVyLmFwcGVuZCgiKSIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGUuamF2YQppbmRleCA0OWRiY2FmLi5kNzFjZThlIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5VHlwZS5qYXZhCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCXJldHVybiBudWxsOw0KIAkJfQ0KIAkJZW5jbG9zaW5nVHlwZU5hbWUgPSBDbGFzc0ZpbGUudW5xdWFsaWZpZWROYW1lKGVuY2xvc2luZ1R5cGVOYW1lKTsNCi0JCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDbGFzc0ZpbGUobmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlTmFtZSkgKyAiLmNsYXNzIi8qbm9uTkxTKi8pLmdldFR5cGUoKTsNCisJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDbGFzc0ZpbGUobmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlTmFtZSkgKyAiLmNsYXNzIikuZ2V0VHlwZSgpOyAvLyROT04tTkxTLTEkDQogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsNCiAJCXJldHVybiBudWxsOw0KIAl9DQpAQCAtMjMxLDcgKzIzMSw3IEBACiAgKiBAc2VlIElUeXBlI2dldFR5cGUNCiAgKi8NCiBwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgbmFtZSkgew0KLQlJQ2xhc3NGaWxlIGNsYXNzRmlsZT0gZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0Q2xhc3NGaWxlKGdldFR5cGVRdWFsaWZpZWROYW1lKCkgKyAiJCIvKm5vbk5MUyovICsgbmFtZSArICIuY2xhc3MiLypub25OTFMqLyk7DQorCUlDbGFzc0ZpbGUgY2xhc3NGaWxlPSBnZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDbGFzc0ZpbGUoZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSArICIkIiArIG5hbWUgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gbmV3IEJpbmFyeVR5cGUoY2xhc3NGaWxlLCBuYW1lKTsNCiB9DQogLyoqDQpAQCAtMzAyLDcgKzMwMiw3IEBACiAgKi8NCiBwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJSmF2YVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKHByb2plY3QgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImhpZXJhcmNoeS5udWxsUHJvamVjdCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxQcm9qZWN0IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24oDQogCQl0aGlzLCANCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXIuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCmluZGV4IDE1MDkwOWYuLjJmNjg2NmEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCkBAIC0xNjYsOCArMTY2LDggQEAKIAkJCWNoYXIgY3VycmVudENoYXIgPSBuZXh0Q2hhcjsNCiAJCQluZXh0Q2hhciA9IGkgPCBsZW5ndGgtMSA/IHRleHRbaSsxXSA6ICcgJzsNCiAJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7DQotCQkJCWNhc2UgJ1xuJzogcmV0dXJuICJcbiIvKm5vbk5MUyovOw0KLQkJCQljYXNlICdccic6IHJldHVybiBuZXh0Q2hhciA9PSAnXG4nID8gIlxyXG4iLypub25OTFMqLyA6ICJcciIvKm5vbk5MUyovOw0KKwkJCQljYXNlICdcbic6IHJldHVybiAiXG4iOyAvLyROT04tTkxTLTEkDQorCQkJCWNhc2UgJ1xyJzogcmV0dXJuIG5leHRDaGFyID09ICdcbicgPyAiXHJcbiIgOiAiXHIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQl9DQogCQl9DQogCX0NCkBAIC0yMDgsNyArMjA4LDcgQEAKICAqLw0KIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoKSB7DQogCWlmIChmQ29udGVudHMgPT0gbnVsbCkNCi0JCXJldHVybiAiIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCiAJc3luY2hyb25pemVkIChmTG9jaykgew0KIAkJaWYgKGZHYXBTdGFydCA8IDApIHsNCiAJCQlyZXR1cm4gbmV3IFN0cmluZyhmQ29udGVudHMpOw0KQEAgLTI2MSw3ICsyNjEsNyBAQAogICovDQogcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsNCiAJaWYgKGZDb250ZW50cyA9PSBudWxsKQ0KLQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KIAlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7DQogCQlpZiAob2Zmc2V0ICsgbGVuZ3RoIDwgZkdhcFN0YXJ0KQ0KIAkJCXJldHVybiBuZXcgU3RyaW5nKGZDb250ZW50cywgb2Zmc2V0LCBsZW5ndGgpOw0KQEAgLTM3Myw5ICszNzMsOCBAQAogCQkJCWJ1ZmZlci5hcHBlbmQobGluZVNlcGFyYXRvcik7DQogCQkJCWlmIChuZXh0Q2hhciA9PSAnXG4nKSB7DQogCQkJCQluZXh0Q2hhciA9ICcgJzsNCi0JCQkJCWkrKzsNCiAJCQkJfQ0KLQkJCQlsaW5lU3RhcnQgPSBpKzE7DQorCQkJCWxpbmVTdGFydCA9IGkrMjsNCiAJCQkJYnJlYWs7DQogCQl9DQogCX0NCkBAIC02MTYsMTkgKzYxNSwxOSBAQAogCWNoYXJbXSBjb250ZW50cyA9IHRoaXMuZ2V0Q2hhcmFjdGVycygpOw0KIAlpbnQgbGVuZ3RoID0gY29udGVudHMubGVuZ3RoOw0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOw0KLQlidWZmZXIuYXBwZW5kKCJCdWZmZXI6XG4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIkJ1ZmZlcjpcbiIpOyAvLyROT04tTkxTLTEkDQogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCWNoYXIgY2FyID0gY29udGVudHNbaV07DQogCQlzd2l0Y2ggKGNhcikgew0KIAkJCWNhc2UgJ1xuJzogDQotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcblxuIi8qbm9uTkxTKi8pOw0KKwkJCQlidWZmZXIuYXBwZW5kKCJcXG5cbiIpOyAvLyROT04tTkxTLTEkDQogCQkJCWJyZWFrOw0KIAkJCWNhc2UgJ1xyJzoNCiAJCQkJaWYgKGkgPCBsZW5ndGgtMSAmJiBjb250ZW50c1tpKzFdID09ICdcbicpIHsNCi0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcclxcblxuIi8qbm9uTkxTKi8pOw0KKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyXFxuXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJaSsrOw0KIAkJCQl9IGVsc2Ugew0KLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyXG4iLypub25OTFMqLyk7DQorCQkJCQlidWZmZXIuYXBwZW5kKCJcXHJcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJCX0NCiAJCQkJYnJlYWs7DQogCQkJZGVmYXVsdDoNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZS5qYXZhCmluZGV4IGE5NTZiMGQuLmQ0YzVkYTUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZS5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiBwcm90ZWN0ZWQgQ2xhc3NGaWxlKElQYWNrYWdlRnJhZ21lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgew0KIAlzdXBlcihDTEFTU19GSUxFLCBwYXJlbnQsIG5hbWUpOw0KIAlpZiAoIVV0aWwuaXNDbGFzc0ZpbGVOYW1lKG5hbWUpKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbnZhbGlkQ2xhc3NGaWxlTmFtZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbnZhbGlkQ2xhc3NGaWxlTmFtZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTQyLDcgKzQyLDcgQEAKIHB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOw0KIAlpZiAoc291cmNlICE9IG51bGwpIHsNCi0JCUJhc2ljQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KGdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCksIGdldEVsZW1lbnROYW1lKCkgKyAiLmphdmEiLypub25OTFMqLyk7DQorCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9IG5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdChnZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpLCBnZXRFbGVtZW50TmFtZSgpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQNCiAJCWNvZGVDb21wbGV0ZShjdSwgY3UsIG9mZnNldCwgcmVxdWVzdG9yKTsNCiAJfQ0KIH0NCkBAIC01Niw3ICs1Niw3IEBACiAJCWNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsNCiAJCVN0cmluZyBuYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsNCiAJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNik7IC8vIHJlbW92ZSAiLmNsYXNzIg0KLQkJbmFtZSA9IG5hbWUgKyAiLmphdmEiLypub25OTFMqLzsNCisJCW5hbWUgPSBuYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJA0KIAkJQmFzaWNDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQmFzaWNDb21waWxhdGlvblVuaXQoY29udGVudHMsIG5hbWUpOw0KIAkJcmV0dXJuIHN1cGVyLmNvZGVTZWxlY3QoY3UsIG9mZnNldCwgbGVuZ3RoKTsNCiAJfSBlbHNlIHsNCkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJCQl6aXAgPSByb290LmdldEphcigpOw0KIAkJCQlTdHJpbmcgZW50cnlOYW1lID0gZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCiAJCQkJZW50cnlOYW1lID0gZW50cnlOYW1lLnJlcGxhY2UoJy4nLCAnLycpOw0KLQkJCQlpZiAoZW50cnlOYW1lLmVxdWFscygiIi8qbm9uTkxTKi8pKSB7DQorCQkJCWlmIChlbnRyeU5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJCQllbnRyeU5hbWUgKz0gZ2V0RWxlbWVudE5hbWUoKTsNCiAJCQkJfSBlbHNlIHsNCiAJCQkJCWVudHJ5TmFtZSArPSAnLycgKyBnZXRFbGVtZW50TmFtZSgpOw0KQEAgLTI3OCw3ICsyNzgsNyBAQAogcHVibGljIFdvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCkgew0KIAlTdHJpbmcgbmFtZSA9IGdldEVsZW1lbnROYW1lKCk7DQogCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNik7IC8vIHJlbW92ZSAiLmNsYXNzIg0KLQluYW1lID0gbmFtZSArICIuamF2YSIvKm5vbk5MUyovOw0KKwluYW1lID0gbmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIG5ldyBXb3JraW5nQ29weSgoSVBhY2thZ2VGcmFnbWVudCkgZ2V0UGFyZW50KCksIG5hbWUpOw0KIH0NCiAvKioNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEKaW5kZXggMmRiNWJhNy4uMzVjYTA5OSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlSW5mby5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZUluZm8uamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCQlmb3IgKGludCBpID0gMCwgdHlwZUNvdW50ID0gaW5uZXJUeXBlcy5sZW5ndGg7IGkgPCB0eXBlQ291bnQ7IGkrKykgew0KIAkJCUlCaW5hcnlOZXN0ZWRUeXBlIGJpbmFyeVR5cGUgPSBpbm5lclR5cGVzW2ldOw0KIAkJCVN0cmluZyBpbm5lclF1YWxpZmllZE5hbWUgPSBuZXcgU3RyaW5nKGJpbmFyeVR5cGUuZ2V0TmFtZSgpKTsNCi0JCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZT0gKChJUGFja2FnZUZyYWdtZW50KWZDbGFzc0ZpbGUuZ2V0UGFyZW50KCkpLmdldENsYXNzRmlsZShuZXcgU3RyaW5nKENsYXNzRmlsZS51bnF1YWxpZmllZE5hbWUoYmluYXJ5VHlwZS5nZXROYW1lKCkpKSArICIuY2xhc3MiLypub25OTFMqLyk7DQorCQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGU9ICgoSVBhY2thZ2VGcmFnbWVudClmQ2xhc3NGaWxlLmdldFBhcmVudCgpKS5nZXRDbGFzc0ZpbGUobmV3IFN0cmluZyhDbGFzc0ZpbGUudW5xdWFsaWZpZWROYW1lKGJpbmFyeVR5cGUuZ2V0TmFtZSgpKSkgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlJVHlwZSBpbm5lclR5cGUgPSBuZXcgQmluYXJ5VHlwZShjbGFzc0ZpbGUsIG5ldyBTdHJpbmcoQ2xhc3NGaWxlLnNpbXBsZU5hbWUoYmluYXJ5VHlwZS5nZXROYW1lKCkpKSk7DQogCQkJY2hpbGRyZW4uYWRkRWxlbWVudChpbm5lclR5cGUpOw0KIAkJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCmluZGV4IDhlYzk1YWQuLmQwYTY1ZmQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoRW50cnkuamF2YQpAQCAtMTcwLDM4ICsxNzAsMzggQEAKIAlidWZmZXIuYXBwZW5kKCdbJyk7DQogCXN3aXRjaCAoZ2V0RW50cnlLaW5kKCkpIHsNCiAJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOg0KLQkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9MSUJSQVJZIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9MSUJSQVJZIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOg0KLQkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9QUk9KRUNUIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9QUk9KRUNUIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6DQotCQkJYnVmZmVyLmFwcGVuZCgiQ1BFX1NPVVJDRSIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJDUEVfU09VUkNFIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToNCi0JCQlidWZmZXIuYXBwZW5kKCJDUEVfVkFSSUFCTEUiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiQ1BFX1ZBUklBQkxFIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCJdWyIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiXVsiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2ggKGdldENvbnRlbnRLaW5kKCkpIHsNCiAJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlk6DQotCQkJYnVmZmVyLmFwcGVuZCgiS19CSU5BUlkiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiS19CSU5BUlkiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRToNCi0JCQlidWZmZXIuYXBwZW5kKCJLX1NPVVJDRSIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJLX1NPVVJDRSIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUOg0KLQkJCWJ1ZmZlci5hcHBlbmQoIktfT1VUUFVUIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIktfT1VUUFVUIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KIAlidWZmZXIuYXBwZW5kKCddJyk7DQogCWlmIChnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwpew0KLQkJYnVmZmVyLmFwcGVuZCgiW3NvdXJjZVBhdGg6Ii8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiW3NvdXJjZVBhdGg6Iik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQoZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSk7DQogCQlidWZmZXIuYXBwZW5kKCddJyk7DQogCX0NCiAJaWYgKGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpICE9IG51bGwpew0KLQkJYnVmZmVyLmFwcGVuZCgiW3Jvb3RQYXRoOiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIltyb290UGF0aDoiKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmZmVyLmFwcGVuZChnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSk7DQogCQlidWZmZXIuYXBwZW5kKCddJyk7DQogCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQppbmRleCAyOGQ1MTI3Li5iNDJiOTVmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKICAqIAlvZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBmYWlscw0KICAqLw0KIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JYmVnaW5UYXNrKFV0aWwuYmluZCgid29ya2luZ0NvcHkuY29tbWl0Ii8qbm9uTkxTKi8pLCAyKTsNCisJYmVnaW5UYXNrKFV0aWwuYmluZCgid29ya2luZ0NvcHkuY29tbWl0IiksIDIpOyAvLyROT04tTkxTLTEkDQogCUlDb21waWxhdGlvblVuaXQgY29weSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KIAlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpIGNvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCk7DQogDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXQuamF2YQppbmRleCA4MzcyNTA0Li5mYWNlMjc3IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdChJUGFja2FnZUZyYWdtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsNCiAJc3VwZXIoQ09NUElMQVRJT05fVU5JVCwgcGFyZW50LCBuYW1lKTsNCiAJaWYgKCFVdGlsLmlzSmF2YUZpbGVOYW1lKG5hbWUpKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29udmVudGlvbi51bml0Lm5vdEphdmFOYW1lIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJjb252ZW50aW9uLnVuaXQubm90SmF2YU5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC03Nyw3ICs3Nyw3IEBACiAgKi8NCiBwdWJsaWMgdm9pZCBjb3B5KElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307DQogCUlKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMgPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07DQpAQCAtMTIwLDEwICsxMjAsMTAgQEAKIAlpZiAoIWV4aXN0cygpKSB7DQogCQkvL2F1dG9nZW5lcmF0ZSB0aGlzIGNvbXBpbGF0aW9uIHVuaXQNCiAJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGdldFBhcmVudCgpOw0KLQkJU3RyaW5nIHNvdXJjZSA9ICIiLypub25OTFMqLzsNCisJCVN0cmluZyBzb3VyY2UgPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAkJaWYgKHBrZy5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID4gMCkgew0KIAkJCS8vbm90IHRoZSBkZWZhdWx0IHBhY2thZ2UuLi5hZGQgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24NCi0JCQlzb3VyY2UgPSAicGFja2FnZSAiLypub25OTFMqLyArIHBrZy5nZXRFbGVtZW50TmFtZSgpICsgIjsiLypub25OTFMqLyArIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1I7DQorCQkJc291cmNlID0gInBhY2thZ2UgIiArIHBrZy5nZXRFbGVtZW50TmFtZSgpICsgIjsiICArIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IgKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0NCiAJCUNyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbiBvcCA9IG5ldyBDcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24ocGtnLCBmTmFtZSwgc291cmNlLCBmb3JjZSk7DQogCQlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOw0KQEAgLTE3Myw3ICsxNzMsNyBAQAogCQl9IGVsc2Ugew0KIAkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHR5cGVzIGluc2lkZSB0aGUgcmVjZWl2ZXIgYW5kIHNlZSBpZiBvbmUgb2YgdGhlbSBjYW4gZml0DQogCQkJSVR5cGVbXSB0eXBlcyA9IGdldFR5cGVzKCk7DQotCQkJU3RyaW5nIHR5cGVOb2RlTmFtZSA9IG5vZGVOYW1lLnN1YnN0cmluZygwLCBub2RlTmFtZS5pbmRleE9mKCIuamF2YSIvKm5vbk5MUyovKSk7DQorCQkJU3RyaW5nIHR5cGVOb2RlTmFtZSA9IG5vZGVOYW1lLnN1YnN0cmluZygwLCBub2RlTmFtZS5pbmRleE9mKCIuamF2YSIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KIAkJCQlpZiAodHlwZXNbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModHlwZU5vZGVOYW1lKSkgew0KIAkJCQkJcmV0dXJuIHRydWU7DQpAQCAtMzc4LDcgKzM3OCw3IEBACiAgKi8NCiBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlJQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlcigpOw0KLQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiAiIi8qbm9uTkxTKi87DQorCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIuZ2V0Q29udGVudHMoKTsNCiB9DQogLyoqDQpAQCAtNDcwLDcgKzQ3MCw3IEBACiAgKi8NCiBwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsNCiAJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9Ow0KQEAgLTU0MCw3ICs1NDAsNyBAQAogICovDQogcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxOYW1lIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsNCiAJSUphdmFFbGVtZW50W10gZGVzdHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpcy5nZXRQYXJlbnQoKX07DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YQppbmRleCBhY2VjYzcyLi5kYjZmNjI5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCWFkZFJlZmVyZW5jZShSZWZlcmVuY2VJbmZvLlJFRlRZUEVfY2FsbCwgbmFtZSk7DQogCX0NCiAJZWxzZSB7DQotCQlTdHJpbmcgbmFtZSA9ICI8Ii8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHR5cGVOYW1lKSArICI+LyIvKm5vbk5MUyovICsgYXJnQ291bnQ7ICANCisJCVN0cmluZyBuYW1lID0gIjwiICsgbmV3IFN0cmluZyh0eXBlTmFtZSkgKyAiPi8iICsgYXJnQ291bnQ7ICAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQlhZGRSZWZlcmVuY2UoUmVmZXJlbmNlSW5mby5SRUZUWVBFX2NhbGwsIG5hbWUudG9DaGFyQXJyYXkoKSk7DQogCX0NCiB9DQpAQCAtMTc4LDcgKzE3OCw3IEBACiAJLy8gdGFjayBvbiB0aGUgJy4qJyBpZiBpdCBpcyBvbkRlbWFuZA0KIAlTdHJpbmcgaW1wb3J0TmFtZTsNCiAJaWYgKG9uRGVtYW5kKSB7DQotCQlpbXBvcnROYW1lPSBuZXcgU3RyaW5nKG5hbWUpICsgIi4qIi8qbm9uTkxTKi87DQorCQlpbXBvcnROYW1lPSBuZXcgU3RyaW5nKG5hbWUpICsgIi4qIjsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJaW1wb3J0TmFtZT0gbmV3IFN0cmluZyhuYW1lKTsNCiAJfQ0KQEAgLTIzOSw3ICsyMzksNyBAQAogCQlhZGRSZWZlcmVuY2UoUmVmZXJlbmNlSW5mby5SRUZUWVBFX2NhbGwsIG5hbWUpOw0KIAl9DQogCWVsc2Ugew0KLQkJU3RyaW5nIG5hbWUgPSBuZXcgU3RyaW5nKG1ldGhvZE5hbWUpICsgIi8iLypub25OTFMqLyArIGFyZ0NvdW50OyAgDQorCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcobWV0aG9kTmFtZSkgKyAiLyIgKyBhcmdDb3VudDsgICAvLyROT04tTkxTLTEkDQogCQlhZGRSZWZlcmVuY2UoUmVmZXJlbmNlSW5mby5SRUZUWVBFX2NhbGwsIG5hbWUudG9DaGFyQXJyYXkoKSk7DQogCX0NCiB9DQpAQCAtNTU5LDEzICs1NTksMTMgQEAKIAkJaWYgKGZQYWNrYWdlTmFtZSA9PSBudWxsKSB7DQogCQkJcXVhbGlmaWVkTmFtZT0gbmFtZVN0cmluZy50b0NoYXJBcnJheSgpOw0KIAkJfSBlbHNlIHsNCi0JCQlxdWFsaWZpZWROYW1lPSAobmV3IFN0cmluZyhmUGFja2FnZU5hbWUpICsgIi4iLypub25OTFMqLyArIG5hbWVTdHJpbmcpLnRvQ2hhckFycmF5KCk7DQorCQkJcXVhbGlmaWVkTmFtZT0gKG5ldyBTdHJpbmcoZlBhY2thZ2VOYW1lKSArICIuIiArIG5hbWVTdHJpbmcpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAllbHNlIGlmIChwYXJlbnRIYW5kbGUuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgew0KIAkJaGFuZGxlID0gKChJVHlwZSkgcGFyZW50SGFuZGxlKS5nZXRUeXBlKG5hbWVTdHJpbmcpOw0KIAkJZW5jbG9zaW5nVHlwZU5hbWU9ICgoU291cmNlVHlwZUVsZW1lbnRJbmZvKXBhcmVudEluZm8pLmdldE5hbWUoKTsNCi0JCXF1YWxpZmllZE5hbWU9IChuZXcgU3RyaW5nKCgoU291cmNlVHlwZUVsZW1lbnRJbmZvKXBhcmVudEluZm8pLmdldFF1YWxpZmllZE5hbWUoKSkgKyAiLiIvKm5vbk5MUyovICsgbmFtZVN0cmluZykudG9DaGFyQXJyYXkoKTsNCisJCXF1YWxpZmllZE5hbWU9IChuZXcgU3RyaW5nKCgoU291cmNlVHlwZUVsZW1lbnRJbmZvKXBhcmVudEluZm8pLmdldFF1YWxpZmllZE5hbWUoKSkgKyAiLiIgKyBuYW1lU3RyaW5nKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJZWxzZSB7DQogCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgLy8gU2hvdWxkIG5vdCBoYXBwZW4NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRWaXNpdG9yLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRWaXNpdG9yLmphdmEKaW5kZXggOGEzYjhlYy4uMjdjNTUwNyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0VmlzaXRvci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFZpc2l0b3IuamF2YQpAQCAtMTksMTM4ICsxOSwxNjQgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsNCiANCiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0VmlzaXRvciBleHRlbmRzIENvbXBpbGVyIHsNCi0vKioNCi0gKiBBbnN3ZXIgYSBuZXcgQ29tcGlsYXRpb25Vbml0VmlzaXRvciB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgb3B0aW9ucy4NCi0gKiBUaGUgZW52aXJvbm1lbnQgYW5kIG9wdGlvbnMgd2lsbCBiZSBpbiBlZmZlY3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcGlsZXIuDQotICogV2hlbiB0aGUgY29tcGlsZXIgaXMgcnVuLCBjb21waWxhdGlvbiByZXN1bHRzIGFyZSBzZW50IHRvIHRoZSBnaXZlbiByZXF1ZXN0b3IuDQotICoNCi0gKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuZW52LklOYW1lRW52aXJvbm1lbnQNCi0gKiAgICAgIEVudmlyb25tZW50IHVzZWQgYnkgdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlc29sdmUgdHlwZSBhbmQgcGFja2FnZQ0KLSAqICAgICAgbmFtZXMuIFRoZSBuYW1lIGVudmlyb25tZW50IGltcGxlbWVudHMgdGhlIGFjdHVhbCBjb25uZWN0aW9uIG9mIHRoZSBjb21waWxlcg0KLSAqICAgICAgdG8gdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gaW4gYmF0Y2ggbW9kZSB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBwZXJmb3JtaW5nDQotICogICAgICBwdXJlIGZpbGUgYWNjZXNzZXMsIHJldXNlIHByZXZpb3VzIGJ1aWxkIHN0YXRlIG9yIGNvbm5lY3Rpb24gdG8gcmVwb3NpdG9yaWVzKS4NCi0gKiAgICAgIE5vdGU6IHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFjdHVhbCBjbGFzc3BhdGgNCi0gKiAgICAgICAgICAgIHJ1bGVzLg0KLSAqDQotICogIEBwYXJhbSBwb2xpY3kgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklFcnJvckhhbmRsaW5nUG9saWN5DQotICogICAgICBDb25maWd1cmFibGUgcGFydCBmb3IgcHJvYmxlbSBoYW5kbGluZywgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIGNsaWVudCB0bw0KLSAqICAgICAgc3BlY2lmeSB0aGUgcnVsZXMgZm9yIGhhbmRsaW5nIHByb2JsZW1zIChzdG9wIG9uIGZpcnN0IGVycm9yIG9yIGFjY3VtdWxhdGUNCi0gKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cNCi0gKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuDQotICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzDQotICogICAgICANCi0gKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLklDb21waWxlclJlcXVlc3Rvcg0KLSAqICAgICAgQ29tcG9uZW50IHdoaWNoIHdpbGwgcmVjZWl2ZSBhbmQgcGVyc2lzdCBhbGwgY29tcGlsYXRpb24gcmVzdWx0cyBhbmQgaXMgaW50ZW5kZWQNCi0gKiAgICAgIHRvIGNvbnN1bWUgdGhlbSBhcyB0aGV5IGFyZSBwcm9kdWNlZC4gVHlwaWNhbGx5LCBpbiBhIGJhdGNoIGNvbXBpbGVyLCBpdCBpcyANCi0gKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQotICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuQ29tcGlsYXRpb25SZXN1bHQNCi0gKg0KLSAqICBAcGFyYW0gcHJvYmxlbUZhY3Rvcnkgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklQcm9ibGVtRmFjdG9yeQ0KLSAqICAgICAgRmFjdG9yeSB1c2VkIGluc2lkZSB0aGUgY29tcGlsZXIgdG8gY3JlYXRlIHByb2JsZW0gZGVzY3JpcHRvcnMuIEl0IGFsbG93cyB0aGUNCi0gKiAgICAgIGNvbXBpbGVyIGNsaWVudCB0byBzdXBwbHkgaXRzIG93biByZXByZXNlbnRhdGlvbiBvZiBjb21waWxhdGlvbiBwcm9ibGVtcyBpbg0KLSAqICAgICAgb3JkZXIgdG8gYXZvaWQgb2JqZWN0IGNvbnZlcnNpb25zLiBOb3RlIHRoYXQgdGhlIGZhY3RvcnkgaXMgbm90IHN1cHBvc2VkDQotICogICAgICB0byBhY2N1bXVsYXRlIHRoZSBjcmVhdGVkIHByb2JsZW1zLCB0aGUgY29tcGlsZXIgd2lsbCBnYXRoZXIgdGhlbSBhbGwgYW5kIGhhbmQNCi0gKiAgICAgIHRoZW0gYmFjayBhcyBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdC4NCi0gKi8NCi1wdWJsaWMgQ29tcGlsYXRpb25Vbml0VmlzaXRvcigNCi0JSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgDQotCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwgDQotCUNvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzLCANCi0JSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwgDQotCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgew0KLQkJDQotCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIHNldHRpbmdzLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsNCi19DQotLyoqDQotICogQWRkIGFuIGFkZGl0aW9uYWwgc291cmNlIHR5cGUNCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGUgc291cmNlVHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCi0JQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGUuZ2V0RmlsZU5hbWUoKSwgMSwgMSk7IC8vIG5lZWQgdG8gaG9sZCBvbnRvIHRoaXMNCi0JQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9DQotCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVR5cGUsIHRydWUsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsNCisJDQorCS8qKg0KKwkgKiBBbnN3ZXIgYSBuZXcgQ29tcGlsYXRpb25Vbml0VmlzaXRvciB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgb3B0aW9ucy4NCisJICogVGhlIGVudmlyb25tZW50IGFuZCBvcHRpb25zIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBpbGVyLg0KKwkgKiBXaGVuIHRoZSBjb21waWxlciBpcyBydW4sIGNvbXBpbGF0aW9uIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGdpdmVuIHJlcXVlc3Rvci4NCisJICoNCisJICogIEBwYXJhbSBlbnZpcm9ubWVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLmVudi5JTmFtZUVudmlyb25tZW50DQorCSAqICAgICAgRW52aXJvbm1lbnQgdXNlZCBieSB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0eXBlIGFuZCBwYWNrYWdlDQorCSAqICAgICAgbmFtZXMuIFRoZSBuYW1lIGVudmlyb25tZW50IGltcGxlbWVudHMgdGhlIGFjdHVhbCBjb25uZWN0aW9uIG9mIHRoZSBjb21waWxlcg0KKwkgKiAgICAgIHRvIHRoZSBvdXRzaWRlIHdvcmxkIChlLmcuIGluIGJhdGNoIG1vZGUgdGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcGVyZm9ybWluZw0KKwkgKiAgICAgIHB1cmUgZmlsZSBhY2Nlc3NlcywgcmV1c2UgcHJldmlvdXMgYnVpbGQgc3RhdGUgb3IgY29ubmVjdGlvbiB0byByZXBvc2l0b3JpZXMpLg0KKwkgKiAgICAgIE5vdGU6IHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFjdHVhbCBjbGFzc3BhdGgNCisJICogICAgICAgICAgICBydWxlcy4NCisJICoNCisJICogIEBwYXJhbSBwb2xpY3kgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklFcnJvckhhbmRsaW5nUG9saWN5DQorCSAqICAgICAgQ29uZmlndXJhYmxlIHBhcnQgZm9yIHByb2JsZW0gaGFuZGxpbmcsIGFsbG93aW5nIHRoZSBjb21waWxlciBjbGllbnQgdG8NCisJICogICAgICBzcGVjaWZ5IHRoZSBydWxlcyBmb3IgaGFuZGxpbmcgcHJvYmxlbXMgKHN0b3Agb24gZmlyc3QgZXJyb3Igb3IgYWNjdW11bGF0ZQ0KKwkgKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cNCisJICogICAgICBpbiBVSSB3aGVuIGNvbXBpbGluZyBpbnRlcmFjdGl2ZWx5Lg0KKwkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMNCisJICogICAgICANCisJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5JQ29tcGlsZXJSZXF1ZXN0b3INCisJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZA0KKwkgKiAgICAgIHRvIGNvbnN1bWUgdGhlbSBhcyB0aGV5IGFyZSBwcm9kdWNlZC4gVHlwaWNhbGx5LCBpbiBhIGJhdGNoIGNvbXBpbGVyLCBpdCBpcyANCisJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLg0KKwkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5Db21waWxhdGlvblJlc3VsdA0KKwkgKg0KKwkgKiAgQHBhcmFtIHByb2JsZW1GYWN0b3J5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5JUHJvYmxlbUZhY3RvcnkNCisJICogICAgICBGYWN0b3J5IHVzZWQgaW5zaWRlIHRoZSBjb21waWxlciB0byBjcmVhdGUgcHJvYmxlbSBkZXNjcmlwdG9ycy4gSXQgYWxsb3dzIHRoZQ0KKwkgKiAgICAgIGNvbXBpbGVyIGNsaWVudCB0byBzdXBwbHkgaXRzIG93biByZXByZXNlbnRhdGlvbiBvZiBjb21waWxhdGlvbiBwcm9ibGVtcyBpbg0KKwkgKiAgICAgIG9yZGVyIHRvIGF2b2lkIG9iamVjdCBjb252ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBmYWN0b3J5IGlzIG5vdCBzdXBwb3NlZA0KKwkgKiAgICAgIHRvIGFjY3VtdWxhdGUgdGhlIGNyZWF0ZWQgcHJvYmxlbXMsIHRoZSBjb21waWxlciB3aWxsIGdhdGhlciB0aGVtIGFsbCBhbmQgaGFuZA0KKwkgKiAgICAgIHRoZW0gYmFjayBhcyBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdC4NCisJICovDQorCXB1YmxpYyBDb21waWxhdGlvblVuaXRWaXNpdG9yKA0KKwkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwNCisJCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzLA0KKwkJSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwNCisJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgew0KIA0KLQlpZiAodW5pdCAhPSBudWxsKSB7DQotCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOw0KLQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0LCB0cnVlKTsNCisJCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIHNldHRpbmdzLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsNCiAJfQ0KLX0NCi0vKg0KLSAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbg0KLSAqLw0KLXByb3RlY3RlZCBzdGF0aWMgSUVycm9ySGFuZGxpbmdQb2xpY3kgZ2V0SGFuZGxpbmdQb2xpY3koKSB7DQogDQotCS8vIHBhc3NlcyB0aGUgaW5pdGlhbCBzZXQgb2YgZmlsZXMgdG8gdGhlIGJhdGNoIG9yYWNsZSAodG8gYXZvaWQgZmluZGluZyBtb3JlIHRoYW4gb25jZSB0aGUgc2FtZSB1bml0cyB3aGVuIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gpCQ0KLQlyZXR1cm4gbmV3IElFcnJvckhhbmRsaW5nUG9saWN5KCkgew0KLQkJcHVibGljIGJvb2xlYW4gc3RvcE9uRmlyc3RFcnJvcigpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlwdWJsaWMgYm9vbGVhbiBwcm9jZWVkT25FcnJvcnMoKSB7DQotCQkJcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGlmIHRoZXJlIGFyZSBzb21lIGVycm9ycyANCi0JCX0NCi0JfTsNCi19DQotcHJvdGVjdGVkIHN0YXRpYyBJTmFtZUVudmlyb25tZW50IGdldE5hbWVFbnZpcm9ubWVudChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQlyZXR1cm4gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgc291cmNlVW5pdC5nZXRKYXZhUHJvamVjdCgpKQ0KLQkJCQkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOw0KLX0NCi0vKg0KLSAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbg0KLSAqLw0KLXByb3RlY3RlZCBzdGF0aWMgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0T3B0aW9ucygpIHsNCi0JQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKCk7DQotCXJldHVybiBvcHRpb25zLmdldENvbmZpZ3VyYWJsZU9wdGlvbnMoTG9jYWxlLmdldERlZmF1bHQoKSk7DQotfQ0KLS8qDQotICogQW5zd2VyIHRoZSBjb21wb25lbnQgdG8gd2hpY2ggd2lsbCBiZSBoYW5kZWQgYmFjayBjb21waWxhdGlvbiByZXN1bHRzIGZyb20gdGhlIGNvbXBpbGVyDQotICovDQotcHJvdGVjdGVkIHN0YXRpYyBJQ29tcGlsZXJSZXF1ZXN0b3IgZ2V0UmVxdWVzdG9yKCkgew0KLQlyZXR1cm4gbmV3IElDb21waWxlclJlcXVlc3RvcigpIHsNCi0JCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgew0KLQkJfQ0KLQl9Ow0KLX0NCi1wdWJsaWMgc3RhdGljIHZvaWQgdmlzaXQoSUNvbXBpbGF0aW9uVW5pdCB1bml0RWxlbWVudCwgSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQ0KLQlDb21waWxhdGlvblVuaXRWaXNpdG9yIGNvbXBpbGF0aW9uVW5pdFZpc2l0b3IgPSBuZXcgQ29tcGlsYXRpb25Vbml0VmlzaXRvcigNCi0JCWdldE5hbWVFbnZpcm9ubWVudCh1bml0RWxlbWVudCksDQotCQlnZXRIYW5kbGluZ1BvbGljeSgpLA0KLQkJZ2V0T3B0aW9ucygpLA0KLQkJZ2V0UmVxdWVzdG9yKCksDQotCQlnZXRQcm9ibGVtRmFjdG9yeSh2aXNpdG9yKSk7DQorCS8qKg0KKwkgKiBBZGQgYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMNCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KKwkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0NCisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZXNbMF0uZ2V0RmlsZU5hbWUoKSwgMSwgMSk7DQorCQkvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzDQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0NCisJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KA0KKwkJCQlzb3VyY2VUeXBlcywNCisJCQkJdHJ1ZSwNCisJCQkJdHJ1ZSwNCisJCQkJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLA0KKwkJCQlyZXN1bHQpOw0KIA0KLQkNCi0JQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7DQotCXRyeSB7DQotCQl1bml0ID0gY29tcGlsYXRpb25Vbml0VmlzaXRvci5yZXNvbHZlKA0KLQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoDQotCQkJCQl1bml0RWxlbWVudC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpLCANCi0JCQkJCXVuaXRFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpKTsNCiAJCWlmICh1bml0ICE9IG51bGwpIHsNCi0JCQl1bml0LnRyYXZlcnNlKHZpc2l0b3IsIHVuaXQuc2NvcGUpOw0KLQkJfQkJDQotCX0gZmluYWxseSB7DQotCQlpZiAodW5pdCAhPSBudWxsKSB7DQotCQkJdW5pdC5jbGVhblVwKCk7DQorCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0KTsNCisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOw0KIAkJfQ0KIAl9DQotfQ0KIA0KLXByb3RlY3RlZCBzdGF0aWMgSVByb2JsZW1GYWN0b3J5IGdldFByb2JsZW1GYWN0b3J5KGZpbmFsIElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IpIHsNCisJLyoNCisJICogIExvdy1sZXZlbCBBUEkgcGVyZm9ybWluZyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIElFcnJvckhhbmRsaW5nUG9saWN5IGdldEhhbmRsaW5nUG9saWN5KCkgew0KIA0KLQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKXsNCi0JCXB1YmxpYyBJUHJvYmxlbSBjcmVhdGVQcm9ibGVtKGNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLCBpbnQgcHJvYmxlbUlkLCBTdHJpbmdbXSBhcmd1bWVudHMsIGludCBzZXZlcml0eSwgaW50IHN0YXJ0UG9zaXRpb24sIGludCBlbmRQb3NpdGlvbiwgaW50IGxpbmVOdW1iZXIpIHsNCisJCS8vIHBhc3NlcyB0aGUgaW5pdGlhbCBzZXQgb2YgZmlsZXMgdG8gdGhlIGJhdGNoIG9yYWNsZSAodG8gYXZvaWQgZmluZGluZyBtb3JlIHRoYW4gb25jZSB0aGUgc2FtZSB1bml0cyB3aGVuIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gpCQ0KKwkJcmV0dXJuIG5ldyBJRXJyb3JIYW5kbGluZ1BvbGljeSgpIHsNCisJCQlwdWJsaWMgYm9vbGVhbiBzdG9wT25GaXJzdEVycm9yKCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCXB1YmxpYyBib29sZWFuIHByb2NlZWRPbkVycm9ycygpIHsNCisJCQkJcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGlmIHRoZXJlIGFyZSBzb21lIGVycm9ycyANCisJCQl9DQorCQl9Ow0KKwl9DQogDQotCQkJSVByb2JsZW0gcHJvYmxlbSA9IHN1cGVyLmNyZWF0ZVByb2JsZW0oDQotCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUsDQotCQkJCXByb2JsZW1JZCwNCi0JCQkJYXJndW1lbnRzLA0KLQkJCQlzZXZlcml0eSwNCi0JCQkJc3RhcnRQb3NpdGlvbiwNCi0JCQkJZW5kUG9zaXRpb24sDQotCQkJCWxpbmVOdW1iZXIpOw0KLQkJCXZpc2l0b3IuYWNjZXB0UHJvYmxlbShwcm9ibGVtKTsNCi0JCQlyZXR1cm4gcHJvYmxlbTsNCisJcHJvdGVjdGVkIHN0YXRpYyBJTmFtZUVudmlyb25tZW50IGdldE5hbWVFbnZpcm9ubWVudChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpDQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCisJCXJldHVybiAoU2VhcmNoYWJsZUVudmlyb25tZW50KSAoKEphdmFQcm9qZWN0KSBzb3VyY2VVbml0LmdldEphdmFQcm9qZWN0KCkpDQorCQkJLmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsNCisJfQ0KKw0KKwkvKg0KKwkgKiAgTG93LWxldmVsIEFQSSBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgY29tcGlsYXRpb24NCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0T3B0aW9ucygpIHsNCisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKTsNCisJfQ0KKw0KKwkvKg0KKwkgKiBBbnN3ZXIgdGhlIGNvbXBvbmVudCB0byB3aGljaCB3aWxsIGJlIGhhbmRlZCBiYWNrIGNvbXBpbGF0aW9uIHJlc3VsdHMgZnJvbSB0aGUgY29tcGlsZXINCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgSUNvbXBpbGVyUmVxdWVzdG9yIGdldFJlcXVlc3RvcigpIHsNCisJCXJldHVybiBuZXcgSUNvbXBpbGVyUmVxdWVzdG9yKCkgew0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgew0KKwkJCX0NCisJCX07DQorCX0NCisNCisJcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0KA0KKwkJSUNvbXBpbGF0aW9uVW5pdCB1bml0RWxlbWVudCwNCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IpDQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCisNCisJCUNvbXBpbGF0aW9uVW5pdFZpc2l0b3IgY29tcGlsYXRpb25Vbml0VmlzaXRvciA9DQorCQkJbmV3IENvbXBpbGF0aW9uVW5pdFZpc2l0b3IoDQorCQkJCWdldE5hbWVFbnZpcm9ubWVudCh1bml0RWxlbWVudCksDQorCQkJCWdldEhhbmRsaW5nUG9saWN5KCksDQorCQkJCWdldE9wdGlvbnMoKSwNCisJCQkJZ2V0UmVxdWVzdG9yKCksDQorCQkJCWdldFByb2JsZW1GYWN0b3J5KHZpc2l0b3IpKTsNCisNCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQl1bml0ID0NCisJCQkJY29tcGlsYXRpb25Vbml0VmlzaXRvci5yZXNvbHZlKA0KKwkJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KA0KKwkJCQkJCXVuaXRFbGVtZW50LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCksDQorCQkJCQkJdW5pdEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSkpOw0KKwkJCWlmICh1bml0ICE9IG51bGwpIHsNCisJCQkJdW5pdC50cmF2ZXJzZSh2aXNpdG9yLCB1bml0LnNjb3BlKTsNCisJCQl9DQorCQl9IGZpbmFsbHkgew0KKwkJCWlmICh1bml0ICE9IG51bGwpIHsNCisJCQkJdW5pdC5jbGVhblVwKCk7DQorCQkJfQ0KIAkJfQ0KLQl9Ow0KLX0NCi19DQorCX0NCisNCisJcHJvdGVjdGVkIHN0YXRpYyBJUHJvYmxlbUZhY3RvcnkgZ2V0UHJvYmxlbUZhY3RvcnkoZmluYWwgSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvcikgew0KKw0KKwkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkgew0KKwkJCXB1YmxpYyBJUHJvYmxlbSBjcmVhdGVQcm9ibGVtKA0KKwkJCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwNCisJCQkJaW50IHByb2JsZW1JZCwNCisJCQkJU3RyaW5nW10gYXJndW1lbnRzLA0KKwkJCQlpbnQgc2V2ZXJpdHksDQorCQkJCWludCBzdGFydFBvc2l0aW9uLA0KKwkJCQlpbnQgZW5kUG9zaXRpb24sDQorCQkJCWludCBsaW5lTnVtYmVyKSB7DQorDQorCQkJCUlQcm9ibGVtIHByb2JsZW0gPQ0KKwkJCQkJc3VwZXIuY3JlYXRlUHJvYmxlbSgNCisJCQkJCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLA0KKwkJCQkJCXByb2JsZW1JZCwNCisJCQkJCQlhcmd1bWVudHMsDQorCQkJCQkJc2V2ZXJpdHksDQorCQkJCQkJc3RhcnRQb3NpdGlvbiwNCisJCQkJCQllbmRQb3NpdGlvbiwNCisJCQkJCQlsaW5lTnVtYmVyKTsNCisJCQkJdmlzaXRvci5hY2NlcHRQcm9ibGVtKHByb2JsZW0pOw0KKwkJCQlyZXR1cm4gcHJvYmxlbTsNCisJCQl9DQorCQl9Ow0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggNDg1OGJhZi4uNzI0MjA2ZSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKICAqIGZvciBwcm9ncmVzcyBtb25pdG9yaW5nLg0KICAqLw0KIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgew0KLQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY29weUVsZW1lbnRQcm9ncmVzcyIvKm5vbk5MUyovKTsNCisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNvcHlFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgb3BlcmF0aW9uIHRvIHVzZSBmb3IgcHJvY2Vzc2luZyB0aGlzIGVsZW1lbnQNCkBAIC04Myw3ICs4Myw3IEBACiAJCQkJcmV0dXJuIG5ldyBDcmVhdGVJbXBvcnRPcGVyYXRpb24oZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCAoSUNvbXBpbGF0aW9uVW5pdCkgZGVzdCk7DQogCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6DQogCQkJCWlmIChpc1JlbmFtaW5nTWFpblR5cGUoZWxlbWVudCwgZGVzdCkpIHsNCi0JCQkJCXJldHVybiBuZXcgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihuZXcgSUphdmFFbGVtZW50W10ge2Rlc3R9LCBuZXcgSUphdmFFbGVtZW50W10ge2Rlc3QuZ2V0UGFyZW50KCl9LCBuZXcgU3RyaW5nW117Z2V0TmV3TmFtZUZvcihlbGVtZW50KSArICIuamF2YSIvKm5vbk5MUyovfSwgZkZvcmNlKTsNCisJCQkJCXJldHVybiBuZXcgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihuZXcgSUphdmFFbGVtZW50W10ge2Rlc3R9LCBuZXcgSUphdmFFbGVtZW50W10ge2Rlc3QuZ2V0UGFyZW50KCl9LCBuZXcgU3RyaW5nW117Z2V0TmV3TmFtZUZvcihlbGVtZW50KSArICIuamF2YSJ9LCBmRm9yY2UpOyAvLyROT04tTkxTLTEkDQogCQkJCX0gZWxzZSB7DQogCQkJCQlyZXR1cm4gbmV3IENyZWF0ZVR5cGVPcGVyYXRpb24oZGVzdCwgZ2V0U291cmNlRm9yKGVsZW1lbnQpICsgSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUiwgZkZvcmNlKTsNCiAJCQkJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IDNmZTk1Y2QuLjRjNGFlMTIgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgKiBAc2VlIE11bHRpT3BlcmF0aW9uDQogICovDQogcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7DQotCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5jb3B5UmVzb3VyY2VQcm9ncmVzcyIvKm5vbk5MUyovKTsNCisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNvcHlSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogU2V0cyB0aGUgZGVsdGFzIHRvIHJlZ2lzdGVyIHRoZSBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgb3BlcmF0aW9uDQpAQCAtMzQyLDcgKzM0Miw3IEBACiAJCQl9DQogCQkJaWYgKCFuZXdGcmFnLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHNvdXJjZS5nZXRFbGVtZW50TmFtZSgpKSkgeyAvLyBpZiBwYWNrYWdlIGhhcyBiZWVuIHJlbmFtZWQsIHVwZGF0ZSB0aGUgY29tcGlsYXRpb24gdW5pdHMNCiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIvKm5vbk5MUyovKSkgew0KKwkJCQkJaWYgKHJlc291cmNlc1tpXS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCS8vIHdlIG9ubHkgY29uc2lkZXIgcG90ZW50aWFsIGNvbXBpbGF0aW9uIHVuaXRzDQogCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IG5ld0ZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KHJlc291cmNlc1tpXS5nZXROYW1lKCkpOw0KIAkJCQkJCUlET01Db21waWxhdGlvblVuaXQgZG9tQ1UgPSBmRmFjdG9yeS5jcmVhdGVDb21waWxhdGlvblVuaXQoY3UuZ2V0U291cmNlKCksIGN1LmdldEVsZW1lbnROYW1lKCkpOw0KQEAgLTQyOCw3ICs0MjgsNyBAQAogCWlmICghc2VlblBhY2thZ2VOb2RlICYmICFkZWZhdWx0UGFja2FnZSkgew0KIAkJLy90aGUgY3Ugd2FzIGluIGEgZGVmYXVsdCBwYWNrYWdlLi4ubm8gcGFja2FnZSBkZWNsYXJhdGlvbg0KIAkJLy9jcmVhdGUgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY3UNCi0JCUlET01QYWNrYWdlIHBrZyA9IGZGYWN0b3J5LmNyZWF0ZVBhY2thZ2UoInBhY2thZ2UgIi8qbm9uTkxTKi8gKyBwa2dOYW1lICsgIjsiLypub25OTFMqLyArIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KKwkJSURPTVBhY2thZ2UgcGtnID0gZkZhY3RvcnkuY3JlYXRlUGFja2FnZSgicGFja2FnZSAiICsgcGtnTmFtZSArICI7IiArIEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCWRvbUNVLmdldEZpcnN0Q2hpbGQoKS5pbnNlcnRTaWJsaW5nKHBrZyk7DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24uamF2YQppbmRleCAyYThjZTVmLi44Y2Y2MjNhIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24uamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgY29tcGlsYXRpb24gdW5pdC4NCiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCWJlZ2luVGFzayhVdGlsLmJpbmQoIm9wZXJhdGlvbi5jcmVhdGVVbml0UHJvZ3Jlc3MiLypub25OTFMqLyksIDIpOw0KKwliZWdpblRhc2soVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlVW5pdFByb2dyZXNzIiksIDIpOyAvLyROT04tTkxTLTEkDQogCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7DQogCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KIAlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBnZXRQYXJlbnRFbGVtZW50KCk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRmllbGRPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUZpZWxkT3BlcmF0aW9uLmphdmEKaW5kZXggNzlhYjc2Ni4uZmYwOWNjOCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRmllbGRPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVGaWVsZE9wZXJhdGlvbi5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZQ0KICAqLw0KIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7DQotCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5jcmVhdGVGaWVsZFByb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlRmllbGRQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIEJ5IGRlZmF1bHQgdGhlIG5ldyBmaWVsZCBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBsYXN0IGV4aXN0aW5nIGZpZWxkDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW1wb3J0T3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQppbmRleCBmNDBiMWZiLi45MTExZDhkIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQpAQCAtNzIsNyArNzIsNyBAQAogICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZXRNYWluVGFza05hbWUNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpew0KLQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlSW1wb3J0c1Byb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlSW1wb3J0c1Byb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogU2V0cyB0aGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBpbXBvcnQ6PHVsPg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUluaXRpYWxpemVyT3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhCmluZGV4IDQzNmVlNWEuLmIxNmU0NzkgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUluaXRpYWxpemVyT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24uamF2YQpAQCAtNzgsNyArNzgsNyBAQAogICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZXRNYWluVGFza05hbWUNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpew0KLQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlSW5pdGlhbGl6ZXJQcm9ncmVzcyIvKm5vbk5MUyovKTsNCisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZUluaXRpYWxpemVyUHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBCeSBkZWZhdWx0IHRoZSBuZXcgaW5pdGlhbGl6ZXIgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBleGlzdGluZyBpbml0aWFsaXplcg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZU1ldGhvZE9wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKaW5kZXggZDk5YTg1Mi4uOWNlNjZhYyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lDQogICovDQogcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZU1ldGhvZFByb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlTWV0aG9kUHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBAc2VlIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24jdmVyaWZ5TmFtZUNvbGxpc2lvbg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uLmphdmEKaW5kZXggMTRmZDk2Ni4uNGQ5MDI5OCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lDQogICovDQogcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVBhY2thZ2VQcm9ncmVzcyIvKm5vbk5MUyovKTsNCisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVBhY2thZ2VQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIFNldHMgdGhlIGNvcnJlY3QgcG9zaXRpb24gZm9yIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uOjx1bD4NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVQYWNrYWdlRnJhZ21lbnRPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhCmluZGV4IDhlOWM2OWUuLjNiZTk5MjAgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhCkBAIC01NCw5ICs1NCw5IEBACiAJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ld0phdmFFbGVtZW50RGVsdGEoKTsNCiAJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0UGFyZW50RWxlbWVudCgpOw0KIAlTdHJpbmdbXSBuYW1lcyA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lcyhmTmFtZSk7DQotCWJlZ2luVGFzayhVdGlsLmJpbmQoIm9wZXJhdGlvbi5jcmVhdGVQYWNrYWdlRnJhZ21lbnRQcm9ncmVzcyIvKm5vbk5MUyovKSwgbmFtZXMubGVuZ3RoKTsNCisJYmVnaW5UYXNrKFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVBhY2thZ2VGcmFnbWVudFByb2dyZXNzIiksIG5hbWVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQNCiAJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsNCi0JU3RyaW5nIHNpZGVFZmZlY3RQYWNrYWdlTmFtZSA9ICIiLypub25OTFMqLzsNCisJU3RyaW5nIHNpZGVFZmZlY3RQYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkDQogCVZlY3RvciByZXN1bHRFbGVtZW50cyA9IG5ldyBWZWN0b3IobmFtZXMubGVuZ3RoKTsNCiAJaW50IGk7DQogCWZvciAoaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgew0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YQppbmRleCA1OGU0ZDNjLi5hMGIwMmNlIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbi5qYXZhCkBAIC02NCwxMSArNjQsMTEgQEAKIHByb3RlY3RlZCBJRE9NTm9kZSBnZW5lcmF0ZVN5bnRheEluY29ycmVjdERPTSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAkvL2NyZWF0ZSBzb21lIGR1bW15IHNvdXJjZSB0byBnZW5lcmF0ZSBhIGRvbSBub2RlDQogCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWZmLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SICsgIiBwdWJsaWMgY2xhc3MgQSB7Ii8qbm9uTkxTKi8gKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsNCisJYnVmZi5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUiArICIgcHVibGljIGNsYXNzIEEgeyIgKyBKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJA0KIAlidWZmLmFwcGVuZChmU291cmNlKTsNCiAJYnVmZi5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUikuYXBwZW5kKCd9Jyk7DQotCUlET01Db21waWxhdGlvblVuaXQgZG9tQ1UgPSAobmV3IERPTUZhY3RvcnkoKSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGJ1ZmYudG9TdHJpbmcoKSwgIkEuamF2YSIvKm5vbk5MUyovKTsNCi0JSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZG9tQ1UuZ2V0Q2hpbGQoIkEiLypub25OTFMqLykuZ2V0Q2hpbGRyZW4oKS5uZXh0RWxlbWVudCgpOw0KKwlJRE9NQ29tcGlsYXRpb25Vbml0IGRvbUNVID0gKG5ldyBET01GYWN0b3J5KCkpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChidWZmLnRvU3RyaW5nKCksICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJA0KKwlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBkb21DVS5nZXRDaGlsZCgiQSIpLmdldENoaWxkcmVuKCkubmV4dEVsZW1lbnQoKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAobm9kZSAhPSBudWxsKSB7DQogCQlub2RlLnJlbW92ZSgpOw0KIAl9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhCmluZGV4IDlhMWEwOGQuLmQzYWM0ZjUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlT3BlcmF0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lDQogICovDQogcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVR5cGVQcm9ncmVzcyIvKm5vbk5MUyovKTsNCisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVR5cGVQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIDxjb2RlPklUeXBlPC9jb2RlPiB0aGUgbWVtYmVyIGlzIHRvIGJlIGNyZWF0ZWQgaW4uDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggMWYxYTJlNy4uOWI4NDc0ZSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlRWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAgKiBAc2VlIE11bHRpT3BlcmF0aW9uDQogICovDQogcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7DQotCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MiLypub25OTFMqLyk7DQorCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBHcm91cHMgdGhlIGVsZW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGVpciBjb21waWxhdGlvbiB1bml0Lg0KQEAgLTExMiw3ICsxMTIsNyBAQAogCQlpZiAoZS5leGlzdHMoKSkgew0KIAkJCUlET01Ob2RlIG5vZGUgPSAoKEphdmFFbGVtZW50KSBlKS5maW5kTm9kZShjdURPTSk7DQogCQkJLy8gVEJEDQotCQkJQXNzZXJ0LmlzVHJ1ZShub2RlICE9IG51bGwsIFV0aWwuYmluZCgiZWxlbWVudC5jYW5ub3RMb2NhdGUiLypub25OTFMqLywgZS5nZXRFbGVtZW50TmFtZSgpLCBjdURPTS5nZXROYW1lKCkpKTsNCisJCQlBc3NlcnQuaXNUcnVlKG5vZGUgIT0gbnVsbCwgVXRpbC5iaW5kKCJlbGVtZW50LmNhbm5vdExvY2F0ZSIsIGUuZ2V0RWxlbWVudE5hbWUoKSwgY3VET00uZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQlub2RlLnJlbW92ZSgpOw0KIAkJCWRlbHRhLnJlbW92ZWQoZSk7DQogCQkJaWYgKGUuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSU1QT1JUX0RFQ0xBUkFUSU9OKSB7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IDAxY2Y2ZGIuLjNiZmYyMDEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAKICAqIEBzZWUgTXVsdGlPcGVyYXRpb24NCiAgKi8NCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlUHJvZ3Jlc3MiLypub25OTFMqLyk7DQorCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogQHNlZSBNdWx0aU9wZXJhdGlvbi4gVGhpcyBtZXRob2QgZGVsZWdhdGUgdG8gPGNvZGU+ZGVsZXRlUmVzb3VyY2U8L2NvZGU+IG9yDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc29yLmphdmEKaW5kZXggNWIzNmY2Zi4uMWUyNWViNSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCkBAIC0zMTQsNyArMzE0LDcgQEAKIAlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQogCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQogCWV4dGVuc2lvbiA9IGV4dGVuc2lvbiA9PSBudWxsID8gbnVsbCA6IGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpOw0KLQlpZiAoImphciIvKm5vbk5MUyovLmVxdWFscyhleHRlbnNpb24pIHx8ICJ6aXAiLypub25OTFMqLy5lcXVhbHMoZXh0ZW5zaW9uKSkgew0KKwlpZiAoImphciIuZXF1YWxzKGV4dGVuc2lvbikgfHwgInppcCIuZXF1YWxzKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7DQogCQl0cnkgew0KIAkJCXByb2plY3RzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWwocmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkpLmdldEphdmFQcm9qZWN0cygpOw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydENvbnRhaW5lci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0Q29udGFpbmVyLmphdmEKaW5kZXggOTlkYjM1Mi4uYzc4ZWRmOSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0Q29udGFpbmVyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0Q29udGFpbmVyLmphdmEKQEAgLTEzLDcgKzEzLDcgQEAKICAqLw0KIHB1YmxpYyBjbGFzcyBJbXBvcnRDb250YWluZXIgZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50IGltcGxlbWVudHMgSUltcG9ydENvbnRhaW5lciB7DQogcHJvdGVjdGVkIEltcG9ydENvbnRhaW5lcihJQ29tcGlsYXRpb25Vbml0IHBhcmVudCkgew0KLQlzdXBlcihJTVBPUlRfQ09OVEFJTkVSLCBwYXJlbnQsICIiLypub25OTFMqLyk7DQorCXN1cGVyKElNUE9SVF9DT05UQUlORVIsIHBhcmVudCwgIiIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpDQpAQCAtMjUsNyArMjUsNyBAQAogICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkNCiAgKi8NCiBwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgew0KLQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBVdGlsLmJpbmQoImFzc2VydC5zaG91bGROb3RJbXBsZW1lbnQiLypub25OTFMqLykpOw0KKwlBc3NlcnQuaXNUcnVlKGZhbHNlLCBVdGlsLmJpbmQoImFzc2VydC5zaG91bGROb3RJbXBsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIDA7DQogfQ0KIC8qKg0KQEAgLTY1LDcgKzY1LDcgQEAKIAlpZiAoaW5mbyA9PSBudWxsIHx8ICEoaW5mbyBpbnN0YW5jZW9mIEphdmFFbGVtZW50SW5mbykpIHJldHVybjsNCiAJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylpbmZvKS5nZXRDaGlsZHJlbigpOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQkoKEphdmFFbGVtZW50KWNoaWxkcmVuW2ldKS50b1N0cmluZyh0YWIsIGJ1ZmZlcik7DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKaW5kZXggYmQ2ZjEyMC4uYmY0ZDQ1MyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGltcG9ydCBpcyBvbi1kZW1hbmQgKGVuZHMgd2l0aCAiLioiKQ0KICAqLw0KIHB1YmxpYyBib29sZWFuIGlzT25EZW1hbmQoKSB7DQotCXJldHVybiBmTmFtZS5lbmRzV2l0aCgiLioiLypub25OTFMqLyk7DQorCXJldHVybiBmTmFtZS5lbmRzV2l0aCgiLioiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKi8NCkBAIC01MSwxMCArNTEsMTAgQEAKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3Nlcw0KICAqLw0KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgew0KLQlidWZmZXIuYXBwZW5kKCJpbXBvcnQgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJpbXBvcnQgIik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsNCiAJaWYgKGluZm8gPT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplci5qYXZhCmluZGV4IDliY2JjYTUuLjlhYzNhN2QgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXIuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogLyogcGFja2FnZSAqLyBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIE1lbWJlciBpbXBsZW1lbnRzIElJbml0aWFsaXplciB7DQogDQogcHJvdGVjdGVkIEluaXRpYWxpemVyKElUeXBlIHBhcmVudCwgaW50IG9jY3VycmVuY2VDb3VudCkgew0KLQlzdXBlcihJTklUSUFMSVpFUiwgcGFyZW50LCAiIi8qbm9uTkxTKi8pOw0KKwlzdXBlcihJTklUSUFMSVpFUiwgcGFyZW50LCAiIik7IC8vJE5PTi1OTFMtMSQNCiAJLy8gMCBpcyBub3QgdmFsaWQ6IHRoaXMgZmlyc3Qgb2NjdXJyZW5jZSBpcyBvY2N1cnJlbmNlIDEuDQogCWlmIChvY2N1cnJlbmNlQ291bnQgPD0gMCkNCiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsNCkBAIC03MCwxNiArNzAsMTYgQEAKICAqLw0KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgew0KIAlpZiAoaW5mbyA9PSBudWxsKSB7DQotCQlidWZmZXIuYXBwZW5kKCI8aW5pdGlhbGl6ZXI+Ii8qbm9uTkxTKi8pOw0KLQkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCI8aW5pdGlhbGl6ZXI+Iik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCXRyeSB7DQogCQkJaWYgKEZsYWdzLmlzU3RhdGljKHRoaXMuZ2V0RmxhZ3MoKSkpIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KLQkJCWJ1ZmZlci5hcHBlbmQoImluaXRpYWxpemVyIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImluaXRpYWxpemVyIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiLypub25OTFMqLyArIGdldEVsZW1lbnROYW1lKCkpOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIjxKYXZhTW9kZWxFeGNlcHRpb24gaW4gdG9TdHJpbmcgb2YgIiArIGdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlGaWxlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YQppbmRleCA3MmQwOTE0Li4xNDczMTRlIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YQpAQCAtNjIsNiArNjIsNiBAQAogICogQHNlZSBJU3RvcmFnZSNpc1JlYWRPbmx5KCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIkphckVudHJ5RmlsZVsiLypub25OTFMqLyt0aGlzLnppcE5hbWUrIjo6Ii8qbm9uTkxTKi8rdGhpcy5lbnRyeU5hbWUrIl0iLypub25OTFMqLzsNCisJcmV0dXJuICJKYXJFbnRyeUZpbGVbIit0aGlzLnppcE5hbWUrIjo6Iit0aGlzLmVudHJ5TmFtZSsiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKaW5kZXggOTQ1YWMwMi4uMDBhNTQ1ZCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCQl0cnkgew0KIAkJCXZlcmlmeUF0dGFjaFNvdXJjZSh6aXBQYXRoKTsNCiAJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKFV0aWwuYmluZCgiZWxlbWVudC5hdHRhY2hpbmdTb3VyY2UiLypub25OTFMqLyksIDIpOw0KKwkJCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVsZW1lbnQuYXR0YWNoaW5nU291cmNlIiksIDIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCVNvdXJjZU1hcHBlciBtYXBwZXI9IG51bGw7DQogCQkJU291cmNlTWFwcGVyIG9sZE1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7DQpAQCAtMzc3LDE0ICszNzcsMTQgQEAKIAkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB0cnVlKTsNCiAJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKXsNCiAJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHRhcmdldDsNCi0JCQkJCWlmICgiamFyIi8qbm9uTkxTKi8uZXF1YWxzSWdub3JlQ2FzZShmaWxlLmdldEZpbGVFeHRlbnNpb24oKSkgfHwgInppcCIvKm5vbk5MUyovLmVxdWFsc0lnbm9yZUNhc2UoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsNCisJCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSB8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSl7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCXJldHVybiBlbnRyeTsNCiAJCQkJCX0NCiAJCQkJfQ0KIAkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKXsNCiAJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0Ow0KIAkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsNCi0JCQkJCWlmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIvKm5vbk5MUyovKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIvKm5vbk5MUyovKSl7DQorCQkJCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi5qYXIiKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKXsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQkJcmV0dXJuIGVudHJ5Ow0KIAkJCQkJfQ0KIAkJCQl9DQpAQCAtNDA1LDE0ICs0MDUsMTQgQEAKIAkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKXsNCiAJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB0YXJnZXQ7DQogCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsNCi0JCQkJCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi5qYXIiLypub25OTFMqLykgfHwgVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi56aXAiLypub25OTFMqLykpew0KKwkJCQkJCWlmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIpIHx8IFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuemlwIikpeyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQkJCQkJcmV0dXJuIGVudHJ5Ow0KIAkJCQkJCX0NCiAJCQkJCX0NCiAJCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUpew0KIAkJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0Ow0KIAkJCQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7DQotCQkJCQkJaWYgKFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuamFyIi8qbm9uTkxTKi8pIHx8IFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuemlwIi8qbm9uTkxTKi8pKXsNCisJCQkJCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi5qYXIiKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKXsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQkJCXJldHVybiBlbnRyeTsNCiAJCQkJCQl9DQogCQkJCQl9DQpAQCAtNTAzLDcgKzUwMyw3IEBACiAJCQkJaWYgKHJlY29tbWVuZGF0aW9uICE9IG51bGwpew0KIAkJCQkJcHJvcGVydHlTdHJpbmcgPSByZWNvbW1lbmRhdGlvbi5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLnRvU3RyaW5nKCkgDQogCQkJCQkJCQkJCSsgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIgDQotCQkJCQkJCQkJCSsgKHJlY29tbWVuZGF0aW9uLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpID09IG51bGwgPyAiIi8qbm9uTkxTKi8gOiByZWNvbW1lbmRhdGlvbi5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpKTsNCisJCQkJCQkJCQkJKyAocmVjb21tZW5kYXRpb24uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgPT0gbnVsbCA/ICIiIDogcmVjb21tZW5kYXRpb24uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkocU5hbWUsIHByb3BlcnR5U3RyaW5nKTsNCiAJCQkJfQ0KIAkJCX0NCkBAIC01MjAsNyArNTIwLDcgQEAKIAkJWmlwRmlsZSBqYXJGaWxlID0gbnVsbDsNCiAJCXRyeSB7DQogCQkJamFyRmlsZSA9IGdldEphcigpOw0KLQkJCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJzb3VyY2VhdHRhY2htZW50OiAiLypub25OTFMqLyArIGphckZpbGUuZ2V0TmFtZSgpKTsNCisJCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoSmF2YUNvcmUuUExVR0lOX0lELCAic291cmNlYXR0YWNobWVudDogIiArIGphckZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsNCiAJCX0gZmluYWxseSB7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEKaW5kZXggMjg2YmNkMy4uYmM4ODNkNCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAgKi8NCiBwcm90ZWN0ZWQgSmF2YUVsZW1lbnQoaW50IHR5cGUsIElKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCiAJaWYgKHR5cGUgPCBKQVZBX01PREVMIHx8IHR5cGUgPiBJTVBPUlRfREVDTEFSQVRJT04pIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmludmFsaWRUeXBlIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmludmFsaWRUeXBlIikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJZkxFVHlwZT0gdHlwZTsNCiAJZlBhcmVudD0gcGFyZW50Ow0KQEAgLTI1NCw3ICsyNTQsNyBAQAogICoNCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvciBub3QgYWNjZXNzaWJsZQ0KICAqLw0KLXByb3RlY3RlZCBKYXZhRWxlbWVudEluZm8gZ2V0RWxlbWVudEluZm8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCitwdWJsaWMgSmF2YUVsZW1lbnRJbmZvIGdldEVsZW1lbnRJbmZvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCXN5bmNocm9uaXplZChmZ0phdmFNb2RlbE1hbmFnZXIpew0KIAkJT2JqZWN0IGluZm8gPSBmZ0phdmFNb2RlbE1hbmFnZXIuZ2V0SW5mbyh0aGlzKTsNCiAJCWlmIChpbmZvID09IG51bGwpIHsNCkBAIC01MTYsNyArNTE2LDcgQEAKIHByb3RlY3RlZCBTdHJpbmcgdGFiU3RyaW5nKGludCB0YWIpIHsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJZm9yIChpbnQgaSA9IHRhYjsgaSA+IDA7IGktLSkNCi0JCWJ1ZmZlci5hcHBlbmQoIiAgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIC8qKg0KQEAgLTU1NCwxMSArNTU0LDExIEBACiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0FuY2VzdG9ycyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7DQogCUphdmFFbGVtZW50IHBhcmVudCA9IChKYXZhRWxlbWVudCl0aGlzLmdldFBhcmVudCgpOw0KIAlpZiAocGFyZW50ICE9IG51bGwpIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIiBbaW4gIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIFtpbiAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJT2JqZWN0IHBhcmVudEluZm8gPSBmZ0phdmFNb2RlbE1hbmFnZXIuZ2V0SW5mbyhwYXJlbnQpOw0KIAkJcGFyZW50LnRvU3RyaW5nSW5mbygwLCBidWZmZXIsIHBhcmVudEluZm8pOw0KIAkJcGFyZW50LnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7DQotCQlidWZmZXIuYXBwZW5kKCJdIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtNTY4LDcgKzU2OCw3IEBACiAJaWYgKGluZm8gPT0gbnVsbCB8fCAhKGluZm8gaW5zdGFuY2VvZiBKYXZhRWxlbWVudEluZm8pKSByZXR1cm47DQogCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChKYXZhRWxlbWVudEluZm8paW5mbykuZ2V0Q2hpbGRyZW4oKTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJYnVmZmVyLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQkoKEphdmFFbGVtZW50KWNoaWxkcmVuW2ldKS50b1N0cmluZyh0YWIgKyAxLCBidWZmZXIpOw0KIAl9DQogfQ0KQEAgLTU3OCw3ICs1NzgsNyBAQAogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7DQogCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7DQogCWlmIChpbmZvID09IG51bGwpIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YQppbmRleCAzNWZkMGUwLi40NzIyNTY3IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhCkBAIC00NzcsNyArNDc3LDcgQEAKIAkJYnVmZmVyLmFwcGVuZCgnXHQnKTsNCiAJfQ0KIAlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnQpZ2V0RWxlbWVudCgpKS50b0RlYnVnU3RyaW5nKCkpOw0KLQlidWZmZXIuYXBwZW5kKCJbIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJbIik7IC8vJE5PTi1OTFMtMSQNCiAJc3dpdGNoIChnZXRLaW5kKCkpIHsNCiAJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOg0KIAkJCWJ1ZmZlci5hcHBlbmQoJysnKTsNCkBAIC00OTIsNjggKzQ5Miw2OCBAQAogCQkJYnVmZmVyLmFwcGVuZCgnPycpOw0KIAkJCWJyZWFrOw0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIl06IHsiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIl06IHsiKTsgLy8kTk9OLU5MUy0xJA0KIAlpbnQgY2hhbmdlRmxhZ3MgPSBnZXRGbGFncygpOw0KIAlib29sZWFuIHByZXYgPSBmYWxzZTsNCiAJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApIHsNCiAJCWlmIChwcmV2KQ0KLQkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIvKm5vbk5MUyovKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIkNISUxEUkVOIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCJDSElMRFJFTiIpOyAvLyROT04tTkxTLTEkDQogCQlwcmV2ID0gdHJ1ZTsNCiAJfQ0KIAlpZiAoKGNoYW5nZUZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJDT05URU5UIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCJDT05URU5UIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pICE9IDApIHsNCiAJCWlmIChwcmV2KQ0KLQkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIvKm5vbk5MUyovKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIk1PVkVEX0ZST00oIi8qbm9uTkxTKi8gKyAoKEphdmFFbGVtZW50KWdldE1vdmVkRnJvbUVsZW1lbnQoKSkudG9EZWJ1Z1N0cmluZygpICsgIikiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIk1PVkVEX0ZST00oIiArICgoSmF2YUVsZW1lbnQpZ2V0TW92ZWRGcm9tRWxlbWVudCgpKS50b0RlYnVnU3RyaW5nKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJNT1ZFRF9UTygiLypub25OTFMqLyArICgoSmF2YUVsZW1lbnQpZ2V0TW92ZWRUb0VsZW1lbnQoKSkudG9EZWJ1Z1N0cmluZygpICsgIikiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIk1PVkVEX1RPKCIgKyAoKEphdmFFbGVtZW50KWdldE1vdmVkVG9FbGVtZW50KCkpLnRvRGVidWdTdHJpbmcoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJcHJldiA9IHRydWU7DQogCX0NCiAJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJBRERFRCBUTyBDTEFTU1BBVEgiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIkFEREVEIFRPIENMQVNTUEFUSCIpOyAvLyROT04tTkxTLTEkDQogCQlwcmV2ID0gdHJ1ZTsNCiAJfQ0KIAlpZiAoKGNoYW5nZUZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJSRU1PVkVEIEZST00gQ0xBU1NQQVRIIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCJSRU1PVkVEIEZST00gQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9SRU9SREVSKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJSRU9SREVSRUQgSU4gQ0xBU1NQQVRIIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCJSRU9SREVSRUQgSU4gQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PRElGSUVSUykgIT0gMCkgew0KIAkJaWYgKHByZXYpDQotCQkJYnVmZmVyLmFwcGVuZCgiIHwgIi8qbm9uTkxTKi8pOw0KLQkJYnVmZmVyLmFwcGVuZCgiTU9ESUZJRVJTIENIQU5HRUQiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQNCisJCWJ1ZmZlci5hcHBlbmQoIk1PRElGSUVSUyBDSEFOR0VEIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NVUEVSX1RZUEVTKSAhPSAwKSB7DQogCQlpZiAocHJldikNCi0JCQlidWZmZXIuYXBwZW5kKCIgfCAiLypub25OTFMqLyk7DQotCQlidWZmZXIuYXBwZW5kKCJTVVBFUiBUWVBFUyBDSEFOR0VEIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkDQorCQlidWZmZXIuYXBwZW5kKCJTVVBFUiBUWVBFUyBDSEFOR0VEIik7IC8vJE5PTi1OTFMtMSQNCiAJCXByZXYgPSB0cnVlOw0KIAl9DQotCWJ1ZmZlci5hcHBlbmQoIn0iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJA0KIAlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOw0KIAlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnREZWx0YSkgY2hpbGRyZW5baV0pLnRvRGVidWdTdHJpbmcoZGVwdGggKyAxKSk7DQogCQl9DQogCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIuamF2YQppbmRleCAzYTliZTFkLi5kOTYyMWQ1IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGFCdWlsZGVyLmphdmEKQEAgLTQyMiw3ICs0MjIsNyBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1ZmZlci5hcHBlbmQoIkJ1aWx0IGRlbHRhOlxuIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJCdWlsdCBkZWx0YTpcbiIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQodGhpcy5kZWx0YS50b1N0cmluZygpKTsNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhCmluZGV4IGEzNTliZTguLjM3Njg1YjYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhCkBAIC0zNSw3ICszNSw3IEBACiAgKiBAZXhjZXB0aW9uIEVycm9yIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZQ0KICAqLw0KIHByb3RlY3RlZCBKYXZhTW9kZWwoSVdvcmtzcGFjZSB3b3Jrc3BhY2UpIHRocm93cyBFcnJvciB7DQotCXN1cGVyKEpBVkFfTU9ERUwsIG51bGwsICIiLypub25OTFMqLyAvKndvcmtzcGFjZSBoYXMgZW1wdHkgbmFtZSovKTsNCisJc3VwZXIoSkFWQV9NT0RFTCwgbnVsbCwgIiIgLyp3b3Jrc3BhY2UgaGFzIGVtcHR5IG5hbWUqLyk7IC8vJE5PTi1OTFMtMSQNCiAJdGhpcy53b3Jrc3BhY2UgPSB3b3Jrc3BhY2U7DQogfQ0KIHByaXZhdGUgdm9pZCBjbGVhbnVwQ3ljbGVNYXJrZXJzKCkgew0KQEAgLTEwMiwxMCArMTAyLDkgQEAKIAkJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IpIHsNCiAJCQkJdHJ5IHsNCiAJCQkJCUlNYXJrZXIgbWFya2VyID0gdGhpcy53b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoZGVwZW5kZW50UHJvamVjdE5hbWUpLmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLlRSQU5TSUVOVF9QUk9CTEVNKTsNCi0JCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jeWNsZSIvKm5vbk5MUyovKSk7DQotCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksIElNYXJrZXIuUFJJT1JJVFlfSElHSCk7DQotCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIGRlcGVuZGVudFByb2plY3ROYW1lKTsNCi0JCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5DWUNMRV9ERVRFQ1RFRCwgZGVwZW5kZW50UHJvamVjdE5hbWUpOw0KKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoDQorCQkJCQkJbmV3IFN0cmluZ1tdeyBJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuUFJJT1JJVFksIElNYXJrZXIuTE9DQVRJT04sIElKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUR9LA0KKwkJCQkJCW5ldyBPYmplY3RbXXsgVXRpbC5iaW5kKCJjbGFzc3BhdGguY3ljbGUiKSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9ISUdIKSwgZGVwZW5kZW50UHJvamVjdE5hbWUsIGRlcGVuZGVudFByb2plY3ROYW1lfSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQogCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KIAkJCQl9DQpAQCAtMzc0LDcgKzM3Myw3IEBACiAgKiBjb250cmlidXRpb24gdG8gYSBtZW1lbnRvLg0KICAqLw0KIHByb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKXsNCi0JQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgVXRpbC5iaW5kKCJhc3NlcnQuc2hvdWxkTm90SW1wbGVtZW50Ii8qbm9uTkxTKi8pKTsNCisJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgVXRpbC5iaW5kKCJhc3NlcnQuc2hvdWxkTm90SW1wbGVtZW50IikpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiAwOw0KIH0NCiAvKioNCkBAIC00MTEsNyArNDEwLDcgQEAKIAl9IGVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgew0KIAkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdCgoSVByb2plY3QpcmVzb3VyY2UsIHRoaXMpOw0KIAl9IGVsc2Ugew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaW52YWxpZFJlc291cmNlRm9yUHJvamVjdCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbnZhbGlkUmVzb3VyY2VGb3JQcm9qZWN0IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtNDgxLDkgKzQ4MCw5IEBACiAgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMNCiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsNCi0JYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCIpOyAvLyROT04tTkxTLTEkDQogCWlmIChpbmZvID09IG51bGwpIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIA0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE1hbmFnZXIuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE1hbmFnZXIuamF2YQppbmRleCA3YTg4ZWIwLi40ODBlZmNiIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhCkBAIC0zOSw2ICszOSwxNSBAQAogICogdGhlIHN0YXRpYyBtZXRob2QgPGNvZGU+SmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk8L2NvZGU+Lg0KICAqLw0KIHB1YmxpYyBjbGFzcyBKYXZhTW9kZWxNYW5hZ2VyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElTYXZlUGFydGljaXBhbnQgeyAJDQorCS8qKg0KKwkgKiBKYXZhQ29yZSBvcHRpb25zIChkb24ndCB1c2UgdGhpcyBmaWVsZCB0byBhZGQgYW4gbmV3IG9wdGlvbiwNCisJICogdXNlIEphdmFNb2RlbE1hbmFnZXIjYWRkT3B0aW9uIG1ldGhvZC4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGZPcHRpb25zOw0KKwkvKioNCisJICogSmF2YUNvcmUgb3B0aW9ucyBJRHMNCisJICovDQorCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBmT3B0aW9uSURzOw0KIA0KIAkvKioNCiAJICogVGhlIHNpbmdsZXRvbiBtYW5hZ2VyDQpAQCAtOTMsMTIgKzEwMiwxMiBAQAogCS8qKg0KIAkgKiBMb2NhbCBKYXZhIHdvcmtzcGFjZSBwcm9wZXJ0aWVzIGZpbGUgbmFtZSAoZ2VuZXJhdGVkIGluc2lkZSBKYXZhQ29yZSBwbHVnaW4gc3RhdGUgbG9jYXRpb24pDQogCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0tTX1BST1BfRklMRU5BTUU9ICJ3b3Jrc3BhY2UucHJvcGVydGllcyIvKm5vbk5MUyovOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0tTX1BST1BfRklMRU5BTUU9ICJ3b3Jrc3BhY2UucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqDQogCSAqIE5hbWUgb2YgdGhlIGhhbmRsZSBpZCBhdHRyaWJ1dGUgaW4gYSBKYXZhIG1hcmtlcg0KIAkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IQU5ETEVfSUQ9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyLmhhbmRsZUlkIi8qbm9uTkxTKi87DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEFORExFX0lEPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlci5oYW5kbGVJZCI7IC8vJE5PTi1OTFMtMSQNCiANCiAJLyoqDQogCSAqIFRhYmxlIGZyb20gSVByb2plY3QgdG8gUGVyUHJvamVjdEluZm8uDQpAQCAtMTI5LDcgKzEzOCw3IEBACiAJLyoqDQogCSAqIExpbmUgc2VwYXJhdG9yIHRvIHVzZSB0aHJvdWdob3V0IHRoZSBKYXZhTW9kZWwgZm9yIGFueSBzb3VyY2UgZWRpdCBvcGVyYXRpb24NCiAJICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIvKm5vbk5MUyovKTsNCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQNCiAJLyoqDQogCSAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YU1vZGVsTWFuYWdlcg0KIAkgKi8NCkBAIC0xNjgsMjEyICsxNzcsNyBAQAogcHVibGljIHZvaWQgY2xvc2VBZmZlY3RlZEVsZW1lbnRzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7DQogCWZEZWx0YVByb2Nlc3Nvci5jbG9zZUFmZmVjdGVkRWxlbWVudHMoZGVsdGEpOw0KIH0NCi0vKioNCi0gKiBDb252ZXJ0IG9wdGlvbnMgTWFwIGludG8gQ29uZmlndXJhYmxlT3B0aW9uIHVuZGVyc3Rvb2QgYnkgdGhlIGluZnJhc3RydWN0dXJlDQotICoNCi0gKiBTaG91bGQgYmUgcmV2aXNpdGVkDQotICovDQotcHVibGljIHN0YXRpYyBDb25maWd1cmFibGVPcHRpb25bXSBjb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhIYXNodGFibGUgb3B0aW9uTWFwKSB7DQogDQotCUVudW1lcmF0aW9uIG9wdGlvbk5hbWVzID0gb3B0aW9uTWFwLmtleXMoKTsNCi0JQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsNCi0JaW50IGluZGV4ID0gMDsNCi0JDQotCXdoaWxlIChvcHRpb25OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSl7DQotCQkNCi0JCVN0cmluZyBvcHRpb25OYW1lID0gKFN0cmluZylvcHRpb25OYW1lcy5uZXh0RWxlbWVudCgpOw0KLQkJU3RyaW5nIG9wdGlvblZhbHVlID0gKFN0cmluZylvcHRpb25NYXAuZ2V0KG9wdGlvbk5hbWUpOw0KLQkJDQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUikpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuR0VORVJBVEUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMoDQotCQkJCQljb21waWxlck9wdGlvbnMuZ2V0RGVidWdBdHRyaWJ1dGVzTWFzaygpIHwgQ29tcGlsZXJPcHRpb25zLlZhcnMpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5ET19OT1RfR0VORVJBVEUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMoDQotCQkJCQljb21waWxlck9wdGlvbnMuZ2V0RGVidWdBdHRyaWJ1dGVzTWFzaygpICYgfkNvbXBpbGVyT3B0aW9ucy5WYXJzKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfSANCi0JCWlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9MSU5FX05VTUJFUl9BVFRSKSl7DQotDQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5HRU5FUkFURSkpew0KLQkJCQljb21waWxlck9wdGlvbnMucHJvZHVjZURlYnVnQXR0cmlidXRlcygNCi0JCQkJCWNvbXBpbGVyT3B0aW9ucy5nZXREZWJ1Z0F0dHJpYnV0ZXNNYXNrKCkgfCBDb21waWxlck9wdGlvbnMuTGluZXMpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5ET19OT1RfR0VORVJBVEUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMoDQotCQkJCQljb21waWxlck9wdGlvbnMuZ2V0RGVidWdBdHRyaWJ1dGVzTWFzaygpICYgfkNvbXBpbGVyT3B0aW9ucy5MaW5lcyk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQljb250aW51ZTsNCi0JCX0gDQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFX0ZJTEVfQVRUUikpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuR0VORVJBVEUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMoDQotCQkJCQljb21waWxlck9wdGlvbnMuZ2V0RGVidWdBdHRyaWJ1dGVzTWFzaygpIHwgQ29tcGlsZXJPcHRpb25zLlNvdXJjZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLkRPX05PVF9HRU5FUkFURSkpew0KLQkJCQljb21waWxlck9wdGlvbnMucHJvZHVjZURlYnVnQXR0cmlidXRlcygNCi0JCQkJCWNvbXBpbGVyT3B0aW9ucy5nZXREZWJ1Z0F0dHJpYnV0ZXNNYXNrKCkgJiB+Q29tcGlsZXJPcHRpb25zLlNvdXJjZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCWlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCkpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuUFJFU0VSVkUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXModHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLk9QVElNSVpFX09VVCkpew0KLQkJCQljb21waWxlck9wdGlvbnMucHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcyhmYWxzZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCWlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSkpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzEpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnNldFRhcmdldEpESyhDb21waWxlck9wdGlvbnMuSkRLMV8xKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzIpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLnNldFRhcmdldEpESyhDb21waWxlck9wdGlvbnMuSkRLMV8yKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJaWYgKG9wdGlvbk5hbWUuZXF1YWxzKEphdmFDb3JlLkNPTVBJTEVSX1BCX1VOUkVBQ0hBQkxFX0NPREUpKXsNCi0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLkVSUk9SKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVVbnJlYWNoYWJsZUNvZGVBc0Vycm9yKHRydWUpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5XQVJOSU5HKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVVbnJlYWNoYWJsZUNvZGVBc0Vycm9yKGZhbHNlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJaWYgKG9wdGlvbk5hbWUuZXF1YWxzKEphdmFDb3JlLkNPTVBJTEVSX1BCX0lOVkFMSURfSU1QT1JUKSl7DQotDQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5FUlJPUikpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlSW1wb3J0UHJvYmxlbUFzRXJyb3IodHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLldBUk5JTkcpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLmhhbmRsZUltcG9ydFByb2JsZW1Bc0Vycm9yKGZhbHNlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfT1ZFUlJJRElOR19QQUNLQUdFX0RFRkFVTFRfTUVUSE9EKSl7DQotDQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5XQVJOSU5HKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2RBc1dhcm5pbmcodHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLklHTk9SRSkpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kQXNXYXJuaW5nKGZhbHNlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJaWYgKG9wdGlvbk5hbWUuZXF1YWxzKEphdmFDb3JlLkNPTVBJTEVSX1BCX01FVEhPRF9XSVRIX0NPTlNUUlVDVE9SX05BTUUpKXsNCi0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLldBUk5JTkcpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLmhhbmRsZU1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWVBc1dhcm5pbmcodHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLklHTk9SRSkpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZUFzV2FybmluZyhmYWxzZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCWlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTikpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuV0FSTklORykpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlRGVwcmVjYXRpb25Vc2VBc1dhcm5pbmcodHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLklHTk9SRSkpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlRGVwcmVjYXRpb25Vc2VBc1dhcm5pbmcoZmFsc2UpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJY29udGludWU7DQotCQl9DQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLKSl7DQotDQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5XQVJOSU5HKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVNYXNrZWRDYXRjaEJsb2NrQXNXYXJuaW5nKHRydWUpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5JR05PUkUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLmhhbmRsZU1hc2tlZENhdGNoQmxvY2tBc1dhcm5pbmcoZmFsc2UpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJY29udGludWU7DQotCQl9DQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfVU5VU0VEX0xPQ0FMKSl7DQotDQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5XQVJOSU5HKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVVbnVzZWRMb2NhbFZhcmlhYmxlQXNXYXJuaW5nKHRydWUpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhKYXZhQ29yZS5JR05PUkUpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLmhhbmRsZVVudXNlZExvY2FsVmFyaWFibGVBc1dhcm5pbmcoZmFsc2UpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJY29udGludWU7DQotCQl9DQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUikpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuV0FSTklORykpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlVW51c2VkQXJndW1lbnRBc1dhcm5pbmcodHJ1ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLklHTk9SRSkpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlVW51c2VkQXJndW1lbnRBc1dhcm5pbmcoZmFsc2UpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJY29udGludWU7DQotCQl9DQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfU1lOVEhFVElDX0FDQ0VTU19FTVVMQVRJT04pKXsNCi0NCi0JCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEphdmFDb3JlLldBUk5JTkcpKXsNCi0JCQkJY29tcGlsZXJPcHRpb25zLmhhbmRsZUFjY2Vzc0VtdWxhdGlvbkFzV2FybmluZyh0cnVlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuSUdOT1JFKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVBY2Nlc3NFbXVsYXRpb25Bc1dhcm5pbmcoZmFsc2UpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJY29udGludWU7DQotCQl9DQotCQlpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfUEJfTk9OX0VYVEVSTkFMSVpFRF9TVFJJTkdfTElURVJBTCkpew0KLQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuV0FSTklORykpew0KLQkJCQljb21waWxlck9wdGlvbnMuaGFuZGxlTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbEFzV2FybmluZyh0cnVlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSmF2YUNvcmUuSUdOT1JFKSl7DQotCQkJCWNvbXBpbGVyT3B0aW9ucy5oYW5kbGVOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsQXNXYXJuaW5nKGZhbHNlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQl9DQotCXJldHVybiBjb21waWxlck9wdGlvbnMuZ2V0Q29uZmlndXJhYmxlT3B0aW9ucyhMb2NhbGUuZ2V0RGVmYXVsdCgpKTsNCi19DQogCS8qKg0KIAkgKiBOb3RlIHRoYXQgdGhlIHByb2plY3QgaXMgbm93IGRlbGV0ZWQuDQogCSAqDQpAQCAtNDgzLDcgKzI4Nyw3IEBACiAJCQlyZXR1cm4gbnVsbDsNCiAJCX0NCiAJCUphdmFNb2RlbCBtb2RlbD0gKEphdmFNb2RlbCkgZ2V0SmF2YU1vZGVsKHdvcmtzcGFjZSk7DQotCQlpZiAobWVtZW50by5lcXVhbHMoIiIvKm5vbk5MUyovKSl7IC8vIHdvcmtzcGFjZSBtZW1lbnRvDQorCQlpZiAobWVtZW50by5lcXVhbHMoIiIpKXsgLy8gd29ya3NwYWNlIG1lbWVudG8gLy8kTk9OLU5MUy0xJA0KIAkJCXJldHVybiBtb2RlbDsNCiAJCX0NCiAJCWludCBtb2RlbEVuZD0gbWVtZW50by5pbmRleE9mKEphdmFFbGVtZW50LkpFTV9KQVZBUFJPSkVDVCk7DQpAQCAtNTg0LDcgKzM4OCw3IEBACiAJCQkJdHJ5IHsNCiAJCQkJCW1vZGVsSW5mby5mSmF2YU1vZGVsLmNsb3NlKCk7DQogCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBVdGlsLmJpbmQoImVsZW1lbnQub25seU9uZUphdmFNb2RlbCIvKm5vbk5MUyovKSk7DQorCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBVdGlsLmJpbmQoImVsZW1lbnQub25seU9uZUphdmFNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJcmV0dXJuIG51bGw7DQogCQkJCX0NCiAJCQl9DQpAQCAtNTkyLDcgKzM5Niw3IEBACiAJCWlmIChtb2RlbEluZm8gPT0gbnVsbCB8fCBtb2RlbEluZm8ud29ya3NwYWNlLmVxdWFscyh3b3Jrc3BhY2UpKSB7DQogCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWwod29ya3NwYWNlKTsNCiAJCX0gZWxzZSB7DQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgVXRpbC5iaW5kKCJlbGVtZW50Lm9ubHlPbmVKYXZhTW9kZWwiLypub25OTFMqLykpOw0KKwkJCUFzc2VydC5pc1RydWUoZmFsc2UsIFV0aWwuYmluZCgiZWxlbWVudC5vbmx5T25lSmF2YU1vZGVsIikpOyAvLyROT04tTkxTLTEkDQogCQkJcmV0dXJuIG51bGw7DQogCQl9DQogDQpAQCAtNjE4LDcgKzQyMiw3IEBACiAJCWlmIChzdGF0ZSA9PSBudWxsICYmIEphdmFCdWlsZGVyLlNBVkVfRU5BQkxFRCAmJiAhaW5mby50cmllZFJlYWQpIHsNCiAJCQlpbmZvLnRyaWVkUmVhZD0gdHJ1ZTsNCiAJCQl0cnkgew0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5yZWFkU3RhdGVQcm9ncmVzcyIvKm5vbk5MUyovLCBwcm9qZWN0LmdldE5hbWUoKSkpOw0KKwkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5yZWFkU3RhdGVQcm9ncmVzcyIsIHByb2plY3QuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJc3RhdGU9IHJlYWRTdGF0ZShpbmZvKTsNCiAJCQkJaW5mby5zZXRMYXN0QnVpbHRTdGF0ZShzdGF0ZSk7DQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQpAQCAtNjYzLDEyICs0NjcsMTIgQEAKIAkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSByZXR1cm4gbnVsbDsNCiAJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyPSBKYXZhQ29yZS5nZXRKYXZhQ29yZSgpLmdldERlc2NyaXB0b3IoKTsNCiAJCUlQYXRoIHdvcmtpbmdMb2NhdGlvbj0gcHJvamVjdC5nZXRQbHVnaW5Xb3JraW5nTG9jYXRpb24oZGVzY3IpOw0KLQkJcmV0dXJuIHdvcmtpbmdMb2NhdGlvbi5hcHBlbmQoInN0YXRlLmRhdCIvKm5vbk5MUyovKS50b0ZpbGUoKTsNCisJCXJldHVybiB3b3JraW5nTG9jYXRpb24uYXBwZW5kKCJzdGF0ZS5kYXQiKS50b0ZpbGUoKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVzQXNYTUxTdHJpbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQogDQogCQlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudEltcGwoKTsNCi0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YXJpYWJsZXMiLypub25OTFMqLyk7DQorCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFyaWFibGVzIik7IC8vJE5PTi1OTFMtMSQNCiAJCWRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsNCiANCiAJCVN0cmluZ1tdIHZhcmlhYmxlcyA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlTmFtZXMoKTsNCkBAIC02NzYsOSArNDgwLDkgQEAKIAkJZm9yIChpbnQgaT0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7ICsraSkgew0KIAkJCVN0cmluZyB2YXIgPSB2YXJpYWJsZXNbaV07DQogCQkJSVBhdGggdmFyUGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKHZhcik7DQotCQkJRWxlbWVudCB2YXJFbGVtZW50PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YXJpYWJsZSIvKm5vbk5MUyovKTsNCi0JCQl2YXJFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIvKm5vbk5MUyovLCB2YXIpOw0KLQkJCXZhckVsZW1lbnQuc2V0QXR0cmlidXRlKCJwYXRoIi8qbm9uTkxTKi8sIHZhclBhdGgudG9TdHJpbmcoKSk7CQkJDQorCQkJRWxlbWVudCB2YXJFbGVtZW50PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YXJpYWJsZSIpOyAvLyROT04tTkxTLTEkDQorCQkJdmFyRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB2YXIpOyAvLyROT04tTkxTLTEkDQorCQkJdmFyRWxlbWVudC5zZXRBdHRyaWJ1dGUoInBhdGgiLCB2YXJQYXRoLnRvU3RyaW5nKCkpOwkJCSAvLyROT04tTkxTLTEkDQogCQkJcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodmFyRWxlbWVudCk7DQogCQl9DQogDQpAQCAtNjk1LDYgKzQ5OSw0MiBAQAogCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CQ0KIAkJCQ0KIAl9DQorCQ0KKwlwdWJsaWMgU3RyaW5nIGdldE9wdGlvbnNBc1hNTFN0cmluZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisNCisJCURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50SW1wbCgpOw0KKwkJRWxlbWVudCByb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbnMiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOw0KKw0KKwkJU3RyaW5nW10gaWRzID0gSmF2YUNvcmUuZ2V0T3B0aW9uSURzKCk7DQorCQkNCisJCWZvciAoaW50IGk9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHsNCisJCQlDb25maWd1cmFibGVPcHRpb24gb3B0aW9uID0gKENvbmZpZ3VyYWJsZU9wdGlvbilmT3B0aW9ucy5nZXQoaWRzW2ldKTsNCisJCQkNCisJCQlFbGVtZW50IG9wdGlvbkVsZW1lbnQ9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOyAvLyROT04tTkxTLTEkDQorCQkJb3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgaWRzW2ldKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWlmKG9wdGlvbi5nZXRQb3NzaWJsZVZhbHVlcygpID09IENvbmZpZ3VyYWJsZU9wdGlvbi5Ob0Rpc2NyZXRlVmFsdWUpew0KKwkJCQlvcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCBvcHRpb24uZ2V0VmFsdWUoKSk7CSAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJCWVsc2V7DQorCQkJCW9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJpbmRleCIsIFN0cmluZy52YWx1ZU9mKG9wdGlvbi5nZXRWYWx1ZUluZGV4KCkpKTsJIC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQkJcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7DQorCQl9DQorDQorCQkvLyBwcm9kdWNlIGEgU3RyaW5nIG91dHB1dA0KKwkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisJCXRyeSB7DQorCQkJT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsNCisJCQlmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOw0KKwkJCVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KE1ldGhvZC5YTUwpLm1ha2VTZXJpYWxpemVyKHdyaXRlciwgZm9ybWF0KTsNCisJCQlzZXJpYWxpemVyLmFzRE9NU2VyaWFsaXplcigpLnNlcmlhbGl6ZShkb2N1bWVudCk7DQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7DQorCQl9DQorCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CQ0KKwkJCQ0KKwl9DQogLyoqDQogCSAqIFJldHVybnMgdGhlIG9wZW4gWmlwRmlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIElmIHRoZSBaaXBGaWxlDQogCSAqIGRvZXMgbm90IHlldCBleGlzdCwgaXQgaXMgY3JlYXRlZCwgb3BlbmVkLCBhbmQgYWRkZWQgdG8gdGhlIGNhY2hlDQpAQCAtNzIwLDcgKzU2MCw3IEBACiAJCX0gZWxzZSBpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7DQogCQkJZmlsZT0gcm9vdC5nZXRGaWxlKHBhdGgpOw0KIAkJCWlmIChmaWxlID09IG51bGwgfHwgZmlsZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsNCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImZpbGUubm90Rm91bmQiLypub25OTFMqLyksIG51bGwpKTsNCisJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImZpbGUubm90Rm91bmQiKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCWVuc3VyZUxvY2FsKGZpbGUpOw0KIAkJCWZpbGVTeXN0ZW1QYXRoPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOw0KQEAgLTczMSw3ICs1NzEsNyBAQAogCQl0cnkgew0KIAkJCXJldHVybiBuZXcgWmlwRmlsZShmaWxlU3lzdGVtUGF0aCk7DQogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgic3RhdHVzLklPRXhjZXB0aW9uIi8qbm9uTkxTKi8pLCBlKSk7DQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgic3RhdHVzLklPRXhjZXB0aW9uIiksIGUpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCS8qKg0KQEAgLTc1MSwxMyArNTkxLDIzIEBACiAJcHVibGljIHZvaWQgbG9hZFZhcmlhYmxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCiAJCQ0KIAkJU3RyaW5nIHhtbFN0cmluZyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KA0KLQkJCQkJCQkJbmV3IFF1YWxpZmllZE5hbWUoSmF2YUNvcmUuUExVR0lOX0lELCAidmFyaWFibGVzIi8qbm9uTkxTKi8pKTsNCisJCQkJCQkJCW5ldyBRdWFsaWZpZWROYW1lKEphdmFDb3JlLlBMVUdJTl9JRCwgInZhcmlhYmxlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJdHJ5IHsNCiAJCQlpZiAoeG1sU3RyaW5nICE9IG51bGwpIHJlYWRWYXJpYWJsZXMoeG1sU3RyaW5nKTsNCiAJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7DQogCQkJcmV0dXJuOw0KIAkJfQ0KIAl9DQorCQ0KKwlwdWJsaWMgdm9pZCBsb2FkT3B0aW9ucygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJDQorCQlTdHJpbmcgeG1sU3RyaW5nID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW50UHJvcGVydHkoDQorCQkJCQkJCQluZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJvcHRpb25zIikpOyAvLyROT04tTkxTLTEkDQorCQl0cnkgew0KKwkJCWlmICh4bWxTdHJpbmcgIT0gbnVsbCkgcmVhZE9wdGlvbnMoeG1sU3RyaW5nKTsNCisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQogLyoqDQogICogTWVyZ2VkIGFsbCBhd2FpdGluZyBkZWx0YXMuDQogICovDQpAQCAtODQ2LDEzICs2OTYsMTMgQEAKIAkJCXRyeSB7DQogCQkJCVN0cmluZyBwbHVnaW5JRD0gaW4ucmVhZFVURigpOw0KIAkJCQlpZiAoIXBsdWdpbklELmVxdWFscyhKYXZhQ29yZS5QTFVHSU5fSUQpKQ0KLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgiYnVpbGQud3JvbmdGaWxlRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImJ1aWxkLndyb25nRmlsZUZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlTdHJpbmcga2luZD0gaW4ucmVhZFVURigpOw0KLQkJCQlpZiAoIWtpbmQuZXF1YWxzKCJTVEFURSIvKm5vbk5MUyovKSkNCi0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImJ1aWxkLndyb25nRmlsZUZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJCWlmICgha2luZC5lcXVhbHMoIlNUQVRFIikpIC8vJE5PTi1OTFMtMSQNCisJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImJ1aWxkLndyb25nRmlsZUZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlpbnQgdmVyc2lvbj0gaW4ucmVhZEludCgpOw0KIAkJCQlpZiAodmVyc2lvbiAhPSAweDAwMDEpDQotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJidWlsZC51bmhhbmRsZWRWZXJzaW9uRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImJ1aWxkLnVuaGFuZGxlZFZlcnNpb25Gb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYm9vbGVhbiBoYXNTdGF0ZT0gaW4ucmVhZEJvb2xlYW4oKTsNCiAJCQkJSVN0YXRlIHN0YXRlPSBudWxsOw0KIAkJCQlpZiAoaGFzU3RhdGUpIHsNCkBAIC04NzYsMTUgKzcyNiwxNSBAQAogCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCiAJCQljcEVsZW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpLmdldERvY3VtZW50RWxlbWVudCgpOw0KIAkJfSBjYXRjaChTQVhFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoInZhcmlhYmxlLmJhZEZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJcmV0dXJuOw0KIAkJfSBjYXRjaChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpew0KLQkJCXJlYWRlci5jbG9zZSgpOw0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoInZhcmlhYmxlLmJhZEZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJcmV0dXJuOw0KIAkJfSBmaW5hbGx5IHsNCiAJCQlyZWFkZXIuY2xvc2UoKTsNCiAJCX0NCi0JCWlmICghY3BFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgidmFyaWFibGVzIi8qbm9uTkxTKi8pKSB7DQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgidmFyaWFibGUuYmFkRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCWlmIChjcEVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOw0KKwkJaWYgKCFjcEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ2YXJpYWJsZXMiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuOw0KIAkJfQ0KIAkJTm9kZUxpc3QgbGlzdD0gY3BFbGVtZW50LmdldENoaWxkTm9kZXMoKTsNCiAJCVZlY3RvciB2YXJpYWJsZXMgPSBuZXcgVmVjdG9yKCk7DQpAQCAtODk0LDkgKzc0NCw5IEBACiAJCQlzaG9ydCB0eXBlPSBub2RlLmdldE5vZGVUeXBlKCk7DQogCQkJaWYgKHR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsNCiAJCQkJRWxlbWVudCBlbGVtZW50PSAoRWxlbWVudCkgbm9kZTsNCi0JCQkJaWYgKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ2YXJpYWJsZSIvKm5vbk5MUyovKSkgew0KLQkJCQkJU3RyaW5nIHZhck5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIvKm5vbk5MUyovKTsNCi0JCQkJCVN0cmluZyB2YXJQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiLypub25OTFMqLyk7DQorCQkJCWlmIChlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgidmFyaWFibGUiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQlTdHJpbmcgdmFyTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJCVN0cmluZyB2YXJQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJdHJ5IHsNCiAJCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSh2YXJOYW1lLCBuZXcgUGF0aCh2YXJQYXRoKSwgbnVsbCk7DQogCQkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsNCkBAIC05MDYsNyArNzU2LDU3IEBACiANCiAJCQl9DQogCQl9DQotCX0JDQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHJlYWRPcHRpb25zKFN0cmluZyB4bWxTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorCQlpZihmT3B0aW9ucyA9PSBudWxsKQ0KKwkJCUphdmFDb3JlLnJlc2V0T3B0aW9ucygpOw0KKwkJDQorCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih4bWxTdHJpbmcpOw0KKwkJRWxlbWVudCBjcEVsZW1lbnQ7DQorCQl0cnkgew0KKwkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQorCQkJY3BFbGVtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKS5nZXREb2N1bWVudEVsZW1lbnQoKTsNCisJCX0gY2F0Y2goU0FYRXhjZXB0aW9uIGUpIHsNCisJCQlyZXR1cm47DQorCQl9IGNhdGNoKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSl7DQorCQkJcmV0dXJuOw0KKwkJfSBmaW5hbGx5IHsNCisJCQlyZWFkZXIuY2xvc2UoKTsNCisJCX0NCisJCWlmIChjcEVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOw0KKwkJaWYgKCFjcEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJvcHRpb25zIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybjsNCisJCX0NCisJCU5vZGVMaXN0IGxpc3Q9IGNwRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7DQorCQlpbnQgbGVuZ3RoPSBsaXN0LmdldExlbmd0aCgpOw0KKwkJZm9yIChpbnQgaT0gMDsgaSA8IGxlbmd0aDsgKytpKSB7DQorCQkJTm9kZSBub2RlPSBsaXN0Lml0ZW0oaSk7DQorCQkJc2hvcnQgdHlwZT0gbm9kZS5nZXROb2RlVHlwZSgpOw0KKwkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7DQorCQkJCUVsZW1lbnQgZWxlbWVudD0gKEVsZW1lbnQpIG5vZGU7DQorCQkJCWlmIChlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgib3B0aW9uIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJCUNvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24gPSAoQ29uZmlndXJhYmxlT3B0aW9uKSBmT3B0aW9ucy5nZXQoaWQpOw0KKwkJCQkJDQorCQkJCQlTdHJpbmdbXSBwb3NzaWJsZSA9IG9wdGlvbi5nZXRQb3NzaWJsZVZhbHVlcygpOw0KKwkJCQkJaWYocG9zc2libGUgPT0gQ29uZmlndXJhYmxlT3B0aW9uLk5vRGlzY3JldGVWYWx1ZSl7DQorCQkJCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQlvcHRpb24uc2V0VmFsdWUodmFsdWUpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZSB7DQorCQkJCQkJdHJ5IHsNCisJCQkJCQkJaW50IHZhbHVlSW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpbmRleCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCQlvcHRpb24uc2V0VmFsdWVJbmRleCh2YWx1ZUluZGV4KTsNCisJCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQkNCisJCQkJfQ0KKw0KKwkJCX0NCisJCX0NCisJfQ0KIAkvKioNCiAJICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBkZWx0YSB3aXRoIHRoaXMgbWFuYWdlci4gVGhpcyBBUEkgaXMgdG8gYmUNCiAJICogdXNlZCB0byByZWdpc3RlcmQgZGVsdGFzIHRoYXQgYXJlIGNyZWF0ZWQgZXhwbGljaXRseSBieSB0aGUgSmF2YQ0KQEAgLTEwNTcsNyArOTU3LDcgQEAKIAkJaWYgKHZTdGF0cyAhPSBudWxsKSB7DQogCQkJSVN0YXR1c1tdIHN0YXRzPSBuZXcgSVN0YXR1c1t2U3RhdHMuc2l6ZSgpXTsNCiAJCQl2U3RhdHMuY29weUludG8oc3RhdHMpOw0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBNdWx0aVN0YXR1cyhKYXZhQ29yZS5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIHN0YXRzLCBVdGlsLmJpbmQoImJ1aWxkLmNhbm5vdFNhdmVTdGF0ZXMiLypub25OTFMqLyksIG51bGwpKTsNCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgTXVsdGlTdGF0dXMoSmF2YUNvcmUuUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBzdGF0cywgVXRpbC5iaW5kKCJidWlsZC5jYW5ub3RTYXZlU3RhdGVzIiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCS8qKg0KQEAgLTEwNjUsNyArOTY1LDcgQEAKIAkgKi8NCiAJcHJpdmF0ZSB2b2lkIHNhdmVTdGF0ZShQZXJQcm9qZWN0SW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQogDQotCQlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiYnVpbGQuc2F2ZVN0YXRlUHJvZ3Jlc3MiLypub25OTFMqLywgaW5mby5wcm9qZWN0LmdldE5hbWUoKSkpOw0KKwkJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImJ1aWxkLnNhdmVTdGF0ZVByb2dyZXNzIiwgaW5mby5wcm9qZWN0LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkDQogCQlsb25nIHQ9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KIAkJRmlsZSBmaWxlPSBnZXRTZXJpYWxpemF0aW9uRmlsZShpbmZvLnByb2plY3QpOw0KIAkJaWYgKGZpbGUgPT0gbnVsbCkgcmV0dXJuOw0KQEAgLTEwNzMsNyArOTczLDcgQEAKIAkJCURhdGFPdXRwdXRTdHJlYW0gb3V0PSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpKTsNCiAJCQl0cnkgew0KIAkJCQlvdXQud3JpdGVVVEYoSmF2YUNvcmUuUExVR0lOX0lEKTsNCi0JCQkJb3V0LndyaXRlVVRGKCJTVEFURSIvKm5vbk5MUyovKTsNCisJCQkJb3V0LndyaXRlVVRGKCJTVEFURSIpOyAvLyROT04tTkxTLTEkDQogCQkJCW91dC53cml0ZUludCgweDAwMDEpOw0KIAkJCQlJU3RhdGUgc3RhdGU9IGluZm8uZ2V0TGFzdEJ1aWx0U3RhdGUoKTsNCiAJCQkJaWYgKHN0YXRlID09IG51bGwpIHsNCkBAIC0xMDkwLDE2ICs5OTAsMTYgQEAKIAkJCQlmaWxlLmRlbGV0ZSgpOw0KIAkJCX0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gc2Upew0KIAkJCX0NCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgUGxhdGZvcm0uUExVR0lOX0VSUk9SLCBVdGlsLmJpbmQoImJ1aWxkLmNhbm5vdFNhdmVTdGF0ZSIvKm5vbk5MUyovLCBpbmZvLnByb2plY3QuZ2V0TmFtZSgpKSwgZSkpOw0KKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsIFV0aWwuYmluZCgiYnVpbGQuY2Fubm90U2F2ZVN0YXRlIiwgaW5mby5wcm9qZWN0LmdldE5hbWUoKSksIGUpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KIAkJCXRyeSB7DQogCQkJCWZpbGUuZGVsZXRlKCk7DQogCQkJfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBzZSl7DQogCQkJfQ0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsIFV0aWwuYmluZCgiYnVpbGQuY2Fubm90U2F2ZVN0YXRlIi8qbm9uTkxTKi8sIGluZm8ucHJvamVjdC5nZXROYW1lKCkpLCBlKSk7DQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIFBsYXRmb3JtLlBMVUdJTl9FUlJPUiwgVXRpbC5iaW5kKCJidWlsZC5jYW5ub3RTYXZlU3RhdGUiLCBpbmZvLnByb2plY3QuZ2V0TmFtZSgpKSwgZSkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQl0PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7DQotCQlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiYnVpbGQuc2F2ZVN0YXRlQ29tcGxldGUiLypub25OTFMqLywgU3RyaW5nLnZhbHVlT2YodCkpKTsNCisJCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJidWlsZC5zYXZlU3RhdGVDb21wbGV0ZSIsIFN0cmluZy52YWx1ZU9mKHQpKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAkvKioNCiAJICogU2F2ZXMgdGhlIGJ1aWx0IHN0YXRlIGZvciB0aGUgcHJvamVjdCBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3Qgc2F2ZS4NCkBAIC0xMTE5LDE1ICsxMDE5LDIyIEBACiAJfQ0KIAlwdWJsaWMgdm9pZCBzYXZlVmFyaWFibGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoDQotCQkJbmV3IFF1YWxpZmllZE5hbWUoSmF2YUNvcmUuUExVR0lOX0lELCAidmFyaWFibGVzIi8qbm9uTkxTKi8pLCANCisJCQluZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJ2YXJpYWJsZXMiKSwgIC8vJE5PTi1OTFMtMSQNCiAJCQlnZXRWYXJpYWJsZXNBc1hNTFN0cmluZygpKTsNCiAJfQ0KKwkNCisJcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eSgNCisJCQluZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJvcHRpb25zIiksICAvLyROT04tTkxTLTEkDQorCQkJZ2V0T3B0aW9uc0FzWE1MU3RyaW5nKCkpOw0KKwl9DQogLyoqDQogICogQHNlZSBJU2F2ZVBhcnRpY2lwYW50DQogICovDQogcHVibGljIHZvaWQgc2F2aW5nKElTYXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQogDQogCXRoaXMuc2F2ZVZhcmlhYmxlcygpOw0KKwl0aGlzLnNhdmVPcHRpb25zKCk7DQogCQ0KIAlpZiAoY29udGV4dC5nZXRLaW5kKCkgPT0gSVNhdmVDb250ZXh0LkZVTExfU0FWRSl7DQogCQl0aGlzLnNhdmVCdWlsZFN0YXRlKCk7CS8vIGJ1aWxkIHN0YXRlDQpAQCAtMTE0MCw4ICsxMDQ3LDkgQEAKIAlwcm90ZWN0ZWQgdm9pZCBzZXRCdWlsZE9yZGVyKFN0cmluZ1tdIGphdmFCdWlsZE9yZGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiANCiAJCS8vIG9wdGlvbmFsIGJlaGF2aW91cg0KLQkJaWYgKCFKYXZhQ29yZS5DT01QVVRFLmVxdWFscyhKYXZhQ29yZS5nZXRPcHRpb25zKCkuZ2V0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9PUkRFUikpKSByZXR1cm47DQotCQkJDQorCQkvLyBwb3NzaWJsZSB2YWx1ZSBvZiBpbmRleCAwIGlzIENvbXB1dGUNCisJCWlmICghSmF2YUNvcmUuZ2V0T3B0aW9uUG9zc2libGVWYWx1ZXMoSmF2YUNvcmUuT1BUSU9OX0NvbXB1dGVCdWlsZE9yZGVyKVswXS5lcXVhbHMoSmF2YUNvcmUuZ2V0T3B0aW9uVmFsdWUoSmF2YUNvcmUuT1BUSU9OX0NvbXB1dGVCdWlsZE9yZGVyKSkpIHJldHVybjsNCisJCQ0KIAkJaWYgKGphdmFCdWlsZE9yZGVyID09IG51bGwgfHwgamF2YUJ1aWxkT3JkZXIubGVuZ3RoIDw9IDEpIHJldHVybjsNCiAJCQ0KIAkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7DQpAQCAtMTIyMSw0ICsxMTI5LDM4IEBACiAJcHVibGljIHZvaWQgc3RvcERlbHRhcygpIHsNCiAJCWZGaXJlPSBmYWxzZTsNCiAJfQ0KKwkNCisJLyoqDQorIAkqIEFuc3dlcnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBvcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgSmF2YSBjb3JlLg0KKyAJKiBUaGVzZSBvcHRpb25zIGFsbG93IHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgY29tcG9uZW50cy4NCisgCSoNCisgCSogQ2hhbmdlcyBvbiB0aGUgc2V0IG9mIG9wdGlvbnMgYXJlIG5vdCBjb21taXR0ZWQgdW50aWwgaW52b2tpbmcgPGNvZGU+SmF2YUNvcmUuc2V0T3B0aW9uVmFsdWU8L2NvZGU+DQorIAkqLw0KKwlwdWJsaWMgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldE9wdGlvbnMoKXsNCisJCWlmKGZPcHRpb25zID09IG51bGwpDQorCQkJSmF2YUNvcmUucmVzZXRPcHRpb25zKCk7DQorCQkNCisJCXJldHVybiAoQ29uZmlndXJhYmxlT3B0aW9uW10pZk9wdGlvbnMudmFsdWVzKCkudG9BcnJheShuZXcgQ29uZmlndXJhYmxlT3B0aW9uWzBdKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEFuc3dlcnMgYSBzZXQgb2Ygb3B0aW9uJ0lEcyB3aGljaCBhcmUgaW4gb3B0aW9uIHNldCBvZiBKYXZhQ29yZQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRPcHRpb25JRHMoKXsNCisJCWlmKGZPcHRpb25JRHMgPT0gbnVsbCkNCisJCQlKYXZhQ29yZS5yZXNldE9wdGlvbnMoKTsNCisJCQkNCisJCXJldHVybiAoU3RyaW5nIFtdKWZPcHRpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVPcHRpb25zKCl7DQorCQlmT3B0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOw0KKwkJZk9wdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoMTApOw0KKwl9DQorCQ0KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT3B0aW9uKENvbmZpZ3VyYWJsZU9wdGlvbiBvcHRpb24pew0KKwkJU3RyaW5nIGlkID0gb3B0aW9uLmdldElEKCk7DQorCQlmT3B0aW9ucy5wdXQoaWQsb3B0aW9uKTsNCisJCWZPcHRpb25JRHMuYWRkKGlkKTsNCisJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCmluZGV4IDgyMjY4NmIuLmVhMThhZDYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCkBAIC0xMzUsNyArMTM1LDcgQEAKICAqLw0KIHByb3RlY3RlZCB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7DQogCWlmIChpc0NhbmNlbGVkKCkpIHsNCi0JCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5jYW5jZWxsZWQiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLmNhbmNlbGxlZCIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKaW5kZXggYzg2OGUyMS4uYjYzYWE0MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKQEAgLTUyLDEzICs1MiwxMyBAQAogICovDQogcHVibGljIEphdmFNb2RlbFN0YXR1cygpIHsNCiAJLy8gbm8gY29kZSBmb3IgYW4gbXVsdGktc3RhdHVzDQotCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIDAsICJKYXZhTW9kZWxTdGF0dXMiLypub25OTFMqLywgbnVsbCk7DQorCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIDAsICJKYXZhTW9kZWxTdGF0dXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggbm8gY29ycmVzcG9uZGluZyBlbGVtZW50cy4NCiAgKi8NCiBwdWJsaWMgSmF2YU1vZGVsU3RhdHVzKGludCBjb2RlKSB7DQotCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLypub25OTFMqLywgbnVsbCk7DQorCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAlmRWxlbWVudHM9IEphdmFFbGVtZW50SW5mby5mZ0VtcHR5Q2hpbGRyZW47DQogfQ0KIC8qKg0KQEAgLTY2LDcgKzY2LDcgQEAKICAqIGVsZW1lbnRzLg0KICAqLw0KIHB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIElKYXZhRWxlbWVudFtdIGVsZW1lbnRzKSB7DQotCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLypub25OTFMqLywgbnVsbCk7DQorCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KIAlmRWxlbWVudHM9IGVsZW1lbnRzOw0KIAlmUGF0aD0gbnVsbDsNCiB9DQpAQCAtNzQsNyArNzQsNyBAQAogICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuDQogICovDQogcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgY29kZSwgU3RyaW5nIHN0cmluZykgew0KLQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIi8qbm9uTkxTKi8sIG51bGwpOw0KKwlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCiAJZkVsZW1lbnRzPSBKYXZhRWxlbWVudEluZm8uZmdFbXB0eUNoaWxkcmVuOw0KIAlmUGF0aD0gbnVsbDsNCiAJZlN0cmluZyA9IHN0cmluZzsNCkBAIC04MywxNCArODMsMTQgQEAKICAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLg0KICAqLw0KIHB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIFRocm93YWJsZSB0aHJvd2FibGUpIHsNCi0Jc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgY29kZSwgIkphdmFNb2RlbFN0YXR1cyIvKm5vbk5MUyovLCB0aHJvd2FibGUpOw0KKwlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIiwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJA0KIAlmRWxlbWVudHM9IEphdmFFbGVtZW50SW5mby5mZ0VtcHR5Q2hpbGRyZW47DQogfQ0KIC8qKg0KICAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLg0KICAqLw0KIHB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIElQYXRoIHBhdGgpIHsNCi0Jc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgY29kZSwgIkphdmFNb2RlbFN0YXR1cyIvKm5vbk5MUyovLCBudWxsKTsNCisJc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgY29kZSwgIkphdmFNb2RlbFN0YXR1cyIsIG51bGwpOyAvLyROT04tTkxTLTEkDQogCWZFbGVtZW50cz0gSmF2YUVsZW1lbnRJbmZvLmZnRW1wdHlDaGlsZHJlbjsNCiAJZlBhdGg9IHBhdGg7DQogfQ0KQEAgLTExMyw3ICsxMTMsNyBAQAogICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuDQogICovDQogcHVibGljIEphdmFNb2RlbFN0YXR1cyhDb3JlRXhjZXB0aW9uIGNvcmVFeGNlcHRpb24pIHsNCi0Jc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgQ09SRV9FWENFUFRJT04sICJKYXZhTW9kZWxTdGF0dXMiLypub25OTFMqLywgY29yZUV4Y2VwdGlvbik7DQorCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIENPUkVfRVhDRVBUSU9OLCAiSmF2YU1vZGVsU3RhdHVzIiwgY29yZUV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQNCiAJZkVsZW1lbnRzPSBKYXZhRWxlbWVudEluZm8uZmdFbXB0eUNoaWxkcmVuOw0KIH0NCiBwcm90ZWN0ZWQgaW50IGdldEJpdHMoKSB7DQpAQCAtMTQwLDg5ICsxNDAsODkgQEAKIAlpZiAoZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkgew0KIAkJc3dpdGNoIChnZXRDb2RlKCkpIHsNCiAJCQljYXNlIENPUkVfRVhDRVBUSU9OIDoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmNvcmVFeGNlcHRpb24iLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jb3JlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIEJVSUxERVJfSU5JVElBTElaQVRJT05fRVJST1I6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLmluaXRpYWxpemF0aW9uRXJyb3IiLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLmluaXRpYWxpemF0aW9uRXJyb3IiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgQlVJTERFUl9TRVJJQUxJWkFUSU9OX0VSUk9SOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJidWlsZC5zZXJpYWxpemF0aW9uRXJyb3IiLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLnNlcmlhbGl6YXRpb25FcnJvciIpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBERVZJQ0VfUEFUSDoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmNhbm5vdFVzZURldmljZU9uUGF0aCIvKm5vbk5MUyovLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jYW5ub3RVc2VEZXZpY2VPblBhdGgiLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIERPTV9FWENFUFRJT046DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5KRE9NRXJyb3IiLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5KRE9NRXJyb3IiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgRUxFTUVOVF9ET0VTX05PVF9FWElTVDoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgiZWxlbWVudC5kb2VzTm90RXhpc3QiLypub25OTFMqLyxmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoImVsZW1lbnQuZG9lc05vdEV4aXN0IixmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIEVWQUxVQVRJT05fRVJST1I6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5ldmFsdWF0aW9uRXJyb3IiLypub25OTFMqLywgZ2V0U3RyaW5nKCkpOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuZXZhbHVhdGlvbkVycm9yIiwgZ2V0U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBJTkRFWF9PVVRfT0ZfQk9VTkRTOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW5kZXhPdXRPZkJvdW5kcyIvKm5vbk5MUyovKTsNCisJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmluZGV4T3V0T2ZCb3VuZHMiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgSU5WQUxJRF9DT05URU5UUzoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRDb250ZW50cyIvKm5vbk5MUyovKTsNCisJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRDb250ZW50cyIpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBJTlZBTElEX0RFU1RJTkFUSU9OOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZERlc3RpbmF0aW9uIi8qbm9uTkxTKi8sIGZFbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpKTsNCisJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWREZXN0aW5hdGlvbiIsIGZFbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgSU5WQUxJRF9FTEVNRU5UX1RZUEVTOg0KLQkJCQlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcihVdGlsLmJpbmQoIm9wZXJhdGlvbi5ub3RTdXBwb3J0ZWQiLypub25OTFMqLykpOw0KKwkJCQlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcihVdGlsLmJpbmQoIm9wZXJhdGlvbi5ub3RTdXBwb3J0ZWQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KIAkJCQkJaWYgKGkgPiAwKSB7DQotCQkJCQkJYnVmZi5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCQkJCWJ1ZmYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQkJCQl9DQogCQkJCQlidWZmLmFwcGVuZChmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7DQogCQkJCX0NCiAJCQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsNCiAJCQljYXNlIElOVkFMSURfTkFNRToNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWROYW1lIi8qbm9uTkxTKi8sIGdldFN0cmluZygpKTsNCisJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWROYW1lIiwgZ2V0U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBJTlZBTElEX1BBQ0tBR0U6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUGFja2FnZSIvKm5vbk5MUyovLCBnZXRTdHJpbmcoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUGFja2FnZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgSU5WQUxJRF9QQVRIOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFBhdGgiLypub25OTFMqLywgZ2V0UGF0aCgpID09IG51bGwgPyAibnVsbCIvKm5vbk5MUyovIDogZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFBhdGgiLCBnZXRQYXRoKCkgPT0gbnVsbCA/ICJudWxsIiA6IGdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJY2FzZSBJTlZBTElEX1BST0pFQ1Q6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUHJvamVjdCIvKm5vbk5MUyovLCBnZXRTdHJpbmcoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUHJvamVjdCIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgSU5WQUxJRF9SRVNPVVJDRToNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRSZXNvdXJjZSIvKm5vbk5MUyovLCBnZXRTdHJpbmcoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUmVzb3VyY2UiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIElOVkFMSURfUkVTT1VSQ0VfVFlQRToNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRSZXNvdXJjZVR5cGUiLypub25OTFMqLywgZ2V0U3RyaW5nKCkpOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFJlc291cmNlVHlwZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgSU5WQUxJRF9TSUJMSU5HOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFNpYmxpbmciLypub25OTFMqLywgZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFNpYmxpbmciLCBmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIElPX0VYQ0VQVElPTjoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLklPRXhjZXB0aW9uIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuSU9FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgTkFNRV9DT0xMSVNJT046DQogCQkJCWlmIChmRWxlbWVudHMgIT0gbnVsbCAmJiBmRWxlbWVudHMubGVuZ3RoID4gMCkgew0KIAkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBmRWxlbWVudHNbMF07DQogCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsNCiAJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCAmJiBuYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgew0KLQkJCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5jYW5ub3RSZW5hbWVEZWZhdWx0UGFja2FnZSIvKm5vbk5MUyovKTsNCisJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY2Fubm90UmVuYW1lRGVmYXVsdFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJfQ0KIAkJCQl9DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5uYW1lQ29sbGlzaW9uIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBOT19FTEVNRU5UU19UT19QUk9DRVNTOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZEVsZW1lbnRzIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZEVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIE5VTExfTkFNRToNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm5lZWROYW1lIi8qbm9uTkxTKi8pOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZE5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgTlVMTF9QQVRIOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZFBhdGgiLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkUGF0aCIpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBOVUxMX1NUUklORzoNCi0JCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm5lZWRTdHJpbmciLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIFBBVEhfT1VUU0lERV9QUk9KRUNUOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucGF0aE91dHNpZGVQcm9qZWN0Ii8qbm9uTkxTKi8sIGdldFN0cmluZygpLCBmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5wYXRoT3V0c2lkZVByb2plY3QiLCBnZXRTdHJpbmcoKSwgZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBSRUFEX09OTFk6DQogCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZkVsZW1lbnRzWzBdOw0KIAkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsNCiAJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIG5hbWUuZXF1YWxzKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpKSB7DQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuZGVmYXVsdFBhY2thZ2VSZWFkT25seSIvKm5vbk5MUyovKTsNCisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5kZWZhdWx0UGFja2FnZVJlYWRPbmx5Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJfQ0KLQkJCQlyZXR1cm4gIFV0aWwuYmluZCgic3RhdHVzLnJlYWRPbmx5Ii8qbm9uTkxTKi8sIG5hbWUpOw0KKwkJCQlyZXR1cm4gIFV0aWwuYmluZCgic3RhdHVzLnJlYWRPbmx5IiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIFJFTEFUSVZFX1BBVEg6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkQWJzb2x1dGVQYXRoIi8qbm9uTkxTKi8sIGdldFBhdGgoKS50b1N0cmluZygpKTsNCisJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm5lZWRBYnNvbHV0ZVBhdGgiLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIFRBUkdFVF9FWENFUFRJT046DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy50YXJnZXRFeGNlcHRpb24iLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy50YXJnZXRFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWNhc2UgVVBEQVRFX0NPTkZMSUNUOg0KLQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMudXBkYXRlQ29uZmxpY3QiLypub25OTFMqLyk7DQorCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy51cGRhdGVDb25mbGljdCIpOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBOT19MT0NBTF9DT05URU5UUyA6DQotCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5ub0xvY2FsQ29udGVudHMiLypub25OTFMqLywgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOw0KKwkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMubm9Mb2NhbENvbnRlbnRzIiwgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gZ2V0U3RyaW5nKCk7DQogCX0gZWxzZSB7DQogCQlpZiAoZ2V0Q29kZSgpID09IENPUkVfRVhDRVBUSU9OKXsNCi0JCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuY29yZUV4Y2VwdGlvbldpdGhBcmciLypub25OTFMqLywgZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsNCisJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuY29yZUV4Y2VwdGlvbldpdGhBcmciLCBnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOw0KIAl9DQpAQCAtMzExLDkgKzMxMSw5IEBACiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQlidWZmZXIuYXBwZW5kKCJKYXZhIE1vZGVsIFN0YXR1cyBbIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJKYXZhIE1vZGVsIFN0YXR1cyBbIik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZChnZXRNZXNzYWdlKCkpOw0KLQlidWZmZXIuYXBwZW5kKCJdIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0LmphdmEKaW5kZXggMGRkYTkyNS4uYzNiODkwMiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiBUaGlzIGlzIHRoZSBwcm9qZWN0IGJpbiBmb2xkZXINCiAJICovDQogCXByb3RlY3RlZCBJUGF0aCBkZWZhdWx0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoImJpbiIvKm5vbk5MUyovKTsNCisJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoImJpbiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJLyoqDQogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhbmRsZSByZXByZXNlbnRzIHRoZSBzYW1lIEphdmEgcHJvamVjdA0KQEAgLTI0NSwxNCArMjQ1LDE0IEBACiAJCQkJCS8vIGRlZmF1bHQgdG8gdGhlIGZpcnN0IG9uZQ0KIAkJCQkJcmV0dXJuIHBrZ0ZyYWdtZW50c1swXTsNCiAJCQkJfQ0KLQkJCX0gZWxzZSBpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiLypub25OTFMqLykgfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzIi8qbm9uTkxTKi8pKSB7DQorCQkJfSBlbHNlIGlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpIHx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQlJUGF0aCBwYWNrYWdlUGF0aD0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7DQogCQkJCVN0cmluZyBwYWNrYWdlTmFtZT0gcGFja2FnZVBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsNCiAJCQkJU3RyaW5nIHR5cGVOYW1lPSBwYXRoLmxhc3RTZWdtZW50KCk7DQogCQkJCXR5cGVOYW1lPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSBleHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsNCiAJCQkJU3RyaW5nIHF1YWxpZmllZE5hbWU9IG51bGw7DQogCQkJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsNCi0JCQkJCXF1YWxpZmllZE5hbWU9IHBhY2thZ2VOYW1lICsgIi4iLypub25OTFMqLyArIHR5cGVOYW1lOw0KKwkJCQkJcXVhbGlmaWVkTmFtZT0gcGFja2FnZU5hbWUgKyAiLiIgKyB0eXBlTmFtZTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl9IGVsc2Ugew0KIAkJCQkJcXVhbGlmaWVkTmFtZT0gdHlwZU5hbWU7DQogCQkJCX0NCkBAIC00MzcsMTggKzQzNywxMSBAQAogCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsNCiAJfQ0KIAkvKioNCi0JICogQHNlZSBJSmF2YVByb2plY3QNCi0JICogQGRlcHJlY2F0ZWQNCi0JICovDQotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBnZXRSYXdDbGFzc3BhdGgoKTsNCi0JfQ0KLQkvKioNCiAJICogUmV0dXJucyB0aGUgWE1MIFN0cmluZyBlbmNvZGluZyBvZiB0aGUgY2xhc3MgcGF0aC4NCiAJICovDQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NwYXRoQXNYTUxTdHJpbmcoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCQlEb2N1bWVudCBkb2M9IG5ldyBEb2N1bWVudEltcGwoKTsNCi0JCUVsZW1lbnQgY3BFbGVtZW50PSBkb2MuY3JlYXRlRWxlbWVudCgiY2xhc3NwYXRoIi8qbm9uTkxTKi8pOw0KKwkJRWxlbWVudCBjcEVsZW1lbnQ9IGRvYy5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJA0KIAkJZG9jLmFwcGVuZENoaWxkKGNwRWxlbWVudCk7DQogDQogCQlmb3IgKGludCBpPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgKytpKSB7DQpAQCAtNDU5LDkgKzQ1Miw5IEBACiAJCWlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsKSB7DQogCQkJb3V0cHV0TG9jYXRpb249IG91dHB1dExvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7DQogCQkJb3V0cHV0TG9jYXRpb249IG91dHB1dExvY2F0aW9uLm1ha2VSZWxhdGl2ZSgpOw0KLQkJCUVsZW1lbnQgb0VsZW1lbnQ9IGRvYy5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGhlbnRyeSIvKm5vbk5MUyovKTsNCi0JCQlvRWxlbWVudC5zZXRBdHRyaWJ1dGUoImtpbmQiLypub25OTFMqLywga2luZFRvU3RyaW5nKENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSk7DQotCQkJb0VsZW1lbnQuc2V0QXR0cmlidXRlKCJwYXRoIi8qbm9uTkxTKi8sIG91dHB1dExvY2F0aW9uLnRvT1NTdHJpbmcoKSk7DQorCQkJRWxlbWVudCBvRWxlbWVudD0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzcGF0aGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlvRWxlbWVudC5zZXRBdHRyaWJ1dGUoImtpbmQiLCBraW5kVG9TdHJpbmcoQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW9FbGVtZW50LnNldEF0dHJpYnV0ZSgicGF0aCIsIG91dHB1dExvY2F0aW9uLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQljcEVsZW1lbnQuYXBwZW5kQ2hpbGQob0VsZW1lbnQpOw0KIAkJfQ0KIA0KQEAgLTQ5NSwxNSArNDg4LDE1IEBACiAJICogb2YgdGhpcyBwcm9qZWN0DQogCSAqLw0KIAlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRDbGFzc3BhdGhQcm9wZXJ0eU5hbWUoKSB7DQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoSmF2YUNvcmUuUExVR0lOX0lELCAiY2xhc3NwYXRoIi8qbm9uTkxTKi8pOw0KKwkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKEphdmFDb3JlLlBMVUdJTl9JRCwgImNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJLyoqDQogCSAqIFJldHVybnMgdGhlIFhNTCBTdHJpbmcgZW5jb2Rpbmcgb2YgdGhlIGNsYXNzIHBhdGguDQogCSAqLw0KIAlwcm90ZWN0ZWQgc3RhdGljIEVsZW1lbnQgZ2V0RW50cnlBc1hNTEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSVBhdGggcHJlZml4UGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCQkNCi0JCUVsZW1lbnQgZWxlbWVudD0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2xhc3NwYXRoZW50cnkiLypub25OTFMqLyk7DQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgia2luZCIvKm5vbk5MUyovLCBraW5kVG9TdHJpbmcoZW50cnkuZ2V0RW50cnlLaW5kKCkpKTsNCisJCUVsZW1lbnQgZWxlbWVudD0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2xhc3NwYXRoZW50cnkiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImtpbmQiLCBraW5kVG9TdHJpbmcoZW50cnkuZ2V0RW50cnlLaW5kKCkpKTsgLy8kTk9OLU5MUy0xJA0KIAkJSVBhdGggcGF0aD0gZW50cnkuZ2V0UGF0aCgpOw0KIAkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpew0KIAkJCS8vIHRyYW5zbGF0ZSB0byBwcm9qZWN0IHJlbGF0aXZlIGZyb20gYWJzb2x1dGUgKHVubGVzcyBhIGRldmljZSBwYXRoKQ0KQEAgLTUxOCwxMiArNTExLDEyIEBACiAJCQkJfQ0KIAkJCX0NCiAJCX0NCi0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJwYXRoIi8qbm9uTkxTKi8sIHBhdGgudG9TdHJpbmcoKSk7DQorCQllbGVtZW50LnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCWlmIChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwpew0KLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJzb3VyY2VwYXRoIi8qbm9uTkxTKi8sIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkudG9TdHJpbmcoKSk7DQorCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInNvdXJjZXBhdGgiLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgIT0gbnVsbCl7DQotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvb3RwYXRoIi8qbm9uTkxTKi8sIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLnRvU3RyaW5nKCkpOw0KKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJyb290cGF0aCIsIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gZWxlbWVudDsNCiAJfQ0KQEAgLTU5Nyw3ICs1OTAsNyBAQAogCSAqLw0KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsNCiAJCVN0cmluZyBuYW1lPSByZXNvdXJjZS5nZXROYW1lKCk7DQotCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwiLmphciIvKm5vbk5MUyovKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCIuemlwIi8qbm9uTkxTKi8pKSB7DQorCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwiLmphciIpIHx8IFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsIi56aXAiKSkgeyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMpOw0KIAkJfSBlbHNlIHsNCiAJCQlyZXR1cm4gbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMpOw0KQEAgLTY4Myw3ICs2NzYsNyBAQAogCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkgew0KIAkJCVN0cmluZyBleHQ9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOw0KIAkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IG51bGw7DQotCQkJaWYgKGV4dCAhPSBudWxsICYmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiemlwIi8qbm9uTkxTKi8pIHx8IGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqYXIiLypub25OTFMqLykpKSB7DQorCQkJaWYgKGV4dCAhPSBudWxsICYmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiemlwIikgfHwgZXh0LmVxdWFsc0lnbm9yZUNhc2UoImphciIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQkJLy8gamFyDQogCQkJCS8vIHJlbW92ZUZpcnN0U2VnbWVudCByZW1vdmVzIHRoZSBwYXJ0IHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHdoaWNoIGlzIHJldHJpZXZlIA0KIAkJCQkvLyB0aHJvdWdoIHdvcmtzcGFjZS5nZXREZWZhdWx0Q29udGVudExvY2F0aW9uDQpAQCAtOTM4LDE1ICs5MzEsMTUgQEAKIAkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGEgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4gZnJvbSBpdHMgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3JtLg0KIAkgKi8NCiAJc3RhdGljIGludCBraW5kRnJvbVN0cmluZyhTdHJpbmcga2luZFN0cikgew0KLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgicHJqIi8qbm9uTkxTKi8pKQ0KKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgicHJqIikpIC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOw0KLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgidmFyIi8qbm9uTkxTKi8pKQ0KKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgidmFyIikpIC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRTsNCi0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInNyYyIvKm5vbk5MUyovKSkNCisJCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInNyYyIpKSAvLyROT04tTkxTLTEkDQogCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOw0KLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgibGliIi8qbm9uTkxTKi8pKQ0KKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgibGliIikpIC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOw0KLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgib3V0cHV0Ii8qbm9uTkxTKi8pKQ0KKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgib3V0cHV0IikpIC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQ7DQogCQlyZXR1cm4gLTE7DQogCX0NCkBAIC05NTgsMTcgKzk1MSwxNyBAQAogCXN0YXRpYyBTdHJpbmcga2luZFRvU3RyaW5nKGludCBraW5kKSB7DQogCQlzd2l0Y2ggKGtpbmQpIHsNCiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6DQotCQkJCXJldHVybiAic3JjIi8qbm9uTkxTKi87IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCisJCQkJcmV0dXJuICJzcmMiOyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoNCi0JCQkJcmV0dXJuICJzcmMiLypub25OTFMqLzsNCisJCQkJcmV0dXJuICJzcmMiOyAvLyROT04tTkxTLTEkDQogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOg0KLQkJCQlyZXR1cm4gImxpYiIvKm5vbk5MUyovOw0KKwkJCQlyZXR1cm4gImxpYiI7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOg0KLQkJCQlyZXR1cm4gInZhciIvKm5vbk5MUyovOw0KKwkJCQlyZXR1cm4gInZhciI7IC8vJE5PTi1OTFMtMSQNCiAJCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUIDoNCi0JCQkJcmV0dXJuICJvdXRwdXQiLypub25OTFMqLzsNCisJCQkJcmV0dXJuICJvdXRwdXQiOyAvLyROT04tTkxTLTEkDQogCQkJZGVmYXVsdCA6DQotCQkJCXJldHVybiAidW5rbm93biIvKm5vbk5MUyovOw0KKwkJCQlyZXR1cm4gInVua25vd24iOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJLyoqDQpAQCAtOTkwLDMxICs5ODMsMTAgQEAKIAl9DQogCS8qKg0KIAkgKiBAc2VlIElKYXZhUHJvamVjdA0KLQkgKiBAZGVwcmVjYXRlZA0KLQkgKi8NCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoSVBhdGggcGF0aCkgew0KLQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBudWxsLCBudWxsKTsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBJSmF2YVByb2plY3QNCi0gCSAqIEBkZXByZWNhdGVkDQotCSAqLw0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoKSB7DQotCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgpOw0KLQl9DQotCS8qKg0KLQkgKiBAc2VlIElKYXZhUHJvamVjdA0KLQkgKiBAZGVwcmVjYXRlZAkgDQotCSAqLw0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IG5ld1NvdXJjZUVudHJ5KElQYXRoIHBhdGgpIHsNCi0JCXJldHVybiBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoKTsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBJSmF2YVByb2plY3QNCiAJICovDQogCXB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElSZWdpb24gcmVnaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImhpZXJhcmNoeS5udWxsUmVnaW9uIi8qbm9uTkxTKi8pKTsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxSZWdpb24iKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKG51bGwsIHJlZ2lvbiwgdGhpcywgdHJ1ZSk7DQogCQlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOw0KQEAgLTEwMjUsMTAgKzk5NywxMCBAQAogCSAqLw0KIAlwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJVHlwZSB0eXBlLCBJUmVnaW9uIHJlZ2lvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJCWlmICh0eXBlID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxGb2N1c1R5cGUiLypub25OTFMqLykpOw0KKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJoaWVyYXJjaHkubnVsbEZvY3VzVHlwZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImhpZXJhcmNoeS5udWxsUmVnaW9uIi8qbm9uTkxTKi8pKTsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxSZWdpb24iKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKHR5cGUsIHJlZ2lvbiwgdGhpcywgdHJ1ZSk7DQogCQlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOw0KQEAgLTEwOTUsMTUgKzEwNjcsMTUgQEAKIAkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQogCQkJY3BFbGVtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKS5nZXREb2N1bWVudEVsZW1lbnQoKTsNCiAJCX0gY2F0Y2goU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgiZmlsZS5iYWRGb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0gY2F0Y2goUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKXsNCiAJCQlyZWFkZXIuY2xvc2UoKTsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgiZmlsZS5iYWRGb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0gZmluYWxseSB7DQogCQkJcmVhZGVyLmNsb3NlKCk7DQogCQl9DQotCQlpZiAoIWNwRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aCIvKm5vbk5MUyovKSkgew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCWlmICghY3BFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NwYXRoIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlOb2RlTGlzdCBsaXN0PSBjcEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOw0KIAkJVmVjdG9yIHBhdGhzPSBuZXcgVmVjdG9yKCk7DQpAQCAtMTExMyw5ICsxMDg1LDkgQEAKIAkJCXNob3J0IHR5cGU9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsNCiAJCQlpZiAodHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgew0KIAkJCQlFbGVtZW50IGNwZUVsZW1lbnQ9IChFbGVtZW50KSBub2RlOw0KLQkJCQlpZiAoY3BlRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aGVudHJ5Ii8qbm9uTkxTKi8pKSB7DQotCQkJCQlTdHJpbmcgY3BlRWxlbWVudEtpbmQgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgia2luZCIvKm5vbk5MUyovKTsNCi0JCQkJCVN0cmluZyBwYXRoU3RyID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiLypub25OTFMqLyk7DQorCQkJCWlmIChjcGVFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NwYXRoZW50cnkiKSkgeyAvLyROT04tTkxTLTEkDQorCQkJCQlTdHJpbmcgY3BlRWxlbWVudEtpbmQgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgia2luZCIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlTdHJpbmcgcGF0aFN0ciA9IGNwZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCS8vIGVuc3VyZSBwYXRoIGlzIGFic29sdXRlDQogCQkJCQlJUGF0aCBwYXRoPSBuZXcgUGF0aChwYXRoU3RyKTsNCiAJCQkJCWludCBraW5kPSBraW5kRnJvbVN0cmluZyhjcGVFbGVtZW50S2luZCk7DQpAQCAtMTEyMywxMCArMTA5NSwxMCBAQAogCQkJCQkJcGF0aD0gcHJvamVjdFBhdGguYXBwZW5kKHBhdGgpOw0KIAkJCQkJfQ0KIAkJCQkJLy8gc291cmNlIGF0dGFjaG1lbnQgaW5mbyAob3B0aW9uYWwpDQotCQkJCQlTdHJpbmcgc291cmNlQXR0YWNobWVudFBhdGhTdHIgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgic291cmNlcGF0aCIvKm5vbk5MUyovKTsNCi0JCQkJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoID0gc291cmNlQXR0YWNobWVudFBhdGhTdHIuZXF1YWxzKCIiLypub25OTFMqLykgPyBudWxsIDogbmV3IFBhdGgoc291cmNlQXR0YWNobWVudFBhdGhTdHIpOw0KLQkJCQkJU3RyaW5nIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aFN0ciA9IGNwZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyb290cGF0aCIvKm5vbk5MUyovKTsNCi0JCQkJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aFN0ci5lcXVhbHMoIiIvKm5vbk5MUyovKSA/IG51bGwgOiBuZXcgUGF0aChzb3VyY2VBdHRhY2htZW50Um9vdFBhdGhTdHIpOw0KKwkJCQkJU3RyaW5nIHNvdXJjZUF0dGFjaG1lbnRQYXRoU3RyID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInNvdXJjZXBhdGgiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGggPSBzb3VyY2VBdHRhY2htZW50UGF0aFN0ci5lcXVhbHMoIiIpID8gbnVsbCA6IG5ldyBQYXRoKHNvdXJjZUF0dGFjaG1lbnRQYXRoU3RyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJU3RyaW5nIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aFN0ciA9IGNwZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyb290cGF0aCIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGhTdHIuZXF1YWxzKCIiKSA/IG51bGwgOiBuZXcgUGF0aChzb3VyY2VBdHRhY2htZW50Um9vdFBhdGhTdHIpOyAvLyROT04tTkxTLTEkDQogCQkJCQkNCiAJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeT0gY3JlYXRlQ2xhc3NwYXRoRW50cnkocGF0aCwga2luZCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCk7DQogCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQpAQCAtMTI1MSwxMyArMTIyMyw2IEBACiAJCX0NCiAJfQ0KIAkvKioNCi0JICogQHNlZSBJSmF2YVByb2plY3QNCi0JICogQGRlcHJlY2F0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG1vbml0b3IsIHRydWUpOw0KLQl9DQotCS8qKg0KIAkgKiBVcGRhdGUgdGhlIEphdmEgY29tbWFuZCBpbiB0aGUgYnVpbGQgc3BlYyAocmVwbGFjZSBleGlzdGluZyBvbmUgaWYgcHJlc2VudCwNCiAJICogYWRkIG9uZSBmaXJzdCBpZiBub25lKS4NCiAJICovDQpAQCAtMTI5Miw3ICsxMjU3LDcgQEAKIAkgKi8NCiAJcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oSVBhdGggb3V0cHV0TG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJwYXRoLm51bGxwYXRoIi8qbm9uTkxTKi8pKTsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgicGF0aC5udWxscGF0aCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaWYgKG91dHB1dExvY2F0aW9uLmVxdWFscyhnZXRPdXRwdXRMb2NhdGlvbigpKSkgew0KIAkJCXJldHVybjsNCkBAIC0xNDYxLDkgKzE0MjYsOSBAQAogCXByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgU3RyaW5nIG1lc3NhZ2Upew0KIAkJdHJ5IHsNCiAJCQlJTWFya2VyIG1hcmtlciA9IGdldFByb2plY3QoKS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVXRpbC5iaW5kKCJjbGFzc3BhdGguYnVpbGRQYXRoIi8qbm9uTkxTKi8pKTsNCisJCQltYXJrZXIuc2V0QXR0cmlidXRlcygNCisJCQkJbmV3IFN0cmluZ1tdeyBJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuTE9DQVRJT059LA0KKwkJCQluZXcgT2JqZWN0W117bWVzc2FnZSwgbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKSwgVXRpbC5iaW5kKCJjbGFzc3BhdGguYnVpbGRQYXRoIil9KTsgLy8kTk9OLU5MUy0xJA0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQogCQl9CQkNCiAJfQ0KQEAgLTE0ODIsOTggKzE0NDcsNiBAQAogCX0NCiANCiAJLyoqDQotCSAqIFJldHVybnMgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0gcmVsYXRlZCB0byB0aGlzIGNsYXNzcGF0aCBlbnRyeSBpZiBhbnksIG9yIG51bGwgaWYgZW50cnkgaXMgZmluZSANCi0JICogKGkuZS4gaWYgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgdmFsaWQgZWxlbWVudCB0byBiZSByZWZlcmVuY2VkIG9udG8gYSBjbGFzc3BhdGgpLg0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NwYXRoRW50cnlFcnJvck1lc3NhZ2UoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIGNoZWNrU291cmNlQXR0YWNobWVudCl7DQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsJCQkNCi0JCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7DQotCQkNCi0JCXN3aXRjaChlbnRyeS5nZXRFbnRyeUtpbmQoKSl7DQotDQotCQkJLy8gdmFyaWFibGUgZW50cnkgY2hlY2sNCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOg0KLQkJCQllbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoZW50cnkpOw0KLQkJCQlpZiAoZW50cnkgPT0gbnVsbCl7DQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFZhcmlhYmxlUGF0aCIvKm5vbk5MUyovLCBwYXRoLnRvU3RyaW5nKCkpOw0KLQkJCQl9DQotCQkJCXJldHVybiBnZXRDbGFzc3BhdGhFbnRyeUVycm9yTWVzc2FnZShlbnRyeSwgY2hlY2tTb3VyY2VBdHRhY2htZW50KTsNCi0NCi0NCi0JCQkvLyBsaWJyYXJ5IGVudHJ5IGNoZWNrDQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOg0KLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGguaXNBYnNvbHV0ZSgpICYmICFwYXRoLmlzRW1wdHkoKSkgew0KLQkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7DQotCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBwYXRoLCB0cnVlKTsNCi0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2Upew0KLQkJCQkJCUlSZXNvdXJjZSByZXNvbHZlZFJlc291cmNlID0gKElSZXNvdXJjZSkgdGFyZ2V0Ow0KLQkJCQkJCXN3aXRjaChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSl7DQotCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOg0KLQkJCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJCQkJCQkJaWYgKCJqYXIiLypub25OTFMqLy5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgfHwgInppcCIvKm5vbk5MUyovLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSl7IC8vIGludGVybmFsIGJpbmFyeSBhcmNoaXZlDQotCQkJCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCANCi0JCQkJCQkJCQkJJiYgc291cmNlQXR0YWNobWVudCAhPSBudWxsDQotCQkJCQkJCQkJCSYmICFzb3VyY2VBdHRhY2htZW50LmlzRW1wdHkoKQ0KLQkJCQkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpew0KLQkJCQkJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLypub25OTFMqLywgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpKTsNCi0JCQkJCQkJCQl9DQotCQkJCQkJCQl9DQotCQkJCQkJCQlicmVhazsNCi0JCQkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoJLy8gaW50ZXJuYWwgYmluYXJ5IGZvbGRlcg0KLQkJCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCANCi0JCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwgDQotCQkJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpDQotCQkJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsNCi0JCQkJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLypub25OTFMqLywgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpKTsNCi0JCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpew0KLQkJCQkJCWlmIChjaGVja1NvdXJjZUF0dGFjaG1lbnQgDQotCQkJCQkJCSYmIHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbCANCi0JCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpDQotCQkJCQkJCSYmIEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgc291cmNlQXR0YWNobWVudCwgdHJ1ZSkgPT0gbnVsbCl7DQotCQkJCQkJCXJldHVybiBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlQXR0YWNobWVudCIvKm5vbk5MUyovLCBzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCkpOw0KLQkJCQkJCX0NCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJcmV0dXJuIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRMaWJyYXJ5Ii8qbm9uTkxTKi8sIHBhdGgudG9TdHJpbmcoKSk7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbExpYnJhcnlQYXRoIi8qbm9uTkxTKi8sIHBhdGgudG9TdHJpbmcoKSk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJLy8gcHJvamVjdCBlbnRyeSBjaGVjaw0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoNCi0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsNCi0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsNCi0JCQkJCXRyeSB7DQotCQkJCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpIHx8ICFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKXsNCi0JCQkJCQkJcmV0dXJuIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRQcm9qZWN0Ii8qbm9uTkxTKi8sIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKTsNCi0JCQkJCQl9DQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLQkJCQkJCXJldHVybiBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kUHJvamVjdCIvKm5vbk5MUyovLCBwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKSk7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFByb2plY3RQYXRoIi8qbm9uTkxTKi8sIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKTsNCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQkvLyBwcm9qZWN0IHNvdXJjZSBmb2xkZXINCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoNCi0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsNCi0JCQkJCUlQYXRoIHByb2plY3RQYXRoPSBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsNCi0JCQkJCWlmICghcHJvamVjdFBhdGguaXNQcmVmaXhPZihwYXRoKSB8fCBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIHRydWUpID09IG51bGwpew0KLQkJCQkJCXJldHVybiBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlRm9sZGVyIi8qbm9uTkxTKi8sIHBhdGgudG9TdHJpbmcoKSk7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFNvdXJjZUZvbGRlclBhdGgiLypub25OTFMqLywgcGF0aC50b1N0cmluZygpKTsNCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KIAkgKiBJbnRlcm5hbCB2YXJpYW50IHdoaWNoIGNhbiBjcmVhdGUgbWFya2VyIG9uIHByb2plY3QgZm9yIGludmFsaWQgZW50cmllcw0KIAkgKi8NCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKGJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlLCBib29sZWFuIGdlbmVyYXRlTWFya2VyT25FcnJvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQpAQCAtMTU4Nyw2ICsxNDYwLDEyIEBACiAJCQkNCiAJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07DQogDQorCQkJLyogdmFsaWRhdGlvbiBpZiBuZWVkZWQgKi8NCisJCQlpZiAoZ2VuZXJhdGVNYXJrZXJPbkVycm9yKXsNCisJCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGhFbnRyeSh0aGlzLCBlbnRyeSwgZmFsc2UpOw0KKwkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIGNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoZW50cnksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KKwkJCX0NCisNCiAJCQkvKiByZXNvbHZlIHZhcmlhYmxlcyBpZiBhbnksIHVucmVzb2x2ZWQgb25lcyBhcmUgaWdub3JlZCAqLw0KIAkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKXsNCiANCkBAIC0xNTk4LDE1ICsxNDc3LDEyIEBACiAJCQkJSVBhdGggdmFyaWFibGVQYXRoID0gZW50cnkuZ2V0UGF0aCgpOyAvLyBmb3IgZXJyb3IgcmVwb3J0aW5nDQogCQkJCWVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSk7DQogCQkJCWlmIChlbnRyeSA9PSBudWxsKXsNCi0JCQkJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IpIGNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoY2xhc3NwYXRoW2ldLCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kVmFyaWFibGVQYXRoIi8qbm9uTkxTKi8sIHZhcmlhYmxlUGF0aC50b1N0cmluZygpKSk7DQogCQkJCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSl7DQogCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ1BfVkFSSUFCTEVfUEFUSF9VTkJPVU5ELCB2YXJpYWJsZVBhdGgudG9TdHJpbmcoKSkpOw0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJfQ0KIAkJCWlmIChlbnRyeSAhPSBudWxsKXsNCi0JCQkJU3RyaW5nIG1zZzsNCi0JCQkJaWYgKGdlbmVyYXRlTWFya2VyT25FcnJvciAmJiAobXNnID0gZ2V0Q2xhc3NwYXRoRW50cnlFcnJvck1lc3NhZ2UoZW50cnksIGZhbHNlKSkgIT0gbnVsbCkgY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihjbGFzc3BhdGhbaV0sIG1zZyk7DQogCQkJCXJlc29sdmVkUGF0aFtpbmRleCsrXSA9IGVudHJ5Ow0KIAkJCX0NCiAJCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IGU5Y2JmYmYuLmM0MDUzNzkgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBmb3IgcHJvZ3Jlc3MgbW9uaXRvcmluZy4NCiAgKi8NCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm1vdmVFbGVtZW50UHJvZ3Jlc3MiLypub25OTFMqLyk7DQorCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5tb3ZlRWxlbWVudFByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogQHNlZSBDb3B5RWxlbWVudHNPcGVyYXRpb24jaXNNb3ZlKCkNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCA4OTVkZWY4Li5jZmJmOWFlIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKICAqIEBzZWUgTXVsdGlPcGVyYXRpb24NCiAgKi8NCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsNCi0JcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm1vdmVSZXNvdXJjZVByb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubW92ZVJlc291cmNlUHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBAc2VlIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uI2lzTW92ZSgpDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZUxvb2t1cC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZUxvb2t1cC5qYXZhCmluZGV4IDhlYmRiZTEuLjliMGM1YjYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEKQEAgLTE1Miw3ICsxNTIsNyBAQAogCQlpZiAoaW5kZXggIT0gLTEpIHsNCiAJCQljdU5hbWU9IGN1TmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KIAkJfQ0KLQkJY3VOYW1lICs9ICIuamF2YSIvKm5vbk5MUyovOw0KKwkJY3VOYW1lICs9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQNCiANCiAJCUlQYWNrYWdlRnJhZ21lbnRbXSBmcmFncz0gKElQYWNrYWdlRnJhZ21lbnRbXSkgZlBhY2thZ2VGcmFnbWVudHMuZ2V0KHBrZ05hbWUpOw0KIAkJaWYgKGZyYWdzICE9IG51bGwpIHsNCkBAIC0xNzMsNyArMTczLDcgQEAKICAqLw0KIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQoSVBhdGggcGF0aCkgew0KIAlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgicGF0aC5tdXN0QmVBYnNvbHV0ZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgicGF0aC5tdXN0QmVBYnNvbHV0ZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCUlSZXNvdXJjZSBwb3NzaWJsZUZyYWdtZW50ID0gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOw0KIAlpZiAocG9zc2libGVGcmFnbWVudCA9PSBudWxsKSB7DQpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJICovDQogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdChJUGF0aCBwYXRoKSB7DQogCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoInBhdGgubXVzdEJlQWJzb2x1dGUiLypub25OTFMqLykpOw0KKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJwYXRoLm11c3RCZUFic29sdXRlIikpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlmb3IgKGludCBpPSAwOyBpIDwgZlBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aDsgaSsrKSB7DQogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgY2xhc3NwYXRoUm9vdD0gZlBhY2thZ2VGcmFnbWVudFJvb3RzW2ldOw0KQEAgLTUzMiw3ICs1MzIsNyBAQAogCQkgKiB0aGUgY29tcGlsYXRpb25Vbml0cyBhbHdheXMgd2lsbC4gU28gYWRkIGl0IGlmIHdlJ3JlIGxvb2tpbmcgZm9yIA0KIAkJICogYW4gZXhhY3QgbWF0Y2guDQogCQkgKi8NCi0JCVN0cmluZyB1bml0TmFtZT0gcGFydGlhbE1hdGNoID8gbWF0Y2hOYW1lLnRvTG93ZXJDYXNlKCkgOiBtYXRjaE5hbWUgKyAiLmphdmEiLypub25OTFMqLzsNCisJCVN0cmluZyB1bml0TmFtZT0gcGFydGlhbE1hdGNoID8gbWF0Y2hOYW1lLnRvTG93ZXJDYXNlKCkgOiBtYXRjaE5hbWUgKyAiLmphdmEiOyAvLyROT04tTkxTLTEkDQogDQogCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Ob25Wb2lkTWV0aG9kUmVxdWVzdG9yLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Ob25Wb2lkTWV0aG9kUmVxdWVzdG9yLmphdmEKaW5kZXggZTc5OTQ3Zi4uZWE5N2Y0NSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTm9uVm9pZE1ldGhvZFJlcXVlc3Rvci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05vblZvaWRNZXRob2RSZXF1ZXN0b3IuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogfQ0KIHB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgew0KIAl0cnkgew0KLQkJaWYgKCFTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShtZXRob2QuZ2V0U2lnbmF0dXJlKCkpLmVxdWFscygiViIvKm5vbk5MUyovKSkgew0KKwkJaWYgKCFTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShtZXRob2QuZ2V0U2lnbmF0dXJlKCkpLmVxdWFscygiViIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQlzdXBlci5hY2NlcHRNZXRob2QobWV0aG9kKTsNCiAJCX0NCiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgew0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhCmluZGV4IGNjNjk0NGIuLmEzNmZiOGMgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGUuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCiANCiANCiAvKioNCkBAIC05NSw3ICs5Niw3IEBACiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCBjb2RlQ29tcGxldGUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IGN1LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcCwgaW50IHBvc2l0aW9uLCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29kZUFzc2lzdC5udWxsUmVxdWVzdG9yIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJjb2RlQXNzaXN0Lm51bGxSZXF1ZXN0b3IiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAocG9zaXRpb24gPCAtMSB8fCBwb3NpdGlvbiA+IGdldEJ1ZmZlcigpLmdldExlbmd0aCgpKSB7DQogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKSk7DQpAQCAtMTAzLDcgKzEwNCw3IEBACiAJU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOw0KIAllbnZpcm9ubWVudC51bml0VG9Ta2lwID0gdW5pdFRvU2tpcDsNCiANCi0JQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvciksIEphdmFNb2RlbE1hbmFnZXIuY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSk7DQorCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIG5ldyBDb21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlcihyZXF1ZXN0b3IpLCBKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKSk7DQogCWVuZ2luZS5jb21wbGV0ZShjdSwgcG9zaXRpb24pOw0KIAllbnZpcm9ubWVudC51bml0VG9Ta2lwID0gbnVsbDsNCiB9DQpAQCAtMTM0LDcgKzEzNSw3IEBACiAJSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSAoKEphdmFQcm9qZWN0KWdldEphdmFQcm9qZWN0KCkpLmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsNCiAJDQogCS8vIGZpeCBmb3IgMUZWWEdESw0KLQlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgcmVxdWVzdG9yLCBKYXZhTW9kZWxNYW5hZ2VyLmNvbnZlcnRDb25maWd1cmFibGVPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSkpOw0KKwlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgcmVxdWVzdG9yLCBKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKSk7DQogCWVuZ2luZS5zZWxlY3QoY3UsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoIC0gMSk7DQogfQ0KIC8qKg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YQppbmRleCAyZDQ5MTk4Li42ZjFjZDc4IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PdmVyZmxvd2luZ0xSVUNhY2hlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhCkBAIC0yMTIsNyArMjEyLDcgQEAKIAkJZm9yd2FyZExpc3RMZW5ndGgrKzsNCiAJCWVudHJ5ID0gZW50cnkuX2ZOZXh0Ow0KIAl9DQotCVN5c3RlbS5vdXQucHJpbnRsbigiRm9yd2FyZCBsZW5ndGg6ICIvKm5vbk5MUyovICsgZm9yd2FyZExpc3RMZW5ndGgpOw0KKwlTeXN0ZW0ub3V0LnByaW50bG4oIkZvcndhcmQgbGVuZ3RoOiAiICsgZm9yd2FyZExpc3RMZW5ndGgpOyAvLyROT04tTkxTLTEkDQogCQ0KIAlpbnQgYmFja3dhcmRMaXN0TGVuZ3RoID0gMDsNCiAJZW50cnkgPSBmRW50cnlRdWV1ZVRhaWw7DQpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCWJhY2t3YXJkTGlzdExlbmd0aCsrOw0KIAkJZW50cnkgPSBlbnRyeS5fZlByZXZpb3VzOw0KIAl9DQotCVN5c3RlbS5vdXQucHJpbnRsbigiQmFja3dhcmQgbGVuZ3RoOiAiLypub25OTFMqLyArIGJhY2t3YXJkTGlzdExlbmd0aCk7DQorCVN5c3RlbS5vdXQucHJpbnRsbigiQmFja3dhcmQgbGVuZ3RoOiAiICsgYmFja3dhcmRMaXN0TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAlFbnVtZXJhdGlvbiBrZXlzID0gZkVudHJ5VGFibGUua2V5cygpOw0KIAlqYXZhLnV0aWwuVmVjdG9yIHYgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOw0KQEAgLTIzMiw3ICsyMzIsNyBAQAogCQkJZkNvdW50ID0gMTsNCiAJCX0NCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQkJcmV0dXJuICJDbGFzczogIi8qbm9uTkxTKi8gKyBmQ2xhc3MgKyAiIGhhcyAiLypub25OTFMqLyArIGZDb3VudCArICIgZW50cmllcy4iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkNsYXNzOiAiICsgZkNsYXNzICsgIiBoYXMgIiArIGZDb3VudCArICIgZW50cmllcy4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCWphdmEudXRpbC5IYXNodGFibGUgaCA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7DQpAQCAtMzY5LDcgKzM2OSw3IEBACiAJaWYobmV3TG9hZEZhY3RvciA8PSAxLjAgJiYgbmV3TG9hZEZhY3RvciA+IDAuMCkNCiAJCWZMb2FkRmFjdG9yID0gbmV3TG9hZEZhY3RvcjsNCiAJZWxzZQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImNhY2hlLmludmFsaWRMb2FkRmFjdG9yIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJjYWNoZS5pbnZhbGlkTG9hZEZhY3RvciIpKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAJLyoqDQogCSAqIFNldHMgdGhlIG1heGltdW0gYW1vdW50IG9mIHNwYWNlIHRoYXQgdGhlIGNhY2hlIGNhbiBzdG9yZQ0KQEAgLTM5Nyw3ICszOTcsNyBAQAogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJcmV0dXJuIA0KLQkJIk92ZXJmbG93aW5nTFJVQ2FjaGUgIi8qbm9uTkxTKi8gKyAoKGZDdXJyZW50U3BhY2UgKyBmT3ZlcmZsb3cpICogMTAwLjAgLyBmU3BhY2VMaW1pdCkgKyAiJSBmdWxsXG4iLypub25OTFMqLyArDQorCQkiT3ZlcmZsb3dpbmdMUlVDYWNoZSAiICsgKChmQ3VycmVudFNwYWNlICsgZk92ZXJmbG93KSAqIDEwMC4wIC8gZlNwYWNlTGltaXQpICsgIiUgZnVsbFxuIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJdGhpcy50b1N0cmluZ0NvbnRlbnRzKCk7DQogfQ0KIC8qKg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKaW5kZXggYzc3NDE4Ny4uYzA0NmU1MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTMzLDEwICszMywxMCBAQAogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzDQogICovDQogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7DQotCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJwYWNrYWdlICIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7DQogCWlmIChpbmZvID09IG51bGwpIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCmluZGV4IDlhYjNiYjEuLjljZWMyYjYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC00NSw5ICs0NSw5IEBACiAJaW50IGtpbmQgPSBnZXRLaW5kKCk7DQogCVN0cmluZyBleHRUeXBlOw0KIAlpZiAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgew0KLQkJZXh0VHlwZSA9ICJqYXZhIi8qbm9uTkxTKi87DQorCQlleHRUeXBlID0gImphdmEiOyAvLyROT04tTkxTLTEkDQogCX0gZWxzZSB7DQotCQlleHRUeXBlID0gImNsYXNzIi8qbm9uTkxTKi87DQorCQlleHRUeXBlID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXRyeSB7DQogCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkubWVtYmVycygpOw0KQEAgLTg5LDcgKzg5LDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGNvcHkoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCWlmIChjb250YWluZXIgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5udWxsQ29udGFpbmVyIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9Ow0KIAlJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07DQpAQCAtMjI5LDcgKzIyOSw3IEBACiAJSUphdmFFbGVtZW50W10gcGFja2FnZXM9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZ2V0UGFyZW50KCkpLmdldENoaWxkcmVuKCk7DQogCVN0cmluZyBuYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsNCiAJaW50IG5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aCgpOw0KLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBpc0RlZmF1bHRQYWNrYWdlKCkgPyBuYW1lIDogbmFtZSsiLiIvKm5vbk5MUyovOw0KKwlTdHJpbmcgcGFja2FnZU5hbWUgPSBpc0RlZmF1bHRQYWNrYWdlKCkgPyBuYW1lIDogbmFtZSsiLiI7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaT0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7DQogCQlTdHJpbmcgb3RoZXJOYW1lID0gcGFja2FnZXNbaV0uZ2V0RWxlbWVudE5hbWUoKTsNCiAJCWlmIChvdGhlck5hbWUubGVuZ3RoKCkgPiBuYW1lTGVuZ3RoICYmIG90aGVyTmFtZS5zdGFydHNXaXRoKHBhY2thZ2VOYW1lKSkgew0KQEAgLTI0OSw3ICsyNDksNyBAQAogICovDQogcHVibGljIHZvaWQgbW92ZShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5udWxsQ29udGFpbmVyIikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307DQogCUlKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y29udGFpbmVyfTsNCkBAIC0yODAsNyArMjgwLDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsNCiAJSUphdmFFbGVtZW50W10gZGVzdHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpcy5nZXRQYXJlbnQoKX07DQpAQCAtMzAwLDE1ICszMDAsMTUgQEAKICAqLw0KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgew0KIAlpZiAoZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7DQotCQlidWZmZXIuYXBwZW5kKCJbZGVmYXVsdF0iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJbZGVmYXVsdF0iKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsNCiAJfQ0KIAlpZiAoaW5mbyA9PSBudWxsKSB7DQotCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWlmICh0YWIgPiAwKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiICguLi4pIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiAoLi4uKSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCmluZGV4IDZkYzUwNGQuLmQzNGMyY2MgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudEluZm8uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAkJCUlSZXNvdXJjZSBjaGlsZCA9IG1lbWJlcnNbaV07DQogCQkJaWYgKGNoaWxkLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSKSB7DQogCQkJCVN0cmluZyBleHRlbnNpb24gPSBjaGlsZC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJCQlpZiAoISJqYXZhIi8qbm9uTkxTKi8uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pICYmICEiY2xhc3MiLypub25OTFMqLy5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsNCisJCQkJaWYgKCEiamF2YSIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pICYmICEiY2xhc3MiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQkJCWlmIChub25KYXZhUmVzb3VyY2VzLmxlbmd0aCA9PSBub25KYXZhUmVzb3VyY2VzQ291bnRlcikgew0KIAkJCQkJCS8vIHJlc2l6ZQ0KIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkoDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCmluZGV4IDVkZTgwNzEuLjRmZDYzNjYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3QuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkJLy8gaXMgYWN0dWFsbHkgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCkNCiAJCWlmIChmUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgZlJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgew0KIAkJCVZlY3RvciB2Q2hpbGRyZW4gPSBuZXcgVmVjdG9yKDUpOw0KLQkJCWNvbXB1dGVGb2xkZXJDaGlsZHJlbigoSUNvbnRhaW5lcikgZlJlc291cmNlLCAiIi8qbm9uTkxTKi8sIHZDaGlsZHJlbik7DQorCQkJY29tcHV0ZUZvbGRlckNoaWxkcmVuKChJQ29udGFpbmVyKSBmUmVzb3VyY2UsICIiLCB2Q2hpbGRyZW4pOyAvLyROT04tTkxTLTEkDQogCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBuZXcgSUphdmFFbGVtZW50W3ZDaGlsZHJlbi5zaXplKCldOw0KIAkJCXZDaGlsZHJlbi5jb3B5SW50byhjaGlsZHJlbik7DQogCQkJaW5mby5zZXRDaGlsZHJlbihjaGlsZHJlbik7DQpAQCAtODYsNyArODYsNyBAQAogCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgew0KIAkJCQkJbmV3UHJlZml4ID0gbWVtYmVyLmdldE5hbWUoKTsNCiAJCQkJfSBlbHNlIHsNCi0JCQkJCW5ld1ByZWZpeCA9IHByZWZpeCArICIuIi8qbm9uTkxTKi8gKyBtZW1iZXIuZ2V0TmFtZSgpOw0KKwkJCQkJbmV3UHJlZml4ID0gcHJlZml4ICsgIi4iICsgbWVtYmVyLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQogCQkJCS8vIGVsaW1pbmF0ZSBiaW5hcnkgb3V0cHV0IG9ubHkgaWYgbmVzdGVkIGluc2lkZSBkaXJlY3Qgc3ViZm9sZGVycw0KIAkJCQlpZiAoIW1lbWJlci5nZXRGdWxsUGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvblBhdGgpKSB7DQpAQCAtMjk2LDEyICsyOTYsMTIgQEAKICAqLw0KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgew0KIAlpZiAoZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7DQotCQlidWZmZXIuYXBwZW5kKCJbcHJvamVjdCByb290XSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIltwcm9qZWN0IHJvb3RdIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7DQogCX0NCiAJaWYgKGluZm8gPT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCmluZGV4IGZmMWMxOTcuLjA4M2NlMWQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCQkJSVJlc291cmNlIG1lbWJlciA9IG1lbWJlcnNbaV07DQogCQkJaWYgKG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsNCiAJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG1lbWJlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJCQlpZiAoISJqYXZhIi8qbm9uTkxTKi8uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pICYmICEiY2xhc3MiLypub25OTFMqLy5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsNCisJCQkJaWYgKCEiamF2YSIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pICYmICEiY2xhc3MiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQkJCWlmIChwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290KG1lbWJlci5nZXRGdWxsUGF0aCgpKSA9PSBudWxsKSB7DQogCQkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7DQogCQkJCQkJCS8vIHJlc2l6ZQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Byb2JsZW0uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Byb2JsZW0uamF2YQppbmRleCBjYmNhZmM1Li5lN2ZlZDk2IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Qcm9ibGVtLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUHJvYmxlbS5qYXZhCkBAIC0xMzcsMTMgKzEzNywxMyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiANCiANCi0JU3RyaW5nIHMgPSAiUGIoIi8qbm9uTkxTKi8gKyAoaWQgJiBJZ25vcmVDYXRlZ29yaWVzTWFzaykgKyAiKSAiLypub25OTFMqLzsNCisJU3RyaW5nIHMgPSAiUGIoIiArIChpZCAmIElnbm9yZUNhdGVnb3JpZXNNYXNrKSArICIpICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAlpZiAobWVzc2FnZSAhPSBudWxsKSB7DQogCQlzICs9IG1lc3NhZ2U7DQogCX0gZWxzZSB7DQogCQlpZiAoYXJndW1lbnRzICE9IG51bGwpDQogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspDQotCQkJCXMgKz0gIiAiLypub25OTFMqLyArIGFyZ3VtZW50c1tpXTsNCisJCQkJcyArPSAiICIgKyBhcmd1bWVudHNbaV07IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gczsNCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVnaW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWdpb24uamF2YQppbmRleCAxNWI2NmRlLi44NDhmZDMxIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWdpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWdpb24uamF2YQpAQCAtMTM3LDcgKzEzNyw3IEBACiAJZm9yIChpbnQgaT0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7DQogCQlidWZmZXIuYXBwZW5kKHJvb3RzW2ldLmdldEVsZW1lbnROYW1lKCkpOw0KIAkJaWYgKGkgPCAocm9vdHMubGVuZ3RoIC0gMSkpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiAJYnVmZmVyLmFwcGVuZCgnXScpOw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IDUwYTM1YmYuLmIyZjZlN2QgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICogQHNlZSBNdWx0aU9wZXJhdGlvbg0KICAqLw0KIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgew0KLQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucmVuYW1lRWxlbWVudFByb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucmVuYW1lRWxlbWVudFByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogQHNlZSBDb3B5RWxlbWVudHNPcGVyYXRpb24jaXNSZW5hbWUoKQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBmMjY2NjZiLi5kMWRlYTI5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAgKiBAc2VlIE11bHRpT3BlcmF0aW9uDQogICovDQogcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7DQotCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5yZW5hbWVSZXNvdXJjZVByb2dyZXNzIi8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucmVuYW1lUmVzb3VyY2VQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIEBzZWUgQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24jaXNSZW5hbWUoKQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKaW5kZXggNzQ1ZmYxYS4uZDY5Y2JmNSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKQEAgLTYsMjgyICs2LDM3MyBAQAogICovDQogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0Ow0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZUVsZW1lbnRJbmZvOzsNCiANCiAvKioNCiAgKglUaGlzIGNsYXNzIHByb3ZpZGVzIGEgPGNvZGU+U2VhcmNoYWJsZUJ1aWxkZXJFbnZpcm9ubWVudDwvY29kZT4gZm9yIGNvZGUgYXNzaXN0IHdoaWNoDQogICoJdXNlcyB0aGUgSmF2YSBtb2RlbCBhcyBhIHNlYXJjaCB0b29sLiAgDQogICovDQotDQotcHVibGljIGNsYXNzIFNlYXJjaGFibGVFbnZpcm9ubWVudCBpbXBsZW1lbnRzIElTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50LCBJSmF2YVNlYXJjaENvbnN0YW50cyB7DQorcHVibGljIGNsYXNzIFNlYXJjaGFibGVFbnZpcm9ubWVudA0KKwlpbXBsZW1lbnRzIElTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50LCBJSmF2YVNlYXJjaENvbnN0YW50cyB7DQogCXByb3RlY3RlZCBOYW1lTG9va3VwIG5hbWVMb29rdXA7DQogCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IHVuaXRUb1NraXA7DQogCXB1YmxpYyBDb21waWxhdGlvblVuaXQgdW5pdFRvTG9va0luc2lkZTsNCiANCiAJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBwcm9qZWN0Ow0KLS8qKg0KLSAqIENyZWF0ZXMgYSBTZWFyY2hhYmxlRW52aXJvbm1lbnQgb24gdGhlIGdpdmVuIHByb2plY3QNCi0gKi8NCi1wdWJsaWMgU2VhcmNoYWJsZUVudmlyb25tZW50KElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JdGhpcy5uYW1lTG9va3VwID0gKE5hbWVMb29rdXApKChKYXZhUHJvamVjdClwcm9qZWN0KS5nZXROYW1lTG9va3VwKCk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIGdpdmVuIHR5cGUgaW4gdGhlIHRoZSBnaXZlbiBwYWNrYWdlIGlmIGl0IGV4aXN0cywNCi0gKiBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uDQotICovDQotcHJvdGVjdGVkIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7DQotCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQ0KLQkJcGFja2FnZU5hbWUgPSBJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FOw0KLQlJVHlwZSB0eXBlID0gdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKHR5cGVOYW1lLCBwYWNrYWdlTmFtZSwgZmFsc2UsIElOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTIHwgSU5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOw0KLQlpZiAodHlwZSA9PSBudWxsKSB7DQotCQkvLyBsb29rIGluc2lkZSB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGN1cnJlbnRseQ0KLQkJLy9mb3IgYSBub24tcHVibGljIG9yIGlubmVyIHR5cGUuDQotCQlpZiAodGhpcy51bml0VG9Mb29rSW5zaWRlICE9IG51bGwpIHsNCi0JCQlpZiAodGhpcy51bml0VG9Mb29rSW5zaWRlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKSkgew0KLQkJCQl0cnkgew0KLQkJCQkJSVR5cGVbXSBhbGxUeXBlcyA9IHRoaXMudW5pdFRvTG9va0luc2lkZS5nZXRUeXBlcygpOw0KLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGFsbFR5cGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkJaWYgKGFsbFR5cGVzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgew0KLQkJCQkJCQl0eXBlID0gYWxsVHlwZXNbaV07DQotCQkJCQkJCWJyZWFrOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIFNlYXJjaGFibGVFbnZpcm9ubWVudCBvbiB0aGUgZ2l2ZW4gcHJvamVjdA0KKwkgKi8NCisJcHVibGljIFNlYXJjaGFibGVFbnZpcm9ubWVudChJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQorCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KKwkJdGhpcy5uYW1lTG9va3VwID0gKE5hbWVMb29rdXApICgoSmF2YVByb2plY3QpIHByb2plY3QpLmdldE5hbWVMb29rdXAoKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgZ2l2ZW4gdHlwZSBpbiB0aGUgdGhlIGdpdmVuIHBhY2thZ2UgaWYgaXQgZXhpc3RzLA0KKwkgKiBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uDQorCSAqLw0KKwlwcm90ZWN0ZWQgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsNCisJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQ0KKwkJCXBhY2thZ2VOYW1lID0gSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsNCisJCUlUeXBlIHR5cGUgPQ0KKwkJCXRoaXMubmFtZUxvb2t1cC5maW5kVHlwZSgNCisJCQkJdHlwZU5hbWUsDQorCQkJCXBhY2thZ2VOYW1lLA0KKwkJCQlmYWxzZSwNCisJCQkJSU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBJTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7DQorCQlpZiAodHlwZSA9PSBudWxsKSB7DQorCQkJLy8gbG9vayBpbnNpZGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZCBjdXJyZW50bHkNCisJCQkvL2ZvciBhIG5vbi1wdWJsaWMgb3IgaW5uZXIgdHlwZS4NCisJCQlpZiAodGhpcy51bml0VG9Mb29rSW5zaWRlICE9IG51bGwpIHsNCisJCQkJaWYgKHRoaXMudW5pdFRvTG9va0luc2lkZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVR5cGVbXSBhbGxUeXBlcyA9IHRoaXMudW5pdFRvTG9va0luc2lkZS5nZXRUeXBlcygpOw0KKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspIHsNCisJCQkJCQkJaWYgKGFsbFR5cGVzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgew0KKwkJCQkJCQkJdHlwZSA9IGFsbFR5cGVzW2ldOw0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJCX0NCiAJCQkJCQl9DQorCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJCQkJfQ0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KLQl9DQotCWlmICh0eXBlICE9IG51bGwpIHsNCi0JCWlmICh0eXBlIGluc3RhbmNlb2YgQmluYXJ5VHlwZSkgew0KLQkJCXRyeSB7DQotCQkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKChJQmluYXJ5VHlwZSkgKChCaW5hcnlUeXBlKSB0eXBlKS5nZXRSYXdJbmZvKCkpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQkJfSBlbHNlIHsgLy9Tb3VyY2VUeXBlDQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoKElTb3VyY2VUeXBlKSgoU291cmNlVHlwZSl0eXBlKS5nZXRSYXdJbmZvKCkpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQorCQlpZiAodHlwZSAhPSBudWxsKSB7DQorCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7DQorCQkJCXRyeSB7DQorCQkJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcigNCisJCQkJCQkoSUJpbmFyeVR5cGUpICgoQmluYXJ5VHlwZSkgdHlwZSkuZ2V0UmF3SW5mbygpKTsNCisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgew0KKwkJCQkJcmV0dXJuIG51bGw7DQorCQkJCX0NCisJCQl9IGVsc2UgeyAvL1NvdXJjZVR5cGUNCisJCQkJdHJ5IHsNCisJCQkJCS8vIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgdHlwZQ0KKwkJCQkJU291cmNlVHlwZUVsZW1lbnRJbmZvIHNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKSgoU291cmNlVHlwZSl0eXBlKS5nZXRSYXdJbmZvKCk7DQorCQkJCQlJU291cmNlVHlwZSB0b3BMZXZlbFR5cGUgPSBzb3VyY2VUeXBlOw0KKwkJCQkJd2hpbGUgKHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgew0KKwkJCQkJCXRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCk7DQorCQkJCQl9DQorCQkJCQkvLyBmaW5kIGFsbCBzaWJsaW5ncyAob3RoZXIgdHlwZXMgZGVjbGFyZWQgaW4gc2FtZSB1bml0LCBzaW5jZSBtYXkgYmUgdXNlZCBmb3IgbmFtZSByZXNvbHV0aW9uKQ0KKwkJCQkJSVR5cGVbXSB0eXBlcyA9IHNvdXJjZVR5cGUuZ2V0SGFuZGxlKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0VHlwZXMoKTsNCisJCQkJCUlTb3VyY2VUeXBlW10gc291cmNlVHlwZXMgPSBuZXcgSVNvdXJjZVR5cGVbdHlwZXMubGVuZ3RoXTsNCisNCisJCQkJCS8vIGluIHRoZSByZXN1bHRpbmcgY29sbGVjdGlvbiwgZW5zdXJlIHRoZSByZXF1ZXN0ZWQgdHlwZSBpcyB0aGUgZmlyc3Qgb25lDQorCQkJCQlzb3VyY2VUeXBlc1swXSA9IHNvdXJjZVR5cGU7DQorCQkJCQlmb3IgKGludCBpID0gMCwgaW5kZXggPSAxOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsNCisJCQkJCQlJU291cmNlVHlwZSBvdGhlclR5cGUgPQ0KKwkJCQkJCQkoSVNvdXJjZVR5cGUpICgoSmF2YUVsZW1lbnQpIHR5cGVzW2ldKS5nZXRSYXdJbmZvKCk7DQorCQkJCQkJaWYgKCFvdGhlclR5cGUuZXF1YWxzKHRvcExldmVsVHlwZSkpDQorCQkJCQkJCXNvdXJjZVR5cGVzW2luZGV4KytdID0gb3RoZXJUeXBlOw0KKwkJCQkJfQ0KKwkJCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoc291cmNlVHlwZXMpOw0KKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7DQorCQkJCQlyZXR1cm4gbnVsbDsNCisJCQkJfQ0KIAkJCX0NCiAJCX0NCi0JfQ0KLQlyZXR1cm4gbnVsbDsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50DQotICovDQotcHVibGljIHZvaWQgZmluZFBhY2thZ2VzKGNoYXJbXSBwcmVmaXgsIElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7DQotCXRoaXMubmFtZUxvb2t1cC5zZWVrUGFja2FnZUZyYWdtZW50cyhuZXcgU3RyaW5nKHByZWZpeCksIHRydWUsIG5ldyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IocmVxdWVzdG9yKSk7CQ0KLX0NCi0vKioNCi0gKiBAc2VlIElOYW1lRW52aXJvbm1lbnQNCi0gKi8NCi1wdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kVHlwZU5hbWUpIHsNCi0JaWYgKGNvbXBvdW5kVHlwZU5hbWUgPT0gbnVsbCkNCiAJCXJldHVybiBudWxsOw0KLQlpbnQgbGVuZ3RoID0gY29tcG91bmRUeXBlTmFtZS5sZW5ndGg7DQotCWlmIChsZW5ndGggPT0gMSkNCi0JCXJldHVybiBmaW5kKG5ldyBTdHJpbmcoY29tcG91bmRUeXBlTmFtZVswXSksIG51bGwpOw0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiA2KTsNCi0JaW50IGxlbmd0aE0xID0gbGVuZ3RoIC0gMTsNCi0JZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aE0xOyBpKyspIHsNCi0JCWJ1ZmZlci5hcHBlbmQoY29tcG91bmRUeXBlTmFtZVtpXSk7DQotCQlpZiAoaSArIDEgIT0gbGVuZ3RoTTEpDQotCQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KIAl9DQotCVN0cmluZyBjbGFzc05hbWUgPSBuZXcgU3RyaW5nKGNvbXBvdW5kVHlwZU5hbWVbbGVuZ3RoTTFdKTsNCi0JcmV0dXJuIGZpbmQoY2xhc3NOYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7DQotfQ0KLS8qKg0KLSAqIEBzZWUgSU5hbWVFbnZpcm9ubWVudA0KLSAqLw0KLXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdIG5hbWUsIGNoYXJbXVtdIHBhY2thZ2VzKSB7DQotCWlmIChuYW1lID09IG51bGwpDQotCQlyZXR1cm4gbnVsbDsNCiANCi0JaWYgKHBhY2thZ2VzID09IG51bGwgfHwgcGFja2FnZXMubGVuZ3RoID09IDApDQotCQlyZXR1cm4gZmluZChuZXcgU3RyaW5nKG5hbWUpLCBudWxsKTsNCi0JCQ0KLQlpbnQgbGVuZ3RoID0gcGFja2FnZXMubGVuZ3RoOw0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiA2KTsNCi0JZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQlidWZmZXIuYXBwZW5kKHBhY2thZ2VzW2ldKTsNCi0JCWlmIChpICsgMSAhPSBsZW5ndGgpDQotCQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KKwkvKioNCisJICogQHNlZSBTZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50DQorCSAqLw0KKwlwdWJsaWMgdm9pZCBmaW5kUGFja2FnZXMoY2hhcltdIHByZWZpeCwgSVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsNCisJCXRoaXMubmFtZUxvb2t1cC5zZWVrUGFja2FnZUZyYWdtZW50cygNCisJCQluZXcgU3RyaW5nKHByZWZpeCksDQorCQkJdHJ1ZSwNCisJCQluZXcgU2VhcmNoYWJsZUVudmlyb25tZW50UmVxdWVzdG9yKHJlcXVlc3RvcikpOw0KIAl9DQotCVN0cmluZyBjbGFzc05hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOw0KLQlyZXR1cm4gZmluZChjbGFzc05hbWUsIGJ1ZmZlci50b1N0cmluZygpKTsNCi19DQotLyoqDQotICogQHNlZSBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudA0KLSAqLw0KLXB1YmxpYyB2b2lkIGZpbmRUeXBlcyhjaGFyW10gcHJlZml4LCBmaW5hbCBJU2VhcmNoUmVxdWVzdG9yIHN0b3JhZ2UpIHsNCiANCi0vKg0KLQlpZiAodHJ1ZSl7DQotCQlmaW5kVHlwZXMobmV3IFN0cmluZyhwcmVmaXgpLCBzdG9yYWdlLCBJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IElOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsNCi0JCXJldHVybjsJCQ0KKwkvKioNCisJICogQHNlZSBJTmFtZUVudmlyb25tZW50DQorCSAqLw0KKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kVHlwZU5hbWUpIHsNCisJCWlmIChjb21wb3VuZFR5cGVOYW1lID09IG51bGwpDQorCQkJcmV0dXJuIG51bGw7DQorCQlpbnQgbGVuZ3RoID0gY29tcG91bmRUeXBlTmFtZS5sZW5ndGg7DQorCQlpZiAobGVuZ3RoID09IDEpDQorCQkJcmV0dXJuIGZpbmQobmV3IFN0cmluZyhjb21wb3VuZFR5cGVOYW1lWzBdKSwgbnVsbCk7DQorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiA2KTsNCisJCWludCBsZW5ndGhNMSA9IGxlbmd0aCAtIDE7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aE0xOyBpKyspIHsNCisJCQlidWZmZXIuYXBwZW5kKGNvbXBvdW5kVHlwZU5hbWVbaV0pOw0KKwkJCWlmIChpICsgMSAhPSBsZW5ndGhNMSkNCisJCQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KKwkJfQ0KKwkJU3RyaW5nIGNsYXNzTmFtZSA9IG5ldyBTdHJpbmcoY29tcG91bmRUeXBlTmFtZVtsZW5ndGhNMV0pOw0KKwkJcmV0dXJuIGZpbmQoY2xhc3NOYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7DQogCX0NCi0qLwkNCi0JdHJ5IHsNCi0JCWZpbmFsIFN0cmluZyBleGNsdWRlUGF0aDsNCi0JCWlmICh0aGlzLnVuaXRUb1NraXAgIT0gbnVsbCl7DQotCQkJaWYgKCEodGhpcy51bml0VG9Ta2lwIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSl7IC8vIHJldmVydCB0byBtb2RlbCBpbnZlc3RpZ2F0aW9uDQorDQorCS8qKg0KKwkgKiBAc2VlIElOYW1lRW52aXJvbm1lbnQNCisJICovDQorCXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdIG5hbWUsIGNoYXJbXVtdIHBhY2thZ2VzKSB7DQorCQlpZiAobmFtZSA9PSBudWxsKQ0KKwkJCXJldHVybiBudWxsOw0KKw0KKwkJaWYgKHBhY2thZ2VzID09IG51bGwgfHwgcGFja2FnZXMubGVuZ3RoID09IDApDQorCQkJcmV0dXJuIGZpbmQobmV3IFN0cmluZyhuYW1lKSwgbnVsbCk7DQorDQorCQlpbnQgbGVuZ3RoID0gcGFja2FnZXMubGVuZ3RoOw0KKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICogNik7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJYnVmZmVyLmFwcGVuZChwYWNrYWdlc1tpXSk7DQorCQkJaWYgKGkgKyAxICE9IGxlbmd0aCkNCisJCQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KKwkJfQ0KKwkJU3RyaW5nIGNsYXNzTmFtZSA9IG5ldyBTdHJpbmcobmFtZSk7DQorCQlyZXR1cm4gZmluZChjbGFzc05hbWUsIGJ1ZmZlci50b1N0cmluZygpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQHNlZSBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudA0KKwkgKi8NCisJcHVibGljIHZvaWQgZmluZFR5cGVzKGNoYXJbXSBwcmVmaXgsIGZpbmFsIElTZWFyY2hSZXF1ZXN0b3Igc3RvcmFnZSkgew0KKw0KKwkJLyoNCisJCQlpZiAodHJ1ZSl7DQogCQkJCWZpbmRUeXBlcyhuZXcgU3RyaW5nKHByZWZpeCksIHN0b3JhZ2UsIElOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTIHwgSU5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOw0KIAkJCQlyZXR1cm47CQkNCiAJCQl9DQotCQkJZXhjbHVkZVBhdGggPSAoKElKYXZhRWxlbWVudCl0aGlzLnVuaXRUb1NraXApLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsNCi0JCX0gZWxzZSB7DQotCQkJZXhjbHVkZVBhdGggPSBudWxsOw0KLQkJfQ0KLQkJaW50IGxhc3REb3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBwcmVmaXgpOw0KLQkJY2hhcltdIHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWU7DQotCQlpZiAobGFzdERvdEluZGV4IDwgMCl7DQotCQkJcXVhbGlmaWNhdGlvbiA9IG51bGw7DQotCQkJc2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocHJlZml4KTsNCi0JCX0gZWxzZSB7DQotCQkJcXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocHJlZml4LCAwLCBsYXN0RG90SW5kZXgpOw0KLQkJCXNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkocHJlZml4LCBsYXN0RG90SW5kZXgrMSwgcHJlZml4Lmxlbmd0aCkpOw0KLQkJfQ0KLQkJDQotCQlTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOw0KLQ0KLQkJSVByb2plY3QgcHJvamVjdFJzYyA9IChJUHJvamVjdCkgdGhpcy5wcm9qZWN0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOw0KLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IHNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElSZXNvdXJjZVtdeyBwcm9qZWN0UnNjfSk7DQotDQotCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBJUHJvZ3Jlc3NNb25pdG9yKCl7DQotCQkJYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7DQotCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKXt9DQotCQkJcHVibGljIHZvaWQgZG9uZSgpe30NCi0JCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yayl7fQ0KLQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKXsgcmV0dXJuIGlzQ2FuY2VsZWQ7IH0NCi0JCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKXsgaXNDYW5jZWxlZCA9IHZhbHVlOyB9DQotCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpe30NCi0JCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKXt9DQotCQkJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKXt9DQotCQl9Ow0KLQkJSVR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IgPSBuZXcgSVR5cGVOYW1lUmVxdWVzdG9yKCl7DQotCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpew0KLQkJCQlpZiAoZXhjbHVkZVBhdGggIT0gbnVsbCAmJiBleGNsdWRlUGF0aC5lcXVhbHMocGF0aCkpIHJldHVybjsJDQotCQkJCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBhY2NlcHQgb25seSB0b3AgbGV2ZWwgdHlwZXMNCi0JCQkJc3RvcmFnZS5hY2NlcHRDbGFzcyhwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUsIDApOw0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpew0KLQkJCQlpZiAoZXhjbHVkZVBhdGggIT0gbnVsbCAmJiBleGNsdWRlUGF0aC5lcXVhbHMocGF0aCkpIHJldHVybjsJDQotCQkJCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBhY2NlcHQgb25seSB0b3AgbGV2ZWwgdHlwZXMNCi0JCQkJc3RvcmFnZS5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCAwKTsNCi0JCQl9DQotCQl9Ow0KKwkJKi8NCiAJCXRyeSB7DQotCQkJc2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcygNCi0JCQkJcHJvamVjdFJzYy5nZXRXb3Jrc3BhY2UoKSwgIA0KLQkJCQlxdWFsaWZpY2F0aW9uLCANCi0JCQkJc2ltcGxlTmFtZSwgDQotCQkJCVBSRUZJWF9NQVRDSCwgDQotCQkJCUNBU0VfSU5TRU5TSVRJVkUsDQotCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsDQotCQkJCXNjb3BlLA0KLQkJCQluYW1lUmVxdWVzdG9yLA0KLQkJCQlDQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSCwNCi0JCQkJcHJvZ3Jlc3NNb25pdG9yKTsNCi0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlmaW5kVHlwZXMobmV3IFN0cmluZyhwcmVmaXgpLCBzdG9yYWdlLCBJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IElOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsNCi0JCX0NCi0JfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7DQotCQlmaW5kVHlwZXMobmV3IFN0cmluZyhwcmVmaXgpLCBzdG9yYWdlLCBJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IElOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFsbCB0eXBlcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiAocXVhbGlmaWVkKSA8Y29kZT5wcmVmaXg8L2NvZGU+Lg0KLSAqDQotICogSWYgdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gaXMgdW5xdWFsaWZpZWQsIGFsbCB0eXBlcyB3aG9zZSBzaW1wbGUgbmFtZSBtYXRjaGVzDQotICogdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gYXJlIHJldHVybmVkLg0KLSAqLw0KLXByaXZhdGUgdm9pZCBmaW5kVHlwZXMoU3RyaW5nIHByZWZpeCwgSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlLCBpbnQgdHlwZSkgew0KLQlTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFNlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3RvcihzdG9yYWdlLCB0aGlzLnVuaXRUb1NraXApOw0KLQlpbnQgaW5kZXggPSBwcmVmaXgubGFzdEluZGV4T2YoJy4nKTsNCi0JaWYgKGluZGV4ID09IC0xKSB7DQotCQl0aGlzLm5hbWVMb29rdXAuc2Vla1R5cGVzKHByZWZpeCwgbnVsbCwgdHJ1ZSwgdHlwZSwgcmVxdWVzdG9yKTsNCi0JfSBlbHNlIHsNCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHByZWZpeC5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByZWZpeC5zdWJzdHJpbmcoaW5kZXggKyAxKTsNCi0JCUphdmFFbGVtZW50UmVxdWVzdG9yIGphdmFFbGVtZW50UmVxdWVzdG9yID0gbmV3IEphdmFFbGVtZW50UmVxdWVzdG9yKCk7DQotCQl0aGlzLm5hbWVMb29rdXAuc2Vla1BhY2thZ2VGcmFnbWVudHMocGFja2FnZU5hbWUsIGZhbHNlLCBqYXZhRWxlbWVudFJlcXVlc3Rvcik7DQotCQlJUGFja2FnZUZyYWdtZW50W10gcGFja2FnZUZyYWdtZW50cyA9IGphdmFFbGVtZW50UmVxdWVzdG9yLmdldFBhY2thZ2VGcmFnbWVudHMoKTsNCi0JCWlmIChwYWNrYWdlRnJhZ21lbnRzID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJZm9yIChpbnQgaSA9IDAsIHBhY2thZ2VzTGVuZ3RoID0gcGFja2FnZUZyYWdtZW50cy5sZW5ndGg7IGkgPCBwYWNrYWdlc0xlbmd0aDsgaSsrKSB7DQotCQkJaWYgKHBhY2thZ2VGcmFnbWVudHNbaV0gPT0gbnVsbCkNCi0JCQkJY29udGludWU7DQotCQkJdGhpcy5uYW1lTG9va3VwLnNlZWtUeXBlcyhjbGFzc05hbWUsIHBhY2thZ2VGcmFnbWVudHNbaV0sIHRydWUsIHR5cGUsIHJlcXVlc3Rvcik7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50DQotICovDQotcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIHBhcmVudFBhY2thZ2VOYW1lLCBjaGFyW10gc3ViUGFja2FnZU5hbWUpIHsNCi0JaWYgKHBhcmVudFBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFyZW50UGFja2FnZU5hbWUubGVuZ3RoID09IDApDQotCQlyZXR1cm4gaXNUb3BMZXZlbFBhY2thZ2Uoc3ViUGFja2FnZU5hbWUpOw0KLQlpZiAoc3ViUGFja2FnZU5hbWUgPT0gbnVsbCkNCi0JCXJldHVybiBmYWxzZTsNCi0JaW50IGxlbmd0aCA9IHBhcmVudFBhY2thZ2VOYW1lLmxlbmd0aDsNCi0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKGxlbmd0aCArIDEpICogNik7DQotCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJaWYgKHBhcmVudFBhY2thZ2VOYW1lW2ldID09IG51bGwgfHwgaXNRdWFsaWZpZWQocGFyZW50UGFja2FnZU5hbWVbaV0pKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWJ1ZmZlci5hcHBlbmQocGFyZW50UGFja2FnZU5hbWVbaV0pOw0KLQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KLQl9DQotCWlmIChpc1F1YWxpZmllZChzdWJQYWNrYWdlTmFtZSkpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQlidWZmZXIuYXBwZW5kKHN1YlBhY2thZ2VOYW1lKTsNCi0JYm9vbGVhbiByZXN1bHQ9IHRoaXMubmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhidWZmZXIudG9TdHJpbmcoKSwgZmFsc2UpICE9IG51bGw7DQotCXJldHVybiByZXN1bHQ7DQotCQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vICcuJyBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBuYW1lLg0KLSAqLw0KLXByb3RlY3RlZCBib29sZWFuIGlzUXVhbGlmaWVkKGNoYXJbXSBuYW1lKSB7DQotCWlmIChuYW1lICE9IG51bGwpIHsNCi0JCXJldHVybiBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJy4nLCBuYW1lKSA+IC0xOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50DQotICovDQotcHVibGljIGJvb2xlYW4gaXNUb3BMZXZlbFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKSB7DQotCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQlib29sZWFuIHJlc3VsdD0gIWlzUXVhbGlmaWVkKHBhY2thZ2VOYW1lKQ0KLQkJJiYgdGhpcy5uYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnRzKG5ldyBTdHJpbmcocGFja2FnZU5hbWUpLCBmYWxzZSkgIT0gbnVsbDsNCi0JcmV0dXJuIHJlc3VsdDsNCisJCQlmaW5hbCBTdHJpbmcgZXhjbHVkZVBhdGg7DQorCQkJaWYgKHRoaXMudW5pdFRvU2tpcCAhPSBudWxsKSB7DQorCQkJCWlmICghKHRoaXMudW5pdFRvU2tpcCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkpIHsNCisJCQkJCS8vIHJldmVydCB0byBtb2RlbCBpbnZlc3RpZ2F0aW9uDQorCQkJCQlmaW5kVHlwZXMoDQorCQkJCQkJbmV3IFN0cmluZyhwcmVmaXgpLA0KKwkJCQkJCXN0b3JhZ2UsDQorCQkJCQkJSU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBJTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQkJZXhjbHVkZVBhdGggPQ0KKwkJCQkJKChJSmF2YUVsZW1lbnQpIHRoaXMudW5pdFRvU2tpcCkNCisJCQkJCQkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkNCisJCQkJCQkuZ2V0RnVsbFBhdGgoKQ0KKwkJCQkJCS50b1N0cmluZygpOw0KKwkJCX0gZWxzZSB7DQorCQkJCWV4Y2x1ZGVQYXRoID0gbnVsbDsNCisJCQl9DQorCQkJaW50IGxhc3REb3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBwcmVmaXgpOw0KKwkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uLCBzaW1wbGVOYW1lOw0KKwkJCWlmIChsYXN0RG90SW5kZXggPCAwKSB7DQorCQkJCXF1YWxpZmljYXRpb24gPSBudWxsOw0KKwkJCQlzaW1wbGVOYW1lID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwcmVmaXgpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXF1YWxpZmljYXRpb24gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHByZWZpeCwgMCwgbGFzdERvdEluZGV4KTsNCisJCQkJc2ltcGxlTmFtZSA9DQorCQkJCQlDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKA0KKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkocHJlZml4LCBsYXN0RG90SW5kZXggKyAxLCBwcmVmaXgubGVuZ3RoKSk7DQorCQkJfQ0KIA0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBmb3IgdGhlIGFycmF5Lg0KLSAqLw0KLXByb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdDaGFyKGNoYXJbXSBuYW1lKSB7DQotCXJldHVybiAiWyIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhuYW1lKSArICJdIi8qbm9uTkxTKi87DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGZvciB0aGUgYXJyYXkuDQotICovDQotcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0NoYXJDaGFyKGNoYXJbXVtdIG5hbWVzKSB7DQotCVN0cmluZ0J1ZmZlciByZXN1bHQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JZm9yIChpbnQgaT0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7DQotCQlyZXN1bHQuYXBwZW5kKHRvU3RyaW5nQ2hhcihuYW1lc1tpXSkpOw0KKwkJCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7DQorDQorCQkJSVByb2plY3QgcHJvamVjdFJzYyA9IChJUHJvamVjdCkgdGhpcy5wcm9qZWN0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOw0KKwkJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPQ0KKwkJCQlzZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJUmVzb3VyY2VbXSB7IHByb2plY3RSc2MgfSk7DQorDQorCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgSVByb2dyZXNzTW9uaXRvcigpIHsNCisJCQkJYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7DQorCQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgew0KKwkJCQl9DQorCQkJCXB1YmxpYyB2b2lkIGRvbmUoKSB7DQorCQkJCX0NCisJCQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsNCisJCQkJfQ0KKwkJCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgew0KKwkJCQkJcmV0dXJuIGlzQ2FuY2VsZWQ7DQorCQkJCX0NCisJCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgew0KKwkJCQkJaXNDYW5jZWxlZCA9IHZhbHVlOw0KKwkJCQl9DQorCQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7DQorCQkJCX0NCisJCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgew0KKwkJCQl9DQorCQkJCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgew0KKwkJCQl9DQorCQkJfTsNCisJCQlJVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciA9IG5ldyBJVHlwZU5hbWVSZXF1ZXN0b3IoKSB7DQorCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKA0KKwkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLA0KKwkJCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLA0KKwkJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KKwkJCQkJU3RyaW5nIHBhdGgpIHsNCisJCQkJCWlmIChleGNsdWRlUGF0aCAhPSBudWxsICYmIGV4Y2x1ZGVQYXRoLmVxdWFscyhwYXRoKSkNCisJCQkJCQlyZXR1cm47DQorCQkJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA+IDApDQorCQkJCQkJcmV0dXJuOyAvLyBhY2NlcHQgb25seSB0b3AgbGV2ZWwgdHlwZXMNCisJCQkJCXN0b3JhZ2UuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBJQ29uc3RhbnRzLkFjY1B1YmxpYyk7DQorCQkJCX0NCisJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKA0KKwkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLA0KKwkJCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLA0KKwkJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KKwkJCQkJU3RyaW5nIHBhdGgpIHsNCisJCQkJCWlmIChleGNsdWRlUGF0aCAhPSBudWxsICYmIGV4Y2x1ZGVQYXRoLmVxdWFscyhwYXRoKSkNCisJCQkJCQlyZXR1cm47DQorCQkJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA+IDApDQorCQkJCQkJcmV0dXJuOyAvLyBhY2NlcHQgb25seSB0b3AgbGV2ZWwgdHlwZXMNCisJCQkJCXN0b3JhZ2UuYWNjZXB0SW50ZXJmYWNlKHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgSUNvbnN0YW50cy5BY2NQdWJsaWMpOw0KKwkJCQl9DQorCQkJfTsNCisJCQl0cnkgew0KKwkJCQlzZWFyY2hFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzKA0KKwkJCQkJcHJvamVjdFJzYy5nZXRXb3Jrc3BhY2UoKSwNCisJCQkJCXF1YWxpZmljYXRpb24sDQorCQkJCQlzaW1wbGVOYW1lLA0KKwkJCQkJUFJFRklYX01BVENILA0KKwkJCQkJQ0FTRV9JTlNFTlNJVElWRSwNCisJCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsDQorCQkJCQlzY29wZSwNCisJCQkJCW5hbWVSZXF1ZXN0b3IsDQorCQkJCQlDQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSCwNCisJCQkJCXByb2dyZXNzTW9uaXRvcik7DQorCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgew0KKwkJCQlmaW5kVHlwZXMoDQorCQkJCQluZXcgU3RyaW5nKHByZWZpeCksDQorCQkJCQlzdG9yYWdlLA0KKwkJCQkJSU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBJTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7DQorCQkJfQ0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCisJCQlmaW5kVHlwZXMoDQorCQkJCW5ldyBTdHJpbmcocHJlZml4KSwNCisJCQkJc3RvcmFnZSwNCisJCQkJSU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBJTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7DQorCQl9DQogCX0NCi0JcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLX0NCi19DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGFsbCB0eXBlcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiAocXVhbGlmaWVkKSA8Y29kZT5wcmVmaXg8L2NvZGU+Lg0KKwkgKg0KKwkgKiBJZiB0aGUgPGNvZGU+cHJlZml4PC9jb2RlPiBpcyB1bnF1YWxpZmllZCwgYWxsIHR5cGVzIHdob3NlIHNpbXBsZSBuYW1lIG1hdGNoZXMNCisJICogdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gYXJlIHJldHVybmVkLg0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGZpbmRUeXBlcyhTdHJpbmcgcHJlZml4LCBJU2VhcmNoUmVxdWVzdG9yIHN0b3JhZ2UsIGludCB0eXBlKSB7DQorCQlTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yID0NCisJCQluZXcgU2VhcmNoYWJsZUVudmlyb25tZW50UmVxdWVzdG9yKHN0b3JhZ2UsIHRoaXMudW5pdFRvU2tpcCk7DQorCQlpbnQgaW5kZXggPSBwcmVmaXgubGFzdEluZGV4T2YoJy4nKTsNCisJCWlmIChpbmRleCA9PSAtMSkgew0KKwkJCXRoaXMubmFtZUxvb2t1cC5zZWVrVHlwZXMocHJlZml4LCBudWxsLCB0cnVlLCB0eXBlLCByZXF1ZXN0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwcmVmaXguc3Vic3RyaW5nKDAsIGluZGV4KTsNCisJCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJlZml4LnN1YnN0cmluZyhpbmRleCArIDEpOw0KKwkJCUphdmFFbGVtZW50UmVxdWVzdG9yIGphdmFFbGVtZW50UmVxdWVzdG9yID0gbmV3IEphdmFFbGVtZW50UmVxdWVzdG9yKCk7DQorCQkJdGhpcy5uYW1lTG9va3VwLnNlZWtQYWNrYWdlRnJhZ21lbnRzKHBhY2thZ2VOYW1lLCBmYWxzZSwgamF2YUVsZW1lbnRSZXF1ZXN0b3IpOw0KKwkJCUlQYWNrYWdlRnJhZ21lbnRbXSBwYWNrYWdlRnJhZ21lbnRzID0NCisJCQkJamF2YUVsZW1lbnRSZXF1ZXN0b3IuZ2V0UGFja2FnZUZyYWdtZW50cygpOw0KKwkJCWlmIChwYWNrYWdlRnJhZ21lbnRzID09IG51bGwpDQorCQkJCXJldHVybjsNCisJCQlmb3IgKGludCBpID0gMCwgcGFja2FnZXNMZW5ndGggPSBwYWNrYWdlRnJhZ21lbnRzLmxlbmd0aDsNCisJCQkJaSA8IHBhY2thZ2VzTGVuZ3RoOw0KKwkJCQlpKyspIHsNCisJCQkJaWYgKHBhY2thZ2VGcmFnbWVudHNbaV0gPT0gbnVsbCkNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQl0aGlzLm5hbWVMb29rdXAuc2Vla1R5cGVzKA0KKwkJCQkJY2xhc3NOYW1lLA0KKwkJCQkJcGFja2FnZUZyYWdtZW50c1tpXSwNCisJCQkJCXRydWUsDQorCQkJCQl0eXBlLA0KKwkJCQkJcmVxdWVzdG9yKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBzZWUgU2VhcmNoYWJsZUJ1aWxkZXJFbnZpcm9ubWVudA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIHBhcmVudFBhY2thZ2VOYW1lLCBjaGFyW10gc3ViUGFja2FnZU5hbWUpIHsNCisJCWlmIChwYXJlbnRQYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhcmVudFBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQ0KKwkJCXJldHVybiBpc1RvcExldmVsUGFja2FnZShzdWJQYWNrYWdlTmFtZSk7DQorCQlpZiAoc3ViUGFja2FnZU5hbWUgPT0gbnVsbCkNCisJCQlyZXR1cm4gZmFsc2U7DQorCQlpbnQgbGVuZ3RoID0gcGFyZW50UGFja2FnZU5hbWUubGVuZ3RoOw0KKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKGxlbmd0aCArIDEpICogNik7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJaWYgKHBhcmVudFBhY2thZ2VOYW1lW2ldID09IG51bGwgfHwgaXNRdWFsaWZpZWQocGFyZW50UGFja2FnZU5hbWVbaV0pKQ0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJYnVmZmVyLmFwcGVuZChwYXJlbnRQYWNrYWdlTmFtZVtpXSk7DQorCQkJYnVmZmVyLmFwcGVuZCgnLicpOw0KKwkJfQ0KKwkJaWYgKGlzUXVhbGlmaWVkKHN1YlBhY2thZ2VOYW1lKSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWJ1ZmZlci5hcHBlbmQoc3ViUGFja2FnZU5hbWUpOw0KKwkJYm9vbGVhbiByZXN1bHQgPQ0KKwkJCXRoaXMubmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhidWZmZXIudG9TdHJpbmcoKSwgZmFsc2UpICE9IG51bGw7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vICcuJyBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBuYW1lLg0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNRdWFsaWZpZWQoY2hhcltdIG5hbWUpIHsNCisJCWlmIChuYW1lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcuJywgbmFtZSkgPiAtMTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQHNlZSBTZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50DQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc1RvcExldmVsUGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpIHsNCisJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCWJvb2xlYW4gcmVzdWx0ID0NCisJCQkhaXNRdWFsaWZpZWQocGFja2FnZU5hbWUpDQorCQkJCSYmIHRoaXMubmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKSwgZmFsc2UpICE9IG51bGw7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBmb3IgdGhlIGFycmF5Lg0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0NoYXIoY2hhcltdIG5hbWUpIHsNCisJCXJldHVybiAiWyIgIC8vJE5PTi1OTFMtMSQNCisJCSsgbmV3IFN0cmluZyhuYW1lKSArICJdIiA7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgZm9yIHRoZSBhcnJheS4NCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdDaGFyQ2hhcihjaGFyW11bXSBuYW1lcykgew0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsNCisJCQlyZXN1bHQuYXBwZW5kKHRvU3RyaW5nQ2hhcihuYW1lc1tpXSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VsZWN0aW9uUmVxdWVzdG9yLmphdmEKaW5kZXggYmM5NGZiYy4uY2JiZTk0MiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VsZWN0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VsZWN0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkJZm9yIChpbnQgaT0gMCwgbWF4ID0gcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7DQogCQkJU3RyaW5nIHBrZyA9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7DQogCQkJaWYgKHBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSAhPSBudWxsICYmIHBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXS5sZW5ndGggPiAwKSB7DQotCQkJCXBrZyA9IG5ldyBTdHJpbmcocGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldKSArICIuIi8qbm9uTkxTKi87DQorCQkJCXBrZyA9IG5ldyBTdHJpbmcocGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldKSArICIuIjsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQlwYXJhbWV0ZXJUeXBlc1tpXT0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoDQogCQkJCXBrZyArIG5ldyBTdHJpbmcocGFyYW1ldGVyVHlwZU5hbWVzW2ldKSwgdHJ1ZSk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YQppbmRleCBhOTQ1NTk4Li4yY2Q0MDVjIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YQpAQCAtNTcsNyArNTcsNyBAQAogICogU2V0cyB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcmUtc3BlY2lmaWVkIHByb2plY3QuDQogICovDQogcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQliZWdpblRhc2soVXRpbC5iaW5kKCJjbGFzc3BhdGguc2V0dGluZ1Byb2dyZXNzIi8qbm9uTkxTKi8pLCAyKTsNCisJYmVnaW5UYXNrKFV0aWwuYmluZCgiY2xhc3NwYXRoLnNldHRpbmdQcm9ncmVzcyIpLCAyKTsgLy8kTk9OLU5MUy0xJA0KIAlKYXZhUHJvamVjdCBwcm9qZWN0PSAoKEphdmFQcm9qZWN0KSBnZXRFbGVtZW50c1RvUHJvY2VzcygpWzBdKTsNCiAJDQogCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoMCh0aGlzLm5ld1Jhd1BhdGgpOw0KQEAgLTE2NCw5ICsxNjQsNyBAQAogCWlmICghc3RhdHVzLmlzT0soKSkgew0KIAkJcmV0dXJuIHN0YXR1czsNCiAJfQ0KLQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSB0aGlzLm5ld1Jhd1BhdGg7DQogCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpZ2V0RWxlbWVudFRvUHJvY2VzcygpOw0KLQlJUGF0aCBwcm9qZWN0UGF0aD0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7DQogDQogCS8vIHJldHJpZXZlIG91dHB1dCBsb2NhdGlvbg0KIAlJUGF0aCBvdXRwdXRMb2NhdGlvbjsNCkBAIC0xNzYsNDkgKzE3NCw3IEBACiAJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOw0KIAl9DQogDQotCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbA0KLQlib29sZWFuIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gZmFsc2U7DQotCWJvb2xlYW4gaGFzU291cmNlID0gZmFsc2U7DQotCWZvciAoaW50IGkgPSAwIDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgew0KLQkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgaGFzU291cmNlID0gdHJ1ZTsNCi0JCWlmIChjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpew0KLQkJCWFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQlpZiAoIWhhc1NvdXJjZSkgYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSB0cnVlOyAvLyBpZiBubyBzb3VyY2UsIHRoZW4gYWxsb3dlZA0KLQkNCi0JLy8gY2hlY2sgYWxsIGVudHJpZXMNCi0JZm9yIChpbnQgaSA9IDAgOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7DQotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07DQotCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7DQotDQotCQkvLyBubyBmdXJ0aGVyIGNoZWNrIGlmIGVudHJ5IGNvaW5jaWRhdGVzIHdpdGggcHJvamVjdCBvciBvdXRwdXQgbG9jYXRpb24NCi0JCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSkgY29udGludWU7DQotCQlpZiAoZW50cnlQYXRoLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIGNvbnRpbnVlOw0KLQkJDQotCQkvLyBwcmV2ZW50IG5lc3Rpbmcgc291cmNlIGVudHJpZXMgaW4gZWFjaCBvdGhlcg0KLQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKXsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aC5sZW5ndGg7IGorKyl7DQotCQkJCUlDbGFzc3BhdGhFbnRyeSBvdGhlckVudHJ5ID0gY2xhc3NwYXRoW2pdOw0KLQkJCQlpZiAoZW50cnkgIT0gb3RoZXJFbnRyeSAmJiBvdGhlckVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKXsNCi0JCQkJCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihvdGhlckVudHJ5LmdldFBhdGgoKSkpew0KLQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBlbnRyeVBhdGgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJLy8gcHJldmVudCBuZXN0aW5nIG91dHB1dCBsb2NhdGlvbiBpbnNpZGUgZW50cnkNCi0JCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihvdXRwdXRMb2NhdGlvbikpIHsNCi0JCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwgZW50cnlQYXRoKTsNCi0JCX0NCi0NCi0JCS8vIHByZXZlbnQgbmVzdGluZyBlbnRyeSBpbnNpZGUgb3V0cHV0IGxvY2F0aW9uIC0gd2hlbiBkaXN0aW5jdCBmcm9tIHByb2plY3Qgb3IgYSBzb3VyY2UgZm9sZGVyDQotCQlpZiAoIWFsbG93TmVzdGluZ0luT3V0cHV0ICYmIG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoZW50cnlQYXRoKSkgew0KLQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBlbnRyeVBhdGgpOw0KLQkJfQ0KLQl9DQotCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7DQorCXJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgoamF2YVByb2plY3QsIHRoaXMubmV3UmF3UGF0aCwgb3V0cHV0TG9jYXRpb24pOw0KIH0NCiANCiAvKioNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRPdXRwdXRMb2NhdGlvbk9wZXJhdGlvbi5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2V0T3V0cHV0TG9jYXRpb25PcGVyYXRpb24uamF2YQppbmRleCAzZWEzMDQ4Li41OTFhNmNmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRPdXRwdXRMb2NhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldE91dHB1dExvY2F0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKIAkJCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gZi5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudHMpOw0KIAkJCQkJU3RyaW5nIG5hbWUgPSByZWxhdGl2ZVBhdGgudG9PU1N0cmluZygpOw0KIAkJCQkJbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCAnLicpOw0KLQkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi4iLypub25OTFMqLykpIHsNCisJCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIuIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7DQogCQkJCQl9DQogCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG5hbWUpOw0KQEAgLTEwNCw3ICsxMDQsNyBAQAogICogYSBwYWNrYWdlIGZyYWdtZW50Lg0KICAqLw0KIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JYmVnaW5UYXNrKFV0aWwuYmluZCgiY2xhc3NwYXRoLnNldHRpbmdPdXRwdXRMb2NhdGlvblByb2dyZXNzIi8qbm9uTkxTKi8pLCAyKTsNCisJYmVnaW5UYXNrKFV0aWwuYmluZCgiY2xhc3NwYXRoLnNldHRpbmdPdXRwdXRMb2NhdGlvblByb2dyZXNzIiksIDIpOyAvLyROT04tTkxTLTEkDQogCUphdmFQcm9qZWN0IHByb2plY3Q9ICgoSmF2YVByb2plY3QpIGdldEVsZW1lbnRzVG9Qcm9jZXNzKClbMF0pOw0KIAkNCiAJSVBhdGggb2xkTG9jYXRpb249IHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsNCkBAIC0xNjYsMjcgKzE2Niw2IEBACiAJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQogCQlyZXR1cm4gc3RhdHVzOw0KIAl9DQotCWlmIChmT3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTlVMTF9QQVRIKTsNCi0JfQ0KLQkNCi0JaWYgKGZPdXRwdXRMb2NhdGlvbi5pc0Fic29sdXRlKCkpIHsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoKElKYXZhUHJvamVjdCkgZkVsZW1lbnRzVG9Qcm9jZXNzWzBdKS5nZXRQcm9qZWN0KCk7DQotDQotCQlpZiAocHJvamVjdC5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YoZk91dHB1dExvY2F0aW9uKSkgew0KLQkJCS8vcHJvamVjdCByZWxhdGl2ZSBwYXRoDQotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZk91dHB1dExvY2F0aW9uLnNlZ21lbnQoMCk7DQotCQkJaWYgKCFwcm9qZWN0TmFtZS5lcXVhbHMoZkVsZW1lbnRzVG9Qcm9jZXNzWzBdLmdldEVsZW1lbnROYW1lKCkpKSB7DQotCQkJCS8vYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBvdXRzaWRlIG9mIHRoaXMgcHJvamVjdA0KLQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlBBVEhfT1VUU0lERV9QUk9KRUNULCBmT3V0cHV0TG9jYXRpb24pOw0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5ERVZJQ0VfUEFUSCwgZk91dHB1dExvY2F0aW9uKTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVMQVRJVkVfUEFUSCwgZk91dHB1dExvY2F0aW9uKTsNCi0JfQ0KLQ0KIAkvLyByZXRyaWV2ZSBjbGFzc3BhdGgNCiAJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbnVsbDsNCiAJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0PSAoSUphdmFQcm9qZWN0KWdldEVsZW1lbnRUb1Byb2Nlc3MoKTsNCkBAIC0xOTYsMzggKzE3NSw2IEBACiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCiAJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOw0KIAl9DQotDQotCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbA0KLQlib29sZWFuIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gZmFsc2U7DQotCWJvb2xlYW4gaGFzU291cmNlID0gZmFsc2U7DQotCWZvciAoaW50IGkgPSAwIDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgew0KLQkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgaGFzU291cmNlID0gdHJ1ZTsNCi0JCWlmIChjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhmT3V0cHV0TG9jYXRpb24pKXsNCi0JCQlhbGxvd05lc3RpbmdJbk91dHB1dCA9IHRydWU7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0JaWYgKCFoYXNTb3VyY2UpIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsgLy8gaWYgbm8gc291cmNlLCB0aGVuIGFsbG93ZWQNCi0NCi0JLy8gY2hlY2sgYWxsIGVudHJpZXMNCi0JZm9yIChpbnQgaSA9IDAgOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7DQotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07DQotCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7DQotDQotCQkvLyBubyBmdXJ0aGVyIGNoZWNrIGlmIGVudHJ5IGNvaW5jaWRhdGVzIHdpdGggcHJvamVjdCBvciBvdXRwdXQgbG9jYXRpb24NCi0JCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSkgY29udGludWU7DQotCQlpZiAoZW50cnlQYXRoLmVxdWFscyhmT3V0cHV0TG9jYXRpb24pKSBjb250aW51ZTsNCi0JCQ0KLQkJLy8gcHJldmVudCBuZXN0aW5nIG91dHB1dCBsb2NhdGlvbiBpbnNpZGUgZW50cnkNCi0JCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihmT3V0cHV0TG9jYXRpb24pKSB7DQotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIGZPdXRwdXRMb2NhdGlvbik7DQotCQl9DQotDQotCQkvLyBwcmV2ZW50IG5lc3RpbmcgZW50cnkgaW5zaWRlIG91dHB1dCBsb2NhdGlvbiAtIHdoZW4gZGlzdGluY3QgZnJvbSBwcm9qZWN0IG9yIGEgc291cmNlIGZvbGRlcg0KLQkJaWYgKCFhbGxvd05lc3RpbmdJbk91dHB1dCAmJiBmT3V0cHV0TG9jYXRpb24uaXNQcmVmaXhPZihlbnRyeVBhdGgpKSB7DQotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIGZPdXRwdXRMb2NhdGlvbik7DQotCQl9DQotCX0NCi0JcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsNCisJcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aCgoSUphdmFQcm9qZWN0KSBmRWxlbWVudHNUb1Byb2Nlc3NbMF0sIGNsYXNzcGF0aCwgZk91dHB1dExvY2F0aW9uKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZC5qYXZhCmluZGV4IDAwZDViMDYuLjM4OGIwMTkgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGQuamF2YQpAQCAtNTMsMTQgKzUzLDE0IEBACiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsNCiAJaWYgKGluZm8gPT0gbnVsbCkgew0KIAkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJdHJ5IHsNCiAJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyh0aGlzLmdldFR5cGVTaWduYXR1cmUoKSkpOw0KLQkJCWJ1ZmZlci5hcHBlbmQoIiAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEVsZW1lbnROYW1lKCkpOw0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCI8SmF2YU1vZGVsRXhjZXB0aW9uIGluIHRvU3RyaW5nIG9mICIvKm5vbk5MUyovICsgZ2V0RWxlbWVudE5hbWUoKSk7DQorCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiICsgZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNYXBwZXIuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1hcHBlci5qYXZhCmluZGV4IGZmZWNlYjkuLjUyNzIzNjggMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1hcHBlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1hcHBlci5qYXZhCkBAIC0zMSw3ICszMSw5IEBACiAgKiBAc2VlIEF0dGFjaFNvdXJjZU9wZXJhdGlvbg0KICAqIEBzZWUgSmFyUGFja2FnZUZyYWdtZW50DQogICovDQotcHVibGljIGNsYXNzIFNvdXJjZU1hcHBlciBleHRlbmRzIFJlZmVyZW5jZUluZm9BZGFwdGVyIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3Igew0KK3B1YmxpYyBjbGFzcyBTb3VyY2VNYXBwZXINCisJZXh0ZW5kcyBSZWZlcmVuY2VJbmZvQWRhcHRlcg0KKwlpbXBsZW1lbnRzIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yIHsNCiANCiAJLyoqDQogCSAqIFRoZSBiaW5hcnkgdHlwZSBzb3VyY2UgaXMgYmVpbmcgbWFwcGVkIGZvcg0KQEAgLTcwLDcgKzcyLDcgQEAKIAkvKioNCiAJICogVGhlIHVua25vd24gc291cmNlIHJhbmdlIHstMSwgMH0NCiAJICovDQotCXByb3RlY3RlZCBzdGF0aWMgU291cmNlUmFuZ2UgZmdVbmtub3duUmFuZ2U9IG5ldyBTb3VyY2VSYW5nZSgtMSwgMCk7DQorCXByb3RlY3RlZCBzdGF0aWMgU291cmNlUmFuZ2UgZmdVbmtub3duUmFuZ2UgPSBuZXcgU291cmNlUmFuZ2UoLTEsIDApOw0KIA0KIAkvKioNCiAJICogVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgc291cmNlIG9mIHRoZSBzdGFydCBvZiB0aGUNCkBAIC05Niw0MjAgKzk4LDYwMiBAQAogCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50Ow0KIA0KIAkvKioNCisJICogaW1wb3J0cyByZWZlcmVuY2VzDQorCSAqLw0KKwlwcml2YXRlIEhhc2h0YWJsZSBpbXBvcnRzVGFibGU7DQorCXByaXZhdGUgSGFzaHRhYmxlIGltcG9ydHNDb3VudGVyVGFibGU7DQorDQorCS8qKg0KIAkgKiBFbmNsb3NpbmcgdHlwZSBpbmZvcm1hdGlvbg0KIAkgKi8NCi0JIElUeXBlW10gdHlwZXM7DQotCSBpbnRbXSB0eXBlRGVjbGFyYXRpb25TdGFydHM7DQotCSBTb3VyY2VSYW5nZVtdIHR5cGVOYW1lUmFuZ2VzOw0KLQkgaW50IHR5cGVEZXB0aDsNCi0vKioNCi0gKiBDcmVhdGVzIGEgPGNvZGU+U291cmNlTWFwcGVyPC9jb2RlPiB0aGF0IGxvY2F0ZXMgc291cmNlIGluIHRoZSB6aXAgZmlsZQ0KLSAqIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4NCi0gKi8NCi1wdWJsaWMgU291cmNlTWFwcGVyKElQYXRoIHppcFBhdGgsIFN0cmluZyByb290UGF0aCwgSmF2YU1vZGVsIG1vZGVsKSB7DQotCWZaaXBQYXRoPSB6aXBQYXRoOw0KLQlmUm9vdFBhdGg9IHJvb3RQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsNCi0JaWYgKGZSb290UGF0aC5lbmRzV2l0aCgiLyIvKm5vbk5MUyovKSkgew0KLQkJZlJvb3RQYXRoID0gZlJvb3RQYXRoLnN1YnN0cmluZygwLCBmUm9vdFBhdGgubGFzdEluZGV4T2YoJy8nKSk7DQorCUlUeXBlW10gdHlwZXM7DQorCWludFtdIHR5cGVEZWNsYXJhdGlvblN0YXJ0czsNCisJU291cmNlUmFuZ2VbXSB0eXBlTmFtZVJhbmdlczsNCisJaW50IHR5cGVEZXB0aDsNCisJLyoqDQorCSAqIENyZWF0ZXMgYSA8Y29kZT5Tb3VyY2VNYXBwZXI8L2NvZGU+IHRoYXQgbG9jYXRlcyBzb3VyY2UgaW4gdGhlIHppcCBmaWxlDQorCSAqIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4NCisJICovDQorCXB1YmxpYyBTb3VyY2VNYXBwZXIoSVBhdGggemlwUGF0aCwgU3RyaW5nIHJvb3RQYXRoLCBKYXZhTW9kZWwgbW9kZWwpIHsNCisJCWZaaXBQYXRoID0gemlwUGF0aDsNCisJCWZSb290UGF0aCA9IHJvb3RQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsNCisJCWlmIChmUm9vdFBhdGguZW5kc1dpdGgoIi8iICkpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCWZSb290UGF0aCA9IGZSb290UGF0aC5zdWJzdHJpbmcoMCwgZlJvb3RQYXRoLmxhc3RJbmRleE9mKCcvJykpOw0KKwkJfQ0KKwkJZkphdmFNb2RlbCA9IG1vZGVsOw0KKwkJZlNvdXJjZVJhbmdlcyA9IG5ldyBIYXNodGFibGUoKTsNCisJCWltcG9ydHNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsNCisJCWltcG9ydHNDb3VudGVyVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7DQogCX0NCi0JZkphdmFNb2RlbD0gbW9kZWw7DQotCWZTb3VyY2VSYW5nZXM9IG5ldyBIYXNodGFibGUoKTsNCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdEltcG9ydChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBjaGFyW10gbmFtZSwgYm9vbGVhbiBvbkRlbWFuZCkgew0KLQkvL2RvIG5vdGhpbmcNCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdEluaXRpYWxpemVyKGludCBtb2RpZmllcnMsIGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsNCi0JLy9kbyBub3RoaW5nDQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKGludFtdIHBvc2l0aW9ucykgew0KLQkvL2RvIG5vdGhpbmcNCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdIG5hbWUpIHsNCi0JLy9kbyBub3RoaW5nDQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsNCi0JLy9kbyBub3RoaW5nDQotfQ0KLS8qKg0KLSAqIENsb3NlcyB0aGlzIDxjb2RlPlNvdXJjZU1hcHBlcjwvY29kZT4ncyB6aXAgZmlsZS4gT25jZSB0aGlzIGlzIGRvbmUsIHRoaXMNCi0gKiA8Y29kZT5Tb3VyY2VNYXBwZXI8L2NvZGU+IGNhbm5vdCBiZSB1c2VkIGFnYWluLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCWZTb3VyY2VSYW5nZXM9IG51bGw7DQotfQ0KLS8qKg0KLSAqIENvbnZlcnRzIHRoZXNlIHR5cGUgbmFtZXMgdG8gc2lnbmF0dXJlcy4NCi0gKiBAc2VlIFNpZ25hdHVyZS4NCi0gKi8NCi1wdWJsaWMgU3RyaW5nW10gY29udmVydFR5cGVOYW1lc1RvU2lncyhjaGFyW11bXSB0eXBlTmFtZXMpIHsNCi0JaWYgKHR5cGVOYW1lcyA9PSBudWxsKQ0KLQkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsNCi0JaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOw0KLQlpZiAobiA9PSAwKQ0KLQkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsNCi0JU3RyaW5nW10gdHlwZVNpZ3MgPSBuZXcgU3RyaW5nW25dOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgew0KLQkJdHlwZVNpZ3NbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZXNbaV0sIGZhbHNlKTsNCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoDQorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwNCisJCWludCBkZWNsYXJhdGlvbkVuZCwNCisJCWNoYXJbXSBuYW1lLA0KKwkJYm9vbGVhbiBvbkRlbWFuZCkgew0KKwkJY2hhcltdW10gaW1wb3J0cyA9IChjaGFyW11bXSkgdGhpcy5pbXBvcnRzVGFibGUuZ2V0KGZUeXBlKTsNCisJCWludCBpbXBvcnRzQ291bnRlcjsNCisJCWlmIChpbXBvcnRzID09IG51bGwpIHsNCisJCQlpbXBvcnRzID0gbmV3IGNoYXJbNV1bXTsNCisJCQlpbXBvcnRzQ291bnRlciA9IDA7DQorCQl9IGVsc2Ugew0KKwkJCWltcG9ydHNDb3VudGVyID0gKChJbnRlZ2VyKSB0aGlzLmltcG9ydHNDb3VudGVyVGFibGUuZ2V0KGZUeXBlKSkuaW50VmFsdWUoKTsNCisJCX0NCisJCWlmIChpbXBvcnRzLmxlbmd0aCA9PSBpbXBvcnRzQ291bnRlcikgew0KKwkJCVN5c3RlbS5hcnJheWNvcHkoDQorCQkJCWltcG9ydHMsDQorCQkJCTAsDQorCQkJCShpbXBvcnRzID0gbmV3IGNoYXJbaW1wb3J0c0NvdW50ZXIgKiAyXVtdKSwNCisJCQkJMCwNCisJCQkJaW1wb3J0c0NvdW50ZXIpOw0KKwkJfQ0KKwkJaW1wb3J0c1tpbXBvcnRzQ291bnRlcisrXSA9IG5hbWU7DQorCQl0aGlzLmltcG9ydHNUYWJsZS5wdXQoZlR5cGUsIGltcG9ydHMpOw0KKwkJdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLnB1dChmVHlwZSwgbmV3IEludGVnZXIoaW1wb3J0c0NvdW50ZXIpKTsNCiAJfQ0KLQlyZXR1cm4gdHlwZVNpZ3M7DQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBlbnRlckNsYXNzKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTb3VyY2VTdGFydCwgaW50IG5hbWVTb3VyY2VFbmQsIGNoYXJbXSBzdXBlcmNsYXNzLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsNCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbml0aWFsaXplcigNCisJCWludCBtb2RpZmllcnMsDQorCQlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwNCisJCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZCkgew0KKwkJLy9kbyBub3RoaW5nDQorCX0NCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKGludFtdIHBvc2l0aW9ucykgew0KKwkJLy9kbyBub3RoaW5nDQorCX0NCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKA0KKwkJaW50IGRlY2xhcmF0aW9uU3RhcnQsDQorCQlpbnQgZGVjbGFyYXRpb25FbmQsDQorCQljaGFyW10gbmFtZSkgew0KKwkJLy9kbyBub3RoaW5nDQorCX0NCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsNCisJCS8vZG8gbm90aGluZw0KKwl9DQorCQ0KKwkvKioNCisJICogQ2xvc2VzIHRoaXMgPGNvZGU+U291cmNlTWFwcGVyPC9jb2RlPidzIHppcCBmaWxlLiBPbmNlIHRoaXMgaXMgZG9uZSwgdGhpcw0KKwkgKiA8Y29kZT5Tb3VyY2VNYXBwZXI8L2NvZGU+IGNhbm5vdCBiZSB1c2VkIGFnYWluLg0KKwkgKi8NCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCisJCWZTb3VyY2VSYW5nZXMgPSBudWxsOw0KKwl9DQorCQ0KKwkvKioNCisJICogQ29udmVydHMgdGhlc2UgdHlwZSBuYW1lcyB0byBzaWduYXR1cmVzLg0KKwkgKiBAc2VlIFNpZ25hdHVyZS4NCisJICovDQorCXB1YmxpYyBTdHJpbmdbXSBjb252ZXJ0VHlwZU5hbWVzVG9TaWdzKGNoYXJbXVtdIHR5cGVOYW1lcykgew0KKwkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQ0KKwkJCXJldHVybiBmZ0VtcHR5U3RyaW5nQXJyYXk7DQorCQlpbnQgbiA9IHR5cGVOYW1lcy5sZW5ndGg7DQorCQlpZiAobiA9PSAwKQ0KKwkJCXJldHVybiBmZ0VtcHR5U3RyaW5nQXJyYXk7DQorCQlTdHJpbmdbXSB0eXBlU2lncyA9IG5ldyBTdHJpbmdbbl07DQorCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgew0KKwkJCXR5cGVTaWdzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodHlwZU5hbWVzW2ldLCBmYWxzZSk7DQorCQl9DQorCQlyZXR1cm4gdHlwZVNpZ3M7DQorCX0NCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBlbnRlckNsYXNzKA0KKwkJaW50IGRlY2xhcmF0aW9uU3RhcnQsDQorCQlpbnQgbW9kaWZpZXJzLA0KKwkJY2hhcltdIG5hbWUsDQorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LA0KKwkJaW50IG5hbWVTb3VyY2VFbmQsDQorCQljaGFyW10gc3VwZXJjbGFzcywNCisJCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgew0KIA0KLQl0aGlzLnR5cGVEZXB0aCsrOw0KLQlpZiAodGhpcy50eXBlRGVwdGggPT0gdGhpcy50eXBlcy5sZW5ndGgpeyAvLyBuZWVkIHRvIGdyb3cNCi0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy50eXBlcywgMCwgdGhpcy50eXBlcyA9IG5ldyBJVHlwZVt0aGlzLnR5cGVEZXB0aCoyXSwgMCwgdGhpcy50eXBlRGVwdGgpOw0KLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVOYW1lUmFuZ2VzLCAwLCB0aGlzLnR5cGVOYW1lUmFuZ2VzID0gbmV3IFNvdXJjZVJhbmdlW3RoaXMudHlwZURlcHRoKjJdLCAwLCB0aGlzLnR5cGVEZXB0aCk7DQotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzLCAwLCB0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0cyA9IG5ldyBpbnRbdGhpcy50eXBlRGVwdGgqMl0sIDAsIHRoaXMudHlwZURlcHRoKTsNCisJCXRoaXMudHlwZURlcHRoKys7DQorCQlpZiAodGhpcy50eXBlRGVwdGggPT0gdGhpcy50eXBlcy5sZW5ndGgpIHsgLy8gbmVlZCB0byBncm93DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJdGhpcy50eXBlcywNCisJCQkJMCwNCisJCQkJdGhpcy50eXBlcyA9IG5ldyBJVHlwZVt0aGlzLnR5cGVEZXB0aCAqIDJdLA0KKwkJCQkwLA0KKwkJCQl0aGlzLnR5cGVEZXB0aCk7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJdGhpcy50eXBlTmFtZVJhbmdlcywNCisJCQkJMCwNCisJCQkJdGhpcy50eXBlTmFtZVJhbmdlcyA9IG5ldyBTb3VyY2VSYW5nZVt0aGlzLnR5cGVEZXB0aCAqIDJdLA0KKwkJCQkwLA0KKwkJCQl0aGlzLnR5cGVEZXB0aCk7DQorCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHMsDQorCQkJCTAsDQorCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzID0gbmV3IGludFt0aGlzLnR5cGVEZXB0aCAqIDJdLA0KKwkJCQkwLA0KKwkJCQl0aGlzLnR5cGVEZXB0aCk7DQorCQl9DQorCQl0aGlzLnR5cGVzW3R5cGVEZXB0aF0gPSB0aGlzLmdldFR5cGUobmV3IFN0cmluZyhuYW1lKSk7DQorCQl0aGlzLnR5cGVOYW1lUmFuZ2VzW3R5cGVEZXB0aF0gPQ0KKwkJCW5ldyBTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsNCisJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzW3R5cGVEZXB0aF0gPSBkZWNsYXJhdGlvblN0YXJ0Ow0KIAl9DQotCXRoaXMudHlwZXNbdHlwZURlcHRoXSA9IHRoaXMuZ2V0VHlwZShuZXcgU3RyaW5nKG5hbWUpKTsNCi0JdGhpcy50eXBlTmFtZVJhbmdlc1t0eXBlRGVwdGhdID0gbmV3IFNvdXJjZVJhbmdlKG5hbWVTb3VyY2VTdGFydCwgbmFtZVNvdXJjZUVuZCAtIG5hbWVTb3VyY2VTdGFydCArIDEpOw0KLQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdID0gZGVjbGFyYXRpb25TdGFydDsNCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGVudGVyQ29tcGlsYXRpb25Vbml0KCkgew0KLQkvLyBkbyBub3RoaW5nDQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTb3VyY2VTdGFydCwgaW50IG5hbWVTb3VyY2VFbmQsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsNCi0JZW50ZXJNZXRob2QoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBudWxsLCBuYW1lLCBuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJOYW1lcywgZXhjZXB0aW9uVHlwZXMpOw0KLX0NCi0vKioNCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQotICovDQotcHVibGljIHZvaWQgZW50ZXJGaWVsZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIHR5cGUsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCkgew0KLQlpZiAodHlwZURlcHRoID49IDAgJiYgZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgPT0gLTEpIHsgLy8gZG9uJ3QgYWxsb3cgbmVzdGVkIG1lbWJlciAoY2FuIG9ubHkgaGFwcGVuIHdpdGggYW5vbnltb3VzIGlubmVyIGNsYXNzZXMpDQotCQlmTWVtYmVyRGVjbGFyYXRpb25TdGFydD0gZGVjbGFyYXRpb25TdGFydDsNCi0JCWZNZW1iZXJOYW1lUmFuZ2U9IG5ldyBTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsNCi0JCWZNZW1iZXJOYW1lPSBuZXcgU3RyaW5nKG5hbWUpOw0KLQl9IA0KLX0NCi0vKioNCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQotICovDQotcHVibGljIHZvaWQgZW50ZXJJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7DQotCWVudGVyQ2xhc3MoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBuYW1lLCBuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQsIG51bGwsIHN1cGVyaW50ZXJmYWNlcyk7DQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBlbnRlck1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIHJldHVyblR5cGUsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW11bXSBleGNlcHRpb25UeXBlcykgew0KLQlpZiAodHlwZURlcHRoID49IDAgJiYgZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgPT0gLTEpIHsgLy8gZG9uJ3QgYWxsb3cgbmVzdGVkIG1lbWJlciAoY2FuIG9ubHkgaGFwcGVuIHdpdGggYW5vbnltb3VzIGlubmVyIGNsYXNzZXMpDQotCQlmTWVtYmVyTmFtZT0gbmV3IFN0cmluZyhuYW1lKTsNCi0JCWZNZW1iZXJOYW1lUmFuZ2U9IG5ldyBTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsNCi0JCWZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0PSBkZWNsYXJhdGlvblN0YXJ0Ow0KLQkJZk1ldGhvZFBhcmFtZXRlclR5cGVzPSBwYXJhbWV0ZXJUeXBlczsNCi0JfSANCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGV4aXRDbGFzcyhpbnQgZGVjbGFyYXRpb25FbmQpIHsNCi0JaWYgKHR5cGVEZXB0aCA+PSAwKSB7DQotCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsNCi0JCXNldFNvdXJjZVJhbmdlKA0KLQkJCWN1cnJlbnRUeXBlLCANCi0JCQluZXcgU291cmNlUmFuZ2UoDQotCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzW3R5cGVEZXB0aF0gLCANCi0JCQkJZGVjbGFyYXRpb25FbmQgLSB0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdICArIDEpLCANCi0JCQl0aGlzLnR5cGVOYW1lUmFuZ2VzW3R5cGVEZXB0aF0pOw0KLQkJdGhpcy50eXBlRGVwdGgtLTsNCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHsNCisJCS8vIGRvIG5vdGhpbmcNCiAJfQ0KLX0NCi0vKioNCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQotICovDQotcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHsNCi0JLy9kbyBub3RoaW5nDQotfQ0KLS8qKg0KLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCi0gKi8NCi1wdWJsaWMgdm9pZCBleGl0Q29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uRW5kKSB7DQotCWV4aXRNZXRob2QoZGVjbGFyYXRpb25FbmQpOw0KLX0NCi0vKioNCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQotICovDQotcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgew0KLQlpZiAodHlwZURlcHRoID49IDAgJiYgZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgIT0gLTEpIHsNCi0JCUlUeXBlIGN1cnJlbnRUeXBlID0gdGhpcy50eXBlc1t0eXBlRGVwdGhdOw0KLQkJc2V0U291cmNlUmFuZ2UoY3VycmVudFR5cGUuZ2V0RmllbGQoZk1lbWJlck5hbWUpLCBuZXcgU291cmNlUmFuZ2UoZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQsIGRlY2xhcmF0aW9uRW5kIC0gZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgKyAxKSwgZk1lbWJlck5hbWVSYW5nZSk7DQotCQlmTWVtYmVyRGVjbGFyYXRpb25TdGFydCA9IC0xOw0KKwkNCisJLyoqDQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCisJICovDQorCXB1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoDQorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwNCisJCWludCBtb2RpZmllcnMsDQorCQljaGFyW10gbmFtZSwNCisJCWludCBuYW1lU291cmNlU3RhcnQsDQorCQlpbnQgbmFtZVNvdXJjZUVuZCwNCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLA0KKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsDQorCQljaGFyW11bXSBleGNlcHRpb25UeXBlcykgew0KKwkJZW50ZXJNZXRob2QoDQorCQkJZGVjbGFyYXRpb25TdGFydCwNCisJCQltb2RpZmllcnMsDQorCQkJbnVsbCwNCisJCQluYW1lLA0KKwkJCW5hbWVTb3VyY2VTdGFydCwNCisJCQluYW1lU291cmNlRW5kLA0KKwkJCXBhcmFtZXRlclR5cGVzLA0KKwkJCXBhcmFtZXRlck5hbWVzLA0KKwkJCWV4Y2VwdGlvblR5cGVzKTsNCiAJfQ0KLX0NCi0vKioNCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQotICovDQotcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsNCi0JZXhpdENsYXNzKGRlY2xhcmF0aW9uRW5kKTsNCi19DQotLyoqDQotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kKSB7DQotCWlmICh0eXBlRGVwdGggPj0gMCAmJiBmTWVtYmVyRGVjbGFyYXRpb25TdGFydCAhPSAtMSkgew0KLQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07DQotCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZT0gbmV3IFNvdXJjZVJhbmdlKGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZCAtIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ICsgMSk7DQotCQlzZXRTb3VyY2VSYW5nZShjdXJyZW50VHlwZS5nZXRNZXRob2QoZk1lbWJlck5hbWUsIGNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MoZk1ldGhvZFBhcmFtZXRlclR5cGVzKSksIHNvdXJjZVJhbmdlLCBmTWVtYmVyTmFtZVJhbmdlKTsNCi0JCWZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ID0gLTE7DQorCQ0KKwkvKioNCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KKwkgKi8NCisJcHVibGljIHZvaWQgZW50ZXJGaWVsZCgNCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LA0KKwkJaW50IG1vZGlmaWVycywNCisJCWNoYXJbXSB0eXBlLA0KKwkJY2hhcltdIG5hbWUsDQorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LA0KKwkJaW50IG5hbWVTb3VyY2VFbmQpIHsNCisJCWlmICh0eXBlRGVwdGggPj0gMA0KKwkJCSYmIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ID09IC0xKSB7DQorCQkJLy8gZG9uJ3QgYWxsb3cgbmVzdGVkIG1lbWJlciAoY2FuIG9ubHkgaGFwcGVuIHdpdGggYW5vbnltb3VzIGlubmVyIGNsYXNzZXMpDQorCQkJZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgPSBkZWNsYXJhdGlvblN0YXJ0Ow0KKwkJCWZNZW1iZXJOYW1lUmFuZ2UgPQ0KKwkJCQluZXcgU291cmNlUmFuZ2UobmFtZVNvdXJjZVN0YXJ0LCBuYW1lU291cmNlRW5kIC0gbmFtZVNvdXJjZVN0YXJ0ICsgMSk7DQorCQkJZk1lbWJlck5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOw0KKwkJfQ0KIAl9DQotfQ0KLS8qKg0KLSAqIExvY2F0ZXMgYW5kIHJldHVybnMgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiAoYmluYXJ5KSB0eXBlLCBpbiB0aGlzDQotICogU291cmNlTWFwcGVyJ3MgWklQIGZpbGUsIG9yIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgc291cmNlDQotICogY29kZSBjYW5ub3QgYmUgZm91bmQuDQotICovDQotcHVibGljIGNoYXJbXSBmaW5kU291cmNlKElUeXBlIHR5cGUpIHsNCi0JaWYgKCF0eXBlLmlzQmluYXJ5KCkpIHsNCi0JCXJldHVybiBudWxsOw0KKwkNCisJLyoqDQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCisJICovDQorCXB1YmxpYyB2b2lkIGVudGVySW50ZXJmYWNlKA0KKwkJaW50IGRlY2xhcmF0aW9uU3RhcnQsDQorCQlpbnQgbW9kaWZpZXJzLA0KKwkJY2hhcltdIG5hbWUsDQorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LA0KKwkJaW50IG5hbWVTb3VyY2VFbmQsDQorCQljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsNCisJCWVudGVyQ2xhc3MoDQorCQkJZGVjbGFyYXRpb25TdGFydCwNCisJCQltb2RpZmllcnMsDQorCQkJbmFtZSwNCisJCQluYW1lU291cmNlU3RhcnQsDQorCQkJbmFtZVNvdXJjZUVuZCwNCisJCQludWxsLA0KKwkJCXN1cGVyaW50ZXJmYWNlcyk7DQogCX0NCi0JQmluYXJ5VHlwZSBwYXJlbnQ9IChCaW5hcnlUeXBlKXR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQlCaW5hcnlUeXBlIGRlY2xUeXBlPSAoQmluYXJ5VHlwZSl0eXBlOw0KLQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0JCWRlY2xUeXBlPSBwYXJlbnQ7DQotCQlwYXJlbnQ9IChCaW5hcnlUeXBlKWRlY2xUeXBlLmdldERlY2xhcmluZ1R5cGUoKTsNCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBlbnRlck1ldGhvZCgNCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LA0KKwkJaW50IG1vZGlmaWVycywNCisJCWNoYXJbXSByZXR1cm5UeXBlLA0KKwkJY2hhcltdIG5hbWUsDQorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LA0KKwkJaW50IG5hbWVTb3VyY2VFbmQsDQorCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywNCisJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLA0KKwkJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsNCisJCWlmICh0eXBlRGVwdGggPj0gMA0KKwkJCSYmIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ID09IC0xKSB7DQorCQkJLy8gZG9uJ3QgYWxsb3cgbmVzdGVkIG1lbWJlciAoY2FuIG9ubHkgaGFwcGVuIHdpdGggYW5vbnltb3VzIGlubmVyIGNsYXNzZXMpDQorCQkJZk1lbWJlck5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOw0KKwkJCWZNZW1iZXJOYW1lUmFuZ2UgPQ0KKwkJCQluZXcgU291cmNlUmFuZ2UobmFtZVNvdXJjZVN0YXJ0LCBuYW1lU291cmNlRW5kIC0gbmFtZVNvdXJjZVN0YXJ0ICsgMSk7DQorCQkJZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgPSBkZWNsYXJhdGlvblN0YXJ0Ow0KKwkJCWZNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzOw0KKwkJfQ0KIAl9DQotCUlCaW5hcnlUeXBlIGluZm89IG51bGw7DQotCXRyeSB7DQotCSBpbmZvPSAoSUJpbmFyeVR5cGUpZGVjbFR5cGUuZ2V0UmF3SW5mbygpOw0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJcmV0dXJuIG51bGw7DQorCQ0KKwkvKioNCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KKwkgKi8NCisJcHVibGljIHZvaWQgZXhpdENsYXNzKGludCBkZWNsYXJhdGlvbkVuZCkgew0KKwkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7DQorCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07DQorCQkJc2V0U291cmNlUmFuZ2UoDQorCQkJCWN1cnJlbnRUeXBlLA0KKwkJCQluZXcgU291cmNlUmFuZ2UoDQorCQkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdLA0KKwkJCQkJZGVjbGFyYXRpb25FbmQgLSB0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdICsgMSksDQorCQkJCXRoaXMudHlwZU5hbWVSYW5nZXNbdHlwZURlcHRoXSk7DQorCQkJdGhpcy50eXBlRGVwdGgtLTsNCisJCX0NCiAJfQ0KLQlyZXR1cm4gdGhpcy5maW5kU291cmNlKHR5cGUsIGluZm8pOw0KLX0NCi0vKioNCi0gKiBMb2NhdGVzIGFuZCByZXR1cm5zIHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gKGJpbmFyeSkgdHlwZSwgaW4gdGhpcw0KLSAqIFNvdXJjZU1hcHBlcidzIFpJUCBmaWxlLCBvciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHNvdXJjZQ0KLSAqIGNvZGUgY2Fubm90IGJlIGZvdW5kLg0KLSAqLw0KLXB1YmxpYyBjaGFyW10gZmluZFNvdXJjZShJVHlwZSB0eXBlLCBJQmluYXJ5VHlwZSBpbmZvKSB7DQotCVN0cmluZyBuYW1lID0gbnVsbDsNCi0JLy8gc2VlIDFGVlZXWlQNCi0JaWYgKGluZm8gaW5zdGFuY2VvZiBDbGFzc0ZpbGVSZWFkZXIpIHsNCi0JCWNoYXJbXSBzb3VyY2VGaWxlTmFtZSA9ICgoQ2xhc3NGaWxlUmVhZGVyKSBpbmZvKS5zb3VyY2VGaWxlTmFtZSgpOw0KKwkNCisJLyoqDQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCisJICovDQorCXB1YmxpYyB2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKSB7DQorCQkvL2RvIG5vdGhpbmcNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCisJICovDQorCXB1YmxpYyB2b2lkIGV4aXRDb25zdHJ1Y3RvcihpbnQgZGVjbGFyYXRpb25FbmQpIHsNCisJCWV4aXRNZXRob2QoZGVjbGFyYXRpb25FbmQpOw0KKwl9DQorCQ0KKwkvKioNCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvcg0KKwkgKi8NCisJcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgew0KKwkJaWYgKHR5cGVEZXB0aCA+PSAwICYmIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ICE9IC0xKSB7DQorCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07DQorCQkJc2V0U291cmNlUmFuZ2UoDQorCQkJCWN1cnJlbnRUeXBlLmdldEZpZWxkKGZNZW1iZXJOYW1lKSwNCisJCQkJbmV3IFNvdXJjZVJhbmdlKA0KKwkJCQkJZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQsDQorCQkJCQlkZWNsYXJhdGlvbkVuZCAtIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ICsgMSksDQorCQkJCWZNZW1iZXJOYW1lUmFuZ2UpOw0KKwkJCWZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0ID0gLTE7DQorCQl9DQorCX0NCisJDQorCS8qKg0KKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBleGl0SW50ZXJmYWNlKGludCBkZWNsYXJhdGlvbkVuZCkgew0KKwkJZXhpdENsYXNzKGRlY2xhcmF0aW9uRW5kKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3INCisJICovDQorCXB1YmxpYyB2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kKSB7DQorCQlpZiAodHlwZURlcHRoID49IDAgJiYgZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgIT0gLTEpIHsNCisJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsNCisJCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSA9DQorCQkJCW5ldyBTb3VyY2VSYW5nZSgNCisJCQkJCWZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0LA0KKwkJCQkJZGVjbGFyYXRpb25FbmQgLSBmTWVtYmVyRGVjbGFyYXRpb25TdGFydCArIDEpOw0KKwkJCXNldFNvdXJjZVJhbmdlKA0KKwkJCQljdXJyZW50VHlwZS5nZXRNZXRob2QoDQorCQkJCQlmTWVtYmVyTmFtZSwNCisJCQkJCWNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MoZk1ldGhvZFBhcmFtZXRlclR5cGVzKSksDQorCQkJCXNvdXJjZVJhbmdlLA0KKwkJCQlmTWVtYmVyTmFtZVJhbmdlKTsNCisJCQlmTWVtYmVyRGVjbGFyYXRpb25TdGFydCA9IC0xOw0KKwkJfQ0KKwl9DQorCQ0KKwkvKioNCisJICogTG9jYXRlcyBhbmQgcmV0dXJucyBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuIChiaW5hcnkpIHR5cGUsIGluIHRoaXMNCisJICogU291cmNlTWFwcGVyJ3MgWklQIGZpbGUsIG9yIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgc291cmNlDQorCSAqIGNvZGUgY2Fubm90IGJlIGZvdW5kLg0KKwkgKi8NCisJcHVibGljIGNoYXJbXSBmaW5kU291cmNlKElUeXBlIHR5cGUpIHsNCisJCWlmICghdHlwZS5pc0JpbmFyeSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlCaW5hcnlUeXBlIHBhcmVudCA9IChCaW5hcnlUeXBlKSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsNCisJCUJpbmFyeVR5cGUgZGVjbFR5cGUgPSAoQmluYXJ5VHlwZSkgdHlwZTsNCisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KKwkJCWRlY2xUeXBlID0gcGFyZW50Ow0KKwkJCXBhcmVudCA9IChCaW5hcnlUeXBlKSBkZWNsVHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7DQorCQl9DQorCQlJQmluYXJ5VHlwZSBpbmZvID0gbnVsbDsNCisJCXRyeSB7DQorCQkJaW5mbyA9IChJQmluYXJ5VHlwZSkgZGVjbFR5cGUuZ2V0UmF3SW5mbygpOw0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiB0aGlzLmZpbmRTb3VyY2UodHlwZSwgaW5mbyk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBMb2NhdGVzIGFuZCByZXR1cm5zIHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gKGJpbmFyeSkgdHlwZSwgaW4gdGhpcw0KKwkgKiBTb3VyY2VNYXBwZXIncyBaSVAgZmlsZSwgb3IgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBzb3VyY2UNCisJICogY29kZSBjYW5ub3QgYmUgZm91bmQuDQorCSAqLw0KKwlwdWJsaWMgY2hhcltdIGZpbmRTb3VyY2UoSVR5cGUgdHlwZSwgSUJpbmFyeVR5cGUgaW5mbykgew0KKwkJY2hhcltdIHNvdXJjZUZpbGVOYW1lID0gaW5mby5zb3VyY2VGaWxlTmFtZSgpOw0KIAkJaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpDQogCQkJcmV0dXJuIG51bGw7IC8vIG5vIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZQ0KLQkJbmFtZSA9IG5ldyBTdHJpbmcoc291cmNlRmlsZU5hbWUpOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCisJCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhzb3VyY2VGaWxlTmFtZSk7DQogDQotCUlQYWNrYWdlRnJhZ21lbnQgcGtnRnJhZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7DQotCWlmICghcGtnRnJhZy5pc0RlZmF1bHRQYWNrYWdlKCkpIHsNCi0JCVN0cmluZyBwa2c9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsNCi0JCW5hbWU9IHBrZyArICcvJyArIG5hbWU7DQotCX0NCi0JLy8gdHJ5IHRvIGdldCB0aGUgZW50cnkNCi0JWmlwRW50cnkgZW50cnk9IG51bGw7DQotCVppcEZpbGUgemlwID0gbnVsbDsNCi0JY2hhcltdIHNvdXJjZT0gbnVsbDsNCi0JdHJ5IHsNCi0JCVN0cmluZyBmdWxsTmFtZTsNCi0JCS8vYWRkIHRoZSByb290IHBhdGggaWYgc3BlY2lmaWVkDQotCQlpZiAoIWZSb290UGF0aC5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKSkgew0KLQkJCWZ1bGxOYW1lPSBmUm9vdFBhdGggKyAnLycgKyBuYW1lOw0KLQkJfSBlbHNlIHsNCi0JCQlmdWxsTmFtZT0gbmFtZTsNCisJCUlQYWNrYWdlRnJhZ21lbnQgcGtnRnJhZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7DQorCQlpZiAoIXBrZ0ZyYWcuaXNEZWZhdWx0UGFja2FnZSgpKSB7DQorCQkJU3RyaW5nIHBrZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsNCisJCQluYW1lID0gcGtnICsgJy8nICsgbmFtZTsNCiAJCX0NCi0JCXppcCA9IGdldFppcCgpOw0KLQkJZW50cnk9IHppcC5nZXRFbnRyeShmdWxsTmFtZSk7DQotCQlpZiAoZW50cnkgIT0gbnVsbCkgew0KLQkJCS8vIG5vdyByZWFkIHRoZSBzb3VyY2UgY29kZQ0KLQkJCWJ5dGVbXSBieXRlcz0gcmVhZEVudHJ5KHppcCwgZW50cnkpOw0KLQkJCWlmIChieXRlcyAhPSBudWxsKSB7DQorCQkvLyB0cnkgdG8gZ2V0IHRoZSBlbnRyeQ0KKwkJWmlwRW50cnkgZW50cnkgPSBudWxsOw0KKwkJWmlwRmlsZSB6aXAgPSBudWxsOw0KKwkJY2hhcltdIHNvdXJjZSA9IG51bGw7DQorCQl0cnkgew0KKwkJCVN0cmluZyBmdWxsTmFtZTsNCisJCQkvL2FkZCB0aGUgcm9vdCBwYXRoIGlmIHNwZWNpZmllZA0KKwkJCWlmICghZlJvb3RQYXRoLmVxdWFscyhJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEgpKSB7DQorCQkJCWZ1bGxOYW1lID0gZlJvb3RQYXRoICsgJy8nICsgbmFtZTsNCisJCQl9IGVsc2Ugew0KKwkJCQlmdWxsTmFtZSA9IG5hbWU7DQorCQkJfQ0KKwkJCXppcCA9IGdldFppcCgpOw0KKwkJCWVudHJ5ID0gemlwLmdldEVudHJ5KGZ1bGxOYW1lKTsNCisJCQlpZiAoZW50cnkgIT0gbnVsbCkgew0KKwkJCQkvLyBub3cgcmVhZCB0aGUgc291cmNlIGNvZGUNCisJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZEVudHJ5KHppcCwgZW50cnkpOw0KKwkJCQlpZiAoYnl0ZXMgIT0gbnVsbCkgew0KKwkJCQkJdHJ5IHsNCisJCQkJCQlzb3VyY2UgPSBCdWZmZXJNYW5hZ2VyLmJ5dGVzVG9DaGFyKGJ5dGVzKTsNCisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQorCQkJCQkJc291cmNlID0gbnVsbDsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfSBmaW5hbGx5IHsNCisJCQlpZiAoemlwICE9IG51bGwpIHsNCiAJCQkJdHJ5IHsNCi0JCQkJCXNvdXJjZT0gQnVmZmVyTWFuYWdlci5ieXRlc1RvQ2hhcihieXRlcyk7DQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQkJCQlzb3VyY2U9IG51bGw7DQorCQkJCQl6aXAuY2xvc2UoKTsNCisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9IGZpbmFsbHkgew0KLQkJaWYgKHppcCAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJemlwLmNsb3NlKCk7DQotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJcmV0dXJuIHNvdXJjZTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIFNvdXJjZVJhbmdlIGZvciB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgb3INCisJICogey0xLCAtMX0gaWYgbm8gc291cmNlIHJhbmdlIGlzIGtub3duIGZvciB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudC4NCisJICovDQorCXB1YmxpYyBTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsNCisJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRA0KKwkJCSYmICgoSU1lbWJlcikgZWxlbWVudCkuaXNCaW5hcnkoKSkgew0KKwkJCWVsZW1lbnQgPSBnZXRVbnF1YWxpZmllZE1ldGhvZEhhbmRsZSgoSU1ldGhvZCkgZWxlbWVudCk7DQogCQl9DQotCX0NCi0JcmV0dXJuIHNvdXJjZTsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgU291cmNlUmFuZ2UgZm9yIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBvcg0KLSAqIHstMSwgLTF9IGlmIG5vIHNvdXJjZSByYW5nZSBpcyBrbm93biBmb3IgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuDQotICovDQotcHVibGljIFNvdXJjZVJhbmdlIGdldE5hbWVSYW5nZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgew0KLQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QgJiYgKChJTWVtYmVyKWVsZW1lbnQpLmlzQmluYXJ5KCkpIHsNCi0JCWVsZW1lbnQ9IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKChJTWV0aG9kKWVsZW1lbnQpOw0KLQl9DQotCVNvdXJjZVJhbmdlW10gcmFuZ2VzPSAoU291cmNlUmFuZ2VbXSlmU291cmNlUmFuZ2VzLmdldChlbGVtZW50KTsNCi0JaWYgKHJhbmdlcyA9PSBudWxsKSB7DQotCQlyZXR1cm4gZmdVbmtub3duUmFuZ2U7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gcmFuZ2VzWzFdOw0KLQl9DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIDxjb2RlPlNvdXJjZVJhbmdlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIG9yDQotICogey0xLCAtMX0gaWYgbm8gc291cmNlIHJhbmdlIGlzIGtub3duIGZvciB0aGUgZWxlbWVudC4NCi0gKi8NCi1wdWJsaWMgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsNCi0JaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EICYmICgoSU1lbWJlcillbGVtZW50KS5pc0JpbmFyeSgpKSB7DQotCQllbGVtZW50PSBnZXRVbnF1YWxpZmllZE1ldGhvZEhhbmRsZSgoSU1ldGhvZCllbGVtZW50KTsNCi0JfQ0KLQlTb3VyY2VSYW5nZVtdIHJhbmdlcz0gKFNvdXJjZVJhbmdlW10pZlNvdXJjZVJhbmdlcy5nZXQoZWxlbWVudCk7DQotCWlmIChyYW5nZXMgPT0gbnVsbCkgew0KLQkJcmV0dXJuIGZnVW5rbm93blJhbmdlOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIHJhbmdlc1swXTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSB0eXBlIHdpdGggdGhlIGdpdmVuIDxjb2RlPnR5cGVOYW1lPC9jb2RlPi4gIFJldHVybnMgaW5uZXIgY2xhc3Nlcw0KLSAqIGFzIHdlbGwuDQotICovDQotcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7DQotCWlmIChmVHlwZS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpDQotCQlyZXR1cm4gZlR5cGU7DQotCWVsc2UNCi0JCXJldHVybiBmVHlwZS5nZXRUeXBlKHR5cGVOYW1lKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhIGhhbmRsZSB0aGF0IGhhcyBwYXJhbWV0ZXIgdHlwZXMgdGhhdCBhcmUgbm90DQotICogZnVsbHkgcXVhbGlmaWVkIHNvIHRoYXQgdGhlIGNvcnJlY3Qgc291cmNlIGlzIGZvdW5kLg0KLSAqLw0KLXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0VW5xdWFsaWZpZWRNZXRob2RIYW5kbGUoSU1ldGhvZCBtZXRob2QpIHsNCi0NCi0JU3RyaW5nW10gcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0JU3RyaW5nW10gdW5xdWFsaWZpZWRQYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBxdWFsaWZpZWRQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgew0KLQkJU3RyaW5nQnVmZmVyIHVucXVhbGlmaWVkTmFtZT0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJU3RyaW5nIHF1YWxpZmllZE5hbWU9IHF1YWxpZmllZFBhcmFtZXRlclR5cGVzW2ldOw0KLQkJaW50IGNvdW50ID0gMDsNCi0JCXdoaWxlIChxdWFsaWZpZWROYW1lLmNoYXJBdChjb3VudCkgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIHsNCi0JCQl1bnF1YWxpZmllZE5hbWUuYXBwZW5kKFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JCQkrK2NvdW50Ow0KLQkJfQ0KLQkJaWYgKHF1YWxpZmllZE5hbWUuY2hhckF0KGNvdW50KSA9PSBTaWduYXR1cmUuQ19SRVNPTFZFRCkgew0KLQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQoU2lnbmF0dXJlLkNfVU5SRVNPTFZFRCk7DQotCQkJdW5xdWFsaWZpZWROYW1lLmFwcGVuZChTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWROYW1lKSk7DQorCQlTb3VyY2VSYW5nZVtdIHJhbmdlcyA9IChTb3VyY2VSYW5nZVtdKSBmU291cmNlUmFuZ2VzLmdldChlbGVtZW50KTsNCisJCWlmIChyYW5nZXMgPT0gbnVsbCkgew0KKwkJCXJldHVybiBmZ1Vua25vd25SYW5nZTsNCiAJCX0gZWxzZSB7DQotCQkJdW5xdWFsaWZpZWROYW1lLmFwcGVuZChxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhjb3VudCwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSkpOw0KKwkJCXJldHVybiByYW5nZXNbMV07DQogCQl9DQotCQl1bnF1YWxpZmllZFBhcmFtZXRlclR5cGVzW2ldPSB1bnF1YWxpZmllZE5hbWUudG9TdHJpbmcoKTsNCiAJfQ0KLQlyZXR1cm4gKChJVHlwZSkgbWV0aG9kLmdldFBhcmVudCgpKS5nZXRNZXRob2QobWV0aG9kLmdldEVsZW1lbnROYW1lKCksIHVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSA8Y29kZT5aaXBGaWxlPC9jb2RlPiB0aGF0IHNvdXJjZSBpcyBsb2NhdGVkIGluLg0KLSAqLw0KLXB1YmxpYyBaaXBGaWxlIGdldFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JcmV0dXJuIGZKYXZhTW9kZWwuZmdKYXZhTW9kZWxNYW5hZ2VyLmdldFppcEZpbGUoZlppcFBhdGgpOw0KLX0NCi0vKioNCi0gKiBNYXBzIHRoZSBnaXZlbiBzb3VyY2UgY29kZSB0byB0aGUgZ2l2ZW4gYmluYXJ5IHR5cGUgYW5kIGl0cyBjaGlsZHJlbi4NCi0gKi8NCi1wdWJsaWMgdm9pZCBtYXBTb3VyY2UoSVR5cGUgdHlwZSwgY2hhcltdIGNvbnRlbnRzKSB7DQotCXRoaXMubWFwU291cmNlKHR5cGUsIGNvbnRlbnRzLCBudWxsKTsNCi19DQotLyoqDQotICogTWFwcyB0aGUgZ2l2ZW4gc291cmNlIGNvZGUgdG8gdGhlIGdpdmVuIGJpbmFyeSB0eXBlIGFuZCBpdHMgY2hpbGRyZW4uDQotICogSWYgYSBub24tbnVsbCBqYXZhIGVsZW1lbnQgaXMgcGFzc2VkLCBmaW5kcyB0aGUgbmFtZSByYW5nZSBmb3IgdGhlIA0KLSAqIGdpdmVuIGphdmEgZWxlbWVudCB3aXRob3V0IHN0b3JpbmcgaXQuDQotICovDQotcHVibGljIElTb3VyY2VSYW5nZSBtYXBTb3VyY2UoSVR5cGUgdHlwZSwgY2hhcltdIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50KSB7DQotCWZUeXBlPSAoQmluYXJ5VHlwZSl0eXBlOw0KLQ0KLQl0aGlzLnNlYXJjaGVkRWxlbWVudCA9IHNlYXJjaGVkRWxlbWVudDsNCi0JdGhpcy50eXBlcyA9IG5ldyBJVHlwZVsxXTsNCi0JdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHMgPSBuZXcgaW50WzFdOw0KLQl0aGlzLnR5cGVOYW1lUmFuZ2VzID0gbmV3IFNvdXJjZVJhbmdlWzFdOw0KLQl0aGlzLnR5cGVEZXB0aCA9IC0xOw0KLQ0KLQlIYXNodGFibGUgb2xkU291cmNlUmFuZ2VzID0gKEhhc2h0YWJsZSlmU291cmNlUmFuZ2VzLmNsb25lKCk7DQotCXRyeSB7DQotCQlJUHJvYmxlbUZhY3RvcnkgZmFjdG9yeT0gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpOw0KLQkJU291cmNlRWxlbWVudFBhcnNlciBwYXJzZXIgPSBuZXcgU291cmNlRWxlbWVudFBhcnNlcih0aGlzLCBmYWN0b3J5KTsNCi0JCXBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdChuZXcgQmFzaWNDb21waWxhdGlvblVuaXQoY29udGVudHMsIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSArICIuamF2YSIvKm5vbk5MUyovKSwgZmFsc2UpOw0KLQkJaWYgKHNlYXJjaGVkRWxlbWVudCAhPSBudWxsKSB7DQotCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gdGhpcy5nZXROYW1lUmFuZ2Uoc2VhcmNoZWRFbGVtZW50KTsNCi0JCQlyZXR1cm4gcmFuZ2U7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgPGNvZGU+U291cmNlUmFuZ2U8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgb3INCisJICogey0xLCAtMX0gaWYgbm8gc291cmNlIHJhbmdlIGlzIGtub3duIGZvciB0aGUgZWxlbWVudC4NCisJICovDQorCXB1YmxpYyBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EDQorCQkJJiYgKChJTWVtYmVyKSBlbGVtZW50KS5pc0JpbmFyeSgpKSB7DQorCQkJZWxlbWVudCA9IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKChJTWV0aG9kKSBlbGVtZW50KTsNCisJCX0NCisJCVNvdXJjZVJhbmdlW10gcmFuZ2VzID0gKFNvdXJjZVJhbmdlW10pIGZTb3VyY2VSYW5nZXMuZ2V0KGVsZW1lbnQpOw0KKwkJaWYgKHJhbmdlcyA9PSBudWxsKSB7DQorCQkJcmV0dXJuIGZnVW5rbm93blJhbmdlOw0KIAkJfSBlbHNlIHsNCi0JCQlyZXR1cm4gbnVsbDsNCisJCQlyZXR1cm4gcmFuZ2VzWzBdOw0KIAkJfQ0KLQl9IGZpbmFsbHkgew0KLQkJaWYgKHNlYXJjaGVkRWxlbWVudCAhPSBudWxsKSB7DQotCQkJZlNvdXJjZVJhbmdlcyA9IG9sZFNvdXJjZVJhbmdlczsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+dHlwZU5hbWU8L2NvZGU+LiAgUmV0dXJucyBpbm5lciBjbGFzc2VzDQorCSAqIGFzIHdlbGwuDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsNCisJCWlmIChmVHlwZS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpDQorCQkJcmV0dXJuIGZUeXBlOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBmVHlwZS5nZXRUeXBlKHR5cGVOYW1lKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBoYW5kbGUgdGhhdCBoYXMgcGFyYW1ldGVyIHR5cGVzIHRoYXQgYXJlIG5vdA0KKwkgKiBmdWxseSBxdWFsaWZpZWQgc28gdGhhdCB0aGUgY29ycmVjdCBzb3VyY2UgaXMgZm91bmQuDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKElNZXRob2QgbWV0aG9kKSB7DQorDQorCQlTdHJpbmdbXSBxdWFsaWZpZWRQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KKwkJU3RyaW5nW10gdW5xdWFsaWZpZWRQYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsNCisJCQlTdHJpbmdCdWZmZXIgdW5xdWFsaWZpZWROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKwkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXNbaV07DQorCQkJaW50IGNvdW50ID0gMDsNCisJCQl3aGlsZSAocXVhbGlmaWVkTmFtZS5jaGFyQXQoY291bnQpID09IFNpZ25hdHVyZS5DX0FSUkFZKSB7DQorCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQoU2lnbmF0dXJlLkNfQVJSQVkpOw0KKwkJCQkrK2NvdW50Ow0KKwkJCX0NCisJCQlpZiAocXVhbGlmaWVkTmFtZS5jaGFyQXQoY291bnQpID09IFNpZ25hdHVyZS5DX1JFU09MVkVEKSB7DQorCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQoU2lnbmF0dXJlLkNfVU5SRVNPTFZFRCk7DQorCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQoU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUocXVhbGlmaWVkTmFtZSkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQocXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoY291bnQsIHF1YWxpZmllZE5hbWUubGVuZ3RoKCkpKTsNCisJCQl9DQorCQkJdW5xdWFsaWZpZWRQYXJhbWV0ZXJUeXBlc1tpXSA9IHVucXVhbGlmaWVkTmFtZS50b1N0cmluZygpOw0KIAkJfQ0KLQkJZlR5cGU9IG51bGw7DQotCQl0aGlzLnNlYXJjaGVkRWxlbWVudCA9IG51bGw7DQotCQl0aGlzLnR5cGVzID0gbnVsbDsNCi0JCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzID0gbnVsbDsNCi0JCXRoaXMudHlwZU5hbWVSYW5nZXMgPSBudWxsOw0KKwkJcmV0dXJuICgoSVR5cGUpIG1ldGhvZC5nZXRQYXJlbnQoKSkuZ2V0TWV0aG9kKA0KKwkJCW1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLA0KKwkJCXVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMpOw0KKwl9DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgPGNvZGU+WmlwRmlsZTwvY29kZT4gdGhhdCBzb3VyY2UgaXMgbG9jYXRlZCBpbi4NCisJICovDQorCXB1YmxpYyBaaXBGaWxlIGdldFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCXJldHVybiBmSmF2YU1vZGVsLmZnSmF2YU1vZGVsTWFuYWdlci5nZXRaaXBGaWxlKGZaaXBQYXRoKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIE1hcHMgdGhlIGdpdmVuIHNvdXJjZSBjb2RlIHRvIHRoZSBnaXZlbiBiaW5hcnkgdHlwZSBhbmQgaXRzIGNoaWxkcmVuLg0KKwkgKi8NCisJcHVibGljIHZvaWQgbWFwU291cmNlKElUeXBlIHR5cGUsIGNoYXJbXSBjb250ZW50cykgew0KKwkJdGhpcy5tYXBTb3VyY2UodHlwZSwgY29udGVudHMsIG51bGwpOw0KKwl9DQorCQ0KKwkvKioNCisJICogTWFwcyB0aGUgZ2l2ZW4gc291cmNlIGNvZGUgdG8gdGhlIGdpdmVuIGJpbmFyeSB0eXBlIGFuZCBpdHMgY2hpbGRyZW4uDQorCSAqIElmIGEgbm9uLW51bGwgamF2YSBlbGVtZW50IGlzIHBhc3NlZCwgZmluZHMgdGhlIG5hbWUgcmFuZ2UgZm9yIHRoZSANCisJICogZ2l2ZW4gamF2YSBlbGVtZW50IHdpdGhvdXQgc3RvcmluZyBpdC4NCisJICovDQorCXB1YmxpYyBJU291cmNlUmFuZ2UgbWFwU291cmNlKA0KKwkJSVR5cGUgdHlwZSwNCisJCWNoYXJbXSBjb250ZW50cywNCisJCUlKYXZhRWxlbWVudCBzZWFyY2hlZEVsZW1lbnQpIHsNCisJCWZUeXBlID0gKEJpbmFyeVR5cGUpIHR5cGU7DQorDQorCQl0aGlzLmltcG9ydHNUYWJsZS5yZW1vdmUoZlR5cGUpOw0KKwkJdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLnJlbW92ZShmVHlwZSk7DQorCQl0aGlzLnNlYXJjaGVkRWxlbWVudCA9IHNlYXJjaGVkRWxlbWVudDsNCisJCXRoaXMudHlwZXMgPSBuZXcgSVR5cGVbMV07DQorCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0cyA9IG5ldyBpbnRbMV07DQorCQl0aGlzLnR5cGVOYW1lUmFuZ2VzID0gbmV3IFNvdXJjZVJhbmdlWzFdOw0KIAkJdGhpcy50eXBlRGVwdGggPSAtMTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHppcCBlbnRyeQ0KLSAqLw0KLXByb3RlY3RlZCBieXRlW10gcmVhZEVudHJ5KFppcEZpbGUgemlwLCBaaXBFbnRyeSBlbnRyeSkgew0KLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOw0KLQl0cnkgew0KLQkJc3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCi0JCWludCByZW1haW5pbmcgPSAoaW50KSBlbnRyeS5nZXRTaXplKCk7DQotCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtyZW1haW5pbmddOw0KLQkJaW50IG9mZnNldCA9IDA7DQotCQl3aGlsZSAocmVtYWluaW5nID4gMCkgew0KLQkJCWludCByZWFkID0gc3RyZWFtLnJlYWQoYnl0ZXMsIG9mZnNldCwgcmVtYWluaW5nKTsNCi0JCQlpZiAocmVhZCA9PSAtMSkNCi0JCQkJYnJlYWs7DQotCQkJcmVtYWluaW5nIC09IHJlYWQ7DQotCQkJb2Zmc2V0ICs9IHJlYWQ7DQorDQorCQlIYXNodGFibGUgb2xkU291cmNlUmFuZ2VzID0gKEhhc2h0YWJsZSkgZlNvdXJjZVJhbmdlcy5jbG9uZSgpOw0KKwkJdHJ5IHsNCisJCQlJUHJvYmxlbUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKTsNCisJCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHRoaXMsIGZhY3RvcnkpOw0KKwkJCXBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdCgNCisJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KGNvbnRlbnRzLCB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyAiLmphdmEiICksIC8vJE5PTi1OTFMtMSQNCisJCQkJZmFsc2UpOw0KKwkJCWlmIChzZWFyY2hlZEVsZW1lbnQgIT0gbnVsbCkgew0KKwkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSB0aGlzLmdldE5hbWVSYW5nZShzZWFyY2hlZEVsZW1lbnQpOw0KKwkJCQlyZXR1cm4gcmFuZ2U7DQorCQkJfSBlbHNlIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfSBmaW5hbGx5IHsNCisJCQlpZiAoc2VhcmNoZWRFbGVtZW50ICE9IG51bGwpIHsNCisJCQkJZlNvdXJjZVJhbmdlcyA9IG9sZFNvdXJjZVJhbmdlczsNCisJCQl9DQorCQkJZlR5cGUgPSBudWxsOw0KKwkJCXRoaXMuc2VhcmNoZWRFbGVtZW50ID0gbnVsbDsNCisJCQl0aGlzLnR5cGVzID0gbnVsbDsNCisJCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0cyA9IG51bGw7DQorCQkJdGhpcy50eXBlTmFtZVJhbmdlcyA9IG51bGw7DQorCQkJdGhpcy50eXBlRGVwdGggPSAtMTsNCiAJCX0NCi0JCXJldHVybiBieXRlczsNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfSBmaW5hbGx5IHsNCi0JCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCXN0cmVhbS5jbG9zZSgpOw0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KKwl9DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCB6aXAgZW50cnkNCisJICovDQorCXByb3RlY3RlZCBieXRlW10gcmVhZEVudHJ5KFppcEZpbGUgemlwLCBaaXBFbnRyeSBlbnRyeSkgew0KKwkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsNCisJCXRyeSB7DQorCQkJc3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCisJCQlpbnQgcmVtYWluaW5nID0gKGludCkgZW50cnkuZ2V0U2l6ZSgpOw0KKwkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3JlbWFpbmluZ107DQorCQkJaW50IG9mZnNldCA9IDA7DQorCQkJd2hpbGUgKHJlbWFpbmluZyA+IDApIHsNCisJCQkJaW50IHJlYWQgPSBzdHJlYW0ucmVhZChieXRlcywgb2Zmc2V0LCByZW1haW5pbmcpOw0KKwkJCQlpZiAocmVhZCA9PSAtMSkNCisJCQkJCWJyZWFrOw0KKwkJCQlyZW1haW5pbmcgLT0gcmVhZDsNCisJCQkJb2Zmc2V0ICs9IHJlYWQ7DQorCQkJfQ0KKwkJCXJldHVybiBieXRlczsNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9IGZpbmFsbHkgew0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQl0cnkgew0KKwkJCQkJc3RyZWFtLmNsb3NlKCk7DQorCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KKwkJCQl9DQogCQkJfQ0KIAkJfQ0KIAl9DQotfQ0KLS8qKiANCi0gKiBTZXRzIHRoZSBtYXBwaW5nIGZvciB0aGlzIGVsZW1lbnQgdG8gaXRzIHNvdXJjZSByYW5nZXMgZm9yIGl0cyBzb3VyY2UgcmFuZ2UNCi0gKiBhbmQgbmFtZSByYW5nZS4NCi0gKg0KLSAqIEBzZWUgZlNvdXJjZVJhbmdlcw0KLSAqLw0KLXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlKElKYXZhRWxlbWVudCBlbGVtZW50LCBTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSwgU291cmNlUmFuZ2UgbmFtZVJhbmdlKSB7DQotCWZTb3VyY2VSYW5nZXMucHV0KGVsZW1lbnQsIG5ldyBTb3VyY2VSYW5nZVtdIHtzb3VyY2VSYW5nZSwgbmFtZVJhbmdlfSk7DQotfQ0KLX0NCisJDQorCS8qKiANCisJICogU2V0cyB0aGUgbWFwcGluZyBmb3IgdGhpcyBlbGVtZW50IHRvIGl0cyBzb3VyY2UgcmFuZ2VzIGZvciBpdHMgc291cmNlIHJhbmdlDQorCSAqIGFuZCBuYW1lIHJhbmdlLg0KKwkgKg0KKwkgKiBAc2VlIGZTb3VyY2VSYW5nZXMNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlKA0KKwkJSUphdmFFbGVtZW50IGVsZW1lbnQsDQorCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSwNCisJCVNvdXJjZVJhbmdlIG5hbWVSYW5nZSkgew0KKwkJZlNvdXJjZVJhbmdlcy5wdXQoZWxlbWVudCwgbmV3IFNvdXJjZVJhbmdlW10geyBzb3VyY2VSYW5nZSwgbmFtZVJhbmdlIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gYSBjaGFyW11bXSBhcnJheSBjb250YWluaW5nIHRoZSBpbXBvcnRzIG9mIHRoZSBhdHRhY2hlZCBzb3VyY2UgZm9yIHRoZSBmVHlwZSBiaW5hcnkNCisJICovDQorCXB1YmxpYyBjaGFyW11bXSBnZXRJbXBvcnRzKEJpbmFyeVR5cGUgdHlwZSkgew0KKwkJY2hhcltdW10gaW1wb3J0cyA9IChjaGFyW11bXSkgdGhpcy5pbXBvcnRzVGFibGUuZ2V0KHR5cGUpOw0KKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgew0KKwkJCWludCBpbXBvcnRzQ291bnRlciA9ICgoSW50ZWdlcikgdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLmdldCh0eXBlKSkuaW50VmFsdWUoKTsNCisJCQlpZiAoaW1wb3J0cy5sZW5ndGggIT0gaW1wb3J0c0NvdW50ZXIpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCWltcG9ydHMsDQorCQkJCQkwLA0KKwkJCQkJKGltcG9ydHMgPSBuZXcgY2hhcltpbXBvcnRzQ291bnRlcl1bXSksDQorCQkJCQkwLA0KKwkJCQkJaW1wb3J0c0NvdW50ZXIpOw0KKwkJCX0NCisJCX0NCisJCXRoaXMuaW1wb3J0c1RhYmxlLnB1dCh0eXBlLCBpbXBvcnRzKTsNCisJCXJldHVybiBpbXBvcnRzOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kLmphdmEKaW5kZXggZTUyMmM5NC4uZDhjYWQyMCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kLmphdmEKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pKTsNCiAJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQl9DQogCX0NCkBAIC0xOTIsMTEgKzE5MiwxMSBAQAogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7DQogCWlmIChpbmZvID09IG51bGwpIHsNCiAJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCXRyeSB7DQogCQkJaWYgKEZsYWdzLmlzU3RhdGljKHRoaXMuZ2V0RmxhZ3MoKSkpIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCWlmICghdGhpcy5pc0NvbnN0cnVjdG9yKCkpIHsNCiAJCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcodGhpcy5nZXRSZXR1cm5UeXBlKCkpKTsNCkBAIC0yMTAsMTMgKzIxMCwxMyBAQAogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVzW2ldKSk7DQogCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsNCi0JCQkJCQlidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQkJCQl9DQogCQkJCX0NCiAJCQl9DQogCQkJYnVmZmVyLmFwcGVuZCgnKScpOw0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCI8SmF2YU1vZGVsRXhjZXB0aW9uIGluIHRvU3RyaW5nIG9mICIvKm5vbk5MUyovICsgZ2V0RWxlbWVudE5hbWUoKSk7DQorCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiICsgZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmFuZ2UuamF2YQppbmRleCBlMGFhNDA1Li4yMmFkMjcwIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEKQEAgLTMzLDExICszMywxMSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1ZmZlci5hcHBlbmQoIltvZmZzZXQ9Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJbb2Zmc2V0PSIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQodGhpcy5vZmZzZXQpOw0KLQlidWZmZXIuYXBwZW5kKCIsIGxlbmd0aD0iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIiwgbGVuZ3RoPSIpOyAvLyROT04tTkxTLTEkDQogCWJ1ZmZlci5hcHBlbmQodGhpcy5sZW5ndGgpOw0KLQlidWZmZXIuYXBwZW5kKCJdIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhCmluZGV4IGMwZjBmNDIuLmMxZWUwZDUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50LmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGNvcHkoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCWlmIChjb250YWluZXIgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5udWxsQ29udGFpbmVyIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9Ow0KIAlJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07DQpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKi8NCiBwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsNCiAJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9Ow0KQEAgLTE2Myw3ICsxNjMsNyBAQAogICovDQogcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9Ow0KIAlJSmF2YUVsZW1lbnRbXSBkZXN0cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzLmdldFBhcmVudCgpfTsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEKaW5kZXggM2ZmZmMzZi4uZTk0YWJjOSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgKi8NCiBwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJSmF2YVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKHByb2plY3QgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImhpZXJhcmNoeS5udWxsUHJvamVjdCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxQcm9qZWN0IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJDQogCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKA0KQEAgLTMwNiw3ICszMDYsNyBAQAogCX0NCiAJVHlwZVJlc29sdmVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFR5cGVSZXNvbHZlUmVxdWVzdG9yKCk7DQogCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSANCi0JCW5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgSmF2YU1vZGVsTWFuYWdlci5jb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpKTsNCisJCW5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgSmF2YU1vZGVsTWFuYWdlci5nZXRPcHRpb25zKCkpOw0KIAkJDQogCWVuZ2luZS5zZWxlY3RUeXBlKGluZm8sIHR5cGVOYW1lLnRvQ2hhckFycmF5KCkpOw0KIAlyZXR1cm4gcmVxdWVzdG9yLmFuc3dlcnM7DQpAQCAtMzE3LDE3ICszMTcsMTcgQEAKIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgew0KIAlpZiAoaW5mbyA9PSBudWxsKSB7DQogCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCXRyeSB7DQogCQkJaWYgKHRoaXMuaXNJbnRlcmZhY2UoKSkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIi8qbm9uTkxTKi8pOw0KKwkJCQlidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KLQkJCQlidWZmZXIuYXBwZW5kKCJjbGFzcyAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoImNsYXNzICIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXRFbGVtZW50TmFtZSgpKTsNCiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiLypub25OTFMqLyArIGdldEVsZW1lbnROYW1lKCkpOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIjxKYXZhTW9kZWxFeGNlcHRpb24gaW4gdG9TdHJpbmcgb2YgIiArIGdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhCmluZGV4IDExYzM2NTcuLmJjOGZhY2YgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVWZWN0b3IuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlVmVjdG9yLmphdmEKQEAgLTg5LDEyICs4OSwxMiBAQAogCXNpemUgPSAwOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiWyIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLQkJYnVmZmVyLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRzW2ldKTsNCiAJfQ0KLQlidWZmZXIuYXBwZW5kKCJcbl0iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlxuXSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1V0aWwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1V0aWwuamF2YQppbmRleCBhNGUzMmFjLi4zYzY1YjMxIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9VdGlsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXRpbC5qYXZhCkBAIC00MiwxNiArNDIsMTYgQEAKIA0KIAkvKiBCdW5kbGUgY29udGFpbmluZyBtZXNzYWdlcyAqLw0KIAlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUubWVzc2FnZXMiLypub25OTFMqLzsNCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQogDQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9jbGFzcyA9ICIuY2xhc3MiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfQ0xBU1MgPSAiLkNMQVNTIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX2phdmEgPSAiLmphdmEiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfSkFWQSA9ICIuSkFWQSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9jbGFzcyA9ICIuY2xhc3MiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0NMQVNTID0gIi5DTEFTUyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfamF2YSA9ICIuamF2YSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfSkFWQSA9ICIuSkFWQSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAlzdGF0aWMgew0KLQkJU3RyaW5nIHZlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIi8qbm9uTkxTKi8pOw0KLQkJSkRLMV8xID0gKCh2ZXIgIT0gbnVsbCkgJiYgdmVyLnN0YXJ0c1dpdGgoIjEuMSIvKm5vbk5MUyovKSk7DQorCQlTdHJpbmcgdmVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJA0KKwkJSkRLMV8xID0gKCh2ZXIgIT0gbnVsbCkgJiYgdmVyLnN0YXJ0c1dpdGgoIjEuMSIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJcmVsb2NhbGl6ZSgpOw0KIAl9CQ0KIAkvKioNCkBAIC0xNTUsOCArMTU1LDggQEAKIAkgKiBAc2VlIGNvbmNhdChTdHJpbmcsIFN0cmluZykNCiAJICovDQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIGNoYXIgYywgU3RyaW5nIHMyKSB7DQotCQlpZiAoczEgPT0gbnVsbCkgczEgPSAibnVsbCIvKm5vbk5MUyovOw0KLQkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiLypub25OTFMqLzsNCisJCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCQlpbnQgbDEgPSBzMS5sZW5ndGgoKTsNCiAJCWludCBsMiA9IHMyLmxlbmd0aCgpOw0KIAkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2wxICsgMSArIGwyXTsNCkBAIC0xNzYsOCArMTc2LDggQEAKIAkgKiBTdHJpbmcgY29uc3RydWN0b3IgY29waWVzIGl0cyBhcmd1bWVudCwgYnV0IHRoZXJlJ3Mgbm8gd2F5IGFyb3VuZCB0aGlzLg0KIAkgKi8NCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0KFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7DQotCQlpZiAoczEgPT0gbnVsbCkgczEgPSAibnVsbCIvKm5vbk5MUyovOw0KLQkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiLypub25OTFMqLzsNCisJCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiOyAvLyROT04tTkxTLTEkDQogCQlpbnQgbDEgPSBzMS5sZW5ndGgoKTsNCiAJCWludCBsMiA9IHMyLmxlbmd0aCgpOw0KIAkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2wxICsgbDJdOw0KQEAgLTE5MCw5ICsxOTAsOSBAQAogCSAqIEBzZWUgY29uY2F0KFN0cmluZywgU3RyaW5nKQ0KIAkgKi8NCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0KFN0cmluZyBzMSwgU3RyaW5nIHMyLCBTdHJpbmcgczMpIHsNCi0JCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIi8qbm9uTkxTKi87DQotCQlpZiAoczIgPT0gbnVsbCkgczIgPSAibnVsbCIvKm5vbk5MUyovOw0KLQkJaWYgKHMzID09IG51bGwpIHMzID0gIm51bGwiLypub25OTFMqLzsNCisJCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiOyAvLyROT04tTkxTLTEkDQorCQlpZiAoczMgPT0gbnVsbCkgczMgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQNCiAJCWludCBsMSA9IHMxLmxlbmd0aCgpOw0KIAkJaW50IGwyID0gczIubGVuZ3RoKCk7DQogCQlpbnQgbDMgPSBzMy5sZW5ndGgoKTsNCkBAIC03NzIsMTQgKzc3MiwxNCBAQAogICovDQogcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZ1tdIGJpbmRpbmdzKSB7DQogCWlmIChpZCA9PSBudWxsKQ0KLQkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSI7IC8vJE5PTi1OTFMtMSQNCiAJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOw0KIAl0cnkgew0KIAkJbWVzc2FnZSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQpOw0KIAl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KIAkJLy8gSWYgd2UgZ290IGFuIGV4Y2VwdGlvbiBsb29raW5nIGZvciB0aGUgbWVzc2FnZSwgZmFpbCBncmFjZWZ1bGx5IGJ5IGp1c3QgcmV0dXJuaW5nDQogCQkvLyB0aGUgaWQgd2Ugd2VyZSBsb29raW5nIGZvci4gIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBzZW1pLWluZm9ybWF0aXZlIHNvIGlzIG5vdCB0b28gYmFkLg0KLQkJcmV0dXJuICJNaXNzaW5nIG1lc3NhZ2U6ICIvKm5vbk5MUyovICsgaWQgKyAiIGluOiAiLypub25OTFMqLyArIGJ1bmRsZU5hbWU7DQorCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIiArIGlkICsgIiBpbjogIiArIGJ1bmRsZU5hbWU7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChiaW5kaW5ncyA9PSBudWxsKQ0KIAkJcmV0dXJuIG1lc3NhZ2U7DQpAQCAtNzk4LDcgKzc5OCw3IEBACiAJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgew0KIAkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsNCiAJCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0JCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIvKm5vbk5MUyovICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIvKm5vbk5MUyovKTsNCisJCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSArICJ9Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQogCQkJfSBlbHNlIHsNCiAJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQsIGxlbmd0aCkpOw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Xb3JraW5nQ29weS5qYXZhCmluZGV4IGQyZGRlOTAuLmEzZTAzODggMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHkuamF2YQpAQCAtMzA2LDcgKzMwNiw3IEBACiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7DQogCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7DQotCWJ1ZmZlci5hcHBlbmQoIih3b3JraW5nIGNvcHkpXG4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIih3b3JraW5nIGNvcHkpXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAlzdXBlci50b1N0cmluZyh0YWIsIGJ1ZmZlcik7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0RlbHRhS2V5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0RlbHRhS2V5LmphdmEKaW5kZXggNDgxMGNmOS4uZTJkNTdmMyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9EZWx0YUtleS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvRGVsdGFLZXkuamF2YQpAQCAtMzQwLDE1ICszNDAsMTUgQEAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpIHsNCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogCQkNCi0JCWJ1ZmZlci5hcHBlbmQoIkRlbHRhS2V5KCIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIkRlbHRhS2V5KCIpOyAvLyROT04tTkxTLTEkDQogCQkJDQogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZkxvY2FsTmFtZXMubGVuZ3RoOyBpKyspIHsNCiAJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkxvY2FsTmFtZXNbaV0pOw0KIAkJCWlmIChpIDwgdGhpcy5mTG9jYWxOYW1lcy5sZW5ndGggLSAxKSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIi8iLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIi8iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCi0JCWJ1ZmZlci5hcHBlbmQoIikiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQNCiANCiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiAJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9BYnN0cmFjdE1lbWJlckhhbmRsZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0TWVtYmVySGFuZGxlLmphdmEKaW5kZXggMzQ0MGY2NC4uNjU3MDMxYiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0TWVtYmVySGFuZGxlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0TWVtYmVySGFuZGxlLmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIAlTdHJpbmcgY29tcHV0ZVNpZ25hdHVyZShTdHJpbmcgbmFtZSwgSVR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgew0KIA0KIAkJaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKSB7DQotCQkJcmV0dXJuIG5hbWUgKyAiKCkiLypub25OTFMqLzsNCisJCQlyZXR1cm4gbmFtZSArICIoKSI7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCQ0KIAkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsNCkBAIC0zMyw3ICszMyw3IEBACiAJCQl0cnkgew0KIAkJCQkoKFR5cGVJbXBsKXBhcmFtZXRlclR5cGVzW2ldKS5hcHBlbmRTaWduYXR1cmUoc2IsIHRydWUpOw0KIAkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQkJCXRocm93IG5ldyBTdGF0ZVNwZWNpZmljRXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgcGFyYW1ldGVyIHR5cGVzIi8qbm9uTkxTKi8pOw0KKwkJCQl0aHJvdyBuZXcgU3RhdGVTcGVjaWZpY0V4Y2VwdGlvbigiSW5jb21wYXRpYmxlIHBhcmFtZXRlciB0eXBlcyIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfQ0KIAkJc2IuYXBwZW5kKCcpJyk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0TWV0aG9kQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0TWV0aG9kQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCmluZGV4IGI2YzQwMTYuLjU5NDE4YTIgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9BYnN0cmFjdE1ldGhvZENvbGxhYm9yYXRvckluZGljdG1lbnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQWJzdHJhY3RNZXRob2RDb2xsYWJvcmF0b3JJbmRpY3RtZW50LmphdmEKQEAgLTQxLDYgKzQxLDYgQEAKICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCS8vIGRvbid0IHVzZSArIHdpdGggY2hhcltdDQotCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCJBYnN0cmFjdE1ldGhvZENvbGxhYm9yYXRvckluZGljdG1lbnQoIi8qbm9uTkxTKi8pLmFwcGVuZChmTmFtZSkuYXBwZW5kKCIpIi8qbm9uTkxTKi8pLnRvU3RyaW5nKCk7DQorCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCJBYnN0cmFjdE1ldGhvZENvbGxhYm9yYXRvckluZGljdG1lbnQoIikuYXBwZW5kKGZOYW1lKS5hcHBlbmQoIikiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9BYnN0cmFjdE5vZGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9BYnN0cmFjdE5vZGUuamF2YQppbmRleCBiYjU0YmE3Li40ZDYxNDYzIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQWJzdHJhY3ROb2RlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0Fic3RyYWN0Tm9kZS5qYXZhCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJLyogYWRkIHRoZSBkZXBlbmRlbnQgKi8NCiAJCWZEZXBlbmRlbnRzW21pbl0gPSBub2RlVGhhdERlcGVuZHNPbk1lOw0KIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIEFic3RyYWN0Tm9kZS5jb3B5QWRkRGVwZW5kZW50KCkiLypub25OTFMqLyk7DQorCVN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIEFic3RyYWN0Tm9kZS5jb3B5QWRkRGVwZW5kZW50KCkiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAJfQ0KIAkvKioNCkBAIC0xNDgsMjggKzE0OCwyOCBAQAogICogRm9yIGRlYnVnZ2luZyBvbmx5LiANCiAgKi8NCiBwdWJsaWMgdm9pZCBkdW1wKER1bXBlciBkdW1wZXIpIHsNCi0JZHVtcGVyLmR1bXAoImVsZW1lbnQiLypub25OTFMqLywgZ2V0RWxlbWVudCgpKTsNCisJZHVtcGVyLmR1bXAoImVsZW1lbnQiLCBnZXRFbGVtZW50KCkpOyAvLyROT04tTkxTLTEkDQogCWlmIChnZXRLaW5kKCkgPT0gSkNVX05PREUpIA0KLQkJZHVtcGVyLmR1bXAoInR5cGVzIi8qbm9uTkxTKi8sIGdldFR5cGVzKCkpOw0KKwkJZHVtcGVyLmR1bXAoInR5cGVzIiwgZ2V0VHlwZXMoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQ0KIAlPYmplY3RbXSBkZXBlbmRlbmNpZXMgPSBuZXcgT2JqZWN0W2ZEZXBlbmRlbmNpZXMubGVuZ3RoXTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVwZW5kZW5jaWVzLmxlbmd0aDsgKytpKSB7DQogCQlkZXBlbmRlbmNpZXNbaV0gPSBmRGVwZW5kZW5jaWVzW2ldLmdldEVsZW1lbnQoKTsNCiAJfQ0KLQlkdW1wZXIuZHVtcCgiZGVwZW5kZW5jaWVzIi8qbm9uTkxTKi8sIGRlcGVuZGVuY2llcyk7DQorCWR1bXBlci5kdW1wKCJkZXBlbmRlbmNpZXMiLCBkZXBlbmRlbmNpZXMpOyAvLyROT04tTkxTLTEkDQogCQkNCiAJT2JqZWN0W10gZGVwZW5kZW50cyA9IG5ldyBPYmplY3RbZk51bURlcGVuZGVudHNdOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IGZEZXBlbmRlbnRzLmxlbmd0aDsgKytpKSB7DQogCQlkZXBlbmRlbnRzW2ldID0gZkRlcGVuZGVudHNbaV0uZ2V0RWxlbWVudCgpOw0KIAl9DQotCWR1bXBlci5kdW1wKCJkZXBlbmRlbnRzIi8qbm9uTkxTKi8sIGRlcGVuZGVudHMpOw0KKwlkdW1wZXIuZHVtcCgiZGVwZW5kZW50cyIsIGRlcGVuZGVudHMpOyAvLyROT04tTkxTLTEkDQogCQ0KIH0NCiAJLyoqDQogCSAqIE1ha2Ugc3VyZSBlcXVhbGl0eSB0ZXN0cyBhcmUgbmV2ZXIgY2FycmllZCBvdXQgb24gbm9kZXMNCiAJICovDQogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkludGVybmFsIEVycm9yIC0gRXF1YWxpdHkgbm90IGRlZmluZWQgZm9yIGRlcGVuZGVuY3kgZ3JhcGggbm9kZXMiLypub25OTFMqLyk7DQorCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiSW50ZXJuYWwgRXJyb3IgLSBFcXVhbGl0eSBub3QgZGVmaW5lZCBmb3IgZGVwZW5kZW5jeSBncmFwaCBub2RlcyIpOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gZmFsc2U7DQogCX0NCiAJLyoqDQpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjdXJzaW9uTGV2ZWw7ICsraSkNCiAJCQlzYi5hcHBlbmQoJyAnKTsNCiAJCXNiLmFwcGVuZCh0aGlzKTsNCi0JCXNiLmFwcGVuZCgiOiAiLypub25OTFMqLyk7DQorCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQNCiAJCXNiLmFwcGVuZChyZWZDb3VudCk7DQogCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7DQogCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQXJyYXlUeXBlSGFuZGxlSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0FycmF5VHlwZUhhbmRsZUltcGwuamF2YQppbmRleCBhYzE1ZDViLi4xMmM1N2IyIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQXJyYXlUeXBlSGFuZGxlSW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9BcnJheVR5cGVIYW5kbGVJbXBsLmphdmEKQEAgLTk2LDcgKzk2LDcgQEAKIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCiAJU3RyaW5nIG5hbWUgPSBmRWxlbWVudFR5cGUuZ2V0TmFtZSgpOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IGZOZXN0aW5nRGVwdGg7IGkrKykNCi0JCW5hbWUgKz0gIltdIi8qbm9uTkxTKi87DQorCQluYW1lICs9ICJbXSI7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIG5hbWU7DQogfQ0KIC8qKg0KQEAgLTExMSw3ICsxMTEsNyBAQAogcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCkgew0KIAlTdHJpbmcgc2ltcGxlTmFtZSA9IGZFbGVtZW50VHlwZS5nZXRTaW1wbGVOYW1lKCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgZk5lc3RpbmdEZXB0aDsgaSsrKQ0KLQkJc2ltcGxlTmFtZSArPSAiW10iLypub25OTFMqLzsNCisJCXNpbXBsZU5hbWUgKz0gIltdIjsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gc2ltcGxlTmFtZTsNCiB9DQogLyoqDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0JhdGNoSW1hZ2VCdWlsZGVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YQppbmRleCA0NTNkOGIxLi40YjZlMmMyIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YQpAQCAtMzksNyArMzksNiBAQAogICovDQogcHJvdGVjdGVkIEJhdGNoSW1hZ2VCdWlsZGVyKFN0YXRlSW1wbCBzdGF0ZSwgQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucykgew0KIAlmREMgPSAoSmF2YURldmVsb3BtZW50Q29udGV4dEltcGwpIHN0YXRlLmdldERldmVsb3BtZW50Q29udGV4dCgpOw0KLQlzdGF0ZS5zZXRDb21waWxlck9wdGlvbnMob3B0aW9ucyk7DQogCWZDb21waWxlck9wdGlvbnMgPSBvcHRpb25zOw0KIAlmTmV3U3RhdGUgPSBzdGF0ZTsNCiAJZldvcmtRdWV1ZSA9IG5ldyBXb3JrUXVldWUoKTsNCkBAIC01NCwxNSArNTMsMTUgQEAKIAlmTm90aWZpZXIuYmVnaW4oKTsNCiAJdHJ5IHsNCiAJCWZOZXdTdGF0ZS5yZWFkQ2xhc3NQYXRoKCk7DQotCQlmTm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnNjcnViYmluZ091dHB1dCIvKm5vbk5MUyovKSk7DQorCQlmTm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnNjcnViYmluZ091dHB1dCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJZk5ld1N0YXRlLmdldEJpbmFyeU91dHB1dCgpLnNjcnViT3V0cHV0KCk7DQogCQlmTm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjA1Zik7DQotCQlmTm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLmFuYWx5emluZ1BhY2thZ2VzIi8qbm9uTkxTKi8pKTsNCisJCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nUGFja2FnZXMiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCWZOZXdTdGF0ZS5idWlsZEluaXRpYWxQYWNrYWdlTWFwKCk7DQogCQlmTm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjA1Zik7DQogDQogCQkvKiBGb3JjZSBidWlsZCBhbGwgaW4gYnVpbGQgY29udGV4dCAqLw0KLQkJZk5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5hbmFseXppbmdTb3VyY2VzIi8qbm9uTkxTKi8pKTsNCisJCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nU291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJSVBhY2thZ2VbXSBwa2dzID0gZk5ld1N0YXRlLmdldFBhY2thZ2VNYXAoKS5nZXRBbGxQYWNrYWdlc0FzQXJyYXkoKTsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcGtncy5sZW5ndGg7ICsraSkgew0KIAkJCWZOb3RpZmllci5jaGVja0NhbmNlbCgpOw0KQEAgLTEwNSwxMyArMTA0LDEzIEBACiBwdWJsaWMgdm9pZCBsYXp5QnVpbGQoUGFja2FnZUVsZW1lbnQgdW5pdCkgew0KIAkvLwkJU3RyaW5nIG1zZyA9ICJBdHRlbXB0IHRvIGxhenkgYnVpbGQgIiArIHVuaXQuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiArIHVuaXQuZ2V0RmlsZU5hbWUoKTsNCiAJLy8JCVN5c3RlbS5lcnIucHJpbnRsbihtc2cgKyAiLiAiICsgIkxhenkgYnVpbGRpbmcgaGFzIGJlZW4gZGlzYWJsZWQuIik7DQotCUFzc2VydC5pc1RydWUoZmFsc2UsICJJbnRlcm5hbCBFcnJvciAtIExhenkgYnVpbGRpbmcgaGFzIGJlZW4gZGlzYWJsZWQiLypub25OTFMqLyk7DQorCUFzc2VydC5pc1RydWUoZmFsc2UsICJJbnRlcm5hbCBFcnJvciAtIExhenkgYnVpbGRpbmcgaGFzIGJlZW4gZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJlIHRoZSBidWlsZGVyDQogICogQHNlZSBJSW1hZ2VCdWlsZGVyDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJiYXRjaCBpbWFnZSBidWlsZGVyIGZvcjpcblx0bmV3IHN0YXRlOiAiLypub25OTFMqLyArIGdldE5ld1N0YXRlKCk7DQorCXJldHVybiAiYmF0Y2ggaW1hZ2UgYnVpbGRlciBmb3I6XG5cdG5ldyBzdGF0ZTogIiArIGdldE5ld1N0YXRlKCk7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9CdWlsZE5vdGlmaWVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQnVpbGROb3RpZmllci5qYXZhCmluZGV4IGZiNGY0YzkuLjFlODQ3NzcgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9CdWlsZE5vdGlmaWVyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0J1aWxkTm90aWZpZXIuamF2YQpAQCAtNDYsMTAgKzQ2LDEwIEBACiB9DQogcHVibGljIHZvaWQgYmVnaW4oKSB7DQogCWlmIChmQnVpbGRNb25pdG9yICE9IG51bGwpIHsNCi0JCWZCdWlsZE1vbml0b3IuYmVnaW5CdWlsZChmSXNCYXRjaCA/IFV0aWwuYmluZCgiYnVpbGQuYmVnaW5CYXRjaCIvKm5vbk5MUyovKSA6IFV0aWwuYmluZCgiYnVpbGQuYmVnaW5JbmNyZW1lbnRhbCIvKm5vbk5MUyovKSk7DQorCQlmQnVpbGRNb25pdG9yLmJlZ2luQnVpbGQoZklzQmF0Y2ggPyBVdGlsLmJpbmQoImJ1aWxkLmJlZ2luQmF0Y2giKSA6IFV0aWwuYmluZCgiYnVpbGQuYmVnaW5JbmNyZW1lbnRhbCIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKGZQcm9ncmVzcyAhPSBudWxsKSB7DQotCQlmUHJvZ3Jlc3MuYmVnaW5UYXNrKCIiLypub25OTFMqLywgZlRvdGFsV29yayk7DQorCQlmUHJvZ3Jlc3MuYmVnaW5UYXNrKCIiLCBmVG90YWxXb3JrKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXRoaXMucHJldmlvdXNTdWJ0YXNrID0gbnVsbDsNCiB9DQpAQCAtOTAsOSArOTAsOSBAQAogCWludCBzdGFydCA9IG1lc3NhZ2UuaW5kZXhPZignLycsIDEpOw0KIAlpbnQgZW5kID0gbWVzc2FnZS5sYXN0SW5kZXhPZignLycpOw0KIAlpZiAoZW5kIDw9IHN0YXJ0KXsNCi0JCW1lc3NhZ2UgPSBVdGlsLmJpbmQoImJ1aWxkLmNvbXBpbGluZyIvKm5vbk5MUyovLCBtZXNzYWdlLnN1YnN0cmluZyhzdGFydCsxKSk7DQorCQltZXNzYWdlID0gVXRpbC5iaW5kKCJidWlsZC5jb21waWxpbmciLCBtZXNzYWdlLnN1YnN0cmluZyhzdGFydCsxKSk7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCi0JCW1lc3NhZ2UgPSBVdGlsLmJpbmQoImJ1aWxkLmNvbXBpbGluZ0NvbnRlbnQiLypub25OTFMqLywgbWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQrMSwgZW5kKSk7DQorCQltZXNzYWdlID0gVXRpbC5iaW5kKCJidWlsZC5jb21waWxpbmdDb250ZW50IiwgbWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQrMSwgZW5kKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlzdWJUYXNrKG1lc3NhZ2UpOw0KIAl1cGRhdGVQcm9ncmVzc0RlbHRhKGZQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdC8yKTsNCkBAIC0xMDAsMTIgKzEwMCwxMiBAQAogfQ0KIHB1YmxpYyB2b2lkIGRvbmUoKSB7DQogCXVwZGF0ZVByb2dyZXNzKDEuMGYpOw0KLQlzdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuZG9uZSIvKm5vbk5MUyovKSk7DQorCXN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5kb25lIikpOyAvLyROT04tTkxTLTEkDQogCWlmIChmUHJvZ3Jlc3MgIT0gbnVsbCkgew0KIAkJZlByb2dyZXNzLmRvbmUoKTsNCiAJfQ0KIAlpZiAoZkJ1aWxkTW9uaXRvciAhPSBudWxsKSB7DQotCQlmQnVpbGRNb25pdG9yLmVuZEJ1aWxkKGZJc0JhdGNoID8gVXRpbC5iaW5kKCJidWlsZC5lbmRCYXRjaCIvKm5vbk5MUyovKSA6IFV0aWwuYmluZCgiYnVpbGQuZW5kSW5jcmVtZW50YWwiLypub25OTFMqLykpOw0KKwkJZkJ1aWxkTW9uaXRvci5lbmRCdWlsZChmSXNCYXRjaCA/IFV0aWwuYmluZCgiYnVpbGQuZW5kQmF0Y2giKSA6IFV0aWwuYmluZCgiYnVpbGQuZW5kSW5jcmVtZW50YWwiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXRoaXMucHJldmlvdXNTdWJ0YXNrID0gbnVsbDsNCiB9DQpAQCAtMTU0LDE2ICsxNTQsMTYgQEAKIAlpbnQgbnVtTmV3ID0gZk5ld0Vycm9yQ291bnQgKyBmTmV3V2FybmluZ0NvdW50Ow0KIAlpbnQgbnVtRml4ZWQgPSBmRml4ZWRFcnJvckNvdW50ICsgZkZpeGVkV2FybmluZ0NvdW50Ow0KIAlpZiAobnVtTmV3ID09IDAgJiYgbnVtRml4ZWQgPT0gMCkgew0KLQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChudW1GaXhlZCA9PSAwKSB7DQotCQlyZXR1cm4gJygnICsgbnVtTmV3ID09IDEgPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1Gb3VuZCIvKm5vbk5MUyovLCBTdHJpbmcudmFsdWVPZihudW1OZXcpKSA6IFV0aWwuYmluZCgiYnVpbGQucHJvYmxlbXNGb3VuZCIvKm5vbk5MUyovLCBTdHJpbmcudmFsdWVPZihudW1OZXcpKSArJyknOw0KKwkJcmV0dXJuICcoJyArIG51bU5ldyA9PSAxID8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRm91bmQiLCBTdHJpbmcudmFsdWVPZihudW1OZXcpKSA6IFV0aWwuYmluZCgiYnVpbGQucHJvYmxlbXNGb3VuZCIsIFN0cmluZy52YWx1ZU9mKG51bU5ldykpICsnKSc7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2UNCiAJCWlmIChudW1OZXcgPT0gMCkgew0KLQkJCXJldHVybiAnKCcgKyBudW1GaXhlZCA9PSAxID8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRml4ZWQiLypub25OTFMqLywgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSA6IFV0aWwuYmluZCgiYnVpbGQucHJvYmxlbXNGaXhlZCIvKm5vbk5MUyovLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpICsgJyknOw0KKwkJCXJldHVybiAnKCcgKyBudW1GaXhlZCA9PSAxID8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRml4ZWQiLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpIDogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZpeGVkIiwgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSArICcpJzsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQl9IGVsc2Ugew0KLQkJCXJldHVybiAnKCcgKyAobnVtRml4ZWQgPT0gMSA/IFV0aWwuYmluZCgiYnVpbGQub25lUHJvYmxlbUZpeGVkIi8qbm9uTkxTKi8sIFN0cmluZy52YWx1ZU9mKG51bUZpeGVkKSkgOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRml4ZWQiLypub25OTFMqLywgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSkNCi0JCQkJCSsgKG51bU5ldyA9PSAxID8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRm91bmQiLypub25OTFMqLywgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkgOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRm91bmQiLypub25OTFMqLywgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkpICsgJyknOw0KKwkJCXJldHVybiAnKCcgKyAobnVtRml4ZWQgPT0gMSA/IFV0aWwuYmluZCgiYnVpbGQub25lUHJvYmxlbUZpeGVkIiwgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSA6IFV0aWwuYmluZCgiYnVpbGQucHJvYmxlbXNGaXhlZCIsIFN0cmluZy52YWx1ZU9mKG51bUZpeGVkKSkpIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KKwkJCQkJKyAobnVtTmV3ID09IDEgPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1Gb3VuZCIsIFN0cmluZy52YWx1ZU9mKG51bU5ldykpIDogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZvdW5kIiwgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkpICsgJyknOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCX0NCiB9DQogLyoqDQpAQCAtMTgzLDcgKzE4Myw3IEBACiB9DQogcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbWVzc2FnZSkgew0KIAlTdHJpbmcgcG0gPSBwcm9ibGVtc01lc3NhZ2UoKTsNCi0JU3RyaW5nIG1zZyA9IHBtLmxlbmd0aCgpID09IDAgPyBtZXNzYWdlIDogcG0gKyAiICIvKm5vbk5MUyovICsgbWVzc2FnZTsNCisJU3RyaW5nIG1zZyA9IHBtLmxlbmd0aCgpID09IDAgPyBtZXNzYWdlIDogcG0gKyAiICIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkDQogDQogCWlmIChtc2cuZXF1YWxzKHRoaXMucHJldmlvdXNTdWJ0YXNrKSkgcmV0dXJuOyAvLyBhdm9pZCByZWZyZXNoaW5nIHdpdGggc2FtZSBvbmUNCiAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ2xhc3NPckludGVyZmFjZUhhbmRsZUltcGxTV0guamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9DbGFzc09ySW50ZXJmYWNlSGFuZGxlSW1wbFNXSC5qYXZhCmluZGV4IDZmNWQ1MmYuLmQ0ZGFkZWEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9DbGFzc09ySW50ZXJmYWNlSGFuZGxlSW1wbFNXSC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9DbGFzc09ySW50ZXJmYWNlSGFuZGxlSW1wbFNXSC5qYXZhCkBAIC0yMDYsNyArMjA2LDcgQEAKIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyZWROYW1lKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb24gew0KIA0KIAlpZiAoaXNBbm9ueW1vdXMoKSkgew0KLQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCVN0cmluZyBuYW1lID0gZkhhbmRsZS5nZXRTaW1wbGVOYW1lKCk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0NvbXBpbGVyQ29tcGlsYXRpb25Vbml0LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ29tcGlsZXJDb21waWxhdGlvblVuaXQuamF2YQppbmRleCAzN2E1NTA5Li5hNTZiZDRhIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ29tcGlsZXJDb21waWxhdGlvblVuaXQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ29tcGlsZXJDb21waWxhdGlvblVuaXQuamF2YQpAQCAtNjQsNiArNjQsNiBAQAogfQ0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAkJLy8gZG9uJ3QgdXNlIGFwcGVuZChjaGFyW10pIGR1ZSB0byBKREsxLjIgcHJvYmxlbXMNCi0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCJDb21waWxhdGlvblVuaXQoIi8qbm9uTkxTKi8pLmFwcGVuZChnZXRGaWxlTmFtZSgpKS5hcHBlbmQoIikiLypub25OTFMqLykudG9TdHJpbmcoKTsNCisJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCJDb21waWxhdGlvblVuaXQoIikuYXBwZW5kKGdldEZpbGVOYW1lKCkpLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Db25zdHJ1Y3RvckltcGwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Db25zdHJ1Y3RvckltcGwuamF2YQppbmRleCAyNjAyNDBhLi5mZTJhYzBiIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ29uc3RydWN0b3JJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0NvbnN0cnVjdG9ySW1wbC5qYXZhCkBAIC05LDcgKzksNyBAQAogcHVibGljIGNsYXNzIENvbnN0cnVjdG9ySW1wbCBleHRlbmRzIEFic3RyYWN0TWVtYmVySGFuZGxlIGltcGxlbWVudHMgSUNvbnN0cnVjdG9yIHsNCiAJQ29uc3RydWN0b3JJbXBsIChDbGFzc09ySW50ZXJmYWNlSGFuZGxlSW1wbCBvd25lciwgSVR5cGVbXSBwYXJhbVR5cGVzKSB7DQogCQlmT3duZXIgPSBvd25lcjsNCi0JCWZTaWduYXR1cmUgPSBjb21wdXRlU2lnbmF0dXJlKCIiLypub25OTFMqLywgcGFyYW1UeXBlcyk7DQorCQlmU2lnbmF0dXJlID0gY29tcHV0ZVNpZ25hdHVyZSgiIiwgcGFyYW1UeXBlcyk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlwdWJsaWMgQ29uc3RydWN0b3JJbXBsKENsYXNzT3JJbnRlcmZhY2VIYW5kbGVJbXBsIG93bmVyLCBTdHJpbmcgc2lnbmF0dXJlKSB7DQogCQlmT3duZXIgPSBvd25lcjsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvQ29udmVydGVkQ29tcGlsYXRpb25SZXN1bHQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Db252ZXJ0ZWRDb21waWxhdGlvblJlc3VsdC5qYXZhCmluZGV4IGQwMjNlNjAuLmUyYWZlOWMgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Db252ZXJ0ZWRDb21waWxhdGlvblJlc3VsdC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Db252ZXJ0ZWRDb21waWxhdGlvblJlc3VsdC5qYXZhCkBAIC0zOCw2ICszOCw2IEBACiAJCXJldHVybiBmVHlwZXM7DQogCX0NCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiAoZlByb2JsZW1zLmxlbmd0aCA9PSAwID8gIiIvKm5vbk5MUyovIDogIioiLypub25OTFMqLykgKyAiQ29udmVydGVkQ29tcGlsYXRpb25SZXN1bHQoIi8qbm9uTkxTKi8gKyBmUGFja2FnZUVsZW1lbnQgKyAiKSIvKm5vbk5MUyovOw0KKwkJcmV0dXJuIChmUHJvYmxlbXMubGVuZ3RoID09IDAgPyAiIiA6ICIqIikgKyAiQ29udmVydGVkQ29tcGlsYXRpb25SZXN1bHQoIiArIGZQYWNrYWdlRWxlbWVudCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy00JA0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9EZWx0YUltcGwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9EZWx0YUltcGwuamF2YQppbmRleCA1NDA3YmExLi43ZDAwNDBhIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvRGVsdGFJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0RlbHRhSW1wbC5qYXZhCkBAIC0yOCwxNyArMjgsMTcgQEAKIAlwcm90ZWN0ZWQgSUltYWdlQ29udGV4dCBmQ29udGV4dDsNCiANCiAJLyogbmFtZXMgZm9yIGNoZWNrbGlzdCBpdGVtcyAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0ltYWdlID0gIkltYWdlIi8qbm9uTkxTKi87DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnSW1hZ2UgPSAiSW1hZ2UiOyAvLyROT04tTkxTLTEkDQogCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1BhY2thZ2VDYXRlZ29yeSA9ICJQYWNrYWdlcyIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1R5cGVDYXRlZ29yeSA9ICJUeXBlcyIvKm5vbk5MUyovOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0JpbmFyeUNhdGVnb3J5ID0gIkJpbmFyaWVzIi8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnTWV0aG9kQ2F0ZWdvcnkgPSAiTWV0aG9kcyIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1BhY2thZ2VDYXRlZ29yeSA9ICJQYWNrYWdlcyI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdUeXBlQ2F0ZWdvcnkgPSAiVHlwZXMiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQmluYXJ5Q2F0ZWdvcnkgPSAiQmluYXJpZXMiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnTWV0aG9kQ2F0ZWdvcnkgPSAiTWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQNCiANCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdQYWNrYWdlID0gIlBhY2thZ2UiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdUeXBlID0gIlR5cGUiLypub25OTFMqLzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCaW5hcnkgPSAiQmluYXJ5Ii8qbm9uTkxTKi87DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnTWV0aG9kID0gIk1ldGhvZCIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1BhY2thZ2UgPSAiUGFja2FnZSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdUeXBlID0gIlR5cGUiOyAvLyROT04tTkxTLTEkDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQmluYXJ5ID0gIkJpbmFyeSI7IC8vJE5PTi1OTFMtMSQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdNZXRob2QgPSAiTWV0aG9kIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKiBjb252ZW5pZW5jZSBzdHJ1Y3R1cmUgZm9yIGRlbHRhIGNhbGN1bGF0aW9uIHByb2Nlc3MgKi8NCiAJY2xhc3MgRGVsdGFJbmZvIHsNCkBAIC05OSw3ICs5OSw3IEBACiAJCQlmTmV3U3RhdGUgPSAoU3RhdGVJbXBsKW5ld1N0YXRlOw0KIAkJCWZPbGRTdGF0ZSA9IChTdGF0ZUltcGwpb2xkU3RhdGU7DQogCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7DQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkludGVybmFsIEVycm9yIC0gSW52YWxpZCBzdGF0ZXMiLypub25OTFMqLyk7DQorCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkludGVybmFsIEVycm9yIC0gSW52YWxpZCBzdGF0ZXMiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJZlN0YXR1cyA9IENIQU5HRUQ7DQogCQlmTmFtZSA9IGZnSW1hZ2U7DQpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICovDQogCXB1YmxpYyBpbnQgY29tcGFyZVRvKElEZWx0YSBhbm90aGVyRGVsdGEpIHsNCiAJCS8qIGlzIHRoaXMgdXNlZD8gKi8NCi0JCUFzc2VydC5pc1RydWUoZmFsc2UsICJUQkQiLypub25OTFMqLyk7DQorCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVEJEIik7IC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiAwOw0KIAl9DQogLyoqDQpAQCAtNjA2LDcgKzYwNiw3IEBACiAJfQ0KIAlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZHVtcChJRGVsdGEgZGVsdGEsIGludCBkZXB0aCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgKytpKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIi8qbm9uTkxTKi8pOw0KKwkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQNCiAJCVN5c3RlbS5vdXQucHJpbnRsbihkZWx0YSk7DQogCQlJRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkU3ViZGVsdGFzKCk7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQpAQCAtODkzLDIzICs4OTMsMjMgQEAKIAkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJEZWx0YUltcGwoIi8qbm9uTkxTKi8pOw0KKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiRGVsdGFJbXBsKCIpOyAvLyROT04tTkxTLTEkDQogCQlzd2l0Y2ggKGZTdGF0dXMpIHsNCi0JCQljYXNlIEFEREVEOiBzYi5hcHBlbmQoIisiLypub25OTFMqLyk7DQorCQkJY2FzZSBBRERFRDogc2IuYXBwZW5kKCIrIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCi0JCQljYXNlIFJFTU9WRUQ6IHNiLmFwcGVuZCgiLSIvKm5vbk5MUyovKTsNCisJCQljYXNlIFJFTU9WRUQ6IHNiLmFwcGVuZCgiLSIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQotCQkJY2FzZSBDSEFOR0VEOiBzYi5hcHBlbmQoIioiLypub25OTFMqLyk7DQorCQkJY2FzZSBDSEFOR0VEOiBzYi5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KLQkJCWNhc2UgU0FNRTogc2IuYXBwZW5kKCI9Ii8qbm9uTkxTKi8pOw0KKwkJCWNhc2UgU0FNRTogc2IuYXBwZW5kKCI9Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCi0JCQljYXNlIFVOS05PV046IHNiLmFwcGVuZCgiPyIvKm5vbk5MUyovKTsNCisJCQljYXNlIFVOS05PV046IHNiLmFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQotCQkJZGVmYXVsdDogc2IuYXBwZW5kKCIoRVJST1IpIi8qbm9uTkxTKi8pOw0KKwkJCWRlZmF1bHQ6IHNiLmFwcGVuZCgiKEVSUk9SKSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlpZiAoZktleS5pc1Jvb3QoKSkgew0KIAkJCXNiLmFwcGVuZChmT2xkU3RhdGUpOw0KLQkJCXNiLmFwcGVuZCgiLS0+Ii8qbm9uTkxTKi8pOw0KKwkJCXNiLmFwcGVuZCgiLS0+Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQlzYi5hcHBlbmQoZk5ld1N0YXRlKTsNCiAJCX0NCiAJCWVsc2Ugew0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9EZXBlbmRlbmN5R3JhcGguamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9EZXBlbmRlbmN5R3JhcGguamF2YQppbmRleCBmZWVhYWMxLi4yZmZjZTdiIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvRGVwZW5kZW5jeUdyYXBoLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0RlcGVuZGVuY3lHcmFwaC5qYXZhCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkJfQ0KIAkJY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsNCiAJCQkvLyBTaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSBpbXBsZW1lbnQgQ2xvbmVhYmxlDQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQgY2xvbmUgZXhjZXB0aW9uIGluIERlcGVuZGVuY3lHcmFwaC5jbG9uZSgpIi8qbm9uTkxTKi8pOw0KKwkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmV4cGVjdGVkIGNsb25lIGV4Y2VwdGlvbiBpbiBEZXBlbmRlbmN5R3JhcGguY2xvbmUoKSIpOyAvLyROT04tTkxTLTEkDQogCQkJcmV0dXJuIG51bGw7DQogCQl9DQogCX0NCkBAIC0xODYsNyArMTg2LDcgQEAKIAkJCQl2YWx1ZSA9IGZaaXBzLnJlbW92ZSgoKFppcE5vZGUpdG9SZW1vdmUpLmdldFppcEZpbGUoKSk7DQogCQkJCWJyZWFrOw0KIAkJCWRlZmF1bHQ6DQotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJBdHRlbXB0IHRvIGRlbGV0ZSB1bmtub3duIG5vZGUgdHlwZSBmcm9tIGRlcGVuZGVuY3kgZ3JhcGgiLypub25OTFMqLyk7DQorCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJBdHRlbXB0IHRvIGRlbGV0ZSB1bmtub3duIG5vZGUgdHlwZSBmcm9tIGRlcGVuZGVuY3kgZ3JhcGgiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJcmV0dXJuIChJTm9kZSl2YWx1ZTsNCiAJfQ0KQEAgLTE5NCw3ICsxOTQsNyBAQAogICogRm9yIGRlYnVnZ2luZyBvbmx5LiBEdW1wIHRoZSBncmFwaCBpbiByZWFkYWJsZSBmb3JtLg0KICAqLw0KIHB1YmxpYyB2b2lkIGR1bXAoRHVtcGVyIGR1bXBlcikgew0KLQlkdW1wZXIuZHVtcE1lc3NhZ2UoIk5hbWVzcGFjZXMiLypub25OTFMqLywgIiIvKm5vbk5MUyovKTsNCisJZHVtcGVyLmR1bXBNZXNzYWdlKCJOYW1lc3BhY2VzIiwgIiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJZHVtcGVyLmluZGVudCgpOw0KIAlmb3IgKEVudW1lcmF0aW9uIGUgPSBmTmFtZXNwYWNlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJQWJzdHJhY3ROb2RlIG5vZGUgPSAoQWJzdHJhY3ROb2RlKSBlLm5leHRFbGVtZW50KCk7DQpAQCAtMjAyLDcgKzIwMiw3IEBACiAJfQ0KIAlkdW1wZXIub3V0ZGVudCgpOw0KIA0KLQlkdW1wZXIuZHVtcE1lc3NhZ2UoIkpDVXMiLypub25OTFMqLywgIiIvKm5vbk5MUyovKTsNCisJZHVtcGVyLmR1bXBNZXNzYWdlKCJKQ1VzIiwgIiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJZHVtcGVyLmluZGVudCgpOw0KIAlmb3IgKEVudW1lcmF0aW9uIGUgPSBmQ29tcGlsYXRpb25Vbml0cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJQWJzdHJhY3ROb2RlIG5vZGUgPSAoQWJzdHJhY3ROb2RlKSBlLm5leHRFbGVtZW50KCk7DQpAQCAtMjEwLDcgKzIxMCw3IEBACiAJfQ0KIAlkdW1wZXIub3V0ZGVudCgpOw0KIA0KLQlkdW1wZXIuZHVtcE1lc3NhZ2UoIlpJUHMiLypub25OTFMqLywgIiIvKm5vbk5MUyovKTsNCisJZHVtcGVyLmR1bXBNZXNzYWdlKCJaSVBzIiwgIiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJZHVtcGVyLmluZGVudCgpOw0KIAlmb3IgKEVudW1lcmF0aW9uIGUgPSBmWmlwcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJQWJzdHJhY3ROb2RlIG5vZGUgPSAoQWJzdHJhY3ROb2RlKSBlLm5leHRFbGVtZW50KCk7DQpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQlyZXR1cm4gZ2V0Tm9kZUZvcigoSVBhdGgpbywgY3JlYXRlKTsNCiAJCX0NCiAJCWVsc2Ugew0KLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGtpbmQgb2Ygbm9kZSIvKm5vbk5MUyovKTsNCisJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBraW5kIG9mIG5vZGUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCXJldHVybiBudWxsOw0KIAkJfQ0KIAl9DQpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJICogRm9yIGRlYnVnZ2luZyBvbmx5IC0tIGFzc2VydHMgZ3JhcGggaW50ZWdyaXR5DQogCSAqLw0KIAlwdWJsaWMgdm9pZCBpbnRlZ3JpdHlDaGVjayhEaWN0aW9uYXJ5IHRhYmxlKSB7DQotCQlTdHJpbmcgbXNnID0gIkludGVybmFsIEVycm9yOiB0aGUgZGVwZW5kZW5jeSBncmFwaCBpcyBjb3JydXB0LCBkbyBhIGZ1bGwgYnVpbGQgdG8gd29ya2Fyb3VuZCBlcnJvciIvKm5vbk5MUyovOw0KKwkJU3RyaW5nIG1zZyA9ICJJbnRlcm5hbCBFcnJvcjogdGhlIGRlcGVuZGVuY3kgZ3JhcGggaXMgY29ycnVwdCwgZG8gYSBmdWxsIGJ1aWxkIHRvIHdvcmthcm91bmQgZXJyb3IiOyAvLyROT04tTkxTLTEkDQogCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB0YWJsZS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJCUFic3RyYWN0Tm9kZSBub2RlID0gKEFic3RyYWN0Tm9kZSkgZS5uZXh0RWxlbWVudCgpOw0KIA0KQEAgLTU2NCw2ICs1NjQsNiBAQAogCQlyZXR1cm4gZk5hbWVzcGFjZXMuc2l6ZSgpICsgZlR5cGVzLnNpemUoKSArIGZDb21waWxhdGlvblVuaXRzLnNpemUoKTsNCiAJfQ0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuICJhIERlcGVuZGVuY3lHcmFwaCIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJhIERlcGVuZGVuY3lHcmFwaCI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvRmllbGRDb2xsYWJvcmF0b3JJbmRpY3RtZW50LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvRmllbGRDb2xsYWJvcmF0b3JJbmRpY3RtZW50LmphdmEKaW5kZXggOWYzMGYwMi4uYTgzODQ0NCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ZpZWxkQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9GaWVsZENvbGxhYm9yYXRvckluZGljdG1lbnQuamF2YQpAQCAtMjQsNiArMjQsNiBAQAogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJLy8gZG9uJ3QgdXNlICsgd2l0aCBjaGFyW10NCi0JcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIkZpZWxkSW5kaWN0bWVudCgiLypub25OTFMqLykuYXBwZW5kKGZOYW1lKS5hcHBlbmQoIikiLypub25OTFMqLykudG9TdHJpbmcoKTsNCisJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIkZpZWxkSW5kaWN0bWVudCgiKS5hcHBlbmQoZk5hbWUpLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ZpZWxkSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ZpZWxkSW1wbC5qYXZhCmluZGV4IGMyNzYyYWUuLmY1YmJjMTQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9GaWVsZEltcGwuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvRmllbGRJbXBsLmphdmEKQEAgLTQ0LDYgKzQ0LDYgQEAKICAqIHRvU3RyaW5nIG1ldGhvZCBjb21tZW50Lg0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIi8qbm9uTkxTKi8gKyBnZXROYW1lKCk7DQorCXJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIiArIGdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQppbmRleCAzYzY3YjllLi4wZjE2YjJmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQpAQCAtNDAsNyArNDAsNyBAQAogCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsNCiAJCWlmIChmVGhyb3dhYmxlICE9IG51bGwpIHsNCiAJCQlTeXN0ZW0uZXJyLnByaW50bG4odGhpcyk7DQotCQkJU3lzdGVtLmVyci5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBlbWJlZGRlZCB0aHJvd2FibGU6Ii8qbm9uTkxTKi8pOw0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgZW1iZWRkZWQgdGhyb3dhYmxlOiIpOyAvLyROT04tTkxTLTEkDQogCQkJZlRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsNCiAJCX0gZWxzZSB7DQogCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKCk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ltYWdlQ29udGV4dEltcGwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9JbWFnZUNvbnRleHRJbXBsLmphdmEKaW5kZXggMjEwZGY1Yy4uNWE0ZmQ1MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ltYWdlQ29udGV4dEltcGwuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC04OCw5ICs4OCw5IEBACiAJICogcHVycG9zZXMgb25seS4NCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiSW1hZ2VDb250ZXh0IHdpdGggcGFja2FnZXM6IFxuIi8qbm9uTkxTKi8pOw0KKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkltYWdlQ29udGV4dCB3aXRoIHBhY2thZ2VzOiBcbiIpOyAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMDsgaSA8IGZQYWNrYWdlcy5sZW5ndGg7IGkrKykNCi0JCQlidWYuYXBwZW5kKCIJIi8qbm9uTkxTKi8gKyBmUGFja2FnZXNbaV0uZ2V0TmFtZSgpICsgIlxuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1Zi5hcHBlbmQoIgkiICsgZlBhY2thZ2VzW2ldLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCXJldHVybiBidWYudG9TdHJpbmcoKTsNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VJbXBsLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VJbXBsLmphdmEKaW5kZXggMWJmMzBjMi4uNDFhMzA5MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ltYWdlSW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9JbWFnZUltcGwuamF2YQpAQCAtMTk5LDcgKzE5OSw3IEBACiAJICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW1hZ2UgaGFuZGxlLgkNCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gImltYWdlIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gImltYWdlIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogLyoqDQogICogUmV0dXJucyB0aGUgVHlwZSByZXByZXNlbnRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIHZvaWQNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VJbXBsU1dILmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW1hZ2VJbXBsU1dILmphdmEKaW5kZXggMWQzNWNlYi4uNmM4NTY5NSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0ltYWdlSW1wbFNXSC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9JbWFnZUltcGxTV0guamF2YQpAQCAtMTE0LDcgKzExNCw3IEBACiAJCVZlY3RvciB2UmVzdWx0ID0gbmV3IFZlY3RvcigpOw0KIC8vCQl0cnkgew0KIAkJCVN0cmluZyBleHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKS50b0xvd2VyQ2FzZSgpOw0KLQkJCWlmIChleHRlbnNpb24uZXF1YWxzKCJqYXZhIi8qbm9uTkxTKi8pIHx8IGV4dGVuc2lvbi5lcXVhbHMoImNsYXNzIi8qbm9uTkxTKi8pKSB7DQorCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHMoImphdmEiKSB8fCBleHRlbnNpb24uZXF1YWxzKCJjbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQlJUGF0aCBwa2dQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7DQogCQkJCUlQYWNrYWdlIHBrZyA9IGZTdGF0ZS5nZXRQYXRoTWFwKCkucGFja2FnZUhhbmRsZUZyb21QYXRoKHBrZ1BhdGgpOw0KIAkJCQlUeXBlU3RydWN0dXJlRW50cnlbXSB0c0VudHJpZXMgPSBmU3RhdGUuZ2V0QWxsVHlwZXNGb3JQYWNrYWdlKHBrZyk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0luY3JlbWVudGFsSW1hZ2VCdWlsZGVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YQppbmRleCAyMjRlZTQzLi4zOTg4NzhmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCQkJSVBhdGggcGF0aCA9IGVsZW1lbnREZWx0YS5nZXRGdWxsUGF0aCgpOw0KIAkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7DQogCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgew0KLQkJCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIi8qbm9uTkxTKi8pIHx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIvKm5vbk5MUyovKSkgew0KKwkJCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIikgfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCQkJU291cmNlRW50cnkgZW50cnkgPSBuZXcgU291cmNlRW50cnkocGF0aCwgbnVsbCwgbnVsbCk7DQogCQkJCQkJUGFja2FnZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBQYWNrYWdlRWxlbWVudChwa2csIGVudHJ5KTsNCiAJCQkJCQlwa2dUYWJsZS5wdXQoZW50cnkuZ2V0RmlsZU5hbWUoKSwgZWxlbWVudCk7DQpAQCAtMTk4LDE3ICsxOTgsMTYgQEAKIHB1YmxpYyB2b2lkIGFwcGx5U291cmNlRGVsdGEoSGFzaHRhYmxlIGRlbHRhcykgew0KIAlmTm90aWZpZXIgPSBuZXcgQnVpbGROb3RpZmllcihmREMsIGZhbHNlKTsNCiAJZk5vdGlmaWVyLmJlZ2luKCk7DQotCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQucHJlcGFyaW5nQnVpbGQiLypub25OTFMqLykpOw0KKwlmTm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnByZXBhcmluZ0J1aWxkIikpOyAvLyROT04tTkxTLTEkDQogCWZTb3VyY2VEZWx0YXMgPSBkZWx0YXM7DQogCWZOZXdTdGF0ZSA9IGZPbGRTdGF0ZS5jb3B5KGZOZXdQcm9qZWN0LCBmSW1hZ2VDb250ZXh0KTsNCiANCiAJLy8gb3B0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBidWlsZGVyIHJ1biwgdGh1cyByZWZyZXNoIHRoZW0NCi0JZkNvbXBpbGVyT3B0aW9ucyA9IEphdmFNb2RlbE1hbmFnZXIuY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsNCi0JZk5ld1N0YXRlLnNldENvbXBpbGVyT3B0aW9ucyhmQ29tcGlsZXJPcHRpb25zKTsNCisJZkNvbXBpbGVyT3B0aW9ucyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0T3B0aW9ucygpOw0KIAkNCiAJdHJ5IHsNCiAJCS8qIGZpbmQgb3V0IHdoYXQgaGFzIGNoYW5nZWQgYXQgdGhlIHBhY2thZ2UgbGV2ZWwgKi8NCi0JCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nUGFja2FnZXMiLypub25OTFMqLykpOw0KKwkJZk5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5hbmFseXppbmdQYWNrYWdlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJY29tcHV0ZUFsbFBhY2thZ2VzKCk7DQogCQljaGVja0NhbmNlbCgpOw0KIA0KQEAgLTIzNiw3ICsyMzUsNyBAQAogCQl9DQogCQkNCiAJCS8qIGZpbmQgb3V0IHdoYXQgaGFzIGNoYW5nZWQgYXQgdGhlIHBhY2thZ2UgZWxlbWVudCBsZXZlbCAqLw0KLQkJZk5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5hbmFseXppbmdTb3VyY2VzIi8qbm9uTkxTKi8pKTsNCisJCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nU291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJY29tcHV0ZUFsbENsYXNzZXMoKTsNCiAJCWNoZWNrQ2FuY2VsKCk7DQogDQpAQCAtNTYwLDcgKzU1OSw3IEBACiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSb290cy5sZW5ndGg7IGkrKykgew0KIAkJCQkJcm9vdFJlc291cmNlID0gbnVsbDsNCiAJCQkJCXRyeSB7DQotCQkJCQkJb2xkUm9vdHNbaV0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7DQorCQkJCQkJcm9vdFJlc291cmNlID0gb2xkUm9vdHNbaV0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7DQogCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJCQkJfQ0KIAkJCQkJaWYgKHJvb3RSZXNvdXJjZSAhPSBudWxsICYmIHJvb3RSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YocGF0aCkpIHsNCkBAIC01ODIsOCArNTgxLDggQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQogCQlTdHJpbmcgZXh0ZW5zaW9uID0gY2hpbGRyZW5baV0uZ2V0RnVsbFBhdGgoKS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQogCQlpZiAoZXh0ZW5zaW9uID09IG51bGwNCi0JCQl8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiemlwIi8qbm9uTkxTKi8pDQotCQkJfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphciIvKm5vbk5MUyovKSkgew0KKwkJCXx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ6aXAiKSAvLyROT04tTkxTLTEkDQorCQkJfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphciIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQkvLyBUQkQ6IEN1cnJlbnRseSByZWx5IG9uIGVtcHR5IGV4dGVuc2lvbiBpbmRpY2F0aW5nIGZvbGRlcg0KIAkJCWNvbXB1dGVBbGxQYWNrYWdlcyhjaGlsZHJlbltpXSwgb2xkUm9vdHMsIG5ld1Jvb3RzKTsNCiAJCX0NCkBAIC02MjgsNyArNjI3LDcgQEAKIAkvLyBQcm9jZXNzIGFkZGVkIHBhY2thZ2VzDQogCWZvciAoRW51bWVyYXRpb24gYWRkZWRQa2dzID0gZkFkZGVkUGFja2FnZUhhbmRsZXMuZWxlbWVudHMoKTsgYWRkZWRQa2dzLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJSVBhY2thZ2UgcGtnID0gKElQYWNrYWdlKSBhZGRlZFBrZ3MubmV4dEVsZW1lbnQoKTsNCi0JCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nIi8qbm9uTkxTKi8sIFBhY2thZ2VJbXBsLnJlYWRhYmxlTmFtZShwa2cpKSk7DQorCQlmTm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLmFuYWx5emluZyIsIFBhY2thZ2VJbXBsLnJlYWRhYmxlTmFtZShwa2cpKSk7IC8vJE5PTi1OTFMtMSQNCiANCiAJCS8vIE1hcmsgYWxsIGRlcGVuZGVudHMgb2YgbWlzc2luZyBuYW1lc3BhY2UgYXMgbmVlZGluZyBjb21waWxlLg0KIAkJbWFya0RlcGVuZGVudHNBc05lZWRpbmdDb21waWxlKHBrZyk7DQpAQCAtNjQzLDcgKzY0Miw3IEBACiAJLy8gUHJvY2VzcyByZW1vdmVkIHBhY2thZ2VzDQogCWZvciAoRW51bWVyYXRpb24gcmVtb3ZlZFBrZ3MgPSBmUmVtb3ZlZFBhY2thZ2VIYW5kbGVzLmVsZW1lbnRzKCk7IHJlbW92ZWRQa2dzLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJSVBhY2thZ2UgcGtnID0gKElQYWNrYWdlKSByZW1vdmVkUGtncy5uZXh0RWxlbWVudCgpOw0KLQkJZk5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5hbmFseXppbmciLypub25OTFMqLywgUGFja2FnZUltcGwucmVhZGFibGVOYW1lKHBrZykpKTsNCisJCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nIiwgUGFja2FnZUltcGwucmVhZGFibGVOYW1lKHBrZykpKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAkJLy8gTWFyayBhbGwgZGVwZW5kZW50cyBvZiBuYW1lc3BhY2UgYXMgbmVlZGluZyBjb21waWxlLg0KIAkJbWFya0RlcGVuZGVudHNBc05lZWRpbmdDb21waWxlKHBrZyk7DQpAQCAtNjU4LDcgKzY1Nyw3IEBACiAJLy8gUHJvY2VzcyBjaGFuZ2VkIHBhY2thZ2VzDQogCWZvciAoRW51bWVyYXRpb24gY2hhbmdlZFBrZ3MgPSBmQ2hhbmdlZFBhY2thZ2VIYW5kbGVzLmVsZW1lbnRzKCk7IGNoYW5nZWRQa2dzLmhhc01vcmVFbGVtZW50cygpOykgew0KIAkJSVBhY2thZ2UgcGtnID0gKElQYWNrYWdlKSBjaGFuZ2VkUGtncy5uZXh0RWxlbWVudCgpOw0KLQkJZk5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5hbmFseXppbmciLypub25OTFMqLywgUGFja2FnZUltcGwucmVhZGFibGVOYW1lKHBrZykpKTsNCisJCWZOb3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nIiwgUGFja2FnZUltcGwucmVhZGFibGVOYW1lKHBrZykpKTsgLy8kTk9OLU5MUy0xJA0KIAkJY29tcHV0ZU5hbWVzcGFjZUNoYW5nZXMocGtnKTsNCiAJCWZOb3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKHByb2dyZXNzRGVsdGEpOw0KIAkJZk5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7DQpAQCAtNjcxLDcgKzY3MCw3IEBACiAJU3RyaW5nIHR5cGVOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KIAlpZiAocGFyZW50VHlwZU5hbWUgIT0gbnVsbCkgew0KIAkJaW50IGxlbiA9IHBhcmVudFR5cGVOYW1lLmxlbmd0aCgpICsgdHlwZU5hbWUubGVuZ3RoKCkgKyAxOw0KLQkJdHlwZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbikuYXBwZW5kKHBhcmVudFR5cGVOYW1lKS5hcHBlbmQoIiQiLypub25OTFMqLykuYXBwZW5kKHR5cGVOYW1lKS50b1N0cmluZygpOw0KKwkJdHlwZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbikuYXBwZW5kKHBhcmVudFR5cGVOYW1lKS5hcHBlbmQoIiQiKS5hcHBlbmQodHlwZU5hbWUpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAkvKiBSZW1vdmUgaXQgc28gdGhhdCBvbmx5IG5vbi1tYXRjaGluZyBvbmVzIHJlbWFpbiBpbiB0aGUgdGFibGUuICovDQogCVR5cGVTdHJ1Y3R1cmVFbnRyeSB0c0VudHJ5ID0gKFR5cGVTdHJ1Y3R1cmVFbnRyeSkgb2xkVFNFbnRyaWVzLnJlbW92ZSh0eXBlTmFtZSk7DQpAQCAtOTE0LDcgKzkxMyw3IEBACiAJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KIAlJUGF0aCBwYXRoID0gZGVsdGEuZ2V0RnVsbFBhdGgoKTsNCiAJZm9yIChpbnQgaSA9IHBhdGguc2VnbWVudENvdW50KCk7IC0taSA+IDA7KSB7DQotCQlzYi5hcHBlbmQoIiAgIi8qbm9uTkxTKi8pOw0KKwkJc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsNCiAJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6DQpAQCAtMTA0OCw3ICsxMDQ3LDcgQEAKIA0KIAkJCQkJLyogc2tpcCBub24tamF2YSByZXNvdXJjZXMgKi8NCiAJCQkJCVN0cmluZyBleHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsNCi0JCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiLypub25OTFMqLykgfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzIi8qbm9uTkxTKi8pKSkgew0KKwkJCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpIHx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQkJCQlzZXQucHV0KHBhdGgsIHBhdGgpOw0KIAkJCQkJfQ0KIAkJCQl9DQpAQCAtMTA3Miw3ICsxMDcxLDcgQEAKIAkJSVJlc291cmNlRGVsdGEgY2hhbmdlZCA9IChJUmVzb3VyY2VEZWx0YSkgZS5uZXh0RWxlbWVudCgpOw0KIAkJU3RyaW5nIGV4dGVuc2lvbiA9IGNoYW5nZWQuZ2V0RnVsbFBhdGgoKS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQogCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsNCi0JCQlpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInppcCIvKm5vbk5MUyovKSB8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamFyIi8qbm9uTkxTKi8pKSB7DQorCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ6aXAiKSB8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamFyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCXJldHVybiB0cnVlOw0KIAkJCX0NCiAJCX0NCkBAIC0xMTI3LDcgKzExMjYsNyBAQAogCQkJLyogc2tpcCBqYXZhIHJlc291cmNlcyAqLw0KIAkJCVN0cmluZyBleHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsNCiAJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsNCi0JCQkJaWYgKChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIvKm5vbk5MUyovKSB8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiLypub25OTFMqLykpKSB7DQorCQkJCWlmICgoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiKSB8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCQkvKiBpZiB0aGVyZSBpcyBhbiBhZGRlZCBvciByZW1vdmVkIGpjdSBvciBiaW5hcnksIHRoZSBzb3VyY2UgZW50cmllcyBoYXZlIGNoYW5nZWQgKi8NCiAJCQkJCWludCBzdGF0dXMgPSBmaWxlRGVsdGFzW2pdLmdldEtpbmQoKTsNCiAJCQkJCWlmIChzdGF0dXMgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgc3RhdHVzID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsNCkBAIC0xNDIzLDcgKzE0MjIsNyBAQAogICogQHNlZSBJSW1hZ2VCdWlsZGVyDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJpbmNyZW1lbnRhbCBpbWFnZSBidWlsZGVyIGZvcjpcbiIvKm5vbk5MUyovICsgIlx0bmV3IHN0YXRlOiAiLypub25OTFMqLyArIGdldE5ld1N0YXRlKCkgKyAiXG4iLypub25OTFMqLyArICJcdG9sZCBzdGF0ZTogIi8qbm9uTkxTKi8gKyBnZXRPbGRTdGF0ZSgpOw0KKwlyZXR1cm4gImluY3JlbWVudGFsIGltYWdlIGJ1aWxkZXIgZm9yOlxuIiArICJcdG5ldyBzdGF0ZTogIiArIGdldE5ld1N0YXRlKCkgKyAiXG4iICsgIlx0b2xkIHN0YXRlOiAiICsgZ2V0T2xkU3RhdGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KIH0NCiAvKioNCiAgKiBJZiB0aGlzIHR5cGUgaXMgYSBzdWJ0eXBlIGlzIHRoZSBvcmlnaW5hdG9yIG9mIGFuIGFic3RyYWN0IG1ldGhvZA0KQEAgLTE2MzQsNyArMTYzMyw3IEBACiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgew0KIAkJSVR5cGUgc3VwZXJjbGFzcyA9IGdldEJ1aWxkZXJUeXBlKHR5cGVzW2ldKS5nZXRTdXBlcmNsYXNzKCk7DQogCQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7DQotCQkJU3RyaW5nIGtleSA9ICc8JyArIHN1cGVyY2xhc3MuZ2V0RGVjbGFyZWROYW1lKCkgKyAiPi8wIi8qbm9uTkxTKi87DQorCQkJU3RyaW5nIGtleSA9ICc8JyArIHN1cGVyY2xhc3MuZ2V0RGVjbGFyZWROYW1lKCkgKyAiPi8wIjsgLy8kTk9OLU5MUy0xJA0KIAkJCWlmIChpbmRpY3RtZW50cy50cnlNZXRob2RFdmlkZW5jZShrZXkudG9DaGFyQXJyYXkoKSkpIHsNCiAJCQkJcmV0dXJuIHRydWU7DQogCQkJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9JbmRpY3RtZW50U2V0LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSW5kaWN0bWVudFNldC5qYXZhCmluZGV4IGI5MDQwZTUuLmMzN2VmZmEgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9JbmRpY3RtZW50U2V0LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0luZGljdG1lbnRTZXQuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogCQkJCQkJZk1ldGhvZE93bmVycyA9IG5ldyBIYXNodGFibGUoMTEpOw0KIAkJCQkJZk1ldGhvZE93bmVycy5wdXQob3duZXIsIG93bmVyKTsNCiAJCQkJCWZNZXRob2RPd25lcnNBcnJheSA9IG51bGw7DQotCQkJCQlpZiAoaS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiPCIvKm5vbk5MUyovKSkgew0KKwkJCQkJaWYgKGkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIjwiKSkgeyAvLyROT04tTkxTLTEkDQogCQkJCQkJZkhhc0NvbnN0cnVjdG9ySW5kaWN0bWVudHMgPSB0cnVlOw0KIAkJCQkJfQ0KIAkJCQkJYnJlYWs7DQpAQCAtNzEsNyArNzEsNyBAQAogCQkJCQlmQWJzdHJhY3RNZXRob2RUYWJsZS5wdXQoaS5nZXRLZXkoKSwgaSk7DQogCQkJCQlicmVhazsNCiAJCQkJZGVmYXVsdDoNCi0JCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJJbnRlcm5hbCBFcnJvciAtIFVuZXhwZWN0ZWQga2luZCBvZiBpbmRpY3RtZW50Ii8qbm9uTkxTKi8pOw0KKwkJCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkludGVybmFsIEVycm9yIC0gVW5leHBlY3RlZCBraW5kIG9mIGluZGljdG1lbnQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJYnJlYWs7DQogCQkJfQ0KIAkJfQ0KQEAgLTE2MSwxMyArMTYxLDEzIEBACiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCQlyZXR1cm4gDQotCQkJICAiSW5kaWN0bWVudFNldCgiLypub25OTFMqLw0KLQkJCSsgIlxuICBoaWVyYXJjaHlDaGFuZ2U6ICIvKm5vbk5MUyovICsgZkhpZXJhcmNoeUNoYW5nZQ0KLQkJCSsgIlxuICB0eXBlczpcbiIvKm5vbk5MUyovICsgZlR5cGVzVGFibGUNCi0JCQkrICJcbiAgaW50ZXJmYWNlczpcbiIvKm5vbk5MUyovICsgZkFic3RyYWN0TWV0aG9kVGFibGUNCi0JCQkrICJcbiAgbWV0aG9kczpcbiIvKm5vbk5MUyovICsgZk1ldGhvZHNUYWJsZQ0KLQkJCSsgIlxuICBmaWVsZHM6XG4iLypub25OTFMqLyArIGZGaWVsZHNUYWJsZQ0KLQkJCSsgIlxuKSIvKm5vbk5MUyovOw0KKwkJCSAgIkluZGljdG1lbnRTZXQoIiAvLyROT04tTkxTLTEkDQorCQkJKyAiXG4gIGhpZXJhcmNoeUNoYW5nZTogIiArIGZIaWVyYXJjaHlDaGFuZ2UgLy8kTk9OLU5MUy0xJA0KKwkJCSsgIlxuICB0eXBlczpcbiIgKyBmVHlwZXNUYWJsZSAvLyROT04tTkxTLTEkDQorCQkJKyAiXG4gIGludGVyZmFjZXM6XG4iICsgZkFic3RyYWN0TWV0aG9kVGFibGUgLy8kTk9OLU5MUy0xJA0KKwkJCSsgIlxuICBtZXRob2RzOlxuIiArIGZNZXRob2RzVGFibGUgLy8kTk9OLU5MUy0xJA0KKwkJCSsgIlxuICBmaWVsZHM6XG4iICsgZkZpZWxkc1RhYmxlIC8vJE5PTi1OTFMtMSQNCisJCQkrICJcbikiOyAvLyROT04tTkxTLTEkDQogCQkJCQ0KIAl9DQogLyoqDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0pDVU5vZGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9KQ1VOb2RlLmphdmEKaW5kZXggMTkyZDYyNi4uMzQzOGNiMiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0pDVU5vZGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSkNVTm9kZS5qYXZhCkBAIC04Niw2ICs4Niw2IEBACiAJICogcHVycG9zZXMgb25seS4NCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gIkpDVU5vZGUoIi8qbm9uTkxTKi8gKyBmVW5pdC5nZXRGaWxlTmFtZSgpICsgIikiLypub25OTFMqLzsNCisJCXJldHVybiAiSkNVTm9kZSgiICsgZlVuaXQuZ2V0RmlsZU5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0phdmFCdWlsZGVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSmF2YUJ1aWxkZXIuamF2YQppbmRleCA0M2RkMzIxLi5mMThlZmQ5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSmF2YUJ1aWxkZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvSmF2YUJ1aWxkZXIuamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCQkJaWYgKGUuZ2V0VGhyb3dhYmxlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7DQogCQkJCXRocm93IChDb3JlRXhjZXB0aW9uKSBlLmdldFRocm93YWJsZSgpOw0KIAkJCX0gZWxzZSB7DQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJidWlsZC5idWlsZGVyTmFtZSIvKm5vbk5MUyovKSwgZSkpOw0KKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiYnVpbGQuYnVpbGRlck5hbWUiKSwgZSkpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgew0KIAkJCS8vIERvIG5vdGhpbmcgZm9yIG5vdywgYW5kIGF2b2lkIHByb3BhZ2F0aW5nIHRoZSBleGNlcHRpb24uICANCkBAIC03NCw3ICs3NCw3IEBACiAJCQkJLy8gZm9yY2luZyBhIGZ1bGwgYnVpbGQgbmV4dCB0aW1lLg0KIAkJCQlzZXRMYXN0QnVpbHRTdGF0ZShudWxsKTsNCiAJCQl9DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuY29tcGxldGVkIi8qbm9uTkxTKi8pKTsNCisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5jb21wbGV0ZWQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCXJldHVybiBnZXRSZXF1aXJlZFByb2plY3RzKGdldExhc3RCdWlsdFN0YXRlKG1vbml0b3IpKTsNCiAJfQ0KQEAgLTkzLDI4ICs5MywyOCBAQAogCQlIYXNodGFibGUgZGVsdGFzID0gbmV3IEhhc2h0YWJsZSgxMSk7DQogCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOw0KIA0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQucmVhZGluZ0RlbHRhIi8qbm9uTkxTKi8sIHByb2plY3QuZ2V0TmFtZSgpKSk7DQorCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5yZWFkaW5nRGVsdGEiLCBwcm9qZWN0LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkDQogCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKHByb2plY3QpOw0KIAkJaWYgKGRlbHRhID09IG51bGwpew0KIAkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIGRlbHRhIGZvcjogIisgcHJvamVjdC5nZXROYW1lKCkpOwkJCQ0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3Iuc3ViVGFzaygiIi8qbm9uTkxTKi8pOw0KKwkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlyZXR1cm4gbnVsbDsNCiAJCX0gZWxzZSB7DQogCQkJZGVsdGFzLnB1dChwcm9qZWN0LCBkZWx0YSk7DQogCQl9DQogCQlJUHJvamVjdFtdIHByZXJlcXMgPSBnZXRSZXF1aXJlZFByb2plY3RzKG9sZFN0YXRlKTsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlcmVxcy5sZW5ndGg7ICsraSkgew0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpICBtb25pdG9yLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5yZWFkaW5nRGVsdGEiLypub25OTFMqLywgcHJlcmVxc1tpXS5nZXROYW1lKCkpKTsNCisJCQlpZiAobW9uaXRvciAhPSBudWxsKSAgbW9uaXRvci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQucmVhZGluZ0RlbHRhIiwgcHJlcmVxc1tpXS5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWRlbHRhID0gZ2V0RGVsdGEocHJlcmVxc1tpXSk7DQogCQkJaWYgKGRlbHRhID09IG51bGwpew0KIAkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyBkZWx0YSBmb3I6ICIrIHByZXJlcXNbaV0uZ2V0TmFtZSgpKTsJCQkNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5zdWJUYXNrKCIiLypub25OTFMqLyk7DQorCQkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJcmV0dXJuIG51bGw7DQogCQkJfSBlbHNlIHsNCiAJCQkJZGVsdGFzLnB1dChwcmVyZXFzW2ldLCBkZWx0YSk7DQogCQkJfQ0KIAkJfQ0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5zdWJUYXNrKCIiLypub25OTFMqLyk7DQorCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gZGVsdGFzOw0KIAl9DQogLyoqDQpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCXJldHVybiAhVXRpbC5lcXVhbEFycmF5c09yTnVsbChvbGRSb290cywgbmV3Um9vdHMpOw0KIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KIAkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oDQotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsIFV0aWwuYmluZCgiZWxlbWVudC5wcm9qZWN0RG9lc05vdEV4aXN0Ii8qbm9uTkxTKi8sIGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBlKSk7DQorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsIFV0aWwuYmluZCgiZWxlbWVudC5wcm9qZWN0RG9lc05vdEV4aXN0IiwgZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGUpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIAkvKioNCkBAIC0xNDMsNyArMTQzLDcgQEAKIA0KIAkJLyogY3JlYXRlIGFuZCBpbnZva2UgdGhlIGJhdGNoIGJ1aWxkZXIgKi8NCiAJCS8vIFBhc3MgdGhlIGNvbXBpbGVyIG9wdGlvbnMsIG5lZWRlZCBmb3IgMUZWWFM4MDogSVRQSkNPUkU6QUxMIC0gLmNsYXNzIGZpbGVzIGFyZSBtaXNzaW5nIHRoZWlyIExvY2FsVmFyaWFibGVUYWJsZQ0KLQkJQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucyA9IEphdmFNb2RlbE1hbmFnZXIuY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsNCisJCUNvbmZpZ3VyYWJsZU9wdGlvbltdIG9wdGlvbnMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKTsNCiAJCXNldExhc3RCdWlsdFN0YXRlKG51bGwpOyAvLyBmcmVlIHBvc3NpYmxlIGV4aXN0aW5nIHN0YXRlDQogCQlJSW1hZ2VCdWlsZGVyIGJ1aWxkZXIgPSBkYy5jcmVhdGVTdGF0ZShwcm9qZWN0LCBudWxsLCBwcm9ibGVtUmVwb3J0ZXIsIG9wdGlvbnMpOw0KIAkJc2V0TGFzdEJ1aWx0U3RhdGUoYnVpbGRlci5nZXROZXdTdGF0ZSgpKTsNCkBAIC0yMzcsOCArMjM3LDggQEAKIAlpbnQgZmxhZ3MgPSBjaGFuZ2UuZ2V0RmxhZ3MoKTsNCiAJYm9vbGVhbiBjb250ZW50Q2hhbmdlZCA9IGlzQ2hhbmdlZCAmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwOw0KIAlTdHJpbmcgZXh0ZW5zaW9uID0gY2hhbmdlLmdldEZ1bGxQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQlib29sZWFuIGlzSmF2YU9yQ2xhc3NGaWxlID0gZXh0ZW5zaW9uICE9IG51bGwgJiYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIi8qbm9uTkxTKi8pIHx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIvKm5vbk5MUyovKSk7DQotCWJvb2xlYW4gaXNBcmNoaXZlID0gZXh0ZW5zaW9uICE9IG51bGwgJiYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ6aXAiLypub25OTFMqLykgfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphciIvKm5vbk5MUyovKSk7DQorCWJvb2xlYW4gaXNKYXZhT3JDbGFzc0ZpbGUgPSBleHRlbnNpb24gIT0gbnVsbCAmJiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiKSB8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwlib29sZWFuIGlzQXJjaGl2ZSA9IGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiemlwIikgfHwgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQ0KIAkvLyBjYXJlIGFib3V0IGFkZGVkLCByZW1vdmVkIGFuZCBtb2RpZmllZCAoY29udGVudCBhY3R1YWxseSBtb2RpZmllZCkgLmphdmEgYW5kIC5jbGFzcyBmaWxlcw0KIAlpZiAoaXNKYXZhT3JDbGFzc0ZpbGUgJiYgKGlzQWRkZWQgfHwgaXNSZW1vdmVkIHx8IGNvbnRlbnRDaGFuZ2VkKSkNCkBAIC0yODgsNyArMjg4LDcgQEAKIAkJSVBhdGggbmV3T3V0cHV0TG9jYXRpb24gPSBnZXRKYXZhUHJvamVjdCgpLmdldE91dHB1dExvY2F0aW9uKCk7DQogCQlyZXR1cm4gIW9sZE91dHB1dExvY2F0aW9uLmVxdWFscyhuZXdPdXRwdXRMb2NhdGlvbik7DQogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7DQotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgUGxhdGZvcm0uUExVR0lOX0VSUk9SLCBVdGlsLmJpbmQoImVsZW1lbnQucHJvamVjdERvZXNOb3RFeGlzdCIvKm5vbk5MUyovLCBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgZSkpOw0KKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIFBsYXRmb3JtLlBMVUdJTl9FUlJPUiwgVXRpbC5iaW5kKCJlbGVtZW50LnByb2plY3REb2VzTm90RXhpc3QiLCBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgZSkpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogcHJvdGVjdGVkIHZvaWQgc2V0TGFzdEJ1aWx0U3RhdGUoSVN0YXRlIHN0YXRlKSB7DQpAQCAtMzAwLDkgKzMwMCw5IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlJU3RhdGUgbGFzdEJ1aWx0U3RhdGUgPSBnZXRMYXN0QnVpbHRTdGF0ZShudWxsKTsNCiAJaWYgKGxhc3RCdWlsdFN0YXRlID09IG51bGwpIHsNCi0JCXJldHVybiAiSmF2YUJ1aWxkZXIobm8gYnVpbHQgc3RhdGUpIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIkphdmFCdWlsZGVyKG5vIGJ1aWx0IHN0YXRlKSI7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCi0JCXJldHVybiAiSmF2YUJ1aWxkZXIoIi8qbm9uTkxTKi8gKyBsYXN0QnVpbHRTdGF0ZSArICIpIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIkphdmFCdWlsZGVyKCIgKyBsYXN0QnVpbHRTdGF0ZSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9KYXZhRGV2ZWxvcG1lbnRDb250ZXh0SW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0phdmFEZXZlbG9wbWVudENvbnRleHRJbXBsLmphdmEKaW5kZXggM2I4OTRlYS4uMTE4ZjU5NyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0phdmFEZXZlbG9wbWVudENvbnRleHRJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL0phdmFEZXZlbG9wbWVudENvbnRleHRJbXBsLmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29uZmlndXJhYmxlT3B0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuSUJpbmFyeUJyb2tlcjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5JQnVpbGRMaXN0ZW5lcjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5JQnVpbGRNb25pdG9yOw0KQEAgLTcwLDEyICs3MiwxMiBAQAogCS8qKg0KIAkgKiBUaGUgZGVmYXVsdCBwYWNrYWdlLg0KIAkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZSBmRGVmYXVsdFBhY2thZ2UgPSBmSW1hZ2UuZ2V0UGFja2FnZUhhbmRsZSgiamF2YS5sYW5nIi8qbm9uTkxTKi8sIGZhbHNlKTsNCisJcHJpdmF0ZSBmaW5hbCBJUGFja2FnZSBmRGVmYXVsdFBhY2thZ2UgPSBmSW1hZ2UuZ2V0UGFja2FnZUhhbmRsZSgiamF2YS5sYW5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkDQogDQogCS8qKg0KIAkgKiBUaGUgcm9vdCBjbGFzcyBoYW5kbGUNCiAJICovDQotCXByaXZhdGUgZmluYWwgSVR5cGUgZlJvb3RDbGFzcyA9IGZEZWZhdWx0UGFja2FnZS5nZXRDbGFzc0hhbmRsZSgiT2JqZWN0Ii8qbm9uTkxTKi8pOw0KKwlwcml2YXRlIGZpbmFsIElUeXBlIGZSb290Q2xhc3MgPSBmRGVmYXVsdFBhY2thZ2UuZ2V0Q2xhc3NIYW5kbGUoIk9iamVjdCIpOyAvLyROT04tTkxTLTEkDQogDQogCS8qKg0KIAkgKiBQcmltaXRpdmUgdHlwZXMNCkBAIC0xOTUsNyArMTk3LDcgQEAKIAl9DQogcHVibGljIElTdGF0ZSBnZXRDdXJyZW50U3RhdGUoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbiB7DQogCWlmIChmQ3VycmVudFN0YXRlID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBOb3RQcmVzZW50RXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvciAtIE5vIGN1cnJlbnQgc3RhdGUiLypub25OTFMqLyk7DQorCQl0aHJvdyBuZXcgTm90UHJlc2VudEV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3IgLSBObyBjdXJyZW50IHN0YXRlIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gZkN1cnJlbnRTdGF0ZTsNCiB9DQpAQCAtMjAzLDE1ICsyMDUsNyBAQAogICogUmVhZHMgdGhlIGRlZmF1bHQgY29tcGlsZXIgb3B0aW9ucy4NCiAgKi8NCiBwcm90ZWN0ZWQgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldERlZmF1bHRDb21waWxlck9wdGlvbnMoKSB7DQotCUNvbmZpZ3VyYWJsZU9wdGlvbltdIG9wdGlvbnMgPSBDb21waWxlci5nZXREZWZhdWx0T3B0aW9ucyhMb2NhbGUuZ2V0RGVmYXVsdCgpKTsNCi0NCi0JLyoqDQotCSAqIFVnbHkgYmVjYXVzZSB0aGlzIHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgY29tcGlsZXIncw0KLQkgKiBpbnRlcm5hbCBwcm9ibGVtIHJlcHJlc2VudGF0aW9uLg0KLQkgKi8NCi0Jc2V0Q29tcGlsZXJPcHRpb24ob3B0aW9ucywgMTEsIDEpOw0KLQlzZXRDb21waWxlck9wdGlvbihvcHRpb25zLCAxMiwgMSk7DQotCXJldHVybiBvcHRpb25zOw0KKwlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRPcHRpb25zKCk7DQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIGRlZmF1bHQgcGFja2FnZSBoYW5kbGUgKGphdmEubGFuZykuDQpAQCAtMzAzLDcgKzI5Nyw3IEBACiAJCWNoYXIgYyA9IGxvY2FsU2lnLmNoYXJBdChwb3NpdGlvbik7DQogCQlpZiAoYyA9PSAnTCcgfHwgYyA9PSAnUScpIHsNCiAJCQkvKiBpdHMgYSBjbGFzcyB0eXBlICovDQotCQkJaW50IGVuZEluZGV4ID0gbG9jYWxTaWcuaW5kZXhPZigiOyIvKm5vbk5MUyovKSArIDE7DQorCQkJaW50IGVuZEluZGV4ID0gbG9jYWxTaWcuaW5kZXhPZigiOyIpICsgMTsgLy8kTk9OLU5MUy0xJA0KIAkJCXBhcm1UeXBlID0gY2xhc3NUeXBlRnJvbU5hbWUobG9jYWxTaWcuc3Vic3RyaW5nKHBvc2l0aW9uLCBlbmRJbmRleCkpOw0KIAkJCWxvY2FsU2lnID0gbG9jYWxTaWcuc3Vic3RyaW5nKGVuZEluZGV4KTsNCiAJCX0gZWxzZSB7DQpAQCAtNDA1LDE3ICszOTksNyBAQAogICovDQogcHVibGljIHZvaWQgc2V0QnVpbGRQcm9ncmVzc0xpc3RlbmVyKElQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKSB7DQogfQ0KLS8qKg0KLSAqIFNldHMgYSBjb21waWxlciBvcHRpb24uICBUaGlzIHNlZW1zIGF3a3dhcmQuDQotICovDQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyT3B0aW9uKENvbmZpZ3VyYWJsZU9wdGlvbltdIG9wdGlvbnMsIGludCBvcHRpb25JRCwgaW50IHZhbHVlSW5kZXgpIHsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7DQotCQlpZiAob3B0aW9uc1tpXS5nZXRJRCgpID09IG9wdGlvbklEKSB7DQotCQkJb3B0aW9uc1tpXS5zZXRWYWx1ZUluZGV4KHZhbHVlSW5kZXgpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JfQ0KLX0NCisNCiAvKioNCiAgKiBzZXRDdXJyZW50U3RhdGUgbWV0aG9kIGNvbW1lbnQuDQogICovDQpAQCAtNDI5LDYgKzQxMyw2IEBACiAJCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOw0KIAl9DQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gImEgSmF2YURldmVsb3BtZW50Q29udGV4dEltcGwoIi8qbm9uTkxTKi8gKyBmQ3VycmVudFN0YXRlICsgIikiLypub25OTFMqLzsNCisJCXJldHVybiAiYSBKYXZhRGV2ZWxvcG1lbnRDb250ZXh0SW1wbCgiICsgZkN1cnJlbnRTdGF0ZSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01hcmtlclByb2JsZW1SZXBvcnRlci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01hcmtlclByb2JsZW1SZXBvcnRlci5qYXZhCmluZGV4IGI5OGM2YWIuLjExOTI3YzUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9NYXJrZXJQcm9ibGVtUmVwb3J0ZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTWFya2VyUHJvYmxlbVJlcG9ydGVyLmphdmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01ldGhvZENvbGxhYm9yYXRvckluZGljdG1lbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9NZXRob2RDb2xsYWJvcmF0b3JJbmRpY3RtZW50LmphdmEKaW5kZXggNGQ4NzQwZS4uYmI5OWQyNyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01ldGhvZENvbGxhYm9yYXRvckluZGljdG1lbnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTWV0aG9kQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAJICogb25seSAoTk9OLU5MUykuDQogCSAqLw0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1ldGhvZEluZGljdG1lbnQoIi8qbm9uTkxTKi8pOw0KKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1ldGhvZEluZGljdG1lbnQoIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1Zi5hcHBlbmQoZk5hbWUpOw0KIAkJYnVmLmFwcGVuZCgnLycpOw0KIAkJYnVmLmFwcGVuZChmUGFybUNvdW50KTsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTWV0aG9kSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01ldGhvZEltcGwuamF2YQppbmRleCA5ZjM3ZjkwLi43ODY0MDUxIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTWV0aG9kSW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9NZXRob2RJbXBsLmphdmEKQEAgLTYxLDE0ICs2MSwxNCBAQAogCSAqIHVucXVhbGlmaWVkIHNvdXJjZSBzaWduYXR1cmUgZm9ybWF0Lg0KIAkgKi8NCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VQYXJhbWV0ZXJzKCkgew0KLQkJU3RyaW5nIHNvdXJjZVNpZyA9ICIoIi8qbm9uTkxTKi87DQorCQlTdHJpbmcgc291cmNlU2lnID0gIigiOyAvLyROT04tTkxTLTEkDQogDQogCQkvKiBhcHBlbmQgcGFyYW1ldGVyIHR5cGVzIHRvIHNpZ25hdHVyZSAqLw0KIAkJSVR5cGVbXSBwYXJtcyA9IGdldFBhcmFtZXRlclR5cGVzKCk7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7DQogCQkJc291cmNlU2lnICs9IHBhcm1zW2ldLmdldFNpbXBsZU5hbWUoKS5yZXBsYWNlKCdMJywgJ1EnKTsNCiAJCX0NCi0JCXNvdXJjZVNpZyArPSAiKSIvKm5vbk5MUyovOw0KKwkJc291cmNlU2lnICs9ICIpIjsgLy8kTk9OLU5MUy0xJA0KIAkJcmV0dXJuIHNvdXJjZVNpZzsNCiAJfQ0KIC8qKg0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Nb2RpZmllZEJ1aWxkZXJUeXBlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTW9kaWZpZWRCdWlsZGVyVHlwZS5qYXZhCmluZGV4IDI4MzU4OWYuLjc0YWVhMWMgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Nb2RpZmllZEJ1aWxkZXJUeXBlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL01vZGlmaWVkQnVpbGRlclR5cGUuamF2YQpAQCAtMjQ5LDcgKzI0OSw3IEBACiAgKiBGb3IgZGVidWdnaW5nIG9ubHkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiTW9kaWZpZWRCdWlsZGVyVHlwZSgiLypub25OTFMqLyk7DQorCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJNb2RpZmllZEJ1aWxkZXJUeXBlKCIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWYuYXBwZW5kKGZPbGRUU0VudHJ5LmdldFR5cGUoKS5nZXROYW1lKCkpLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTmFtZXNwYWNlTm9kZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL05hbWVzcGFjZU5vZGUuamF2YQppbmRleCA4NTIwNTgyLi4yYzUzZWJmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTmFtZXNwYWNlTm9kZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9OYW1lc3BhY2VOb2RlLmphdmEKQEAgLTYyLDYgKzYyLDYgQEAKIAkgKiBwdXJwb3NlcyBvbmx5Lg0KIAkgKi8NCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiAiTmFtZXNwYWNlTm9kZSgiLypub25OTFMqLyArIGZQYWNrYWdlLmdldE5hbWUoKSArICIpIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIk5hbWVzcGFjZU5vZGUoIiArIGZQYWNrYWdlLmdldE5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL05ld0J1aWxkZXJUeXBlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTmV3QnVpbGRlclR5cGUuamF2YQppbmRleCAxYjQwMzY1Li5hZmY3YzYyIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTmV3QnVpbGRlclR5cGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvTmV3QnVpbGRlclR5cGUuamF2YQpAQCAtNDgsNiArNDgsNiBAQAogICogRm9yIGRlYnVnZ2luZyBvbmx5DQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJOZXdCdWlsZGVyVHlwZSgiLypub25OTFMqLyArIGZOZXdUU0VudHJ5LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiKSIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIk5ld0J1aWxkZXJUeXBlKCIgKyBmTmV3VFNFbnRyeS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Ob25TdGF0ZVNwZWNpZmljSGFuZGxlSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL05vblN0YXRlU3BlY2lmaWNIYW5kbGVJbXBsLmphdmEKaW5kZXggMmI1YmU5Ni4uNzFkZGU3NiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL05vblN0YXRlU3BlY2lmaWNIYW5kbGVJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL05vblN0YXRlU3BlY2lmaWNIYW5kbGVJbXBsLmphdmEKQEAgLTksNyArOSw3IEBACiANCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9uU3RhdGVTcGVjaWZpY0hhbmRsZUltcGwgaW1wbGVtZW50cyBJSGFuZGxlIHsNCiBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVEJEIi8qbm9uTkxTKi8pOw0KKwlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVEJEIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGZhbHNlOw0KIH0NCiAJcHVibGljIElEZXZlbG9wbWVudENvbnRleHQgZ2V0RGV2ZWxvcG1lbnRDb250ZXh0KCkgew0KQEAgLTEwNyw3ICsxMDcsNyBAQAogCXJldHVybiByZXN1bHQ7DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCUFzc2VydC5pc1RydWUoZmFsc2UsICJUQkQiLypub25OTFMqLyk7DQorCUFzc2VydC5pc1RydWUoZmFsc2UsICJUQkQiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gbnVsbDsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9PbGRCdWlsZGVyVHlwZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL09sZEJ1aWxkZXJUeXBlLmphdmEKaW5kZXggN2Q5NDdkNC4uZjY1YmUxOCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL09sZEJ1aWxkZXJUeXBlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL09sZEJ1aWxkZXJUeXBlLmphdmEKQEAgLTU2LDYgKzU2LDYgQEAKICAqIEZvciBkZWJ1Z2dpbmcgb25seQ0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiAiT2xkQnVpbGRlclR5cGUoIi8qbm9uTkxTKi8gKyBmT2xkVFNFbnRyeS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIikiLypub25OTFMqLzsNCisJcmV0dXJuICJPbGRCdWlsZGVyVHlwZSgiICsgZk9sZFRTRW50cnkuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvT3JkZXJlZFNldC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL09yZGVyZWRTZXQuamF2YQppbmRleCBhMzc5OThkLi41Y2JjYzVmIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvT3JkZXJlZFNldC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9PcmRlcmVkU2V0LmphdmEKQEAgLTIxNCw3ICsyMTQsNyBAQAogCWZvciAoaW50IGk9MDsgaTxlbGVtZW50Q291bnQ7IGkrKykgew0KIAkJaWYgKGkgIT0gMCkgYnVmZmVyLmFwcGVuZCAoJywnKTsNCiAJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAxMDAwKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgiLi4uIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIi4uLiIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQl9DQogCQlidWZmZXIuYXBwZW5kIChvcmRlcmVkTGlzdFtpXSk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhY2thZ2VJbXBsLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGwuamF2YQppbmRleCA5OWM4NjMwLi4xYTZjMGM5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGwuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGwuamF2YQpAQCAtMTksNyArMTksNyBAQAogCVN0cmluZyBmTmFtZTsNCiAJYm9vbGVhbiBmSXNVbm5hbWVkOw0KIA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0VfUFJFRklYID0gIkRlZmF1bHQtIi8qbm9uTkxTKi87DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS0FHRV9QUkVGSVggPSAiRGVmYXVsdC0iOyAvLyROT04tTkxTLTEkDQogLyoqDQogICogQ3JlYXRlcyBhIG5ldyBwYWNrYWdlDQogICogQHBhcmFtIG5hbWUgb2YgcGFja2FnZQ0KQEAgLTIwMyw5ICsyMDMsOSBAQAogcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGVOYW1lKElQYWNrYWdlIHBrZykgew0KIAlTdHJpbmcgbmFtZSA9IHBrZy5nZXROYW1lKCk7DQogCWlmIChwa2cuaXNVbm5hbWVkKCkpIHsNCi0JCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLmRlZmF1bHRQYWNrYWdlTmFtZSIvKm5vbk5MUyovLCBuYW1lLnN1YnN0cmluZyhERUZBVUxUX1BBQ0tBR0VfUFJFRklYLmxlbmd0aCgpKSk7DQorCQlyZXR1cm4gVXRpbC5iaW5kKCJidWlsZC5kZWZhdWx0UGFja2FnZU5hbWUiLCBuYW1lLnN1YnN0cmluZyhERUZBVUxUX1BBQ0tBR0VfUFJFRklYLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCi0JCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLnBhY2thZ2VOYW1lIi8qbm9uTkxTKi8sIG5hbWUpOw0KKwkJcmV0dXJuIFV0aWwuYmluZCgiYnVpbGQucGFja2FnZU5hbWUiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIAkvKioNCkBAIC0yMTMsOSArMjEzLDkgQEAKIAkgKiBvbmx5IChOT04tTkxTKS4NCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmcgcmVzdWx0ID0gInBhY2thZ2UgIi8qbm9uTkxTKi87DQorCQlTdHJpbmcgcmVzdWx0ID0gInBhY2thZ2UgIjsgLy8kTk9OLU5MUy0xJA0KIAkJaWYgKGlzVW5uYW1lZCgpKSANCi0JCQlyZXN1bHQgKz0gInt1bm5hbWVkLCBpZD0iLypub25OTFMqLyArIGdldE5hbWUoKSArICJ9Ii8qbm9uTkxTKi87DQorCQkJcmVzdWx0ICs9ICJ7dW5uYW1lZCwgaWQ9IiArIGdldE5hbWUoKSArICJ9IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQllbHNlDQogCQkJcmVzdWx0ICs9IGdldE5hbWUoKTsNCiAJCXJldHVybiByZXN1bHQ7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhY2thZ2VJbXBsU1dILmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGxTV0guamF2YQppbmRleCA4YmYzYTE1Li40ZjM0ZmM4IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGxTV0guamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZUltcGxTV0guamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJcHVibGljIElQYWNrYWdlW10gZ2V0UmVmZXJlbmNpbmdQYWNrYWdlcyhJSW1hZ2VDb250ZXh0IGNvbnRleHQpIA0KIAkgIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uIHsNCiAJCWlmICghaXNQcmVzZW50KCkpDQotCQkJdGhyb3cgbmV3IE5vdFByZXNlbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50Lm5vdFByZXNlbnQiLypub25OTFMqLykpOw0KKwkJCXRocm93IG5ldyBOb3RQcmVzZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5ub3RQcmVzZW50IikpOyAvLyROT04tTkxTLTEkDQogDQogCQlJUGFja2FnZVtdIHBrZ3MgPSBmU3RhdGUuZ2V0UmVmZXJlbmNpbmdQYWNrYWdlcyhmSGFuZGxlLCBjb250ZXh0KTsNCiANCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZU1hcC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhY2thZ2VNYXAuamF2YQppbmRleCA4Zjg4Y2YyLi5lZDRkNzQ0IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZU1hcC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9QYWNrYWdlTWFwLmphdmEKQEAgLTExMiwxNSArMTEyLDE1IEBACiAJCUlQYWNrYWdlW10gcGtncyA9IGdldEFsbFBhY2thZ2VzQXNBcnJheSgpOw0KIAkJQXJyYXlzLnNvcnQocGtncywgU3RhdGVJbXBsLmdldFBhY2thZ2VDb21wYXJhdG9yKCkpOw0KIAkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJc2IuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkgKyAiOlxuIi8qbm9uTkxTKi8pOw0KKwkJc2IuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkgKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcGtncy5sZW5ndGg7ICsraSkgew0KLQkJCXNiLmFwcGVuZCgiICAiLypub25OTFMqLyArIHBrZ3NbaV0uZ2V0TmFtZSgpICsgIjogIi8qbm9uTkxTKi8pOw0KKwkJCXNiLmFwcGVuZCgiICAiICsgcGtnc1tpXS5nZXROYW1lKCkgKyAiOiAiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJSVBhdGhbXSBmcmFnbWVudHMgPSBnZXRGcmFnbWVudHMocGtnc1tpXSk7DQogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcmFnbWVudHMubGVuZ3RoOyArK2opIHsNCi0JCQkJaWYgKGogIT0gMCkgc2IuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQkJaWYgKGogIT0gMCkgc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQkJCXNiLmFwcGVuZChmcmFnbWVudHNbal0pOw0KIAkJCX0NCi0JCQlzYi5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQogCX0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZU1hcEVudHJ5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGFja2FnZU1hcEVudHJ5LmphdmEKaW5kZXggNmY4MDY2OS4uODY5YWZhYSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhY2thZ2VNYXBFbnRyeS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9QYWNrYWdlTWFwRW50cnkuamF2YQpAQCAtNzMsOSArNzMsOSBAQAogCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4NCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiUGFja2FnZU1hcEVudHJ5KCIvKm5vbk5MUyovKTsNCisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJQYWNrYWdlTWFwRW50cnkoIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1Zi5hcHBlbmQoZlBrZyk7DQotCQlidWYuYXBwZW5kKCIpIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhdGhNYXAuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9QYXRoTWFwLmphdmEKaW5kZXggNGE4NWU3OC4uOTg5MDhhYyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1BhdGhNYXAuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUGF0aE1hcC5qYXZhCkBAIC02MSwxMCArNjEsMTAgQEAKIElQYWNrYWdlIHBhY2thZ2VIYW5kbGVGcm9tUGF0aChJUGF0aCBwYXRoKSB7DQogCUlQYWNrYWdlW10gcGtncyA9IChJUGFja2FnZVtdKWZUYWJsZS5nZXQocGF0aCk7DQogCWlmIChwa2dzID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBFcnJvcihVdGlsLmJpbmQoImJ1aWxkLm5vUGFja2FnZVBhdGgiLypub25OTFMqLywgcGF0aC50b1N0cmluZygpKSk7DQorCQl0aHJvdyBuZXcgRXJyb3IoVXRpbC5iaW5kKCJidWlsZC5ub1BhY2thZ2VQYXRoIiwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAocGtncy5sZW5ndGggIT0gMSkgew0KLQkJdGhyb3cgbmV3IEVycm9yKFV0aWwuYmluZCgiYnVpbGQuYW1iaWd1b3VzUGFja2FnZSIvKm5vbk5MUyovLCBwYXRoLnRvU3RyaW5nKCkpKTsNCisJCXRocm93IG5ldyBFcnJvcihVdGlsLmJpbmQoImJ1aWxkLmFtYmlndW91c1BhY2thZ2UiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXJldHVybiBwa2dzWzBdOw0KIH0NCkBAIC0xMjAsMjMgKzEyMCwyMyBAQAogCQl9DQogCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIFN0YXRlSW1wbC5nZXRQYXRoQ29tcGFyYXRvcigpKTsNCiAJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCXNiLmFwcGVuZChzdXBlci50b1N0cmluZygpICsgIjpcbiIvKm5vbk5MUyovKTsNCisJCXNiLmFwcGVuZChzdXBlci50b1N0cmluZygpICsgIjpcbiIpOyAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsNCiAJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBsaXN0LmdldChpKTsNCi0JCQlzYi5hcHBlbmQoIiAgIi8qbm9uTkxTKi8gKyBwYXRoICsgIjogIi8qbm9uTkxTKi8pOw0KKwkJCXNiLmFwcGVuZCgiICAiICsgcGF0aCArICI6ICIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQlJUGFja2FnZVtdIHBrZ3MgPSBwYWNrYWdlSGFuZGxlc0Zyb21QYXRoKHBhdGgpOw0KIAkJCWlmIChwa2dzLmxlbmd0aCA9PSAxKSB7DQogCQkJCXNiLmFwcGVuZChwa2dzWzBdLmdldE5hbWUoKSk7DQogCQkJfQ0KIAkJCWVsc2Ugew0KIAkJCQlBcnJheXMuc29ydChwa2dzLCBTdGF0ZUltcGwuZ2V0UGFja2FnZUNvbXBhcmF0b3IoKSk7DQotCQkJCXNiLmFwcGVuZCgiKCIvKm5vbk5MUyovICsgcGtncy5sZW5ndGggKyAiIHBhY2thZ2VzKSIvKm5vbk5MUyovKTsNCisJCQkJc2IuYXBwZW5kKCIoIiArIHBrZ3MubGVuZ3RoICsgIiBwYWNrYWdlcykiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGtncy5sZW5ndGg7ICsraikgew0KLQkJCQkJc2IuYXBwZW5kKCJcbiAgICAiLypub25OTFMqLyk7DQorCQkJCQlzYi5hcHBlbmQoIlxuICAgICIpOyAvLyROT04tTkxTLTEkDQogCQkJCQlzYi5hcHBlbmQocGtnc1tqXS5nZXROYW1lKCkpOw0KIAkJCQl9DQogCQkJfQ0KLQkJCXNiLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQkJc2IuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsNCiAJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9QcmltaXRpdmVUeXBlSGFuZGxlSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1ByaW1pdGl2ZVR5cGVIYW5kbGVJbXBsLmphdmEKaW5kZXggZWNmMTg5My4uZGI0NTk0OCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1ByaW1pdGl2ZVR5cGVIYW5kbGVJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1ByaW1pdGl2ZVR5cGVIYW5kbGVJbXBsLmphdmEKQEAgLTE0OSwyMyArMTQ5LDIzIEBACiBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7DQogCXN3aXRjaCAoZlR5cGVDb2RlKSB7DQogCQljYXNlIFRDX0JPT0xFQU4gOg0KLQkJCXJldHVybiAiYm9vbGVhbiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVENfQllURSA6DQotCQkJcmV0dXJuICJieXRlIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJieXRlIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUQ19DSEFSIDoNCi0JCQlyZXR1cm4gImNoYXIiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImNoYXIiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0RPVUJMRSA6DQotCQkJcmV0dXJuICJkb3VibGUiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVENfRkxPQVQgOg0KLQkJCXJldHVybiAiZmxvYXQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gImZsb2F0IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUQ19JTlQgOg0KLQkJCXJldHVybiAiaW50Ii8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJpbnQiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0xPTkcgOg0KLQkJCXJldHVybiAibG9uZyIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAibG9uZyI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVENfU0hPUlQgOg0KLQkJCXJldHVybiAic2hvcnQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInNob3J0IjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUQ19WT0lEIDoNCi0JCQlyZXR1cm4gInZvaWQiLypub25OTFMqLzsNCisJCQlyZXR1cm4gInZvaWQiOyAvLyROT04tTkxTLTEkDQogCQlkZWZhdWx0IDoNCiAJfQ0KIAlyZXR1cm4gbnVsbDsNCkBAIC0yMTksMjUgKzIxOSwyNSBAQAogcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdHlwZVNpZ25hdHVyZShpbnQgdHlwZUNvZGUpIHsNCiAJc3dpdGNoICh0eXBlQ29kZSkgew0KIAkJY2FzZSBUQ19WT0lEIDoNCi0JCQlyZXR1cm4gIlYiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIlYiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0JPT0xFQU4gOg0KLQkJCXJldHVybiAiWiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiWiI7IC8vJE5PTi1OTFMtMSQNCiAJCWNhc2UgVENfQllURSA6DQotCQkJcmV0dXJuICJCIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJCIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUQ19DSEFSIDoNCi0JCQlyZXR1cm4gIkMiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkMiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX1NIT1JUIDoNCi0JCQlyZXR1cm4gIlMiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIlMiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0lOVCA6DQotCQkJcmV0dXJuICJJIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJJIjsgLy8kTk9OLU5MUy0xJA0KIAkJY2FzZSBUQ19MT05HIDoNCi0JCQlyZXR1cm4gIkoiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkoiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0ZMT0FUIDoNCi0JCQlyZXR1cm4gIkYiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkYiOyAvLyROT04tTkxTLTEkDQogCQljYXNlIFRDX0RPVUJMRSA6DQotCQkJcmV0dXJuICJEIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJEIjsgLy8kTk9OLU5MUy0xJA0KIAkJZGVmYXVsdCA6DQotCQkJcmV0dXJuICJ1bmtub3duIi8qbm9uTkxTKi87DQorCQkJcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvYmxlbURldGFpbEltcGwuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9ibGVtRGV0YWlsSW1wbC5qYXZhCmluZGV4IDgxMmM1MzIuLmEwZDcxYTAgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9ibGVtRGV0YWlsSW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9ibGVtRGV0YWlsSW1wbC5qYXZhCkBAIC0xOTcsNiArMTk3LDYgQEAKICAqIHB1cnBvc2VzIG9ubHkuIE5vbi1OTFMuDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJQcm9ibGVtRGV0YWlsKCIvKm5vbk5MUyovICsgZ2V0TWVzc2FnZSgpICsgIikiLypub25OTFMqLzsNCisJcmV0dXJuICJQcm9ibGVtRGV0YWlsKCIgKyBnZXRNZXNzYWdlKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2JsZW1GYWN0b3J5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvYmxlbUZhY3RvcnkuamF2YQppbmRleCA5ZDA2ZGRmLi4yNWNlODM3IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvYmxlbUZhY3RvcnkuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvYmxlbUZhY3RvcnkuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICovDQogcHJpdmF0ZSBQcm9ibGVtRmFjdG9yeShMb2NhbGUgbG9jYWxlKSB7DQogCWZMb2NhbGUgPSBsb2NhbGU7DQotCWZDb21waWxlclJlc291cmNlcyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0ubWVzc2FnZXMiLypub25OTFMqLywgbG9jYWxlKTsNCisJZkNvbXBpbGVyUmVzb3VyY2VzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5tZXNzYWdlcyIsIGxvY2FsZSk7IC8vJE5PTi1OTFMtMSQNCiAJaW5pdGlhbGl6ZU1lc3NhZ2VUZW1wbGF0ZXMoKTsNCiB9DQogLyoqDQpAQCAtNTMsNyArNTMsNyBAQAogCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsNCiAJU3RyaW5nIG1lc3NhZ2UgPSBmTWVzc2FnZVRlbXBsYXRlc1sgKGlkICYgUHJvYmxlbUlycml0YW50cy5JZ25vcmVDYXRlZ29yaWVzTWFzayldOw0KIAlpZiAobWVzc2FnZSA9PSBudWxsKSB7DQotCQlyZXR1cm4gIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbSBpZDogIi8qbm9uTkxTKi8rIGlkICsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJVbmFibGUgdG8gcmV0cmlldmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW0gaWQ6ICIrIGlkICsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAl9DQogCWludCBsZW5ndGggPSBtZXNzYWdlLmxlbmd0aCgpOw0KIAlpbnQgc3RhcnQgPSAtMSwgZW5kID0gbGVuZ3RoOw0KQEAgLTY2LDcgKzY2LDcgQEAKIAkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQogCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOw0KIAkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuICJDb3JydXB0ZWQgY29tcGlsZXIgcmVzb3VyY2VzIGZvciBwcm9ibGVtIGlkOiAiLypub25OTFMqLyArIChpZCAmIFByb2JsZW1JcnJpdGFudHMuSWdub3JlQ2F0ZWdvcmllc01hc2spICsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiIvKm5vbk5MUyovOw0KKwkJCQkJcmV0dXJuICJDb3JydXB0ZWQgY29tcGlsZXIgcmVzb3VyY2VzIGZvciBwcm9ibGVtIGlkOiAiICsgKGlkICYgUHJvYmxlbUlycml0YW50cy5JZ25vcmVDYXRlZ29yaWVzTWFzaykgKyAiLiBDaGVjayBjb21waWxlciByZXNvdXJjZXMuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCX0NCiAJCQl9IGVsc2Ugew0KIAkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2JsZW1UYWJsZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2JsZW1UYWJsZS5qYXZhCmluZGV4IDNiN2U0OWMuLjlkOTI3OTUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9ibGVtVGFibGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvYmxlbVRhYmxlLmphdmEKQEAgLTE3MCwxMiArMTcwLDEyIEBACiAJICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXINCiAJICovDQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiUHJvYmxlbVRhYmxlKFxuXHQiLypub25OTFMqLyk7DQotCQlidWYuYXBwZW5kKCJ0eXBlIHByb2JsZW1zOiAiLypub25OTFMqLyk7DQorCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiUHJvYmxlbVRhYmxlKFxuXHQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJYnVmLmFwcGVuZCgidHlwZSBwcm9ibGVtczogIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1Zi5hcHBlbmQoZlRhYmxlKTsNCi0JCWJ1Zi5hcHBlbmQoIlxuXHRpbWFnZSBwcm9ibGVtczogIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiXG5cdGltYWdlIHByb2JsZW1zOiAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJYnVmLmFwcGVuZChmSW1hZ2VQcm9ibGVtcyk7DQotCQlidWYuYXBwZW5kKCIpIi8qbm9uTkxTKi8pOw0KKwkJYnVmLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQogCX0NCiANCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvamVjdEJpbmFyeU91dHB1dC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2plY3RCaW5hcnlPdXRwdXQuamF2YQppbmRleCA3NDVkOWMwLi42OTczYjE2IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvamVjdEJpbmFyeU91dHB1dC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9qZWN0QmluYXJ5T3V0cHV0LmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgbWVtYmVyc1tpXTsNCiAJCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgew0KIAkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoNCi0JCQkJCWlmIChyZXNvdXJjZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIi8qbm9uTkxTKi8pKSB7DQorCQkJCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCQlyZXNvdXJjZS5kZWxldGUodHJ1ZSwgbnVsbCk7DQogCQkJCQl9DQogCQkJCQlicmVhazsNCkBAIC0xNDEsOCArMTQxLDcgQEAKIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQogCQlyZXR1cm4gbmV3IGJ5dGVbMF07DQogCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJcmV0dXJuIG5ldyBieXRlWzBdOw0KLQl9DQorCQlyZXR1cm4gbmV3IGJ5dGVbMF07CX0NCiB9DQogLyoqDQogICogUmV0dXJucyB0aGUgY29udGFpbmVyIGZvciBhIHBhdGguDQpAQCAtMTc2LDcgKzE3NSw3IEBACiAgKiBSZXR1cm5zIHRoZSBwYXRoIGluIHRoZSBvdXRwdXQgZm9sZGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS4NCiAgKi8NCiBwcml2YXRlIElQYXRoIGdldFBhdGhGb3JCaW5hcnkoSVR5cGUgdHlwZSkgew0KLQlyZXR1cm4gZ2V0T3V0cHV0UGF0aCgpLmFwcGVuZCh0eXBlLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiLypub25OTFMqLyk7DQorCXJldHVybiBnZXRPdXRwdXRQYXRoKCkuYXBwZW5kKHR5cGUuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBhdCB0aGUgZ2l2ZW4gcGF0aCwgY3JlYXRpbmcgaXQgYW5kIGFueSBwYXJlbnQgZm9sZGVycyBpZiBuZWNlc3NhcnkuDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2plY3RSZXNvdXJjZUNvcGllci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1Byb2plY3RSZXNvdXJjZUNvcGllci5qYXZhCmluZGV4IDYyOGEyMzYuLjkwMTk0ZTggMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Qcm9qZWN0UmVzb3VyY2VDb3BpZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvUHJvamVjdFJlc291cmNlQ29waWVyLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCQlpZiAodGhpcy5vdXRwdXRMb2NhdGlvbi5lcXVhbHModGhpcy5zb3VyY2VGb2xkZXJzW2ldLmdldEZ1bGxQYXRoKCkpKSBjb250aW51ZTsgLy8gZG8gbm90aGluZyBpZiBvdXRwdXQgaXMgc2FtZSBhcyBzb3VyY2UgZm9sZGVyDQogCQkJCWlmICghaGFzTm90aWZpZWQpew0KIAkJCQkJaGFzTm90aWZpZWQgPSB0cnVlOw0KLQkJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIG5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5jb3B5aW5nUmVzb3VyY2VzIi8qbm9uTkxTKi8pKTsNCisJCQkJCWlmIChub3RpZmllciAhPSBudWxsKSBub3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuY29weWluZ1Jlc291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQogCQkJCXRoaXMuc291cmNlRm9sZGVyc1tpXS5hY2NlcHQodGhpcyk7DQogCQkJfQ0KQEAgLTg3LDcgKzg3LDcgQEAKIAlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSl7DQogCQljYXNlIElSZXNvdXJjZS5GSUxFIDoNCiAJCQlpZiAoc291cmNlRm9sZGVyUGF0aCA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIHJlc291cmNlIGlzIG5vdCBpbnNpZGUgdGhlIGNsYXNzcGF0aAkJDQotCQkJaWYgKCEiamF2YSIvKm5vbk5MUyovLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsgLy8gaWdub3JlIHNvdXJjZSBmaWxlcw0KKwkJCWlmICghImphdmEiLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsgLy8gaWdub3JlIHNvdXJjZSBmaWxlcyAvLyROT04tTkxTLTEkDQogCQkJCQ0KIAkJCQlJRmlsZSBjdXJyZW50RmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7DQogCQkJCUlQYXRoIHBhdGhTdWZmaXggPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VGb2xkZXJQYXRoLnNlZ21lbnRDb3VudCgpKTsNCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkNCiAJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpew0KIAkJY2FzZSBJUmVzb3VyY2UuRklMRSA6DQotCQkJaWYgKCEiamF2YSIvKm5vbk5MUyovLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsgLy8gaWdub3JlIHNvdXJjZSBmaWxlcw0KKwkJCWlmICghImphdmEiLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsgLy8gaWdub3JlIHNvdXJjZSBmaWxlcyAvLyROT04tTkxTLTEkDQogCQkJCQ0KIAkJCQlJRmlsZSBjdXJyZW50RmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7DQogCQkJCXBhdGhTdWZmaXggPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VGb2xkZXJQYXRoLnNlZ21lbnRDb3VudCgpKTsNCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJCWlmICh0aGlzLm91dHB1dExvY2F0aW9uLmVxdWFscyh0aGlzLnNvdXJjZUZvbGRlcnNbaV0uZ2V0RnVsbFBhdGgoKSkpIGNvbnRpbnVlOyAvLyBkbyBub3RoaW5nIGlmIG91dHB1dCBpcyBzYW1lIGFzIHNvdXJjZSBmb2xkZXINCiAJCQlpZiAoIWhhc05vdGlmaWVkKXsNCiAJCQkJaGFzTm90aWZpZWQgPSB0cnVlOw0KLQkJCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnVwZGF0aW5nUmVzb3VyY2VzIi8qbm9uTkxTKi8pKTsNCisJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIG5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC51cGRhdGluZ1Jlc291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9SZXBvcnRDYXJkSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1JlcG9ydENhcmRJbXBsLmphdmEKaW5kZXggMTBiZWY3Mi4uNTU5MGJlZiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1JlcG9ydENhcmRJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1JlcG9ydENhcmRJbXBsLmphdmEKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlpZiAocGF0aC5pc1ByZWZpeE9mKHNFbnRyeVBhdGgpKSB7DQogCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHNFbnRyeVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOw0KIAkJCS8vIHRlc3QgbW9zdCBmcmVxdWVudCBjYXNlcyBmaXJzdA0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAoZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJqYXZhIi8qbm9uTkxTKi8pIHx8IGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpLmVxdWFscygiY2xhc3MiLypub25OTFMqLykpKSB7DQorCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoImphdmEiKSB8fCBleHRlbnNpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoImNsYXNzIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQlnZXRQcm9ibGVtc0ZvclNvdXJjZUVudHJ5KHNFbnRyeSwgdlJlc3VsdHMpOw0KIAkJCX0gZWxzZSB7DQogCQkJCWlmIChmU3RhdGUuaXNaaXBFbGVtZW50KHNFbnRyeVBhdGgpKSB7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1NvdXJjZUVsZW1lbnRUYWJsZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1NvdXJjZUVsZW1lbnRUYWJsZS5qYXZhCmluZGV4IDQ4MDY3YjEuLmVmZDZmMWQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Tb3VyY2VFbGVtZW50VGFibGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU291cmNlRWxlbWVudFRhYmxlLmphdmEKQEAgLTEyMyw2ICsxMjMsNiBAQAogCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyDQogCSAqLw0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuICJTb3VyY2VFbGVtZW50VGFibGUoIi8qbm9uTkxTKi8gKyBmUGFja2FnZVRhYmxlICsgIikiLypub25OTFMqLzsNCisJCXJldHVybiAiU291cmNlRWxlbWVudFRhYmxlKCIgKyBmUGFja2FnZVRhYmxlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU291cmNlRW50cnkuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Tb3VyY2VFbnRyeS5qYXZhCmluZGV4IGQ0MjQwOWYuLmE2MzcxOGQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Tb3VyY2VFbnRyeS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Tb3VyY2VFbnRyeS5qYXZhCkBAIC05NCw3ICs5NCw3IEBACiAJcmV0dXJuIHMucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7DQogfQ0KIAlwdWJsaWMgU3RyaW5nIGdldFppcEVudHJ5TmFtZSgpIHsNCi0JCXJldHVybiBmWmlwRW50cnlQYXRoID09IG51bGwgPyBmWmlwRW50cnlGaWxlTmFtZSA6IGZaaXBFbnRyeVBhdGggKyAiLyIvKm5vbk5MUyovICsgZlppcEVudHJ5RmlsZU5hbWU7DQorCQlyZXR1cm4gZlppcEVudHJ5UGF0aCA9PSBudWxsID8gZlppcEVudHJ5RmlsZU5hbWUgOiBmWmlwRW50cnlQYXRoICsgIi8iICsgZlppcEVudHJ5RmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KIAkJaW50IGNvZGUgPSBmUGF0aC5oYXNoQ29kZSgpOw0KQEAgLTExMiwxMCArMTEyLDEwIEBACiAJICovDQogCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCkgew0KIAkJaWYgKGZaaXBFbnRyeUZpbGVOYW1lICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gZlppcEVudHJ5RmlsZU5hbWUuZW5kc1dpdGgoIi5jbGFzcyIvKm5vbk5MUyovKTsNCisJCQlyZXR1cm4gZlppcEVudHJ5RmlsZU5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlTdHJpbmcgZXh0ZW5zaW9uID0gZlBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJcmV0dXJuIGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIvKm5vbk5MUyovKTsNCisJCXJldHVybiBleHRlbnNpb24gIT0gbnVsbCAmJiBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCS8qKg0KIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNvdXJjZSBlbnRyeSBjb21lcyBmcm9tIGEgY29tcGlsYXRpb24gdW5pdCwgb3RoZXJ3aXNlDQpAQCAtMTIzLDE2ICsxMjMsMTYgQEAKIAkgKi8NCiAJcHVibGljIGJvb2xlYW4gaXNTb3VyY2UoKSB7DQogCQlpZiAoZlppcEVudHJ5RmlsZU5hbWUgIT0gbnVsbCkgew0KLQkJCXJldHVybiBmWmlwRW50cnlGaWxlTmFtZS5lbmRzV2l0aCgiLmphdmEiLypub25OTFMqLyk7DQorCQkJcmV0dXJuIGZaaXBFbnRyeUZpbGVOYW1lLmVuZHNXaXRoKCIuamF2YSIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlTdHJpbmcgZXh0ZW5zaW9uID0gZlBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOw0KLQkJcmV0dXJuIGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIi8qbm9uTkxTKi8pOw0KKwkJcmV0dXJuIGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIC8qKg0KICAqIFJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGlzIG9iamVjdC4NCiAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcg0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiBmWmlwRW50cnlGaWxlTmFtZSA9PSBudWxsID8gZlBhdGgudG9TdHJpbmcoKSA6IGZQYXRoLnRvU3RyaW5nKCkgKyAiLCBlbnRyeTogIi8qbm9uTkxTKi8gKyB0aGlzLmdldFppcEVudHJ5TmFtZSgpOw0KKwlyZXR1cm4gZlppcEVudHJ5RmlsZU5hbWUgPT0gbnVsbCA/IGZQYXRoLnRvU3RyaW5nKCkgOiBmUGF0aC50b1N0cmluZygpICsgIiwgZW50cnk6ICIgKyB0aGlzLmdldFppcEVudHJ5TmFtZSgpOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU291cmNlRnJhZ21lbnRJbXBsLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU291cmNlRnJhZ21lbnRJbXBsLmphdmEKaW5kZXggNzZhMWJmNC4uZDFkYzM0ZiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1NvdXJjZUZyYWdtZW50SW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Tb3VyY2VGcmFnbWVudEltcGwuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqLw0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAkJcmV0dXJuIA0KLQkJCSJTb3VyY2VGcmFnbWVudEltcGwoIi8qbm9uTkxTKi8gKyBmUGF0aCANCi0JCQkJKyAoZlppcEVudHJ5TmFtZSA9PSBudWxsID8gIiIvKm5vbk5MUyovIDogIiA6ICIvKm5vbk5MUyovICsgZlppcEVudHJ5TmFtZSkgKyAiKSIvKm5vbk5MUyovOw0KKwkJCSJTb3VyY2VGcmFnbWVudEltcGwoIiArIGZQYXRoICAvLyROT04tTkxTLTEkDQorCQkJCSsgKGZaaXBFbnRyeU5hbWUgPT0gbnVsbCA/ICIiIDogIiA6ICIgKyBmWmlwRW50cnlOYW1lKSArICIpIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU3RhdGVJbXBsLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU3RhdGVJbXBsLmphdmEKaW5kZXggMGRjZTJjZC4uYjIyYzRkYyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlSW1wbC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9TdGF0ZUltcGwuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU3RhdGVTbmFwLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU3RhdGVTbmFwLmphdmEKaW5kZXggNTJmY2I5MS4uMDFiZjYzNiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlU25hcC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9TdGF0ZVNuYXAuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCWludCBtYWdpYyA9IGluLnJlYWRJbnQoKTsNCiAJaW50IHZlcnNpb24gPSBpbi5yZWFkU2hvcnQoKTsNCiAJaWYgKG1hZ2ljICE9IE1BR0lDKSB7IC8vIG1hZ2ljID0gIlNUQVQiZQ0KLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgiYnVpbGQud3JvbmdGaWxlRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImJ1aWxkLndyb25nRmlsZUZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCS8qIGRpc3BhdGNoIHRvIGFwcHJvcHJpYXRlIHJlYWRlciAqLw0KQEAgLTg1LDcgKzg1LDcgQEAKIAkJY2FzZSBWRVJTSU9ONjoNCiAJCQlyZXR1cm4gbmV3IFN0YXRlU25hcFY2KCkucmVhZChkYywgcHJvamVjdCwgaW4pOw0KIAkJZGVmYXVsdDoNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJidWlsZC51bmhhbmRsZWRWZXJzaW9uRm9ybWF0Ii8qbm9uTkxTKi8pKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJidWlsZC51bmhhbmRsZWRWZXJzaW9uRm9ybWF0IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqIA0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9TdGF0ZVNuYXBDb25zdGFudFBvb2wuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9TdGF0ZVNuYXBDb25zdGFudFBvb2wuamF2YQppbmRleCA3NTg0YjZmLi44OTgzMTFjIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvU3RhdGVTbmFwQ29uc3RhbnRQb29sLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlU25hcENvbnN0YW50UG9vbC5qYXZhCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCQkJLy8gTk9QDQogCQkJYnJlYWs7DQogCQlkZWZhdWx0Og0KLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGtpbmQgb2YgaGFuZGxlIi8qbm9uTkxTKi8pOw0KKwkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGtpbmQgb2YgaGFuZGxlIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKiogDQogICogQWRkIGEgU291cmNlRW50cnkgdG8gdGhlIHBvb2wuDQogICovDQogcHVibGljIHZvaWQgYWRkKFNvdXJjZUVudHJ5IGVudHJ5KSB7DQotCUFzc2VydC5pc05vdE51bGwoZW50cnksICJOdWxsIFNvdXJjZUVudHJ5IGJlaW5nIGFkZGVkIHRvIFN0YXRlU25hcENvbnN0YW50UG9vbCIvKm5vbk5MUyovKTsNCisJQXNzZXJ0LmlzTm90TnVsbChlbnRyeSwgIk51bGwgU291cmNlRW50cnkgYmVpbmcgYWRkZWQgdG8gU3RhdGVTbmFwQ29uc3RhbnRQb29sIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKCFmU2V0LmluY2x1ZGVzKGVudHJ5KSkgew0KIAkJYWRkKGVudHJ5LmdldFBhdGgoKSk7DQogCQlTdHJpbmcgemlwRW50cnlQYXRoID0gZW50cnkuZlppcEVudHJ5UGF0aDsNCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogCXRyeSB7DQogCQlJSGFuZGxlIHJlc3VsdCA9IChJSGFuZGxlKWZTZXQuZ2V0KGluZGV4KTsNCiAJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Ii8qbm9uTkxTKi8pOw0KKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCXJldHVybiByZXN1bHQ7DQogCX0NCiAJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0xOTIsMTIgKzE5MiwxMiBAQAogCXRyeSB7DQogCQlJUGFja2FnZSByZXN1bHQgPSAoSVBhY2thZ2UpZlNldC5nZXQoaW5kZXgpOw0KIAkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJcmV0dXJuIHJlc3VsdDsNCiAJfQ0KIAljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsNCi0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Ii8qbm9uTkxTKi8pOw0KKwkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTIwNywxMiArMjA3LDEyIEBACiAJdHJ5IHsNCiAJCUlQYXRoIHJlc3VsdCA9IChJUGF0aClmU2V0LmdldChpbmRleCk7DQogCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gcmVzdWx0Ow0KIAl9DQogCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgew0KLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtMjIyLDEyICsyMjIsMTIgQEAKIAl0cnkgew0KIAkJU291cmNlRW50cnkgcmVzdWx0ID0gKFNvdXJjZUVudHJ5KWZTZXQuZ2V0KGluZGV4KTsNCiAJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Ii8qbm9uTkxTKi8pOw0KKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCXJldHVybiByZXN1bHQ7DQogCX0NCiAJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0yMzcsMTIgKzIzNywxMiBAQAogCXRyeSB7DQogCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylmU2V0LmdldChpbmRleCk7DQogCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQlyZXR1cm4gcmVzdWx0Ow0KIAl9DQogCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgew0KLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCXJldHVybiByZXN1bHQ7DQogCX0NCiAJZWxzZSB7DQotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0yNzMsMTIgKzI3MywxMiBAQAogCXRyeSB7DQogCQlJVHlwZSByZXN1bHQgPSAoSVR5cGUpZlNldC5nZXQoaW5kZXgpOw0KIAkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJcmV0dXJuIHJlc3VsdDsNCiAJfQ0KIAljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsNCi0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Ii8qbm9uTkxTKi8pOw0KKwkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKiANCkBAIC0zMDYsMTAgKzMwNiwxMCBAQAogCQkJKytuTjsNCiAJCX0NCiAJCWVsc2Ugew0KLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmV4cGVjdGVkIHBvb2wgaXRlbSIvKm5vbk5MUyovKTsNCisJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5leHBlY3RlZCBwb29sIGl0ZW0iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQotCXJldHVybiAiblN0cj0iLypub25OTFMqLyArIG5TdHIgKyAiLCBuSUQ9Ii8qbm9uTkxTKi8gKyBuSUQgKyAiLCBuU0U9Ii8qbm9uTkxTKi8gKyBuU0UgKyAiLCBuSD0iLypub25OTFMqLyArIG5IICsgIixuTj0iLypub25OTFMqLyArIG5OOw0KKwlyZXR1cm4gIm5TdHI9IiArIG5TdHIgKyAiLCBuSUQ9IiArIG5JRCArICIsIG5TRT0iICsgblNFICsgIiwgbkg9IiArIG5IICsgIixuTj0iICsgbk47IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy00JA0KIAkNCiB9DQogLyoqIA0KQEAgLTMyMyw3ICszMjMsNyBAQAogCQlyZXR1cm4gZlNldC5pbmRleChvYmopOw0KIAl9DQogCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gc3RhdGUgc2VyaWFsaXphdGlvbi4gRXhwZWN0ZWQgb2JqZWN0IG1pc3NpbmcgZnJvbSBjb25zdGFudCBwb29sOiAiLypub25OTFMqLyArIG9iaik7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBzdGF0ZSBzZXJpYWxpemF0aW9uLiBFeHBlY3RlZCBvYmplY3QgbWlzc2luZyBmcm9tIGNvbnN0YW50IHBvb2w6ICIgKyBvYmopOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCQkJZlNldC5wdXQoaSwgcmVhZE51bWJlcihpbiwgdGFnKSk7DQogCQkJCWJyZWFrOw0KIAkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBraW5kIG9mIHBvb2wgaXRlbSIvKm5vbk5MUyovKTsNCisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGtpbmQgb2YgcG9vbCBpdGVtIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIH0NCkBAIC00MTUsNyArNDE1LDcgQEAKIAkJY2FzZSA1OiB7DQogCQkJLy8gcHJpbWl0aXZlIHR5cGUNCiAJCQkvLyBTaG91bGQgbm90IG9jY3VyIHNpbmNlIHByaW1pdGl2ZSB0eXBlcyBhcmUgd2VsbCBrbm93biBhbmQgbm90IHdyaXR0ZW4NCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQljYXNlIDY6IHsNCiAJCQkvLyBhcnJheSB0eXBlDQpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCQkvLyBtZXRob2QNCiAJCQlJVHlwZSBkZWNsYXJpbmdDbGFzcyA9IGdldFR5cGUoaW4ucmVhZEludCgpKTsNCiAJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNQcmltaXRpdmUoKSB8fCBkZWNsYXJpbmdDbGFzcy5pc0FycmF5KCkpIHsNCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQkJU3RyaW5nIG5hbWUgPSBnZXRTdHJpbmcoaW4ucmVhZEludCgpKTsNCiAJCQlpbnQgbnVtUGFyYW1zID0gaW4ucmVhZEJ5dGUoKSAmIDB4RkY7DQpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJCQkvLyBjb25zdHJ1Y3Rvcg0KIAkJCUlUeXBlIGRlY2xhcmluZ0NsYXNzID0gZ2V0VHlwZShpbi5yZWFkSW50KCkpOw0KIAkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc1ByaW1pdGl2ZSgpIHx8IGRlY2xhcmluZ0NsYXNzLmlzQXJyYXkoKSkgew0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQlpbnQgbnVtUGFyYW1zID0gaW4ucmVhZEJ5dGUoKSAmIDB4RkY7DQogCQkJSVR5cGVbXSBwYXJhbXMgPSBuZXcgSVR5cGVbbnVtUGFyYW1zXTsNCkBAIC00NjAsNyArNDYwLDcgQEAKIAkJCS8vIGZpZWxkIA0KIAkJCUlUeXBlIGRlY2xhcmluZ0NsYXNzID0gZ2V0VHlwZShpbi5yZWFkSW50KCkpOw0KIAkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc1ByaW1pdGl2ZSgpIHx8IGRlY2xhcmluZ0NsYXNzLmlzQXJyYXkoKSkgew0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIvKm5vbk5MUyovKTsNCisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQlTdHJpbmcgbmFtZSA9IGdldFN0cmluZyhpbi5yZWFkSW50KCkpOw0KIAkJCXJldHVybiBkZWNsYXJpbmdDbGFzcy5nZXRGaWVsZEhhbmRsZShuYW1lKTsNCkBAIC00NjksNyArNDY5LDcgQEAKIAkJCS8vIGltYWdlDQogCQkJcmV0dXJuIGRjLmdldEltYWdlKCk7DQogCQlkZWZhdWx0Og0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBraW5kIG9mIHBvb2wgaXRlbSIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQga2luZCBvZiBwb29sIGl0ZW0iKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQkJLy8gRG91YmxlDQogCQkJcmV0dXJuIG5ldyBEb3VibGUoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoaW4ucmVhZExvbmcoKSkpOw0KIAkJZGVmYXVsdDoNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBvZiBudW1iZXIiLypub25OTFMqLyk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgb2YgbnVtYmVyIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKiogDQpAQCAtNTM5LDcgKzUzOSw3IEBACiAJCQl3cml0ZU51bWJlcigoTnVtYmVyKW9iaiwgb3V0KTsgIC8vIHRhZ3MgMTIgdGhyb3VnaCAxNQ0KIAkJfQ0KIAkJZWxzZSB7DQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQga2luZCBvZiBwb29sIGl0ZW0iLypub25OTFMqLyk7DQorCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQga2luZCBvZiBwb29sIGl0ZW0iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogfQ0KQEAgLTU1OSw3ICs1NTksNyBAQAogCQkJaWYgKHQuaXNQcmltaXRpdmUoKSkgew0KIAkJCQkvLyB0YWc9NQ0KIAkJCQkvLyBQcmltaXRpdmUgdHlwZXMgc2hvdWxkIG5vdCBzaG93IHVwIHNpbmNlIHRoZXkgYXJlIHdlbGwga25vd24gYW5kIGFyZSBub3Qgd3JpdHRlbi4NCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciBpbiBmb3JtYXQiLypub25OTFMqLyk7DQorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQkJZWxzZSBpZiAodC5pc0FycmF5KCkpIHsNCiAJCQkJQXJyYXlUeXBlSGFuZGxlSW1wbCBhdCA9IChBcnJheVR5cGVIYW5kbGVJbXBsKXQ7DQpAQCAtNjExLDcgKzYxMSw3IEBACiAJCQlvdXQud3JpdGVCeXRlKDExKTsNCiAJCQlicmVhazsNCiAJCWRlZmF1bHQ6DQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24ga2luZCBvZiBoYW5kbGUiLypub25OTFMqLyk7DQorCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24ga2luZCBvZiBoYW5kbGUiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKiANCkBAIC02MzUsNyArNjM1LDcgQEAKIAkJb3V0LndyaXRlTG9uZyhEb3VibGUuZG91YmxlVG9Mb25nQml0cyhudW0uZG91YmxlVmFsdWUoKSkpOw0KIAl9DQogCWVsc2Ugew0KLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQgdHlwZSBvZiBudW1iZXIiLypub25OTFMqLyk7DQorCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5leHBlY3RlZCB0eXBlIG9mIG51bWJlciIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9TdGF0ZVNuYXBWNS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlU25hcFY1LmphdmEKaW5kZXggZTdmOWQ0Zi4uNzViYWYwZCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlU25hcFY1LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1N0YXRlU25hcFY1LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCQlwb29sLmFkZCgoKFppcE5vZGUpbm9kZSkuZ2V0WmlwRmlsZSgpKTsNCiAJCQkJYnJlYWs7DQogCQkJZGVmYXVsdDoNCi0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQga2luZCBvZiBub2RlIi8qbm9uTkxTKi8pOw0KKwkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5leHBlY3RlZCBraW5kIG9mIG5vZGUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJLy8gRG9uJ3QgbmVlZCB0byBwcm9jZXNzIG5vZGUgZGVwZW5kZW50cyBoZXJlLCBzaW5jZSB0aGV5J3JlIG5vZGVzIGFzIHdlbGwNCiAJCS8vIGFuZCB3aWxsIGhhdmUgdGhlaXIgaW5mbyBhZGRlZCB0byB0aGUgcG9vbCBhYm92ZS4NCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlwb29sLmFkZCh0c0VudHJ5LmdldFR5cGUoKSk7DQogfQ0KIHByb3RlY3RlZCB2b2lkIGJhZEZvcm1hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgaW4gZm9ybWF0Ii8qbm9uTkxTKi8pOw0KKwl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGluIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIENoZWNrIHRoYXQgdGhlIG5leHQgc2VjdGlvbiBoYXMgdGhlIGdpdmVuIG5hbWUuDQpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKiBSZWFkIHRoZSBidWlsZCBjb250ZXh0Lg0KICAqLw0KIHByb3RlY3RlZCBJSW1hZ2VDb250ZXh0IHJlYWRCdWlsZENvbnRleHQoSURldmVsb3BtZW50Q29udGV4dCBkYywgU3RhdGVTbmFwQ29uc3RhbnRQb29sIHBvb2wsIERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JY2hlY2tTZWN0aW9uKGluLCAiQnVpbGRDb250ZXh0Ii8qbm9uTkxTKi8pOw0KKwljaGVja1NlY3Rpb24oaW4sICJCdWlsZENvbnRleHQiKTsgLy8kTk9OLU5MUy0xJA0KIAlpbnQgbnVtUGtncyA9IGluLnJlYWRJbnQoKTsNCiAJaWYgKG51bVBrZ3MgPT0gLTEpIHsNCiAJCXJldHVybiBudWxsOw0KQEAgLTIxOCw3ICsyMTgsNyBAQAogICogVGhlIHN0YXRlIGlzIG5lZWRlZCB0byBjcmVhdGUgQ29tcGlsYXRpb25Vbml0IG9iamVjdHMgZnJvbSBTb3VyY2VFbnRyeSBvYmplY3RzLg0KICAqLw0KIHByb3RlY3RlZCBEZXBlbmRlbmN5R3JhcGggcmVhZERlcGVuZGVuY3lHcmFwaChTdGF0ZVNuYXBDb25zdGFudFBvb2wgcG9vbCwgRGF0YUlucHV0U3RyZWFtIGluLCBTdGF0ZUltcGwgc3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWNoZWNrU2VjdGlvbihpbiwgIkRlcGVuZGVuY3lHcmFwaCIvKm5vbk5MUyovKTsNCisJY2hlY2tTZWN0aW9uKGluLCAiRGVwZW5kZW5jeUdyYXBoIik7IC8vJE5PTi1OTFMtMSQNCiAJRGVwZW5kZW5jeUdyYXBoIGdyYXBoID0gbmV3IERlcGVuZGVuY3lHcmFwaCgpOw0KIAkNCiAJLy8gQXZvaWQgY3JlYXRpbmcgcGFja2FnZSBlbGVtZW50cyBmb3IgZWFjaCBub2RlIGFuZCBkZXBlbmRlbmN5Lg0KQEAgLTI2OCw3ICsyNjgsNyBAQAogICogUmVhZCB0aGUgcGFja2FnZSBtYXAuDQogICovDQogcHJvdGVjdGVkIFBhY2thZ2VNYXAgcmVhZFBhY2thZ2VNYXAoU3RhdGVTbmFwQ29uc3RhbnRQb29sIHBvb2wsIERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JY2hlY2tTZWN0aW9uKGluLCAiUGFja2FnZU1hcCIvKm5vbk5MUyovKTsNCisJY2hlY2tTZWN0aW9uKGluLCAiUGFja2FnZU1hcCIpOyAvLyROT04tTkxTLTEkDQogCVBhY2thZ2VNYXAgbWFwID0gbmV3IFBhY2thZ2VNYXAoKTsNCiAJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7DQpAQCAtMjg2LDcgKzI4Niw3IEBACiAgKiBSZWFkIHRoZSBwcmluY2lwYWwgc3RydWN0dXJlIHRhYmxlLg0KICAqLw0KIHByb3RlY3RlZCBIYXNodGFibGUgcmVhZFByaW5jaXBhbFN0cnVjdHVyZVRhYmxlKFN0YXRlU25hcENvbnN0YW50UG9vbCBwb29sLCBEYXRhSW5wdXRTdHJlYW0gaW4sIFN0YXRlSW1wbCBzdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JY2hlY2tTZWN0aW9uKGluLCAiUHJpbmNpcGFsU3RydWN0dXJlVGFibGUiLypub25OTFMqLyk7DQorCWNoZWNrU2VjdGlvbihpbiwgIlByaW5jaXBhbFN0cnVjdHVyZVRhYmxlIik7IC8vJE5PTi1OTFMtMSQNCiAJaW50IG51bUVudHJpZXMgPSBpbi5yZWFkSW50KCk7DQogCUhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUobnVtRW50cmllcyAqIDIgKyAxKTsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsNCkBAIC0zMTQsNyArMzE0LDcgQEAKICAqIFJlYWQgdGhlIHByb2JsZW0gcmVwb3J0ZXIuDQogICovDQogcHJvdGVjdGVkIElQcm9ibGVtUmVwb3J0ZXIgcmVhZFByb2JsZW1SZXBvcnRlcihJUHJvamVjdCBwcm9qZWN0LCBTdGF0ZVNuYXBDb25zdGFudFBvb2wgcG9vbCwgRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQljaGVja1NlY3Rpb24oaW4sICJQcm9ibGVtcyIvKm5vbk5MUyovKTsNCisJY2hlY2tTZWN0aW9uKGluLCAiUHJvYmxlbXMiKTsgLy8kTk9OLU5MUy0xJA0KIAlJUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsNCiAJYm9vbGVhbiBpc1Byb2JsZW1UYWJsZSA9IGluLnJlYWRCb29sZWFuKCk7DQogCWlmIChpc1Byb2JsZW1UYWJsZSkgew0KQEAgLTMzMCwxNCArMzMwLDE0IEBACiAJCXRyeSB7DQogCQkJY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7DQogCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNsYXNzICIvKm5vbk5MUyovICsgY2xhc3NOYW1lICsgIiB3YXMgbm90IGZvdW5kLiIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNsYXNzICIgKyBjbGFzc05hbWUgKyAiIHdhcyBub3QgZm91bmQuIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJdHJ5IHsNCiAJCQlyZXBvcnRlciA9IChJUHJvYmxlbVJlcG9ydGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOw0KIAkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5zdGFuY2lhdGUgIi8qbm9uTkxTKi8gKyBjbGF6ei5nZXROYW1lKCkpOw0KKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbmNpYXRlICIgKyBjbGF6ei5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkDQogCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBpbnN0YW5jaWF0ZSAiLypub25OTFMqLyArIGNsYXp6LmdldE5hbWUoKSk7DQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5zdGFuY2lhdGUgIiArIGNsYXp6LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCXJlcG9ydGVyLmluaXRpYWxpemUocHJvamVjdCwgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RGV2ZWxvcG1lbnRDb250ZXh0KHByb2plY3QpKTsNCiAJfQ0KQEAgLTM0Nyw3ICszNDcsNyBAQAogICogUmVhZCB0aGUgc291cmNlIGVsZW1lbnQgdGFibGUuDQogICovDQogcHJvdGVjdGVkIFNvdXJjZUVsZW1lbnRUYWJsZSByZWFkU291cmNlRWxlbWVudFRhYmxlKFN0YXRlU25hcENvbnN0YW50UG9vbCBwb29sLCBEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWNoZWNrU2VjdGlvbihpbiwgIlNvdXJjZUVsZW1lbnRUYWJsZSIvKm5vbk5MUyovKTsNCisJY2hlY2tTZWN0aW9uKGluLCAiU291cmNlRWxlbWVudFRhYmxlIik7IC8vJE5PTi1OTFMtMSQNCiAJU291cmNlRWxlbWVudFRhYmxlIHRhYmxlID0gbmV3IFNvdXJjZUVsZW1lbnRUYWJsZSgpOw0KIAlpbnQgbnVtUGFja2FnZXMgPSBpbi5yZWFkSW50KCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGFja2FnZXM7ICsraSkgew0KQEAgLTQ3Niw3ICs0NzYsNyBAQAogICogV3JpdGUgdGhlIGJ1aWxkIGNvbnRleHQuDQogICovDQogcHJvdGVjdGVkIHZvaWQgd3JpdGVCdWlsZENvbnRleHQoU3RhdGVJbXBsIHN0YXRlLCBTdGF0ZVNuYXBDb25zdGFudFBvb2wgcG9vbCwgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCW91dC53cml0ZVVURigiQnVpbGRDb250ZXh0Ii8qbm9uTkxTKi8pOw0KKwlvdXQud3JpdGVVVEYoIkJ1aWxkQ29udGV4dCIpOyAvLyROT04tTkxTLTEkDQogCUlJbWFnZUNvbnRleHQgY3R4ID0gc3RhdGUuZ2V0QnVpbGRDb250ZXh0KCk7DQogCWlmIChjdHggPT0gbnVsbCkgew0KIAkJb3V0LndyaXRlSW50KC0xKTsNCkBAIC00OTMsNyArNDkzLDcgQEAKICAqIFdyaXRlIHRoZSBkZXBlbmRlbmN5IGdyYXBoLg0KICAqLw0KIHByb3RlY3RlZCB2b2lkIHdyaXRlRGVwZW5kZW5jeUdyYXBoKFN0YXRlSW1wbCBzdGF0ZSwgU3RhdGVTbmFwQ29uc3RhbnRQb29sIHBvb2wsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlvdXQud3JpdGVVVEYoIkRlcGVuZGVuY3lHcmFwaCIvKm5vbk5MUyovKTsNCisJb3V0LndyaXRlVVRGKCJEZXBlbmRlbmN5R3JhcGgiKTsgLy8kTk9OLU5MUy0xJA0KIAlEZXBlbmRlbmN5R3JhcGggZ3JhcGggPSBzdGF0ZS5nZXRJbnRlcm5hbERlcGVuZGVuY3lHcmFwaCgpOw0KIAlncmFwaC5pbnRlZ3JpdHlDaGVjaygpOw0KIAkvKioNCkBAIC01MDgsNyArNTA4LDcgQEAKIAkJb3V0LndyaXRlQm9vbGVhbih0cnVlKTsNCiAJCVNvdXJjZUVudHJ5IHNFbnRyeSA9IHN0YXRlLmdldFNvdXJjZUVudHJ5KGpjdS5nZXRQYWNrYWdlRWxlbWVudCgpKTsNCiAJCWlmIChzRW50cnkgPT0gbnVsbCkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogU3RhdFNuYXA6IEF0dGVtcHQgdG8gc2VyaWFsaXplIGRlcGVuZGVuY3kgZ3JhcGggbm9kZSBmb3IgbWlzc2luZyBKQ1U6ICIvKm5vbk5MUyovICsgamN1LmdldFBhY2thZ2VFbGVtZW50KCkgKyAiLiBTa2lwcGluZy4uLiIvKm5vbk5MUyovKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFN0YXRTbmFwOiBBdHRlbXB0IHRvIHNlcmlhbGl6ZSBkZXBlbmRlbmN5IGdyYXBoIG5vZGUgZm9yIG1pc3NpbmcgSkNVOiAiICsgamN1LmdldFBhY2thZ2VFbGVtZW50KCkgKyAiLiBTa2lwcGluZy4uLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0gZWxzZSB7DQogCQkJQXNzZXJ0LmlzTm90TnVsbChzRW50cnkpOw0KIAkJCW91dC53cml0ZUludChwb29sLmluZGV4KHNFbnRyeSkpOw0KQEAgLTU3Miw3ICs1NzIsNyBAQAogICogV3JpdGUgdGhlIHBhY2thZ2UgbWFwLg0KICAqLw0KIHByb3RlY3RlZCB2b2lkIHdyaXRlUGFja2FnZU1hcChTdGF0ZUltcGwgc3RhdGUsIFN0YXRlU25hcENvbnN0YW50UG9vbCBwb29sLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0Jb3V0LndyaXRlVVRGKCJQYWNrYWdlTWFwIi8qbm9uTkxTKi8pOw0KKwlvdXQud3JpdGVVVEYoIlBhY2thZ2VNYXAiKTsgLy8kTk9OLU5MUy0xJA0KIAlQYWNrYWdlTWFwIG1hcCA9IHN0YXRlLmdldFBhY2thZ2VNYXAoKTsNCiAJb3V0LndyaXRlSW50KG1hcC5zaXplKCkpOw0KIAlpbnQgY291bnQgPSAwOw0KQEAgLTU5Miw3ICs1OTIsNyBAQAogICogV3JpdGUgdGhlIHByaW5jaXBhbCBzdHJ1Y3R1cmUgdGFibGUuDQogICovDQogcHJvdGVjdGVkIHZvaWQgd3JpdGVQcmluY2lwYWxTdHJ1Y3R1cmVUYWJsZShTdGF0ZUltcGwgc3RhdGUsIFN0YXRlU25hcENvbnN0YW50UG9vbCBwb29sLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0Jb3V0LndyaXRlVVRGKCJQcmluY2lwYWxTdHJ1Y3R1cmVUYWJsZSIvKm5vbk5MUyovKTsNCisJb3V0LndyaXRlVVRGKCJQcmluY2lwYWxTdHJ1Y3R1cmVUYWJsZSIpOyAvLyROT04tTkxTLTEkDQogCUhhc2h0YWJsZSB0YWJsZSA9IHN0YXRlLmdldFByaW5jaXBhbFN0cnVjdHVyZVRhYmxlKCk7DQogCWludCBudW0gPSB0YWJsZS5zaXplKCk7DQogCW91dC53cml0ZUludChudW0pOw0KQEAgLTYyMSw3ICs2MjEsNyBAQAogICogV3JpdGUgdGhlIHByb2JsZW0gcmVwb3J0ZXIuDQogICovDQogcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9ibGVtUmVwb3J0ZXIoU3RhdGVJbXBsIHN0YXRlLCBTdGF0ZVNuYXBDb25zdGFudFBvb2wgcG9vbCwgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCW91dC53cml0ZVVURigiUHJvYmxlbXMiLypub25OTFMqLyk7DQorCW91dC53cml0ZVVURigiUHJvYmxlbXMiKTsgLy8kTk9OLU5MUy0xJA0KIAlJUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyID0gc3RhdGUuZ2V0UHJvYmxlbVJlcG9ydGVyKCk7DQogCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIFByb2JsZW1UYWJsZSkgew0KIAkJb3V0LndyaXRlQm9vbGVhbih0cnVlKTsNCkBAIC02NDUsNyArNjQ1LDcgQEAKICAqIFdyaXRlIHRoZSBzb3VyY2UgZWxlbWVudCB0YWJsZS4NCiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNvdXJjZUVsZW1lbnRUYWJsZShTdGF0ZUltcGwgc3RhdGUsIFN0YXRlU25hcENvbnN0YW50UG9vbCBwb29sLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0Jb3V0LndyaXRlVVRGKCJTb3VyY2VFbGVtZW50VGFibGUiLypub25OTFMqLyk7DQorCW91dC53cml0ZVVURigiU291cmNlRWxlbWVudFRhYmxlIik7IC8vJE5PTi1OTFMtMSQNCiAJU291cmNlRWxlbWVudFRhYmxlIHRhYmxlID0gc3RhdGUuZ2V0U291cmNlRWxlbWVudFRhYmxlKCk7DQogCWludCBudW0gPSB0YWJsZS5udW1QYWNrYWdlcygpOw0KIAlvdXQud3JpdGVJbnQobnVtKTsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUNvbGxhYm9yYXRvckluZGljdG1lbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCmluZGV4IDYyMmIxZTUuLmI3OTllZTkgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlQ29sbGFib3JhdG9ySW5kaWN0bWVudC5qYXZhCkBAIC0yOCw2ICsyOCw2IEBACiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAkvLyBkb24ndCB1c2UgKyB3aXRoIGNoYXJbXQ0KLQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigiVHlwZUluZGljdG1lbnQoIi8qbm9uTkxTKi8pLmFwcGVuZChmTmFtZSkuYXBwZW5kKCIpIi8qbm9uTkxTKi8pLnRvU3RyaW5nKCk7DQorCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCJUeXBlSW5kaWN0bWVudCgiKS5hcHBlbmQoZk5hbWUpLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVIaWVyYXJjaHlJbmRpY3RtZW50LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUhpZXJhcmNoeUluZGljdG1lbnQuamF2YQppbmRleCBjZjBiZjc1Li45N2Q4YTY1IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUhpZXJhcmNoeUluZGljdG1lbnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUhpZXJhcmNoeUluZGljdG1lbnQuamF2YQpAQCAtMjgsNiArMjgsNiBAQAogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJLy8gZG9uJ3QgdXNlICsgd2l0aCBjaGFyW10NCi0JcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIlR5cGVIaWVyYXJjaHlJbmRpY3RtZW50KCIvKm5vbk5MUyovKS5hcHBlbmQoZk5hbWUpLmFwcGVuZCgiKSIvKm5vbk5MUyovKS50b1N0cmluZygpOw0KKwlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigiVHlwZUhpZXJhcmNoeUluZGljdG1lbnQoIikuYXBwZW5kKGZOYW1lKS5hcHBlbmQoIikiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlSW1wbC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVJbXBsLmphdmEKaW5kZXggYTdiOWMwZC4uZDM5OGU2ZSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVJbXBsLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVJbXBsLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAkJCQl0eXBlQSA9IChJVHlwZSlhOw0KIAkJCQl0eXBlQiA9IChJVHlwZSliOw0KIAkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJTaG91bGQgb25seSBiZSBjb21wYXJpbmcgSVR5cGVzIi8qbm9uTkxTKi8pOw0KKwkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiU2hvdWxkIG9ubHkgYmUgY29tcGFyaW5nIElUeXBlcyIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCXJldHVybiB0eXBlQS5nZXROYW1lKCkuY29tcGFyZVRvKHR5cGVCLmdldE5hbWUoKSk7DQogCQl9DQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgKiBhIFN0cmluZyBvZiBsZW5ndGggMC4NCiAgKi8NCiBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmVkTmFtZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uIHsNCi0JcmV0dXJuICIiLypub25OTFMqLzsNCisJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIElmIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBUeXBlIG9iamVjdCBpcw0KQEAgLTQ3Niw2ICs0NzYsNiBAQAogCSAqIG9ubHkgKE5PTi1OTFMpLg0KIAkgKi8NCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiAidHlwZSAiLypub25OTFMqLyArIGdldE5hbWUoKTsNCisJCXJldHVybiAidHlwZSAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVJbXBsU1dILmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUltcGxTV0guamF2YQppbmRleCAzNzNkODU0Li44ZjUwMjI3IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUltcGxTV0guamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZUltcGxTV0guamF2YQpAQCAtMTI2LDcgKzEyNiw3IEBACiAgKiBhIFN0cmluZyBvZiBsZW5ndGggMC4NCiAgKi8NCiBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmVkTmFtZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uIHsNCi0JcmV0dXJuICIiLypub25OTFMqLzsNCisJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIElmIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBUeXBlIG9iamVjdCBpcw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlTm9kZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVOb2RlLmphdmEKaW5kZXggYmQ5YTg0Yi4uZTk5MzE3ZCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVOb2RlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVOb2RlLmphdmEKQEAgLTYzLDYgKzYzLDYgQEAKIAkgKiBwdXJwb3NlcyBvbmx5Lg0KIAkgKi8NCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiAiVHlwZU5vZGUoIi8qbm9uTkxTKi8gKyBmVHlwZS5nZXRGaWxlTmFtZSgpICsgIikiLypub25OTFMqLzsNCisJCXJldHVybiAiVHlwZU5vZGUoIiArIGZUeXBlLmdldEZpbGVOYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlU3RydWN0dXJlRW50cnkuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9UeXBlU3RydWN0dXJlRW50cnkuamF2YQppbmRleCAzZTExYTRmLi5iZGI5NTY0IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVHlwZVN0cnVjdHVyZUVudHJ5LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1R5cGVTdHJ1Y3R1cmVFbnRyeS5qYXZhCkBAIC05MiwxMSArOTIsMTEgQEAKICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlR5cGVTdHJ1Y3R1cmVFbnRyeSgiLypub25OTFMqLyk7DQorCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJUeXBlU3RydWN0dXJlRW50cnkoIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGZUeXBlICE9IG51bGwpIHsNCiAJCWJ1Zi5hcHBlbmQoZlR5cGUuZ2V0TmFtZSgpKTsNCiAJfQ0KLQlidWYuYXBwZW5kKCIpIi8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1VubW9kaWZpZWRCdWlsZGVyVHlwZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1VubW9kaWZpZWRCdWlsZGVyVHlwZS5qYXZhCmluZGV4IDIxODEyZGUuLjgzZGQwZWYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Vbm1vZGlmaWVkQnVpbGRlclR5cGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvVW5tb2RpZmllZEJ1aWxkZXJUeXBlLmphdmEKQEAgLTUyLDYgKzUyLDYgQEAKICAqIEZvciBkZWJ1Z2dpbmcgb25seQ0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCXJldHVybiAiVW5tb2RpZmllZEJ1aWxkZXJUeXBlKCIvKm5vbk5MUyovICsgZk5ld1RTRW50cnkuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIpIi8qbm9uTkxTKi87DQorCXJldHVybiAiVW5tb2RpZmllZEJ1aWxkZXJUeXBlKCIgKyBmTmV3VFNFbnRyeS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Xb3JrUXVldWUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9Xb3JrUXVldWUuamF2YQppbmRleCA4ZjI2M2EwLi43MTg2Yzg5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvV29ya1F1ZXVlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1dvcmtRdWV1ZS5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAJfSBlbHNlIHsNCiAJCWlmIChlbnRyeS5zdGF0dXMgIT0gTkVFRFNfQ09NUElMRSkgew0KIAkJCWlmIChlbnRyeS5zdGF0dXMgPT0gQ09NUElMRUQpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBpbWFnZSBidWlsZGVyIHdhbnRzIHRvIHJlY29tcGlsZSBhbHJlYWR5IGNvbXBpbGVkIGVsZW1lbnQ6ICIvKm5vbk5MUyovICsgZWxlbWVudCk7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogaW1hZ2UgYnVpbGRlciB3YW50cyB0byByZWNvbXBpbGUgYWxyZWFkeSBjb21waWxlZCBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQkJZW50cnkuc3RhdHVzID0gTkVFRFNfQ09NUElMRTsNCiAJCQluZWVkc0NvbXBpbGVMaXN0LmFkZEVsZW1lbnQoZWxlbWVudCk7DQpAQCAtNzksNyArNzksNyBAQAogCQllbnRyaWVzLnB1dChlbGVtZW50LCBlbnRyeSk7CQkNCiAJfSBlbHNlIHsNCiAJCWlmIChlbnRyeS5zdGF0dXMgIT0gTkVFRFNfQ09NUElMRSkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogSmF2YSBidWlsZGVyIGNvbXBpbGVkIHRoZSBzYW1lIGVsZW1lbnQgdHdpY2U6ICIvKm5vbk5MUyovICsgZWxlbWVudCk7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBKYXZhIGJ1aWxkZXIgY29tcGlsZWQgdGhlIHNhbWUgZWxlbWVudCB0d2ljZTogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQogCQl9DQogCQluZWVkc0NvbXBpbGVMaXN0LnJlbW92ZUVsZW1lbnQoZWxlbWVudCk7DQogCX0NCkBAIC0xMTcsNiArMTE3LDYgQEAKIAlyZXR1cm4gZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5zdGF0dXMgPT0gTkVFRFNfQ09NUElMRTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJXb3JrUXVldWU6ICIvKm5vbk5MUyovICsgbmVlZHNDb21waWxlTGlzdDsNCisJcmV0dXJuICJXb3JrUXVldWU6ICIgKyBuZWVkc0NvbXBpbGVMaXN0OyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvWmlwTm9kZS5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9pbXBsL1ppcE5vZGUuamF2YQppbmRleCAyZjUxY2IzLi42MzUwODZkIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL2ltcGwvWmlwTm9kZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvaW1wbC9aaXBOb2RlLmphdmEKQEAgLTU3LDYgKzU3LDYgQEAKICAqIHB1cnBvc2VzIG9ubHkuDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJaaXBOb2RlKCIvKm5vbk5MUyovICsgZlppcEZpbGUgKyAiKSIvKm5vbk5MUyovOw0KKwlyZXR1cm4gIlppcE5vZGUoIiArIGZaaXBGaWxlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvRXZhbHVhdGlvbkNvbnRleHRXcmFwcGVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0V2YWx1YXRpb25Db250ZXh0V3JhcHBlci5qYXZhCmluZGV4IDJlNzk5NWYuLmUzY2MwMDMgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvRXZhbHVhdGlvbkNvbnRleHRXcmFwcGVyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtNywxNiArNywxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KIA0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklDb21wbGV0aW9uUmVxdWVzdG9yOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuaW1wbC5KYXZhQnVpbGRlcjsNCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5pbXBsLlByb2JsZW1GYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGU7DQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLio7DQogDQogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQpAQCAtNTIsNyArNTMsNyBAQAogICovDQogcHJvdGVjdGVkIHZvaWQgY2hlY2tCdWlsZGVyU3RhdGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJaWYgKCFnZXRQcm9qZWN0KCkuaGFzQnVpbGRTdGF0ZSgpKSB7DQotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FVkFMVUFUSU9OX0VSUk9SLCBVdGlsLmJpbmQoImV2YWwubmVlZEJ1aWx0U3RhdGUiLypub25OTFMqLykpKTsNCisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVWQUxVQVRJT05fRVJST1IsIFV0aWwuYmluZCgiZXZhbC5uZWVkQnVpbHRTdGF0ZSIpKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC02NCw3ICs2NSw3IEBACiAJCXBvc2l0aW9uLA0KIAkJdGhpcy5wcm9qZWN0LmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKSwNCiAJCW5ldyBDb21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlcihyZXF1ZXN0b3IpLA0KLQkJSmF2YU1vZGVsTWFuYWdlci5jb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpDQorCQlKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKQ0KIAkpOw0KIH0NCiAvKioNCkBAIC03OCw3ICs3OSw3IEBACiAJCW9mZnNldCArIGxlbmd0aCAtIDEsDQogCQl0aGlzLnByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpLA0KIAkJcmVxdWVzdG9yLA0KLQkJSmF2YU1vZGVsTWFuYWdlci5jb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpDQorCQlKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKQ0KIAkpOw0KIAlyZXR1cm4gcmVxdWVzdG9yLmdldEVsZW1lbnRzKCk7DQogfQ0KQEAgLTkwLDcgKzkxLDcgQEAKIAkJR2xvYmFsVmFyaWFibGVXcmFwcGVyIHdyYXBwZXIgPSAoR2xvYmFsVmFyaWFibGVXcmFwcGVyKXZhcmlhYmxlOw0KIAkJdGhpcy5jb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHdyYXBwZXIudmFyaWFibGUpOw0KIAl9IGVsc2Ugew0KLQkJdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGltcGxlbWVudGF0aW9uIG9mIElHbG9iYWxWYXJpYWJsZSIvKm5vbk5MUyovKTsNCisJCXRocm93IG5ldyBFcnJvcigiVW5rbm93biBpbXBsZW1lbnRhdGlvbiBvZiBJR2xvYmFsVmFyaWFibGUiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTEzNyw2ICsxMzgsMTUgQEAKIAkJCQl9DQogCQkJCXRoaXMuY29udGV4dC5zZXRJbXBvcnRzKGltcG9ydHNOYW1lcyk7DQogCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQkvLyB0cnkgdG8gcmV0cmlldmUgaW1wb3J0cyBmcm9tIHRoZSBzb3VyY2UNCisJCQlTb3VyY2VNYXBwZXIgc291cmNlTWFwcGVyID0gKChDbGFzc0ZpbGUpIGRlY2xhcmluZ1R5cGUuZ2V0Q2xhc3NGaWxlKCkpLmdldFNvdXJjZU1hcHBlcigpOw0KKwkJCWlmIChzb3VyY2VNYXBwZXIgIT0gbnVsbCkgew0KKwkJCQljaGFyW11bXSBpbXBvcnRzID0gc291cmNlTWFwcGVyLmdldEltcG9ydHMoKEJpbmFyeVR5cGUpIGRlY2xhcmluZ1R5cGUpOw0KKwkJCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7DQorCQkJCQl0aGlzLmNvbnRleHQuc2V0SW1wb3J0cyhpbXBvcnRzKTsNCisJCQkJfQ0KKwkJCX0NCiAJCX0NCiAJfQ0KIAl0cnkgew0KQEAgLTE5Myw3ICsyMDMsNyBAQAogICogUmV0dXJucyB0aGUgY29tcGlsZXIncyBjb25maWd1cmFibGUgb3B0aW9ucy4NCiAgKi8NCiBwcm90ZWN0ZWQgQ29uZmlndXJhYmxlT3B0aW9uW10gZ2V0Q29tcGlsZXJPcHRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmNvbnZlcnRDb25maWd1cmFibGVPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7DQorCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldE9wdGlvbnMoKTsNCiB9DQogLyoqDQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dCNnZXRJbXBvcnRzDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJpbmFyeVR5cGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEKaW5kZXggNDFlMjI3NC4uYzhhNmM2MiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJpbmFyeVR5cGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QmluYXJ5VHlwZS5qYXZhCkBAIC0xNjIsMzAgKzE2MiwzNyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAJaWYgKHRoaXMubW9kaWZpZXJzID09IElDb25zdGFudHMuQWNjUHVibGljKSB7DQotCQlidWZmZXIuYXBwZW5kKCJwdWJsaWMgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgicHVibGljICIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKHRoaXMuaXNDbGFzcygpKSB7DQotCQlidWZmZXIuYXBwZW5kKCJjbGFzcyAiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJYnVmZmVyLmFwcGVuZCgiaW50ZXJmYWNlICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgew0KIAkJYnVmZmVyLmFwcGVuZCh0aGlzLm5hbWUpOw0KIAl9DQogCWlmICh0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiXG4gIGV4dGVuZHMgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiXG4gIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWJ1ZmZlci5hcHBlbmQodGhpcy5zdXBlcmNsYXNzKTsNCiAJfQ0KIAlpbnQgbGVuZ3RoOw0KIAlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiAobGVuZ3RoID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoKSAhPSAwKSB7DQotCQlidWZmZXIuYXBwZW5kKCJcbiBpbXBsZW1lbnRzICIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIlxuIGltcGxlbWVudHMgIik7IC8vJE5PTi1OTFMtMSQNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAJCQlidWZmZXIuYXBwZW5kKHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldKTsNCiAJCQlpZiAoaSAhPSBsZW5ndGggLSAxKSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJfQ0KIAl9DQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQorDQorLyoqDQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlLg0KKyAqLw0KK3B1YmxpYyBjaGFyW10gc291cmNlRmlsZU5hbWUoKSB7DQorCXJldHVybiBudWxsOw0KK30NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0luZGV4QmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YQppbmRleCAxYjIwNGU1Li5iODczODc3IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCQkJcmV0dXJuIG5hbWU7DQogCQl9DQogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlF1ZXVlOlxuIi8qbm9uTkxTKi8pOw0KKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJRdWV1ZTpcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJZm9yIChpbnQgaSA9IHRoaXMuc3RhcnQ7IGkgPD0gdGhpcy5lbmQ7IGkrKyl7DQogCQkJCWJ1ZmZlci5hcHBlbmQobmFtZXNbaV0pLmFwcGVuZCgnXG4nKTsJCQ0KIAkJCX0NCkBAIC0xNzgsNiArMTc4LDEwIEBACiAJCXRoaXMubmFtZUxvb2t1cCA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpOw0KIAkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IA0KIAkJCW5ldyBIaWVyYXJjaHlSZXNvbHZlcih0aGlzLnNlYXJjaGFibGVFbnZpcm9ubWVudCwgdGhpcywgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsNCisJCWlmIChmb2N1c1R5cGUgIT0gbnVsbCkgew0KKwkJCWNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBmb2N1c1R5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKTsNCisJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnNldEZvY3VzVHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZE5hbWUpKTsNCisJCX0NCiAJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZShnZW5lcmljVHlwZXMsIGNvbXBpbGF0aW9uVW5pdHMpOw0KIAkJaWYgKGZvY3VzVHlwZSAhPSBudWxsICYmIGZvY3VzVHlwZS5nZXRKYXZhUHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgew0KIAkJCXRoaXMuc2VhcmNoYWJsZUVudmlyb25tZW50LnVuaXRUb0xvb2tJbnNpZGUgPSBudWxsOw0KQEAgLTMxOSw3ICszMjMsNyBAQAogICovDQogcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZm9Gcm9tQ2xhc3NGaWxlSW5KYXIoT3BlbmFibGUgY2xhc3NGaWxlLCBWZWN0b3IgaW5mb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KIAlJSmF2YUVsZW1lbnQgcGtnID0gY2xhc3NGaWxlLmdldFBhcmVudCgpOw0KLQlTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHBrZy5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi8iLypub25OTFMqLyArIGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOw0KKwlTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHBrZy5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi8iICsgY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCk7IC8vJE5PTi1OTFMtMSQNCiAJSUdlbmVyaWNUeXBlIGluZm8gPSBudWxsOw0KIAlqYXZhLnV0aWwuemlwLlppcEZpbGUgemlwRmlsZSA9IG51bGw7DQogCXRyeSB7DQpAQCAtNDQzLDcgKzQ0Nyw3IEBACiAJSUluZGV4U2VhcmNoUmVxdWVzdG9yIHNlYXJjaFJlcXVlc3RvciA9IG5ldyBJbmRleFNlYXJjaEFkYXB0ZXIoKXsNCiAJCXB1YmxpYyB2b2lkIGFjY2VwdFN1cGVyVHlwZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcXVhbGlmaWNhdGlvbiwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUsIGNoYXIgY2xhc3NPckludGVyZmFjZSwgY2hhcltdIHN1cGVyUXVhbGlmaWNhdGlvbiwgY2hhcltdIHN1cGVyVHlwZU5hbWUsIGNoYXIgc3VwZXJDbGFzc09ySW50ZXJmYWNlLCBpbnQgbW9kaWZpZXJzKSB7DQogCQkJcGF0aFJlcXVlc3Rvci5hY2NlcHRQYXRoKHJlc291cmNlUGF0aCk7DQotCQkJaWYgKHJlc291cmNlUGF0aC5lbmRzV2l0aCgiY2xhc3MiLypub25OTFMqLykpew0KKwkJCWlmIChyZXNvdXJjZVBhdGguZW5kc1dpdGgoImNsYXNzIikpeyAvLyROT04tTkxTLTEkDQogCQkJCUhpZXJhcmNoeUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChIaWVyYXJjaHlCaW5hcnlUeXBlKWJpbmFyaWVzRnJvbUluZGV4TWF0Y2hlcy5nZXQocmVzb3VyY2VQYXRoKTsNCiAJCQkJaWYgKGJpbmFyeVR5cGUgPT0gbnVsbCl7DQogCQkJCQliaW5hcnlUeXBlID0gbmV3IEhpZXJhcmNoeUJpbmFyeVR5cGUobW9kaWZpZXJzLCBxdWFsaWZpY2F0aW9uLCB0eXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWUsIGNsYXNzT3JJbnRlcmZhY2UpOw0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9UeXBlSGllcmFyY2h5LmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvVHlwZUhpZXJhcmNoeS5qYXZhCmluZGV4IGRlNjg0Y2EuLmFmYjY0ZjAgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9UeXBlSGllcmFyY2h5LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YQpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIAkJfQ0KIAkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7DQogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJbW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJoaWVyYXJjaHkuY3JlYXRpbmciLypub25OTFMqLyksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7DQorCQkJbW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJoaWVyYXJjaHkuY3JlYXRpbmciKSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJY29tcHV0ZSgpOw0KIAkJaWYgKGZUeXBlICE9IG51bGwpIHsNCkBAIC0xMDk3LDcgKzEwOTcsNyBAQAogCQlyZXR1cm4gZmFsc2U7DQogCX0NCiAJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsNCi0JCXN1cGVyY2xhc3NOYW1lID0gIk9iamVjdCIvKm5vbk5MUyovOw0KKwkJc3VwZXJjbGFzc05hbWUgPSAiT2JqZWN0IjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWludCBkb3QgPSAtMTsNCiAJU3RyaW5nIHNpbXBsZVN1cGVyID0gKGRvdCA9IHN1cGVyY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykpID4gLTEgPw0KQEAgLTExMzMsMjQgKzExMzMsMjQgQEAKICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCWJ1ZmZlci5hcHBlbmQoIkZvY3VzOiAiLypub25OTFMqLyk7DQotCWJ1ZmZlci5hcHBlbmQoZlR5cGUgPT0gbnVsbCA/ICI8Tk9ORT4iLypub25OTFMqLyA6IGZUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JYnVmZmVyLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIkZvY3VzOiAiKTsgLy8kTk9OLU5MUy0xJA0KKwlidWZmZXIuYXBwZW5kKGZUeXBlID09IG51bGwgPyAiPE5PTkU+IiA6IGZUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJA0KKwlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCWlmIChleGlzdHMoKSkgew0KIAkJaWYgKGZUeXBlICE9IG51bGwpIHsNCi0JCQlidWZmZXIuYXBwZW5kKCJTdXBlciB0eXBlczpcbiIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJTdXBlciB0eXBlczpcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJdG9TdHJpbmcoYnVmZmVyLCBmVHlwZSwgMSwgdHJ1ZSk7DQotCQkJYnVmZmVyLmFwcGVuZCgiU3ViIHR5cGVzOlxuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIlN1YiB0eXBlczpcbiIpOyAvLyROT04tTkxTLTEkDQogCQkJdG9TdHJpbmcoYnVmZmVyLCBmVHlwZSwgMSwgZmFsc2UpOw0KIAkJfSBlbHNlIHsNCi0JCQlidWZmZXIuYXBwZW5kKCJTdWIgdHlwZXMgb2Ygcm9vdCBjbGFzc2VzOlxuIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIlN1YiB0eXBlcyBvZiByb290IGNsYXNzZXM6XG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCUlUeXBlW10gcm9vdHM9IGdldFJvb3RDbGFzc2VzKCk7DQogCQkJZm9yIChpbnQgaT0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7DQogCQkJCXRvU3RyaW5nKGJ1ZmZlciwgcm9vdHNbaV0sIDEsIGZhbHNlKTsNCiAJCQl9DQogCQl9DQogCX0gZWxzZSB7DQotCQlidWZmZXIuYXBwZW5kKCIoSGllcmFyY2h5IGJlY2FtZSBzdGFsZSkiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIoSGllcmFyY2h5IGJlY2FtZSBzdGFsZSkiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQpAQCAtMTE2MSw3ICsxMTYxLDcgQEAKICAqLw0KIHByaXZhdGUgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBJVHlwZSB0eXBlLCBpbnQgaW5kZW50LCBib29sZWFuIGFzY2VuZGFudCkgew0KIAlmb3IgKGludCBpPSAwOyBpIDwgaW5kZW50OyBpKyspIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIiAgIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWJ1ZmZlci5hcHBlbmQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQogCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggYjc0NTRkOS4uNGI2YjQxZSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0yMiwxMSArMjIsMTEgQEAKIAlmRmlsZU5hbWUgPSBmaWxlbmFtZTsNCiANCiAJU3RyaW5nIGZpbGUgPSBuZXcgU3RyaW5nKGZpbGVuYW1lKTsNCi0JaW50IHN0YXJ0ID0gZmlsZS5sYXN0SW5kZXhPZigiLyIvKm5vbk5MUyovKSArIDE7DQotCWlmIChzdGFydCA9PSAwIHx8IHN0YXJ0IDwgZmlsZS5sYXN0SW5kZXhPZigiXFwiLypub25OTFMqLykpDQotCQlzdGFydCA9IGZpbGUubGFzdEluZGV4T2YoIlxcIi8qbm9uTkxTKi8pICsgMTsNCisJaW50IHN0YXJ0ID0gZmlsZS5sYXN0SW5kZXhPZigiLyIpICsgMTsgLy8kTk9OLU5MUy0xJA0KKwlpZiAoc3RhcnQgPT0gMCB8fCBzdGFydCA8IGZpbGUubGFzdEluZGV4T2YoIlxcIikpIC8vJE5PTi1OTFMtMSQNCisJCXN0YXJ0ID0gZmlsZS5sYXN0SW5kZXhPZigiXFwiKSArIDE7IC8vJE5PTi1OTFMtMSQNCiANCi0JaW50IGVuZCA9IGZpbGUubGFzdEluZGV4T2YoIi4iLypub25OTFMqLyk7DQorCWludCBlbmQgPSBmaWxlLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGVuZCA9PSAtMSkNCiAJCWVuZCA9IGZpbGUubGVuZ3RoKCk7DQogDQpAQCAtNDIsNiArNDIsNiBAQAogCXJldHVybiBmTWFpblR5cGVOYW1lOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIkNvbXBpbGF0aW9uVW5pdFsiLypub25OTFMqLyArIG5ldyBTdHJpbmcoZkZpbGVOYW1lKSArICJdIi8qbm9uTkxTKi87IA0KKwlyZXR1cm4gIkNvbXBpbGF0aW9uVW5pdFsiICsgbmV3IFN0cmluZyhmRmlsZU5hbWUpICsgIl0iOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Db21waWxhdGlvblVuaXQuamF2YQppbmRleCA0MjE1MTBlLi5lN2RhMDA1IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgQ09NUElMQVRJT05fVU5JVCBkb2N1bWVudCBmcmFnbWVudC4NCiAgKi8NCiBET01Db21waWxhdGlvblVuaXQoKSB7DQotCWZIZWFkZXI9IiIvKm5vbk5MUyovOw0KKwlmSGVhZGVyPSIiOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIENyZWF0ZXMgYSBuZXcgQ09NUElMQVRJT05fVU5JVCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50Lg0KQEAgLTQ3LDcgKzQ3LDcgQEAKICAqLw0KIERPTUNvbXBpbGF0aW9uVW5pdChjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlKSB7DQogCXN1cGVyKGRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbnVsbCwgbmV3IGludFtdey0xLCAtMX0pOw0KLQlmSGVhZGVyID0gIiIvKm5vbk5MUyovOw0KKwlmSGVhZGVyID0gIiI7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogQHNlZSBET01Ob2RlI2FwcGVuZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikNCkBAIC03NSw3ICs3NSw3IEBACiAJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7DQogCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50KXBhcmVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KGdldE5hbWUoKSk7DQogCX0gZWxzZSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50Ii8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJdG9wTGV2ZWxUeXBlPSBmaXJzdFR5cGU7DQogCX0NCiAJaWYgKHRvcExldmVsVHlwZSAhPSBudWxsKSB7DQotCQlyZXR1cm4gdG9wTGV2ZWxUeXBlLmdldE5hbWUoKSArICIuamF2YSIvKm5vbk5MUyovOyANCisJCXJldHVybiB0b3BMZXZlbFR5cGUuZ2V0TmFtZSgpICsgIi5qYXZhIjsgIC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCXJldHVybiBudWxsOw0KIAl9DQpAQCAtMTc0LDYgKzE3NCw2IEBACiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIkNPTVBJTEFUSU9OX1VOSVQ6ICIvKm5vbk5MUyovICsgZ2V0TmFtZSgpOw0KKwlyZXR1cm4gIkNPTVBJTEFUSU9OX1VOSVQ6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YQppbmRleCBlOWQyMmY1Li5kNmUxYjFhIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUZpZWxkLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01GaWVsZC5qYXZhCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJCURPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBET01CdWlsZGVyKCk7DQogCQkJSURPTUZpZWxkW10gZGV0YWlscz0gYnVpbGRlci5jcmVhdGVGaWVsZHMoc291cmNlLnRvQ2hhckFycmF5KCkpOw0KIAkJCWlmIChkZXRhaWxzLmxlbmd0aCA9PSAwKSB7DQotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uY2Fubm90RGV0YWlsIi8qbm9uTkxTKi8pKTsNCisJCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5jYW5ub3REZXRhaWwiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KIAkJCQlub2RlPSB0aGlzOw0KIAkJCQlmb3IgKGludCBpPSAwOyBpIDwgZGV0YWlscy5sZW5ndGg7IGkrKykgew0KQEAgLTMxNiw3ICszMTYsNyBAQAogCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgew0KIAkJcmV0dXJuICgoSVR5cGUpcGFyZW50KS5nZXRGaWVsZChnZXROYW1lKCkpOw0KIAl9IGVsc2Ugew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtNTYxLDcgKzU2MSw3IEBACiAgKi8NCiBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCXN1cGVyLnNldE5hbWUobmFtZSk7DQogCQlzZXRUeXBlQWx0ZXJlZCh0cnVlKTsNCkBAIC01NzIsNyArNTcyLDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCiAJaWYgKHR5cGVOYW1lID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50Lm51bGxUeXBlIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50Lm51bGxUeXBlIikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJYmVjb21lRGV0YWlsZWQoKTsNCiAJZXhwYW5kKCk7DQpAQCAtNjAzLDYgKzYwMyw2IEBACiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIkZJRUxEOiAiLypub25OTFMqLyArIGdldE5hbWUoKTsNCisJcmV0dXJuICJGSUVMRDogIiArIGdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW1wb3J0LmphdmEKaW5kZXggNWE5YmFmNi4uYTk2NmU3NCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUltcG9ydC5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IElNUE9SVCBub2RlLg0KICAqLw0KIERPTUltcG9ydCgpIHsNCi0JZk5hbWUgPSAiamF2YS5sYW5nLioiLypub25OTFMqLzsNCisJZk5hbWUgPSAiamF2YS5sYW5nLioiOyAvLyROT04tTkxTLTEkDQogCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7DQogfQ0KIC8qKg0KQEAgLTc4LDcgKzc4LDcgQEAKIHByb3RlY3RlZCB2b2lkIGFwcGVuZEZyYWdtZW50ZWRDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7DQogCWlmIChmTmFtZVJhbmdlWzBdIDwgMCkgew0KIAkJYnVmZmVyDQotCQkJLmFwcGVuZCgiaW1wb3J0ICIvKm5vbk5MUyovKQ0KKwkJCS5hcHBlbmQoImltcG9ydCAiKSAvLyROT04tTkxTLTEkDQogCQkJLmFwcGVuZChmTmFtZSkNCiAJCQkuYXBwZW5kKCc7JykNCiAJCQkuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KQEAgLTExMiw3ICsxMTIsNyBAQAogCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgew0KIAkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldEltcG9ydChnZXROYW1lKCkpOw0KIAl9IGVsc2Ugew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtMTM4LDE2ICsxMzgsMTYgQEAKICAqLw0KIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAliZWNvbWVEZXRhaWxlZCgpOw0KIAlzdXBlci5zZXROYW1lKG5hbWUpOw0KLQlmT25EZW1hbmQgPSBuYW1lLmVuZHNXaXRoKCIuKiIvKm5vbk5MUyovKTsNCisJZk9uRGVtYW5kID0gbmFtZS5lbmRzV2l0aCgiLioiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIklNUE9SVDogIi8qbm9uTkxTKi8gKyBnZXROYW1lKCk7DQorCXJldHVybiAiSU1QT1JUOiAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUluaXRpYWxpemVyLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUluaXRpYWxpemVyLmphdmEKaW5kZXggMGExZTZhMi4uODZhNzM1YSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Jbml0aWFsaXplci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCQkuYXBwZW5kKGdldEJvZHkoKSkNCiAJCQkuYXBwZW5kKGZEb2N1bWVudCwgZkJvZHlSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZCb2R5UmFuZ2VbMV0pOw0KIAl9IGVsc2Ugew0KLQkJYnVmZmVyLmFwcGVuZCgie30iLypub25OTFMqLykuYXBwZW5kKEphdmFNb2RlbE1hbmFnZXIuTElORV9TRVBBUkFUT1IpOw0KKwkJYnVmZmVyLmFwcGVuZCgie30iKS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJfQ0KIAkJcmV0dXJuICgoSVR5cGUpIHBhcmVudCkuZ2V0SW5pdGlhbGl6ZXIoY291bnQpOw0KIAl9IGVsc2Ugew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogLyoqDQpAQCAtMjE5LDYgKzIxOSw2IEBACiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIklOSVRJQUxJWkVSIi8qbm9uTkxTKi87DQorCXJldHVybiAiSU5JVElBTElaRVIiOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1lbWJlci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZW1iZXIuamF2YQppbmRleCA3NmUyNWVlLi4wOTU5NmFlIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1lbWJlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEKQEAgLTI4MSw3ICsyODEsNyBAQAogCS8qIHNlZSAxRlZJSkFIICovDQogCWlmIChjb21tZW50ICE9IG51bGwpIHsNCiAJCVN0cmluZyBjb21tZW50U3RyaW5nID0gbmV3IFN0cmluZyhjb21tZW50KTsNCi0JCWlmIChjb21tZW50U3RyaW5nLmluZGV4T2YoIkBkZXByZWNhdGVkIi8qbm9uTkxTKi8pID49IDApIHsNCisJCWlmIChjb21tZW50U3RyaW5nLmluZGV4T2YoIkBkZXByZWNhdGVkIikgPj0gMCkgeyAvLyROT04tTkxTLTEkDQogCQkJZkZsYWdzPSBmRmxhZ3MgfCBJQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQ7DQogCQkJcmV0dXJuOw0KIAkJfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWV0aG9kLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1ldGhvZC5qYXZhCmluZGV4IDkyMWVmNGMuLjU5YzIwZTQgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWV0aG9kLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZXRob2QuamF2YQpAQCAtMjI2LDcgKzIyNiw3IEBACiAgKi8NCiBwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm51bGxFeGNlcHRpb25UeXBlIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbEV4Y2VwdGlvblR5cGUiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoZkV4Y2VwdGlvbnMgPT0gbnVsbCkgew0KIAkJZkV4Y2VwdGlvbnM9IG5ldyBTdHJpbmdbMV07DQpAQCAtMjQxLDEwICsyNDEsMTAgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KIAlpZiAodHlwZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm51bGxUeXBlUGFyYW1ldGVyIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbFR5cGVQYXJhbWV0ZXIiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm51bGxOYW1lUGFyYW1ldGVyIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbE5hbWVQYXJhbWV0ZXIiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoZlBhcmFtZXRlck5hbWVzID09IG51bGwpIHsNCiAJCWZQYXJhbWV0ZXJOYW1lcz0gbmV3IFN0cmluZ1sxXTsNCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJaWYgKGZFeGNlcHRpb25SYW5nZVswXSA+PSAwKSB7DQogCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIHN0YXJ0LCBmRXhjZXB0aW9uUmFuZ2VbMF0gLSBzdGFydCk7DQogCQl9IGVsc2Ugew0KLQkJCWJ1ZmZlci5hcHBlbmQoIiB0aHJvd3MgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIiB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCS8vIGFkZCBleGNlcHRpb24gbGlzdA0KIAkJaWYgKGZFeGNlcHRpb25MaXN0ICE9IG51bGwpIHsNCkBAIC00MTQsNyArNDE0LDcgQEAKIAkJfQ0KIAkJcmV0dXJuICgoSVR5cGUpcGFyZW50KS5nZXRNZXRob2QobmFtZSwgc2lncyk7DQogCX0gZWxzZSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50Ii8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiAvKioNCkBAIC01NzMsNyArNTczLDcgQEAKIAlmQm9keT0gYm9keTsNCiAJc2V0SGFzQm9keShib2R5ICE9IG51bGwpOw0KIAlpZiAoIWhhc0JvZHkoKSkgew0KLQkJZkJvZHk9ICI7Ii8qbm9uTkxTKi8rSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUjsNCisJCWZCb2R5PSAiOyIrSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUjsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTYxNSw3ICs2MTUsNyBAQAogICovDQogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KIAkJc3VwZXIuc2V0TmFtZShuYW1lKTsNCiAJfQ0KQEAgLTYzMSwxNyArNjMxLDE3IEBACiAJCQlmUGFyYW1ldGVyTmFtZXM9IG51bGw7DQogCQkJZlBhcmFtZXRlckxpc3Q9IG5ldyBjaGFyW10geycoJywnKSd9Ow0KIAkJfSBlbHNlIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm1pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyIvKm5vbk5MUyovKSk7DQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5taXNtYXRjaEFyZ05hbWVzQW5kVHlwZXMiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfSBlbHNlIGlmIChuYW1lcy5sZW5ndGggIT0gdHlwZXMubGVuZ3RoKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm1pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm1pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2UgaWYgKG5hbWVzLmxlbmd0aCA9PSAwKSB7DQogCQlzZXRQYXJhbWV0ZXJzKG51bGwsIG51bGwpOw0KIAl9IGVsc2Ugew0KIAkJZlBhcmFtZXRlck5hbWVzPSBuYW1lczsNCiAJCWZQYXJhbWV0ZXJUeXBlcz0gdHlwZXM7DQogCQlDaGFyQXJyYXlCdWZmZXIgcGFyYW1ldGVyc0J1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsNCi0JCXBhcmFtZXRlcnNCdWZmZXIuYXBwZW5kKCIoIi8qbm9uTkxTKi8pOw0KKwkJcGFyYW1ldGVyc0J1ZmZlci5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJA0KIAkJY2hhcltdIGNvbW1hID0gbmV3IGNoYXJbXSB7JywnLCAnICd9Ow0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgew0KIAkJCWlmIChpID4gMCkgew0KQEAgLTY2Miw3ICs2NjIsNyBAQAogICovDQogcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7DQogCWlmIChuYW1lID09IG51bGwpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbFJldHVyblR5cGUiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5udWxsUmV0dXJuVHlwZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWJlY29tZURldGFpbGVkKCk7DQogCWZyYWdtZW50KCk7DQpAQCAtNzA1LDkgKzcwNSw5IEBACiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIAlpZiAoaXNDb25zdHJ1Y3RvcigpKSB7DQotCQlyZXR1cm4gIkNPTlNUUlVDVE9SIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIkNPTlNUUlVDVE9SIjsgLy8kTk9OLU5MUy0xJA0KIAl9IGVsc2Ugew0KLQkJcmV0dXJuICJNRVRIT0Q6ICIvKm5vbk5MUyovICsgZ2V0TmFtZSgpOw0KKwkJcmV0dXJuICJNRVRIT0Q6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Ob2RlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQppbmRleCA2NjBmMTNjLi5hYTZjYTc5IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQpAQCAtMzMxLDIzICszMzEsMjMgQEAKIHZvaWQgYmFzaWNBZGRDaGlsZChJRE9NTm9kZSBjaGlsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsNCiAJLy8gdmVyaWZ5IGNoaWxkIG1heSBiZSBhZGRlZA0KIAlpZiAoIWNhbkhhdmVDaGlsZHJlbigpKSB7DQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLnVuYWJsZUFkZENoaWxkIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20udW5hYmxlQWRkQ2hpbGQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoY2hpbGQgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGROdWxsQ2hpbGQiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGROdWxsQ2hpbGQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoIWlzQWxsb3dhYmxlQ2hpbGQoY2hpbGQpKSB7DQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZEluY29tcGF0aWJsZUNoaWxkIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkSW5jb21wYXRpYmxlQ2hpbGQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoY2hpbGQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRDaGlsZFdpdGhQYXJlbnQiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRDaGlsZFdpdGhQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAkvKiBOT1RFOiBUbyB0ZXN0IGlmIHRoZSBjaGlsZCBpcyBhbiBhbmNlc3RvciBvZiB0aGlzIG5vZGUsIHdlDQogCSAqIG5lZWQgb25seSB0ZXN0IGlmIHRoZSByb290IG9mIHRoaXMgbm9kZSBpcyB0aGUgY2hpbGQgKHRoZSBjaGlsZA0KIAkgKiBpcyBhbHJlYWR5IGEgcm9vdCBzaW5jZSB3ZSBoYXZlIGp1c3QgZ3VhcmVudGVlZCBpdCBoYXMgbm8gcGFyZW50KS4NCiAJICovDQogCWlmIChjaGlsZCA9PSBnZXRSb290KCkpIHsNCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkQW5jZXN0b3JBc0NoaWxkIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkQW5jZXN0b3JBc0NoaWxkIikpOyAvLyROT04tTkxTLTEkDQogCX0NCiANCiAJRE9NTm9kZSBub2RlPSAoRE9NTm9kZSljaGlsZDsNCkBAIC0zNzksNyArMzc5LDcgQEAKIAlpZiAoIWlzRGV0YWlsZWQoKSkgew0KIAkJRE9NTm9kZSBkZXRhaWxlZD0gZ2V0RGV0YWlsZWROb2RlKCk7DQogCQlpZiAoZGV0YWlsZWQgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uY2Fubm90RGV0YWlsIi8qbm9uTkxTKi8pKTsNCisJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmNhbm5vdERldGFpbCIpKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJaWYgKGRldGFpbGVkICE9IHRoaXMpIHsNCiAJCQlzaGFyZUNvbnRlbnRzKGRldGFpbGVkKTsNCkBAIC02NTIsMjMgKzY1MiwyMyBAQAogcHVibGljIHZvaWQgaW5zZXJ0U2libGluZyhJRE9NTm9kZSBzaWJsaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBET01FeGNlcHRpb24gew0KIAkvLyB2ZXJpZnkgc2libGluZyBtYXkgYmUgYWRkZWQNCiAJaWYgKHNpYmxpbmcgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGROdWxsU2libGluZyIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZE51bGxTaWJsaW5nIikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKGZQYXJlbnQgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRTaWJsaW5nQmVmb3JlUm9vdCIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZFNpYmxpbmdCZWZvcmVSb290IikpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKCFmUGFyZW50LmlzQWxsb3dhYmxlQ2hpbGQoc2libGluZykpIHsNCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkSW5jb21wYXRpYmxlU2libGluZyIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZEluY29tcGF0aWJsZVNpYmxpbmciKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlpZiAoc2libGluZy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7DQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZFNpYmxpbmdXaXRoUGFyZW50Ii8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkU2libGluZ1dpdGhQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAkvKiBOT1RFOiBUbyB0ZXN0IGlmIHRoZSBzaWJsaW5nIGlzIGFuIGFuY2VzdG9yIG9mIHRoaXMgbm9kZSwgd2UNCiAJICogbmVlZCBvbmx5IHRlc3QgaWYgdGhlIHJvb3Qgb2YgdGhpcyBub2RlIGlzIHRoZSBjaGlsZCAodGhlIHNpYmxpbmcNCiAJICogaXMgYWxyZWFkeSBhIHJvb3Qgc2luY2Ugd2UgaGF2ZSBqdXN0IGd1YXJhbnRlZWQgaXQgaGFzIG5vIHBhcmVudCkuDQogCSAqLw0KIAlpZiAoc2libGluZyA9PSBnZXRSb290KCkpIHsNCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkQW5jZXN0b3JBc1NpYmxpbmciLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRBbmNlc3RvckFzU2libGluZyIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogDQogCURPTU5vZGUgbm9kZT0gKERPTU5vZGUpc2libGluZzsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTVBhY2thZ2UuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCmluZGV4IGRlYzJkNTcuLmRlZTBhYWYgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCkBAIC03MCw5ICs3MCwxMCBAQAogcHJvdGVjdGVkIHZvaWQgYXBwZW5kRnJhZ21lbnRlZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsNCiAJaWYgKGZOYW1lUmFuZ2VbMF0gPCAwKSB7DQogCQlidWZmZXINCi0JCQkuYXBwZW5kKCJwYWNrYWdlICIvKm5vbk5MUyovKQ0KKwkJCS5hcHBlbmQoInBhY2thZ2UgIikgLy8kTk9OLU5MUy0xJA0KIAkJCS5hcHBlbmQoZk5hbWUpDQogCQkJLmFwcGVuZCgnOycpDQorCQkJLmFwcGVuZChKYXZhTW9kZWxNYW5hZ2VyLkxJTkVfU0VQQVJBVE9SKQ0KIAkJCS5hcHBlbmQoSmF2YU1vZGVsTWFuYWdlci5MSU5FX1NFUEFSQVRPUik7DQogCX0gZWxzZSB7DQogCQlidWZmZXINCkBAIC0xMDQsNyArMTA1LDcgQEAKIAlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsNCiAJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpcGFyZW50KS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oZ2V0TmFtZSgpKTsNCiAJfSBlbHNlIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTEzMCw2ICsxMzEsNiBAQAogICogQHNlZSBJRE9NTm9kZSN0b1N0cmluZygpDQogICovDQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JcmV0dXJuICJQQUNLQUdFOiAiLypub25OTFMqLyArIGdldE5hbWUoKTsNCisJcmV0dXJuICJQQUNLQUdFOiAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTVR5cGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCmluZGV4IGYxMTMyMjQuLjMyMDU2MGUgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCkBAIC0yMjYsNyArMjI2LDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGFkZFN1cGVySW50ZXJmYWNlKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCiAJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGROdWxsSW50ZXJmYWNlIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkTnVsbEludGVyZmFjZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmIChmU3VwZXJJbnRlcmZhY2VzID09IG51bGwpIHsNCiAJCWZTdXBlckludGVyZmFjZXM9IG5ldyBTdHJpbmdbMV07DQpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfU1VQRVJDTEFTUykpIHsNCiAJCQloYXNTdXBlcmNsYXNzID0gdHJ1ZTsNCiAJCQlpZiAoZkV4dGVuZHNSYW5nZVswXSA8IDApIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIi8qbm9uTkxTKi8pOw0KKwkJCQlidWZmZXIuYXBwZW5kKCIgZXh0ZW5kcyAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0gZWxzZSB7DQogCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXh0ZW5kc1JhbmdlWzBdLCBmRXh0ZW5kc1JhbmdlWzFdICsgMSAtIGZFeHRlbmRzUmFuZ2VbMF0pOw0KIAkJCX0NCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJaWYgKGdldE1hc2soTUFTS19UWVBFX0hBU19JTlRFUkZBQ0VTKSkgew0KIAkJCWhhc0ludGVyZmFjZXMgPSB0cnVlOw0KIAkJCWlmIChmSW1wbGVtZW50c1JhbmdlWzBdIDwgMCkgew0KLQkJCQlidWZmZXIuYXBwZW5kKCIgaW1wbGVtZW50cyAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIiBpbXBsZW1lbnRzICIpOyAvLyROT04tTkxTLTEkDQogCQkJfSBlbHNlIHsNCiAJCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZJbXBsZW1lbnRzUmFuZ2VbMF0sIGZJbXBsZW1lbnRzUmFuZ2VbMV0gKyAxIC0gZkltcGxlbWVudHNSYW5nZVswXSk7DQogCQkJfQ0KQEAgLTMwNyw3ICszMDcsNyBAQAogCX0gZWxzZSB7DQogCQlpZiAoZ2V0TWFzayhNQVNLX1RZUEVfSEFTX0lOVEVSRkFDRVMpKSB7DQogCQkJaWYgKGZFeHRlbmRzUmFuZ2VbMF0gPCAwKSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIvKm5vbk5MUyovKTsNCisJCQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9IGVsc2Ugew0KIAkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkV4dGVuZHNSYW5nZVswXSwgZkV4dGVuZHNSYW5nZVsxXSArIDEgLSBmRXh0ZW5kc1JhbmdlWzBdKTsNCiAJCQl9DQpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgew0KIAkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldFR5cGUoZ2V0TmFtZSgpKTsNCiAJfSBlbHNlIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiLypub25OTFMqLykpOw0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogfQ0KIC8qKg0KQEAgLTUyNyw5ICs1MjcsOSBAQAogCWZyYWdtZW50KCk7DQogCXNldE1hc2soTUFTS19UWVBFX0lTX0NMQVNTLCBiKTsNCiAJaWYgKGIpIHsNCi0JCWZUeXBlS2V5d29yZD0gImNsYXNzIi8qbm9uTkxTKi87DQorCQlmVHlwZUtleXdvcmQ9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCi0JCWZUeXBlS2V5d29yZD0gImludGVyZmFjZSIvKm5vbk5MUyovOw0KKwkJZlR5cGVLZXl3b3JkPSAiaW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJA0KIAkJc2V0U3VwZXJjbGFzcyhudWxsKTsNCiAJfQ0KIH0NCkBAIC01NTYsNyArNTU2LDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KIAlpZiAobmFtZSA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIvKm5vbk5MUyovKSk7DQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCXN1cGVyLnNldE5hbWUobmFtZSk7DQogCUVudW1lcmF0aW9uIGNoaWxkcmVuPSBnZXRDaGlsZHJlbigpOw0KQEAgLTU4OCw3ICs1ODgsNyBAQAogcHVibGljIHZvaWQgc2V0U3VwZXJJbnRlcmZhY2VzKFN0cmluZ1tdIG5hbWVzKSB7DQogCWJlY29tZURldGFpbGVkKCk7DQogCWlmIChuYW1lcyA9PSBudWxsKSB7DQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm51bGxJbnRlcmZhY2VzIi8qbm9uTkxTKi8pKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbEludGVyZmFjZXMiKSk7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlmcmFnbWVudCgpOw0KIAlmU3VwZXJJbnRlcmZhY2VzPSBuYW1lczsNCkBAIC02MDEsNyArNjAxLDcgQEAKIAkJQ2hhckFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsNCiAJCQlpZiAoaSA+IDApIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQl9DQogCQkJYnVmZmVyLmFwcGVuZChuYW1lc1tpXSk7DQogCQl9DQpAQCAtNjM2LDYgKzYzNiw2IEBACiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkNCiAgKi8NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQlyZXR1cm4gIlRZUEU6ICIvKm5vbk5MUyovICsgZ2V0TmFtZSgpOw0KKwlyZXR1cm4gIlRZUEU6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2ltcGxlRE9NQnVpbGRlci5qYXZhIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKaW5kZXggNDk4MzBlYi4uMjE0YzA1MyAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIAlTdHJpbmcgaW1wb3J0TmFtZSA9IG5ldyBTdHJpbmcobmFtZSk7DQogCS8qKiBuYW1lIGlzIHNldCB0byBjb250YWluIHRoZSAnKicgKi8NCiAJaWYgKG9uRGVtYW5kKSB7DQotCQlpbXBvcnROYW1lKz0iLioiLypub25OTFMqLzsNCisJCWltcG9ydE5hbWUrPSIuKiI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlmTm9kZT0gbmV3IERPTUltcG9ydChmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBpbXBvcnROYW1lLCBvbkRlbWFuZCk7DQogCWFkZENoaWxkKGZOb2RlKTsJDQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbG9va3VwL1JlZmVyZW5jZUluZm8uamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2xvb2t1cC9SZWZlcmVuY2VJbmZvLmphdmEKaW5kZXggNmE3MzI4Mi4uOGU1ZmQ0YiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbG9va3VwL1JlZmVyZW5jZUluZm8uamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9sb29rdXAvUmVmZXJlbmNlSW5mby5qYXZhCkBAIC01MywxMiArNTMsMTIgQEAKICAqIEZvciBkZWJ1Z2dpbmcgb25seQ0KICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZWZlcmVuY2VJbmZvKCIvKm5vbk5MUyovKTsNCisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlZmVyZW5jZUluZm8oIik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBmTmFtZXMubGVuZ3RoOyBpKyspIHsNCiAJCWJ1Zi5hcHBlbmQoZk5hbWVzW2ldKTsNCi0JCWJ1Zi5hcHBlbmQoIiAiLypub25OTFMqLyk7DQorCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KLQlidWYuYXBwZW5kKCIpIi8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggYTQ5ZDQ1Mi4uYTNjOTBlNCAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC03NSw3ICs3NSw3IEBACiBidWlsZC5hbmFseXppbmcgPSBBbmFseXppbmcgezB9DQogYnVpbGQucHJlcGFyaW5nQnVpbGQgPSBQcmVwYXJpbmcgZm9yIGJ1aWxkDQogYnVpbGQuY29tcGlsaW5nID0gQ29tcGlsaW5nIHswfQ0KLWJ1aWxkLnJlYWRpbmdEZWx0YSA9IFJlYWRpbmcgcmVzb3VyY2UgY2hhbmdlIGluZm9ybWF0aW9uIGZvciA6IHswfQ0KK2J1aWxkLnJlYWRpbmdEZWx0YSA9IFJlYWRpbmcgcmVzb3VyY2UgY2hhbmdlIGluZm9ybWF0aW9uIGZvcjogezB9DQogYnVpbGQuY29tcGxldGVkID0gSmF2YSBidWlsZCBjb21wbGV0ZWQNCiBidWlsZC5idWlsZGVyTmFtZSA9IEphdmEgQnVpbGRlcg0KIGJ1aWxkLmNvbXBpbGluZ0NvbnRlbnQgPSBDb21waWxpbmcgY29udGVudCBvZiB7MH0NCkBAIC0xNDksNiArMTQ5LDcgQEAKIGZpbGUubm90Rm91bmQgPSBGaWxlIG5vdCBmb3VuZC4NCiBmaWxlLmJhZEZvcm1hdCA9IEJhZCBmb3JtYXQuDQogdmFyaWFibGUuYmFkRm9ybWF0ID0gQmFkIGZvcm1hdCBmb3IgdmFyaWFibGVzLg0KK29wdGlvbi5iYWRGb3JtYXQgPSBCYWQgZm9ybWF0IGZvciBvcHRpb25zLg0KIHBhdGgubnVsbFBhdGggPSBQYXRoIGNhbm5vdCBiZSBudWxsLg0KIHBhdGgubXVzdEJlQWJzb2x1dGUgPSBQYXRoIG11c3QgYmUgYWJzb2x1dGUuDQogY2FjaGUuaW52YWxpZExvYWRGYWN0b3IgPSBJbmNvcnJlY3QgbG9hZCBmYWN0b3INCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fub255bW91c0ZpbGVTb3VyY2UuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5vbnltb3VzRmlsZVNvdXJjZS5qYXZhCmluZGV4IGU4NDZlMWEuLmVhZjg1MzIgMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5vbnltb3VzRmlsZVNvdXJjZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5vbnltb3VzRmlsZVNvdXJjZS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAJaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpIHsNCiAJCWRpcmVjdG9yeS5ta2RpcnMoKTsNCiAJfSBlbHNlIGlmICghZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsNCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRpcmVjdG9yeSBhcmd1bWVudHMgc2hvdWxkIGJlIGEgZGlyZWN0b3J5LiIvKm5vbk5MUyovKTsNCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRpcmVjdG9yeSBhcmd1bWVudHMgc2hvdWxkIGJlIGEgZGlyZWN0b3J5LiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJZkRpcmVjdG9yeSA9IGRpcmVjdG9yeTsJDQogfQ0KQEAgLTMwLDcgKzMwLDcgQEAKIHN5bmNocm9uaXplZCBwdWJsaWMgUmFuZG9tQWNjZXNzRmlsZSBhbGxvY2F0ZUFub255bW91c0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KIAkNCiAJRmlsZSBmaWxlID0gZ2V0QW5vbnltb3VzRmlsZSgpOw0KLQlyZXR1cm4gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Ii8qbm9uTkxTKi8pOw0KKwlyZXR1cm4gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogUmV0dXJucyBhIFVSTCBvbiBhIG5ld2x5IGFsbG9jYXRlZCBmaWxlIHdpdGggdGhlIGdpdmVuIGluaXRpYWwgY29udGVudC4NCkBAIC0zOCwxNyArMzgsMTcgQEAKICAqLw0KIHN5bmNocm9uaXplZCBwdWJsaWMgVVJMIGFsbG9jYXRlQW5vbnltb3VzVVJMKGJ5dGVbXSBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCiAJdHJ5IHsNCi0JCWJ5dGUgaGFzaGFycmF5W10gPSBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQSIvKm5vbk5MUyovKS5kaWdlc3QoYnl0ZXMpOw0KKwkJYnl0ZSBoYXNoYXJyYXlbXSA9IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIikuZGlnZXN0KGJ5dGVzKTsgLy8kTk9OLU5MUy0xJA0KIAkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNoYXJyYXkubGVuZ3RoOyBpKyspIHsNCiAJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLmZvckRpZ2l0KChpbnQpKChoYXNoYXJyYXlbaV0gPj4gNCkgJiAweDBGKSwgMTYpKTsNCiAJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLmZvckRpZ2l0KChpbnQpKGhhc2hhcnJheVtpXSAmIDB4MEYpLCAxNikpOw0KIAkJfQ0KLQkJc2IuYXBwZW5kKCIuam5rIi8qbm9uTkxTKi8pOw0KKwkJc2IuYXBwZW5kKCIuam5rIik7IC8vJE5PTi1OTFMtMSQNCiAJCVN0cmluZyBmaWxlTmFtZSA9IHNiLnRvU3RyaW5nKCk7DQogCQlGaWxlIGZpbGUgPSBmaWxlRm9yTmFtZShmaWxlTmFtZSk7DQogCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsNCi0JCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJydyIvKm5vbk5MUyovKTsNCisJCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJydyIpOyAvLyROT04tTkxTLTEkDQogCQkJcmFmLndyaXRlKGJ5dGVzKTsNCiAJCQlyYWYuY2xvc2UoKTsNCiAJCX0NCkBAIC02NCw3ICs2NCw3IEBACiBzdGF0aWMgcHVibGljIFVSTCBjb252ZXJ0RmlsZVRvVVJMKEZpbGUgZmlsZSkgew0KIAl0cnkgew0KIAkJU3RyaW5nIHBhdGggPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKS5yZXBsYWNlKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJcmV0dXJuIG5ldyBVUkwoImZpbGUiLypub25OTFMqLywgIiIvKm5vbk5MUyovLCAiLyIvKm5vbk5MUyovICsgcGF0aCk7DQorCQlyZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCAiLyIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCiAJfQ0KIAljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQogCQl0aHJvdyBuZXcgRXJyb3IoKTsNCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJc2IuYXBwZW5kKENoYXJhY3Rlci5mb3JEaWdpdCgoaW50KShsICUgMzYpLCAzNikpOw0KIAkJbCAvPSAzNjsNCiAJfQ0KLQlzYi5hcHBlbmQoIi5qbmsiLypub25OTFMqLyk7DQorCXNiLmFwcGVuZCgiLmpuayIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBzYi50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EaXNrQ2FjaGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGlza0NhY2hlLmphdmEKaW5kZXggNzIxMzk4NS4uYWQwMmI2ZiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EaXNrQ2FjaGUuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2tDYWNoZS5qYXZhCkBAIC0xNzEsOSArMTcxLDkgQEAKIA0KIAlFbnRyeUNhY2hlIGZFbnRyeUNhY2hlOw0KIA0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRTX0ZJTEVfTkFNRSA9ICJjb250ZW50cyIvKm5vbk5MUyovOw0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfQ09OVEVOVFNfRklMRV9OQU1FID0gInRlbXBjb250Ii8qbm9uTkxTKi87DQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVFNfVkVSU0lPTiA9ICJEaXNrQ2FjaGUuVjEuMCIvKm5vbk5MUyovOw0KKwlzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRTX0ZJTEVfTkFNRSA9ICJjb250ZW50cyI7IC8vJE5PTi1OTFMtMSQNCisJc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX0NPTlRFTlRTX0ZJTEVfTkFNRSA9ICJ0ZW1wY29udCI7IC8vJE5PTi1OTFMtMSQNCisJc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UU19WRVJTSU9OID0gIkRpc2tDYWNoZS5WMS4wIjsgLy8kTk9OLU5MUy0xJA0KIA0KIAkvKioNCiAJICogU2V0IHRvIHRydWUgd2hlbiBjYWNoZSBpcyBtb2RpZmllZCwgY2xlYXJlZCB3aGVuIHNhdmVkLg0KQEAgLTIxNyw3ICsyMTcsNyBAQAogCSAqLw0KIAlwdWJsaWMgT3V0cHV0U3RyZWFtIGFkZChmaW5hbCBTdHJpbmcga2V5LCBpbnQgc2l6ZSwgYnl0ZVtdIGV4dHJhSW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCiAJCWlmIChzaXplID4gZlNwYWNlTGltaXQqMTAyNCkgew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW50cnkgc2l6ZSBncmVhdGVyIHRoYW4gY2FjaGUgc2l6ZSIvKm5vbk5MUyovKTsNCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVudHJ5IHNpemUgZ3JlYXRlciB0aGFuIGNhY2hlIHNpemUiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJZmluYWwgRmlsZSBmaWxlOw0KIAkJT3V0cHV0U3RyZWFtIG91dHB1dDsNCkBAIC01MTgsNyArNTE4LDcgQEAKIAkJCWludCBzcGFjZVVzZWQgPSBpbi5yZWFkSW50KCk7ICAvKiBJZ25vcmVkIC0tIHVwZGF0ZWQgYXMgZW50cmllcyBhcmUgcmVhZCAqLw0KIAkJCWludCBudW1FbnRyaWVzID0gaW4ucmVhZEludCgpOw0KIAkJCWlmICghc2lnLmVxdWFscyhDT05URU5UU19WRVJTSU9OKSkgew0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIvKm5vbk5MUyovKSk7DQorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIA0KIAkJCS8qIFJlYWQgdG8gYSB0ZW1wLiBhcnJheSBvZiBlbnRyaWVzLiAgVGhlIGVudHJpZXMgYXJlIGluIG1vc3QtIHRvIA0KQEAgLTczNiw3ICs3MzYsNyBAQAogCQkJCX0NCiAJCQl9CQkJCQ0KIAkJfTsNCi0JCWZQZXJpb2RpY1NhdmVUaHJlYWQuc2V0TmFtZSgiRGlza0NhY2hlIHBlcmlvZGljIHNhdmUiLypub25OTFMqLyk7DQorCQlmUGVyaW9kaWNTYXZlVGhyZWFkLnNldE5hbWUoIkRpc2tDYWNoZSBwZXJpb2RpYyBzYXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJCWZQZXJpb2RpY1NhdmVUaHJlYWQuc3RhcnQoKTsNCiAJCQkJCQ0KIAl9DQpkaWZmIC0tZ2l0IGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRHVtcGVyLmphdmEKaW5kZXggMmY2MTYxMy4uYmMzMmNkMiAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YQorKysgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0R1bXBlci5qYXZhCkBAIC02MiwzMCArNjIsMzAgQEAKIAlpZiAoIW9uZUxpbmUpIHsNCiAJCSsrZlRhYkxldmVsOw0KIAl9DQotCWZXcml0ZXIucHJpbnQoIlsiLypub25OTFMqLyk7DQorCWZXcml0ZXIucHJpbnQoIlsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7DQogCQlpZiAoIW9uZUxpbmUpIHsNCiAJCQlpZiAoKGkgJSBtYXhQZXJMaW5lKSA9PSAwKSB7DQogCQkJCWZXcml0ZXIucHJpbnRsbigpOw0KIAkJCQl0YWJJZk5lZWRlZCgpOw0KIAkJCQlmV3JpdGVyLnByaW50KGkpOw0KLQkJCQlmV3JpdGVyLnByaW50KCI6ICIvKm5vbk5MUyovKTsNCisJCQkJZldyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0NCiAJCWZXcml0ZXIucHJpbnQodmFsW2ldKTsNCiAJCWlmIChpICsgMSA8IGxlbikgew0KLQkJCWZXcml0ZXIucHJpbnQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCWZXcml0ZXIucHJpbnQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlpZiAob25lTGluZSkgew0KLQkJZldyaXRlci5wcmludCgiXSIvKm5vbk5MUyovKTsNCisJCWZXcml0ZXIucHJpbnQoIl0iKTsgLy8kTk9OLU5MUy0xJA0KIAkJZldyaXRlci5wcmludGxuKCk7DQogCX0NCiAJZWxzZSB7DQogCQlmV3JpdGVyLnByaW50bG4oKTsNCiAJCS0tZlRhYkxldmVsOw0KIAkJdGFiSWZOZWVkZWQoKTsNCi0JCWZXcml0ZXIucHJpbnQoIl0iLypub25OTFMqLyk7DQorCQlmV3JpdGVyLnByaW50KCJdIik7IC8vJE5PTi1OTFMtMSQNCiAJCWZXcml0ZXIucHJpbnRsbigpOw0KIAl9DQogfQ0KQEAgLTk0LDcgKzk0LDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGR1bXAoT2JqZWN0W10gdmFsKSB7DQogCWludCBsZW4gPSB2YWwubGVuZ3RoOw0KLQlmV3JpdGVyLnByaW50KCJbIi8qbm9uTkxTKi8pOw0KKwlmV3JpdGVyLnByaW50KCJbIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKGxlbiA+IDApIHsNCiAJCWZXcml0ZXIucHJpbnRsbigpOw0KIAkJKytmVGFiTGV2ZWw7DQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCS0tZlRhYkxldmVsOw0KIAkJdGFiSWZOZWVkZWQoKTsNCiAJfQ0KLQlmV3JpdGVyLnByaW50bG4oIl0iLypub25OTFMqLyk7DQorCWZXcml0ZXIucHJpbnRsbigiXSIpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIER1bXBzIHRoZSBnaXZlbiBhcnJheS4NCkBAIC0xMTYsMjAgKzExNiwyMCBAQAogCWlmICghb25lTGluZSkgew0KIAkJKytmVGFiTGV2ZWw7DQogCX0NCi0JZldyaXRlci5wcmludCgiWyIvKm5vbk5MUyovKTsNCisJZldyaXRlci5wcmludCgiWyIpOyAvLyROT04tTkxTLTEkDQogCWJvb2xlYW4gbmV3TGluZSA9ICFvbmVMaW5lOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7DQogCQlpZiAobmV3TGluZSkgew0KIAkJCWZXcml0ZXIucHJpbnRsbigpOw0KIAkJCXRhYklmTmVlZGVkKCk7DQogCQl9DQotCQlmV3JpdGVyLnByaW50KCJcIiIvKm5vbk5MUyovICsgdmFsW2ldICsgIlwiIi8qbm9uTkxTKi8pOw0KKwkJZldyaXRlci5wcmludCgiXCIiICsgdmFsW2ldICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJaWYgKGkgKyAxIDwgbGVuKSB7DQotCQkJZldyaXRlci5wcmludCgiLCAiLypub25OTFMqLyk7DQorCQkJZldyaXRlci5wcmludCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAkJbmV3TGluZSA9IChpICE9IDAgJiYgKGkgJSBtYXhQZXJMaW5lKSA9PSAwKTsNCiAJfQ0KLQlmV3JpdGVyLnByaW50KCJdIi8qbm9uTkxTKi8pOw0KKwlmV3JpdGVyLnByaW50KCJdIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKG9uZUxpbmUgfHwgbmV3TGluZSkgew0KIAkJZldyaXRlci5wcmludGxuKCk7DQogCX0NCkBAIC0xNDQsMTggKzE0NCwxOCBAQAogCXRhYklmTmVlZGVkKCk7DQogCWlmICh2YWwgaW5zdGFuY2VvZiBJRHVtcGFibGUpIHsNCiAJCUlEdW1wYWJsZSBkdW1wYWJsZSA9IChJRHVtcGFibGUpIHZhbDsNCi0JCWZXcml0ZXIucHJpbnRsbihjbGFzc05hbWVGb3IodmFsKSArICIgeyIvKm5vbk5MUyovKTsNCisJCWZXcml0ZXIucHJpbnRsbihjbGFzc05hbWVGb3IodmFsKSArICIgeyIpOyAvLyROT04tTkxTLTEkDQogCQlpbnQgb3JpZ2luYWxMZXZlbCA9IGZUYWJMZXZlbDsNCiAJCSsrZlRhYkxldmVsOw0KIAkJdHJ5IHsNCiAJCQlkdW1wYWJsZS5kdW1wKHRoaXMpOw0KIAkJfQ0KIAkJY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotCQkJZldyaXRlci5wcmludGxuKCIqRVJSKiIvKm5vbk5MUyovKTsNCisJCQlmV3JpdGVyLnByaW50bG4oIipFUlIqIik7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJCWZUYWJMZXZlbCA9IG9yaWdpbmFsTGV2ZWw7DQogCQl0YWJJZk5lZWRlZCgpOw0KLQkJZldyaXRlci5wcmludGxuKCJ9Ii8qbm9uTkxTKi8pOw0KKwkJZldyaXRlci5wcmludGxuKCJ9Iik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAllbHNlIHsNCiAJCWZXcml0ZXIucHJpbnRsbih2YWwpOw0KQEAgLTIxMSw3ICsyMTEsNyBAQAogICovDQogcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbCkgew0KIAlwcmVmaXgobmFtZSk7DQotCWZXcml0ZXIucHJpbnRsbih2YWwgPT0gbnVsbCA/ICJudWxsIi8qbm9uTkxTKi8gOiAiXCIiLypub25OTFMqLyArIHZhbCArICJcIiIvKm5vbk5MUyovKTsNCisJZldyaXRlci5wcmludGxuKHZhbCA9PSBudWxsID8gIm51bGwiIDogIlwiIiArIHZhbCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJA0KIH0NCiAvKioNCiAgKiBEdW1wcyB0aGUgZ2l2ZW4gdmFsdWUsIHdpdGggdGhlIGdpdmVuIG5hbWUgYXMgYSBwcmVmaXguDQpAQCAtMjY0LDcgKzI2NCw3IEBACiB2b2lkIHByZWZpeChTdHJpbmcgbmFtZSkgew0KIAl0YWJJZk5lZWRlZCgpOw0KIAlmV3JpdGVyLnByaW50KG5hbWUpOw0KLQlmV3JpdGVyLnByaW50KCI6ICIvKm5vbk5MUyovKTsNCisJZldyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiAvKioNCiAgKiBQcmludCBhbiBvYmplY3QgZGlyZWN0bHksIHdpdGhvdXQgYSBuZXdsaW5lLg0KQEAgLTI4OSw3ICsyODksNyBAQAogICovDQogdm9pZCB0YWJJZk5lZWRlZCgpIHsNCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFiTGV2ZWw7ICsraSkgew0KLQkJZldyaXRlci5wcmludCgiICAiLypub25OTFMqLyk7DQorCQlmV3JpdGVyLnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkDQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YQppbmRleCBmYmFjMThhLi5iNmI3MmU0IDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MUlVDYWNoZS5qYXZhCkBAIC04MCw3ICs4MCw3IEBACiAJCSAqLw0KIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiANCi0JCQlyZXR1cm4gIkxSVUNhY2hlRW50cnkgWyIvKm5vbk5MUyovICsgX2ZLZXkgKyAiLS0+Ii8qbm9uTkxTKi8gKyBfZlZhbHVlICsgIl0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkxSVUNhY2hlRW50cnkgWyIgKyBfZktleSArICItLT4iICsgX2ZWYWx1ZSArICJdIjsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0NCiAJfQkNCiANCkBAIC00NDQsNyArNDQ0LDcgQEAKICAqLw0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQogCXJldHVybiANCi0JCSJMUlVDYWNoZSAiLypub25OTFMqLyArIChmQ3VycmVudFNwYWNlICogMTAwLjAgLyBmU3BhY2VMaW1pdCkgKyAiJSBmdWxsXG4iLypub25OTFMqLyArDQorCQkiTFJVQ2FjaGUgIiArIChmQ3VycmVudFNwYWNlICogMTAwLjAgLyBmU3BhY2VMaW1pdCkgKyAiJSBmdWxsXG4iICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQl0aGlzLnRvU3RyaW5nQ29udGVudHMoKTsNCiB9DQogLyoqDQpAQCAtNDcxLDkgKzQ3MSw5IEBACiAJCVN0cmluZyB0b1N0cmluZyA9IHNvcnRlci5zb3J0ZWRTdHJpbmdzW2ldOw0KIAkJT2JqZWN0IHZhbHVlID0gdGhpcy5nZXQoc29ydGVyLnNvcnRlZE9iamVjdHNbaV0pOw0KIAkJcmVzdWx0LmFwcGVuZCh0b1N0cmluZyk7CQkNCi0JCXJlc3VsdC5hcHBlbmQoIiAtPiAiLypub25OTFMqLyk7DQorCQlyZXN1bHQuYXBwZW5kKCIgLT4gIik7IC8vJE5PTi1OTFMtMSQNCiAJCXJlc3VsdC5hcHBlbmQodmFsdWUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KIH0NCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvb2t1cFRhYmxlLmphdmEgYi9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvb2t1cFRhYmxlLmphdmEKaW5kZXggNzQ4ODhlOS4uNzc3YmM5MSAxMDA2NDQKLS0tIGEvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb29rdXBUYWJsZS5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9va3VwVGFibGUuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAgICAJZW50cnkgPSBudWxsOw0KIAkgICAgCXJldHVybiBuZXh0Ow0KIAkJfQ0KLQkgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIkxvb2t1cFRhYmxlIEVudW1lcmF0b3IiLypub25OTFMqLyk7DQorCSAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiTG9va3VwVGFibGUgRW51bWVyYXRvciIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJfSAgICAgIAkNCiAJLyoqDQpAQCAtOTQsMTAgKzk0LDEwIEBACiAJICovDQogCXB1YmxpYyBMb29rdXBUYWJsZShpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7DQogCWlmIChpbml0aWFsQ2FwYWNpdHkgPCAwKQ0KLQkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBDYXBhY2l0eTogIi8qbm9uTkxTKi8rDQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIENhcGFjaXR5OiAiKyAvLyROT04tTkxTLTEkDQogCQkJCQkJCQkJCQkgICBpbml0aWFsQ2FwYWNpdHkpOw0KIAkJaWYgKGxvYWRGYWN0b3IgPD0gMCkNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQ6ICIvKm5vbk5MUyovK2xvYWRGYWN0b3IpOw0KKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTG9hZDogIitsb2FkRmFjdG9yKTsgLy8kTk9OLU5MUy0xJA0KIA0KIAkJaWYgKGluaXRpYWxDYXBhY2l0eT09MCkNCiAJCQlpbml0aWFsQ2FwYWNpdHkgPSAxOw0KQEAgLTQyOCwyNyArNDI4LDI3IEBACiAJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkgew0KIAkJCWlmIChrZXlzW2ldID09IG51bGwpIHsNCiAJCQkJaWYgKHZhbHVlc1tpXSAhPSBudWxsKSB7DQotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxvb2t1cFRhYmxlIHNhbml0eSBjaGVjayBpbiAiLypub25OTFMqLyArIHdoZXJlICsgIjoga2V5IGlzIG51bGwsIGJ1dCB2YWx1ZSBpc24ndCBhdCBpbmRleCAiLypub25OTFMqLyArIGkpOw0KKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb29rdXBUYWJsZSBzYW5pdHkgY2hlY2sgaW4gIiArIHdoZXJlICsgIjoga2V5IGlzIG51bGwsIGJ1dCB2YWx1ZSBpc24ndCBhdCBpbmRleCAiICsgaSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQkJdGhyb3cgbmV3IEVycm9yKCk7DQogCQkJCX0NCiAJCQl9DQogCQkJZWxzZSB7DQogCQkJCWlmICh2YWx1ZXNbaV0gPT0gbnVsbCkgew0KLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb29rdXBUYWJsZSBzYW5pdHkgY2hlY2sgaW4gIi8qbm9uTkxTKi8gKyB3aGVyZSArICI6IHZhbHVlIGlzIG51bGwsIGJ1dCBrZXkgaXNuJ3QgYXQgaW5kZXggIi8qbm9uTkxTKi8gKyBpKTsNCisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTG9va3VwVGFibGUgc2FuaXR5IGNoZWNrIGluICIgKyB3aGVyZSArICI6IHZhbHVlIGlzIG51bGwsIGJ1dCBrZXkgaXNuJ3QgYXQgaW5kZXggIiArIGkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQkJCXRocm93IG5ldyBFcnJvcigpOw0KIAkJCQl9DQogCQkJCWVsc2Ugew0KIAkJCQkJKytuOw0KIAkJCQkJT2JqZWN0IHZhbHVlID0gZ2V0KGtleXNbaV0pOw0KIAkJCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT0gdmFsdWVzW2ldKSB7DQotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb29rdXBUYWJsZSBzYW5pdHkgY2hlY2sgaW4gIi8qbm9uTkxTKi8gKyB3aGVyZSArICI6IGtleSBkb2Vzbid0IGhhc2ggdG8gcHJvcGVyIHZhbHVlOiAiLypub25OTFMqLyArIGtleXNbaV0pOw0KKwkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTG9va3VwVGFibGUgc2FuaXR5IGNoZWNrIGluICIgKyB3aGVyZSArICI6IGtleSBkb2Vzbid0IGhhc2ggdG8gcHJvcGVyIHZhbHVlOiAiICsga2V5c1tpXSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCXRocm93IG5ldyBFcnJvcigpOw0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KIAkJaWYgKG4gIT0gY291bnQpIHsNCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxvb2t1cFRhYmxlIHNhbml0eSBjaGVjayBpbiAiLypub25OTFMqLyArIHdoZXJlICsgIjogY291bnQgaXMgIi8qbm9uTkxTKi8gKyBjb3VudCArICIgYnV0IHRoZXJlIGFyZSAiLypub25OTFMqLyArIG4gKyAiIGVudHJpZXMiLypub25OTFMqLyk7DQorCQkJU3lzdGVtLmVyci5wcmludGxuKCJMb29rdXBUYWJsZSBzYW5pdHkgY2hlY2sgaW4gIiArIHdoZXJlICsgIjogY291bnQgaXMgIiArIGNvdW50ICsgIiBidXQgdGhlcmUgYXJlICIgKyBuICsgIiBlbnRyaWVzIik7IC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQl0aHJvdyBuZXcgRXJyb3IoKTsNCiAJCX0NCiAJfQ0KQEAgLTQ3Myw3ICs0NzMsNyBAQAogCSAqLw0KIAlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsNCiAJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JYnVmLmFwcGVuZCgieyIvKm5vbk5MUyovKTsNCisJYnVmLmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkDQogCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KIAlmb3IgKGludCBpID0gMCwgbWF4ID0ga2V5cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KIAkJaWYgKGtleXNbaV0gIT0gbnVsbCkgew0KQEAgLTQ4MSwxOCArNDgxLDE4IEBACiAJCQkJZmlyc3QgPSBmYWxzZTsNCiAJCQl9DQogCQkJZWxzZSB7DQotCQkJCWJ1Zi5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwkJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCQkJfQ0KIAkJCWlmIChidWYubGVuZ3RoKCkgPiAxMDAwKSB7DQotCQkJCWJ1Zi5hcHBlbmQoIi4uLiIvKm5vbk5MUyovKTsNCisJCQkJYnVmLmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJYnJlYWs7DQogCQkJfQ0KIAkJCWVsc2Ugew0KLQkJCSAgICBidWYuYXBwZW5kKGtleXNbaV0pLmFwcGVuZCgiPSIvKm5vbk5MUyovKS5hcHBlbmQodmFsdWVzW2ldKTsNCisJCQkgICAgYnVmLmFwcGVuZChrZXlzW2ldKS5hcHBlbmQoIj0iKS5hcHBlbmQodmFsdWVzW2ldKTsgLy8kTk9OLU5MUy0xJA0KIAkJICAgIH0NCiAJICAgIH0NCiAJfQ0KLQlidWYuYXBwZW5kKCJ9Ii8qbm9uTkxTKi8pOw0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nSGFzaHRhYmxlT2ZJbnQuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nSGFzaHRhYmxlT2ZJbnQuamF2YQppbmRleCA2ODQ2YjQ0Li4zNTZlNTUyIDEwMDY0NAotLS0gYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0cmluZ0hhc2h0YWJsZU9mSW50LmphdmEKKysrIGIvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdIYXNodGFibGVPZkludC5qYXZhCkBAIC0xMTcsOSArMTE3LDkgQEAKIAkJU3RyaW5nIGtleSA9IHRoaXMua2V5VGFibGVbaV07DQogCQlpZiAoa2V5ICE9IG51bGwpIHsNCiAJCQlidWZmZXIuYXBwZW5kKGtleSk7DQotCQkJYnVmZmVyLmFwcGVuZCgiIC0+ICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCIgLT4gIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlidWZmZXIuYXBwZW5kKHRoaXMudmFsdWVUYWJsZVtpXSk7DQotCQkJYnVmZmVyLmFwcGVuZCgiXG4iLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJfQ0KIAl9DQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCmRpZmYgLS1naXQgYS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0cmluZ01hdGNoZXIuamF2YSBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nTWF0Y2hlci5qYXZhCmluZGV4IDNkMTYxZDkuLjMzNDkyZDggMTAwNjQ0Ci0tLSBhL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyBiL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nTWF0Y2hlci5qYXZhCkBAIC0yMjksOSArMjI5LDkgQEAKIAkgKiBAcGFyYW0gcCwgYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggkSqSIGFuZC9vciCRP5INCiAJICovDQogCXByaXZhdGUgdm9pZCBwYXJzZVdpbGRDYXJkcygpIHsNCi0JCWlmKGZQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiLypub25OTFMqLykpDQorCQlpZihmUGF0dGVybi5zdGFydHNXaXRoKCIqIikpIC8vJE5PTi1OTFMtMSQNCiAJCQlmSGFzTGVhZGluZ1N0YXIgPSB0cnVlOw0KLQkJaWYoZlBhdHRlcm4uZW5kc1dpdGgoIioiLypub25OTFMqLykpIHsNCisJCWlmKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsgLy8kTk9OLU5MUy0xJA0KIAkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovDQogCQkJaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgew0KIAkJCQlmSGFzVHJhaWxpbmdTdGFyID0gdHJ1ZTsNCmRpZmYgLS1naXQgYS9wbHVnaW4uamFycyBiL3BsdWdpbi5qYXJzCmluZGV4IGM2YmEwOWIuLjk1YjI4ZDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbi5qYXJzCisrKyBiL3BsdWdpbi5qYXJzCkBAIC0xLDQgKzEsNSBAQAogamR0Y29yZS5qYXI9XA0KKwlFY2xpcHNlIEphdmEgQW50IENvbXBpbGVyLFwNCiAJRWNsaXBzZSBKYXZhIEJhdGNoIENvbXBpbGVyLFwNCiAJRWNsaXBzZSBKYXZhIENvZGUgQXNzaXN0LFwNCiAJRWNsaXBzZSBKYXZhIEZvcm1hdHRlcixcDQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wbHVnaW5VcGRhdGUueG1sIGIvc2NyaXB0cy9wbHVnaW5VcGRhdGUueG1sCmluZGV4IDEwYTUyNmMuLjJmMmRkOWUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGx1Z2luVXBkYXRlLnhtbAorKysgYi9zY3JpcHRzL3BsdWdpblVwZGF0ZS54bWwKQEAgLTMwLDYgKzMwLDcgQEAKIAkJDQogCQk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Y29yZXNyYy56aXAiIC8+DQogCQk8emlwIHppcGZpbGU9IiR7ZGVzdH0vamR0Y29yZXNyYy56aXAiPg0KKwkJICAgIDx6aXBmaWxlc2V0IGRpcj0iRWNsaXBzZSBKYXZhIEFudCBDb21waWxlciIgLz4NCiAJCSAgICA8emlwZmlsZXNldCBkaXI9IkVjbGlwc2UgSmF2YSBCYXRjaCBDb21waWxlciIgLz4NCiAJCSAgICA8emlwZmlsZXNldCBkaXI9IkVjbGlwc2UgSmF2YSBDb2RlIEFzc2lzdCIgLz4NCiAJCSAgICA8emlwZmlsZXNldCBkaXI9IkVjbGlwc2UgSmF2YSBDb21waWxlciIgLz4NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YQppbmRleCBlZjdlNzU4Li5iM2Q2MWRiIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkvKiBpbml0aWFsaXplIHByb2dyZXNzIG1vbml0b3IgKi8NCiAJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpOw0KIAkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7DQotCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVuZ2luZS5zZWFyY2hpbmciLypub25OTFMqLyksIDEwNSk7IC8vIDUgZm9yIGdldHRpbmcgcGF0aHMsIDEwMCBmb3IgbG9jYXRpbmcgbWF0Y2hlcw0KKwkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJlbmdpbmUuc2VhcmNoaW5nIiksIDEwNSk7IC8vIDUgZm9yIGdldHRpbmcgcGF0aHMsIDEwMCBmb3IgbG9jYXRpbmcgbWF0Y2hlcyAvLyROT04tTkxTLTEkDQogCQl9DQogDQogCQkvKiBpbmRleCBzZWFyY2ggKi8NCkBAIC00MTcsNyArNDE3LDcgQEAKICAqLwkNCiBwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZkFjY2Vzc2VkRmllbGRzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJTWF0Y2hMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTWF0Y2hMb2NhdG9yKA0KLQkJKFNlYXJjaFBhdHRlcm4pY3JlYXRlU2VhcmNoUGF0dGVybigiKiIvKm5vbk5MUyovLCBJSmF2YVNlYXJjaENvbnN0YW50cy5GSUVMRCwgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywgdHJ1ZSksDQorCQkoU2VhcmNoUGF0dGVybiljcmVhdGVTZWFyY2hQYXR0ZXJuKCIqIiwgSUphdmFTZWFyY2hDb25zdGFudHMuRklFTEQsIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsIHRydWUpLCAvLyROT04tTkxTLTEkDQogCQlJSW5mb0NvbnN0YW50cy5EZWNsYXJhdGlvbkluZm8sDQogCQlyZXN1bHRDb2xsZWN0b3IsDQogCQluZXcgSmF2YVdvcmtzcGFjZVNjb3BlKCkpOw0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICovCQ0KIHB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCiAJTWF0Y2hMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTWF0Y2hMb2NhdG9yKA0KLQkJKFNlYXJjaFBhdHRlcm4pY3JlYXRlU2VhcmNoUGF0dGVybigiKiIvKm5vbk5MUyovLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLCB0cnVlKSwNCisJCShTZWFyY2hQYXR0ZXJuKWNyZWF0ZVNlYXJjaFBhdHRlcm4oIioiLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLCB0cnVlKSwgLy8kTk9OLU5MUy0xJA0KIAkJSUluZm9Db25zdGFudHMuRGVjbGFyYXRpb25JbmZvLA0KIAkJcmVzdWx0Q29sbGVjdG9yLA0KIAkJbmV3IEphdmFXb3Jrc3BhY2VTY29wZSgpKTsNCkBAIC01MTQsNyArNTE0LDcgQEAKICAqLwkNCiBwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcyhJV29ya3NwYWNlIHdvcmtzcGFjZSwgSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQogCU1hdGNoTG9jYXRvciBsb2NhdG9yID0gbmV3IE1hdGNoTG9jYXRvcigNCi0JCShTZWFyY2hQYXR0ZXJuKWNyZWF0ZVNlYXJjaFBhdHRlcm4oIioiLypub25OTFMqLywgSUphdmFTZWFyY2hDb25zdGFudHMuTUVUSE9ELCBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLCB0cnVlKSwNCisJCShTZWFyY2hQYXR0ZXJuKWNyZWF0ZVNlYXJjaFBhdHRlcm4oIioiLCBJSmF2YVNlYXJjaENvbnN0YW50cy5NRVRIT0QsIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsIHRydWUpLCAvLyROT04tTkxTLTEkDQogCQlJSW5mb0NvbnN0YW50cy5EZWNsYXJhdGlvbkluZm8sDQogCQlyZXN1bHRDb2xsZWN0b3IsDQogCQluZXcgSmF2YVdvcmtzcGFjZVNjb3BlKCkpOw0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4SW5wdXQuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4SW5wdXQuamF2YQppbmRleCA2N2JmNjhkLi5jZTk5ODgyIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleElucHV0LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhJbnB1dC5qYXZhCkBAIC0xOTAsMTAgKzE5MCwxMCBAQAogDQogCXB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KIAkJaWYgKCFvcGVuZWQpIHsNCi0JCQlyYWY9IG5ldyBTYWZlUmFuZG9tQWNjZXNzRmlsZShpbmRleEZpbGUsICJyIi8qbm9uTkxTKi8pOw0KKwkJCXJhZj0gbmV3IFNhZmVSYW5kb21BY2Nlc3NGaWxlKGluZGV4RmlsZSwgInIiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCVN0cmluZyBzaWc9IHJhZi5yZWFkVVRGKCk7DQogCQkJaWYgKCFzaWcuZXF1YWxzKElJbmRleENvbnN0YW50cy5TSUdOQVRVUkUpKQ0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJleGNlcHRpb24ud3JvbmdGb3JtYXQiLypub25OTFMqLykpOw0KKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJleGNlcHRpb24ud3JvbmdGb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQlpbnQgc3VtbWFyeUJsb2NrTnVtPSByYWYucmVhZEludCgpOw0KIAkJCXJhZi5zZWVrKHN1bW1hcnlCbG9ja051bSAqIChsb25nKSBJSW5kZXhDb25zdGFudHMuQkxPQ0tfU0laRSk7DQogCQkJc3VtbWFyeT0gbmV3IEluZGV4U3VtbWFyeSgpOw0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4T3V0cHV0LmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleE91dHB1dC5qYXZhCmluZGV4IGE0ODY1N2QuLjhhYzIwNjAgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4T3V0cHV0LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhPdXRwdXQuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCQlmaXJzdEluQmxvY2s9IHRydWU7DQogCQkJZmlyc3RJbmRleEJsb2NrPSB0cnVlOw0KIAkJCWZpcnN0RmlsZUxpc3RCbG9jaz0gdHJ1ZTsNCi0JCQlpbmRleE91dD0gbmV3IFNhZmVSYW5kb21BY2Nlc3NGaWxlKHRoaXMuaW5kZXhGaWxlLCAicnciLypub25OTFMqLyk7DQorCQkJaW5kZXhPdXQ9IG5ldyBTYWZlUmFuZG9tQWNjZXNzRmlsZSh0aGlzLmluZGV4RmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQlvcGVuZWQ9IHRydWU7DQogCQl9DQogCX0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9FbnRyeVJlc3VsdC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRW50cnlSZXN1bHQuamF2YQppbmRleCA4ZWRlNmI3Li5kYzg5ODM3IDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9FbnRyeVJlc3VsdC5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0VudHJ5UmVzdWx0LmphdmEKQEAgLTQ2LDE1ICs0NiwxNSBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIod29yZC5sZW5ndGggKiAyKTsNCi0JYnVmZmVyLmFwcGVuZCgiRW50cnlSZXN1bHQ6IHdvcmQ9Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJFbnRyeVJlc3VsdDogd29yZD0iKTsgLy8kTk9OLU5MUy0xJA0KIAlidWZmZXIuYXBwZW5kKHdvcmQpOw0KLQlidWZmZXIuYXBwZW5kKCIsIHJlZnM9eyIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiLCByZWZzPXsiKTsgLy8kTk9OLU5MUy0xJA0KIAlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVSZWZzLmxlbmd0aDsgaSsrKXsNCiAJCWlmIChpID4gMCkgYnVmZmVyLmFwcGVuZCgnLCcpOw0KIAkJYnVmZmVyLmFwcGVuZCgnICcpOw0KIAkJYnVmZmVyLmFwcGVuZChmaWxlUmVmc1tpXSk7DQogCX0NCi0JYnVmZmVyLmFwcGVuZCgiIH0iLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIiB9Iik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZURvY3VtZW50LmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlRG9jdW1lbnQuamF2YQppbmRleCA3MDFlYzc4Li5iNmQwM2EwIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlRG9jdW1lbnQuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlRG9jdW1lbnQuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCiAJCWludCBsYXN0RG90PSBmaWxlLmdldFBhdGgoKS5sYXN0SW5kZXhPZignLicpOw0KIAkJaWYgKGxhc3REb3QgPT0gLTEpDQotCQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiBmaWxlLmdldFBhdGgoKS5zdWJzdHJpbmcobGFzdERvdCArIDEpOw0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCmluZGV4IGQxZTIyYjAuLjFhNjNkNDcgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSGFzaHRhYmxlT2ZPYmplY3QuamF2YQpAQCAtNzksMTEgKzc5LDExIEBACiAJCXJldHVybiBlbGVtZW50U2l6ZTsNCiAJfQ0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nIHM9ICIiLypub25OTFMqLzsNCisJCVN0cmluZyBzPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAkJT2JqZWN0IG9iamVjdDsNCiAJCWZvciAoaW50IGk9IDAsIGxlbmd0aD0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAJCQlpZiAoKG9iamVjdD0gdmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkNCi0JCQkJcyArPSBuZXcgU3RyaW5nKGtleVRhYmxlW2ldKSArICIgLT4gIi8qbm9uTkxTKi8gKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiIvKm5vbk5MUyovOw0KKwkJCQlzICs9IG5ldyBTdHJpbmcoa2V5VGFibGVbaV0pICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiBzOw0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lGaWxlRG9jdW1lbnQuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lGaWxlRG9jdW1lbnQuamF2YQppbmRleCAzM2IzM2Q0Li5jNmZiODE0IDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JRmlsZURvY3VtZW50LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUZpbGVEb2N1bWVudC5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KIAkJU3RyaW5nIGV4dGVuc2lvbj0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQogCQlpZiAoZXh0ZW5zaW9uID09IG51bGwpDQotCQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCiAJCXJldHVybiBleHRlbnNpb247DQogCX0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JSW5kZXhDb25zdGFudHMuamF2YQppbmRleCBhMWExY2UwLi5mZGQxMzZkIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JSW5kZXhDb25zdGFudHMuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JSW5kZXhDb25zdGFudHMuamF2YQpAQCAtMTIsNyArMTIsNyBAQAogCS8qKg0KIAkgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBpbmRleCBmaWxlLg0KIAkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFPSAiSU5ERVggRklMRSAwLjAwMSIvKm5vbk5MUyovOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkU9ICJJTkRFWCBGSUxFIDAuMDAxIjsgLy8kTk9OLU5MUy0xJA0KIAkvKioNCiAJICogVGhlIHNpZ25hdHVyZSBvZiB0aGUgaW5kZXggZmlsZS4NCiAJICovDQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXguamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4LmphdmEKaW5kZXggZjk4OWMxZi4uMzI0YWQ1YiAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXguamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleC5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAJICovDQogCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nOw0KIAlwdWJsaWMgSW5kZXgoRmlsZSBpbmRleERpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXRoaXMoaW5kZXhEaXJlY3RvcnksIi5pbmRleCIvKm5vbk5MUyovKTsNCisJCXRoaXMoaW5kZXhEaXJlY3RvcnksIi5pbmRleCIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJcHVibGljIEluZGV4KEZpbGUgaW5kZXhEaXJlY3RvcnksIFN0cmluZyBpbmRleE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQogCQlzdXBlcigpOw0KQEAgLTIxNSw3ICsyMTUsNyBAQAogCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWVyZ2UiKTsNCiANCiAJCS8vaW5pdGlhbGlzYXRpb24gb2YgdGVtcEluZGV4DQotCQlGaWxlIHRlbXBGaWxlPSBuZXcgRmlsZShpbmRleEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiVGVtcFZBIi8qbm9uTkxTKi8pOw0KKwkJRmlsZSB0ZW1wRmlsZT0gbmV3IEZpbGUoaW5kZXhGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlRlbXBWQSIpOyAvLyROT04tTkxTLTEkDQogDQogCQlib29sZWFuIGV4aXN0cz0gaW5kZXhGaWxlLmV4aXN0cygpOw0KIAkJSW5kZXhJbnB1dCBtYWluSW5kZXhJbnB1dD0gbmV3IEJsb2Nrc0luZGV4SW5wdXQoaW5kZXhGaWxlKTsNCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleFN1bW1hcnkuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCmluZGV4IGI1Y2YxODcuLmQ1MTU5MDcgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAJCWNoYXJbXSB3b3JkOw0KIAkJaW50IGJsb2NrTnVtOw0KIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KLQkJCXJldHVybiAiRmlyc3RXb3JkSW5CbG9jazogIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHdvcmQpICsgIiwgYmxvY2tOdW06ICIvKm5vbk5MUyovICsgYmxvY2tOdW07DQorCQkJcmV0dXJuICJGaXJzdFdvcmRJbkJsb2NrOiAiICsgbmV3IFN0cmluZyh3b3JkKSArICIsIGJsb2NrTnVtOiAiICsgYmxvY2tOdW07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJfQ0KIAl9DQogDQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZWRGaWxlLmphdmEKaW5kZXggZDExNWM3ZC4uNWViMTI3MCAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZS5qYXZhCkBAIC0yMCwxMCArMjAsMTAgQEAKIHB1YmxpYyBjbGFzcyBJbmRleGVkRmlsZSBpbXBsZW1lbnRzIElRdWVyeVJlc3VsdCB7DQogCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsNCiAJcHJvdGVjdGVkIGludCBmaWxlTnVtYmVyOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0JFR0lOPSAiKCIvKm5vbk5MUyovOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0VORD0gIikiLypub25OTFMqLzsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19TRVBBUkFUT1I9ICIsIi8qbm9uTkxTKi87DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fVkFMVUVfU0VQQVJBVE9SPSAiOiIvKm5vbk5MUyovOw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0JFR0lOPSAiKCI7IC8vJE5PTi1OTFMtMSQNCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19FTkQ9ICIpIjsgLy8kTk9OLU5MUy0xJA0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1NFUEFSQVRPUj0gIiwiOyAvLyROT04tTkxTLTEkDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fVkFMVUVfU0VQQVJBVE9SPSAiOiI7IC8vJE5PTi1OTFMtMSQNCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST1BFUlRJRVNfU0laRT0gMiAqIDEwMjQ7DQogCXByb3RlY3RlZCBIYXNodGFibGUgcHJvcGVydGllczsNCiAJcHJvdGVjdGVkIGludCBwcm9wZXJ0aWVzU2l6ZT0gMiAqIChJTkZPX0JFR0lOLmxlbmd0aCgpICsgSU5GT19FTkQubGVuZ3RoKCkpOw0KQEAgLTEzMSw3ICsxMzEsNyBAQAogCX0NCiAJcHVibGljIFN0cmluZyBwcm9wZXJ0aWVzVG9TdHJpbmcoKSB7DQogCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpDQotCQkJcmV0dXJuICIiLypub25OTFMqLzsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCiAJCVN0cmluZ0J1ZmZlciBwcm9wPSBuZXcgU3RyaW5nQnVmZmVyKElORk9fQkVHSU4pOw0KIAkJZm9yIChFbnVtZXJhdGlvbiBlPSBnZXRQcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7DQogCQkJU3RyaW5nIHByb3BlcnR5PSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7DQpAQCAtMTYwLDYgKzE2MCw2IEBACiAJCQlwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsNCiAJfQ0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuICJJbmRleGVkRmlsZSgiLypub25OTFMqLyArIGZpbGVOdW1iZXIgKyAiOiAiLypub25OTFMqLyArIHBhdGggKyAiKSIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJJbmRleGVkRmlsZSgiICsgZmlsZU51bWJlciArICI6ICIgKyBwYXRoICsgIikiOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJA0KIAl9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0phckZpbGVEb2N1bWVudC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKaW5kZXggYmFlNGQ4OC4uMzdiOGUxYyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQogCQlTdHJpbmcgZXh0ZW5zaW9uPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsNCiAJCWlmIChleHRlbnNpb24gPT0gbnVsbCkNCi0JCQlyZXR1cm4gIiIvKm5vbk5MUyovOw0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KIAkJcmV0dXJuIGV4dGVuc2lvbjsNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9KYXJGaWxlRW50cnlEb2N1bWVudC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZUVudHJ5RG9jdW1lbnQuamF2YQppbmRleCBkYjlmOTIwLi4xYzI3N2RlIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9KYXJGaWxlRW50cnlEb2N1bWVudC5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0phckZpbGVFbnRyeURvY3VtZW50LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAlwcm90ZWN0ZWQgWmlwRW50cnkgemlwRW50cnk7DQogCXByb3RlY3RlZCBieXRlW10gYnl0ZUNvbnRlbnRzOw0KIAlwcm90ZWN0ZWQgUGF0aCB6aXBGaWxlUGF0aDsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SID0gInwiLypub25OTFMqLzsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkDQogLyoqDQogICogSmFyRmlsZUVudHJ5RG9jdW1lbnQgY29uc3RydWN0b3IgY29tbWVudC4NCiAgKi8NCkBAIC01OSw3ICs1OSw3IEBACiAJICogQHNlZSBJRG9jdW1lbnQjZ2V0VHlwZQ0KIAkgKi8NCiAJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLQkJcmV0dXJuICJjbGFzcyIvKm5vbk5MUyovOw0KKwkJcmV0dXJuICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIHB1YmxpYyB2b2lkIHNldEJ5dGVzKGJ5dGVbXSBieXRlQ29udGVudHMpIHsNCiAJdGhpcy5ieXRlQ29udGVudHMgPSBieXRlQ29udGVudHM7DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0xSVUNhY2hlLmphdmEKaW5kZXggN2NhNjM4Ni4uOGE2MjcyYSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9MUlVDYWNoZS5qYXZhCkBAIC04Niw3ICs4Niw3IEBACiAJCSAqLw0KIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiANCi0JCQlyZXR1cm4gIkxSVUNhY2hlRW50cnkgWyIvKm5vbk5MUyovICsgX2ZLZXkgKyAiLS0+Ii8qbm9uTkxTKi8gKyBfZlZhbHVlICsgIl0iLypub25OTFMqLzsNCisJCQlyZXR1cm4gIkxSVUNhY2hlRW50cnkgWyIgKyBfZktleSArICItLT4iICsgX2ZWYWx1ZSArICJdIjsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCX0NCiAJfQ0KIA0KQEAgLTQ1MSw3ICs0NTEsNyBAQAogCSAqLw0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KIA0KLQkJcmV0dXJuICJMUlVDYWNoZSAiLypub25OTFMqLyArIChnZXRDdXJyZW50U3BhY2UoKSAqIDEwMC4wIC8gZ2V0U3BhY2VMaW1pdCgpKSArICIlIGZ1bGwiLypub25OTFMqLzsNCisJCXJldHVybiAiTFJVQ2FjaGUgIiArIChnZXRDdXJyZW50U3BhY2UoKSAqIDEwMC4wIC8gZ2V0U3BhY2VMaW1pdCgpKSArICIlIGZ1bGwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJfQ0KIAkvKioNCiAJICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzIA0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL09iamVjdFZlY3Rvci5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvT2JqZWN0VmVjdG9yLmphdmEKaW5kZXggYTY1Y2QzYi4uZjM4NWE1YiAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvT2JqZWN0VmVjdG9yLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvT2JqZWN0VmVjdG9yLmphdmEKQEAgLTYxLDkgKzYxLDkgQEAKIAkJc2l6ZT0gMDsNCiAJfQ0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nIHM9ICIiLypub25OTFMqLzsNCisJCVN0cmluZyBzPSAiIjsgLy8kTk9OLU5MUy0xJA0KIAkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykNCi0JCQlzICs9IGVsZW1lbnRzW2ldLnRvU3RyaW5nKCkgKyAiXG4iLypub25OTFMqLzsNCisJCQlzICs9IGVsZW1lbnRzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkDQogCQlyZXR1cm4gczsNCiAJfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0hpZXJhcmNoeVNjb3BlLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0hpZXJhcmNoeVNjb3BlLmphdmEKaW5kZXggNmU0NjhjOC4uYWY2ODI4YyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9IaWVyYXJjaHlTY29wZS5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCQkJCXppcEZpbGVOYW1lICsgDQogCQkJCUpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiArIA0KIAkJCQl0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsNCi0JCQkJIi5jbGFzcyIvKm5vbk5MUyovOw0KKwkJCQkiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KIAkJCXRoaXMucmVzb3VyY2VQYXRocy5wdXQocmVzb3VyY2VQYXRoLCByZXNvdXJjZVBhdGgpOw0KIAkJCXBhdGhzLnB1dChqYXIuZ2V0UGF0aCgpLCB0eXBlKTsNCiAJCX0gZWxzZSB7DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQppbmRleCA1ZDNhMmE0Li5kMmZiYTEzIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogCQlpc0NvbXBsZXRlICY9IHNlYXJjaChzZWFyY2hJbmRleGVzW2ldKTsNCiAJfQ0KIAlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKXsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gZXhlY3V0aW9uIHRpbWU6ICIvKm5vbk5MUyovICsgZXhlY3V0aW9uVGltZSArICIgbXMuIGZvciA6ICIvKm5vbk5MUyovK3RoaXMpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItPiBleGVjdXRpb24gdGltZTogIiArIGV4ZWN1dGlvblRpbWUgKyAiIG1zLiBmb3IgOiAiK3RoaXMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJfQ0KIAlyZXR1cm4gaXNDb21wbGV0ZTsNCiB9DQpAQCAtOTYsNyArOTYsNyBAQAogCQkJdHJ5IHsNCiAJCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jaw0KIAkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUNCi0JCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IG1lcmdpbmcgaW5kZXggOiAiLypub25OTFMqLytpbmRleC5nZXRJbmRleEZpbGUoKSk7DQorCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBtZXJnaW5nIGluZGV4IDogIitpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJaW5kZXguc2F2ZSgpOw0KIAkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7DQogCQkJCXJldHVybiBGQUlMRUQ7DQpAQCAtMTE2LDYgKzExNiw2IEBACiAJfQ0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQotCXJldHVybiAic2VhcmNoaW5nICIvKm5vbk5MUyovICsgcGF0dGVybi50b1N0cmluZygpOw0KKwlyZXR1cm4gInNlYXJjaGluZyAiICsgcGF0dGVybi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1N1YlR5cGVTZWFyY2hKb2IuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCmluZGV4IGEyNGQ1YzYuLjY4OTRkNDggMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAJCQl0cnkgew0KIAkJCQltb25pdG9yLmV4aXRSZWFkKCk7IC8vIGZyZWUgcmVhZCBsb2NrDQogCQkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQ0KLQkJCQlpZiAoSW5kZXhNYW5hZ2VyLlZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gbWVyZ2luZyBpbmRleCA6ICIvKm5vbk5MUyovK2luZGV4LmdldEluZGV4RmlsZSgpKTsNCisJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IG1lcmdpbmcgaW5kZXggOiAiK2luZGV4LmdldEluZGV4RmlsZSgpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlpbmRleC5zYXZlKCk7DQogCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsNCiAJCQkJcmV0dXJuIEZBSUxFRDsNCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1V0aWwuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCmluZGV4IDQ2MGNmN2MuLmZhMDU4MGQgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCkBAIC0xMCw3ICsxMCw3IEBACiBwdWJsaWMgY2xhc3MgVXRpbCB7DQogCS8qIEJ1bmRsZSBjb250YWluaW5nIG1lc3NhZ2VzICovDQogCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOw0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWVzc2FnZXMiLypub25OTFMqLzsNCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KIAlzdGF0aWMgew0KIAkJcmVsb2NhbGl6ZSgpOw0KIAl9DQpAQCAtMzQsMTQgKzM0LDE0IEBACiAgKi8NCiBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nW10gYmluZGluZ3MpIHsNCiAJaWYgKGlkID09IG51bGwpDQotCQlyZXR1cm4gIk5vIG1lc3NhZ2UgYXZhaWxhYmxlIi8qbm9uTkxTKi87DQorCQlyZXR1cm4gIk5vIG1lc3NhZ2UgYXZhaWxhYmxlIjsgLy8kTk9OLU5MUy0xJA0KIAlTdHJpbmcgbWVzc2FnZSA9IG51bGw7DQogCXRyeSB7DQogCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhpZCk7DQogCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQogCQkvLyBJZiB3ZSBnb3QgYW4gZXhjZXB0aW9uIGxvb2tpbmcgZm9yIHRoZSBtZXNzYWdlLCBmYWlsIGdyYWNlZnVsbHkgYnkganVzdCByZXR1cm5pbmcNCiAJCS8vIHRoZSBpZCB3ZSB3ZXJlIGxvb2tpbmcgZm9yLiAgSW4gbW9zdCBjYXNlcyB0aGlzIGlzIHNlbWktaW5mb3JtYXRpdmUgc28gaXMgbm90IHRvbyBiYWQuDQotCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIi8qbm9uTkxTKi8gKyBpZCArICIgaW46ICIvKm5vbk5MUyovICsgYnVuZGxlTmFtZTsNCisJCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgaWQgKyAiIGluOiAiICsgYnVuZGxlTmFtZTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCX0NCiAJaWYgKGJpbmRpbmdzID09IG51bGwpDQogCQlyZXR1cm4gbWVzc2FnZTsNCkBAIC02MCw3ICs2MCw3IEBACiAJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgew0KIAkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsNCiAJCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0JCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIvKm5vbk5MUyovICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIvKm5vbk5MUyovKTsNCisJCQkJCW91dHB1dC5hcHBlbmQoInttaXNzaW5nICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSArICJ9Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJA0KIAkJCQl9DQogCQkJfSBlbHNlIHsNCiAJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQsIGxlbmd0aCkpOw0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDbGFzc0ZpbGVUb0luZGV4LmphdmEKaW5kZXggM2Y2ZDNlZC4uZWU1OWU2OSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDbGFzc0ZpbGVUb0luZGV4LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDbGFzc0ZpbGVUb0luZGV4LmphdmEKQEAgLTY4LDYgKzY4LDYgQEAKIAl9DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCi0JcmV0dXJuICJpbmRleGluZyAiLypub25OTFMqLyArIHJlc291cmNlLmdldE5hbWUoKTsNCisJcmV0dXJuICJpbmRleGluZyAiICsgcmVzb3VyY2UuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkDQogfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXguamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleC5qYXZhCmluZGV4IDViMWJkODQuLjliMzk2OGUgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleC5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleC5qYXZhCkBAIC02OSw2ICs2OSw2IEBACiAJfQ0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQotCXJldHVybiAiaW5kZXhpbmcgIi8qbm9uTkxTKi8gKyByZXNvdXJjZS5nZXROYW1lKCk7DQorCXJldHVybiAiaW5kZXhpbmcgIiArIHJlc291cmNlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRKYXJGaWxlVG9JbmRleC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRKYXJGaWxlVG9JbmRleC5qYXZhCmluZGV4IGJjNTdhMTkuLjAwOWZlZWIgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEphckZpbGVUb0luZGV4LmphdmEKQEAgLTczLDExICs3MywxMSBAQAogCQkJfQ0KIAkJCQkNCiAJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKQ0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklOREVYIDogIi8qbm9uTkxTKi8gKyB6aXAuZ2V0TmFtZSgpKTsNCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJTkRFWCA6ICIgKyB6aXAuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWxvbmcgaW5pdGlhbFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCiANCiAJCQlmaW5hbCBIYXNodGFibGUgaW5kZXhlZEZpbGVOYW1lcyA9IG5ldyBIYXNodGFibGUoMTAwKTsNCi0JCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIvKm5vbk5MUyovKTsgLy8gYWxsIGZpbGUgbmFtZXMNCisJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkDQogCQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdHMgPT0gbnVsbCA/IDAgOiByZXN1bHRzLmxlbmd0aDsNCiAJCQlpZiAocmVzdWx0TGVuZ3RoICE9IDApIHsNCiAJCQkJLyogY2hlY2sgaW50ZWdyaXR5IG9mIHRoZSBleGlzdGluZyBpbmRleCBmaWxlDQpAQCAtMTM1LDExICsxMzUsMTEgQEAKIAkJCX0NCiAJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKQ0KIAkJCQlTeXN0ZW0ub3V0LnByaW50bG4oDQotCQkJCQkiSU5ERVggOiAiLypub25OTFMqLw0KKwkJCQkJIklOREVYIDogIiAvLyROT04tTkxTLTEkDQogCQkJCQkJKyB6aXAuZ2V0TmFtZSgpDQotCQkJCQkJKyAiIENPTVBMRVRFIGluICIvKm5vbk5MUyovDQorCQkJCQkJKyAiIENPTVBMRVRFIGluICIgLy8kTk9OLU5MUy0xJA0KIAkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaW5pdGlhbFRpbWUpDQotCQkJCQkJKyAiIG1zIi8qbm9uTkxTKi8pOyANCisJCQkJCQkrICIgbXMiKTsgIC8vJE5PTi1OTFMtMSQNCiAJCX0gZmluYWxseSB7DQogCQkJaWYgKHppcCAhPSBudWxsKQ0KIAkJCQl6aXAuY2xvc2UoKTsNCkBAIC0xNjAsMTIgKzE2MCwxMiBAQAogCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgew0KIAkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsNCiAJCQlpZiAobG9jYXRpb24gPT0gbnVsbCl7DQotCQkJCXRvU3RyaW5nID0gImluZGV4aW5nICIvKm5vbk5MUyovOw0KKwkJCQl0b1N0cmluZyA9ICJpbmRleGluZyAiOyAvLyROT04tTkxTLTEkDQogCQkJfSBlbHNlIHsNCi0JCQkgICAgdG9TdHJpbmcgPSAiaW5kZXhpbmcgIi8qbm9uTkxTKi8gKyBsb2NhdGlvbi50b0ZpbGUoKS50b1N0cmluZygpOw0KKwkJCSAgICB0b1N0cmluZyA9ICJpbmRleGluZyAiICsgbG9jYXRpb24udG9GaWxlKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCX0gZWxzZSB7DQotCQkgICAgdG9TdHJpbmcgPSAiaW5kZXhpbmcgIi8qbm9uTkxTKi8gKyB0aGlzLnBhdGgudG9GaWxlKCkudG9TdHJpbmcoKTsNCisJCSAgICB0b1N0cmluZyA9ICJpbmRleGluZyAiICsgdGhpcy5wYXRoLnRvRmlsZSgpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQNCiAJCX0NCiAJfQ0KIAlyZXR1cm4gdG9TdHJpbmc7DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9CaW5hcnlJbmRleGVyLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0JpbmFyeUluZGV4ZXIuamF2YQppbmRleCBlOTc1NmM0Li42ZjUyY2ZkIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0JpbmFyeUluZGV4ZXIuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0JpbmFyeUluZGV4ZXIuamF2YQpAQCAtMTMsMTYgKzEzLDE2IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC4qOw0KIA0KIHB1YmxpYyBjbGFzcyBCaW5hcnlJbmRleGVyIGV4dGVuZHMgQWJzdHJhY3RJbmRleGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxFX1RZUEVTPSBuZXcgU3RyaW5nW10geyJjbGFzcyIvKm5vbk5MUyovfTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJZVEUgPSAiYnl0ZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSID0gImNoYXIiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFID0gImRvdWJsZSIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGTE9BVCA9ICJmbG9hdCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlQgPSAiaW50Ii8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIExPTkcgPSAibG9uZyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSE9SVCA9ICJzaG9ydCIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCT09MRUFOID0gImJvb2xlYW4iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVk9JRCA9ICJ2b2lkIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxFX1RZUEVTPSBuZXcgU3RyaW5nW10geyJjbGFzcyJ9OyAvLyROT04tTkxTLTEkDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCWVRFID0gImJ5dGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENIQVIgPSAiY2hhciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFID0gImRvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRkxPQVQgPSAiZmxvYXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIElOVCA9ICJpbnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIExPTkcgPSAibG9uZyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0hPUlQgPSAic2hvcnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJPT0xFQU4gPSAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVk9JRCA9ICJ2b2lkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogDQogCXByaXZhdGUgYm9vbGVhbiBuZWVkUmVmZXJlbmNlczsNCiANCkBAIC0zNTksOCArMzU5LDggQEAKIAlyZXR1cm4gcmVhZGVyLnV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgcmVhZGVyLnUyQXQodXRmOE9mZnNldCArIDEpKTsNCiB9DQogcHJpdmF0ZSBmaW5hbCBjaGFyW10gZXh0cmFjdE5hbWUoaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cywgQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciwgaW50IGluZGV4KSB7DQotCWludCBjb25zdGFudFBvb2xJbmRleCA9IHJlYWRlci51MkF0KGNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdICsgMyk7DQotCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1tyZWFkZXIudTJBdChjb25zdGFudFBvb2xPZmZzZXRzW2NvbnN0YW50UG9vbEluZGV4XSArIDEpXTsNCisJaW50IG5hbWVBbmRUeXBlSW5kZXggPSByZWFkZXIudTJBdChjb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSArIDMpOw0KKwlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbcmVhZGVyLnUyQXQoY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSArIDEpXTsNCiAJcmV0dXJuIHJlYWRlci51dGY4QXQodXRmOE9mZnNldCArIDMsIHJlYWRlci51MkF0KHV0ZjhPZmZzZXQgKyAxKSk7DQogfQ0KIC8qKg0KQEAgLTQ0MiwxNCArNDQyLDE0IEBACiAJCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcyA9IHJlcGxhY2UoJy8nLCAnLicsIHJlYWRlci5nZXRJbnRlcmZhY2VOYW1lcygpKTsNCiAJCWlmIChERUJVRykgew0KIAkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFja2FnZSBuYW1lID0gIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKSk7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFja2FnZSBuYW1lID0gIiArIG5ldyBTdHJpbmcocGFja2FnZU5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQlpZiAobmFtZSAhPSBudWxsKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xhc3MgbmFtZSA9ICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhuYW1lKSk7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xhc3MgbmFtZSA9ICIgKyBuZXcgU3RyaW5nKG5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KIAkJCX0NCiAJCQlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwpIHsNCiAJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdXBlcmludGVyZmFjZXNbIi8qbm9uTkxTKi8gKyBpICsgIl09ICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhzdXBlcmludGVyZmFjZXNbaV0pKTsNCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3VwZXJpbnRlcmZhY2VzWyIgKyBpICsgIl09ICIgKyBuZXcgU3RyaW5nKHN1cGVyaW50ZXJmYWNlc1tpXSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQkJfQ0KIAkJCX0gDQogCQl9DQpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJCQljaGFyW10gc3VwZXJjbGFzcyA9IHJlcGxhY2UoJy8nLCAnLicsIHJlYWRlci5nZXRTdXBlcmNsYXNzTmFtZSgpKTsNCiAJCQlpZiAoREVCVUcpIHsNCiAJCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgew0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdXBlcmNsYXNzIG5hbWUgPSAiLypub25OTFMqLyArIG5ldyBTdHJpbmcoc3VwZXJjbGFzcykpOw0KKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdXBlcmNsYXNzIG5hbWUgPSAiICsgbmV3IFN0cmluZyhzdXBlcmNsYXNzKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJfQ0KIAkJCX0NCiAJCQlhZGRDbGFzc0RlY2xhcmF0aW9uKHJlYWRlci5nZXRNb2RpZmllcnMoKSwgcGFja2FnZU5hbWUsIG5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzKTsNCkBAIC00NzcsMTkgKzQ3NywxOSBAQAogCQkJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzID0gcmVwbGFjZSgnLycsICcuJywgbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpKTsNCiAJCQkJaWYgKERFQlVHKSB7DQogCQkJCQlpZiAobWV0aG9kLmdldFNlbGVjdG9yKCkgIT0gbnVsbCkgew0KLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kIHNlbGVjdG9yID0gIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKG1ldGhvZC5nZXRTZWxlY3RvcigpKSk7DQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJtZXRob2Qgc2VsZWN0b3IgPSAiICsgbmV3IFN0cmluZyhtZXRob2QuZ2V0U2VsZWN0b3IoKSkpOyAvLyROT04tTkxTLTEkDQogCQkJCQl9DQogCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgew0KIAkJCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7DQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFyYW1ldGVyVHlwZXNbIi8qbm9uTkxTKi8gKyBqICsgIl09ICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhwYXJhbWV0ZXJUeXBlc1tqXSkpOw0KKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhcmFtZXRlclR5cGVzWyIgKyBqICsgIl09ICIgKyBuZXcgU3RyaW5nKHBhcmFtZXRlclR5cGVzW2pdKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQkJCX0NCiAJCQkJCX0NCiAJCQkJCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsNCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybiB0eXBlID0gIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKHJldHVyblR5cGUpKTsNCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybiB0eXBlID0gIiArIG5ldyBTdHJpbmcocmV0dXJuVHlwZSkpOyAvLyROT04tTkxTLTEkDQogCQkJCQl9DQogCQkJCQlpZiAoZXhjZXB0aW9uVHlwZXMgIT0gbnVsbCkgew0KIAkJCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gZXhjZXB0aW9uVHlwZXMubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7DQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXhjZXB0aW9uVHlwZXNbIi8qbm9uTkxTKi8gKyBqICsgIl09ICIvKm5vbk5MUyovICsgbmV3IFN0cmluZyhleGNlcHRpb25UeXBlc1tqXSkpOw0KKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4Y2VwdGlvblR5cGVzWyIgKyBqICsgIl09ICIgKyBuZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGVzW2pdKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQkJCX0NCiAJCQkJCX0NCiAJCQkJfQ0KQEAgLTUxMCwxMCArNTEwLDEwIEBACiAJCQkJY2hhcltdIGZpZWxkVHlwZSA9IGRlY29kZUZpZWxkVHlwZShyZXBsYWNlKCcvJywgJy4nLCBmaWVsZC5nZXRUeXBlTmFtZSgpKSk7DQogCQkJCWlmIChERUJVRykgew0KIAkJCQkJaWYgKGZpZWxkTmFtZSAhPSBudWxsKSB7DQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJmaWVsZCBuYW1lID0gIi8qbm9uTkxTKi8gKyBuZXcgU3RyaW5nKGZpZWxkTmFtZSkpOw0KKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmllbGQgbmFtZSA9ICIgKyBuZXcgU3RyaW5nKGZpZWxkTmFtZSkpOyAvLyROT04tTkxTLTEkDQogCQkJCQl9DQogCQkJCQlpZiAoZmllbGRUeXBlICE9IG51bGwpIHsNCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpZWxkIHR5cGUgPSAiLypub25OTFMqLyArIG5ldyBTdHJpbmcoZmllbGRUeXBlKSk7DQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJmaWVsZCB0eXBlID0gIiArIG5ldyBTdHJpbmcoZmllbGRUeXBlKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCX0NCiAJCQkJfQ0KIAkJCQlhZGRGaWVsZERlY2xhcmF0aW9uKGZpZWxkVHlwZSwgZmllbGROYW1lKTsNCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JSW5kZXhDb25zdGFudHMuamF2YQppbmRleCBlNzRiZGFkLi5iMTVhMjYwIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTksMjAgKzksMjAgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSUluZGV4Q29uc3RhbnRzIGV4dGVuZHMgSUpvYkNvbnN0YW50cyB7DQogDQogCS8qIGluZGV4IGVuY29kaW5nICovDQotCWNoYXJbXSBSRUY9ICJyZWYvIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEZJRUxEX1JFRj0gImZpZWxkUmVmLyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBNRVRIT0RfUkVGPSAibWV0aG9kUmVmLyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBDT05TVFJVQ1RPUl9SRUY9ICJjb25zdHJ1Y3RvclJlZi8iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gVFlQRV9SRUY9ICJ0eXBlUmVmLyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBTVVBFUl9SRUYgPSAic3VwZXJSZWYvIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIFRZUEVfREVDTCA9ICJ0eXBlRGVjbC8iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwljaGFyW10gUkVGPSAicmVmLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gRklFTERfUkVGPSAiZmllbGRSZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBNRVRIT0RfUkVGPSAibWV0aG9kUmVmLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gQ09OU1RSVUNUT1JfUkVGPSAiY29uc3RydWN0b3JSZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBUWVBFX1JFRj0gInR5cGVSZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBTVVBFUl9SRUYgPSAic3VwZXJSZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBUWVBFX0RFQ0wgPSAidHlwZURlY2wvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQogCWludCAJVFlQRV9ERUNMX0xFTkdUSCA9IDk7DQotCWNoYXJbXSBDTEFTU19ERUNMPSAidHlwZURlY2wvQy8iLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KLQljaGFyW10gSU5URVJGQUNFX0RFQ0w9ICJ0eXBlRGVjbC9JLyIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCk7DQotCWNoYXJbXSBNRVRIT0RfREVDTD0gIm1ldGhvZERlY2wvIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIENPTlNUUlVDVE9SX0RFQ0w9ICJjb25zdHJ1Y3RvckRlY2wvIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIEZJRUxEX0RFQ0w9ICJmaWVsZERlY2wvIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKTsNCi0JY2hhcltdIE9CSkVDVCA9ICJPYmplY3QiLypub25OTFMqLy50b0NoYXJBcnJheSgpOw0KKwljaGFyW10gQ0xBU1NfREVDTD0gInR5cGVEZWNsL0MvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBJTlRFUkZBQ0VfREVDTD0gInR5cGVEZWNsL0kvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBNRVRIT0RfREVDTD0gIm1ldGhvZERlY2wvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkDQorCWNoYXJbXSBDT05TVFJVQ1RPUl9ERUNMPSAiY29uc3RydWN0b3JEZWNsLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJA0KKwljaGFyW10gRklFTERfREVDTD0gImZpZWxkRGVjbC8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCisJY2hhcltdIE9CSkVDVCA9ICJPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQNCiAJY2hhcltdW10gQ09VTlRTPSANCiAJCW5ldyBjaGFyW11bXSB7IG5ldyBjaGFyW10geycwJ30sIG5ldyBjaGFyW10geycxJ30sIG5ldyBjaGFyW10geycyJ30sIG5ldyBjaGFyW10geyczJ30sIG5ldyBjaGFyW10geyc0J30sIG5ldyBjaGFyW10geyc1J30sIG5ldyBjaGFyW10geyc2J30sIG5ldyBjaGFyW10geyc3J30sIG5ldyBjaGFyW10geyc4J30sIG5ldyBjaGFyW10geyc5J30NCiAJfTsNCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QWxsUHJvamVjdC5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEFsbFByb2plY3QuamF2YQppbmRleCBiNTE4MjdiLi5jYjE4YjAzIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QWxsUHJvamVjdC5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJCXRyeSB7DQogCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sNCiAJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlDQotCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBtZXJnaW5nIGluZGV4IDogIi8qbm9uTkxTKi8raW5kZXguZ2V0SW5kZXhGaWxlKCkpOw0KKwkJCQlpZiAoSW5kZXhNYW5hZ2VyLlZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gbWVyZ2luZyBpbmRleCA6ICIraW5kZXguZ2V0SW5kZXhGaWxlKCkpOyAvLyROT04tTkxTLTEkDQogCQkJCWluZGV4LnNhdmUoKTsNCiAJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpew0KIAkJCQlyZXR1cm4gRkFJTEVEOw0KQEAgLTU0LDEyICs1NCwxMiBAQAogCQkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIHJlYWNxdWlyZSByZWFkIHBlcm1pc3Npb24NCiAJCQl9DQogCQl9DQotCQlmaW5hbCBTdHJpbmcgT0sgPSAiT0siLypub25OTFMqLzsNCi0JCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiLypub25OTFMqLzsJDQorCQlmaW5hbCBTdHJpbmcgT0sgPSAiT0siOyAvLyROT04tTkxTLTEkDQorCQlmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJERUxFVEVEIjsJIC8vJE5PTi1OTFMtMSQNCiAJCWZpbmFsIGxvbmcgaW5kZXhMYXN0TW9kaWZpZWQgPSBpbmRleC5nZXRJbmRleEZpbGUoKS5sYXN0TW9kaWZpZWQoKTsNCiANCiAJCWZpbmFsIEhhc2h0YWJsZSBpbmRleGVkRmlsZU5hbWVzID0gbmV3IEhhc2h0YWJsZSgxMDApOw0KLQkJSVF1ZXJ5UmVzdWx0W10gcmVzdWx0cyA9IGluZGV4LnF1ZXJ5SW5Eb2N1bWVudE5hbWVzKCIiLypub25OTFMqLyk7IC8vIGFsbCBmaWxlIG5hbWVzDQorCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkDQogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspew0KIAkJCVN0cmluZyBmaWxlTmFtZSA9IHJlc3VsdHNbaV0uZ2V0UGF0aCgpOw0KIAkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KGZpbGVOYW1lLCBERUxFVEVEKTsNCkBAIC02OCw3ICs2OCw3IEBACiAJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsNCiAJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KIAkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsNCi0JCQkJCWlmICgoZXh0ZW5zaW9uICE9IG51bGwpICYmIGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIi8qbm9uTkxTKi8pKSB7DQorCQkJCQlpZiAoKGV4dGVuc2lvbiAhPSBudWxsKSAmJiBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsNCiAJCQkJCQlpZiAocGF0aCAhPSBudWxsKXsNCiAJCQkJCQkJRmlsZSByZXNvdXJjZUZpbGUgPSBwYXRoLnRvRmlsZSgpOw0KQEAgLTEwOCw2ICsxMDgsNiBAQAogCXJldHVybiBDT01QTEVURTsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KLQlyZXR1cm4gImluZGV4aW5nIHByb2plY3QgIi8qbm9uTkxTKi8gKyBwcm9qZWN0LmdldE5hbWUoKTsNCisJcmV0dXJuICJpbmRleGluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhNYW5hZ2VyLmphdmEKaW5kZXggYzU2YzQzMS4uNmM5NWRlZCAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4TWFuYWdlci5qYXZhCkBAIC01NywxMyArNTcsMTMgQEAKIHB1YmxpYyB2b2lkIGFkZChJRmlsZSByZXNvdXJjZSl7DQogCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsIHx8IHRoaXMud29ya3NwYWNlID09IG51bGwpIHJldHVybjsJDQogCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQotCWlmICgiamF2YSIvKm5vbk5MUyovLmVxdWFscyhleHRlbnNpb24pKXsNCisJaWYgKCJqYXZhIi5lcXVhbHMoZXh0ZW5zaW9uKSl7IC8vJE5PTi1OTFMtMSQNCiAJCUFkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXggam9iID0gbmV3IEFkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXgocmVzb3VyY2UsIHRoaXMpOw0KIAkJaWYgKHRoaXMuYXdhaXRpbmdKb2JzQ291bnQoKSA8IE1BWF9GSUxFU19JTl9NRU1PUlkpIHsNCiAJCQlqb2IuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7DQogCQl9DQogCQlyZXF1ZXN0KGpvYik7DQotCX0gZWxzZSBpZiAoImNsYXNzIi8qbm9uTkxTKi8uZXF1YWxzKGV4dGVuc2lvbikpew0KKwl9IGVsc2UgaWYgKCJjbGFzcyIuZXF1YWxzKGV4dGVuc2lvbikpeyAvLyROT04tTkxTLTEkDQogCQlBZGRDbGFzc0ZpbGVUb0luZGV4IGpvYiA9IG5ldyBBZGRDbGFzc0ZpbGVUb0luZGV4KHJlc291cmNlLCB0aGlzKTsNCiAJCWlmICh0aGlzLmF3YWl0aW5nSm9ic0NvdW50KCkgPCBNQVhfRklMRVNfSU5fTUVNT1JZKSB7DQogCQkJam9iLmluaXRpYWxpemVDb250ZW50cygpOw0KQEAgLTc3LDcgKzc3LDcgQEAKICAqLw0KIHB1YmxpYyB2b2lkIGNoZWNrSW5kZXhDb25zaXN0ZW5jeSgpIHsNCiANCi0JaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiU1RBUlRJTkcgLSBlbnN1cmluZyBjb25zaXN0ZW5jeSIvKm5vbk5MUyovKTsNCisJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiU1RBUlRJTkcgLSBlbnN1cmluZyBjb25zaXN0ZW5jeSIpOyAvLyROT04tTkxTLTEkDQogDQogCWJvb2xlYW4gd2FzRW5hYmxlZCA9IGlzRW5hYmxlZCgpOwkNCiAJdHJ5IHsNCkBAIC05NCwxNSArOTQsMTUgQEAKIAkJfQ0KIAl9IGZpbmFsbHkgew0KIAkJaWYgKHdhc0VuYWJsZWQpIGVuYWJsZSgpOw0KLQkJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiRE9ORSAtIGVuc3VyaW5nIGNvbnNpc3RlbmN5Ii8qbm9uTkxTKi8pOw0KKwkJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiRE9ORSAtIGVuc3VyaW5nIGNvbnNpc3RlbmN5Iik7IC8vJE5PTi1OTFMtMSQNCiAJfQ0KIH0NCiBwcml2YXRlIFN0cmluZyBjb21wdXRlSW5kZXhOYW1lKFN0cmluZyBwYXRoU3RyaW5nKSB7DQogCWJ5dGVbXSBwYXRoQnl0ZXMgPSBwYXRoU3RyaW5nLmdldEJ5dGVzKCk7DQogCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOw0KIAljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhCeXRlcyk7DQotCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5pbmRleCIvKm5vbk5MUyovOw0KLQlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIi8qbm9uTkxTKi8gKyBwYXRoU3RyaW5nICsgIiA8LS0tLT4gIi8qbm9uTkxTKi8gKyBmaWxlTmFtZSk7DQorCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5pbmRleCI7IC8vJE5PTi1OTFMtMSQNCisJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiIGluZGV4IG5hbWU6ICIgKyBwYXRoU3RyaW5nICsgIiA8LS0tLT4gIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCUlQYXRoIGluZGV4UGF0aCA9IGdldEphdmFQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsNCiAJU3RyaW5nIGluZGV4RGlyZWN0b3J5ID0gaW5kZXhQYXRoLnRvT1NTdHJpbmcoKTsNCiAJaWYgKGluZGV4RGlyZWN0b3J5LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgew0KQEAgLTE4Myw3ICsxODMsNyBAQAogCQkJaWYgKGluZGV4ID09IG51bGwpIHsNCiAJCQkJLy8gTmV3IGluZGV4OiBhZGQgc2FtZSBpbmRleCBmb3IgZ2l2ZW4gcGF0aCBhbmQgY2Fub25pY2FsIHBhdGgNCiAJCQkJU3RyaW5nIGluZGV4UGF0aCA9IGNvbXB1dGVJbmRleE5hbWUoY2Fub25pY2FsUGF0aC50b09TU3RyaW5nKCkpOw0KLQkJCQlpbmRleCA9IEluZGV4RmFjdG9yeS5uZXdJbmRleChpbmRleFBhdGgsICJJbmRleCBmb3IgIi8qbm9uTkxTKi8gKyBjYW5vbmljYWxQYXRoLnRvT1NTdHJpbmcoKSk7DQorCQkJCWluZGV4ID0gSW5kZXhGYWN0b3J5Lm5ld0luZGV4KGluZGV4UGF0aCwgIkluZGV4IGZvciAiICsgY2Fub25pY2FsUGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkDQogCQkJCWluZGV4ZXMucHV0KGNhbm9uaWNhbFBhdGgsIGluZGV4KTsNCiAJCQkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOw0KIAkJCQltb25pdG9ycy5wdXQoaW5kZXgsIG5ldyBSZWFkV3JpdGVNb25pdG9yKCkpOw0KQEAgLTI1Nyw3ICsyNTcsNyBAQAogICogTmFtZSBvZiB0aGUgYmFja2dyb3VuZCBwcm9jZXNzDQogICovDQogcHVibGljIFN0cmluZyBwcm9jZXNzTmFtZSgpew0KLQlyZXR1cm4gVXRpbC5iaW5kKCJwcm9jZXNzLm5hbWUiLypub25OTFMqLywgSW5kZXhNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7DQorCXJldHVybiBVdGlsLmJpbmQoInByb2Nlc3MubmFtZSIsIEluZGV4TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIFJlY3JlYXRlcyB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gcGF0aCwga2VlcGluZyB0aGUgc2FtZSByZWFkLXdyaXRlIG1vbml0b3IuDQpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQkvLyBBZGQgc2FtZSBpbmRleCBmb3IgZ2l2ZW4gcGF0aCBhbmQgY2Fub25pY2FsIHBhdGgNCiAJCQlTdHJpbmcgaW5kZXhQYXRoID0gY29tcHV0ZUluZGV4TmFtZShjYW5vbmljYWxQYXRoLnRvT1NTdHJpbmcoKSk7DQogCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gKFJlYWRXcml0ZU1vbml0b3IpbW9uaXRvcnMucmVtb3ZlKGluZGV4KTsNCi0JCQlpbmRleCA9IEluZGV4RmFjdG9yeS5uZXdJbmRleChpbmRleFBhdGgsICJJbmRleCBmb3IgIi8qbm9uTkxTKi8gKyBjYW5vbmljYWxQYXRoLnRvT1NTdHJpbmcoKSk7DQorCQkJaW5kZXggPSBJbmRleEZhY3RvcnkubmV3SW5kZXgoaW5kZXhQYXRoLCAiSW5kZXggZm9yICIgKyBjYW5vbmljYWxQYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQlpbmRleC5lbXB0eSgpOw0KIAkJCWluZGV4ZXMucHV0KGNhbm9uaWNhbFBhdGgsIGluZGV4KTsNCiAJCQlpbmRleGVzLnB1dChwYXRoLCBpbmRleCk7DQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCQlpZiAobW9uaXRvciA9PSBudWxsKSBjb250aW51ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQNCiAJCQl0cnkgew0KIAkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsNCi0JCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IG1lcmdpbmcgaW5kZXggOiAiLypub25OTFMqLytpbmRleC5nZXRJbmRleEZpbGUoKSk7DQorCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBtZXJnaW5nIGluZGV4IDogIitpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQNCiAJCQkJaW5kZXguc2F2ZSgpOw0KIAkJCX0gZmluYWxseSB7DQogCQkJCW1vbml0b3IuZXhpdFdyaXRlKCk7DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRnJvbUluZGV4LmphdmEKaW5kZXggYTAzNDg0YS4uMDMyYjE2NSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZyb21JbmRleC5qYXZhCkBAIC00OCw2ICs0OCw2IEBACiAJcmV0dXJuIENPTVBMRVRFOw0KIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQotCXJldHVybiAicmVtb3ZpbmcgZnJvbSBpbmRleCAiLypub25OTFMqLyArIHJlc291cmNlTmFtZTsNCisJcmV0dXJuICJyZW1vdmluZyBmcm9tIGluZGV4ICIgKyByZXNvdXJjZU5hbWU7IC8vJE5PTi1OTFMtMSQNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKaW5kZXggNjI4NTNhOS4uZjJiMzU1MyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAKICAqLw0KIHB1YmxpYyBjbGFzcyBTb3VyY2VJbmRleGVyIGV4dGVuZHMgQWJzdHJhY3RJbmRleGVyIHsNCiAJDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRV9UWVBFUz0gbmV3IFN0cmluZ1tdIHsiamF2YSIvKm5vbk5MUyovfTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxFX1RZUEVTPSBuZXcgU3RyaW5nW10geyJqYXZhIn07IC8vJE5PTi1OTFMtMSQNCiAJcHJvdGVjdGVkIERlZmF1bHRQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeT0gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsNCiAJDQogLyoqDQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IGYwMGFiZDIuLmZjMGIyOGEgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JEZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTYwLDg1ICs2MCw2IEBACiAJCQlpc0Nhc2VTZW5zaXRpdmUpOw0KIH0NCiAvKioNCi0gKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlcyhBc3ROb2RlLCBib29sZWFuKQ0KLSAqLw0KLXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCi0JaWYgKCEobm9kZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pKSByZXR1cm4gZmFsc2U7DQotDQotCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbilub2RlOw0KLQ0KLQkvLyBjb25zdHJ1Y3RvciBuYW1lIGlzIHN0b3JlZCBpbiBzZWxlY3RvciBmaWVsZA0KLQlpZiAodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwgDQotCQkJJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCBjb25zdHJ1Y3Rvci5zZWxlY3RvcikpDQotCQlyZXR1cm4gZmFsc2U7DQotDQotCS8vIGRlY2xhcmluZyB0eXBlDQotCU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IGNvbnN0cnVjdG9yLmJpbmRpbmc7DQotCWlmIChyZXNvbHZlICYmIGJpbmRpbmcgIT0gbnVsbCkgew0KLQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdCaW5kaW5nID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsNCi0JCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nQmluZGluZykpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQkNCi0JLy8gYXJndW1lbnQgdHlwZXMNCi0JaW50IGFyZ3VtZW50Q291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOw0KLQlpZiAoYXJndW1lbnRDb3VudCA+IC0xKSB7DQotCQlpbnQgcGFyYW1ldGVyQ291bnQgPSBjb25zdHJ1Y3Rvci5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3Rvci5hcmd1bWVudHMubGVuZ3RoOw0KLQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJaWYgKHJlc29sdmUgJiYgYmluZGluZyAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7DQotCQkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsNCi0JCQkJY2hhcltdIHR5cGUgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldOw0KLQkJCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgYmluZGluZy5wYXJhbWV0ZXJzW2ldKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEJpbmRpbmcpDQotICovDQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhCaW5kaW5nIGJpbmRpbmcpIHsNCi0JaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpKSByZXR1cm4gZmFsc2U7DQotDQotCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsNCi0NCi0JLy8gbXVzdCBiZSBhIGNvbnN0cnVjdG9yDQotCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgcmV0dXJuIGZhbHNlOw0KLQkNCi0JLy8gZGVjbGFyaW5nIHR5cGUNCi0JUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdUeXBlID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzOw0KLQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7DQotCQlpZiAoIW1ldGhvZC5pc1N0YXRpYygpICYmICFtZXRob2QuaXNQcml2YXRlKCkpIHsNCi0JCQlpZiAoIXRoaXMubWF0Y2hlc0FzU3VidHlwZShkZWNsYXJpbmdUeXBlLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikpDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdUeXBlKSkNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8vIHBhcmFtZXRlciB0eXBlcw0KLQlpbnQgcGFyYW1ldGVyQ291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOw0KLQlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgew0KLQkJaW50IGFyZ3VtZW50Q291bnQgPSBtZXRob2QucGFyYW1ldGVycyA9PSBudWxsID8gMCA6IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsNCi0JCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgew0KLQkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsNCi0JCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07DQotCQkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHR5cGUsIHF1YWxpZmljYXRpb24sIG1ldGhvZC5wYXJhbWV0ZXJzW2ldKSkNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlc0JpbmFyeShPYmplY3QsIE9iamVjdCkNCiAgKi8NCiBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQmluYXJ5KE9iamVjdCBiaW5hcnlJbmZvLCBPYmplY3QgZW5jbG9zaW5nQmluYXJ5SW5mbykgew0KQEAgLTIwOSwzOSArMTMwLDExNiBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KIA0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7DQotCWJ1ZmZlci5hcHBlbmQoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuOiAiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOw0KIAlpZiAoZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKSANCiAJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSk7DQotCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKiIvKm5vbk5MUyovKTsNCisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQNCiANCiAJYnVmZmVyLmFwcGVuZCgnKCcpOw0KIAlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiLi4uIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQotCQkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlpZiAocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7DQogCQkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID09IG51bGwpIGJ1ZmZlci5hcHBlbmQoJyonKTsgZWxzZSBidWZmZXIuYXBwZW5kKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsNCiAJCX0NCiAJfQ0KIAlidWZmZXIuYXBwZW5kKCcpJyk7DQotCWJ1ZmZlci5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCXN3aXRjaChtYXRjaE1vZGUpew0KIAkJY2FzZSBFWEFDVF9NQVRDSCA6IA0KLQkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBSRUZJWF9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQQVRURVJOX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KIAlpZiAoaXNDYXNlU2Vuc2l0aXZlKQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCisNCisvKioNCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQ0KKyAqLw0KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KKwlpZiAoIShub2RlIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pbm9kZTsNCisNCisJaWYgKHJlc29sdmUpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoY29uc3RydWN0b3IuYmluZGluZyk7DQorCX0gZWxzZSB7DQorCQkvLyBjb25zdHJ1Y3RvciBuYW1lIGlzIHN0b3JlZCBpbiBzZWxlY3RvciBmaWVsZA0KKwkJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsIA0KKwkJCQkmJiAhdGhpcy5tYXRjaGVzTmFtZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIGNvbnN0cnVjdG9yLnNlbGVjdG9yKSkNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkNCisJCS8vIHBhcmFtZXRlciB0eXBlcw0KKwkJaW50IHBhcmFtZXRlckNvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsNCisJCWlmIChwYXJhbWV0ZXJDb3VudCA+IC0xKSB7DQorCQkJaW50IGFyZ3VtZW50Q291bnQgPSBjb25zdHJ1Y3Rvci5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3Rvci5hcmd1bWVudHMubGVuZ3RoOw0KKwkJCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCX0NCisNCisJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJfQ0KK30NCisNCisvKioNCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQ0KKyAqLw0KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsNCisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCWludCBsZXZlbDsNCisNCisJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IChNZXRob2RCaW5kaW5nKWJpbmRpbmc7DQorCQ0KKwkvLyBtdXN0IGJlIGEgY29uc3RydWN0b3INCisJaWYgKCFjb25zdHJ1Y3Rvci5pc0NvbnN0cnVjdG9yKCkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwkvLyBkZWNsYXJpbmcgdHlwZQ0KKwlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ1R5cGUgPSBjb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzczsNCisJaWYgKCFjb25zdHJ1Y3Rvci5pc1N0YXRpYygpICYmICFjb25zdHJ1Y3Rvci5pc1ByaXZhdGUoKSkgew0KKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxBc1N1YnR5cGUoZGVjbGFyaW5nVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pOw0KKwl9IGVsc2Ugew0KKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdUeXBlKTsNCisJfQ0KKwlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCX0NCisJCQ0KKwkvLyBwYXJhbWV0ZXIgdHlwZXMNCisJaW50IHBhcmFtZXRlckNvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsNCisJaWYgKHBhcmFtZXRlckNvdW50ID4gLTEpIHsNCisJCWludCBhcmd1bWVudENvdW50ID0gY29uc3RydWN0b3IucGFyYW1ldGVycyA9PSBudWxsID8gMCA6IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoOw0KKwkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpDQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsNCisJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV07DQorCQkJY2hhcltdIHR5cGUgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldOw0KKwkJCWludCBuZXdMZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgY29uc3RydWN0b3IucGFyYW1ldGVyc1tpXSk7DQorCQkJc3dpdGNoIChuZXdMZXZlbCkgew0KKwkJCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6DQorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbA0KKwkJCQkJYnJlYWs7DQorCQkJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJCQlsZXZlbCA9IG5ld0xldmVsOw0KKwkJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBsZXZlbDsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IGVjODc0MjMuLmFkYzI5OTkgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtNTgsOTAgKzU4LDYgQEAKIAkJCWlzQ2FzZVNlbnNpdGl2ZSk7DQogfQ0KIC8qKg0KLSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnN0cnVjdG9yIHBhdHRlcm4gIG1hdGNoZXMgdGhlIGdpdmVuIGFsbG9jYXRpb24gZXhwcmVzc2lvbi4NCi0gKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KLSAqLw0KLXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb24sIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQ0KLQkvLyBjb25zdHJ1Y3RvciBuYW1lIGlzIHNpbXBsZSB0eXBlIG5hbWUNCi0JY2hhcltdW10gdHlwZU5hbWUgPSBhbGxvY2F0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKTsNCi0JaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsIA0KLQkJCSYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoLTFdKSkNCi0JCXJldHVybiBmYWxzZTsNCi0NCi0JLy8gZGVjbGFyaW5nIHR5cGUNCi0JTWV0aG9kQmluZGluZyBiaW5kaW5nID0gYWxsb2NhdGlvbi5iaW5kaW5nOw0KLQlpZiAocmVzb2x2ZSAmJiBiaW5kaW5nICE9IG51bGwpIHsNCi0JCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQmluZGluZyA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7DQotCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ0JpbmRpbmcpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkJDQotCS8vIGFyZ3VtZW50IHR5cGVzDQotCWludCBhcmd1bWVudENvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsNCi0JaWYgKGFyZ3VtZW50Q291bnQgPiAtMSkgew0KLQkJaW50IHBhcmFtZXRlckNvdW50ID0gYWxsb2NhdGlvbi5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBhbGxvY2F0aW9uLmFyZ3VtZW50cy5sZW5ndGg7DQotCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlpZiAocmVzb2x2ZSAmJiBiaW5kaW5nICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsNCi0JCQkJY2hhcltdIHF1YWxpZmljYXRpb24gPSB0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldOw0KLQkJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07DQotCQkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0eXBlLCBxdWFsaWZpY2F0aW9uLCBiaW5kaW5nLnBhcmFtZXRlcnNbaV0pKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQXN0Tm9kZSwgYm9vbGVhbikNCi0gKi8NCi1wcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQotCWlmIChub2RlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsNCi0JCXJldHVybiB0aGlzLm1hdGNoZXMoKEFsbG9jYXRpb25FeHByZXNzaW9uKW5vZGUsIHJlc29sdmUpOw0KLQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgew0KLQkJcmV0dXJuIHRoaXMubWF0Y2hlcygoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpbm9kZSwgcmVzb2x2ZSk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBwYXR0ZXJuICBtYXRjaGVzIHRoZSBnaXZlbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsLg0KLSAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQotICovDQotcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCwgYm9vbGVhbiByZXNvbHZlKSB7DQotCS8vIFRCRDogY29uc3RydWN0b3IgbmFtZSBpcyBzdXBlciBzaW1wbGUgdHlwZSBuYW1lDQotDQotCS8vIGRlY2xhcmluZyB0eXBlDQotCU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IGNhbGwuYmluZGluZzsNCi0JaWYgKHJlc29sdmUgJiYgYmluZGluZyAhPSBudWxsKSB7DQotCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0JpbmRpbmcgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOw0KLQkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdCaW5kaW5nKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JCQ0KLQkvLyBhcmd1bWVudCB0eXBlcw0KLQlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7DQotCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsNCi0JCWludCBwYXJhbWV0ZXJDb3VudCA9IGNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY2FsbC5hcmd1bWVudHMubGVuZ3RoOw0KLQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJaWYgKHJlc29sdmUgJiYgYmluZGluZyAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7DQotCQkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsNCi0JCQkJY2hhcltdIHR5cGUgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldOw0KLQkJCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgYmluZGluZy5wYXJhbWV0ZXJzW2ldKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaEluZGV4RW50cnkNCiAgKi8NCiBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7DQpAQCAtMTczLDM4ICs4OSwxNDEgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KLQlidWZmZXIuYXBwZW5kKCJDb25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm46ICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOw0KIAlpZiAoZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKSANCiAJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSk7DQotCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKiIvKm5vbk5MUyovKTsNCisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQNCiAJYnVmZmVyLmFwcGVuZCgnKCcpOw0KIAlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiLi4uIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQotCQkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlpZiAocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7DQogCQkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID09IG51bGwpIGJ1ZmZlci5hcHBlbmQoJyonKTsgZWxzZSBidWZmZXIuYXBwZW5kKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsNCiAJCX0NCiAJfQ0KIAlidWZmZXIuYXBwZW5kKCcpJyk7DQotCWJ1ZmZlci5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCXN3aXRjaChtYXRjaE1vZGUpew0KIAkJY2FzZSBFWEFDVF9NQVRDSCA6IA0KLQkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBSRUZJWF9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQQVRURVJOX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KIAlpZiAoaXNDYXNlU2Vuc2l0aXZlKQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCisNCisvKioNCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBwYXR0ZXJuICBtYXRjaGVzIHRoZSBnaXZlbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24uDQorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCisgKi8NCitwcml2YXRlIGludCBtYXRjaExldmVsKEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb24sIGJvb2xlYW4gcmVzb2x2ZSkgew0KKw0KKwkvLyBjb25zdHJ1Y3RvciBuYW1lIGlzIHNpbXBsZSB0eXBlIG5hbWUNCisJY2hhcltdW10gdHlwZU5hbWUgPSBhbGxvY2F0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKTsNCisJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsIA0KKwkJCSYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoLTFdKSkNCisJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwlpZiAocmVzb2x2ZSkgew0KKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChhbGxvY2F0aW9uLmJpbmRpbmcpOw0KKwl9IGVsc2Ugew0KKwkJLy8gYXJndW1lbnQgdHlwZXMNCisJCWludCBhcmd1bWVudENvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsNCisJCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsNCisJCQlpbnQgcGFyYW1ldGVyQ291bnQgPSBhbGxvY2F0aW9uLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jYXRpb24uYXJndW1lbnRzLmxlbmd0aDsNCisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQl9DQorCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKG5vZGUgaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgew0KKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pbm9kZSwgcmVzb2x2ZSk7DQorCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbClub2RlLCByZXNvbHZlKTsNCisJfQ0KKwlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCit9DQorDQorLyoqDQorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29uc3RydWN0b3IgcGF0dGVybiAgbWF0Y2hlcyB0aGUgZ2l2ZW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbC4NCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KKyAqLw0KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCwgYm9vbGVhbiByZXNvbHZlKSB7DQorCS8vIFRCRDogY29uc3RydWN0b3IgbmFtZSBpcyBzdXBlciBzaW1wbGUgdHlwZSBuYW1lDQorDQorCWlmIChyZXNvbHZlKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKGNhbGwuYmluZGluZyk7DQorCX0gZWxzZSB7DQorCQkvLyBhcmd1bWVudCB0eXBlcw0KKwkJaW50IGFyZ3VtZW50Q291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOw0KKwkJaWYgKGFyZ3VtZW50Q291bnQgPiAtMSkgew0KKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IGNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY2FsbC5hcmd1bWVudHMubGVuZ3RoOw0KKwkJCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCX0NCisJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJfQ0KK30NCisNCisvKioNCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpLg0KKyAqLw0KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsNCisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCWludCBsZXZlbDsNCisNCisJLy8gZGVjbGFyaW5nIHR5cGUNCisJTWV0aG9kQmluZGluZyBtZXRob2QgPSAoTWV0aG9kQmluZGluZyliaW5kaW5nOw0KKwlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0JpbmRpbmcgPSBtZXRob2QuZGVjbGFyaW5nQ2xhc3M7DQorCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nQmluZGluZyk7DQorCWlmIChsZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQ0KKwkvLyBhcmd1bWVudCB0eXBlcw0KKwlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7DQorCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsNCisJCWlmIChtZXRob2QucGFyYW1ldGVycyA9PSBudWxsKSB7DQorCQkJbGV2ZWwgPSBJTkFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlpbnQgcGFyYW1ldGVyQ291bnQgPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7DQorCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpDQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgew0KKwkJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV07DQorCQkJCWNoYXJbXSB0eXBlID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXTsNCisJCQkJaW50IG5ld0xldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0eXBlLCBxdWFsaWZpY2F0aW9uLCBtZXRob2QucGFyYW1ldGVyc1tpXSk7DQorCQkJCXN3aXRjaCAobmV3TGV2ZWwpIHsNCisJCQkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwNCisJCQkJCQlicmVhazsNCisJCQkJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJCQkJbGV2ZWwgPSBuZXdMZXZlbDsNCisJCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gbGV2ZWw7DQorfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggNDEwMGQyNi4uZTE2MTQ4ZSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGREZWNsYXJhdGlvblBhdHRlcm4uamF2YQpAQCAtODUsNzEgKzg1LDYgQEAKIAlyZXR1cm4gQ0xBU1M7DQogfQ0KIC8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlpZiAoIShub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHJldHVybiBmYWxzZTsNCi0NCi0JRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IChGaWVsZERlY2xhcmF0aW9uKW5vZGU7DQotCWlmICghZmllbGQuaXNGaWVsZCgpKSByZXR1cm4gZmFsc2U7IC8vIGlnbm9yZSBmaWVsZCBpbml0aWFsaXplcnMNCi0JDQotCS8vIGZpZWxkIG5hbWUNCi0JaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGQubmFtZSkpDQotCQlyZXR1cm4gZmFsc2U7DQotDQotCS8vIGRlY2xhcmluZyB0eXBlDQotCUZpZWxkQmluZGluZyBiaW5kaW5nID0gZmllbGQuYmluZGluZzsNCi0JaWYgKHJlc29sdmUgJiYgYmluZGluZyAhPSBudWxsKSB7DQotCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0JpbmRpbmcgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOw0KLQkJaWYgKGRlY2xhcmluZ0JpbmRpbmcgIT0gbnVsbCAmJiAhdGhpcy5tYXRjaGVzVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nQmluZGluZykpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIGZpZWxkIHR5cGUNCi0JaWYgKHRoaXMudHlwZVF1YWxpZmljYXRpb24gPT0gbnVsbCkgew0KLQkJVHlwZVJlZmVyZW5jZSBmaWVsZFR5cGUgPSBmaWVsZC50eXBlOw0KLQkJY2hhcltdW10gZmllbGRUeXBlTmFtZSA9IGZpZWxkVHlwZS5nZXRUeXBlTmFtZSgpOw0KLQkJY2hhcltdIHNvdXJjZU5hbWUgPSB0aGlzLnRvQXJyYXlOYW1lKA0KLQkJCWZpZWxkVHlwZU5hbWVbZmllbGRUeXBlTmFtZS5sZW5ndGgtMV0sIA0KLQkJCWZpZWxkVHlwZS5kaW1lbnNpb25zKCkpOw0KLQkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMudHlwZVNpbXBsZU5hbWUsIHNvdXJjZU5hbWUpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JfSBlbHNlIHsNCi0JCWlmIChyZXNvbHZlIA0KLQkJCQkmJiBiaW5kaW5nICE9IG51bGwgDQotCQkJCSYmICF0aGlzLm1hdGNoZXNUeXBlKHRoaXMudHlwZVNpbXBsZU5hbWUsIHRoaXMudHlwZVF1YWxpZmljYXRpb24sIGJpbmRpbmcudHlwZSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlcyhCaW5kaW5nKQ0KLSAqLw0KLXB1YmxpYyBib29sZWFuIG1hdGNoZXMoQmluZGluZyBiaW5kaW5nKSB7DQotCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpKSByZXR1cm4gZmFsc2U7DQotDQotCUZpZWxkQmluZGluZyBmaWVsZCA9IChGaWVsZEJpbmRpbmcpYmluZGluZzsNCi0JDQotCS8vIGZpZWxkIG5hbWUNCi0JaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGQucmVhZGFibGVOYW1lKCkpKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkvLyBkZWNsYXJpbmcgdHlwZQ0KLQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0JpbmRpbmcgPSBmaWVsZC5kZWNsYXJpbmdDbGFzczsNCi0JaWYgKGRlY2xhcmluZ0JpbmRpbmcgIT0gbnVsbCANCi0JCSYmICF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdCaW5kaW5nKSkgew0KLQkJCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIGZpZWxkIHR5cGUNCi0JaWYoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy50eXBlU2ltcGxlTmFtZSwgdGhpcy50eXBlUXVhbGlmaWNhdGlvbiwgZmllbGQudHlwZSkpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzQmluYXJ5KE9iamVjdCwgT2JqZWN0KQ0KICAqLw0KIHB1YmxpYyBib29sZWFuIG1hdGNoZXNCaW5hcnkoT2JqZWN0IGJpbmFyeUluZm8sIE9iamVjdCBlbmNsb3NpbmdCaW5hcnlJbmZvKSB7DQpAQCAtMjIyLDM4ICsxNTcsMTA2IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogDQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsNCi0JYnVmZmVyLmFwcGVuZCgiRmllbGREZWNsYXJhdGlvblBhdHRlcm46ICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiRmllbGREZWNsYXJhdGlvblBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkDQogCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7DQogCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpIA0KIAkJYnVmZmVyLmFwcGVuZChkZWNsYXJpbmdTaW1wbGVOYW1lKS5hcHBlbmQoJy4nKTsNCi0JZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqLiIvKm5vbk5MUyovKTsNCisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqLiIpOyAvLyROT04tTkxTLTEkDQogCWlmIChuYW1lID09IG51bGwpIHsNCi0JCWJ1ZmZlci5hcHBlbmQoIioiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWJ1ZmZlci5hcHBlbmQobmFtZSk7DQogCX0NCiAJaWYgKHR5cGVRdWFsaWZpY2F0aW9uICE9IG51bGwpIA0KLQkJYnVmZmVyLmFwcGVuZCgiIC0tPiAiLypub25OTFMqLykuYXBwZW5kKHR5cGVRdWFsaWZpY2F0aW9uKS5hcHBlbmQoJy4nKTsNCi0JZWxzZSBpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiIC0tPiAiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCIgLS0+ICIpLmFwcGVuZCh0eXBlUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7IC8vJE5PTi1OTFMtMSQNCisJZWxzZSBpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiIC0tPiAiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCkgDQogCQlidWZmZXIuYXBwZW5kKHR5cGVTaW1wbGVOYW1lKTsNCi0JZWxzZSBpZiAodHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKiIvKm5vbk5MUyovKTsNCi0JYnVmZmVyLmFwcGVuZCgiLCAiLypub25OTFMqLyk7DQorCWVsc2UgaWYgKHR5cGVRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJA0KKwlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkDQogCXN3aXRjaChtYXRjaE1vZGUpew0KIAkJY2FzZSBFWEFDVF9NQVRDSCA6IA0KLQkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBSRUZJWF9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQQVRURVJOX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KIAlpZiAoaXNDYXNlU2Vuc2l0aXZlKQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCisNCisvKioNCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQ0KKyAqLw0KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KKwlpZiAoIShub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pbm9kZTsNCisNCisJaWYgKHJlc29sdmUpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoZmllbGQuYmluZGluZyk7DQorCX0gZWxzZSB7DQorCQlpZiAoIWZpZWxkLmlzRmllbGQoKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7IC8vIGlnbm9yZSBmaWVsZCBpbml0aWFsaXplcnMNCisJCQ0KKwkJLy8gZmllbGQgbmFtZQ0KKwkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGQubmFtZSkpDQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCQkvLyBmaWVsZCB0eXBlDQorCQlUeXBlUmVmZXJlbmNlIGZpZWxkVHlwZSA9IGZpZWxkLnR5cGU7DQorCQljaGFyW11bXSBmaWVsZFR5cGVOYW1lID0gZmllbGRUeXBlLmdldFR5cGVOYW1lKCk7DQorCQljaGFyW10gc291cmNlTmFtZSA9IHRoaXMudG9BcnJheU5hbWUoDQorCQkJZmllbGRUeXBlTmFtZVtmaWVsZFR5cGVOYW1lLmxlbmd0aC0xXSwgDQorCQkJZmllbGRUeXBlLmRpbWVuc2lvbnMoKSk7DQorCQlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy50eXBlU2ltcGxlTmFtZSwgc291cmNlTmFtZSkpDQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCWludCBsZXZlbDsNCisNCisJRmllbGRCaW5kaW5nIGZpZWxkID0gKEZpZWxkQmluZGluZyliaW5kaW5nOw0KKwkNCisJLy8gZmllbGQgbmFtZQ0KKwlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCBmaWVsZC5yZWFkYWJsZU5hbWUoKSkpDQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisNCisJLy8gZGVjbGFyaW5nIHR5cGUNCisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdCaW5kaW5nID0gZmllbGQuZGVjbGFyaW5nQ2xhc3M7DQorCWlmIChkZWNsYXJpbmdCaW5kaW5nID09IG51bGwgKSB7DQorCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJfSBlbHNlIHsNCisJCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nQmluZGluZyk7DQorCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCX0NCisNCisJLy8gZmllbGQgdHlwZQ0KKwlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMudHlwZVNpbXBsZU5hbWUsIHRoaXMudHlwZVF1YWxpZmljYXRpb24sIGZpZWxkLnR5cGUpOw0KKwlzd2l0Y2ggKG5ld0xldmVsKSB7DQorCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6DQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQljYXNlIEFDQ1VSQVRFX01BVENIOiAvLyBrZWVwIHByZXZpb3VzIGxldmVsDQorCQkJYnJlYWs7DQorCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSA0KKwkJCWxldmVsID0gbmV3TGV2ZWw7DQorCQkJYnJlYWs7DQorCX0NCisJDQorCXJldHVybiBsZXZlbDsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IDI4YjEzMmIuLjQ5OTViZDAgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZFJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMTEyLDkyICsxMTIsNiBAQAogCXJldHVybiBNRVRIT0QgfCBGSUVMRDsNCiB9DQogLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQXN0Tm9kZSwgYm9vbGVhbikNCi0gKi8NCi1wcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQotCWlmIChub2RlIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsNCi0JCXJldHVybiB0aGlzLm1hdGNoZXMoKEZpZWxkUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KLQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7DQotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKChOYW1lUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gZmllbGQgcmVmZXJlbmNlLg0KLSAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQotICovDQotcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoRmllbGRSZWZlcmVuY2UgZmllbGRSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgewkNCi0JLy8gZmllbGQgbmFtZQ0KLQlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCBmaWVsZFJlZi50b2tlbikpDQotCQlyZXR1cm4gZmFsc2U7DQotDQotCWlmIChyZXNvbHZlKSB7DQotCQkvLyByZWNlaXZlciB0eXBlIGFuZCBmaWVsZCB0eXBlDQotCQlGaWVsZEJpbmRpbmcgYmluZGluZyA9IGZpZWxkUmVmLmJpbmRpbmc7DQotCQlpZiAoYmluZGluZyAhPSBudWxsICYmICF0aGlzLm1hdGNoZXMoZmllbGRSZWYucmVjZWl2ZXJUeXBlLCBmaWVsZFJlZi5pc1N1cGVyQWNjZXNzKCksIGJpbmRpbmcpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSByZWZlcmVuY2UuDQotICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCi0gKi8NCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhOYW1lUmVmZXJlbmNlIG5hbWVSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgewkNCi0JLy8gZmllbGQgbmFtZQ0KLQlib29sZWFuIG5hbWVNYXRjaCA9IHRydWU7DQotCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgew0KLQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQotCQkJbmFtZU1hdGNoID0gbWF0Y2hlc05hbWUodGhpcy5uYW1lLCAoKFNpbmdsZU5hbWVSZWZlcmVuY2UpbmFtZVJlZikudG9rZW4pOw0KLQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQ0KLQkJCW5hbWVNYXRjaCA9IGZhbHNlOw0KLQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmOw0KLQkJCWNoYXJbXVtdIHRva2VucyA9IHFOYW1lUmVmLnRva2VuczsNCi0JCQlmb3IgKGludCBpID0gcU5hbWVSZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nLTEsIG1heCA9IHRva2Vucy5sZW5ndGg7IGkgPCBtYXggJiYgIW5hbWVNYXRjaDsgaSsrKXsNCi0JCQkJaWYgKGkgPj0gMCkgbmFtZU1hdGNoID0gbWF0Y2hlc05hbWUodGhpcy5uYW1lLCB0b2tlbnNbaV0pOw0KLQkJCX0NCi0JCX0JCQkJDQotCX0gDQotCWlmICghbmFtZU1hdGNoKSByZXR1cm4gZmFsc2U7DQotDQotCWlmIChyZXNvbHZlKXsJDQotCQlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lUmVmLmJpbmRpbmc7DQotCQlpZiAoYmluZGluZyAhPSBudWxsKXsNCi0JCQlpZiAobmFtZVJlZiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2Upew0KLQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZyl7DQotCQkJCQlpZiAoIXRoaXMubWF0Y2hlcyhuYW1lUmVmLnJlY2VpdmVyVHlwZSwgZmFsc2UsIChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpKXsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIG11c3QgYmUgYSBmaWVsZCBiaW5kaW5nDQotCQkJCX0NCi0JCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQotCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmOw0KLQkJCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUgPSBxTmFtZVJlZi5yZWNlaXZlclR5cGU7DQotCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBudWxsOw0KLQkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nIA0KLQkJCQkJCSYmIG1hdGNoZXNOYW1lKHRoaXMubmFtZSwgKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpYmluZGluZykubmFtZSkgDQotCQkJCQkJJiYgbWF0Y2hlcyhyZWNlaXZlclR5cGUsIGZhbHNlLCBmaWVsZEJpbmRpbmcpKSl7DQotCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZyl7DQotCQkJCQkJcmVjZWl2ZXJUeXBlID0gKChWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLnR5cGU7DQotCQkJCQl9DQotCQkJCQlib29sZWFuIG90aGVyTWF0Y2ggPSBmYWxzZTsNCi0JCQkJCWludCBvdGhlck1heCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsNCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJNYXggJiYgIW90aGVyTWF0Y2g7IGkrKyl7DQotCQkJCQkJRmllbGRCaW5kaW5nIG90aGVyQmluZGluZyA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3NbaV07DQotCQkJCQkJaWYgKG90aGVyQmluZGluZyA9PSBudWxsKSBicmVhazsNCi0JCQkJCQlvdGhlck1hdGNoID0gbWF0Y2hlc05hbWUodGhpcy5uYW1lLCBvdGhlckJpbmRpbmcubmFtZSkgJiYgbWF0Y2hlcyhyZWNlaXZlclR5cGUsIGZhbHNlLCBvdGhlckJpbmRpbmcpOw0KLQkJCQkJCXJlY2VpdmVyVHlwZSA9IG90aGVyQmluZGluZy50eXBlOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKCFvdGhlck1hdGNoKSByZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaEluZGV4RW50cnkNCiAgKi8NCiBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7DQpAQCAtMjI0LDI1ICsxMzgsNiBAQAogCXJldHVybiB0cnVlOw0KIH0NCiAvKioNCi0gKiBGaW5kcyBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gYXN0IG5vZGUgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLg0KLSAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0Lg0KLSAqIFJldHVybnMgVFJVU1RFRF9NQVRDSCBpZiBpdCBtYXRjaGVzIGV4YWN0bHkgdGhpcyBzZWFyY2ggcGF0dGVybiAoaWUuIA0KLSAqIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSByZXNvbHZlZCBvciBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLikNCi0gKiBSZXR1cm5zIFBPU1NJQkxFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IG1hdGNoZXMgDQotICogdGhpcyBzZWFyY2ggcGF0dGVybiBhbmQgaXQgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uDQotICovDQotcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSkgew0KLQlpZiAodGhpcy5tYXRjaGVzKG5vZGUsIGZhbHNlKSkgew0KLQkJaWYgKHRoaXMubmVlZHNSZXNvbHZlIA0KLQkJCXx8IG5vZGUgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7IC8vIGVuc3VyZSBpdCBpcyBhIGZpZWxkDQotCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXR1cm4gVFJVU1RFRF9NQVRDSDsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCi19DQotLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0UmVmZXJlbmNlDQogICovDQogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQXN0Tm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQpAQCAtMjcyLDM4ICsxNjcsMzggQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiANCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KLQlidWZmZXIuYXBwZW5kKCJGaWVsZFJlZmVyZW5jZVBhdHRlcm46ICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiRmllbGRSZWZlcmVuY2VQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOw0KIAlpZiAoZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKSANCiAJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSkuYXBwZW5kKCcuJyk7DQotCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKi4iLypub25OTFMqLyk7DQorCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKi4iKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAobmFtZSAhPSBudWxsKSB7DQogCQlidWZmZXIuYXBwZW5kKG5hbWUpOw0KIAl9IGVsc2Ugew0KLQkJYnVmZmVyLmFwcGVuZCgiKiIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJA0KIAl9DQogCWlmICh0eXBlUXVhbGlmaWNhdGlvbiAhPSBudWxsKSANCi0JCWJ1ZmZlci5hcHBlbmQoIiAtLT4gIi8qbm9uTkxTKi8pLmFwcGVuZCh0eXBlUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7DQotCWVsc2UgaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIiAtLT4gIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIC0tPiAiKS5hcHBlbmQodHlwZVF1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOyAvLyROT04tTkxTLTEkDQorCWVsc2UgaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIiAtLT4gIik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwpIA0KIAkJYnVmZmVyLmFwcGVuZCh0eXBlU2ltcGxlTmFtZSk7DQotCWVsc2UgaWYgKHR5cGVRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIioiLypub25OTFMqLyk7DQotCWJ1ZmZlci5hcHBlbmQoIiwgIi8qbm9uTkxTKi8pOw0KKwllbHNlIGlmICh0eXBlUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQNCisJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2gobWF0Y2hNb2RlKXsNCiAJCWNhc2UgRVhBQ1RfTUFUQ0ggOiANCi0JCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQUkVGSVhfTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUEFUVEVSTl9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCiAJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogDQpAQCAtMzEzLDI0ICsyMDgsMTMwIEBACiB9DQogDQogLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgew0KKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoRmllbGRSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQorCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKE5hbWVSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQorCX0NCisJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorfQ0KKw0KKy8qKg0KKyAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIGZpZWxkIHJlZmVyZW5jZS4NCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KKyAqLw0KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoRmllbGRSZWZlcmVuY2UgZmllbGRSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgewkNCisJLy8gZmllbGQgbmFtZQ0KKwlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCBmaWVsZFJlZi50b2tlbikpDQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisNCisJaWYgKHJlc29sdmUpIHsNCisJCS8vIHJlY2VpdmVyIHR5cGUgYW5kIGZpZWxkIHR5cGUNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoZmllbGRSZWYucmVjZWl2ZXJUeXBlLCBmaWVsZFJlZi5pc1N1cGVyQWNjZXNzKCksIGZpZWxkUmVmLmJpbmRpbmcpOw0KKwl9IGVsc2Ugew0KKwkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwl9DQorfQ0KKw0KKy8qKg0KKyAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgcmVmZXJlbmNlLg0KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQorICovDQorcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChOYW1lUmVmZXJlbmNlIG5hbWVSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgewkNCisJLy8gZmllbGQgbmFtZQ0KKwlib29sZWFuIG5hbWVNYXRjaCA9IHRydWU7DQorCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgew0KKwkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQorCQkJbmFtZU1hdGNoID0gdGhpcy5tYXRjaGVzTmFtZSh0aGlzLm5hbWUsICgoU2luZ2xlTmFtZVJlZmVyZW5jZSluYW1lUmVmKS50b2tlbik7DQorCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQorCQkJbmFtZU1hdGNoID0gZmFsc2U7DQorCQkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKW5hbWVSZWY7DQorCQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOw0KKwkJCWZvciAoaW50IGkgPSBxTmFtZVJlZi5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmctMSwgbWF4ID0gdG9rZW5zLmxlbmd0aDsgaSA8IG1heCAmJiAhbmFtZU1hdGNoOyBpKyspew0KKwkJCQlpZiAoaSA+PSAwKSBuYW1lTWF0Y2ggPSB0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgdG9rZW5zW2ldKTsNCisJCQl9DQorCQl9CQkJCQ0KKwl9IA0KKwlpZiAoIW5hbWVNYXRjaCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCWlmIChyZXNvbHZlKSB7CQ0KKwkJQmluZGluZyBiaW5kaW5nID0gbmFtZVJlZi5iaW5kaW5nOw0KKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgew0KKwkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAobmFtZVJlZiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2Upew0KKwkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZyl7DQorCQkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKG5hbWVSZWYucmVjZWl2ZXJUeXBlLCBmYWxzZSwgKEZpZWxkQmluZGluZykgYmluZGluZyk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsgLy8gbXVzdCBiZSBhIGZpZWxkIGJpbmRpbmcNCisJCQkJfQ0KKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UNCisJCQkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKW5hbWVSZWY7DQorCQkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IHFOYW1lUmVmLnJlY2VpdmVyVHlwZTsNCisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IG51bGw7DQorCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nICYmIHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCAoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZyliaW5kaW5nKS5uYW1lKSkgew0KKwkJCQkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChyZWNlaXZlclR5cGUsIGZhbHNlLCBmaWVsZEJpbmRpbmcpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBWYXJpYWJsZUJpbmRpbmcpew0KKwkJCQkJCXJlY2VpdmVyVHlwZSA9ICgoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS50eXBlOw0KKwkJCQkJfQ0KKwkJCQkJaW50IG90aGVyTGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQkJaW50IG90aGVyTWF4ID0gcU5hbWVSZWYub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHFOYW1lUmVmLm90aGVyQmluZGluZ3MubGVuZ3RoOw0KKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlck1heCAmJiAob3RoZXJMZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKTsgaSsrKXsNCisJCQkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gcU5hbWVSZWYub3RoZXJCaW5kaW5nc1tpXTsNCisJCQkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLm5hbWUsIG90aGVyQmluZGluZy5uYW1lKSkgew0KKwkJCQkJCQlvdGhlckxldmVsID0gdGhpcy5tYXRjaExldmVsKHJlY2VpdmVyVHlwZSwgZmFsc2UsIG90aGVyQmluZGluZyk7DQorCQkJCQkJfQ0KKwkJCQkJCXJlY2VpdmVyVHlwZSA9IG90aGVyQmluZGluZy50eXBlOw0KKwkJCQkJfQ0KKwkJCQkJcmV0dXJuIG90aGVyTGV2ZWw7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0gZWxzZSB7DQorCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gZmllbGQgYmluZGluZyBhbmQgcmVjZWl2ZXIgdHlwZS4NCiAgKi8NCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIGJvb2xlYW4gaXNTdXBlckFjY2VzcywgRmllbGRCaW5kaW5nIGJpbmRpbmcpIHsNCitwcml2YXRlIGludCBtYXRjaExldmVsKFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgYm9vbGVhbiBpc1N1cGVyQWNjZXNzLCBGaWVsZEJpbmRpbmcgYmluZGluZykgew0KKwlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwgfHwgYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJaW50IGxldmVsOw0KKwkNCiAJLy8gcmVjZWl2ZXIgdHlwZQ0KIAlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyQmluZGluZyA9IA0KIAkJaXNTdXBlckFjY2VzcyB8fCBiaW5kaW5nLmlzU3RhdGljKCkgPyANCiAJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzIDogDQogCQkJKFJlZmVyZW5jZUJpbmRpbmcpcmVjZWl2ZXJUeXBlOw0KLQlpZiAocmVjZWl2ZXJCaW5kaW5nICE9IG51bGwgDQotCQkmJiAhdGhpcy5tYXRjaGVzQXNTdWJ0eXBlKHJlY2VpdmVyQmluZGluZywgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pDQotCQkmJiAhdGhpcy5tYXRjaGVzVHlwZSh0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzLCByZWNlaXZlckJpbmRpbmcpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KKwlpZiAocmVjZWl2ZXJCaW5kaW5nID09IG51bGwpIHsNCisJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwl9IGVsc2Ugew0KKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxBc1N1YnR5cGUocmVjZWl2ZXJCaW5kaW5nLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7DQorCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzLCByZWNlaXZlckJpbmRpbmcpOw0KKwkJCWlmIChsZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7DQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCX0NCisJCX0NCiAJfQ0KIA0KIAkvLyBmaWVsZCB0eXBlDQotCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0aGlzLnR5cGVTaW1wbGVOYW1lLCB0aGlzLnR5cGVRdWFsaWZpY2F0aW9uLCBiaW5kaW5nLnR5cGUpKQ0KLQkJcmV0dXJuIGZhbHNlOw0KKwlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMudHlwZVNpbXBsZU5hbWUsIHRoaXMudHlwZVF1YWxpZmljYXRpb24sIGJpbmRpbmcudHlwZSk7DQorCXN3aXRjaCAobmV3TGV2ZWwpIHsNCisJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJbGV2ZWwgPSBuZXdMZXZlbDsNCisJCQlicmVhazsNCisJfQ0KIA0KLQlyZXR1cm4gdHJ1ZTsNCisJcmV0dXJuIGxldmVsOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEKaW5kZXggODkyYmNhYy4uMzMyNzBkNSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiANCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yOw0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7DQogDQogLyoqDQogICogTG9jYXRlIG1hdGNoZXMgaW4gY29tcGlsYXRpb24gdW5pdHMuDQpAQCAtNTEsNzI3ICs1Miw3MDkgQEAKIAlwdWJsaWMgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yOw0KIAlwdWJsaWMgSUphdmFTZWFyY2hTY29wZSBzY29wZTsNCiANCi0JcHJpdmF0ZSBNYXRjaExvY2F0b3JQYXJzZXIgcGFyc2VyOw0KLQlwcml2YXRlIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50Ow0KLQlwcml2YXRlIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7DQotCXByaXZhdGUgT3BlbmFibGUgY3VycmVudE9wZW5hYmxlOw0KLXB1YmxpYyBNYXRjaExvY2F0b3IoDQotCVNlYXJjaFBhdHRlcm4gcGF0dGVybiwNCi0JaW50IGRldGFpbExldmVsLA0KLQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsIA0KLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7DQotCQkNCi0JdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsNCi0JdGhpcy5kZXRhaWxMZXZlbCA9IGRldGFpbExldmVsOw0KLQl0aGlzLmNvbGxlY3RvciA9IGNvbGxlY3RvcjsNCi0JdGhpcy5zY29wZSA9IHNjb3BlOw0KLX0NCi0vKioNCi0gKiBBZGQgYW4gYWRkaXRpb25hbCBiaW5hcnkgdHlwZQ0KLSAqLw0KLXB1YmxpYyB2b2lkIGFjY2VwdChJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KLQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsNCi19DQotLyoqDQotICogQWRkIGFuIGFkZGl0aW9uYWwgY29tcGlsYXRpb24gdW5pdC4NCi0gKi8NCi1wdWJsaWMgdm9pZCBhY2NlcHQoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KSB7DQotCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAxLCAxKTsNCi0JQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHRoaXMucGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCByZXN1bHQpOw0KKwlwdWJsaWMgTWF0Y2hMb2NhdG9yUGFyc2VyIHBhcnNlcjsNCisJcHVibGljIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50Ow0KKwlwdWJsaWMgSGFzaHRhYmxlT2ZPYmplY3QgcGFyc2VkVW5pdHM7DQorCXByaXZhdGUgUG90ZW50aWFsTWF0Y2hbXSBwb3RlbnRpYWxNYXRjaGVzOw0KKwlwcml2YXRlIGludCBwb3RlbnRpYWxNYXRjaGVzSW5kZXg7DQorCXByaXZhdGUgaW50IHBvdGVudGlhbE1hdGNoZXNMZW5ndGg7DQogDQotCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7DQotCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgdHJ1ZSk7DQotfQ0KLS8qKg0KLSAqIEFkZCBhbiBhZGRpdGlvbmFsIHNvdXJjZSB0eXBlDQotICovDQotcHVibGljIHZvaWQgYWNjZXB0KElTb3VyY2VUeXBlIHNvdXJjZVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7DQotCXdoaWxlIChzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKSAhPSBudWxsKSBzb3VyY2VUeXBlID0gc291cmNlVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCk7DQotCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlLmdldEZpbGVOYW1lKCksIDEsIDEpOyAvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzDQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQ0KLQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLCB0cnVlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7DQorCXB1YmxpYyBNYXRjaExvY2F0b3IoDQorCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sDQorCQlpbnQgZGV0YWlsTGV2ZWwsDQorCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsDQorCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7DQogDQotCWlmICh1bml0ICE9IG51bGwpIHsNCi0JCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7DQotCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOw0KLQl9DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYW4gSUZpZWxkIGZyb20gdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCBzaW1wbGUgdHlwZSBuYW1lcy4gDQotICovDQotcHJpdmF0ZSBJRmllbGQgY3JlYXRlRmllbGRIYW5kbGUoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMpIHsNCi0JSVR5cGUgdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZShkZWZpbmluZ1R5cGVOYW1lcyk7DQotCXJldHVybiB0eXBlLmdldEZpZWxkKG5ldyBTdHJpbmcoZmllbGQubmFtZSkpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGFuIElJbXBvcnREZWNsYXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBpbXBvcnQgc3RhdGVtZW50DQotICovDQotcHJpdmF0ZSBJSW1wb3J0RGVjbGFyYXRpb24gY3JlYXRlSW1wb3J0SGFuZGxlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYpIHsNCi0JY2hhcltdIGltcG9ydE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmLmdldEltcG9ydE5hbWUoKSwgJy4nKTsNCi0JaWYgKGltcG9ydFJlZi5vbkRlbWFuZCkgew0KLQkJaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGltcG9ydE5hbWUsICIuKiIvKm5vbk5MUyovLnRvQ2hhckFycmF5KCkpOw0KLQl9DQotCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdCl0aGlzLmN1cnJlbnRPcGVuYWJsZSkuZ2V0SW1wb3J0KA0KLQkJCW5ldyBTdHJpbmcoaW1wb3J0TmFtZSkpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGFuIElJbml0aWFsaXplciBmcm9tIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiBhbmQgc2ltcGxlIHR5cGUgbmFtZXMuIA0KLSAqLw0KLXByaXZhdGUgSUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVySGFuZGxlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgRmllbGREZWNsYXJhdGlvbiBpbml0aWFsaXplciwgY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMpIHsNCi0JSVR5cGUgdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZShkZWZpbmluZ1R5cGVOYW1lcyk7DQotDQotCS8vIGZpbmQgb2NjdXJlbmNlIGNvdW50IG9mIHRoZSBnaXZlbiBpbml0aWFsaXplciBpbiBpdHMgdHlwZSBkZWNsYXJhdGlvbg0KLQlpbnQgb2NjdXJyZW5jZUNvdW50ID0gMDsNCi0JRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsLmZpZWxkczsNCi0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsNCi0JCWlmICghZmllbGQuaXNGaWVsZCgpKSB7DQotCQkJb2NjdXJyZW5jZUNvdW50Kys7DQotCQkJaWYgKGZpZWxkLmVxdWFscyhpbml0aWFsaXplcikpIHsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KKwkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsNCisJCXRoaXMuZGV0YWlsTGV2ZWwgPSBkZXRhaWxMZXZlbDsNCisJCXRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOw0KKwkJdGhpcy5zY29wZSA9IHNjb3BlOw0KIAl9DQogCQ0KLQlyZXR1cm4gdHlwZS5nZXRJbml0aWFsaXplcihvY2N1cnJlbmNlQ291bnQpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGFuIElNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCBzaW1wbGUgdHlwZSBuYW1lcy4gDQotICovDQotcHJpdmF0ZSBJTWV0aG9kIGNyZWF0ZU1ldGhvZEhhbmRsZShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMpIHsNCi0JSVR5cGUgdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZShkZWZpbmluZ1R5cGVOYW1lcyk7DQotCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kLmFyZ3VtZW50czsNCi0JaW50IGxlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7DQotCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQlUeXBlUmVmZXJlbmNlIHBhcmFtZXRlclR5cGUgPSBhcmd1bWVudHNbaV0udHlwZTsNCi0JCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYXJhbWV0ZXJUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7DQotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtZXRlclR5cGUuZGltZW5zaW9ucygpOyBqKyspIHsNCi0JCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHR5cGVOYW1lLCAiW10iLypub25OTFMqLy50b0NoYXJBcnJheSgpKTsNCi0JCX0NCi0JCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGZhbHNlKTsNCisJLyoqDQorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsNCisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcpOw0KIAl9DQotCXJldHVybiB0eXBlLmdldE1ldGhvZCgNCi0JCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgDQotCQlwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyk7DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYW4gSVR5cGUgZnJvbSB0aGUgZ2l2ZW4gc2ltcGxlIHR5cGUgbmFtZXMuIA0KLSAqLw0KLXByaXZhdGUgSVR5cGUgY3JlYXRlVHlwZUhhbmRsZShjaGFyW11bXSBzaW1wbGVUeXBlTmFtZXMpIHsNCi0JLy8gY3JlYXRlcyBjb21waWxhdGlvbiB1bml0DQotCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5jdXJyZW50T3BlbmFibGU7DQogDQotCS8vIGNyZWF0ZSB0eXBlDQotCWludCBsZW5ndGggPSBzaW1wbGVUeXBlTmFtZXMubGVuZ3RoOw0KLQlJVHlwZSB0eXBlID0gdW5pdC5nZXRUeXBlKG5ldyBTdHJpbmcoc2ltcGxlVHlwZU5hbWVzWzBdKSk7DQotCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCXR5cGUgPSB0eXBlLmdldFR5cGUobmV3IFN0cmluZyhzaW1wbGVUeXBlTmFtZXNbaV0pKTsNCisJLyoqDQorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uIHVuaXQuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KSB7DQorCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMSwgMSk7DQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0NCisJCQl0aGlzLnBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgcmVzdWx0KTsNCisNCisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7DQorCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOw0KIAl9DQotCXJldHVybiB0eXBlOw0KLX0NCi1wcml2YXRlIGNoYXJbXSBnZXRDb250ZW50cyhJRmlsZSBmaWxlKSB7DQotCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOw0KLQl0cnkgew0KLQkJaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaWxlLmdldENvbnRlbnRzKHRydWUpKTsNCi0JCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWludCBuZXh0Q2hhciA9IGlucHV0LnJlYWQoKTsNCi0JCXdoaWxlIChuZXh0Q2hhciAhPSAtMSkgew0KLQkJCWJ1ZmZlci5hcHBlbmQoIChjaGFyKW5leHRDaGFyICk7DQotCQkJbmV4dENoYXIgPSBpbnB1dC5yZWFkKCk7DQotCQl9DQotCQlpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOw0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07DQotCQlidWZmZXIuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCByZXN1bHQsIDApOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0gZmluYWxseSB7DQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgew0KKw0KKwkvKioNCisJICogQWRkIGFuIGFkZGl0aW9uYWwgc291cmNlIHR5cGUNCisJICovDQorCXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgew0KKwkJSVNvdXJjZVR5cGUgc291cmNlVHlwZSA9IHNvdXJjZVR5cGVzWzBdOw0KKwkJd2hpbGUgKHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpDQorCQkJc291cmNlVHlwZSA9IHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOw0KKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdDsNCisJCWlmIChzb3VyY2VUeXBlIGluc3RhbmNlb2YgU291cmNlVHlwZUVsZW1lbnRJbmZvKSB7DQorCQkJLy8gZ2V0IHNvdXJjZQ0KKwkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBlbGVtZW50SW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pIHNvdXJjZVR5cGU7DQorCQkJSVR5cGUgdHlwZSA9IGVsZW1lbnRJbmZvLmdldEhhbmRsZSgpOw0KIAkJCXRyeSB7DQotCQkJCWlucHV0LmNsb3NlKCk7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBjbG9zZWQNCi0JCQl9DQotCQl9DQotCX0NCi19DQotcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRDdXJyZW50UmVzb3VyY2UoKSB7DQotCXJldHVybiB0aGlzLmN1cnJlbnRSZXNvdXJjZTsNCi19DQotcHJvdGVjdGVkIFNjYW5uZXIgZ2V0U2Nhbm5lcigpIHsNCi0JcmV0dXJuIHRoaXMucGFyc2VyID09IG51bGwgPyBudWxsIDogdGhpcy5wYXJzZXIuc2Nhbm5lcjsNCi19DQotLyoqDQotICogTG9jYXRlIHRoZSBtYXRjaGVzIGluIHRoZSBnaXZlbiBmaWxlcyBhbmQgcmVwb3J0IHRoZW0gdXNpbmcgdGhlIHNlYXJjaCByZXF1ZXN0b3IuIA0KLSAqLw0KLXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU3RyaW5nW10gZmlsZVBhdGhzLCBJV29ya3NwYWNlIHdvcmtzcGFjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCVV0aWwuc29ydChmaWxlUGF0aHMpOyAvLyBzb3J0IGJ5IHByb2plY3RzDQotCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOw0KLQlIYW5kbGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSGFuZGxlRmFjdG9yeSh3b3Jrc3BhY2UuZ2V0Um9vdCgpLCBtYW5hZ2VyKTsNCi0JSmF2YVByb2plY3QgcHJldmlvdXNKYXZhUHJvamVjdCA9IG51bGw7DQotCWludCBsZW5ndGggPSBmaWxlUGF0aHMubGVuZ3RoOw0KLQlkb3VibGUgaW5jcmVtZW50ID0gMTAwLjAgLyBsZW5ndGg7DQotCWRvdWJsZSB0b3RhbFdvcmsgPSAwOw0KLQlpbnQgbGFzdFByb2dyZXNzID0gMDsNCi0JYm9vbGVhbiBjb3VsZEluaXRpYWxpemVQYXR0ZXJuID0gZmFsc2U7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IHRoaXMuY29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpOw0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBmaWxlUGF0aHNbaV07DQotCQl0aGlzLmN1cnJlbnRPcGVuYWJsZSA9IGZhY3RvcnkuY3JlYXRlT3BlbmFibGUocGF0aFN0cmluZyk7DQotCQlpZiAodGhpcy5jdXJyZW50T3BlbmFibGUgPT0gbnVsbCkgY29udGludWU7ICAvLyBtYXRjaCBpcyBvdXRzaWRlIGNsYXNzcGF0aA0KKwkJCQlmaW5hbCBJRmlsZSBmaWxlID0gKElGaWxlKSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOw0KKwkJCQlmaW5hbCBjaGFyW10gc291cmNlID0gUG90ZW50aWFsTWF0Y2guZ2V0Q29udGVudHMoZmlsZSk7DQogDQotCQkvLyBjcmVhdGUgbmV3IHBhcnNlciBhbmQgbG9va3VwIGVudmlyb25tZW50IGlmIHRoaXMgaXMgYSBuZXcgcHJvamVjdA0KLQkJdHJ5IHsNCi0JCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCl0aGlzLmN1cnJlbnRPcGVuYWJsZS5nZXRKYXZhUHJvamVjdCgpOw0KLQkJCXRoaXMuY3VycmVudFJlc291cmNlID0gdGhpcy5jdXJyZW50T3BlbmFibGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7DQotCQkJaWYgKHRoaXMuY3VycmVudFJlc291cmNlID09IG51bGwpIHsgLy8gY2FzZSBvZiBhIGZpbGUgaW4gYW4gZXh0ZXJuYWwgamFyDQotCQkJCXRoaXMuY3VycmVudFJlc291cmNlID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOw0KLQkJCX0NCi0JCQlpZiAoIWphdmFQcm9qZWN0LmVxdWFscyhwcmV2aW91c0phdmFQcm9qZWN0KSkgew0KLQkJCQkvLyBjcmVhdGUgcGFyc2VyIGZvciB0aGlzIHByb2plY3QNCi0JCQkJY291bGRJbml0aWFsaXplUGF0dGVybiA9IHRoaXMuY3JlYXRlUGFyc2VyKGphdmFQcm9qZWN0KTsNCi0JCQkJcHJldmlvdXNKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0Ow0KLQkJCX0NCi0JCQlpZiAoIWNvdWxkSW5pdGlhbGl6ZVBhdHRlcm4pIGNvbnRpbnVlOyAvLyB0aGUgcGF0dGVybiBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQ6IHRoZSBtYXRjaCBjYW5ub3QgYmUgaW4gdGhpcyBwcm9qZWN0DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCS8vIGZpbGUgZG9lc24ndCBleGlzdCAtPiBza2lwIGl0DQotCQkJY29udGludWU7DQotCQl9DQorCQkJCS8vIGdldCBtYWluIHR5cGUgbmFtZQ0KKwkJCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsNCisJCQkJZmluYWwgY2hhcltdIG1haW5UeXBlTmFtZSA9DQorCQkJCQlmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSA1KS50b0NoYXJBcnJheSgpOw0KIA0KLQkJLy8gbG9jYXRlIG1hdGNoZXMgaW4gY3VycmVudCBmaWxlIGFuZCByZXBvcnQgdGhlbQ0KLQkJdHJ5IHsNCi0JCQlpZiAodGhpcy5jdXJyZW50T3BlbmFibGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsNCi0JCQkJdGhpcy5sb2NhdGVNYXRjaGVzSW5Db21waWxhdGlvblVuaXQoKTsNCi0JCQl9IGVsc2UgaWYgKHRoaXMuY3VycmVudE9wZW5hYmxlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKSB7DQotCQkJCXRoaXMubG9jYXRlTWF0Y2hlc0luQ2xhc3NGaWxlKCk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQotCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGg6IGl0IGNvdWxkIG5vdCBmaW5kIGJhc2UgY2xhc3Nlcw0KLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5CVUlMREVSX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pZTsNCi0JCQl9IGVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQl0b3RhbFdvcmsgPSB0b3RhbFdvcmsgKyBpbmNyZW1lbnQ7DQotCQkJaW50IHdvcmtlZCA9IChpbnQpdG90YWxXb3JrIC0gbGFzdFByb2dyZXNzOw0KLQkJCW1vbml0b3Iud29ya2VkKHdvcmtlZCk7DQotCQkJbGFzdFByb2dyZXNzID0gKGludCl0b3RhbFdvcms7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogTG9jYXRlIGRlY2xhcmF0aW9uIGluIHRoZSBjdXJyZW50IGNsYXNzIGZpbGUuIFRoaXMgY2xhc3MgZmlsZSBpcyBhbHdheXMgaW4gYSBqYXIuDQotICovDQotcHJpdmF0ZSB2b2lkIGxvY2F0ZU1hdGNoZXNJbkNsYXNzRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUgY2xhc3NGaWxlID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSl0aGlzLmN1cnJlbnRPcGVuYWJsZTsNCi0JQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKEJpbmFyeVR5cGUpY2xhc3NGaWxlLmdldFR5cGUoKTsNCi0JSUJpbmFyeVR5cGUgaW5mbzsNCi0JaWYgKGNsYXNzRmlsZS5pc09wZW4oKSkgew0KLQkJLy8gcmV1c2UgdGhlIGluZm8gZnJvbSB0aGUgamF2YSBtb2RlbCBjYWNoZQ0KLQkJaW5mbyA9IChJQmluYXJ5VHlwZSliaW5hcnlUeXBlLmdldFJhd0luZm8oKTsNCi0JfSBlbHNlIHsNCi0JCS8vIGNyZWF0ZSBhIHRlbXBvcmFyeSBpbmZvDQotCQl0cnkgew0KLQkJCUlKYXZhRWxlbWVudCBwa2cgPSBjbGFzc0ZpbGUuZ2V0UGFyZW50KCk7DQotCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpcGtnLmdldFBhcmVudCgpOw0KLQkJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7DQotCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBqYXINCi0JCQkJU3RyaW5nIHBrZ1BhdGggPSBwa2cuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsNCi0JCQkJU3RyaW5nIGNsYXNzRmlsZVBhdGggPSANCi0JCQkJCShwa2dQYXRoLmxlbmd0aCgpID4gMCkgPw0KLQkJCQkJCXBrZ1BhdGggKyAiLyIvKm5vbk5MUyovICsgY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCkgOg0KLQkJCQkJCWNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJemlwRmlsZSA9ICgoSmFyUGFja2FnZUZyYWdtZW50Um9vdClyb290KS5nZXRKYXIoKTsNCi0JCQkJCWluZm8gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyLnJlYWQoDQotCQkJCQkJemlwRmlsZSwNCi0JCQkJCQljbGFzc0ZpbGVQYXRoKTsNCi0JCQkJfSBmaW5hbGx5IHsNCi0JCQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQl6aXBGaWxlLmNsb3NlKCk7DQotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCQkvLyBpZ25vcmUgDQotCQkJCQkJfQ0KKwkJCQkvLyBzb3VyY2UgdW5pdA0KKwkJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsNCisJCQkJCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7DQorCQkJCQkJcmV0dXJuIHNvdXJjZTsNCiAJCQkJCX0NCi0JCQkJfQ0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBkaXJlY3RvcnkNCi0JCQkJU3RyaW5nIG9zUGF0aCA9IHRoaXMuY3VycmVudFJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOw0KLQkJCQlpbmZvID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlci5yZWFkKG9zUGF0aCk7DQotCQkJfQ0KLQkJfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCXJldHVybjsNCi0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOw0KLQkJfQ0KLQkJDQotCX0NCi0NCi0JLy8gY2hlY2sgY2xhc3MgZGVmaW5pdGlvbg0KLQlpZiAodGhpcy5wYXR0ZXJuLm1hdGNoZXNCaW5hcnkoaW5mbywgbnVsbCkpIHsNCi0JCXRoaXMucmVwb3J0QmluYXJ5TWF0Y2goYmluYXJ5VHlwZSwgaW5mbywgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0gpOw0KLQl9DQotDQotCWJvb2xlYW4gY29tcGlsYXRpb25BYm9ydGVkID0gZmFsc2U7DQotCWlmICh0aGlzLnBhdHRlcm4ubmVlZHNSZXNvbHZlKSB7DQotCQkvLyByZXNvbHZlDQotCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJYmluZGluZyA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGluZm8pOw0KLQkJCWlmIChiaW5kaW5nID09IG51bGwpIHsgLy8gaXQgd2FzIGFscmVhZHkgY2FjaGVkIGFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgcXVlcnkNCi0JCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgYmluYXJ5VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpKTsNCi0JCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC5nZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7DQotCQkJCWlmIChyZWZlcmVuY2VCaW5kaW5nICE9IG51bGwgJiYgKHJlZmVyZW5jZUJpbmRpbmcgaW5zdGFuY2VvZiBCaW5hcnlUeXBlQmluZGluZykpIHsNCi0JCQkJCS8vIGlmIHRoZSBiaW5kaW5nIGNvdWxkIGJlIGZvdW5kIGFuZCBpZiBpdCBjb21lcyBmcm9tIGEgc291cmNlIHR5cGUsDQotCQkJCQliaW5kaW5nID0gKEJpbmFyeVR5cGVCaW5kaW5nKXJlZmVyZW5jZUJpbmRpbmc7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gY2hlY2sgbWV0aG9kcw0KLQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsNCi0JCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBiaW5kaW5nLm1ldGhvZHMoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07DQotCQkJCQlpZiAodGhpcy5wYXR0ZXJuLm1hdGNoZXMobWV0aG9kKSkgew0KLQkJCQkJCUlNZXRob2QgbWV0aG9kSGFuZGxlID0gDQotCQkJCQkJCWJpbmFyeVR5cGUuZ2V0TWV0aG9kKA0KLQkJCQkJCQkJbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gYmluZGluZy5jb21wb3VuZE5hbWVbYmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoLTFdIDogbWV0aG9kLnNlbGVjdG9yKSwNCi0JCQkJCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKG1ldGhvZC5zaWduYXR1cmUoKSkucmVwbGFjZSgnLycsICcuJykpDQotCQkJCQkJCSk7DQotCQkJCQkJdGhpcy5yZXBvcnRCaW5hcnlNYXRjaChtZXRob2RIYW5kbGUsIGluZm8sIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsNCisJCQkJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7DQorCQkJCQkJcmV0dXJuIGZpbGVOYW1lLnRvQ2hhckFycmF5KCk7DQogCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkNCi0JCQkvLyBjaGVjayBmaWVsZHMNCi0JCQlpZiAoYmluZGluZyAhPSBudWxsKSB7DQotCQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IGJpbmRpbmcuZmllbGRzKCk7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbaV07DQotCQkJCQlpZiAodGhpcy5wYXR0ZXJuLm1hdGNoZXMoZmllbGQpKSB7DQotCQkJCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkLm5hbWUpKTsNCi0JCQkJCQl0aGlzLnJlcG9ydEJpbmFyeU1hdGNoKGZpZWxkSGFuZGxlLCBpbmZvLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7DQorCQkJCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsNCisJCQkJCQlyZXR1cm4gbWFpblR5cGVOYW1lOw0KIAkJCQkJfQ0KKwkJCQl9Ow0KKw0KKwkJCQkvLyBkaWV0IHBhcnNlDQorCQkJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDApOw0KKwkJCQl1bml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsNCisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KKwkJCQl1bml0ID0gbnVsbDsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9DQorCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlLmdldEZpbGVOYW1lKCksIDAsIDApOw0KKwkJCXVuaXQgPQ0KKwkJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KA0KKwkJCQkJc291cmNlVHlwZXMsDQorCQkJCQl0cnVlLA0KKwkJCQkJdHJ1ZSwNCisJCQkJCWxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwNCisJCQkJCXJlc3VsdCk7DQorCQl9DQorDQorCQlpZiAodW5pdCAhPSBudWxsKSB7DQorCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0KTsNCisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOw0KKwkJCXRoaXMucGFyc2VkVW5pdHMucHV0KHNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCB1bml0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBJRmllbGQgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHNpbXBsZSB0eXBlIG5hbWVzLiANCisJICovDQorCXByaXZhdGUgSUZpZWxkIGNyZWF0ZUZpZWxkSGFuZGxlKA0KKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCwNCisJCWNoYXJbXVtdIGRlZmluaW5nVHlwZU5hbWVzKSB7DQorCQlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKGRlZmluaW5nVHlwZU5hbWVzKTsNCisJCXJldHVybiB0eXBlLmdldEZpZWxkKG5ldyBTdHJpbmcoZmllbGQubmFtZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIElJbXBvcnREZWNsYXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBpbXBvcnQgc3RhdGVtZW50DQorCSAqLw0KKwlwcml2YXRlIElJbXBvcnREZWNsYXJhdGlvbiBjcmVhdGVJbXBvcnRIYW5kbGUoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgew0KKwkJY2hhcltdIGltcG9ydE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmLmdldEltcG9ydE5hbWUoKSwgJy4nKTsNCisJCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsNCisJCQlpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoaW1wb3J0TmFtZSwgIi4qIiAudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXRDdXJyZW50T3BlbmFibGUoKSkuZ2V0SW1wb3J0KA0KKwkJCW5ldyBTdHJpbmcoaW1wb3J0TmFtZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIElJbml0aWFsaXplciBmcm9tIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiBhbmQgc2ltcGxlIHR5cGUgbmFtZXMuIA0KKwkgKi8NCisJcHJpdmF0ZSBJSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXJIYW5kbGUoDQorCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wsDQorCQlGaWVsZERlY2xhcmF0aW9uIGluaXRpYWxpemVyLA0KKwkJY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMpIHsNCisJCUlUeXBlIHR5cGUgPSB0aGlzLmNyZWF0ZVR5cGVIYW5kbGUoZGVmaW5pbmdUeXBlTmFtZXMpOw0KKw0KKwkJLy8gZmluZCBvY2N1cmVuY2UgY291bnQgb2YgdGhlIGdpdmVuIGluaXRpYWxpemVyIGluIGl0cyB0eXBlIGRlY2xhcmF0aW9uDQorCQlpbnQgb2NjdXJyZW5jZUNvdW50ID0gMDsNCisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbC5maWVsZHM7DQorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsNCisJCQlpZiAoIWZpZWxkLmlzRmllbGQoKSkgew0KKwkJCQlvY2N1cnJlbmNlQ291bnQrKzsNCisJCQkJaWYgKGZpZWxkLmVxdWFscyhpbml0aWFsaXplcikpIHsNCisJCQkJCWJyZWFrOw0KIAkJCQl9DQogCQkJfQ0KLQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQotCQkJYmluZGluZyA9IG51bGw7DQogCQl9DQogDQotCQkvLyBubyBuZWVkIHRvIGNoZWNrIGJpbmFyeSBpbmZvIGlmIHJlc29sdmUgd2FzIHN1Y2Nlc3NmdWwNCi0JCWNvbXBpbGF0aW9uQWJvcnRlZCA9IGJpbmRpbmcgPT0gbnVsbDsNCi0JCWlmICghY29tcGlsYXRpb25BYm9ydGVkKSByZXR1cm47DQorCQlyZXR1cm4gdHlwZS5nZXRJbml0aWFsaXplcihvY2N1cnJlbmNlQ291bnQpOw0KIAl9DQogDQotCS8vIGlmIGNvbXBpbGF0aW9uIHdhcyBhYm9ydGVkIGl0IGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjbGFzcyBwYXRoOiANCi0JLy8gcmVwb3J0IGFzIGEgcG90ZW50aWFsIG1hdGNoIGlmIGJpbmFyeSBpbmZvIG1hdGNoZXMgdGhlIHBhdHRlcm4NCi0JaW50IGFjY3VyYWN5ID0gY29tcGlsYXRpb25BYm9ydGVkID8gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIIDogSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0g7DQotCQ0KLQkvLyBjaGVjayBtZXRob2RzDQotCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gaW5mby5nZXRNZXRob2RzKCk7DQotCWludCBsZW5ndGggPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0JCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsNCi0JCWlmICh0aGlzLnBhdHRlcm4ubWF0Y2hlc0JpbmFyeShtZXRob2QsIGluZm8pKSB7DQotCQkJSU1ldGhvZCBtZXRob2RIYW5kbGUgPSANCi0JCQkJYmluYXJ5VHlwZS5nZXRNZXRob2QoDQotCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgPyBpbmZvLmdldE5hbWUoKSA6IG1ldGhvZC5nZXRTZWxlY3RvcigpKSwNCi0JCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKG1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCkpLnJlcGxhY2UoJy8nLCAnLicpKQ0KLQkJCQkpOw0KLQkJCXRoaXMucmVwb3J0QmluYXJ5TWF0Y2gobWV0aG9kSGFuZGxlLCBpbmZvLCBhY2N1cmFjeSk7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIElNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCBzaW1wbGUgdHlwZSBuYW1lcy4gDQorCSAqLw0KKwlwcml2YXRlIElNZXRob2QgY3JlYXRlTWV0aG9kSGFuZGxlKA0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsDQorCQljaGFyW11bXSBkZWZpbmluZ1R5cGVOYW1lcykgew0KKwkJSVR5cGUgdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZShkZWZpbmluZ1R5cGVOYW1lcyk7DQorCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZC5hcmd1bWVudHM7DQorCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsNCisJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCVR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyVHlwZSA9IGFyZ3VtZW50c1tpXS50eXBlOw0KKwkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYXJhbWV0ZXJUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7DQorCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJUeXBlLmRpbWVuc2lvbnMoKTsgaisrKSB7DQorCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsICJbXSIgLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGZhbHNlKTsNCiAJCX0NCisJCXJldHVybiB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKTsNCiAJfQ0KIA0KLQkvLyBjaGVjayBmaWVsZHMNCi0JSUJpbmFyeUZpZWxkW10gZmllbGRzID0gaW5mby5nZXRGaWVsZHMoKTsNCi0JbGVuZ3RoID0gZmllbGRzID09IG51bGwgPyAwIDogZmllbGRzLmxlbmd0aDsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJSUJpbmFyeUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOw0KLQkJaWYgKHRoaXMucGF0dGVybi5tYXRjaGVzQmluYXJ5KGZpZWxkLCBpbmZvKSkgew0KLQkJCUlGaWVsZCBmaWVsZEhhbmRsZSA9IGJpbmFyeVR5cGUuZ2V0RmllbGQobmV3IFN0cmluZyhmaWVsZC5nZXROYW1lKCkpKTsNCi0JCQl0aGlzLnJlcG9ydEJpbmFyeU1hdGNoKGZpZWxkSGFuZGxlLCBpbmZvLCBhY2N1cmFjeSk7DQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIElUeXBlIGZyb20gdGhlIGdpdmVuIHNpbXBsZSB0eXBlIG5hbWVzLiANCisJICovDQorCXByaXZhdGUgSVR5cGUgY3JlYXRlVHlwZUhhbmRsZShjaGFyW11bXSBzaW1wbGVUeXBlTmFtZXMpIHsNCisJCS8vIGNyZWF0ZXMgY29tcGlsYXRpb24gdW5pdA0KKwkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSB0aGlzLmdldEN1cnJlbnRPcGVuYWJsZSgpOw0KKw0KKwkJLy8gY3JlYXRlIHR5cGUNCisJCWludCBsZW5ndGggPSBzaW1wbGVUeXBlTmFtZXMubGVuZ3RoOw0KKwkJSVR5cGUgdHlwZSA9IHVuaXQuZ2V0VHlwZShuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lc1swXSkpOw0KKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCXR5cGUgPSB0eXBlLmdldFR5cGUobmV3IFN0cmluZyhzaW1wbGVUeXBlTmFtZXNbaV0pKTsNCiAJCX0NCisJCXJldHVybiB0eXBlOw0KIAl9DQotfQ0KLXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzSW5Db21waWxhdGlvblVuaXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCS8vIGdldCBzb3VyY2UNCi0JZmluYWwgY2hhcltdIHNvdXJjZSA9IGdldENvbnRlbnRzKChJRmlsZSl0aGlzLmN1cnJlbnRSZXNvdXJjZSk7DQorCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0Q3VycmVudFJlc291cmNlKCkgew0KKwkJcmV0dXJuIHRoaXMucG90ZW50aWFsTWF0Y2hlc1t0aGlzLnBvdGVudGlhbE1hdGNoZXNJbmRleF0ucmVzb3VyY2U7DQorCX0NCisJcHJvdGVjdGVkIFNjYW5uZXIgZ2V0U2Nhbm5lcigpIHsNCisJCXJldHVybiB0aGlzLnBhcnNlciA9PSBudWxsID8gbnVsbCA6IHRoaXMucGFyc2VyLnNjYW5uZXI7DQorCX0NCiANCi0JLy8gZ2V0IG1haW4gdHlwZSBuYW1lDQotCVN0cmluZyBwYXRoU3RyaW5nID0gdGhpcy5jdXJyZW50UmVzb3VyY2UudG9TdHJpbmcoKTsNCi0JaW50IGxhc3REb3QgPSBwYXRoU3RyaW5nLmxhc3RJbmRleE9mKCcvJyk7DQotCS8vIHJlbW92ZSBmb2xkZXIgcGF0aCBhbmQgZXh0ZW5zaW9uICIuamF2YSINCi0JZmluYWwgY2hhcltdIG1haW5UeXBlTmFtZSA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKGxhc3REb3QrMSwgcGF0aFN0cmluZy5sZW5ndGgoKS01KS50b0NoYXJBcnJheSgpOyANCisJLyoqDQorCSAqIExvY2F0ZSB0aGUgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gZmlsZXMgYW5kIHJlcG9ydCB0aGVtIHVzaW5nIHRoZSBzZWFyY2ggcmVxdWVzdG9yLiANCisJICovDQorCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU3RyaW5nW10gZmlsZVBhdGhzLCBJV29ya3NwYWNlIHdvcmtzcGFjZSkNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkJVXRpbC5zb3J0KGZpbGVQYXRocyk7IC8vIHNvcnQgYnkgcHJvamVjdHMNCisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOw0KKwkJSGFuZGxlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEhhbmRsZUZhY3Rvcnkod29ya3NwYWNlLmdldFJvb3QoKSwgbWFuYWdlcik7DQorCQlKYXZhUHJvamVjdCBwcmV2aW91c0phdmFQcm9qZWN0ID0gbnVsbDsNCisJCWludCBsZW5ndGggPSBmaWxlUGF0aHMubGVuZ3RoOw0KKwkJZG91YmxlIGluY3JlbWVudCA9IDEwMC4wIC8gbGVuZ3RoOw0KKwkJZG91YmxlIHRvdGFsV29yayA9IDA7DQorCQlpbnQgbGFzdFByb2dyZXNzID0gMDsNCisJCWJvb2xlYW4gY291bGRJbml0aWFsaXplUGF0dGVybiA9IGZhbHNlOw0KKwkJdGhpcy5wb3RlbnRpYWxNYXRjaGVzID0gbmV3IFBvdGVudGlhbE1hdGNoWzEwXTsNCisJCXRoaXMucG90ZW50aWFsTWF0Y2hlc0xlbmd0aCA9IDA7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gdGhpcy5jb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7DQorCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KKwkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsNCisJCQl9DQorCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBmaWxlUGF0aHNbaV07DQorCQkJT3BlbmFibGUgb3BlbmFibGUgPSBmYWN0b3J5LmNyZWF0ZU9wZW5hYmxlKHBhdGhTdHJpbmcpOw0KKwkJCWlmIChvcGVuYWJsZSA9PSBudWxsKQ0KKwkJCQljb250aW51ZTsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgNCiANCi0JLy8gcGFyc2UNCi0JSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IElDb21waWxhdGlvblVuaXQoKSB7DQotCQlwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgew0KLQkJCXJldHVybiBzb3VyY2U7DQotCQl9DQotCQlwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgew0KLQkJCXJldHVybiBNYXRjaExvY2F0b3IudGhpcy5jdXJyZW50UmVzb3VyY2UuZ2V0TmFtZSgpLnRvQ2hhckFycmF5KCk7DQotCQl9DQotCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsNCi0JCQlyZXR1cm4gbWFpblR5cGVOYW1lOw0KLQkJfQ0KLQl9Ow0KLQlNYXRjaFNldCBzZXQgPSBuZXcgTWF0Y2hTZXQodGhpcyk7DQotCXRoaXMucGFyc2VyLm1hdGNoU2V0ID0gc2V0Ow0KLQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwKTsgIA0KLQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdGhpcy5wYXJzZXIucGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQpOw0KLQ0KLQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7DQotCQkvLyByZXBvcnQgbWF0Y2hlcyB0aGF0IGRvbid0IG5lZWQgcmVzb2x2ZQ0KLQkJc2V0LmN1SGFzQmVlblJlc29sdmVkID0gZmFsc2U7DQotCQlzZXQuYWNjdXJhY3kgPSBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSDsNCi0JCXNldC5yZXBvcnRNYXRjaGluZyhwYXJzZWRVbml0KTsNCi0JCQ0KLQkJLy8gcmVzb2x2ZSBpZiBuZWVkZWQNCi0JCWlmIChzZXQubmVlZHNSZXNvbHZlKCkpIHsNCi0JCQlpZiAocGFyc2VkVW5pdC50eXBlcyAhPSBudWxsKSB7DQotCQkJCS8qKg0KLQkJCQkgKiBGaXJzdCBhcHByb3hpbWF0aW9uOiByZXNldCB0aGUgbG9va3VwIGVudmlyb25tZW50IC0+IHRoaXMgd2lsbCByZWNyZWF0ZSB0aGUgYmluZGluZ3MgZm9yIHRoZSBjdXJyZW50IENVDQotCQkJCSAqIE9wdGltaXphdGlvbjogdGhlIGJpbmRpbmcgcmVzb2x1dGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIGF0IG9uY2UNCi0JCQkJICovDQotCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsNCi0NCi0JCQkJdHJ5IHsNCi0JCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOw0KLQkJCQkJaWYgKHBhcnNlZFVuaXQuc2NvcGUgIT0gbnVsbCkgew0KLQkJCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOw0KLQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7DQotCQkJCQkJcGFyc2VkVW5pdC5yZXNvbHZlKCk7DQotCQkJCQkJLy90aGlzLnBhdHRlcm4uaW5pdGlhbGl6ZUZyb21Mb29rdXBFbnZpcm9ubWVudCh0aGlzLmxvb2t1cEVudmlyb25tZW50KTsNCisJCQkvLyBjcmVhdGUgbmV3IHBhcnNlciBhbmQgbG9va3VwIGVudmlyb25tZW50IGlmIHRoaXMgaXMgYSBuZXcgcHJvamVjdA0KKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7DQorCQkJdHJ5IHsNCisJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIG9wZW5hYmxlLmdldEphdmFQcm9qZWN0KCk7DQorCQkJCXJlc291cmNlID0gb3BlbmFibGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7DQorCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7IC8vIGNhc2Ugb2YgYSBmaWxlIGluIGFuIGV4dGVybmFsIGphcg0KKwkJCQkJcmVzb3VyY2UgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7DQorCQkJCX0NCisJCQkJaWYgKCFqYXZhUHJvamVjdC5lcXVhbHMocHJldmlvdXNKYXZhUHJvamVjdCkpIHsNCisJCQkJCS8vIGxvY2F0ZSBtYXRjaGVzIGluIHByZXZpb3VzIHByb2plY3QNCisJCQkJCWlmIChwcmV2aW91c0phdmFQcm9qZWN0ICE9IG51bGwpIHsNCisJCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMoKTsNCisJCQkJCQl0aGlzLnBvdGVudGlhbE1hdGNoZXNMZW5ndGggPSAwOw0KIAkJCQkJfQ0KLQkJCQkJLy8gcmVwb3J0IG1hdGNoZXMgdGhhdCBuZWVkZWQgcmVzb2x2ZQ0KLQkJCQkJc2V0LmN1SGFzQmVlblJlc29sdmVkID0gdHJ1ZTsNCi0JCQkJCXNldC5hY2N1cmFjeSA9IElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIOw0KLQkJCQkJc2V0LnJlcG9ydE1hdGNoaW5nKHBhcnNlZFVuaXQpOw0KLQkJCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsNCi0JCQkJCS8vIGNvdWxkIG5vdCByZXNvbHZlIChyZWFzb25zIGluY2x1ZGUgImNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgY2xhc3MiKSAtPiBpZ25vcmUgYW5kIHJlcG9ydCB0aGUgdW5yZXNvbHZlZCBub2Rlcw0KLQkJCQkJc2V0LmN1SGFzQmVlblJlc29sdmVkID0gZmFsc2U7DQotCQkJCQlzZXQuYWNjdXJhY3kgPSBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0g7DQotCQkJCQlzZXQucmVwb3J0TWF0Y2hpbmcocGFyc2VkVW5pdCk7DQorDQorCQkJCQkvLyBjcmVhdGUgcGFyc2VyIGZvciB0aGlzIHByb2plY3QNCisJCQkJCWNvdWxkSW5pdGlhbGl6ZVBhdHRlcm4gPSB0aGlzLmNyZWF0ZVBhcnNlcihqYXZhUHJvamVjdCk7DQorCQkJCQlwcmV2aW91c0phdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7DQogCQkJCX0NCisJCQkJaWYgKCFjb3VsZEluaXRpYWxpemVQYXR0ZXJuKQ0KKwkJCQkJY29udGludWU7DQorCQkJCS8vIHRoZSBwYXR0ZXJuIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZDogdGhlIG1hdGNoIGNhbm5vdCBiZSBpbiB0aGlzIHByb2plY3QNCisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KKwkJCQkvLyBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4gc2tpcCBpdA0KKwkJCQljb250aW51ZTsNCisJCQl9DQorDQorCQkJLy8gYWRkIHBvdGVudGlhbCBtYXRjaA0KKwkJCXRoaXMuYWRkUG90ZW50aWFsTWF0Y2gocmVzb3VyY2UsIG9wZW5hYmxlKTsNCisNCisJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQorCQkJCXRvdGFsV29yayA9IHRvdGFsV29yayArIGluY3JlbWVudDsNCisJCQkJaW50IHdvcmtlZCA9IChpbnQpIHRvdGFsV29yayAtIGxhc3RQcm9ncmVzczsNCisJCQkJbW9uaXRvci53b3JrZWQod29ya2VkKTsNCisJCQkJbGFzdFByb2dyZXNzID0gKGludCkgdG90YWxXb3JrOw0KIAkJCX0NCiAJCX0NCisNCisJCS8vIGxhc3QgcHJvamVjdA0KKwkJaWYgKHByZXZpb3VzSmF2YVByb2plY3QgIT0gbnVsbCkgew0KKwkJCXRoaXMubG9jYXRlTWF0Y2hlcygpOw0KKwkJCXRoaXMucG90ZW50aWFsTWF0Y2hlc0xlbmd0aCA9IDA7DQorCQl9DQorDQogCX0NCi19DQotLyoqDQotICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGlzIGxvY2F0b3IncyBwYXR0ZXJuLiANCi0gKi8NCi1wdWJsaWMgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKElXb3Jrc3BhY2Ugd29ya3NwYWNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JdGhpcy5sb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKHRoaXMucGF0dGVybiwgd29ya3NwYWNlKTsNCi19DQotLyoqDQotICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VhcmNoIHBhdHRlcm4uIA0KLSAqLw0KLXByaXZhdGUgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKFNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQlpZiAoc2VhcmNoUGF0dGVybiBpbnN0YW5jZW9mIE9yUGF0dGVybikgew0KLQkJT3JQYXR0ZXJuIG9yUGF0dGVybiA9IChPclBhdHRlcm4pc2VhcmNoUGF0dGVybjsNCi0JCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhvclBhdHRlcm4ubGVmdFBhdHRlcm4sIHdvcmtzcGFjZSk7DQotCQl0aGlzLmxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnMob3JQYXR0ZXJuLnJpZ2h0UGF0dGVybiwgd29ya3NwYWNlKTsNCi0JfSBlbHNlIGlmIChzZWFyY2hQYXR0ZXJuIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybikgew0KLQkJUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybiBwa2dQYXR0ZXJuID0gKFBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4pc2VhcmNoUGF0dGVybjsNCi0JCVN0cmluZyBwa2dOYW1lID0gbmV3IFN0cmluZyhwa2dQYXR0ZXJuLnBrZ05hbWUpOw0KLQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbCh3b3Jrc3BhY2UpLmdldEphdmFQcm9qZWN0cygpOw0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcHJvamVjdHNbaV07DQotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7DQotCQkJZm9yIChpbnQgaiA9IDAsIHJvb3RzTGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBqIDwgcm9vdHNMZW5ndGg7IGorKykgew0KLQkJCQlJSmF2YUVsZW1lbnRbXSBwa2dzID0gcm9vdHNbal0uZ2V0Q2hpbGRyZW4oKTsNCi0JCQkJZm9yIChpbnQgayA9IDAsIHBrc0xlbmd0aCA9IHBrZ3MubGVuZ3RoOyBrIDwgcGtzTGVuZ3RoOyBrKyspIHsNCi0JCQkJCUlKYXZhRWxlbWVudCBwa2cgPSBwa2dzW2tdOw0KLQkJCQkJaWYgKHBrZ1BhdHRlcm4ubWF0Y2hlc05hbWUocGtnUGF0dGVybi5wa2dOYW1lLCBwa2cuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKSkgew0KLQkJCQkJCXRoaXMuY3VycmVudFJlc291cmNlID0gcGtnLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOw0KLQkJCQkJCWlmICh0aGlzLmN1cnJlbnRSZXNvdXJjZSA9PSBudWxsKSB7IC8vIGNhc2Ugb2YgYSBmaWxlIGluIGFuIGV4dGVybmFsIGphcg0KLQkJCQkJCQl0aGlzLmN1cnJlbnRSZXNvdXJjZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsNCi0JCQkJCQl9DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJdGhpcy5yZXBvcnQoLTEsIC0yLCBwa2csIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsNCi0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsNCi0JCQkJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pZTsNCi0JCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7DQorDQorCS8qKg0KKwkgKiBMb2NhdGVzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbG9jYXRvcidzIHBhdHRlcm4uIA0KKwkgKi8NCisJcHVibGljIHZvaWQgbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhJV29ya3NwYWNlIHdvcmtzcGFjZSkNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkJdGhpcy5sb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKHRoaXMucGF0dGVybiwgd29ya3NwYWNlKTsNCisJfQ0KKw0KKwkvKioNCisJICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VhcmNoIHBhdHRlcm4uIA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnMoDQorCQlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sDQorCQlJV29ya3NwYWNlIHdvcmtzcGFjZSkNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkJaWYgKHNlYXJjaFBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pIHsNCisJCQlPclBhdHRlcm4gb3JQYXR0ZXJuID0gKE9yUGF0dGVybikgc2VhcmNoUGF0dGVybjsNCisJCQl0aGlzLmxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnMob3JQYXR0ZXJuLmxlZnRQYXR0ZXJuLCB3b3Jrc3BhY2UpOw0KKwkJCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhvclBhdHRlcm4ucmlnaHRQYXR0ZXJuLCB3b3Jrc3BhY2UpOw0KKwkJfSBlbHNlDQorCQkJaWYgKHNlYXJjaFBhdHRlcm4gaW5zdGFuY2VvZiBQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuKSB7DQorCQkJCVBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4gcGtnUGF0dGVybiA9DQorCQkJCQkoUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybikgc2VhcmNoUGF0dGVybjsNCisJCQkJU3RyaW5nIHBrZ05hbWUgPSBuZXcgU3RyaW5nKHBrZ1BhdHRlcm4ucGtnTmFtZSk7DQorCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0NCisJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsKHdvcmtzcGFjZSkuZ2V0SmF2YVByb2plY3RzKCk7DQorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KKwkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcHJvamVjdHNbaV07DQorCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsNCisJCQkJCWZvciAoaW50IGogPSAwLCByb290c0xlbmd0aCA9IHJvb3RzLmxlbmd0aDsgaiA8IHJvb3RzTGVuZ3RoOyBqKyspIHsNCisJCQkJCQlJSmF2YUVsZW1lbnRbXSBwa2dzID0gcm9vdHNbal0uZ2V0Q2hpbGRyZW4oKTsNCisJCQkJCQlmb3IgKGludCBrID0gMCwgcGtzTGVuZ3RoID0gcGtncy5sZW5ndGg7IGsgPCBwa3NMZW5ndGg7IGsrKykgew0KKwkJCQkJCQlJSmF2YUVsZW1lbnQgcGtnID0gcGtnc1trXTsNCisJCQkJCQkJaWYgKHBrZ1BhdHRlcm4NCisJCQkJCQkJCS5tYXRjaGVzTmFtZShwa2dQYXR0ZXJuLnBrZ05hbWUsIHBrZy5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpKSB7DQorCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwa2cuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7DQorCQkJCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeyAvLyBjYXNlIG9mIGEgZmlsZSBpbiBhbiBleHRlcm5hbCBqYXINCisJCQkJCQkJCQlyZXNvdXJjZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCXRoaXMucG90ZW50aWFsTWF0Y2hlc0luZGV4ID0gMDsNCisJCQkJCQkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcyA9DQorCQkJCQkJCQkJbmV3IFBvdGVudGlhbE1hdGNoW10geyBuZXcgUG90ZW50aWFsTWF0Y2godGhpcywgcmVzb3VyY2UsIG51bGwpfTsNCisJCQkJCQkJCXRyeSB7DQorCQkJCQkJCQkJdGhpcy5yZXBvcnQoLTEsIC0yLCBwa2csIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsNCisJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7DQorCQkJCQkJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7DQorCQkJCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsNCisJCQkJCQkJCQl9DQorCQkJCQkJCQl9DQogCQkJCQkJCX0NCiAJCQkJCQl9DQogCQkJCQl9DQogCQkJCX0NCiAJCQl9DQorCX0NCisNCisJcHVibGljIHZvaWQgcmVwb3J0KA0KKwkJaW50IHNvdXJjZVN0YXJ0LA0KKwkJaW50IHNvdXJjZUVuZCwNCisJCUlKYXZhRWxlbWVudCBlbGVtZW50LA0KKwkJaW50IGFjY3VyYWN5KQ0KKwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKwkJaWYgKHRoaXMuc2NvcGUuZW5jbG9zZXMoZWxlbWVudCkpIHsNCisJCQl0aGlzLmNvbGxlY3Rvci5hY2NlcHQoDQorCQkJCXRoaXMuZ2V0Q3VycmVudFJlc291cmNlKCksDQorCQkJCXNvdXJjZVN0YXJ0LA0KKwkJCQlzb3VyY2VFbmQgKyAxLA0KKwkJCQllbGVtZW50LA0KKwkJCQlhY2N1cmFjeSk7DQogCQl9DQogCX0NCi19DQotcHVibGljIHZvaWQgcmVwb3J0KGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQlpZiAodGhpcy5zY29wZS5lbmNsb3NlcyhlbGVtZW50KSkgew0KLQkJdGhpcy5jb2xsZWN0b3IuYWNjZXB0KA0KLQkJCXRoaXMuY3VycmVudFJlc291cmNlLA0KLQkJCXNvdXJjZVN0YXJ0LA0KLQkJCXNvdXJjZUVuZCArIDEsDQotCQkJZWxlbWVudCwgDQotCQkJYWNjdXJhY3kNCi0JCSk7DQotCX0NCi19DQotcHJpdmF0ZSB2b2lkIHJlcG9ydEJpbmFyeU1hdGNoKElNZW1iZXIgYmluYXJ5TWVtYmVyLCBJQmluYXJ5VHlwZSBpbmZvLCBpbnQgYWNjdXJhY3kpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBiaW5hcnlNZW1iZXIuZ2V0TmFtZVJhbmdlKCk7DQotCWlmIChyYW5nZS5nZXRPZmZzZXQoKSA9PSAtMSkgew0KLQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpYmluYXJ5TWVtYmVyLmdldENsYXNzRmlsZSgpOw0KLQkJU291cmNlTWFwcGVyIG1hcHBlciA9IGNsYXNzRmlsZS5nZXRTb3VyY2VNYXBwZXIoKTsNCi0JCWlmIChtYXBwZXIgIT0gbnVsbCkgew0KLQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOw0KLQkJCWNoYXJbXSBjb250ZW50cyA9IG1hcHBlci5maW5kU291cmNlKHR5cGUsIGluZm8pOw0KLQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7DQotCQkJCXJhbmdlID0gbWFwcGVyLm1hcFNvdXJjZSh0eXBlLCBjb250ZW50cywgYmluYXJ5TWVtYmVyKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JaW50IHN0YXJ0SW5kZXggPSByYW5nZS5nZXRPZmZzZXQoKTsNCi0JaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHJhbmdlLmdldExlbmd0aCgpIC0gMTsNCi0JdGhpcy5yZXBvcnQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGJpbmFyeU1lbWJlciwgYWNjdXJhY3kpOw0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4NCi0gKiBJdHMgZGVmaW5pbmcgdHlwZXMgaGF2ZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWVzLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlcG9ydEZpZWxkRGVjbGFyYXRpb24oDQotCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgDQotCWNoYXJbXVtdIGRlZmluaW5nVHlwZU5hbWVzLCANCi0JaW50IGFjY3VyYWN5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkNCi0JLy8gY3JlYXRlIGZpZWxkIGhhbmRsZQ0KLQlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKGRlZmluaW5nVHlwZU5hbWVzKTsNCi0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkRGVjbGFyYXRpb24ubmFtZSkpOw0KLQkNCi0JLy8gYWNjZXB0IGZpZWxkIGRlY2xhcmF0aW9uDQotCXRoaXMucmVwb3J0KGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kLCBmaWVsZCwgYWNjdXJhY3kpOw0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiBpbXBvcnQgdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQotICovDQotcHVibGljIHZvaWQgcmVwb3J0SW1wb3J0KEltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UsIGludCBhY2N1cmFjeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KIA0KLQkvLyBjcmVhdGUgZGVmaW5pbmcgaW1wb3J0IGhhbmRsZQ0KLQlJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0SGFuZGxlID0gdGhpcy5jcmVhdGVJbXBvcnRIYW5kbGUocmVmZXJlbmNlKTsNCi0JDQotCS8vIGFjY2VwdCByZWZlcmVuY2UNCi0JdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgaW1wb3J0SGFuZGxlLCBhY2N1cmFjeSwgdGhpcyk7CQ0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQotICogSXRzIGRlZmluaW5nIHR5cGVzIGhhdmUgdGhlIGdpdmVuIHNpbXBsZSBuYW1lcy4NCi0gKi8NCi1wdWJsaWMgdm9pZCByZXBvcnRNZXRob2REZWNsYXJhdGlvbigNCi0JQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgDQotCWNoYXJbXVtdIGRlZmluaW5nVHlwZU5hbWVzLA0KLQlpbnQgYWNjdXJhY3kpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQ0KLQkvLyBjcmVhdGUgbWV0aG9kIGhhbmRsZQ0KLQlJTWV0aG9kIG1ldGhvZCA9IHRoaXMuY3JlYXRlTWV0aG9kSGFuZGxlKG1ldGhvZERlY2xhcmF0aW9uLCBkZWZpbmluZ1R5cGVOYW1lcyk7DQotDQotCS8vIGNvbXB1dGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgc2VsZWN0b3IgDQotCVNjYW5uZXIgc2Nhbm5lciA9IHBhcnNlci5zY2FubmVyOw0KLQlpbnQgbmFtZVNvdXJjZVN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQ7DQotCXNjYW5uZXIucmVzZXRUbyhuYW1lU291cmNlU3RhcnQsIG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZCk7DQotCXRyeSB7DQotCQlzY2FubmVyLmdldE5leHRUb2tlbigpOw0KLQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7DQotCX0NCi0JaW50IG5hbWVTb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOw0KLQ0KLQkvLyBhY2NlcHQgbWV0aG9kIGRlY2xhcmF0aW9uDQotCXRoaXMucmVwb3J0KG5hbWVTb3VyY2VTdGFydCwgbmFtZVNvdXJjZUVuZCwgbWV0aG9kLCBhY2N1cmFjeSk7DQotfQ0KLS8qKg0KLSAqIFJlcG9ydHMgdGhlIGdpdmVuIHBhY2thZ2UgZGVjbGFyYXRpb24gdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQotICovDQotcHVibGljIHZvaWQgcmVwb3J0UGFja2FnZURlY2xhcmF0aW9uKEltcG9ydFJlZmVyZW5jZSBub2RlKSB7DQotCS8vIFRCRA0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiBwYWNrYWdlIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4NCi0gKi8NCi1wdWJsaWMgdm9pZCByZXBvcnRQYWNrYWdlUmVmZXJlbmNlKEltcG9ydFJlZmVyZW5jZSBub2RlKSB7DQotCS8vIFRCRA0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlcG9ydFF1YWxpZmllZFJlZmVyZW5jZSgNCi0JaW50IHNvdXJjZVN0YXJ0LA0KLQlpbnQgc291cmNlRW5kLA0KLQljaGFyW11bXSBxdWFsaWZpZWROYW1lLA0KLQlJSmF2YUVsZW1lbnQgZWxlbWVudCwNCi0JaW50IGFjY3VyYWN5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkNCi0JLy8gY29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlIA0KLQlTY2FubmVyIHNjYW5uZXIgPSBwYXJzZXIuc2Nhbm5lcjsNCi0Jc2Nhbm5lci5yZXNldFRvKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOw0KLQ0KLQlpbnQgcmVmU291cmNlU3RhcnQgPSAtMSwgcmVmU291cmNlRW5kID0gLTE7DQotCWludCB0b2tlbk51bWJlciA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOw0KLQlpbnQgdG9rZW4gPSAtMTsNCi0JaW50IHByZXZpb3VzVmFsaWQgPSAtMTsNCi0JaW50IGkgPSAwOw0KLQlkbyB7DQotCQlpbnQgY3VycmVudFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247DQotCQkvLyByZWFkIHRva2VuDQotCQl0cnkgew0KLQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsNCi0JCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCWlmICh0b2tlbiAhPSBUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSB7DQotCQkJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7DQotCQkJd2hpbGUgKGkgPCB0b2tlbk51bWJlciAmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudFRva2VuU291cmNlLCBxdWFsaWZpZWROYW1lW2krK10pKSB7DQotCQkJfQ0KLQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50VG9rZW5Tb3VyY2UsIHF1YWxpZmllZE5hbWVbaS0xXSkgJiYgKHByZXZpb3VzVmFsaWQgPT0gLTEgfHwgcHJldmlvdXNWYWxpZCA9PSBpLTIpKSB7DQotCQkJCXByZXZpb3VzVmFsaWQgPSBpLTE7DQotCQkJCWlmIChyZWZTb3VyY2VTdGFydCA9PSAtMSkgew0KLQkJCQkJcmVmU291cmNlU3RhcnQgPSBjdXJyZW50UG9zaXRpb247DQorCXB1YmxpYyB2b2lkIHJlcG9ydEJpbmFyeU1hdGNoKA0KKwkJSU1lbWJlciBiaW5hcnlNZW1iZXIsDQorCQlJQmluYXJ5VHlwZSBpbmZvLA0KKwkJaW50IGFjY3VyYWN5KQ0KKwkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQorCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBiaW5hcnlNZW1iZXIuZ2V0TmFtZVJhbmdlKCk7DQorCQlpZiAocmFuZ2UuZ2V0T2Zmc2V0KCkgPT0gLTEpIHsNCisJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgYmluYXJ5TWVtYmVyLmdldENsYXNzRmlsZSgpOw0KKwkJCVNvdXJjZU1hcHBlciBtYXBwZXIgPSBjbGFzc0ZpbGUuZ2V0U291cmNlTWFwcGVyKCk7DQorCQkJaWYgKG1hcHBlciAhPSBudWxsKSB7DQorCQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOw0KKwkJCQljaGFyW10gY29udGVudHMgPSBtYXBwZXIuZmluZFNvdXJjZSh0eXBlLCBpbmZvKTsNCisJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsNCisJCQkJCXJhbmdlID0gbWFwcGVyLm1hcFNvdXJjZSh0eXBlLCBjb250ZW50cywgYmluYXJ5TWVtYmVyKTsNCiAJCQkJfQ0KLQkJCQlyZWZTb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOw0KLQkJCX0gZWxzZSB7DQotCQkJCWkgPSAwOw0KLQkJCQlyZWZTb3VyY2VTdGFydCA9IC0xOw0KLQkJCQlwcmV2aW91c1ZhbGlkID0gLTE7DQogCQkJfQ0KLQkJCS8vIHJlYWQgJy4nDQorCQl9DQorCQlpbnQgc3RhcnRJbmRleCA9IHJhbmdlLmdldE9mZnNldCgpOw0KKwkJaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHJhbmdlLmdldExlbmd0aCgpIC0gMTsNCisJCXRoaXMucmVwb3J0KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBiaW5hcnlNZW1iZXIsIGFjY3VyYWN5KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQorCSAqIEl0cyBkZWZpbmluZyB0eXBlcyBoYXZlIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZXBvcnRGaWVsZERlY2xhcmF0aW9uKA0KKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLA0KKwkJY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMsDQorCQlpbnQgYWNjdXJhY3kpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorDQorCQkvLyBjcmVhdGUgZmllbGQgaGFuZGxlDQorCQlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKGRlZmluaW5nVHlwZU5hbWVzKTsNCisJCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQobmV3IFN0cmluZyhmaWVsZERlY2xhcmF0aW9uLm5hbWUpKTsNCisNCisJCS8vIGFjY2VwdCBmaWVsZCBkZWNsYXJhdGlvbg0KKwkJdGhpcy5yZXBvcnQoDQorCQkJZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwNCisJCQlmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCwNCisJCQlmaWVsZCwNCisJCQlhY2N1cmFjeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIGltcG9ydCB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4NCisJICovDQorCXB1YmxpYyB2b2lkIHJlcG9ydEltcG9ydChJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlLCBpbnQgYWNjdXJhY3kpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorDQorCQkvLyBjcmVhdGUgZGVmaW5pbmcgaW1wb3J0IGhhbmRsZQ0KKwkJSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydEhhbmRsZSA9IHRoaXMuY3JlYXRlSW1wb3J0SGFuZGxlKHJlZmVyZW5jZSk7DQorDQorCQkvLyBhY2NlcHQgcmVmZXJlbmNlDQorCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBpbXBvcnRIYW5kbGUsIGFjY3VyYWN5LCB0aGlzKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KKwkgKiBJdHMgZGVmaW5pbmcgdHlwZXMgaGF2ZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWVzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVwb3J0TWV0aG9kRGVjbGFyYXRpb24oDQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLA0KKwkJY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMsDQorCQlpbnQgYWNjdXJhY3kpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorDQorCQkvLyBjcmVhdGUgbWV0aG9kIGhhbmRsZQ0KKwkJSU1ldGhvZCBtZXRob2QgPSB0aGlzLmNyZWF0ZU1ldGhvZEhhbmRsZShtZXRob2REZWNsYXJhdGlvbiwgZGVmaW5pbmdUeXBlTmFtZXMpOw0KKw0KKwkJLy8gY29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBzZWxlY3RvciANCisJCVNjYW5uZXIgc2Nhbm5lciA9IHBhcnNlci5zY2FubmVyOw0KKwkJaW50IG5hbWVTb3VyY2VTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0Ow0KKwkJc2Nhbm5lci5zZXRTb3VyY2VCdWZmZXIoDQorCQkJdGhpcy5wb3RlbnRpYWxNYXRjaGVzW3RoaXMucG90ZW50aWFsTWF0Y2hlc0luZGV4XS5nZXRTb3VyY2UoKSk7DQorCQlzY2FubmVyLnJlc2V0VG8obmFtZVNvdXJjZVN0YXJ0LCBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQpOw0KKwkJdHJ5IHsNCisJCQlzY2FubmVyLmdldE5leHRUb2tlbigpOw0KKwkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCisJCX0NCisJCWludCBuYW1lU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOw0KKw0KKwkJLy8gYWNjZXB0IG1ldGhvZCBkZWNsYXJhdGlvbg0KKwkJdGhpcy5yZXBvcnQobmFtZVNvdXJjZVN0YXJ0LCBuYW1lU291cmNlRW5kLCBtZXRob2QsIGFjY3VyYWN5KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gcGFja2FnZSBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4NCisJICovDQorCXB1YmxpYyB2b2lkIHJlcG9ydFBhY2thZ2VEZWNsYXJhdGlvbihJbXBvcnRSZWZlcmVuY2Ugbm9kZSkgew0KKwkJLy8gVEJEDQorCX0NCisNCisJLyoqDQorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHBhY2thZ2UgcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVwb3J0UGFja2FnZVJlZmVyZW5jZShJbXBvcnRSZWZlcmVuY2Ugbm9kZSkgew0KKwkJLy8gVEJEDQorCX0NCisNCisJLyoqDQorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZXBvcnRRdWFsaWZpZWRSZWZlcmVuY2UoDQorCQlpbnQgc291cmNlU3RhcnQsDQorCQlpbnQgc291cmNlRW5kLA0KKwkJY2hhcltdW10gcXVhbGlmaWVkTmFtZSwNCisJCUlKYXZhRWxlbWVudCBlbGVtZW50LA0KKwkJaW50IGFjY3VyYWN5KQ0KKwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKw0KKwkJLy8gY29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlIA0KKwkJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7DQorCQlzY2FubmVyLnNldFNvdXJjZUJ1ZmZlcigNCisJCQl0aGlzLnBvdGVudGlhbE1hdGNoZXNbdGhpcy5wb3RlbnRpYWxNYXRjaGVzSW5kZXhdLmdldFNvdXJjZSgpKTsNCisJCXNjYW5uZXIucmVzZXRUbyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTsNCisNCisJCWludCByZWZTb3VyY2VTdGFydCA9IC0xLCByZWZTb3VyY2VFbmQgPSAtMTsNCisJCWludCB0b2tlbk51bWJlciA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOw0KKwkJaW50IHRva2VuID0gLTE7DQorCQlpbnQgcHJldmlvdXNWYWxpZCA9IC0xOw0KKwkJaW50IGkgPSAwOw0KKwkJZG8gew0KKwkJCWludCBjdXJyZW50UG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsNCisJCQkvLyByZWFkIHRva2VuDQogCQkJdHJ5IHsNCiAJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOw0KLQkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsNCisJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgew0KIAkJCX0NCi0JCX0gDQotCX0gd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YgJiYgaSA8IHRva2VuTnVtYmVyKTsNCi0NCi0JLy8gYWNjZXB0IG1ldGhvZCBkZWNsYXJhdGlvbg0KLQlpZiAocmVmU291cmNlU3RhcnQgIT0gLTEpIHsNCi0JCXRoaXMucmVwb3J0KHJlZlNvdXJjZVN0YXJ0LCByZWZTb3VyY2VFbmQsIGVsZW1lbnQsIGFjY3VyYWN5KTsNCi0JfSBlbHNlIHsNCi0JCXRoaXMucmVwb3J0KHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQsIGVsZW1lbnQsIGFjY3VyYWN5KTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuDQotICogSXQgaXMgZG9uZSBpbiB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCB0aGUgbWV0aG9kJ3MgZGVmaW5pbmcgdHlwZXMgDQotICogaGF2ZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWVzLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlcG9ydFJlZmVyZW5jZSgNCi0JQXN0Tm9kZSByZWZlcmVuY2UsIA0KLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCANCi0JY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMsIA0KLQlpbnQgYWNjdXJhY3kpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQ0KLQkvLyBjcmVhdGUgZGVmaW5pbmcgbWV0aG9kIGhhbmRsZQ0KLQlJTWV0aG9kIG1ldGhvZCA9IHRoaXMuY3JlYXRlTWV0aG9kSGFuZGxlKG1ldGhvZERlY2xhcmF0aW9uLCBkZWZpbmluZ1R5cGVOYW1lcyk7DQotCQ0KLQkvLyBhY2NlcHQgcmVmZXJlbmNlDQotCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHx8IHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsNCi0JCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZSgoQXN0Tm9kZSlyZWZlcmVuY2UsIG1ldGhvZCwgYWNjdXJhY3ksIHRoaXMpOw0KLQl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7IC8vIG1lc3NhZ2UgcmVmIGFyZSBzdGFydGluZyBhdCB0aGUgc2VsZWN0b3Igc3RhcnQNCi0JCXRoaXMucmVwb3J0KChpbnQpKCgoTWVzc2FnZVNlbmQpcmVmZXJlbmNlKS5uYW1lU291cmNlUG9zaXRpb24gPj4gMzIpLCByZWZlcmVuY2Uuc291cmNlRW5kLCBtZXRob2QsIGFjY3VyYWN5KTsNCi0JfSBlbHNlIHsNCi0JCXRoaXMucmVwb3J0KHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCwgbWV0aG9kLCBhY2N1cmFjeSk7DQotCX0NCi19DQotLyoqDQotICogUmVwb3J0cyB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KLSAqIEl0IGlzIGRvbmUgaW4gdGhlIGdpdmVuIGZpZWxkIGFuZCBnaXZlbiB0eXBlLg0KLSAqIFRoZSBmaWVsZCdzIGRlZmluaW5nIHR5cGVzIGhhdmUgdGhlIGdpdmVuIHNpbXBsZSBuYW1lcy4NCi0gKi8NCi1wdWJsaWMgdm9pZCByZXBvcnRSZWZlcmVuY2UoDQotCUFzdE5vZGUgcmVmZXJlbmNlLA0KLQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLA0KLQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIA0KLQljaGFyW11bXSBkZWZpbmluZ1R5cGVOYW1lcywgDQotCWludCBhY2N1cmFjeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQlpZiAoZmllbGREZWNsYXJhdGlvbi5pc0ZpZWxkKCkpIHsNCi0JCS8vIGNyZWF0ZSBkZWZpbmluZyBmaWVsZCBoYW5kbGUNCi0JCUlGaWVsZCBmaWVsZCA9IHRoaXMuY3JlYXRlRmllbGRIYW5kbGUoZmllbGREZWNsYXJhdGlvbiwgZGVmaW5pbmdUeXBlTmFtZXMpOw0KLQkNCi0JCS8vIGFjY2VwdCByZWZlcmVuY2UNCi0JCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHx8IHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsNCi0JCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UoKEFzdE5vZGUpcmVmZXJlbmNlLCBmaWVsZCwgYWNjdXJhY3ksIHRoaXMpOw0KLQkJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgeyAvLyBtZXNzYWdlIHJlZiBhcmUgc3RhcnRpbmcgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0DQotCQkJdGhpcy5yZXBvcnQoKGludCkoKChNZXNzYWdlU2VuZClyZWZlcmVuY2UpLm5hbWVTb3VyY2VQb3NpdGlvbiA+PiAzMiksIHJlZmVyZW5jZS5zb3VyY2VFbmQsIGZpZWxkLCBhY2N1cmFjeSk7DQotCQl9IGVsc2Ugew0KLQkJCXRoaXMucmVwb3J0KHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCwgZmllbGQsIGFjY3VyYWN5KTsNCisJCQlpZiAodG9rZW4gIT0gVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgew0KKwkJCQljaGFyW10gY3VycmVudFRva2VuU291cmNlID0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsNCisJCQkJd2hpbGUgKGkgPCB0b2tlbk51bWJlcg0KKwkJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRUb2tlblNvdXJjZSwgcXVhbGlmaWVkTmFtZVtpKytdKSkgew0KKwkJCQl9DQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50VG9rZW5Tb3VyY2UsIHF1YWxpZmllZE5hbWVbaSAtIDFdKQ0KKwkJCQkJJiYgKHByZXZpb3VzVmFsaWQgPT0gLTEgfHwgcHJldmlvdXNWYWxpZCA9PSBpIC0gMikpIHsNCisJCQkJCXByZXZpb3VzVmFsaWQgPSBpIC0gMTsNCisJCQkJCWlmIChyZWZTb3VyY2VTdGFydCA9PSAtMSkgew0KKwkJCQkJCXJlZlNvdXJjZVN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOw0KKwkJCQkJfQ0KKwkJCQkJcmVmU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJaSA9IDA7DQorCQkJCQlyZWZTb3VyY2VTdGFydCA9IC0xOw0KKwkJCQkJcHJldmlvdXNWYWxpZCA9IC0xOw0KKwkJCQl9DQorCQkJCS8vIHJlYWQgJy4nDQorCQkJCXRyeSB7DQorCQkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7DQorCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7DQorCQkJCX0NCisJCQl9DQogCQl9DQotCX0gZWxzZSB7IC8vIGluaXRpYWxpemVyDQotCQkvLyBjcmVhdGUgZGVmaW5pbmcgaW5pdGlhbGl6ZXINCi0JCUlJbml0aWFsaXplciBpbml0aWFsaXplciA9IHRoaXMuY3JlYXRlSW5pdGlhbGl6ZXJIYW5kbGUodHlwZURlY2xhcmF0aW9uLCBmaWVsZERlY2xhcmF0aW9uLCBkZWZpbmluZ1R5cGVOYW1lcyk7DQotCQkNCisJCXdoaWxlICh0b2tlbiAhPSBUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GICYmIGkgPCB0b2tlbk51bWJlcik7DQorDQogCQkvLyBhY2NlcHQgcmVmZXJlbmNlDQotCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSB8fCByZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7DQotCQkJdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKChBc3ROb2RlKXJlZmVyZW5jZSwgaW5pdGlhbGl6ZXIsIGFjY3VyYWN5LCB0aGlzKTsNCi0JCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsgLy8gbWVzc2FnZSByZWYgYXJlIHN0YXJ0aW5nIGF0IHRoZSBzZWxlY3RvciBzdGFydA0KLQkJCXRoaXMucmVwb3J0KChpbnQpKCgoTWVzc2FnZVNlbmQpcmVmZXJlbmNlKS5uYW1lU291cmNlUG9zaXRpb24gPj4gMzIpLCByZWZlcmVuY2Uuc291cmNlRW5kLCBpbml0aWFsaXplciwgYWNjdXJhY3kpOw0KKwkJaWYgKHJlZlNvdXJjZVN0YXJ0ICE9IC0xKSB7DQorCQkJdGhpcy5yZXBvcnQocmVmU291cmNlU3RhcnQsIHJlZlNvdXJjZUVuZCwgZWxlbWVudCwgYWNjdXJhY3kpOw0KIAkJfSBlbHNlIHsNCi0JCQl0aGlzLnJlcG9ydChyZWZlcmVuY2Uuc291cmNlU3RhcnQsIHJlZmVyZW5jZS5zb3VyY2VFbmQsIGluaXRpYWxpemVyLCBhY2N1cmFjeSk7DQorCQkJdGhpcy5yZXBvcnQoc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZWxlbWVudCwgYWNjdXJhY3kpOw0KIAkJfQ0KIAl9DQotfQ0KLS8qKg0KLSAqIFJlcG9ydHMgdGhlIGdpdmVuIHN1cGVyIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KLSAqIEl0IGlzIGRvbmUgaW4gdGhlIGdpdmVuIGRlZmluaW5nIHR5cGUgKHdpdGggdGhlIGdpdmVuIHNpbXBsZSBuYW1lcykuDQotICovDQotcHVibGljIHZvaWQgcmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKA0KLQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYsIA0KLQljaGFyW11bXSBkZWZpbmluZ1R5cGVOYW1lcywgDQotCWludCBhY2N1cmFjeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJDQotCS8vIGNyZWF0ZSBkZWZpbmluZyB0eXBlIGhhbmRsZQ0KLQlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKGRlZmluaW5nVHlwZU5hbWVzKTsNCi0JDQotCS8vIGFjY2VwdCB0eXBlIHJlZmVyZW5jZQ0KLQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UodHlwZVJlZiwgdHlwZSwgYWNjdXJhY3ksIHRoaXMpOw0KLX0NCi0vKioNCi0gKiBSZXBvcnRzIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KLSAqIEl0cyBzaW1wbGUgbmFtZXMgYXJlIHRoZSBuYW1lcyBvZiBpdHMgb3V0ZXIgbW9zdCB0eXBlIHRvIHRoaXMgdHlwZS4NCi0gKi8NCi1wdWJsaWMgdm9pZCByZXBvcnRUeXBlRGVjbGFyYXRpb24oDQotCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIA0KLQljaGFyW11bXSBzaW1wbGVUeXBlTmFtZXMsIA0KLQlpbnQgYWNjdXJhY3kpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQ0KLQkvLyBjcmVhdGUgdHlwZSBoYW5kbGUNCi0JSVR5cGUgdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZShzaW1wbGVUeXBlTmFtZXMpOw0KLQkNCi0JLy8gYWNjZXB0IGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbg0KLQl0aGlzLnJlcG9ydCh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQsIHR5cGUsIGFjY3VyYWN5KTsNCi19DQogDQotLyoqDQotICogQ3JlYXRlIGEgbmV3IHBhcnNlciBmb3IgdGhlIGdpdmVuIHByb2plY3QsIGFzIHdlbGwgYXMgYSBsb29rdXAgZW52aXJvbm1lbnQuDQotICogQXNrcyB0aGUgcGF0dGVybiB0byBpbml0aWFsaXplIGl0c2VsZiBmcm9tIHRoZSBsb29rdXAgZW52aXJvbm1lbnQuDQotICogUmV0dXJucyB3aGV0aGVyIGl0IHdhcyBhYmxlIHRvIGluaXRpYWxpemUgdGhlIHBhdHRlcm4uDQotICovDQotcHJpdmF0ZSBib29sZWFuIGNyZWF0ZVBhcnNlcihKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQgPSBwcm9qZWN0LmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsNCi0JSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpOw0KKwkvKioNCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBtZXRob2QgYW5kIHRoZSBtZXRob2QncyBkZWZpbmluZyB0eXBlcyANCisJICogaGF2ZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWVzLg0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVwb3J0UmVmZXJlbmNlKA0KKwkJQXN0Tm9kZSByZWZlcmVuY2UsDQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLA0KKwkJY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMsDQorCQlpbnQgYWNjdXJhY3kpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQogDQotCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhudWxsKTsNCi0JUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9DQotCQluZXcgUHJvYmxlbVJlcG9ydGVyKA0KLQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLA0KLQkJCW9wdGlvbnMsDQotCQkJcHJvYmxlbUZhY3RvcnkpOw0KLQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0gbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIG9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgbmFtZUVudmlyb25tZW50KTsNCi0JdGhpcy5wYXJzZXIgPSBuZXcgTWF0Y2hMb2NhdG9yUGFyc2VyKHByb2JsZW1SZXBvcnRlcik7DQotCXJldHVybiB0aGlzLnBhdHRlcm4uaW5pdGlhbGl6ZUZyb21Mb29rdXBFbnZpcm9ubWVudCh0aGlzLmxvb2t1cEVudmlyb25tZW50KTsNCi19DQotfQ0KKwkJLy8gY3JlYXRlIGRlZmluaW5nIG1ldGhvZCBoYW5kbGUNCisJCUlNZXRob2QgbWV0aG9kID0gdGhpcy5jcmVhdGVNZXRob2RIYW5kbGUobWV0aG9kRGVjbGFyYXRpb24sIGRlZmluaW5nVHlwZU5hbWVzKTsNCisNCisJCS8vIGFjY2VwdCByZWZlcmVuY2UNCisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQorCQkJfHwgcmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgew0KKwkJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZSgoQXN0Tm9kZSkgcmVmZXJlbmNlLCBtZXRob2QsIGFjY3VyYWN5LCB0aGlzKTsNCisJCX0gZWxzZQ0KKwkJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgew0KKwkJCQkvLyBtZXNzYWdlIHJlZiBhcmUgc3RhcnRpbmcgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0DQorCQkJCXRoaXMucmVwb3J0KA0KKwkJCQkJKGludCkgKCgoTWVzc2FnZVNlbmQpIHJlZmVyZW5jZSkubmFtZVNvdXJjZVBvc2l0aW9uID4+IDMyKSwNCisJCQkJCXJlZmVyZW5jZS5zb3VyY2VFbmQsDQorCQkJCQltZXRob2QsDQorCQkJCQlhY2N1cmFjeSk7DQorCQkJfSBlbHNlIHsNCisJCQkJdGhpcy5yZXBvcnQocmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCByZWZlcmVuY2Uuc291cmNlRW5kLCBtZXRob2QsIGFjY3VyYWN5KTsNCisJCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4NCisJICogSXQgaXMgZG9uZSBpbiB0aGUgZ2l2ZW4gZmllbGQgYW5kIGdpdmVuIHR5cGUuDQorCSAqIFRoZSBmaWVsZCdzIGRlZmluaW5nIHR5cGVzIGhhdmUgdGhlIGdpdmVuIHNpbXBsZSBuYW1lcy4NCisJICovDQorCXB1YmxpYyB2b2lkIHJlcG9ydFJlZmVyZW5jZSgNCisJCUFzdE5vZGUgcmVmZXJlbmNlLA0KKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwNCisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwNCisJCWNoYXJbXVtdIGRlZmluaW5nVHlwZU5hbWVzLA0KKwkJaW50IGFjY3VyYWN5KQ0KKwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKw0KKwkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaXNGaWVsZCgpKSB7DQorCQkJLy8gY3JlYXRlIGRlZmluaW5nIGZpZWxkIGhhbmRsZQ0KKwkJCUlGaWVsZCBmaWVsZCA9IHRoaXMuY3JlYXRlRmllbGRIYW5kbGUoZmllbGREZWNsYXJhdGlvbiwgZGVmaW5pbmdUeXBlTmFtZXMpOw0KKw0KKwkJCS8vIGFjY2VwdCByZWZlcmVuY2UNCisJCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQ0KKwkJCQl8fCByZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7DQorCQkJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZSgoQXN0Tm9kZSkgcmVmZXJlbmNlLCBmaWVsZCwgYWNjdXJhY3ksIHRoaXMpOw0KKwkJCX0gZWxzZQ0KKwkJCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsNCisJCQkJCS8vIG1lc3NhZ2UgcmVmIGFyZSBzdGFydGluZyBhdCB0aGUgc2VsZWN0b3Igc3RhcnQNCisJCQkJCXRoaXMucmVwb3J0KA0KKwkJCQkJCShpbnQpICgoKE1lc3NhZ2VTZW5kKSByZWZlcmVuY2UpLm5hbWVTb3VyY2VQb3NpdGlvbiA+PiAzMiksDQorCQkJCQkJcmVmZXJlbmNlLnNvdXJjZUVuZCwNCisJCQkJCQlmaWVsZCwNCisJCQkJCQlhY2N1cmFjeSk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQl0aGlzLnJlcG9ydChyZWZlcmVuY2Uuc291cmNlU3RhcnQsIHJlZmVyZW5jZS5zb3VyY2VFbmQsIGZpZWxkLCBhY2N1cmFjeSk7DQorCQkJCX0NCisJCX0gZWxzZSB7IC8vIGluaXRpYWxpemVyDQorCQkJLy8gY3JlYXRlIGRlZmluaW5nIGluaXRpYWxpemVyDQorCQkJSUluaXRpYWxpemVyIGluaXRpYWxpemVyID0NCisJCQkJdGhpcy5jcmVhdGVJbml0aWFsaXplckhhbmRsZSgNCisJCQkJCXR5cGVEZWNsYXJhdGlvbiwNCisJCQkJCWZpZWxkRGVjbGFyYXRpb24sDQorCQkJCQlkZWZpbmluZ1R5cGVOYW1lcyk7DQorDQorCQkJLy8gYWNjZXB0IHJlZmVyZW5jZQ0KKwkJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQorCQkJCXx8IHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsNCisJCQkJdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKA0KKwkJCQkJKEFzdE5vZGUpIHJlZmVyZW5jZSwNCisJCQkJCWluaXRpYWxpemVyLA0KKwkJCQkJYWNjdXJhY3ksDQorCQkJCQl0aGlzKTsNCisJCQl9IGVsc2UNCisJCQkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7DQorCQkJCQkvLyBtZXNzYWdlIHJlZiBhcmUgc3RhcnRpbmcgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0DQorCQkJCQl0aGlzLnJlcG9ydCgNCisJCQkJCQkoaW50KSAoKChNZXNzYWdlU2VuZCkgcmVmZXJlbmNlKS5uYW1lU291cmNlUG9zaXRpb24gPj4gMzIpLA0KKwkJCQkJCXJlZmVyZW5jZS5zb3VyY2VFbmQsDQorCQkJCQkJaW5pdGlhbGl6ZXIsDQorCQkJCQkJYWNjdXJhY3kpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJdGhpcy5yZXBvcnQocmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCByZWZlcmVuY2Uuc291cmNlRW5kLCBpbml0aWFsaXplciwgYWNjdXJhY3kpOw0KKwkJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHN1cGVyIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBkZWZpbmluZyB0eXBlICh3aXRoIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMpLg0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKA0KKwkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmLA0KKwkJY2hhcltdW10gZGVmaW5pbmdUeXBlTmFtZXMsDQorCQlpbnQgYWNjdXJhY3kpDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorDQorCQkvLyBjcmVhdGUgZGVmaW5pbmcgdHlwZSBoYW5kbGUNCisJCUlUeXBlIHR5cGUgPSB0aGlzLmNyZWF0ZVR5cGVIYW5kbGUoZGVmaW5pbmdUeXBlTmFtZXMpOw0KKw0KKwkJLy8gYWNjZXB0IHR5cGUgcmVmZXJlbmNlDQorCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UodHlwZVJlZiwgdHlwZSwgYWNjdXJhY3ksIHRoaXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLg0KKwkgKiBJdHMgc2ltcGxlIG5hbWVzIGFyZSB0aGUgbmFtZXMgb2YgaXRzIG91dGVyIG1vc3QgdHlwZSB0byB0aGlzIHR5cGUuDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZXBvcnRUeXBlRGVjbGFyYXRpb24oDQorCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLA0KKwkJY2hhcltdW10gc2ltcGxlVHlwZU5hbWVzLA0KKwkJaW50IGFjY3VyYWN5KQ0KKwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKw0KKwkJLy8gY3JlYXRlIHR5cGUgaGFuZGxlDQorCQlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKHNpbXBsZVR5cGVOYW1lcyk7DQorDQorCQkvLyBhY2NlcHQgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9uDQorCQl0aGlzLnJlcG9ydCgNCisJCQl0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsDQorCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwNCisJCQl0eXBlLA0KKwkJCWFjY3VyYWN5KTsNCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgYWRkUG90ZW50aWFsTWF0Y2goSVJlc291cmNlIHJlc291cmNlLCBPcGVuYWJsZSBvcGVuYWJsZSkNCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkJdHJ5IHsNCisJCQlpZiAodGhpcy5wb3RlbnRpYWxNYXRjaGVzTGVuZ3RoID09IHRoaXMucG90ZW50aWFsTWF0Y2hlcy5sZW5ndGgpIHsNCisJCQkJU3lzdGVtLmFycmF5Y29weSgNCisJCQkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcywNCisJCQkJCTAsDQorCQkJCQl0aGlzLnBvdGVudGlhbE1hdGNoZXMgPSBuZXcgUG90ZW50aWFsTWF0Y2hbdGhpcy5wb3RlbnRpYWxNYXRjaGVzTGVuZ3RoICogMl0sDQorCQkJCQkwLA0KKwkJCQkJdGhpcy5wb3RlbnRpYWxNYXRjaGVzTGVuZ3RoKTsNCisJCQl9DQorCQkJdGhpcy5wb3RlbnRpYWxNYXRjaGVzW3RoaXMucG90ZW50aWFsTWF0Y2hlc0xlbmd0aCsrXSA9DQorCQkJCW5ldyBQb3RlbnRpYWxNYXRjaCh0aGlzLCByZXNvdXJjZSwgb3BlbmFibGUpOw0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7DQorCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGg6IGl0IGNvdWxkIG5vdCBmaW5kIGJhc2UgY2xhc3Nlcw0KKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oDQorCQkJCWUsDQorCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQlVJTERFUl9JTklUSUFMSVpBVElPTl9FUlJPUik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZSBhIG5ldyBwYXJzZXIgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBhcyB3ZWxsIGFzIGEgbG9va3VwIGVudmlyb25tZW50Lg0KKwkgKiBBc2tzIHRoZSBwYXR0ZXJuIHRvIGluaXRpYWxpemUgaXRzZWxmIGZyb20gdGhlIGxvb2t1cCBlbnZpcm9ubWVudC4NCisJICogUmV0dXJucyB3aGV0aGVyIGl0IHdhcyBhYmxlIHRvIGluaXRpYWxpemUgdGhlIHBhdHRlcm4uDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gY3JlYXRlUGFyc2VyKEphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KKwkJSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQgPSBwcm9qZWN0LmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsNCisJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSA9IG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKTsNCisNCisJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhudWxsKTsNCisJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPQ0KKwkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoDQorCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLA0KKwkJCQlvcHRpb25zLA0KKwkJCQlwcm9ibGVtRmFjdG9yeSk7DQorCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0NCisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpOw0KKwkJdGhpcy5wYXJzZXIgPSBuZXcgTWF0Y2hMb2NhdG9yUGFyc2VyKHByb2JsZW1SZXBvcnRlcik7DQorCQl0aGlzLnBhcnNlZFVuaXRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsNCisJCXJldHVybiB0aGlzLnBhdHRlcm4uaW5pdGlhbGl6ZUZyb21Mb29rdXBFbnZpcm9ubWVudCh0aGlzLmxvb2t1cEVudmlyb25tZW50KTsNCisJfQ0KKw0KKwlwcm90ZWN0ZWQgT3BlbmFibGUgZ2V0Q3VycmVudE9wZW5hYmxlKCkgew0KKwkJcmV0dXJuIHRoaXMucG90ZW50aWFsTWF0Y2hlc1t0aGlzLnBvdGVudGlhbE1hdGNoZXNJbmRleF0ub3BlbmFibGU7DQorCX0NCisNCisJLyoqDQorCSAqIExvY2F0ZSB0aGUgbWF0Y2hlcyBhbW9uZ3N0IHRoZSBwb3RlbnRpYWwgbWF0Y2hlcy4NCisJICovDQorCXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQorCQkvLyBiaW5kaW5nIHJlc29sdXRpb24NCisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsNCisNCisJCS8vIHBvdGVudGlhbCBtYXRjaCByZXNvbHV0aW9uDQorCQlmb3IgKHRoaXMucG90ZW50aWFsTWF0Y2hlc0luZGV4ID0gMDsNCisJCQl0aGlzLnBvdGVudGlhbE1hdGNoZXNJbmRleCA8IHRoaXMucG90ZW50aWFsTWF0Y2hlc0xlbmd0aDsNCisJCQl0aGlzLnBvdGVudGlhbE1hdGNoZXNJbmRleCsrKSB7DQorCQkJdHJ5IHsNCisJCQkJUG90ZW50aWFsTWF0Y2ggcG90ZW50aWFsTWF0Y2ggPQ0KKwkJCQkJdGhpcy5wb3RlbnRpYWxNYXRjaGVzW3RoaXMucG90ZW50aWFsTWF0Y2hlc0luZGV4XTsNCisJCQkJcG90ZW50aWFsTWF0Y2gubG9jYXRlTWF0Y2hlcygpOw0KKwkJCQlwb3RlbnRpYWxNYXRjaC5yZXNldCgpOw0KKwkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgew0KKwkJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3MgcGF0aDogaXQgY291bGQgbm90IGZpbmQgYmFzZSBjbGFzc2VzDQorCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oDQorCQkJCQllLA0KKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5CVUlMREVSX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsNCisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsNCisJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7DQorCQkJCX0gZWxzZSB7DQorCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvclBhcnNlci5qYXZhCmluZGV4IDQzNzAwMTEuLjJjOGQ4ODYgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3JQYXJzZXIuamF2YQpAQCAtMjQsNzAgKzI0LDc3IEBACiB9DQogcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7DQogCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihhbHdheXNRdWFsaWZpZWQpOw0KLQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7DQorCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsNCisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsNCisJfQ0KIH0NCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaW50IGZsYWcsIGludCByZWNGbGFnKSB7DQogCXN1cGVyLmNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihmbGFnLCByZWNGbGFnKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsNCisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgew0KKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsNCisJfQ0KIH0NCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRmllbGRBY2Nlc3MoYm9vbGVhbiBpc1N1cGVyQWNjZXNzKSB7DQogCXN1cGVyLmNvbnN1bWVGaWVsZEFjY2Vzcyhpc1N1cGVyQWNjZXNzKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOw0KKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7DQorCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7DQorCX0NCiB9DQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgew0KIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOw0KKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7DQorCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7DQorCX0NCiB9DQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCkgew0KIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOw0KKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7DQorCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7DQorCX0NCiB9DQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsNCiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOw0KLQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7DQorCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsNCisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsNCisJfQ0KIH0NCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpIHsNCiAJc3VwZXIuY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsNCisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgew0KKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsNCisJfQ0KIH0NCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgew0KIAlzdXBlci5jb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7DQotCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSk7DQorCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsNCisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSk7DQorCX0NCiB9DQogcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgZ2V0VHlwZVJlZmVyZW5jZShpbnQgZGltKSB7DQogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IHN1cGVyLmdldFR5cGVSZWZlcmVuY2UoZGltKTsNCi0JdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHR5cGVSZWYpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHR5cGUgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUNCisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgeyANCisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0eXBlUmVmKTsgLy8gTkI6IERvbid0IGNoZWNrIGNvbnRhaW5lciBzaW5jZSB0eXBlIHJlZmVyZW5jZSBjYW4gaGFwcGVuIGFueXdoZXJlDQorCX0NCiAJcmV0dXJuIHR5cGVSZWY7DQogfQ0KIHByb3RlY3RlZCBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCkgew0KIAlOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOw0KLQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcobmFtZVJlZik7IC8vIE5COiBEb24ndCBjaGVjayBjb250YWluZXIgc2luY2UgdW5zcGVjaWZpZWQgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUNCisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgew0KKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKG5hbWVSZWYpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHVuc3BlY2lmaWVkIHJlZmVyZW5jZSBjYW4gaGFwcGVuIGFueXdoZXJlDQorCX0NCiAJcmV0dXJuIG5hbWVSZWY7DQogfQ0KIHByb3RlY3RlZCBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkgew0KIAlOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOw0KLQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcobmFtZVJlZik7IC8vIE5COiBEb24ndCBjaGVjayBjb250YWluZXIgc2luY2UgdW5zcGVjaWZpZWQgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUNCisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgew0KKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKG5hbWVSZWYpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHVuc3BlY2lmaWVkIHJlZmVyZW5jZSBjYW4gaGFwcGVuIGFueXdoZXJlDQorCX0NCiAJcmV0dXJuIG5hbWVSZWY7DQogfQ0KIC8qKg0KLSAqIFBhcnNlcyB0aGUgZ2l2ZW4gc291cmNlIHVuaXQgaW4gMiB0aW1lczoNCi0gKiAtIGZpcnN0IGRvIGEgZGlldCBwYXJzZSB0byBkZXRlcm1pbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdA0KLSAqIC0gdGhlbiBkbyBhIG1ldGhvZCBib2R5IHBhcnNlIG9mIGVhY2ggbWV0aG9kIHRvIGRldGVybWluZSB0aGUgcmVmZXJlbmNlcw0KLSAqLw0KLXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZSgNCi0JSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCANCi0JQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsNCi0NCi0JdGhpcy5kaWV0ID0gdHJ1ZTsNCi0JQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IHN1cGVyLnBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsNCi0JdGhpcy5kaWV0ID0gZmFsc2U7DQotCXRoaXMucGFyc2VCb2RpZXModW5pdCk7DQotCXJldHVybiB1bml0Ow0KLX0NCi0vKioNCiAgKiBQYXJzZXMgdGhlIG1ldGhvZCBib2RpZXMgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQNCiAgKi8NCi1wcml2YXRlIHZvaWQgcGFyc2VCb2RpZXMoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgew0KK3B1YmxpYyB2b2lkIHBhcnNlQm9kaWVzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsNCiAJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOw0KIAlpZiAodHlwZXMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgew0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YQppbmRleCBmYjViZWZlLi4xYjFjOGE1IDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoU2V0LmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaFNldC5qYXZhCkBAIC00MiwxOCArNDIsMTggQEAKIAl0aGlzLm1hdGNoQ29udGFpbmVyID0gbG9jYXRvci5wYXR0ZXJuLm1hdGNoQ29udGFpbmVyKCk7DQogfQ0KIHB1YmxpYyB2b2lkIGFkZFBvc3NpYmxlTWF0Y2goQXN0Tm9kZSBub2RlKSB7DQotCXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbm9kZSk7DQorCXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbmV3IEludGVnZXIoU2VhcmNoUGF0dGVybi5QT1NTSUJMRV9NQVRDSCkpOw0KIH0NCiBwdWJsaWMgdm9pZCBhZGRUcnVzdGVkTWF0Y2goQXN0Tm9kZSBub2RlKSB7DQotCXRoaXMubWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbm9kZSk7DQorCXRoaXMubWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbmV3IEludGVnZXIoU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCkpOw0KIH0NCiBwdWJsaWMgdm9pZCBjaGVja01hdGNoaW5nKEFzdE5vZGUgbm9kZSkgew0KLQlpbnQgbWF0Y2hMZXZlbCA9IHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSk7DQorCWludCBtYXRjaExldmVsID0gdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hMZXZlbChub2RlLCBmYWxzZSk7DQogCXN3aXRjaCAobWF0Y2hMZXZlbCkgew0KIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlBPU1NJQkxFX01BVENIOg0KIAkJCXRoaXMuYWRkUG9zc2libGVNYXRjaChub2RlKTsNCiAJCQlicmVhazsNCi0JCWNhc2UgU2VhcmNoUGF0dGVybi5UUlVTVEVEX01BVENIOg0KKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIOg0KIAkJCXRoaXMuYWRkVHJ1c3RlZE1hdGNoKG5vZGUpOw0KIAl9DQogfQ0KQEAgLTEwOSw5ICsxMDksMTUgQEAKIAlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAJCUFzdE5vZGUgbm9kZSA9IG5vZGVzW2ldOw0KLQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsNCisJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG5vZGUpOw0KIAkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5NRVRIT0QpICE9IDApIHsNCi0JCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKG5vZGUsIG1ldGhvZCwgZGVmaW5pbmdUeXBlTmFtZXMsIHRoaXMuYWNjdXJhY3kpOw0KKwkJCXRoaXMubG9jYXRvci5yZXBvcnRSZWZlcmVuY2UoDQorCQkJCW5vZGUsIA0KKwkJCQltZXRob2QsIA0KKwkJCQlkZWZpbmluZ1R5cGVOYW1lcywgDQorCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/DQorCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6DQorCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOw0KIAkJfQ0KIAl9DQogCWlmICh0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCkubGVuZ3RoID09IDApIHsNCkBAIC0xMjgsOCArMTM0LDkgQEAKIAkJLy8gbW92ZSB0aGUgcG90ZW50aWFsIG1hdGNoaW5nIG5vZGVzIHRoYXQgZXhhY3RseSBtYXRjaCB0aGUgc2VhcmNoIHBhdHRlcm4gdG8gdGhlIG1hdGNoaW5nIG5vZGVzIHNldA0KIAkJZm9yIChFbnVtZXJhdGlvbiBwb3RlbnRpYWxNYXRjaGVzID0gdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLmtleXMoKTsgcG90ZW50aWFsTWF0Y2hlcy5oYXNNb3JlRWxlbWVudHMoKTspIHsNCiAJCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgcG90ZW50aWFsTWF0Y2hlcy5uZXh0RWxlbWVudCgpOw0KLQkJCWlmICh0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaGVzKG5vZGUpKSB7DQotCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbm9kZSk7DQorCQkJaW50IGxldmVsID0gdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hMZXZlbChub2RlLCB0cnVlKTsNCisJCQlpZiAobGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCB8fCBsZXZlbCA9PSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0gpIHsNCisJCQkJdGhpcy5tYXRjaGluZ05vZGVzLnB1dChub2RlLCBuZXcgSW50ZWdlcihsZXZlbCkpOw0KIAkJCX0NCiAJCX0NCiAJCXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2RlcyA9IG5ldyBIYXNodGFibGUoKTsNCkBAIC0xMzcsOCArMTQ0LDggQEAKIAkNCiAJLy8gcGFja2FnZSBkZWNsYXJhdGlvbg0KIAlJbXBvcnRSZWZlcmVuY2UgcGtnID0gdW5pdC5jdXJyZW50UGFja2FnZTsNCi0JaWYgKHBrZyAhPSBudWxsICYmIHRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQocGtnKSA9PSBwa2cpIHsNCi0JCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUocGtnKTsNCisJSW50ZWdlciBsZXZlbDsNCisJaWYgKHBrZyAhPSBudWxsICYmIChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUocGtnKSkgIT0gbnVsbCkgew0KIAkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DT01QSUxBVElPTl9VTklUKSAhPSAwKSB7DQogCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFBhY2thZ2VEZWNsYXJhdGlvbihwa2cpOw0KIAkJfQ0KQEAgLTE0OSwxMCArMTU2LDEzIEBACiAJaWYgKGltcG9ydHMgIT0gbnVsbCkgew0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7DQogCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiA9IGltcG9ydHNbaV07DQotCQkJaWYgKHRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQoaW1wb3J0UmVmKSA9PSBpbXBvcnRSZWYpIHsNCi0JCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShpbXBvcnRSZWYpOw0KKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKGltcG9ydFJlZikpICE9IG51bGwpIHsNCiAJCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DT01QSUxBVElPTl9VTklUKSAhPSAwKSB7DQotCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0SW1wb3J0KGltcG9ydFJlZiwgdGhpcy5hY2N1cmFjeSk7DQorCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0SW1wb3J0KA0KKwkJCQkJCWltcG9ydFJlZiwgDQorCQkJCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8NCisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOg0KKwkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOw0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KQEAgLTE2MywxMCArMTczLDE0IEBACiAJaWYgKHR5cGVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsNCiAJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHR5cGVzW2ldOw0KLQkJCWlmICh0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KHR5cGUpID09IHR5cGUpIHsNCi0JCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZSh0eXBlKTsNCisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZSh0eXBlKSkgIT0gbnVsbCkgew0KIAkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNPTVBJTEFUSU9OX1VOSVQpICE9IDApIHsNCi0JCQkJCXRoaXMubG9jYXRvci5yZXBvcnRUeXBlRGVjbGFyYXRpb24odHlwZSwgbmV3IGNoYXJbXVtdIHt0eXBlLm5hbWV9LCB0aGlzLmFjY3VyYWN5KTsNCisJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRUeXBlRGVjbGFyYXRpb24oDQorCQkJCQkJdHlwZSwgDQorCQkJCQkJbmV3IGNoYXJbXVtdIHt0eXBlLm5hbWV9LCANCisJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPw0KKwkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6DQorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7DQogCQkJCX0NCiAJCQl9DQogCQkJdGhpcy5yZXBvcnRNYXRjaGluZyh0eXBlLCBFTVBUWV9DSEFSX0NIQVIpOw0KQEAgLTE4Miw5ICsxOTYsMTYgQEAKIAlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOw0KIAlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7DQogCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsNCi0JCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7DQorCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsNCiAJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uRklFTEQpICE9IDApIHsNCi0JCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKG5vZGUsIHR5cGUsIGZpZWxkLCBkZWZpbmluZ1R5cGVOYW1lcywgdGhpcy5hY2N1cmFjeSk7DQorCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFJlZmVyZW5jZSgNCisJCQkJbm9kZSwgDQorCQkJCXR5cGUsIA0KKwkJCQlmaWVsZCwgDQorCQkJCWRlZmluaW5nVHlwZU5hbWVzLCANCisJCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8NCisJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoNCisJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7DQogCQl9DQogCX0NCiB9DQpAQCAtMTk1LDE2ICsyMTYsMjEgQEAKICAqLw0KIHByaXZhdGUgdm9pZCByZXBvcnRNYXRjaGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQogCWNoYXJbXVtdIGRlZmluaW5nVHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChlbmNsb3NpbmdUeXBlTmFtZXMsIHR5cGUubmFtZSk7DQorCUludGVnZXIgbGV2ZWw7DQogCQ0KIAkvLyBmaWVsZHMNCiAJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGUuZmllbGRzOw0KIAlpZiAoZmllbGRzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7DQogCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsNCi0JCQlpZiAodGhpcy5tYXRjaGluZ05vZGVzLmdldChmaWVsZCkgPT0gZmllbGQpIHsNCi0JCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShmaWVsZCk7DQorCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoZmllbGQpKSAhPSBudWxsKSB7DQogCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsNCi0JCQkJCXRoaXMubG9jYXRvci5yZXBvcnRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCBkZWZpbmluZ1R5cGVOYW1lcywgdGhpcy5hY2N1cmFjeSk7DQorCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0RmllbGREZWNsYXJhdGlvbigNCisJCQkJCQlmaWVsZCwgDQorCQkJCQkJZGVmaW5pbmdUeXBlTmFtZXMsIA0KKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/DQorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoNCisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsNCiAJCQkJfQ0KIAkJCX0NCiAJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKGZpZWxkLCBkZWZpbmluZ1R5cGVOYW1lcywgdHlwZSk7DQpAQCAtMjE2LDEwICsyNDIsMTQgQEAKIAlpZiAobWV0aG9kcyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsNCiAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07DQotCQkJaWYgKHRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobWV0aG9kKSA9PSBtZXRob2QpIHsNCi0JCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZXRob2QpOw0KKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG1ldGhvZCkpICE9IG51bGwpIHsNCiAJCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgew0KLQkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgZGVmaW5pbmdUeXBlTmFtZXMsIHRoaXMuYWNjdXJhY3kpOw0KKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydE1ldGhvZERlY2xhcmF0aW9uKA0KKwkJCQkJCW1ldGhvZCwgDQorCQkJCQkJZGVmaW5pbmdUeXBlTmFtZXMsIA0KKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/DQorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoNCisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsNCiAJCQkJfQ0KIAkJCX0NCiAJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKG1ldGhvZCwgZGVmaW5pbmdUeXBlTmFtZXMpOw0KQEAgLTIzMSwxMSArMjYxLDE1IEBACiAJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsNCiAJCQlNZW1iZXJUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW2ldOw0KLQkJCWlmICh0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KG1lbWJlclR5cGUpID09IG1lbWJlclR5cGUpIHsNCi0JCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZW1iZXJUeXBlKTsNCisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZW1iZXJUeXBlKSkgIT0gbnVsbCkgew0KIAkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7DQogCQkJCQljaGFyW11bXSBtZW1iZXJUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KGRlZmluaW5nVHlwZU5hbWVzLCBtZW1iZXJUeXBlLm5hbWUpOw0KLQkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFR5cGVEZWNsYXJhdGlvbihtZW1iZXJUeXBlLCBtZW1iZXJUeXBlTmFtZXMsIHRoaXMuYWNjdXJhY3kpOw0KKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFR5cGVEZWNsYXJhdGlvbigNCisJCQkJCQltZW1iZXJUeXBlLCANCisJCQkJCQltZW1iZXJUeXBlTmFtZXMsIA0KKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/DQorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoNCisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsNCiAJCQkJfQ0KIAkJCX0NCiAJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKG1lbWJlclR5cGUsIGRlZmluaW5nVHlwZU5hbWVzKTsNCkBAIC0yNDQsMjAgKzI3OCwyOCBAQAogDQogCS8vIHN1cGVyIHR5cGVzDQogCVR5cGVSZWZlcmVuY2Ugc3VwZXJDbGFzcyA9IHR5cGUuc3VwZXJjbGFzczsNCi0JaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiB0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KHN1cGVyQ2xhc3MpID09IHN1cGVyQ2xhc3MpIHsNCi0JCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoc3VwZXJDbGFzcyk7DQorCWlmIChzdXBlckNsYXNzICE9IG51bGwgJiYgKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShzdXBlckNsYXNzKSkgIT0gbnVsbCkgew0KIAkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgew0KLQkJCXRoaXMubG9jYXRvci5yZXBvcnRTdXBlclR5cGVSZWZlcmVuY2Uoc3VwZXJDbGFzcywgZGVmaW5pbmdUeXBlTmFtZXMsIHRoaXMuYWNjdXJhY3kpOw0KKwkJCXRoaXMubG9jYXRvci5yZXBvcnRTdXBlclR5cGVSZWZlcmVuY2UoDQorCQkJCXN1cGVyQ2xhc3MsIA0KKwkJCQlkZWZpbmluZ1R5cGVOYW1lcywgDQorCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/DQorCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6DQorCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOw0KIAkJfQ0KIAl9DQogCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlczsNCiAJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7DQogCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgew0KIAkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV07DQotCQkJaWYgKHRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQoc3VwZXJJbnRlcmZhY2UpID09IHN1cGVySW50ZXJmYWNlKSB7DQotCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoc3VwZXJJbnRlcmZhY2UpOw0KKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KHN1cGVySW50ZXJmYWNlKSkgIT0gbnVsbCkgew0KIAkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7DQotCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKHN1cGVySW50ZXJmYWNlLCBkZWZpbmluZ1R5cGVOYW1lcywgdGhpcy5hY2N1cmFjeSk7DQorCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKA0KKwkJCQkJCXN1cGVySW50ZXJmYWNlLCANCisJCQkJCQlkZWZpbmluZ1R5cGVOYW1lcywgDQorCQkJCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8NCisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOg0KKwkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOw0KIAkJCQl9DQogCQkJfQ0KIAkJfQ0KQEAgLTI2NiwxNyArMzA4LDU1IEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCiAJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JcmVzdWx0LmFwcGVuZCgiRXhhY3QgbWF0Y2hlczoiLypub25OTFMqLyk7DQorCXJlc3VsdC5hcHBlbmQoIkV4YWN0IG1hdGNoZXM6Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gdGhpcy5tYXRjaGluZ05vZGVzLmtleXMoKTsgZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsNCi0JCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpZW51bS5uZXh0RWxlbWVudCgpOw0KLQkJcmVzdWx0LmFwcGVuZChub2RlLnRvU3RyaW5nKDEpKTsNCisJCU9iamVjdCB2YWx1ZSA9IHRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7DQorCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7DQorCQkJcmVzdWx0LmFwcGVuZCgnXHQnKTsNCisJCQlpbnQgYWNjdXJhY3kgPSAoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCk7DQorCQkJc3dpdGNoIChhY2N1cmFjeSkgew0KKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU1QT1NTSUJMRV9NQVRDSDoNCisJCQkJCXJlc3VsdC5hcHBlbmQoIklNUE9TU0lCTEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlBPU1NJQkxFX01BVENIOg0KKwkJCQkJcmVzdWx0LmFwcGVuZCgiUE9TU0lCTEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0g6DQorCQkJCQlyZXN1bHQuYXBwZW5kKCJJTkFDQ1VSQVRFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJYnJlYWs7DQorCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSDoNCisJCQkJCXJlc3VsdC5hcHBlbmQoIkFDQ1VSQVRFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfSANCisJCXJlc3VsdC5hcHBlbmQobm9kZS50b1N0cmluZygwKSk7DQogCX0NCi0JcmVzdWx0LmFwcGVuZCgiXG5Qb3RlbnRpYWwgbWF0Y2hlczoiLypub25OTFMqLyk7DQorCXJlc3VsdC5hcHBlbmQoIlxuUG90ZW50aWFsIG1hdGNoZXM6Iik7IC8vJE5PTi1OTFMtMSQNCiAJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLmtleXMoKTsgZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsNCi0JCXJlc3VsdC5hcHBlbmQoIlxuIi8qbm9uTkxTKi8pOw0KKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJA0KIAkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpZW51bS5uZXh0RWxlbWVudCgpOw0KLQkJcmVzdWx0LmFwcGVuZChub2RlLnRvU3RyaW5nKDEpKTsNCisJCU9iamVjdCB2YWx1ZSA9IHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7DQorCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7DQorCQkJcmVzdWx0LmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWludCBhY2N1cmFjeSA9ICgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKTsNCisJCQlzd2l0Y2ggKGFjY3VyYWN5KSB7DQorCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTVBPU1NJQkxFX01BVENIOg0KKwkJCQkJcmVzdWx0LmFwcGVuZCgiSU1QT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uUE9TU0lCTEVfTUFUQ0g6DQorCQkJCQlyZXN1bHQuYXBwZW5kKCJQT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU5BQ0NVUkFURV9NQVRDSDoNCisJCQkJCXJlc3VsdC5hcHBlbmQoIklOQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlicmVhazsNCisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIOg0KKwkJCQkJcmVzdWx0LmFwcGVuZCgiQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlyZXN1bHQuYXBwZW5kKG5vZGUudG9TdHJpbmcoMCkpOw0KIAl9DQogCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2REZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggY2I3NTMwOC4uNDYyZDcxNSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2REZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAJfQ0KIH0NCiBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCl7DQotCXJldHVybiAiTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuOiAiLypub25OTFMqLzsNCisJcmV0dXJuICJNZXRob2REZWNsYXJhdGlvblBhdHRlcm46ICI7IC8vJE5PTi1OTFMtMSQNCiB9DQogLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI2luZGV4RW50cnlQcmVmaXgNCkBAIC05MCwxMTcgKzkwLDYgQEAKIAlyZXR1cm4gQ0xBU1M7DQogfQ0KIC8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlpZiAoIShub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pKSByZXR1cm4gZmFsc2U7DQotDQotCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbilub2RlOw0KLQkNCi0JLy8gc2VsZWN0b3INCi0JaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1ldGhvZC5zZWxlY3RvcikpDQotCQlyZXR1cm4gZmFsc2U7DQotDQotCS8vIGRlY2xhcmluZyB0eXBlDQotCU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IG1ldGhvZC5iaW5kaW5nOw0KLQlpZiAocmVzb2x2ZSAmJiBiaW5kaW5nICE9IG51bGwpIHsNCi0JCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nVHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7DQotCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7DQotCQkJaWYgKCFiaW5kaW5nLmlzU3RhdGljKCkgJiYgIWJpbmRpbmcuaXNQcml2YXRlKCkpIHsNCi0JCQkJaWYgKCF0aGlzLm1hdGNoZXNBc1N1YnR5cGUoZGVjbGFyaW5nVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0gZWxzZSB7DQotCQkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nVHlwZSkpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8vIHJldHVybiB0eXBlDQotCWlmICh0aGlzLnJldHVyblF1YWxpZmljYXRpb24gPT0gbnVsbCkgew0KLQkJaWYgKHRoaXMucmV0dXJuU2ltcGxlTmFtZSAhPSBudWxsKSB7DQotCQkJVHlwZVJlZmVyZW5jZSBtZXRob2RSZXR1cm5UeXBlID0gbWV0aG9kLnJldHVyblR5cGU7DQotCQkJaWYgKG1ldGhvZFJldHVyblR5cGUgIT0gbnVsbCkgew0KLQkJCQljaGFyW11bXSBtZXRob2RSZXR1cm5UeXBlTmFtZSA9IG1ldGhvZFJldHVyblR5cGUuZ2V0VHlwZU5hbWUoKTsNCi0JCQkJY2hhcltdIHNvdXJjZU5hbWUgPSB0aGlzLnRvQXJyYXlOYW1lKA0KLQkJCQkJbWV0aG9kUmV0dXJuVHlwZU5hbWVbbWV0aG9kUmV0dXJuVHlwZU5hbWUubGVuZ3RoLTFdLCANCi0JCQkJCW1ldGhvZFJldHVyblR5cGUuZGltZW5zaW9ucygpKTsNCi0JCQkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMucmV0dXJuU2ltcGxlTmFtZSwgc291cmNlTmFtZSkpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJaWYgKHJlc29sdmUgDQotCQkJCSYmIGJpbmRpbmcgIT0gbnVsbCANCi0JCQkJJiYgIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5yZXR1cm5TaW1wbGVOYW1lLCB0aGlzLnJldHVyblF1YWxpZmljYXRpb24sIGJpbmRpbmcucmV0dXJuVHlwZSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQkNCi0JLy8gcGFyYW1ldGVyIHR5cGVzDQotCWludCBwYXJhbWV0ZXJDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7DQotCWlmIChwYXJhbWV0ZXJDb3VudCA+IC0xKSB7DQotCQlpbnQgYXJndW1lbnRDb3VudCA9IG1ldGhvZC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBtZXRob2QuYXJndW1lbnRzLmxlbmd0aDsNCi0JCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JDQotCQlpZiAocmVzb2x2ZSAmJiBiaW5kaW5nICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsNCi0JCQkJY2hhcltdIHF1YWxpZmljYXRpb24gPSB0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldOw0KLQkJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07DQotCQkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0eXBlLCBxdWFsaWZpY2F0aW9uLCBiaW5kaW5nLnBhcmFtZXRlcnNbaV0pKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQmluZGluZykNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEJpbmRpbmcgYmluZGluZykgew0KLQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykpIHJldHVybiBmYWxzZTsNCi0NCi0JTWV0aG9kQmluZGluZyBtZXRob2QgPSAoTWV0aG9kQmluZGluZyliaW5kaW5nOw0KLQkNCi0JLy8gc2VsZWN0b3INCi0JaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1ldGhvZC5zZWxlY3RvcikpDQotCQlyZXR1cm4gZmFsc2U7DQotDQotCS8vIGRlY2xhcmluZyB0eXBlDQotCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5kZWNsYXJpbmdDbGFzczsNCi0JaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgew0KLQkJaWYgKCFtZXRob2QuaXNTdGF0aWMoKSAmJiAhbWV0aG9kLmlzUHJpdmF0ZSgpKSB7DQotCQkJaWYgKCF0aGlzLm1hdGNoZXNBc1N1YnR5cGUoZGVjbGFyaW5nVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pKQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9IGVsc2Ugew0KLQkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nVHlwZSkpDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyByZXR1cm4gdHlwZQ0KLQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5yZXR1cm5TaW1wbGVOYW1lLCB0aGlzLnJldHVyblF1YWxpZmljYXRpb24sIG1ldGhvZC5yZXR1cm5UeXBlKSkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQkNCi0JLy8gcGFyYW1ldGVyIHR5cGVzDQotCWludCBwYXJhbWV0ZXJDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7DQotCWlmIChwYXJhbWV0ZXJDb3VudCA+IC0xKSB7DQotCQlpbnQgYXJndW1lbnRDb3VudCA9IG1ldGhvZC5wYXJhbWV0ZXJzID09IG51bGwgPyAwIDogbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOw0KLQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7DQotCQkJY2hhcltdIHF1YWxpZmljYXRpb24gPSB0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldOw0KLQkJCWNoYXJbXSB0eXBlID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXTsNCi0JCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgbWV0aG9kLnBhcmFtZXRlcnNbaV0pKQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzQmluYXJ5KE9iamVjdCwgT2JqZWN0KQ0KICAqLw0KIHB1YmxpYyBib29sZWFuIG1hdGNoZXNCaW5hcnkoT2JqZWN0IGJpbmFyeUluZm8sIE9iamVjdCBlbmNsb3NpbmdCaW5hcnlJbmZvKSB7DQpAQCAtMjQ2LDQgKzEzNSwxMDQgQEAKIA0KIAlyZXR1cm4gdHJ1ZTsNCiB9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKCEobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbilub2RlOw0KKw0KKwlpZiAocmVzb2x2ZSkgew0KKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChtZXRob2QuYmluZGluZyk7DQorCX0gZWxzZSB7DQorCQkvLyBzZWxlY3Rvcg0KKwkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1ldGhvZC5zZWxlY3RvcikpDQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCQkvLyByZXR1cm4gdHlwZQ0KKwkJVHlwZVJlZmVyZW5jZSBtZXRob2RSZXR1cm5UeXBlID0gbWV0aG9kLnJldHVyblR5cGU7DQorCQlpZiAobWV0aG9kUmV0dXJuVHlwZSAhPSBudWxsKSB7DQorCQkJY2hhcltdW10gbWV0aG9kUmV0dXJuVHlwZU5hbWUgPSBtZXRob2RSZXR1cm5UeXBlLmdldFR5cGVOYW1lKCk7DQorCQkJY2hhcltdIHNvdXJjZU5hbWUgPSB0aGlzLnRvQXJyYXlOYW1lKA0KKwkJCQltZXRob2RSZXR1cm5UeXBlTmFtZVttZXRob2RSZXR1cm5UeXBlTmFtZS5sZW5ndGgtMV0sIA0KKwkJCQltZXRob2RSZXR1cm5UeXBlLmRpbWVuc2lvbnMoKSk7DQorCQkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMucmV0dXJuU2ltcGxlTmFtZSwgc291cmNlTmFtZSkpDQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJfQ0KKwkJCQ0KKwkJLy8gcGFyYW1ldGVyIHR5cGVzDQorCQlpbnQgcGFyYW1ldGVyQ291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOw0KKwkJaWYgKHBhcmFtZXRlckNvdW50ID4gLTEpIHsNCisJCQlpbnQgYXJndW1lbnRDb3VudCA9IG1ldGhvZC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBtZXRob2QuYXJndW1lbnRzLmxlbmd0aDsNCisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQl9DQorDQorCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwlpbnQgbGV2ZWw7DQorDQorCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsNCisJDQorCS8vIHNlbGVjdG9yDQorCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNlbGVjdG9yLCBtZXRob2Quc2VsZWN0b3IpKQ0KKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCS8vIGRlY2xhcmluZyB0eXBlDQorCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5kZWNsYXJpbmdDbGFzczsNCisJaWYgKCFtZXRob2QuaXNTdGF0aWMoKSAmJiAhbWV0aG9kLmlzUHJpdmF0ZSgpKSB7DQorCQlsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEFzU3VidHlwZShkZWNsYXJpbmdUeXBlLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7DQorCX0gZWxzZSB7DQorCQlsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ1R5cGUpOw0KKwl9DQorCWlmIChsZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7DQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJfQ0KKw0KKwkvLyByZXR1cm4gdHlwZQ0KKwlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMucmV0dXJuU2ltcGxlTmFtZSwgdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uLCBtZXRob2QucmV0dXJuVHlwZSk7DQorCXN3aXRjaCAobmV3TGV2ZWwpIHsNCisJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJbGV2ZWwgPSBuZXdMZXZlbDsNCisJCQlicmVhazsNCisJfQ0KKwkJDQorCS8vIHBhcmFtZXRlciB0eXBlcw0KKwlpbnQgcGFyYW1ldGVyQ291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOw0KKwlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgew0KKwkJaW50IGFyZ3VtZW50Q291bnQgPSBtZXRob2QucGFyYW1ldGVycyA9PSBudWxsID8gMCA6IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsNCisJCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7DQorCQkJY2hhcltdIHF1YWxpZmljYXRpb24gPSB0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldOw0KKwkJCWNoYXJbXSB0eXBlID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXTsNCisJCQluZXdMZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgbWV0aG9kLnBhcmFtZXRlcnNbaV0pOw0KKwkJCXN3aXRjaCAobmV3TGV2ZWwpIHsNCisJCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOg0KKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwNCisJCQkJCWJyZWFrOw0KKwkJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSA0KKwkJCQkJbGV2ZWwgPSBuZXdMZXZlbDsNCisJCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gbGV2ZWw7DQorfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFBhdHRlcm4uamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCmluZGV4IGQxMTQ2ZWYuLjUzODhlMDkgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCkBAIC04NSw0NSArODUsNDUgQEAKIAlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOw0KIAlpZiAoZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKSANCiAJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSkuYXBwZW5kKCcuJyk7DQotCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKi4iLypub25OTFMqLyk7DQorCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKi4iKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgew0KIAkJYnVmZmVyLmFwcGVuZChzZWxlY3Rvcik7DQogCX0gZWxzZSB7DQotCQlidWZmZXIuYXBwZW5kKCIqIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkDQogCX0NCiAJYnVmZmVyLmFwcGVuZCgnKCcpOw0KIAlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgew0KLQkJYnVmZmVyLmFwcGVuZCgiLi4uIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQNCiAJfSBlbHNlIHsNCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQotCQkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlpZiAocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7DQogCQkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID09IG51bGwpIGJ1ZmZlci5hcHBlbmQoJyonKTsgZWxzZSBidWZmZXIuYXBwZW5kKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsNCiAJCX0NCiAJfQ0KIAlidWZmZXIuYXBwZW5kKCcpJyk7DQogCWlmIChyZXR1cm5RdWFsaWZpY2F0aW9uICE9IG51bGwpIA0KLQkJYnVmZmVyLmFwcGVuZCgiIC0tPiAiLypub25OTFMqLykuYXBwZW5kKHJldHVyblF1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOw0KLQllbHNlIGlmIChyZXR1cm5TaW1wbGVOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIiAtLT4gIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiIC0tPiAiKS5hcHBlbmQocmV0dXJuUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7IC8vJE5PTi1OTFMtMSQNCisJZWxzZSBpZiAocmV0dXJuU2ltcGxlTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIgLS0+ICIpOyAvLyROT04tTkxTLTEkDQogCWlmIChyZXR1cm5TaW1wbGVOYW1lICE9IG51bGwpIA0KIAkJYnVmZmVyLmFwcGVuZChyZXR1cm5TaW1wbGVOYW1lKTsNCi0JZWxzZSBpZiAocmV0dXJuUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIi8qbm9uTkxTKi8pOw0KLQlidWZmZXIuYXBwZW5kKCIsICIvKm5vbk5MUyovKTsNCisJZWxzZSBpZiAocmV0dXJuUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQNCisJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2gobWF0Y2hNb2RlKXsNCiAJCWNhc2UgRVhBQ1RfTUFUQ0ggOiANCi0JCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQUkVGSVhfTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUEFUVEVSTl9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCiAJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEKaW5kZXggMDNjMTFlZi4uMGI5NWEyYyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTcwLDcgKzcwLDcgQEAKIAl9DQogfQ0KIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybk5hbWUoKXsNCi0JcmV0dXJuICJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiAiLypub25OTFMqLzsNCisJcmV0dXJuICJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiAiOyAvLyROT04tTkxTLTEkDQogfQ0KIC8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNpbmRleEVudHJ5UHJlZml4DQpAQCAtODQsNzYgKzg0LDEyMCBAQAogCQkJaXNDYXNlU2Vuc2l0aXZlKTsNCiB9DQogLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb2RlIGdlbiB3aWxsIHVzZSBhbiBpbnZva2UgdmlydHVhbCBmb3IgDQotICogdGhpcyBtZXNzYWdlIHNlbmQgb3Igbm90Lg0KLSAqLw0KLXByaXZhdGUgYm9vbGVhbiBpc1ZpcnR1YWxJbnZva2UoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQpIHsNCi0JcmV0dXJuICFtZXNzYWdlU2VuZC5iaW5kaW5nLmlzU3RhdGljKCkgJiYgIW1lc3NhZ2VTZW5kLmlzU3VwZXJBY2Nlc3MoKSAmJiAhbWVzc2FnZVNlbmQuYmluZGluZy5pc1ByaXZhdGUoKTsNCi19DQotLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoQ29udGFpbmVyKCkNCiAgKi8NCiBwcm90ZWN0ZWQgaW50IG1hdGNoQ29udGFpbmVyKCkgew0KIAlyZXR1cm4gTUVUSE9EIHwgRklFTEQ7DQogfQ0KLS8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlpZiAoIShub2RlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpKSByZXR1cm4gZmFsc2U7DQogDQorcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZUZyb21Mb29rdXBFbnZpcm9ubWVudChMb29rdXBFbnZpcm9ubWVudCBlbnYpIHsNCisJdGhpcy5hbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lcyA9IHRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLm1hdGNoTW9kZSwgZW52KTsNCisJcmV0dXJuIHRoaXMuYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMgPT0gbnVsbCB8fCB0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzICE9IE5PVF9GT1VORF9ERUNMQVJJTkdfVFlQRTsgDQorfQ0KKw0KKy8qKg0KKyAqIFJldHVybnMgd2hldGhlciB0aGUgY29kZSBnZW4gd2lsbCB1c2UgYW4gaW52b2tlIHZpcnR1YWwgZm9yIA0KKyAqIHRoaXMgbWVzc2FnZSBzZW5kIG9yIG5vdC4NCisgKi8NCitwcml2YXRlIGJvb2xlYW4gaXNWaXJ0dWFsSW52b2tlKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCkgew0KKwlyZXR1cm4gIW1ldGhvZC5pc1N0YXRpYygpICYmICFtZXNzYWdlU2VuZC5pc1N1cGVyQWNjZXNzKCkgJiYgIW1ldGhvZC5pc1ByaXZhdGUoKTsNCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKCEobm9kZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQogCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKW5vZGU7DQogDQorCWlmIChyZXNvbHZlKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKG1lc3NhZ2VTZW5kLmJpbmRpbmcsIG1lc3NhZ2VTZW5kKTsNCisJfSBlbHNlIHsNCisJCS8vIHNlbGVjdG9yDQorCQlpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsICYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1lc3NhZ2VTZW5kLnNlbGVjdG9yKSkNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkNCisJCS8vIGFyZ3VtZW50IHR5cGVzDQorCQlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7DQorCQlpZiAoYXJndW1lbnRDb3VudCA+IC0xKSB7DQorCQkJaW50IHBhcmFtZXRlckNvdW50ID0gbWVzc2FnZVNlbmQuYXJndW1lbnRzID09IG51bGwgPyAwIDogbWVzc2FnZVNlbmQuYXJndW1lbnRzLmxlbmd0aDsNCisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQl9DQorDQorCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nLCBNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCkgew0KKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJaW50IGxldmVsOw0KKw0KKwlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IChNZXRob2RCaW5kaW5nKWJpbmRpbmc7DQorDQogCS8vIHNlbGVjdG9yDQotCWlmICh0aGlzLnNlbGVjdG9yICE9IG51bGwgJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5zZWxlY3RvciwgbWVzc2FnZVNlbmQuc2VsZWN0b3IpKQ0KLQkJcmV0dXJuIGZhbHNlOw0KKwlpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsICYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1ldGhvZC5zZWxlY3RvcikpDQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCiANCiAJLy8gcmVjZWl2ZXIgdHlwZQ0KLQlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBtZXNzYWdlU2VuZC5iaW5kaW5nOw0KIAlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IA0KIAkJYmluZGluZyA9PSBudWxsID8gDQogCQkJbnVsbCA6IA0KLQkJCSghaXNWaXJ0dWFsSW52b2tlKG1lc3NhZ2VTZW5kKSA/IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgOiAoUmVmZXJlbmNlQmluZGluZyltZXNzYWdlU2VuZC5yZWNlaXZlclR5cGUpOw0KLQlpZiAocmVzb2x2ZSAmJiByZWNlaXZlclR5cGUgIT0gbnVsbCkgew0KLQkJaWYgKHRoaXMuaXNWaXJ0dWFsSW52b2tlKG1lc3NhZ2VTZW5kKSkgew0KLQkJCWlmICghdGhpcy5tYXRjaGVzQXNTdWJ0eXBlKHJlY2VpdmVyVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pDQotCQkJCSYmICF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMsIHJlY2VpdmVyVHlwZSkpIHsNCi0JCQkJCXJldHVybiBmYWxzZTsNCisJCQkoIWlzVmlydHVhbEludm9rZShtZXRob2QsIG1lc3NhZ2VTZW5kKSA/IG1ldGhvZC5kZWNsYXJpbmdDbGFzcyA6IChSZWZlcmVuY2VCaW5kaW5nKW1lc3NhZ2VTZW5kLnJlY2VpdmVyVHlwZSk7DQorCWlmICh0aGlzLmlzVmlydHVhbEludm9rZShtZXRob2QsIG1lc3NhZ2VTZW5kKSkgew0KKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxBc1N1YnR5cGUocmVjZWl2ZXJUeXBlLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7DQorCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzLCByZWNlaXZlclR5cGUpOw0KKwkJCWlmIChsZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7DQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KIAkJCX0NCi0JCX0gZWxzZSB7DQotCQkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCByZWNlaXZlclR5cGUpKQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQogCQl9DQorCX0gZWxzZSB7DQorCQlsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIHJlY2VpdmVyVHlwZSk7DQorCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQogCX0NCiANCiAJLy8gcmV0dXJuIHR5cGUNCi0JaWYgKHJlc29sdmUgJiYgYmluZGluZyAhPSBudWxsKSB7DQotCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5yZXR1cm5TaW1wbGVOYW1lLCB0aGlzLnJldHVyblF1YWxpZmljYXRpb24sIGJpbmRpbmcucmV0dXJuVHlwZSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KKwlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMucmV0dXJuU2ltcGxlTmFtZSwgdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uLCBtZXRob2QucmV0dXJuVHlwZSk7DQorCXN3aXRjaCAobmV3TGV2ZWwpIHsNCisJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJbGV2ZWwgPSBuZXdMZXZlbDsNCisJCQlicmVhazsNCiAJfQ0KIAkJDQogCS8vIGFyZ3VtZW50IHR5cGVzDQogCWludCBhcmd1bWVudENvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsNCiAJaWYgKGFyZ3VtZW50Q291bnQgPiAtMSkgew0KLQkJaW50IHBhcmFtZXRlckNvdW50ID0gbWVzc2FnZVNlbmQuYXJndW1lbnRzID09IG51bGwgPyAwIDogbWVzc2FnZVNlbmQuYXJndW1lbnRzLmxlbmd0aDsNCi0JCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCWlmIChyZXNvbHZlICYmIGJpbmRpbmcgIT0gbnVsbCkgew0KKwkJaWYgKG1ldGhvZC5wYXJhbWV0ZXJzID09IG51bGwpIHsNCisJCQlsZXZlbCA9IElOQUNDVVJBVEVfTUFUQ0g7DQorCQl9IGVsc2Ugew0KKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsNCisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7DQogCQkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsNCiAJCQkJY2hhcltdIHR5cGUgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldOw0KLQkJCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgYmluZGluZy5wYXJhbWV0ZXJzW2ldKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCisJCQkJbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHR5cGUsIHF1YWxpZmljYXRpb24sIG1ldGhvZC5wYXJhbWV0ZXJzW2ldKTsNCisJCQkJc3dpdGNoIChuZXdMZXZlbCkgew0KKwkJCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOg0KKwkJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbA0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gNCisJCQkJCQlsZXZlbCA9IG5ld0xldmVsOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQl9DQogCQkJfQ0KIAkJfQ0KIAl9DQogDQotCXJldHVybiB0cnVlOw0KLX0NCi0NCi1wdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplRnJvbUxvb2t1cEVudmlyb25tZW50KExvb2t1cEVudmlyb25tZW50IGVudikgew0KLQl0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzID0gdGhpcy5jb2xsZWN0U3VwZXJUeXBlTmFtZXModGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMubWF0Y2hNb2RlLCBlbnYpOw0KLQlyZXR1cm4gdGhpcy5hbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lcyA9PSBudWxsIHx8IHRoaXMuYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMgIT0gTk9UX0ZPVU5EX0RFQ0xBUklOR19UWVBFOyANCisJcmV0dXJuIGxldmVsOw0KIH0NCiB9DQpkaWZmIC0tZ2l0IGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXR0ZXJuLmphdmEKaW5kZXggY2Y5MzUyMi4uNjk3NmY4NyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YQorKysgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0dGVybi5qYXZhCkBAIC03NywxOCArNzcsNiBAQAogCQkJfCByaWdodFBhdHRlcm4ubWF0Y2hDb250YWluZXIoKTsNCiB9DQogLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQXN0Tm9kZSwgYm9vbGVhbikNCi0gKi8NCi1wcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQotCXJldHVybiB0aGlzLmxlZnRQYXR0ZXJuLm1hdGNoZXMobm9kZSwgcmVzb2x2ZSkgfHwgdGhpcy5yaWdodFBhdHRlcm4ubWF0Y2hlcyhub2RlLCByZXNvbHZlKTsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQmluZGluZykNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEJpbmRpbmcgYmluZGluZykgew0KLQlyZXR1cm4gdGhpcy5sZWZ0UGF0dGVybi5tYXRjaGVzKGJpbmRpbmcpIHx8IHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoZXMoYmluZGluZyk7DQotfQ0KLS8qKg0KICAqIHNlZSBTZWFyY2hQYXR0ZXJuLm1hdGNoSW5kZXhFbnRyeQ0KICAqLw0KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsNCkBAIC0xMDAsMTQgKzg4LDE1IEBACiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hSZXBvcnRSZWZlcmVuY2UNCiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JaWYgKHRoaXMubGVmdFBhdHRlcm4ubWF0Y2hlcyhyZWZlcmVuY2UpKSB7DQorCWludCBsZWZ0TGV2ZWwgPSB0aGlzLmxlZnRQYXR0ZXJuLm1hdGNoTGV2ZWwocmVmZXJlbmNlLCB0cnVlKTsNCisJaWYgKGxlZnRMZXZlbCA9PSBBQ0NVUkFURV9NQVRDSCB8fCBsZWZ0TGV2ZWwgPT0gSU5BQ0NVUkFURV9NQVRDSCkgew0KIAkJdGhpcy5sZWZ0UGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIGFjY3VyYWN5LCBsb2NhdG9yKTsNCiAJfSBlbHNlIHsNCiAJCXRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgYWNjdXJhY3ksIGxvY2F0b3IpOw0KIAl9DQogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCi0JcmV0dXJuIHRoaXMubGVmdFBhdHRlcm4udG9TdHJpbmcoKSArICJcbnwgIi8qbm9uTkxTKi8gKyB0aGlzLnJpZ2h0UGF0dGVybi50b1N0cmluZygpOw0KKwlyZXR1cm4gdGhpcy5sZWZ0UGF0dGVybi50b1N0cmluZygpICsgIlxufCAiICsgdGhpcy5yaWdodFBhdHRlcm4udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KIH0NCiANCiAvKioNCkBAIC0xMjAsNCArMTA5LDUwIEBACiAJYm9vbGVhbiByaWdodEluaXQgPSB0aGlzLnJpZ2h0UGF0dGVybi5pbml0aWFsaXplRnJvbUxvb2t1cEVudmlyb25tZW50KGVudik7DQogCXJldHVybiBsZWZ0SW5pdCB8fCByaWdodEluaXQ7DQogfQ0KKw0KKy8qKg0KKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEFzdE5vZGUsIGJvb2xlYW4pDQorICovDQorcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQorCXN3aXRjaCAodGhpcy5sZWZ0UGF0dGVybi5tYXRjaExldmVsKG5vZGUsIHJlc29sdmUpKSB7DQorCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6DQorCQkJcmV0dXJuIHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgcmVzb2x2ZSk7DQorCQljYXNlIFBPU1NJQkxFX01BVENIOg0KKwkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJCWNhc2UgSU5BQ0NVUkFURV9NQVRDSDoNCisJCQlpbnQgcmlnaHRMZXZlbCA9IHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgcmVzb2x2ZSk7DQorCQkJaWYgKHJpZ2h0TGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCQlyZXR1cm4gcmlnaHRMZXZlbDsNCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJCQl9DQorCQljYXNlIEFDQ1VSQVRFX01BVENIOg0KKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCXN3aXRjaCAodGhpcy5sZWZ0UGF0dGVybi5tYXRjaExldmVsKGJpbmRpbmcpKSB7DQorCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6DQorCQkJcmV0dXJuIHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwoYmluZGluZyk7DQorCQljYXNlIFBPU1NJQkxFX01BVENIOg0KKwkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJCWNhc2UgSU5BQ0NVUkFURV9NQVRDSDoNCisJCQlpbnQgcmlnaHRMZXZlbCA9IHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwoYmluZGluZyk7DQorCQkJaWYgKHJpZ2h0TGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCQlyZXR1cm4gcmlnaHRMZXZlbDsNCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJCQl9DQorCQljYXNlIEFDQ1VSQVRFX01BVENIOg0KKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggNGVkOTc1Ny4uMmE0NDkyNyAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTUxLDEzICs1MSw2IEBACiAJcmV0dXJuIDA7DQogfQ0KIC8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQkvLyB1c2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBPclBhdHRlcm4NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaEluZGV4RW50cnkNCiAgKi8NCiBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7DQpAQCAtNjYsMjQgKzU5LDMyIEBACiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7DQotCWJ1ZmZlci5hcHBlbmQoIlBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm46IDwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm46IDwiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAodGhpcy5wa2dOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQodGhpcy5wa2dOYW1lKTsNCi0JYnVmZmVyLmFwcGVuZCgiPiwgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2gobWF0Y2hNb2RlKXsNCiAJCWNhc2UgRVhBQ1RfTUFUQ0ggOiANCi0JCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQUkVGSVhfTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUEFUVEVSTl9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCiAJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJLy8gdXNlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgT3JQYXR0ZXJuDQorCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCBjYzQwMmQ4Li4wOTFjNDFjIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0xMDIsMTEwICsxMDIsNiBAQAogCXJldHVybiB0aGlzLm1hdGNoZXNOYW1lKHRoaXMucGtnTmFtZSwgbmFtZSk7DQogfQ0KIC8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsNCi0JCXJldHVybiB0aGlzLm1hdGNoZXMoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQotCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgew0KLQkJcmV0dXJuIHRoaXMubWF0Y2hlcygoSW1wb3J0UmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KLQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7DQotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSByZWZlcmVuY2UgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBpbXBvcnQgcmVmZXJlbmNlLg0KLSAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQotICovDQotcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQotCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsNCi0JCXJldHVybiB0aGlzLm1hdGNoZXMoaW1wb3J0UmVmLnRva2Vucyk7DQotCX0gZWxzZSB7DQotCQlpbnQgbGVuZ3RoID0gaW1wb3J0UmVmLnRva2Vucy5sZW5ndGggLSAxOw0KLQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOw0KLQkJU3lzdGVtLmFycmF5Y29weShpbXBvcnRSZWYudG9rZW5zLCAwLCB0b2tlbnMsIDAsIGxlbmd0aCk7DQotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKHRva2Vucyk7DQotCX0NCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSByZWZlcmVuY2UgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UuDQotICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCi0gKi8NCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHFOYW1lUmVmLCBib29sZWFuIHJlc29sdmUpIHsNCi0JQmluZGluZyBiaW5kaW5nID0gcU5hbWVSZWYuYmluZGluZzsNCi0JaWYgKCFyZXNvbHZlIHx8IGJpbmRpbmcgPT0gbnVsbCB8fCAhYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7DQotCQlpZiAodGhpcy5wa2dOYW1lICE9IG51bGwpIHsNCi0JCQlzd2l0Y2ggKHRoaXMubWF0Y2hNb2RlKSB7DQotCQkJCWNhc2UgRVhBQ1RfTUFUQ0g6DQotCQkJCWNhc2UgUFJFRklYX01BVENIOg0KLQkJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMucGtnTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHFOYW1lUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpOw0KLQkJCQljYXNlIFBBVFRFUk5fTUFUQ0g6DQotCQkJCQljaGFyW10gcGF0dGVybiA9IHRoaXMucGtnTmFtZVt0aGlzLnBrZ05hbWUubGVuZ3RoLTFdID09ICcqJyA/IHRoaXMucGtnTmFtZSA6IENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMucGtnTmFtZSwgIi4qIi8qbm9uTkxTKi8udG9DaGFyQXJyYXkoKSk7DQotCQkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocU5hbWVSZWYudG9rZW5zLCAnLicpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7DQotCQkJfQ0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOw0KLQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOw0KLQkJaW50IGxhc3RJbmRleCA9IHRva2Vucy5sZW5ndGgtMTsNCi0JCXN3aXRjaCAocU5hbWVSZWYuYml0cyAmIFN0YXRlbWVudC5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7DQotCQkJY2FzZSBCaW5kaW5nSWRzLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkDQotCQkJCXR5cGVCaW5kaW5nID0gKChGaWVsZEJpbmRpbmcpYmluZGluZykuZGVjbGFyaW5nQ2xhc3M7DQotCQkJCS8vIG5vIHZhbGlkIG1hdGNoIGFtb25nc3QgZmllbGRzDQotCQkJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7CQkJDQotCQkJCWxhc3RJbmRleCAtPSBvdGhlckJpbmRpbmdzQ291bnQgKyAxOw0KLQkJCQlpZiAobGFzdEluZGV4IDwgMCkgcmV0dXJuIGZhbHNlOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIEJpbmRpbmdJZHMuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUNCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBubyBwYWNrYWdlIG1hdGNoIGluIGl0DQotCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0NCi0JCQkJdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsNCi0JCX0NCi0JCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgew0KLQkJCXR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOw0KLQkJfQ0KLQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgew0KLQkJCVBhY2thZ2VCaW5kaW5nIHBrZ0JpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmZQYWNrYWdlOw0KLQkJCXJldHVybiB0aGlzLm1hdGNoZXMocGtnQmluZGluZy5jb21wb3VuZE5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIHR5cGUgcmVmZXJlbmNlLg0KLSAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQotICovDQotcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBib29sZWFuIHJlc29sdmUpIHsNCi0JaWYgKCFyZXNvbHZlKSB7DQotCQlpZiAodGhpcy5wa2dOYW1lICE9IG51bGwpIHsNCi0JCQlzd2l0Y2ggKHRoaXMubWF0Y2hNb2RlKSB7DQotCQkJCWNhc2UgRVhBQ1RfTUFUQ0g6DQotCQkJCWNhc2UgUFJFRklYX01BVENIOg0KLQkJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMucGtnTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7DQotCQkJCWNhc2UgUEFUVEVSTl9NQVRDSDoNCi0JCQkJCWNoYXJbXSBwYXR0ZXJuID0gdGhpcy5wa2dOYW1lW3RoaXMucGtnTmFtZS5sZW5ndGgtMV0gPT0gJyonID8gdGhpcy5wa2dOYW1lIDogQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5wa2dOYW1lLCAiLioiLypub25OTFMqLy50b0NoYXJBcnJheSgpKTsNCi0JCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm4sIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpOw0KLQkJCX0NCi0JCX0NCi0JfSBlbHNlIHsNCi0JCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZVJlZi5iaW5kaW5nOw0KLQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpew0KLQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgew0KLQkJCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKXR5cGVCaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZTsNCi0JCQl9DQotCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgew0KLQkJCQlQYWNrYWdlQmluZGluZyBwa2dCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVCaW5kaW5nKS5mUGFja2FnZTsNCi0JCQkJcmV0dXJuIHRoaXMubWF0Y2hlcyhwa2dCaW5kaW5nLmNvbXBvdW5kTmFtZSk7DQotCQkJfQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQkNCi0JfQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeQ0KICAqLw0KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsNCkBAIC0yNDYsMjQgKzE0MiwxODYgQEAKIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsNCi0JYnVmZmVyLmFwcGVuZCgiUGFja2FnZVJlZmVyZW5jZVBhdHRlcm46IDwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlBhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuOiA8Iik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHRoaXMucGtnTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHRoaXMucGtnTmFtZSk7DQotCWJ1ZmZlci5hcHBlbmQoIj4sICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiPiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJc3dpdGNoKG1hdGNoTW9kZSl7DQogCQljYXNlIEVYQUNUX01BVENIIDogDQotCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUFJFRklYX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBBVFRFUk5fTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAl9DQogCWlmIChpc0Nhc2VTZW5zaXRpdmUpDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KKw0KKy8qKg0KKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEFzdE5vZGUsIGJvb2xlYW4pDQorICovDQorcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQorCWlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgew0KKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsNCisJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChJbXBvcnRSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQorCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQorCX0NCisJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorfQ0KKw0KKy8qKg0KKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gaW1wb3J0IHJlZmVyZW5jZS4NCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KKyAqLw0KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQorCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsNCisJCWlmICh0aGlzLm1hdGNoZXMoaW1wb3J0UmVmLnRva2VucykpIHsNCisJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJaW50IGxlbmd0aCA9IGltcG9ydFJlZi50b2tlbnMubGVuZ3RoIC0gMTsNCisJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsNCisJCVN5c3RlbS5hcnJheWNvcHkoaW1wb3J0UmVmLnRva2VucywgMCwgdG9rZW5zLCAwLCBsZW5ndGgpOw0KKwkJaWYgKHRoaXMubWF0Y2hlcyh0b2tlbnMpKSB7DQorCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCX0NCisJfQ0KK30NCisNCisvKioNCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZS4NCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KKyAqLw0KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQorCWlmICghcmVzb2x2ZSkgew0KKwkJaWYgKHRoaXMucGtnTmFtZSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlzd2l0Y2ggKHRoaXMubWF0Y2hNb2RlKSB7DQorCQkJCWNhc2UgRVhBQ1RfTUFUQ0g6DQorCQkJCWNhc2UgUFJFRklYX01BVENIOg0KKwkJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMucGtnTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHFOYW1lUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7DQorCQkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJCX0NCisJCQkJY2FzZSBQQVRURVJOX01BVENIOg0KKwkJCQkJY2hhcltdIHBhdHRlcm4gPSB0aGlzLnBrZ05hbWVbdGhpcy5wa2dOYW1lLmxlbmd0aC0xXSA9PSAnKicgPyB0aGlzLnBrZ05hbWUgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLnBrZ05hbWUsICIuKiIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm4sIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChxTmFtZVJlZi50b2tlbnMsICcuJyksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgew0KKwkJCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJCQl9DQorCQkJCWRlZmF1bHQ6DQorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQl9DQorCQl9DQorCX0gZWxzZSB7DQorCQlCaW5kaW5nIGJpbmRpbmcgPSBxTmFtZVJlZi5iaW5kaW5nOw0KKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgew0KKwkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG51bGw7DQorCQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOw0KKwkJCWludCBsYXN0SW5kZXggPSB0b2tlbnMubGVuZ3RoLTE7DQorCQkJc3dpdGNoIChxTmFtZVJlZi5iaXRzICYgU3RhdGVtZW50LlJlc3RyaWN0aXZlRmxhZ01BU0spIHsNCisJCQkJY2FzZSBCaW5kaW5nSWRzLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkDQorCQkJCQl0eXBlQmluZGluZyA9ICgoRmllbGRCaW5kaW5nKWJpbmRpbmcpLmRlY2xhcmluZ0NsYXNzOw0KKwkJCQkJLy8gbm8gdmFsaWQgbWF0Y2ggYW1vbmdzdCBmaWVsZHMNCisJCQkJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7CQkJDQorCQkJCQlsYXN0SW5kZXggLT0gb3RoZXJCaW5kaW5nc0NvdW50ICsgMTsNCisJCQkJCWlmIChsYXN0SW5kZXggPCAwKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIEJpbmRpbmdJZHMuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUNCisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOyAvLyBubyBwYWNrYWdlIG1hdGNoIGluIGl0DQorCQkJCWNhc2UgQmluZGluZ0lkcy5UWVBFIDogLy89PT09PT09PT09PT09b25seSB0eXBlID09PT09PT09PT09PT09DQorCQkJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOw0KKwkJCX0NCisJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHsNCisJCQkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7DQorCQkJfQ0KKwkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7DQorCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJCX0gZWxzZSB7DQorCQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsNCisJCQkJCVBhY2thZ2VCaW5kaW5nIHBrZ0JpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmZQYWNrYWdlOw0KKwkJCQkJaWYgKHBrZ0JpbmRpbmcgPT0gbnVsbCkgew0KKwkJCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJCQkJfSBlbHNlIGlmICh0aGlzLm1hdGNoZXMocGtnQmluZGluZy5jb21wb3VuZE5hbWUpKSB7DQorCQkJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8qKg0KKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gdHlwZSByZWZlcmVuY2UuDQorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCisgKi8NCitwcml2YXRlIGludCBtYXRjaExldmVsKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQorCWlmICghcmVzb2x2ZSkgew0KKwkJaWYgKHRoaXMucGtnTmFtZSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlzd2l0Y2ggKHRoaXMubWF0Y2hNb2RlKSB7DQorCQkJCWNhc2UgRVhBQ1RfTUFUQ0g6DQorCQkJCWNhc2UgUFJFRklYX01BVENIOg0KKwkJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMucGtnTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsNCisJCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQkJfQ0KKwkJCQljYXNlIFBBVFRFUk5fTUFUQ0g6DQorCQkJCQljaGFyW10gcGF0dGVybiA9IHRoaXMucGtnTmFtZVt0aGlzLnBrZ05hbWUubGVuZ3RoLTFdID09ICcqJyA/IHRoaXMucGtnTmFtZSA6IENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMucGtnTmFtZSwgIi4qIi50b0NoYXJBcnJheSgpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybiwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsNCisJCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQkJfQ0KKwkJCQlkZWZhdWx0Og0KKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJfQ0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlUmVmLmJpbmRpbmc7DQorCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgew0KKwkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHsNCisJCQkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7DQorCQkJfQ0KKwkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7DQorCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwkJCX0gZWxzZSBpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7DQorCQkJCVBhY2thZ2VCaW5kaW5nIHBrZ0JpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmZQYWNrYWdlOw0KKwkJCQlpZiAodGhpcy5tYXRjaGVzKHBrZ0JpbmRpbmcuY29tcG91bmROYW1lKSkgew0KKwkJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQl9DQorCQl9DQorCQkJDQorCX0NCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU2VhcmNoUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWFyY2hQYXR0ZXJuLmphdmEKaW5kZXggNDkxYmIyMy4uYzgyMmRkMCAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWFyY2hQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWFyY2hQYXR0ZXJuLmphdmEKQEAgLTMzLDE0ICszMywxNCBAQAogCS8qIG1hdGNoIGxldmVsICovDQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9TU0lCTEVfTUFUQ0ggPSAwOw0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NTSUJMRV9NQVRDSCA9IDE7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVVNURURfTUFUQ0ggPSAyOw0KLQ0KIAkvKiBtYXRjaCBjb250YWluZXIgKi8NCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUElMQVRJT05fVU5JVCA9IDE7DQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTID0gMjsNCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSA0Ow0KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSA4Ow0KIAkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDVVJBVEVfTUFUQ0ggPSAyOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkFDQ1VSQVRFX01BVENIID0gMzsNCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXVtdIE5PVF9GT1VORF9ERUNMQVJJTkdfVFlQRSA9IG5ldyBjaGFyWzBdW11bXTsNCiANCiBwdWJsaWMgU2VhcmNoUGF0dGVybihpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgew0KQEAgLTU0LDcgKzU0LDcgQEAKICAqLw0KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlQ29uc3RydWN0b3JQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsNCiANCi0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVyblN0cmluZywgIiAuKCwpIi8qbm9uTkxTKi8sIHRydWUpOw0KKwlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuU3RyaW5nLCAiIC4oLCkiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJA0KIAlmaW5hbCBpbnQgSW5zaWRlTmFtZSA9IDE7DQogCWZpbmFsIGludCBJbnNpZGVQYXJhbWV0ZXIgPSAyOw0KIAlTdHJpbmcgbGFzdFRva2VuID0gbnVsbDsNCkBAIC03MSw3ICs3MSw3IEBACiANCiAJCQkvLyByZWFkIGRlY2xhcmluZyB0eXBlIGFuZCBzZWxlY3Rvcg0KIAkJCWNhc2UgSW5zaWRlTmFtZSA6DQotCQkJCWlmICh0b2tlbi5lcXVhbHMoIi4iLypub25OTFMqLykpew0KKwkJCQlpZiAodG9rZW4uZXF1YWxzKCIuIikpeyAvLyROT04tTkxTLTEkDQogCQkJCQlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9PSBudWxsKXsNCiAJCQkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQogCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9IHR5cGVOYW1lOw0KQEAgLTc5LDEyICs3OSwxMiBAQAogCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiArPSB0b2tlbiArIHR5cGVOYW1lOw0KIAkJCQkJfQ0KIAkJCQkJdHlwZU5hbWUgPSBudWxsOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiKCIvKm5vbk5MUyovKSl7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCIoIikpeyAvLyROT04tTkxTLTEkDQogCQkJCQlwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbNV07DQogCQkJCQlwYXJhbWV0ZXJDb3VudCA9IDA7DQogCQkJCQltb2RlID0gSW5zaWRlUGFyYW1ldGVyOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiICIvKm5vbk5MUyovKSl7DQotCQkJCQlpZiAoISgiICIvKm5vbk5MUyovLmVxdWFscyhsYXN0VG9rZW4pIHx8ICIuIi8qbm9uTkxTKi8uZXF1YWxzKGxhc3RUb2tlbikpKXsNCisJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIiAiKSl7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWlmICghKCIgIi5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIuZXF1YWxzKGxhc3RUb2tlbikpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQogCQkJCQkJYnJlYWs7DQogCQkJCQl9DQogCQkJCX0gZWxzZSB7IC8vIG5hbWUNCkBAIC05NCwxNSArOTQsMTUgQEAKIAkJCQlicmVhazsNCiAJCQkvLyByZWFkIHBhcmFtZXRlciB0eXBlcw0KIAkJCWNhc2UgSW5zaWRlUGFyYW1ldGVyIDoNCi0JCQkJaWYgKHRva2VuLmVxdWFscygiICIvKm5vbk5MUyovKSl7DQotCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCIsIi8qbm9uTkxTKi8pKXsNCisJCQkJaWYgKHRva2VuLmVxdWFscygiICIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiLCIpKXsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQogCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsNCiAJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyQ291bnQqMl0sIDAsIHBhcmFtZXRlckNvdW50KTsNCiAJCQkJCX0NCiAJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsNCiAJCQkJCXBhcmFtZXRlclR5cGUgPSBudWxsOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscyAoIikiLypub25OTFMqLykpew0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscyAoIikiKSl7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWZvdW5kQ2xvc2luZ1BhcmVudGhlc2lzID0gdHJ1ZTsNCiAJCQkJCWlmIChwYXJhbWV0ZXJUeXBlICE9IG51bGwpew0KIAkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gcGFyYW1ldGVyQ291bnQpew0KQEAgLTExNSw3ICsxMTUsNyBAQAogCQkJCQlpZiAocGFyYW1ldGVyVHlwZSA9PSBudWxsKXsNCiAJCQkJCQlwYXJhbWV0ZXJUeXBlID0gdG9rZW47DQogCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWlmICghKCIuIi8qbm9uTkxTKi8uZXF1YWxzKGxhc3RUb2tlbikgfHwgIi4iLypub25OTFMqLy5lcXVhbHModG9rZW4pIHx8ICJbXSIvKm5vbk5MUyovLmVxdWFscyh0b2tlbikpKSByZXR1cm4gbnVsbDsNCisJCQkJCQlpZiAoISgiLiIuZXF1YWxzKGxhc3RUb2tlbikgfHwgIi4iLmVxdWFscyh0b2tlbikgfHwgIltdIi5lcXVhbHModG9rZW4pKSkgcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQkJcGFyYW1ldGVyVHlwZSArPSB0b2tlbjsNCiAJCQkJCX0NCiAJCQkJfQ0KQEAgLTE3Niw3ICsxNzYsNyBAQAogICovDQogcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVGaWVsZFBhdHRlcm4oU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgew0KIA0KLQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuU3RyaW5nLCAiIC4oLCkiLypub25OTFMqLywgdHJ1ZSk7DQorCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm5TdHJpbmcsICIgLigsKSIsIHRydWUpOyAvLyROT04tTkxTLTEkDQogCWZpbmFsIGludCBJbnNpZGVEZWNsYXJpbmdQYXJ0ID0gMTsNCiAJZmluYWwgaW50IEluc2lkZVR5cGUgPSAyOw0KIAlTdHJpbmcgbGFzdFRva2VuID0gbnVsbDsNCkBAIC0xOTEsNyArMTkxLDcgQEAKIA0KIAkJCS8vIHJlYWQgZGVjbGFyaW5nIHR5cGUgYW5kIGZpZWxkTmFtZQ0KIAkJCWNhc2UgSW5zaWRlRGVjbGFyaW5nUGFydCA6DQotCQkJCWlmICh0b2tlbi5lcXVhbHMoIi4iLypub25OTFMqLykpew0KKwkJCQlpZiAodG9rZW4uZXF1YWxzKCIuIikpeyAvLyROT04tTkxTLTEkDQogCQkJCQlpZiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKXsNCiAJCQkJCQlpZiAoZmllbGROYW1lID09IG51bGwpIHJldHVybiBudWxsOw0KIAkJCQkJCWRlY2xhcmluZ1R5cGUgPSBmaWVsZE5hbWU7DQpAQCAtMTk5LDggKzE5OSw4IEBACiAJCQkJCQlkZWNsYXJpbmdUeXBlICs9IHRva2VuICsgZmllbGROYW1lOw0KIAkJCQkJfQ0KIAkJCQkJZmllbGROYW1lID0gbnVsbDsNCi0JCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIiAiLypub25OTFMqLykpew0KLQkJCQkJaWYgKCEoIiAiLypub25OTFMqLy5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIvKm5vbk5MUyovLmVxdWFscyhsYXN0VG9rZW4pKSl7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCIgIikpeyAvLyROT04tTkxTLTEkDQorCQkJCQlpZiAoISgiICIuZXF1YWxzKGxhc3RUb2tlbikgfHwgIi4iLmVxdWFscyhsYXN0VG9rZW4pKSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQkJCW1vZGUgPSBJbnNpZGVUeXBlOw0KIAkJCQkJfQ0KIAkJCQl9IGVsc2UgeyAvLyBuYW1lDQpAQCAtMjEwLDExICsyMTAsMTEgQEAKIAkJCQlicmVhazsNCiAJCQkvLyByZWFkIHR5cGUgDQogCQkJY2FzZSBJbnNpZGVUeXBlOg0KLQkJCQlpZiAoIXRva2VuLmVxdWFscygiICIvKm5vbk5MUyovKSl7DQorCQkJCWlmICghdG9rZW4uZXF1YWxzKCIgIikpeyAvLyROT04tTkxTLTEkDQogCQkJCQlpZiAodHlwZSA9PSBudWxsKXsNCiAJCQkJCQl0eXBlID0gdG9rZW47DQogCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWlmICghKCEoIi4iLypub25OTFMqLy5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIvKm5vbk5MUyovLmVxdWFscyh0b2tlbikgfHwgIltdIi8qbm9uTkxTKi8uZXF1YWxzKHRva2VuKSkpKSByZXR1cm4gbnVsbDsNCisJCQkJCQlpZiAoISghKCIuIi5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIuZXF1YWxzKHRva2VuKSB8fCAiW10iLmVxdWFscyh0b2tlbikpKSkgcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkDQogCQkJCQkJdHlwZSArPSB0b2tlbjsNCiAJCQkJCX0NCiAJCQkJfQ0KQEAgLTI4MSw3ICsyODEsNyBAQAogICovDQogcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVNZXRob2RQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsNCiANCi0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVyblN0cmluZywgIiAuKCwpIi8qbm9uTkxTKi8sIHRydWUpOw0KKwlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuU3RyaW5nLCAiIC4oLCkiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJA0KIAlmaW5hbCBpbnQgSW5zaWRlU2VsZWN0b3IgPSAxOw0KIAlmaW5hbCBpbnQgSW5zaWRlUGFyYW1ldGVyID0gMjsNCiAJZmluYWwgaW50IEluc2lkZVJldHVyblR5cGUgPSAzOw0KQEAgLTI5OSw3ICsyOTksNyBAQAogDQogCQkJLy8gcmVhZCBkZWNsYXJpbmcgdHlwZSBhbmQgc2VsZWN0b3INCiAJCQljYXNlIEluc2lkZVNlbGVjdG9yIDoNCi0JCQkJaWYgKHRva2VuLmVxdWFscygiLiIvKm5vbk5MUyovKSl7DQorCQkJCWlmICh0b2tlbi5lcXVhbHMoIi4iKSl7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpew0KIAkJCQkJCWlmIChzZWxlY3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsNCiAJCQkJCQlkZWNsYXJpbmdUeXBlID0gc2VsZWN0b3I7DQpAQCAtMzA3LDEyICszMDcsMTIgQEAKIAkJCQkJCWRlY2xhcmluZ1R5cGUgKz0gdG9rZW4gKyBzZWxlY3RvcjsNCiAJCQkJCX0NCiAJCQkJCXNlbGVjdG9yID0gbnVsbDsNCi0JCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIigiLypub25OTFMqLykpew0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiKCIpKXsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nWzVdOw0KIAkJCQkJcGFyYW1ldGVyQ291bnQgPSAwOw0KIAkJCQkJbW9kZSA9IEluc2lkZVBhcmFtZXRlcjsNCi0JCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIiAiLypub25OTFMqLykpew0KLQkJCQkJaWYgKCEoIiAiLypub25OTFMqLy5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIvKm5vbk5MUyovLmVxdWFscyhsYXN0VG9rZW4pKSl7DQorCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCIgIikpeyAvLyROT04tTkxTLTEkDQorCQkJCQlpZiAoISgiICIuZXF1YWxzKGxhc3RUb2tlbikgfHwgIi4iLmVxdWFscyhsYXN0VG9rZW4pKSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KIAkJCQkJCW1vZGUgPSBJbnNpZGVSZXR1cm5UeXBlOw0KIAkJCQkJfQ0KIAkJCQl9IGVsc2UgeyAvLyBuYW1lDQpAQCAtMzIyLDE1ICszMjIsMTUgQEAKIAkJCQlicmVhazsNCiAJCQkvLyByZWFkIHBhcmFtZXRlciB0eXBlcw0KIAkJCWNhc2UgSW5zaWRlUGFyYW1ldGVyIDoNCi0JCQkJaWYgKHRva2VuLmVxdWFscygiICIvKm5vbk5MUyovKSl7DQotCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCIsIi8qbm9uTkxTKi8pKXsNCisJCQkJaWYgKHRva2VuLmVxdWFscygiICIpKXsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiLCIpKXsgLy8kTk9OLU5MUy0xJA0KIAkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQogCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsNCiAJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyQ291bnQqMl0sIDAsIHBhcmFtZXRlckNvdW50KTsNCiAJCQkJCX0NCiAJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsNCiAJCQkJCXBhcmFtZXRlclR5cGUgPSBudWxsOw0KLQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscyAoIikiLypub25OTFMqLykpew0KKwkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscyAoIikiKSl7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWZvdW5kQ2xvc2luZ1BhcmVudGhlc2lzID0gdHJ1ZTsNCiAJCQkJCWlmIChwYXJhbWV0ZXJUeXBlICE9IG51bGwpew0KIAkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gcGFyYW1ldGVyQ291bnQpew0KQEAgLTM0MywxOCArMzQzLDE4IEBACiAJCQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpew0KIAkJCQkJCXBhcmFtZXRlclR5cGUgPSB0b2tlbjsNCiAJCQkJCX0gZWxzZSB7DQotCQkJCQkJaWYgKCEoIi4iLypub25OTFMqLy5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIvKm5vbk5MUyovLmVxdWFscyh0b2tlbikgfHwgIltdIi8qbm9uTkxTKi8uZXF1YWxzKHRva2VuKSkpIHJldHVybiBudWxsOw0KKwkJCQkJCWlmICghKCIuIi5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIuZXF1YWxzKHRva2VuKSB8fCAiW10iLmVxdWFscyh0b2tlbikpKSByZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQkJCQlwYXJhbWV0ZXJUeXBlICs9IHRva2VuOw0KIAkJCQkJfQ0KIAkJCQl9DQogCQkJCWJyZWFrOw0KIAkJCS8vIHJlYWQgcmV0dXJuIHR5cGUNCiAJCQljYXNlIEluc2lkZVJldHVyblR5cGU6DQotCQkJCWlmICghdG9rZW4uZXF1YWxzKCIgIi8qbm9uTkxTKi8pKXsNCisJCQkJaWYgKCF0b2tlbi5lcXVhbHMoIiAiKSl7IC8vJE5PTi1OTFMtMSQNCiAJCQkJCWlmIChyZXR1cm5UeXBlID09IG51bGwpew0KIAkJCQkJCXJldHVyblR5cGUgPSB0b2tlbjsNCiAJCQkJCX0gZWxzZSB7DQotCQkJCQkJaWYgKCEoISgiLiIvKm5vbk5MUyovLmVxdWFscyhsYXN0VG9rZW4pIHx8ICIuIi8qbm9uTkxTKi8uZXF1YWxzKHRva2VuKSB8fCAiW10iLypub25OTFMqLy5lcXVhbHModG9rZW4pKSkpIHJldHVybiBudWxsOw0KKwkJCQkJCWlmICghKCEoIi4iLmVxdWFscyhsYXN0VG9rZW4pIHx8ICIuIi5lcXVhbHModG9rZW4pIHx8ICJbXSIuZXF1YWxzKHRva2VuKSkpKSByZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQkJCQlyZXR1cm5UeXBlICs9IHRva2VuOw0KIAkJCQkJfQ0KIAkJCQl9DQpAQCAtNjQzLDE2ICs2NDMsMTYgQEAKICAqLw0KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlVHlwZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgew0KIA0KLQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuU3RyaW5nLCAiIC4iLypub25OTFMqLywgdHJ1ZSk7DQorCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm5TdHJpbmcsICIgLiIsIHRydWUpOyAvLyROT04tTkxTLTEkDQogCVN0cmluZyB0eXBlID0gbnVsbDsNCiAJU3RyaW5nIGxhc3RUb2tlbiA9IG51bGw7DQogCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXsNCiAJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsNCi0JCWlmICghdG9rZW4uZXF1YWxzKCIgIi8qbm9uTkxTKi8pKXsNCisJCWlmICghdG9rZW4uZXF1YWxzKCIgIikpeyAvLyROT04tTkxTLTEkDQogCQkJaWYgKHR5cGUgPT0gbnVsbCl7DQogCQkJCXR5cGUgPSB0b2tlbjsNCiAJCQl9IGVsc2Ugew0KLQkJCQlpZiAoISgiLiIvKm5vbk5MUyovLmVxdWFscyhsYXN0VG9rZW4pIHx8ICIuIi8qbm9uTkxTKi8uZXF1YWxzKHRva2VuKSB8fCAiW10iLypub25OTFMqLy5lcXVhbHModG9rZW4pKSkgcmV0dXJuIG51bGw7DQorCQkJCWlmICghKCIuIi5lcXVhbHMobGFzdFRva2VuKSB8fCAiLiIuZXF1YWxzKHRva2VuKSB8fCAiW10iLmVxdWFscyh0b2tlbikpKSByZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQNCiAJCQkJdHlwZSArPSB0b2tlbjsNCiAJCQl9DQogCQl9DQpAQCAtNzUzLDI0ICs3NTMsNiBAQAogICovDQogcHJvdGVjdGVkIGFic3RyYWN0IGludCBtYXRjaENvbnRhaW5lcigpOw0KIC8qKg0KLSAqIEZpbmRzIG91dCB3aGV0aGVyIHRoZSBnaXZlbiByZXNvbHZlZCBhc3Qgbm9kZSBtYXRjaGVzIHRoaXMgc2VhcmNoIHBhdHRlcm4uDQotICovDQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUpIHsNCi0JcmV0dXJuIHRoaXMubWF0Y2hlcyhub2RlLCB0cnVlKTsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBub2RlLg0KLSAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQotICovDQotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSk7DQotLyoqDQotICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGJpbmRpbmcgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLg0KLSAqIERlZmF1bHQgaXMgdG8gcmV0dXJuIGZhbHNlLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIG1hdGNoZXMoQmluZGluZyBiaW5kaW5nKSB7DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQogICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGJpbmFyeSBpbmZvIG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybi4NCiAgKiBEZWZhdWx0IGlzIHRvIHJldHVybiBmYWxzZS4NCiAgKi8NCkBAIC04MjAsNDMgKzgwMiwxMCBAQAogCQkpOw0KIH0NCiAvKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIA0KLSAqIGFuZCBxdWFsaWZpY2F0aW9uIHBhdHRlcm4uDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1R5cGUoY2hhcltdIHNpbXBsZU5hbWVQYXR0ZXJuLCBjaGFyW10gcXVhbGlmaWNhdGlvblBhdHRlcm4sIFR5cGVCaW5kaW5nIHR5cGUpIHsNCi0JaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyANCi0JcmV0dXJuIA0KLQkJdGhpcy5tYXRjaGVzVHlwZSgNCi0JCQlzaW1wbGVOYW1lUGF0dGVybiwgDQotCQkJcXVhbGlmaWNhdGlvblBhdHRlcm4sIA0KLQkJCXR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKS5sZW5ndGggPT0gMCA/IA0KLQkJCQl0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSA6IA0KLQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCh0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLCAnLicpDQotCQkpOw0KLX0NCi0vKioNCiAgKiBDaGVja3Mgd2hldGhlciBhbiBlbnRyeSBtYXRjaGVzIHRoZSBjdXJyZW50IHNlYXJjaCBwYXR0ZXJuDQogICovDQogcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCk7DQogLyoqDQotICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGFzdCBub2RlIG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybi4NCi0gKiBSZXR1cm5zIElNUE9TU0lCTEVfTUFUQ0ggaWYgaXQgZG9lc24ndC4NCi0gKiBSZXR1cm5zIFRSVVNURURfTUFUQ0ggaWYgaXQgbWF0Y2hlcyBleGFjdGx5IHRoaXMgc2VhcmNoIHBhdHRlcm4gKGllLiANCi0gKiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgb3IgaXQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC4pDQotICogUmV0dXJucyBQT1NTSUJMRV9NQVRDSCBpZiBpdCBwb3RlbnRpYWxseSBtYXRjaGVzIA0KLSAqIHRoaXMgc2VhcmNoIHBhdHRlcm4gYW5kIGl0IG5lZWRzIHRvIGJlIHJlc29sdmVkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUpIHsNCi0JaWYgKHRoaXMubWF0Y2hlcyhub2RlLCBmYWxzZSkpIHsNCi0JCWlmICh0aGlzLm5lZWRzUmVzb2x2ZSkgew0KLQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIFRSVVNURURfTUFUQ0g7DQotCQl9DQotCX0NCi0JcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQotfQ0KLS8qKg0KICAqIFJlcG9ydHMgdGhlIG1hdGNoIG9mIHRoZSBnaXZlbiByZWZlcmVuY2UuDQogICovDQogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQXN0Tm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQpAQCAtODc2LDcgKzgyNSw3IEBACiAJcmV0dXJuIHJlc3VsdDsNCiB9DQogcHVibGljIFN0cmluZyB0b1N0cmluZygpew0KLQlyZXR1cm4gIlNlYXJjaFBhdHRlcm4iLypub25OTFMqLzsNCisJcmV0dXJuICJTZWFyY2hQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJA0KIH0NCiANCiAvKioNCkBAIC05NzQsNDQgKzkyMywxMDMgQEAKIH0NCiANCiAvKioNCisgKiBGaW5kcyBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gYXN0IG5vZGUgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLg0KKyAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0Lg0KKyAqIFJldHVybnMgUE9TU0lCTEVfTUFUQ0ggaWYgaXQgcG90ZW50aWFsbHkgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuIA0KKyAqIGFuZCBpdCBoYXMgbm90IGJlZW4gcmVvbHZlZCwgYW5kIGl0IG5lZWRzIHRvIGJlIHJlc29sdmVkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLg0KKyAqIFJldHVybnMgQUNDVVJBVEVfTUFUQ0ggaWYgaXQgbWF0Y2hlcyBleGFjdGx5IHRoaXMgc2VhcmNoIHBhdHRlcm4gKGllLiANCisgKiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgb3IgaXQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC4pDQorICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IGV4YWN0bHkgdGhpcyBzZWFyY2ggcGF0dGVybiAoaWUuIA0KKyAqIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYnV0IHJlc29sdmluZyBmYWlsZWQuKQ0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSk7DQorDQorLyoqDQorICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGJpbmRpbmcgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLg0KKyAqIFJldHVybnMgQUNDVVJBVEVfTUFUQ0ggaWYgaXQgZG9lcy4NCisgKiBSZXR1cm5zIElOQUNDVVJBVEVfTUFUQ0ggaWYgcmVzb2x2ZSBmYWlsZWQuDQorICogRGVmYXVsdCBpcyB0byByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSC4NCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KK30NCisNCisvKioNCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlZmVyZW5jZSB0eXBlIGJpbmRpbmcgbWF0Y2hlcyBvciBpcyBhIHN1YnR5cGUgb2YgYSB0eXBlDQogICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIGFuZCBxdWFsaWZpY2F0aW9uIHBhdHRlcm4uDQorICogUmV0dXJucyBBQ0NVUkFURV9NQVRDSCBpZiBpdCBkb2VzLg0KKyAqIFJldHVybnMgSU5BQ0NVUkFURV9NQVRDSCBpZiByZXNvbHZlIGZhaWxzDQorICogUmV0dXJucyBJTVBPU1NJQkxFX01BVENIIGlmIGl0IGRvZXNuJ3QuDQogICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc0FzU3VidHlwZShSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuKSB7DQorcHJvdGVjdGVkIGludCBtYXRjaExldmVsQXNTdWJ0eXBlKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgY2hhcltdIHNpbXBsZU5hbWVQYXR0ZXJuLCBjaGFyW10gcXVhbGlmaWNhdGlvblBhdHRlcm4pIHsNCisJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCQ0KKwlpbnQgbGV2ZWw7DQorCQ0KIAkvLyBtYXRjaGVzIHR5cGUNCi0JaWYgKHRoaXMubWF0Y2hlc1R5cGUoc2ltcGxlTmFtZVBhdHRlcm4sIHF1YWxpZmljYXRpb25QYXR0ZXJuLCB0eXBlKSkNCi0JCXJldHVybiB0cnVlOw0KKwlpZiAoKGxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZShzaW1wbGVOYW1lUGF0dGVybiwgcXVhbGlmaWNhdGlvblBhdHRlcm4sIHR5cGUpKSAhPSBJTVBPU1NJQkxFX01BVENIKQ0KKwkJcmV0dXJuIGxldmVsOw0KIAkNCiAJLy8gbWF0Y2hlcyBzdXBlcmNsYXNzDQotCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHR5cGUuc3VwZXJjbGFzcygpOw0KLQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7DQotCQlpZiAodGhpcy5tYXRjaGVzQXNTdWJ0eXBlKHN1cGVyY2xhc3MsIHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybikpDQotCQkJcmV0dXJuIHRydWU7DQorCWlmICghdHlwZS5pc0ludGVyZmFjZSgpICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlLmNvbXBvdW5kTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUKSkgew0KKwkJaWYgKChsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEFzU3VidHlwZSh0eXBlLnN1cGVyY2xhc3MoKSwgc2ltcGxlTmFtZVBhdHRlcm4sIHF1YWxpZmljYXRpb25QYXR0ZXJuKSkgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCXJldHVybiBsZXZlbDsNCisJCX0NCiAJfQ0KIA0KIAkvLyBtYXRjaGVzIGludGVyZmFjZXMNCiAJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsNCi0JCWlmICh0aGlzLm1hdGNoZXNBc1N1YnR5cGUoaW50ZXJmYWNlc1tpXSwgc2ltcGxlTmFtZVBhdHRlcm4sIHF1YWxpZmljYXRpb25QYXR0ZXJuKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCisJaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgew0KKwkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCX0gZWxzZSB7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsNCisJCQlpZiAoKGxldmVsID0gdGhpcy5tYXRjaExldmVsQXNTdWJ0eXBlKGludGVyZmFjZXNbaV0sIHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybikpICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsNCisJCQkJcmV0dXJuIGxldmVsOw0KKwkJCX07DQorCQl9DQogCX0NCiANCi0JcmV0dXJuIGZhbHNlOw0KKwlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCiB9DQogDQogLyoqDQogICogUmV0dXJucyB3aGV0aGVyIG9uZSBvZiB0aGUgZ2l2ZW4gZGVjbGFyaW5nIHR5cGVzIGlzIHRoZSBnaXZlbiByZWNlaXZlciB0eXBlLg0KKyAqIFJldHVybnMgQUNDVVJBVEVfTUFUQ0ggaWYgaXQgZG9lcy4NCisgKiBSZXR1cm5zIElOQUNDVVJBVEVfTUFUQ0ggaWYgcmVzb2x2ZSBmYWlsZWQuDQorICogUmV0dXJucyBJTVBPU1NJQkxFX01BVENIIGlmIGl0IGRvZXNuJ3QuDQogICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1R5cGUoY2hhcltdW11bXSBkZWNsYXJpbmdUeXBlcywgUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsNCitwcm90ZWN0ZWQgaW50IG1hdGNoTGV2ZWxGb3JUeXBlKGNoYXJbXVtdW10gZGVjbGFyaW5nVHlwZXMsIFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7DQorCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQogCWlmIChkZWNsYXJpbmdUeXBlcyA9PSBudWxsKSB7DQotCQlyZXR1cm4gdHJ1ZTsgLy8gd2Ugd2VyZSBub3QgYWJsZSB0byBjb21wdXRlIHRoZSBkZWNsYXJpbmcgdHlwZXMsIGRlZmF1bHQgdG8gdHJ1ZQ0KKwkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7IC8vIHdlIHdlcmUgbm90IGFibGUgdG8gY29tcHV0ZSB0aGUgZGVjbGFyaW5nIHR5cGVzLCBkZWZhdWx0IHRvIGluYWNjdXJhdGUNCiAJfSBlbHNlIHsNCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBkZWNsYXJpbmdUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgew0KIAkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhkZWNsYXJpbmdUeXBlc1tpXSwgcmVjZWl2ZXJUeXBlLmNvbXBvdW5kTmFtZSkpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQorCQkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCiAJCQl9DQogCQl9DQotCQlyZXR1cm4gZmFsc2U7DQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJfQ0KK30NCisNCisvKioNCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIA0KKyAqIGFuZCBxdWFsaWZpY2F0aW9uIHBhdHRlcm4uDQorICogUmV0dXJucyBBQ0NVUkFURV9NQVRDSCBpZiBpdCBkb2VzLg0KKyAqIFJldHVybnMgSU5BQ0NVUkFURV9NQVRDSCBpZiByZXNvbHZlIGZhaWxlZC4NCisgKiBSZXR1cm5zIElNUE9TU0lCTEVfTUFUQ0ggaWYgaXQgZG9lc24ndC4NCisgKi8NCitwcm90ZWN0ZWQgaW50IG1hdGNoTGV2ZWxGb3JUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuLCBUeXBlQmluZGluZyB0eXBlKSB7DQorCWlmICh0eXBlID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAodGhpcy5tYXRjaGVzVHlwZSgNCisJCQlzaW1wbGVOYW1lUGF0dGVybiwgDQorCQkJcXVhbGlmaWNhdGlvblBhdHRlcm4sIA0KKwkJCXR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKS5sZW5ndGggPT0gMCA/IA0KKwkJCQl0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSA6IA0KKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCh0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLCAnLicpKSkgew0KKwkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwl9IGVsc2Ugew0KKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQogCX0NCiB9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IGY0OTAyYzMuLjY4Y2FhN2MgMTAwNjQ0Ci0tLSBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlckludGVyZmFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMTUsMjAgKzE1LDYgQEAKIAlzdXBlcihzdXBlclF1YWxpZmljYXRpb24sIHN1cGVyU2ltcGxlTmFtZSwgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOw0KIH0NCiAvKioNCi0gKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlcyhCaW5kaW5nKQ0KLSAqLw0KLXB1YmxpYyBib29sZWFuIG1hdGNoZXMoQmluZGluZyBiaW5kaW5nKSB7DQotCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgcmV0dXJuIGZhbHNlOw0KLQ0KLQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gKChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLnN1cGVySW50ZXJmYWNlcygpOw0KLQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsNCi0JCWlmICh0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJJbnRlcmZhY2VzW2ldKSl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5DQogICovDQogcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCkgew0KQEAgLTM4LDI0ICsyNCwyNCBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KLQlidWZmZXIuYXBwZW5kKCJTdXBlckludGVyZmFjZVJlZmVyZW5jZVBhdHRlcm46IDwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlN1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybjogPCIpOyAvLyROT04tTkxTLTEkDQogCWlmIChzdXBlclNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChzdXBlclNpbXBsZU5hbWUpOw0KLQlidWZmZXIuYXBwZW5kKCI+LCAiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4sICIpOyAvLyROT04tTkxTLTEkDQogCXN3aXRjaChtYXRjaE1vZGUpew0KIAkJY2FzZSBFWEFDVF9NQVRDSCA6IA0KLQkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBSRUZJWF9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQQVRURVJOX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiLypub25OTFMqLyk7DQorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJfQ0KIAlpZiAoaXNDYXNlU2Vuc2l0aXZlKQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCWVsc2UNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiLypub25OTFMqLyk7DQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KIH0NCiANCkBAIC03OCw0ICs2NCwzMCBAQAogCX0NCiAJcmV0dXJuIGZhbHNlOw0KIH0NCisNCisvKioNCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQ0KKyAqLw0KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsNCisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorDQorCS8vIHN1cGVyIGludGVyZmFjZXMNCisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsNCisJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7DQorCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwlmb3IgKGludCBpID0gMCwgbWF4ID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsNCisJCWludCBuZXdMZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zdXBlclNpbXBsZU5hbWUsIHRoaXMuc3VwZXJRdWFsaWZpY2F0aW9uLCBzdXBlckludGVyZmFjZXNbaV0pOw0KKwkJc3dpdGNoIChuZXdMZXZlbCkgew0KKwkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoNCisJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJCWxldmVsID0gbmV3TGV2ZWw7DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorCXJldHVybiBsZXZlbDsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKaW5kZXggZWYwNjZjMS4uNmFmNzhlOSAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTEwOSw1MSArMTA5LDYgQEAKIAlyZXR1cm4gQ0xBU1M7DQogfQ0KIC8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEFzdE5vZGUsIGJvb2xlYW4pDQotICovDQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlpZiAoIShub2RlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkpIHJldHVybiBmYWxzZTsNCi0NCi0JVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKFR5cGVSZWZlcmVuY2Upbm9kZTsNCi0JaWYgKCFyZXNvbHZlKSB7DQotCQlpZiAodGhpcy5zdXBlclNpbXBsZU5hbWUgIT0gbnVsbCkgew0KLQkJCWNoYXJbXSB0eXBlUmVmU2ltcGxlTmFtZSA9IG51bGw7DQotCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7DQotCQkJCXR5cGVSZWZTaW1wbGVOYW1lID0gKChTaW5nbGVUeXBlUmVmZXJlbmNlKXR5cGVSZWYpLnRva2VuOw0KLQkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UNCi0JCQkJY2hhcltdW10gdG9rZW5zID0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXR5cGVSZWYpLnRva2VuczsNCi0JCQkJdHlwZVJlZlNpbXBsZU5hbWUgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXTsNCi0JCQl9CQkJCQ0KLQkJCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdHlwZVJlZlNpbXBsZU5hbWUpKQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0gZWxzZSB7DQotCQlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZVJlZi5iaW5kaW5nOw0KLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiAhdGhpcy5tYXRjaGVzVHlwZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdGhpcy5zdXBlclF1YWxpZmljYXRpb24sIGJpbmRpbmcpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JfQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQmluZGluZykNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEJpbmRpbmcgYmluZGluZykgew0KLQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBmYWxzZTsNCi0NCi0JUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7DQotCWlmICh0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgdHlwZS5zdXBlcmNsYXNzKCkpKXsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsNCi0JZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQotCQlpZiAodGhpcy5tYXRjaGVzVHlwZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdGhpcy5zdXBlclF1YWxpZmljYXRpb24sIHN1cGVySW50ZXJmYWNlc1tpXSkpew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeQ0KICAqLw0KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsNCkBAIC0xODEsMjQgKzEzNiwyNCBAQAogfQ0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsNCiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KLQlidWZmZXIuYXBwZW5kKCJTdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuOiA8Ii8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCJTdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuOiA8Iik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHN1cGVyU2ltcGxlTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHN1cGVyU2ltcGxlTmFtZSk7DQotCWJ1ZmZlci5hcHBlbmQoIj4sICIvKm5vbk5MUyovKTsNCisJYnVmZmVyLmFwcGVuZCgiPiwgIik7IC8vJE5PTi1OTFMtMSQNCiAJc3dpdGNoKG1hdGNoTW9kZSl7DQogCQljYXNlIEVYQUNUX01BVENIIDogDQotCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUFJFRklYX01BVENIIDoNCi0JCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQljYXNlIFBBVFRFUk5fTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIvKm5vbk5MUyovKTsNCisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAl9DQogCWlmIChpc0Nhc2VTZW5zaXRpdmUpDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQNCiAJZWxzZQ0KLQkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIvKm5vbk5MUyovKTsNCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQogfQ0KIA0KQEAgLTIzMCw0ICsxODUsNzMgQEAKIAl9DQogCXJldHVybiBmYWxzZTsNCiB9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKCEobm9kZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisNCisJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKFR5cGVSZWZlcmVuY2Upbm9kZTsNCisJaWYgKHJlc29sdmUpIHsNCisJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlUmVmLmJpbmRpbmc7DQorCQlpZiAoYmluZGluZyA9PSBudWxsKSB7DQorCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgYmluZGluZyk7DQorCQl9DQorCX0gZWxzZSB7DQorCQlpZiAodGhpcy5zdXBlclNpbXBsZU5hbWUgPT0gbnVsbCkgew0KKwkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJCX0gZWxzZSB7DQorCQkJY2hhcltdIHR5cGVSZWZTaW1wbGVOYW1lID0gbnVsbDsNCisJCQlpZiAodHlwZVJlZiBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsNCisJCQkJdHlwZVJlZlNpbXBsZU5hbWUgPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpdHlwZVJlZikudG9rZW47DQorCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkVHlwZVJlZmVyZW5jZQ0KKwkJCQljaGFyW11bXSB0b2tlbnMgPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpdHlwZVJlZikudG9rZW5zOw0KKwkJCQl0eXBlUmVmU2ltcGxlTmFtZSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdOw0KKwkJCX0JCQkJDQorCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zdXBlclNpbXBsZU5hbWUsIHR5cGVSZWZTaW1wbGVOYW1lKSkNCisJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJCWVsc2UNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQl9DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwkvLyBzdXBlciBjbGFzcw0KKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCisJaW50IGxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdGhpcy5zdXBlclF1YWxpZmljYXRpb24sIHR5cGUuc3VwZXJjbGFzcygpKTsNCisJc3dpdGNoIChsZXZlbCkgew0KKwkJY2FzZSBJTVBPU1NJQkxFX01BVENIOg0KKwkJCWJyZWFrOyAvLyB0cnkgdG8gZmluZCBtYXRjaCBpbiBzdXBlciBpbnRlcmZhY2VzDQorCQljYXNlIEFDQ1VSQVRFX01BVENIOg0KKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCisJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJYnJlYWs7IC8vIHRyeSB0byBmaW5kIGFjY3VyYXRlIG1hdGNoIGluIHN1cGVyIGludGVyZmFjZXMNCisJfQ0KKw0KKwkvLyBzdXBlciBpbnRlcmZhY2VzDQorCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOw0KKwlmb3IgKGludCBpID0gMCwgbWF4ID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsNCisJCWludCBuZXdMZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zdXBlclNpbXBsZU5hbWUsIHRoaXMuc3VwZXJRdWFsaWZpY2F0aW9uLCBzdXBlckludGVyZmFjZXNbaV0pOw0KKwkJc3dpdGNoIChuZXdMZXZlbCkgew0KKwkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoNCisJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENIDQorCQkJCWxldmVsID0gbmV3TGV2ZWw7DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorCXJldHVybiBsZXZlbDsNCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggNjc1Njc5MS4uZDhlNzk4NCAxMDA2NDQKLS0tIGEvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTExNiw1NiArMTE2LDYgQEAKIAlyZXR1cm4gQ09NUElMQVRJT05fVU5JVCB8IENMQVNTOw0KIH0NCiAvKioNCi0gKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlcyhBc3ROb2RlLCBib29sZWFuKQ0KLSAqLw0KLXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCi0JaWYgKCEobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHJldHVybiBmYWxzZTsNCi0NCi0JVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKW5vZGU7DQotDQotCS8vIHR5cGUgbmFtZQ0KLQlpZiAodGhpcy5zaW1wbGVOYW1lICE9IG51bGwgJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0eXBlLm5hbWUpKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQlpZiAocmVzb2x2ZSkgew0KLQkJLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlLmJpbmRpbmc7DQotCQlpZiAoYmluZGluZyAhPSBudWxsICYmICF0aGlzLm1hdGNoZXMoYmluZGluZykpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0JDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlcyhCaW5kaW5nKQ0KLSAqLw0KLXB1YmxpYyBib29sZWFuIG1hdGNoZXMoQmluZGluZyBiaW5kaW5nKSB7DQotCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykpIHJldHVybiBmYWxzZTsNCi0NCi0JVHlwZUJpbmRpbmcgdHlwZSA9IChUeXBlQmluZGluZyliaW5kaW5nOw0KLQ0KLQkvLyBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUgPSB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsID8gbnVsbCA6IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKTsNCi0JaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCBlbmNsb3NpbmdUeXBlTmFtZSwgdHlwZSkpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvLyBjbGFzcyBvciBpbnRlcmZhY2UNCi0Jc3dpdGNoICh0aGlzLmNsYXNzT3JJbnRlcmZhY2UpIHsNCi0JCWNhc2UgQ0xBU1NfU1VGRklYOg0KLQkJCWlmICh0eXBlLmlzSW50ZXJmYWNlKCkpDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSU5URVJGQUNFX1NVRkZJWDoNCi0JCQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSkNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCWJyZWFrOw0KLQl9DQotCQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXNCaW5hcnkoT2JqZWN0LCBPYmplY3QpDQogICovDQogcHVibGljIGJvb2xlYW4gbWF0Y2hlc0JpbmFyeShPYmplY3QgYmluYXJ5SW5mbywgT2JqZWN0IGVuY2xvc2luZ0JpbmFyeUluZm8pIHsNCkBAIC0yMTMsMjYgKzE2Myw2IEBACiAJfQ0KIH0NCiAvKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIA0KLSAqIHF1YWxpZmljYXRpb24gcGF0dGVybiBhbmQgZW5jbG9zaW5nIHR5cGUgbmFtZSBwYXR0ZXJuLg0KLSAqLw0KLXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuLCBjaGFyW10gZW5jbG9zaW5nTmFtZVBhdHRlcm4sIFR5cGVCaW5kaW5nIHR5cGUpIHsNCi0JaWYgKGVuY2xvc2luZ05hbWVQYXR0ZXJuID09IG51bGwpIHsNCi0JCXJldHVybiB0aGlzLm1hdGNoZXNUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybiwgdHlwZSk7DQotCX0gZWxzZSB7DQotCQljaGFyW10gcGF0dGVybjsNCi0JCWlmIChxdWFsaWZpY2F0aW9uUGF0dGVybiA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG1hdGNoZXNUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBlbmNsb3NpbmdOYW1lUGF0dGVybiwgdHlwZSk7DQotCQl9IGVsc2Ugew0KLQkJCS8vIHBhdHRlcm4gd2FzIGNyZWF0ZWQgZnJvbSBhIEphdmEgZWxlbWVudDogcXVhbGlmaWNhdGlvbiBpcyB0aGUgcGFja2FnZSBuYW1lLg0KLQkJCWNoYXJbXSBmdWxsUXVhbGlmaWNhdGlvblBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChxdWFsaWZpY2F0aW9uUGF0dGVybiwgZW5jbG9zaW5nTmFtZVBhdHRlcm4sICcuJyk7DQotCQkJcmV0dXJuIA0KLQkJCQl0aGlzLm1hdGNoZXNUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBmdWxsUXVhbGlmaWNhdGlvblBhdHRlcm4sIHR5cGUpDQotCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHF1YWxpZmljYXRpb24sIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlLmdldFBhY2thZ2UoKS5jb21wb3VuZE5hbWUsICcuJykpOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KICAqIHNlZSBTZWFyY2hQYXR0ZXJuLm1hdGNoSW5kZXhFbnRyeQ0KICAqLw0KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpew0KQEAgLTI4MiwxNyArMjEyLDE3IEBACiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOw0KIAlzd2l0Y2ggKGNsYXNzT3JJbnRlcmZhY2Upew0KIAkJY2FzZSBDTEFTU19TVUZGSVggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoIkNsYXNzRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Ii8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkNsYXNzRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgSU5URVJGQUNFX1NVRkZJWCA6DQotCQkJYnVmZmVyLmFwcGVuZCgiSW50ZXJmYWNlRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Ii8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIkludGVyZmFjZURlY2xhcmF0aW9uUGF0dGVybjogcGtnPCIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCQlkZWZhdWx0IDoNCi0JCQlidWZmZXIuYXBwZW5kKCJUeXBlRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Ii8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoIlR5cGVEZWNsYXJhdGlvblBhdHRlcm46IHBrZzwiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAl9DQogCWlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQocXVhbGlmaWNhdGlvbik7DQotCWJ1ZmZlci5hcHBlbmQoIj4sIGVuY2xvc2luZzwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4sIGVuY2xvc2luZzwiKTsgLy8kTk9OLU5MUy0xJA0KIAlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwpIHsNCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aDsgaSsrKXsNCiAJCQlidWZmZXIuYXBwZW5kKGVuY2xvc2luZ1R5cGVOYW1lc1tpXSk7DQpAQCAtMzAwLDI0ICsyMzAsOTIgQEAKIAkJCQlidWZmZXIuYXBwZW5kKCcuJyk7DQogCQl9DQogCX0NCi0JYnVmZmVyLmFwcGVuZCgiPiwgdHlwZTwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4sIHR5cGU8Iik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChzaW1wbGVOYW1lKTsNCi0JYnVmZmVyLmFwcGVuZCgiPiwgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2gobWF0Y2hNb2RlKXsNCiAJCWNhc2UgRVhBQ1RfTUFUQ0ggOiANCi0JCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQUkVGSVhfTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUEFUVEVSTl9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCiAJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKCEobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pbm9kZTsNCisNCisJaWYgKHJlc29sdmUpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwodHlwZS5iaW5kaW5nKTsNCisJfSBlbHNlIHsNCisJCS8vIHR5cGUgbmFtZQ0KKwkJaWYgKHRoaXMuc2ltcGxlTmFtZSAhPSBudWxsICYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdHlwZS5uYW1lKSkNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCWVsc2UNCisJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisNCisJVHlwZUJpbmRpbmcgdHlwZSA9IChUeXBlQmluZGluZyliaW5kaW5nOw0KKw0KKwkvLyBjbGFzcyBvciBpbnRlcmZhY2UNCisJc3dpdGNoICh0aGlzLmNsYXNzT3JJbnRlcmZhY2UpIHsNCisJCWNhc2UgQ0xBU1NfU1VGRklYOg0KKwkJCWlmICh0eXBlLmlzSW50ZXJmYWNlKCkpDQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBJTlRFUkZBQ0VfU1VGRklYOg0KKwkJCWlmICghdHlwZS5pc0ludGVyZmFjZSgpKQ0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQlicmVhazsNCisJfQ0KKw0KKwkvLyBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KKwljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUgPSB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsID8gbnVsbCA6IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKTsNCisJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIGVuY2xvc2luZ1R5cGVOYW1lLCB0eXBlKTsNCit9DQorDQorLyoqDQorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUgcGF0dGVybiANCisgKiBxdWFsaWZpY2F0aW9uIHBhdHRlcm4gYW5kIGVuY2xvc2luZyB0eXBlIG5hbWUgcGF0dGVybi4NCisgKi8NCitwcm90ZWN0ZWQgaW50IG1hdGNoTGV2ZWxGb3JUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuLCBjaGFyW10gZW5jbG9zaW5nTmFtZVBhdHRlcm4sIFR5cGVCaW5kaW5nIHR5cGUpIHsNCisJaWYgKGVuY2xvc2luZ05hbWVQYXR0ZXJuID09IG51bGwpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybiwgdHlwZSk7DQorCX0gZWxzZSB7DQorCQljaGFyW10gcGF0dGVybjsNCisJCWlmIChxdWFsaWZpY2F0aW9uUGF0dGVybiA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG1hdGNoTGV2ZWxGb3JUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBlbmNsb3NpbmdOYW1lUGF0dGVybiwgdHlwZSk7DQorCQl9IGVsc2Ugew0KKwkJCS8vIHBhdHRlcm4gd2FzIGNyZWF0ZWQgZnJvbSBhIEphdmEgZWxlbWVudDogcXVhbGlmaWNhdGlvbiBpcyB0aGUgcGFja2FnZSBuYW1lLg0KKwkJCWNoYXJbXSBmdWxsUXVhbGlmaWNhdGlvblBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChxdWFsaWZpY2F0aW9uUGF0dGVybiwgZW5jbG9zaW5nTmFtZVBhdHRlcm4sICcuJyk7DQorCQkJaWYgKCBDaGFyT3BlcmF0aW9uLmVxdWFscyhxdWFsaWZpY2F0aW9uLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZS5nZXRQYWNrYWdlKCkuY29tcG91bmROYW1lLCAnLicpKSkgew0KKwkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZShzaW1wbGVOYW1lUGF0dGVybiwgZnVsbFF1YWxpZmljYXRpb25QYXR0ZXJuLCB0eXBlKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQl9DQorCQl9DQorCX0NCit9DQogfQ0KZGlmZiAtLWdpdCBhL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCA2ODdhYjEyLi5lYTc3MDhiIDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0xMzUsMTgzICsxMzUsNiBAQAogCXJldHVybiBDT01QSUxBVElPTl9VTklUIHwgQ0xBU1MgfCBNRVRIT0QgfCBGSUVMRDsNCiB9DQogLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXMoQXN0Tm9kZSwgYm9vbGVhbikNCi0gKi8NCi1wcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7DQotCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgew0KLQkJcmV0dXJuIHRoaXMubWF0Y2hlcygoVHlwZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsNCi0JfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgew0KLQkJcmV0dXJuIHRoaXMubWF0Y2hlcygoTmFtZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsNCi0JfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7DQotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKChJbXBvcnRSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gaW1wb3J0IHJlZmVyZW5jZS4NCi0gKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KLSAqLw0KLXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQ0KLQlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSByZXR1cm4gZmFsc2U7DQotDQotCWNoYXJbXVtdIHRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7DQotCWludCBpbXBvcnRMZW5ndGggPSB0b2tlbnMubGVuZ3RoOw0KLQkNCi0JaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKXsNCi0JCWNoYXJbXVtdIHF1YWxpZmljYXRpb25Ub2tlbnMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0aGlzLnF1YWxpZmljYXRpb24pOw0KLQkJaW50IHF1YWxpZmljYXRpb25MZW5ndGggPSBxdWFsaWZpY2F0aW9uVG9rZW5zLmxlbmd0aDsNCi0JCWlmIChxdWFsaWZpY2F0aW9uTGVuZ3RoKzEgPiBpbXBvcnRMZW5ndGgpIHJldHVybiBmYWxzZTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcXVhbGlmaWNhdGlvbkxlbmd0aDsgaSsrKXsNCi0JCQlpZiAoIXRoaXMubWF0Y2hlc05hbWUocXVhbGlmaWNhdGlvblRva2Vuc1tpXSwgdG9rZW5zW2ldKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRoaXMuc2ltcGxlTmFtZSAhPSBudWxsIA0KLQkJCSYmICF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW3F1YWxpZmljYXRpb25MZW5ndGhdKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCWlmICh0aGlzLnNpbXBsZU5hbWUgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0TGVuZ3RoOyBpKyspew0KLQkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHRva2Vuc1tpXSkpew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSByZWZlcmVuY2UuDQotICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCi0gKi8NCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhOYW1lUmVmZXJlbmNlIG5hbWVSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgew0KLQlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lUmVmLmJpbmRpbmc7DQotCWlmICghcmVzb2x2ZSB8fCBiaW5kaW5nID09IG51bGwgfHwgIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgew0KLQkJaWYgKHRoaXMuc2ltcGxlTmFtZSAhPSBudWxsKSB7DQotCQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQotCQkJCXJldHVybiB0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgKChTaW5nbGVOYW1lUmVmZXJlbmNlKW5hbWVSZWYpLnRva2VuKTsNCi0JCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQotCQkJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmKS50b2tlbnM7DQotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspew0KLQkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbaV0pKSByZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQkJCQkNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSl7DQotCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZyl7DQotCQkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKSl7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlyZXR1cm4gZmFsc2U7IC8vIG11c3QgYmUgYSB0eXBlIGJpbmRpbmcNCi0JCQl9DQotCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQotCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOw0KLQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmOw0KLQkJCWNoYXJbXVtdIHRva2VucyA9IHFOYW1lUmVmLnRva2VuczsNCi0JCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOw0KLQkJCXN3aXRjaCAocU5hbWVSZWYuYml0cyAmIFN0YXRlbWVudC5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7DQotCQkJCWNhc2UgQmluZGluZ0lkcy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZA0KLQkJCQkJdHlwZUJpbmRpbmcgPSAoKEZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzczsNCi0JCQkJCS8vIG5vIHZhbGlkIG1hdGNoIGFtb25nc3QgZmllbGRzDQotCQkJCQlpbnQgb3RoZXJCaW5kaW5nc0NvdW50ID0gcU5hbWVSZWYub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHFOYW1lUmVmLm90aGVyQmluZGluZ3MubGVuZ3RoOwkJCQ0KLQkJCQkJbGFzdEluZGV4IC09IG90aGVyQmluZGluZ3NDb3VudCArIDE7DQotCQkJCQlpZiAobGFzdEluZGV4IDwgMCkgcmV0dXJuIGZhbHNlOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgQmluZGluZ0lkcy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbCB2YXJpYWJsZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBubyB0eXBlIG1hdGNoIGluIGl0DQotCQkJCWNhc2UgQmluZGluZ0lkcy5UWVBFIDogLy89PT09PT09PT09PT09b25seSB0eXBlID09PT09PT09PT09PT09DQotCQkJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOw0KLQkJCX0NCi0JCQkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4NCi0JCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCl7DQotCQkJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHRva2Vuc1tsYXN0SW5kZXgtLV0pDQotCQkJCQkmJiBtYXRjaGVzVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsNCi0JCQkJCS8vJiYgbWF0Y2hlc0FzU3VidHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsNCi0JCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyl7DQotCQkJCQl0eXBlQmluZGluZyA9ICgoUmVmZXJlbmNlQmluZGluZyl0eXBlQmluZGluZykuZW5jbG9zaW5nVHlwZSgpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJdHlwZUJpbmRpbmcgPSBudWxsOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0gDQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiB0eXBlIHJlZmVyZW5jZS4NCi0gKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLg0KLSAqLw0KLXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQotCWlmICghcmVzb2x2ZSkgew0KLQkJaWYgKHRoaXMuc2ltcGxlTmFtZSAhPSBudWxsKSB7DQotCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7DQotCQkJCXJldHVybiB0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgKChTaW5nbGVUeXBlUmVmZXJlbmNlKXR5cGVSZWYpLnRva2VuKTsNCi0JCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlDQotCQkJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSl0eXBlUmVmKS50b2tlbnM7DQotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspew0KLQkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbaV0pKSByZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQkJCQkNCi0JCX0NCi0JfSBlbHNlIHsNCi0NCi0JCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZVJlZi5iaW5kaW5nOw0KLQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpew0KLQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7DQotCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKXsNCi0JCQkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCB0eXBlQmluZGluZykpew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkVHlwZVJlZmVyZW5jZQ0KLQkJCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHFOYW1lUmVmID0gKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpdHlwZVJlZjsNCi0JCQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOw0KLQkJCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOw0KLQkJCQkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4NCi0JCQkJd2hpbGUgKHR5cGVCaW5kaW5nICE9IG51bGwgJiYgbGFzdEluZGV4ID49IDApew0KLQkJCQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2xhc3RJbmRleC0tXSkNCi0JCQkJCQkmJiBtYXRjaGVzVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsNCi0JCQkJCQkvLyYmIG1hdGNoZXNBc1N1YnR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKSkgcmV0dXJuIHRydWU7DQotCQkJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKXsNCi0JCQkJCQl0eXBlQmluZGluZyA9ICgoUmVmZXJlbmNlQmluZGluZyl0eXBlQmluZGluZykuZW5jbG9zaW5nVHlwZSgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQl0eXBlQmluZGluZyA9IG51bGw7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0gDQotCQl9DQotCQkJDQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzKEJpbmRpbmcpDQotICovDQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhCaW5kaW5nIGJpbmRpbmcpIHsNCi0JaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSByZXR1cm4gZmFsc2U7DQotDQotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOw0KLQlpZiAodGhpcy5tYXRjaGVzVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZS5zdXBlcmNsYXNzKCkpKXsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsNCi0JZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQotCQlpZiAodGhpcy5tYXRjaGVzVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgc3VwZXJJbnRlcmZhY2VzW2ldKSl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5DQogICovDQogcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCkgew0KQEAgLTM1NiwyNiArMTc5LDYgQEAKIAlyZXR1cm4gdHJ1ZTsNCiB9DQogLyoqDQotICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwNCi0gKi8NCi1wdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlKSB7DQotCWlmIChub2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgew0KLQkJaWYgKHRoaXMubWF0Y2hlcygoTmFtZVJlZmVyZW5jZSlub2RlLCBmYWxzZSkpIHsNCi0JCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7IC8vIGFsd2F5cyBuZWVkIHRvIHJlc29sdmUgbmFtZSByZWZlcmVuY2UNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQotCQl9DQotCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgew0KLQkJaWYgKHRoaXMubWF0Y2hlcygoSW1wb3J0UmVmZXJlbmNlKW5vZGUsIGZhbHNlKSkgew0KLQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQotCQl9DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gc3VwZXIubWF0Y2hMZXZlbChub2RlKTsNCi0JfQ0KLX0NCi0vKioNCiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hSZXBvcnRSZWZlcmVuY2UNCiAgKi8NCiBwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCkBAIC00MTUsMjYgKzIxOCwyMzkgQEAKIH0NCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7DQogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsNCi0JYnVmZmVyLmFwcGVuZCgiVHlwZVJlZmVyZW5jZVBhdHRlcm46IHBrZzwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIlR5cGVSZWZlcmVuY2VQYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChxdWFsaWZpY2F0aW9uKTsNCi0JYnVmZmVyLmFwcGVuZCgiPiwgdHlwZTwiLypub25OTFMqLyk7DQorCWJ1ZmZlci5hcHBlbmQoIj4sIHR5cGU8Iik7IC8vJE5PTi1OTFMtMSQNCiAJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChzaW1wbGVOYW1lKTsNCi0JYnVmZmVyLmFwcGVuZCgiPiwgIi8qbm9uTkxTKi8pOw0KKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJA0KIAlzd2l0Y2gobWF0Y2hNb2RlKXsNCiAJCWNhc2UgRVhBQ1RfTUFUQ0ggOiANCi0JCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJA0KIAkJCWJyZWFrOw0KIAkJY2FzZSBQUkVGSVhfTUFUQ0ggOg0KLQkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQNCiAJCQlicmVhazsNCiAJCWNhc2UgUEFUVEVSTl9NQVRDSCA6DQotCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIi8qbm9uTkxTKi8pOw0KKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkDQogCQkJYnJlYWs7DQogCX0NCiAJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkNCi0JCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJA0KIAllbHNlDQotCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIi8qbm9uTkxTKi8pOw0KKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkDQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCiB9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsNCisJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChUeXBlUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7DQorCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChOYW1lUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOw0KKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsNCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKEltcG9ydFJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsNCisJfQ0KKwlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCit9DQorDQorLyoqDQorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIGltcG9ydCByZWZlcmVuY2UuDQorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCisgKi8NCitwcml2YXRlIGludCBtYXRjaExldmVsKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgew0KKw0KKwlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisNCisJY2hhcltdW10gdG9rZW5zID0gaW1wb3J0UmVmLnRva2VuczsNCisJaW50IGltcG9ydExlbmd0aCA9IHRva2Vucy5sZW5ndGg7DQorCQ0KKwlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpew0KKwkJY2hhcltdW10gcXVhbGlmaWNhdGlvblRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHRoaXMucXVhbGlmaWNhdGlvbik7DQorCQlpbnQgcXVhbGlmaWNhdGlvbkxlbmd0aCA9IHF1YWxpZmljYXRpb25Ub2tlbnMubGVuZ3RoOw0KKwkJaWYgKHF1YWxpZmljYXRpb25MZW5ndGgrMSA+IGltcG9ydExlbmd0aCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHF1YWxpZmljYXRpb25MZW5ndGg7IGkrKyl7DQorCQkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHF1YWxpZmljYXRpb25Ub2tlbnNbaV0sIHRva2Vuc1tpXSkpIHsNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsIHx8IHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbcXVhbGlmaWNhdGlvbkxlbmd0aF0pKSB7DQorCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCX0NCisJfSBlbHNlIHsNCisJCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgew0KKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsNCisJCX0gZWxzZSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRMZW5ndGg7IGkrKyl7DQorCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2ldKSl7DQorCQkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQl9DQorCX0NCit9DQorDQorLyoqDQorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgcmVmZXJlbmNlLg0KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuDQorICovDQorcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChOYW1lUmVmZXJlbmNlIG5hbWVSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgew0KKwlpZiAoIXJlc29sdmUpIHsNCisJCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgew0KKwkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsNCisJCX0gZWxzZSB7DQorCQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQorCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgKChTaW5nbGVOYW1lUmVmZXJlbmNlKW5hbWVSZWYpLnRva2VuKSkgew0KKwkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJCX0NCisJCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlDQorCQkJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmKS50b2tlbnM7DQorCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspew0KKwkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbaV0pKSANCisJCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCQkJCX0NCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJfQkJCQkNCisJCX0NCisJfSBlbHNlIHsNCisJCUJpbmRpbmcgYmluZGluZyA9IG5hbWVSZWYuYmluZGluZzsNCisJCWlmIChiaW5kaW5nID09IG51bGwpIHsNCisJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsNCisJCX0gZWxzZSB7DQorCQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7DQorCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsNCisJCQkJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7IC8vIG11c3QgYmUgYSB0eXBlIGJpbmRpbmcNCisJCQkJfQ0KKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UNCisJCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOw0KKwkJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHFOYW1lUmVmID0gKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpbmFtZVJlZjsNCisJCQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOw0KKwkJCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOw0KKwkJCQlzd2l0Y2ggKHFOYW1lUmVmLmJpdHMgJiBTdGF0ZW1lbnQuUmVzdHJpY3RpdmVGbGFnTUFTSykgew0KKwkJCQkJY2FzZSBCaW5kaW5nSWRzLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkDQorCQkJCQkJdHlwZUJpbmRpbmcgPSAoKEZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzczsNCisJCQkJCQkvLyBubyB2YWxpZCBtYXRjaCBhbW9uZ3N0IGZpZWxkcw0KKwkJCQkJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7CQkJDQorCQkJCQkJbGFzdEluZGV4IC09IG90aGVyQmluZGluZ3NDb3VudCArIDE7DQorCQkJCQkJaWYgKGxhc3RJbmRleCA8IDApIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBCaW5kaW5nSWRzLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlDQorCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7IC8vIG5vIHR5cGUgbWF0Y2ggaW4gaXQNCisJCQkJCWNhc2UgQmluZGluZ0lkcy5UWVBFIDogLy89PT09PT09PT09PT09b25seSB0eXBlID09PT09PT09PT09PT09DQorCQkJCQkJdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsNCisJCQkJfQ0KKwkJCQkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4NCisJCQkJd2hpbGUgKHR5cGVCaW5kaW5nICE9IG51bGwgJiYgbGFzdEluZGV4ID49IDApew0KKwkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbbGFzdEluZGV4LS1dKSkgew0KKwkJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsNCisJCQkJCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCQkJCQlyZXR1cm4gbGV2ZWw7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyl7DQorCQkJCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdHlwZUJpbmRpbmcgPSBudWxsOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCisvKioNCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gdHlwZSByZWZlcmVuY2UuDQorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4NCisgKi8NCitwcml2YXRlIGludCBtYXRjaExldmVsKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7DQorCWlmICghcmVzb2x2ZSkgew0KKwkJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAodHlwZVJlZiBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsNCisJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpdHlwZVJlZikudG9rZW4pKSB7DQorCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UNCisJCQkJY2hhcltdW10gdG9rZW5zID0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXR5cGVSZWYpLnRva2VuczsNCisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRva2Vucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQorCQkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHRva2Vuc1tpXSkpIHsNCisJCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJfQkJCQkNCisJCX0gDQorCX0gZWxzZSB7DQorCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVSZWYuYmluZGluZzsNCisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7DQorCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7DQorCQl9IGVsc2Ugew0KKwkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7DQorCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKXsNCisJCQkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsNCisJCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlDQorCQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSl0eXBlUmVmOw0KKwkJCQljaGFyW11bXSB0b2tlbnMgPSBxTmFtZVJlZi50b2tlbnM7DQorCQkJCWludCBsYXN0SW5kZXggPSB0b2tlbnMubGVuZ3RoLTE7DQorCQkJCS8vIHRyeSB0byBtYXRjaCBhbGwgZW5jbG9zaW5nIHR5cGVzIGZvciB3aGljaCB0aGUgdG9rZW4gbWF0Y2hlcyBhcyB3ZWxsLg0KKwkJCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCl7DQorCQkJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0b2tlbnNbbGFzdEluZGV4LS1dKSkgew0KKwkJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsNCisJCQkJCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJCQkJCQlyZXR1cm4gbGV2ZWw7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyl7DQorCQkJCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdHlwZUJpbmRpbmcgPSBudWxsOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKwkJCX0gDQorCQl9DQorCQkJDQorCX0NCit9DQorDQorLyoqDQorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykNCisgKi8NCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7DQorCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOw0KKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOw0KKw0KKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsNCisJaW50IGxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZS5zdXBlcmNsYXNzKCkpOw0KKwlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgew0KKwkJcmV0dXJuIGxldmVsOw0KKwl9DQorCQ0KKwlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsNCisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7DQorCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCBzdXBlckludGVyZmFjZXNbaV0pOw0KKwkJc3dpdGNoIChuZXdMZXZlbCkgew0KKwkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoNCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7DQorCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbA0KKwkJCQlicmVhazsNCisJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSA0KKwkJCQlsZXZlbCA9IG5ld0xldmVsOw0KKwkJCQlicmVhazsNCisJCX0NCisJfQ0KKwlyZXR1cm4gbGV2ZWw7DQorfQ0KIH0NCmRpZmYgLS1naXQgYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhIGIvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQppbmRleCBjNmQ0ZGQzLi5lNmNkNjQ3IDEwMDY0NAotLS0gYS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhCisrKyBiL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9Kb2JNYW5hZ2VyLmphdmEKQEAgLTEzNywyNCArMTM3LDI0IEBACiAgKi8NCiBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ29uY3VycmVudEpvYihJSm9iIHNlYXJjaEpvYiwgaW50IHdhaXRpbmdQb2xpY3ksIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsNCiANCi0JaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gcGVyZm9ybWluZyBjb25jdXJyZW50IGpvYiA6IFNUQVJUIC0gIi8qbm9uTkxTKi8gKyBzZWFyY2hKb2IpOw0KKwlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBwZXJmb3JtaW5nIGNvbmN1cnJlbnQgam9iIDogU1RBUlQgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJA0KIAlib29sZWFuIHN0YXR1cyA9IEZBSUxFRDsNCiAJaWYgKGF3YWl0aW5nSm9ic0NvdW50KCkgPiAwKXsNCiAJCXN3aXRjaCh3YWl0aW5nUG9saWN5KXsNCiAJCQkNCiAJCQljYXNlIEZvcmNlSW1tZWRpYXRlIDoNCi0JCQkJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gcGVyZm9ybWluZyBjb25jdXJyZW50IGpvYiA6IE5PVCBSRUFEWSAtIEZvcmNlSW1tZWRpYXRlIC0gIi8qbm9uTkxTKi8gKyBzZWFyY2hKb2IpOw0KKwkJCQlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBwZXJmb3JtaW5nIGNvbmN1cnJlbnQgam9iIDogTk9UIFJFQURZIC0gRm9yY2VJbW1lZGlhdGUgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQlib29sZWFuIHdhc0VuYWJsZWQgPSBpc0VuYWJsZWQoKTsNCiAJCQkJdHJ5IHsNCiAJCQkJCWRpc2FibGUoKTsgLy8gcGF1c2UgaW5kZXhpbmcNCiAJCQkJCXN0YXR1cyA9IHNlYXJjaEpvYi5leGVjdXRlKCk7DQotCQkJCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBFTkQgLSAiLypub25OTFMqLyArIHNlYXJjaEpvYik7DQorCQkJCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBFTkQgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJA0KIAkJCQl9IGZpbmFsbHkgew0KIAkJCQkJaWYgKHdhc0VuYWJsZWQpIGVuYWJsZSgpOw0KIAkJCQl9DQogCQkJCXJldHVybiBzdGF0dXM7DQogCQkJY2FzZSBDYW5jZWxJZk5vdFJlYWR5IDoNCi0JCQkJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gcGVyZm9ybWluZyBjb25jdXJyZW50IGpvYiA6IE5PVCBSRUFEWSAtIENhbmNlbElmTm90UmVhZHkgLSAiLypub25OTFMqLyArIHNlYXJjaEpvYik7DQorCQkJCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBOT1QgUkVBRFkgLSBDYW5jZWxJZk5vdFJlYWR5IC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQNCiAJCQkJcHJvZ3Jlc3Muc2V0Q2FuY2VsZWQodHJ1ZSk7DQogCQkJCWJyZWFrOyANCiANCkBAIC0xNjYsOSArMTY2LDkgQEAKIAkJCQkJCWlmIChwcm9ncmVzcyAhPSBudWxsICYmIHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7DQogCQkJCQkJY3VycmVudEpvYiA9IGN1cnJlbnRKb2IoKTsgLy8gY3VycmVudEpvYiBjYW4gYmUgbnVsbCB3aGVuIGpvYnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZSBidXQgam9iIG1hbmFnZXIgaXMgbm90IGVuYWJsZWQNCiAJCQkJCQlpZiAoY3VycmVudEpvYiAhPSBudWxsICYmIGN1cnJlbnRKb2IgIT0gcHJldmlvdXNKb2Ipew0KLQkJCQkJCQlpZiAoVkVSQk9TRSkgU3lzdGVtLm91dC5wcmludGxuKCItPiBwZXJmb3JtaW5nIGNvbmN1cnJlbnQgam9iIDogTk9UIFJFQURZIC0gV2FpdFVudGlsUmVhZHkgLSAiLypub25OTFMqLyArIHNlYXJjaEpvYik7DQorCQkJCQkJCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBOT1QgUkVBRFkgLSBXYWl0VW50aWxSZWFkeSAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkDQogCQkJCQkJCWlmIChwcm9ncmVzcyAhPSBudWxsKXsNCi0JCQkJCQkJCXByb2dyZXNzLnN1YlRhc2soVXRpbC5iaW5kKCJtYW5hZ2VyLmZpbGVzVG9JbmRleCIvKm5vbk5MUyovLCBJbnRlZ2VyLnRvU3RyaW5nKGF3YWl0aW5nV29yaykpKTsNCisJCQkJCQkJCXByb2dyZXNzLnN1YlRhc2soVXRpbC5iaW5kKCJtYW5hZ2VyLmZpbGVzVG9JbmRleCIsIEludGVnZXIudG9TdHJpbmcoYXdhaXRpbmdXb3JrKSkpOyAvLyROT04tTkxTLTEkDQogCQkJCQkJCX0NCiAJCQkJCQkJcHJldmlvdXNKb2IgPSBjdXJyZW50Sm9iOw0KIAkJCQkJCX0NCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJfQ0KIAl9DQogCXN0YXR1cyA9IHNlYXJjaEpvYi5leGVjdXRlKCk7DQotCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBFTkQgLSAiLypub25OTFMqLyArIHNlYXJjaEpvYik7DQorCWlmIChWRVJCT1NFKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0+IHBlcmZvcm1pbmcgY29uY3VycmVudCBqb2IgOiBFTkQgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJA0KIAlyZXR1cm4gc3RhdHVzOw0KIH0NCiBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHByb2Nlc3NOYW1lKCk7DQpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCWpvYlN0YXJ0ID0gMDsNCiAJfQ0KIAlhd2FpdGluZ0pvYnNbam9iRW5kXSA9IGpvYjsNCi0JaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gcmVxdWVzdGluZyBqb2I6ICIvKm5vbk5MUyovICsgam9iKTsNCisJaWYgKFZFUkJPU0UpIFN5c3RlbS5vdXQucHJpbnRsbigiLT4gcmVxdWVzdGluZyBqb2I6ICIgKyBqb2IpOyAvLyROT04tTkxTLTEkDQogCQ0KIH0NCiAvKioNCkBAIC0yMzAsOCArMjMwLDggQEAKIAkJCQlpZGxpbmdTdGFydCA9IC0xOw0KIAkJCX0NCiAJCQlpZiAoVkVSQk9TRSl7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gZXhlY3V0aW5nOiAiLypub25OTFMqLyArIGpvYik7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiLypub25OTFMqLyArIGF3YWl0aW5nSm9ic0NvdW50KCkgKyAiIGF3YWl0aW5nIGpvYnMuIi8qbm9uTkxTKi8pOw0KKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IGV4ZWN1dGluZzogIiArIGpvYik7IC8vJE5PTi1OTFMtMSQNCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBhd2FpdGluZ0pvYnNDb3VudCgpICsgIiBhd2FpdGluZyBqb2JzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCiAJCQl9DQogCQkJdHJ5IHsNCiAJCQkJZXhlY3V0aW5nID0gdHJ1ZTsNCg==