httpclientutil

来源:互联网 发布:netbeans php配置 编辑:程序博客网 时间:2024/06/08 10:10
cGFja2FnZSBjb20uamQuamRyZWFkLndlY2hhdC5nb25nZHUuZG9tYWluLnV0aWw7Ly8gcGFja2FnZSBjb20ud29sb25nLnJlY28uaGVscGVyOwoKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25zdHM7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwppbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpcjsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuY29uZmlnLlJlcXVlc3RDb25maWc7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LmVudGl0eS5VcmxFbmNvZGVkRm9ybUVudGl0eTsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25maWcuQ29ubmVjdGlvbkNvbmZpZzsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25maWcuUmVnaXN0cnk7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29uZmlnLlJlZ2lzdHJ5QnVpbGRlcjsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25maWcuU29ja2V0Q29uZmlnOwppbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc29ja2V0LkNvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5OwppbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc29ja2V0LlBsYWluQ29ubmVjdGlvblNvY2tldEZhY3Rvcnk7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ5dGVBcnJheUVudGl0eTsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuU3RyaW5nRW50aXR5OwppbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudHM7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CmltcG9ydCBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlcjsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljTmFtZVZhbHVlUGFpcjsKaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOwppbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CgovKioKICogQ3JlYXRlZCBieSB6aGFuZ3p5IG9uIDIwMTUvNy8yLgogKi8KcHVibGljIGNsYXNzIEh0dHBDbGllbnRVdGlsIHsKCiAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSHR0cENsaWVudFV0aWwuY2xhc3MpOwoKICBwcml2YXRlIHN0YXRpYyBDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBudWxsOwoKICBzdGF0aWMgewogICAgaHR0cGNsaWVudCA9IGJ1aWxkSHR0cENsaWVudCgyMDAsIDIwKTsKICB9CgogIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0dHBHZXQoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbSwgaW50IGNvbm5lY3RUaW1lb3V0LAogICAgICBpbnQgcmVhZFRpbWVvdXQpIHsKICAgIHJldHVybiBodHRwR2V0KHVybCwgcGFyYW0sICJ1dGYtOCIsIGNvbm5lY3RUaW1lb3V0LCByZWFkVGltZW91dCk7CiAgfQoKICBwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwR2V0KFN0cmluZyB1cmwsIGludCBjb25uZWN0VGltZW91dCwgaW50IHJlYWRUaW1lb3V0KSB7CiAgICByZXR1cm4gaHR0cEdldCh1cmwsIG51bGwsICJ1dGYtOCIsIGNvbm5lY3RUaW1lb3V0LCByZWFkVGltZW91dCk7CiAgfQoKICBwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwR2V0KFN0cmluZyB1cmwpIHsKICAgICAgICByZXR1cm4gaHR0cEdldCh1cmwsIG51bGwsICJ1dGYtOCIsIDIwMCwgMzAwKTsKICB9CgogIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0dHBHZXQoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsIFN0cmluZyBlbmNvZGUsCiAgICAgIGludCBjb25uZWN0VGltZW91dCwgaW50IHJlYWRUaW1lb3V0KSB7CiAgICByZXR1cm4gaHR0cEdldCh1cmwsIHBhcmFtcywgbnVsbCwgZW5jb2RlLCBjb25uZWN0VGltZW91dCwgcmVhZFRpbWVvdXQpOwogIH0KCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cEdldChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAogICAgICBTdHJpbmcgZW5jb2RlLCBpbnQgY29ubmVjdFRpbWVvdXQsIGludCByZWFkVGltZW91dCkgewogICAgU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbnVsbDsKICAgIFJlcXVlc3RDb25maWcgcmVxdWVzdENvbmZpZyA9CiAgICAgICAgUmVxdWVzdENvbmZpZy5jdXN0b20oKS5zZXRTb2NrZXRUaW1lb3V0KHJlYWRUaW1lb3V0KS5zZXRDb25uZWN0VGltZW91dChjb25uZWN0VGltZW91dCkKICAgICAgICAgICAgLnNldENvbm5lY3Rpb25SZXF1ZXN0VGltZW91dChjb25uZWN0VGltZW91dCkuYnVpbGQoKTsKCiAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodXJsKTsKICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewogICAgICBpbnQgaSA9IDA7CiAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7CiAgICAgICAgaWYgKGkgPT0gMCAmJiAhdXJsLmNvbnRhaW5zKCI/IikpIHsKICAgICAgICAgIHNiLmFwcGVuZCgiPyIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzYi5hcHBlbmQoIiYiKTsKICAgICAgICB9CiAgICAgICAgc2IuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKICAgICAgICBzYi5hcHBlbmQoIj0iKTsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUodmFsdWUsICJVVEYtOCIpKTsKICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgICAgICAgIGxvZ2dlci53YXJuKCJlbmNvZGUgaHR0cCBnZXQgcGFyYW1zIGVycm9yLCB2YWx1ZSBpcyAiICsgdmFsdWUsIGUpOwogICAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfQogICAgfQoKICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgewogICAgICBsb2dnZXIuZGVidWcoIltIdHRwVXRpbHMgR2V0XSBiZWdpbiBpbnZva2U6IiArIHNiLnRvU3RyaW5nKCkpOwogICAgfQogICAgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldChzYi50b1N0cmluZygpKTsKICAgIGdldC5zZXRDb25maWcocmVxdWVzdENvbmZpZyk7CgogICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewogICAgICBMaXN0PEhlYWRlcj4gaHR0cEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgZm9yIChTdHJpbmcgaGVhZGVyTmFtZSA6IGhlYWRlcnMua2V5U2V0KCkpIHsKICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhoZWFkZXJzLmdldChoZWFkZXJOYW1lKSkpIHsKICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgQmFzaWNIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVycy5nZXQoaGVhZGVyTmFtZSkpOwogICAgICAgICAgaHR0cEhlYWRlcnMuYWRkKGhlYWRlcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChodHRwSGVhZGVycy5zaXplKCkgPiAwKSB7CiAgICAgICAgZ2V0LnNldEhlYWRlcnMoaHR0cEhlYWRlcnMudG9BcnJheShuZXcgSGVhZGVyW2h0dHBIZWFkZXJzLnNpemUoKV0pKTsKICAgICAgfQogICAgfQoKICAgIENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CiAgICBIdHRwRW50aXR5IGVudGl0eSA9IG51bGw7CiAgICB0cnkgewogICAgICByZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShnZXQpOwogICAgICBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgcmVzcG9uc2VTdHJpbmcgPSBFbnRpdHlVdGlscy50b1N0cmluZyhlbnRpdHksIGVuY29kZSk7CiAgICAgIH0KICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CiAgICAgICAgbG9nZ2VyLmRlYnVnKFN0cmluZy5mb3JtYXQoIltIdHRwVXRpbHMgR2V0XURlYnVnIHVybDolcyAsIHJlc3BvbnNlIHN0cmluZyAlczoiLAogICAgICAgICAgICBzYi50b1N0cmluZygpLCByZXNwb25zZVN0cmluZykpOwogICAgICB9CiAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKICAgICAgbG9nZ2VyLmVycm9yKFN0cmluZy5mb3JtYXQoIltIdHRwVXRpbHMgR2V0XWludm9rZSBnZXQgdGltb3V0IGVycm9yLCB1cmw6JXMiLCBzYi50b1N0cmluZygpKSwKICAgICAgICAgIGUpOwogICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgbG9nZ2VyLmVycm9yKFN0cmluZy5mb3JtYXQoIltIdHRwVXRpbHMgR2V0XWludm9rZSBnZXQgZXJyb3IsIHVybDolcyIsIHNiLnRvU3RyaW5nKCkpLCBlKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBlbnRpdHkuZ2V0Q29udGVudCgpLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgbG9nZ2VyLmVycm9yKCJbSHR0cFV0aWxzIEdldF0gZXJyb3Igb2NjdXJzIHdoZW4gY2xvc2luZyBlbnRpdHkiLCBlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICBsb2dnZXIuZXJyb3IoIltIdHRwVXRpbHMgR2V0XSBlcnJvciBvY2N1cnMgd2hlbiBjbG9zaW5nIHJlc3BvbnNlIiwgZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldC5yZWxlYXNlQ29ubmVjdGlvbigpOwogICAgfQogICAgcmV0dXJuIHJlc3BvbnNlU3RyaW5nOwogIH0KCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvc3QoU3RyaW5nIHVybCwgTGlzdDxOYW1lVmFsdWVQYWlyPiBwb3N0UGFyYW1zLCBpbnQgcmVhZFRpbWVvdXQsCiAgICAgIGludCBjb25uZWN0VGltZW91dCkgewogICAgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOwogICAgdHJ5IHsKICAgICAgUmVxdWVzdENvbmZpZyByZXF1ZXN0Q29uZmlnID0KICAgICAgICAgIFJlcXVlc3RDb25maWcuY3VzdG9tKCkuc2V0U29ja2V0VGltZW91dChyZWFkVGltZW91dCkuc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXQpCiAgICAgICAgICAgICAgLnNldENvbm5lY3Rpb25SZXF1ZXN0VGltZW91dChjb25uZWN0VGltZW91dCkuc2V0RXhwZWN0Q29udGludWVFbmFibGVkKGZhbHNlKS5idWlsZCgpOwogICAgICBwb3N0LnNldENvbmZpZyhyZXF1ZXN0Q29uZmlnKTsKICAgICAgcG9zdC5zZXRFbnRpdHkobmV3IFVybEVuY29kZWRGb3JtRW50aXR5KHBvc3RQYXJhbXMsICJVVEYtOCIpKTsKICAgICAgQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKHBvc3QpOwogICAgICB0cnkgewogICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IDIwMCkgey8vIOWmguaenOeKtuaAgeeggeS4ujIwMCzlsLHmmK/mraPluLjov5Tlm54KICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBFbnRpdHlVdGlscy50b1N0cmluZyhyZXNwb25zZS5nZXRFbnRpdHkoKSk7CiAgICAgICAgICAvLyDlvpfliLDov5Tlm57nmoTlrZfnrKbkuLIKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7CiAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgbG9nZ2VyLmVycm9yKFN0cmluZy5mb3JtYXQoIltIdHRwVXRpbHMgUE9TVF1nZXQgcmVzcG9uc2UgZXJyb3IsIHVybDolcyIsIHVybCwgZSkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOwogICAgfQogICAgcmV0dXJuICIiOwogIH0KCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvc3RKc29uKFN0cmluZyB1cmwsIFN0cmluZyBqc29uKXsKICAgICAgcmV0dXJuIGh0dHBQb3N0SnNvbih1cmwsanNvbiwiVVRGLTgiLDIwMCwzMDApOwogIH0KCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvc3RKc29uKFN0cmluZyB1cmwsIFN0cmluZyBqc29uLCBTdHJpbmcgZW5jb2RpbmcsIGludCBjb25uZWN0VGltZW91dCwKICAgICAgaW50IHJlYWRUaW1lb3V0KSB7CiAgICBIdHRwUG9zdCBwb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CiAgICB0cnkgewogICAgICBwb3N0LnNldEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL2pzb24iKTsKICAgICAgUmVxdWVzdENvbmZpZyByZXF1ZXN0Q29uZmlnID0KICAgICAgICAgIFJlcXVlc3RDb25maWcuY3VzdG9tKCkuc2V0U29ja2V0VGltZW91dChyZWFkVGltZW91dCkuc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXQpCiAgICAgICAgICAgICAgLnNldENvbm5lY3Rpb25SZXF1ZXN0VGltZW91dChjb25uZWN0VGltZW91dCkuc2V0RXhwZWN0Q29udGludWVFbmFibGVkKGZhbHNlKS5idWlsZCgpOwogICAgICBwb3N0LnNldENvbmZpZyhyZXF1ZXN0Q29uZmlnKTsKICAgICAgcG9zdC5zZXRFbnRpdHkobmV3IFN0cmluZ0VudGl0eShqc29uLCBlbmNvZGluZykpOwogICAgICBsb2dnZXIuaW5mbygiW0h0dHBVdGlscyBQb3N0XSBiZWdpbiBpbnZva2UgdXJsOiIgKyB1cmwpOwogICAgICBDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgIHRyeSB7CiAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAgIFN0cmluZyBzdHIgPSBFbnRpdHlVdGlscy50b1N0cmluZyhlbnRpdHksIGVuY29kaW5nKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9nZ2VyLmluZm8oIltIdHRwVXRpbHMgUG9zdF1EZWJ1ZyByZXNwb25zZSwgdXJsIDoiICsgdXJsICsgIiAsIHJlc3BvbnNlIHN0cmluZyA6IiArCiAgICAgICAgICAgICAqIHN0cik7CiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgfQogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgZW50aXR5LmdldENvbnRlbnQoKS5jbG9zZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewogICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogICAgICBsb2dnZXIuZXJyb3IoIlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLCBlKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIiwgZSk7CiAgICB9IGZpbmFsbHkgewogICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CiAgICB9CiAgICByZXR1cm4gIiI7CiAgfQoKICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBodHRwUG9zdEpzb24oU3RyaW5nIHVybCwgYnl0ZVtdIGpzb24sIFN0cmluZyBlbmNvZGluZywgaW50IGNvbm5lY3RUaW1lb3V0LAogICAgICBpbnQgcmVhZFRpbWVvdXQpIHsKICAgIEh0dHBQb3N0IHBvc3QgPSBuZXcgSHR0cFBvc3QodXJsKTsKICAgIHRyeSB7CiAgICAgIHBvc3Quc2V0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24vanNvbiIpOwogICAgICBSZXF1ZXN0Q29uZmlnIHJlcXVlc3RDb25maWcgPQogICAgICAgICAgUmVxdWVzdENvbmZpZy5jdXN0b20oKS5zZXRTb2NrZXRUaW1lb3V0KHJlYWRUaW1lb3V0KS5zZXRDb25uZWN0VGltZW91dChjb25uZWN0VGltZW91dCkKICAgICAgICAgICAgICAuc2V0Q29ubmVjdGlvblJlcXVlc3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0KS5zZXRFeHBlY3RDb250aW51ZUVuYWJsZWQoZmFsc2UpLmJ1aWxkKCk7CiAgICAgIHBvc3Quc2V0Q29uZmlnKHJlcXVlc3RDb25maWcpOwogICAgICBwb3N0LnNldEVudGl0eShuZXcgQnl0ZUFycmF5RW50aXR5KGpzb24pKTsKCiAgICAgIENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShwb3N0KTsKCiAgICAgIC8vIOiOt+WPluWTjeW6lOeKtuaAgeeggQogICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKCiAgICAgIGlmIChzdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICBieXRlW10gc3RyID0gRW50aXR5VXRpbHMudG9CeXRlQXJyYXkoZW50aXR5KTsKICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIltIdHRwQ2xpZW50VXRpbCBQb3N0XURlYnVnIHJlc3BvbnNlLCB1cmwgOiIgKyB1cmwKICAgICAgICAgICAgICAgICAgKyAiICwgcmVzcG9uc2Ugc3RyaW5nIDoiICsgc3RyKTsKICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICBlbnRpdHkuZ2V0Q29udGVudCgpLmNsb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG9nZ2VyLmVycm9yKCJbSHR0cENsaWVudFV0aWwgUG9zdF1EZWJ1ZyByZXNwb25zZSwgY29kZSA6IiArIHN0YXR1cyArICIsdXJsPSIgKyB1cmwpOwogICAgICB9CiAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgICAgbG9nZ2VyLmVycm9yKCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwgZSk7CiAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiIsIGUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9zdFN0cmluZyhTdHJpbmcgdXJsLCBieXRlW10ganNvbiwgU3RyaW5nIGVuY29kaW5nLCBpbnQgY29ubmVjdFRpbWVvdXQsCiAgICAgIGludCByZWFkVGltZW91dCkgewogICAgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOwogICAgdHJ5IHsKICAgICAgcG9zdC5zZXRIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIik7CiAgICAgIFJlcXVlc3RDb25maWcgcmVxdWVzdENvbmZpZyA9CiAgICAgICAgICBSZXF1ZXN0Q29uZmlnLmN1c3RvbSgpLnNldFNvY2tldFRpbWVvdXQocmVhZFRpbWVvdXQpLnNldENvbm5lY3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0KQogICAgICAgICAgICAgIC5zZXRDb25uZWN0aW9uUmVxdWVzdFRpbWVvdXQoY29ubmVjdFRpbWVvdXQpLnNldEV4cGVjdENvbnRpbnVlRW5hYmxlZChmYWxzZSkuYnVpbGQoKTsKICAgICAgcG9zdC5zZXRDb25maWcocmVxdWVzdENvbmZpZyk7CiAgICAgIHBvc3Quc2V0RW50aXR5KG5ldyBCeXRlQXJyYXlFbnRpdHkoanNvbikpOwoKICAgICAgQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKHBvc3QpOwoKICAgICAgLy8g6I635Y+W5ZON5bqU54q25oCB56CBCiAgICAgIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOwogICAgICBpZiAoc3RhdHVzID09IDIwMCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKGVudGl0eSwgZW5jb2RpbmcpOwogICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiW0h0dHBDbGllbnRVdGlsIFBvc3RdRGVidWcgcmVzcG9uc2UsIHVybCA6IiArIHVybAogICAgICAgICAgICAgICAgICArICIgLCByZXNwb25zZSBzdHJpbmcgOiIgKyBzdHIpOwogICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgIGVudGl0eS5nZXRDb250ZW50KCkuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewogICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBsb2dnZXIuaW5mbygiW0h0dHBDbGllbnRVdGlsIFBvc3RdRGVidWcgcmVzcG9uc2UsIGNvZGUgOiIgKyBzdGF0dXMpOwogICAgICB9CiAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgICAgbG9nZ2VyLmVycm9yKCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwgZSk7CiAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiIsIGUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgcHVibGljIHN0YXRpYyBDbG9zZWFibGVIdHRwQ2xpZW50IGJ1aWxkSHR0cENsaWVudChJbnRlZ2VyIG1heFRvdGFsLCBJbnRlZ2VyIG1heFBlclJvdXRlKSB7CiAgICBmaW5hbCBpbnQga01heFRvdGFsID0gbWF4VG90YWwgPT0gbnVsbCA/IDIwMDAgOiBtYXhUb3RhbDsKICAgIGZpbmFsIGludCBrTWF4UGVyUm91dGUgPSBtYXhQZXJSb3V0ZSA9PSBudWxsID8gMjAwMCA6IG1heFBlclJvdXRlOwoKICAgIFJlZ2lzdHJ5PENvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5PiByID0KICAgICAgICBSZWdpc3RyeUJ1aWxkZXIuPENvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5PmNyZWF0ZSgpCiAgICAgICAgICAgIC5yZWdpc3RlcigiaHR0cCIsIFBsYWluQ29ubmVjdGlvblNvY2tldEZhY3RvcnkuSU5TVEFOQ0UpLmJ1aWxkKCk7CgogICAgUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjbSA9IG5ldyBQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyKHIpOwoKICAgIC8vIENvbm5lY3Rpb25Db25maWcKICAgIENvbm5lY3Rpb25Db25maWcgY29ubmVjdGlvbkNvbmZpZyA9IENvbm5lY3Rpb25Db25maWcuY3VzdG9tKCkuc2V0Q2hhcnNldChDb25zdHMuVVRGXzgpLmJ1aWxkKCk7CiAgICBTb2NrZXRDb25maWcgc29ja2V0Q29uZmlnID0KICAgICAgICBTb2NrZXRDb25maWcuY3VzdG9tKCkuc2V0VGNwTm9EZWxheSh0cnVlKS5zZXRTb0tlZXBBbGl2ZSh0cnVlKS5zZXRTb1JldXNlQWRkcmVzcyh0cnVlKQogICAgICAgICAgICAuc2V0U29UaW1lb3V0KDEwMDApLmJ1aWxkKCk7CgogICAgY20uc2V0RGVmYXVsdENvbm5lY3Rpb25Db25maWcoY29ubmVjdGlvbkNvbmZpZyk7CiAgICBjbS5zZXREZWZhdWx0U29ja2V0Q29uZmlnKHNvY2tldENvbmZpZyk7CiAgICAvLyDlsIbmnIDlpKfov57mjqXmlbDlop7liqDliLAyMDAwCiAgICBjbS5zZXRNYXhUb3RhbChrTWF4VG90YWwpOwogICAgLy8g5bCG5q+P5Liq6Lev55Sx5Z+656GA55qE6L+e5o6l5aKe5Yqg5YiwMjAwMAogICAgY20uc2V0RGVmYXVsdE1heFBlclJvdXRlKGtNYXhQZXJSb3V0ZSk7CgogICAgcmV0dXJuIEh0dHBDbGllbnRzLmN1c3RvbSgpLnNldENvbm5lY3Rpb25NYW5hZ2VyKGNtKS5idWlsZCgpOwogIH0KCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHR0cFBvc3QoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBwb3N0TWFwLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGludCByZWFkVGltZW91dCwgaW50IGNvbm5lY3RUaW1lb3V0KSB7CiAgICBIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOwogICAgUmVxdWVzdENvbmZpZyByZXF1ZXN0Q29uZmlnID0KICAgICAgICBSZXF1ZXN0Q29uZmlnLmN1c3RvbSgpLnNldFNvY2tldFRpbWVvdXQocmVhZFRpbWVvdXQpLnNldENvbm5lY3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0KQogICAgICAgICAgICAuc2V0Q29ubmVjdGlvblJlcXVlc3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0KS5zZXRFeHBlY3RDb250aW51ZUVuYWJsZWQoZmFsc2UpLmJ1aWxkKCk7CiAgICBodHRwUG9zdC5zZXRDb25maWcocmVxdWVzdENvbmZpZyk7CiAgICBpZiAobnVsbCAhPSBwb3N0TWFwICYmIHBvc3RNYXAua2V5U2V0KCkuc2l6ZSgpID4gMCkgewogICAgICBMaXN0PE5hbWVWYWx1ZVBhaXI+IG52cHMgPSBuZXcgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+KCk7CiAgICAgIGZvciAoU3RyaW5nIGsgOiBwb3N0TWFwLmtleVNldCgpKSB7CiAgICAgICAgbnZwcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihrLCBwb3N0TWFwLmdldChrKSkpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgaHR0cFBvc3Quc2V0RW50aXR5KG5ldyBVcmxFbmNvZGVkRm9ybUVudGl0eShudnBzKSk7CiAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogICAgICAgIGxvZ2dlci5lcnJvcigidXJsIGVuY29kZSBlcnJvciwgcG9zdCB1cmwgIiArIHVybCArICIgZmFpbGVkIiwgZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChudWxsICE9IGhlYWRlcnMgJiYgaGVhZGVycy5rZXlTZXQoKS5zaXplKCkgPiAwKSB7CiAgICAgIExpc3Q8SGVhZGVyPiBodHRwSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICBmb3IgKFN0cmluZyBoZWFkZXJOYW1lIDogaGVhZGVycy5rZXlTZXQoKSkgewogICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKGhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpKSkgewogICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBCYXNpY0hlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJzLmdldChoZWFkZXJOYW1lKSk7CiAgICAgICAgICBodHRwSGVhZGVycy5hZGQoaGVhZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGh0dHBIZWFkZXJzLnNpemUoKSA+IDApIHsKICAgICAgICBodHRwUG9zdC5zZXRIZWFkZXJzKGh0dHBIZWFkZXJzLnRvQXJyYXkobmV3IEhlYWRlcltodHRwSGVhZGVycy5zaXplKCldKSk7CiAgICAgIH0KICAgIH0KICAgIENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXMgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKICAgICAgcmV0dXJuIEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlcy5nZXRFbnRpdHkoKSk7CiAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICBsb2dnZXIuZXJyb3IoInBvc3QgdXJsICIgKyB1cmwgKyAiIGZhaWxlZCwgIiwgZSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlcy5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgewogICAgICAgICAgbG9nZ2VyLndhcm4oIkh0dHAgcmVzcG9uc2UgY2xvc2UgZXhjZXB0aW9uIiwgaWdub3JlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3coKSB7CiAgICByZXR1cm4gIkEiOwogIH0KfQo=