LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludmVyc2lvbi5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAiY3J0ZGxsLmgiCgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCiNpbmNsdWRlICJ3aW5lL3VuZG9jc2hlbGwuaCIKI2luY2x1ZGUgInNocG9saWN5LmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoc2hlbGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZAkJCQkJW1NIRUxMMzIuNThdCiAqCiAqIGNvcHlzIGEgZmllbGQgZnJvbSBhICcsJyBkZWxpbWl0ZWQgc3RyaW5nCiAqIAogKiBmaXJzdCBmaWVsZCBpcyBuRmllbGQgPSAxCiAqLwpEV09SRCBXSU5BUEkgUGFyc2VGaWVsZEEoTFBDU1RSIHNyYywgRFdPUkQgbkZpZWxkLCBMUFNUUiBkc3QsIERXT1JEIGxlbikgCnsKCVdBUk4oIignJXMnLDB4JTA4bHgsJXAsJWxkKSBzZW1pLXN0dWIuXG4iLHNyYyxuRmllbGQsZHN0LGxlbik7CgoJaWYgKCFzcmMgfHwgIXNyY1swXSB8fCAhZHN0IHx8ICFsZW4pCgkgIHJldHVybiAwOwoKCS8qIHNraXAgbiBmaWVsZHMgZGVsaW1pdGVkIGJ5ICcsJyAqLwoJd2hpbGUgKG5GaWVsZCA+IDEpCgl7CgkgIGlmICgqc3JjPT0nXDAnKSByZXR1cm4gRkFMU0U7CgkgIGlmICgqKHNyYysrKT09JywnKSBuRmllbGQtLTsKCX0KCgkvKiBjb3B5IHBhcnQgdGlsbCB0aGUgbmV4dCAnLCcgdG8gZHN0ICovCgl3aGlsZSAoICpzcmMhPSdcMCcgJiYgKnNyYyE9JywnICYmIChsZW4tLSk+MCApICooZHN0KyspPSooc3JjKyspOwoJCgkvKiBmaW5hbGl6ZSB0aGUgc3RyaW5nICovCgkqZHN0PTB4MDsKCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpY2tJY29uRGxnCQkJCQlbU0hFTEwzMi42Ml0KICogCiAqLwpEV09SRCBXSU5BUEkgUGlja0ljb25EbGcoRFdPUkQgeCxEV09SRCB5LERXT1JEIHosRFdPUkQgYSkgCnsJRklYTUUoIiglMDhseCwlMDhseCwlMDhseCwlMDhseCk6c3R1Yi5cbiIseCx5LHosYSk7CglyZXR1cm4gMHhmZmZmZmZmZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RmlsZU5hbWVGcm9tQnJvd3NlCQkJW1NIRUxMMzIuNjNdCiAqIAogKi8KRFdPUkQgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZShIV05EIGhvd25lciwgTFBTVFIgdGFyZ2V0YnVmLCBEV09SRCBsZW4sIERXT1JEIHgsIExQQ1NUUiBzdWZmaXgsIExQQ1NUUiB5LCBMUENTVFIgY21kKSAKewlGSVhNRSgiKCUwNHgsJXAsJWxkLCUwOGx4LCVzLCVzLCVzKTpzdHViLlxuIiwKCSAgICBob3duZXIsdGFyZ2V0YnVmLGxlbix4LHN1ZmZpeCx5LGNtZCk7CiAgICAvKiBwdXRzIHVwIGEgT3BlbiBEaWFsb2cgYW5kIHJlcXVlc3RzIGlucHV0IGludG8gdGFyZ2V0YnVmICovCiAgICAvKiBPRk5fSElERVJFQURPTkxZfE9GTl9OT0NIQU5HRURJUnxPRk5fRklMRU1VU1RFWElTVHxPRk5fdW5rbm93biAqLwogICAgbHN0cmNweUEodGFyZ2V0YnVmLCJ4OlxcZHVtbXkuZXhlIik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncwkJCQlbU0hFTEwzMi42OF0KICogCiAqIE5PVEVTCiAqICB0aGUgcmVnaXN0cnkgcGF0aCBhcmUgZm9yIHdpbjk4ICh0ZXN0ZWQpCiAqICBhbmQgcG9zc2libHkgYXJlIHRoZSBzYW1lIGluIG50NDAKICovCnZvaWQgV0lOQVBJIFNIR2V0U2V0dGluZ3MoTFBTSEVMTEZMQUdTVEFURSBscHNmcywgRFdPUkQgZHdNYXNrLCBEV09SRCBkd3gpCnsKCUhLRVkJaEtleTsKCURXT1JECWR3RGF0YTsKCURXT1JECWR3RGF0YVNpemUgPSBzaXplb2YgKERXT1JEKTsKCglUUkFDRSgiKCVwIDB4JTA4bHggMHglMDhseClcbiIsbHBzZnMsZHdNYXNrLCBkd3gpOwoJCglpZiAoUmVnQ3JlYXRlS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyXFxBZHZhbmNlZCIsCgkJCQkgMCwgMCwgMCwgS0VZX0FMTF9BQ0NFU1MsIDAsICZoS2V5LCAwKSkKCSAgcmV0dXJuOwoJCglpZiAoIChTU0ZfU0hPV0VYVEVOU0lPTlMgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRlRmlsZUV4dCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dFeHRlbnNpb25zICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfU0hPV0lORk9USVAgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93SW5mb1RpcCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dJbmZvVGlwICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfRE9OVFBSRVRUWVBBVEggJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJEb250UHJldHR5UGF0aCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkRvbnRQcmV0dHlQYXRoICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfSElERUlDT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUljb25zIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mSGlkZUljb25zICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfTUFQTkVURFJWQlVUVE9OICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiTWFwTmV0RHJ2QnRuIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mTWFwTmV0RHJ2QnRuICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfU0hPV0FUVFJJQkNPTCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIlNob3dBdHRyaWJDb2wiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93QXR0cmliQ29sICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoKChTU0ZfU0hPV0FMTE9CSkVDVFMgfCBTU0ZfU0hPV1NZU0ZJTEVTKSAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGRlbiIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJeyBpZiAoZHdEYXRhID09IDApCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAwOwoJICB9CgkgIGVsc2UgaWYgKGR3RGF0YSA9PSAxKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMTsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMikKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDA7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDE7CgkgIH0KCX0KCVJlZ0Nsb3NlS2V5IChoS2V5KTsKCglUUkFDRSgiLS0gMHglMDR4XG4iLCAqKFdPUkQqKWxwc2ZzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZQkJCVtTSEVMTDMyLjczXQogKgogKiBQQVJBTUVURVJTCiAqICBod25kQ2FiaW5ldCBkZWZpbmVzIHRoZSBleHBsb3JlciBjYWJpbmV0IHdpbmRvdyB0aGF0IGNvbnRhaW5zIHRoZSAKICogICAgICAgICAgICAgIHNoZWxsdmlldyB5b3UgbmVlZCB0byBjb21tdW5pY2F0ZSB3aXRoCiAqICB1TXNnICAgICAgICBpZGVudGlmeWluZyB0aGUgU0ZWTSBlbnVtIHRvIHBlcmZvcm0KICogIGxQYXJhbQogKgogKiBOT1RFUwogKiAgTWVzc2FnZSBTRlZNX1JFQVJSQU5HRSA9IDEKICogICAgVGhpcyBtZXNzYWdlIGdldHMgc2VudCB3aGVuIGEgY29sdW1uIGdldHMgY2xpY2tlZCB0byBpbnN0cnVjdCB0aGUKICogICAgc2hlbGwgdmlldyB0byByZS1zb3J0IHRoZSBpdGVtIGxpc3QuIGxQYXJhbSBpZGVudGlmaWVzIHRoZSBjb2x1bW4KICogICAgdGhhdCB3YXMgY2xpY2tlZC4KICovCmludCBXSU5BUEkgU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZShIV05EIGh3bmRDYWJpbmV0LFVJTlQgdU1zZyxMUEFSQU0gbFBhcmFtKQp7IEZJWE1FKCIlMDR4ICUwOHV4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsdU1zZyxsUGFyYW0pOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPbGVTdHJUb1N0ck4JCQkJCVtTSEVMTDMyLjc4XQogKi8KQk9PTCBXSU5BUEkgT2xlU3RyVG9TdHJOQSAoTFBTVFIgbHBTdHIsIElOVCBuU3RyLCBMUENXU1RSIGxwT2xlLCBJTlQgbk9sZSkgCnsKCVRSQUNFKCIoJXAsICV4LCAlcywgJXgpXG4iLCBscFN0ciwgblN0ciwgZGVidWdzdHJfd24obHBPbGUsbk9sZSksIG5PbGUpOwoJcmV0dXJuIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKDAsIDAsIGxwT2xlLCBuT2xlLCBscFN0ciwgblN0ciwgTlVMTCwgTlVMTCk7Cn0KCkJPT0wgV0lOQVBJIE9sZVN0clRvU3RyTlcgKExQV1NUUiBscHdTdHIsIElOVCBud1N0ciwgTFBDV1NUUiBscE9sZSwgSU5UIG5PbGUpIAp7CglUUkFDRSgiKCVwLCAleCwgJXMsICV4KVxuIiwgbHB3U3RyLCBud1N0ciwgZGVidWdzdHJfd24obHBPbGUsbk9sZSksIG5PbGUpOwoKCWlmIChsc3RyY3B5blcgKCBscHdTdHIsIGxwT2xlLCBud1N0cikpCgl7IHJldHVybiBsc3RybGVuVyAobHB3U3RyKTsKCX0KCXJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBPbGVTdHJUb1N0ck5BVyAoTFBWT0lEIGxwT3V0LCBJTlQgbk91dCwgTFBDVk9JRCBscEluLCBJTlQgbkluKSAKewoJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIE9sZVN0clRvU3RyTlcgKGxwT3V0LCBuT3V0LCBscEluLCBuSW4pOwoJcmV0dXJuIE9sZVN0clRvU3RyTkEgKGxwT3V0LCBuT3V0LCBscEluLCBuSW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJUb09sZVN0ck4JCQkJCVtTSEVMTDMyLjc5XQogKiAgbHBNdWx0aSwgbk11bHRpLCBuV2lkZSBbSU5dCiAqICBscFdpZGUgW09VVF0KICovCkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyTkEgKExQV1NUUiBscFdpZGUsIElOVCBuV2lkZSwgTFBDU1RSIGxwU3RyQSwgSU5UIG5TdHIpIAp7CglUUkFDRSgiKCVwLCAleCwgJXMsICV4KVxuIiwgbHBXaWRlLCBuV2lkZSwgZGVidWdzdHJfYW4obHBTdHJBLG5TdHIpLCBuU3RyKTsKCXJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyICgwLCAwLCBscFN0ckEsIG5TdHIsIGxwV2lkZSwgbldpZGUpOwp9CkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyTlcgKExQV1NUUiBscFdpZGUsIElOVCBuV2lkZSwgTFBDV1NUUiBscFN0clcsIElOVCBuU3RyKSAKewoJVFJBQ0UoIiglcCwgJXgsICVzLCAleClcbiIsIGxwV2lkZSwgbldpZGUsIGRlYnVnc3RyX3duKGxwU3RyVywgblN0ciksIG5TdHIpOwoKCWlmIChsc3RyY3B5blcgKGxwV2lkZSwgbHBTdHJXLCBuV2lkZSkpCgl7IHJldHVybiBsc3RybGVuVyAobHBXaWRlKTsKCX0KCXJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5BVyAoTFBXU1RSIGxwV2lkZSwgSU5UIG5XaWRlLCBMUENWT0lEIGxwU3RyLCBJTlQgblN0cikgCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTdHJUb09sZVN0ck5XIChscFdpZGUsIG5XaWRlLCBscFN0ciwgblN0cik7CglyZXR1cm4gU3RyVG9PbGVTdHJOQSAobHBXaWRlLCBuV2lkZSwgbHBTdHIsIG5TdHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWdpc3RlclNoZWxsSG9vawkJCQlbU0hFTEwzMi4xODFdCiAqCiAqIFBBUkFNUwogKiAgICAgIGh3bmQgW0ldICB3aW5kb3cgaGFuZGxlCiAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PwogKiAKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCnZvaWQgV0lOQVBJIFJlZ2lzdGVyU2hlbGxIb29rKEhXTkQgaHduZCwgRFdPUkQgeSkgewogICAgRklYTUUoIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hXCQkJCVtTSEVMTDMyLjE4Ml0KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBpZFRleHQJcmVzb3VyY2UgSUQgb2YgdGl0bGUgb3IgTFBTVFIKICogaWRUaXRsZQlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSU5UIF9fY2RlY2wKU2hlbGxNZXNzYWdlQm94VyhITU9EVUxFIGhtb2QsSFdORCBod25kLERXT1JEIGlkVGV4dCxEV09SRCBpZFRpdGxlLERXT1JEIHVUeXBlLExQQ1ZPSUQgYXJnbGlzdCkgCnsJV0NIQVIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBXU1RSICAgcHN6VGV4dCA9ICZzelRleHRbMF0sIHBzelRpdGxlID0gJnN6VGl0bGVbMF07CglMUFZPSUQJYXJncyA9ICZhcmdsaXN0OwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJXApXG4iLChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQV1NUUilpZFRpdGxlOwoKCWlmICghIEhJV09SRCAoaWRUZXh0KSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRleHQscHN6VGV4dCwxMDApOwoJZWxzZQoJICBwc3pUZXh0ID0gKExQV1NUUilpZFRleHQ7CgoJRm9ybWF0TWVzc2FnZVcoRk9STUFUX01FU1NBR0VfRlJPTV9TVFJJTkcgfCBGT1JNQVRfTUVTU0FHRV9BUkdVTUVOVF9BUlJBWSAsc3pUZXh0LDAsMCxzelRlbXAsMjU2LGFyZ3MpOwoJcmV0dXJuIE1lc3NhZ2VCb3hXKGh3bmQsc3pUZW1wLHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCklOVCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRSBobW9kLEhXTkQgaHduZCxEV09SRCBpZFRleHQsRFdPUkQgaWRUaXRsZSxEV09SRCB1VHlwZSxMUENWT0lEIGFyZ2xpc3QpIAp7CWNoYXIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBTVFIgICBwc3pUZXh0ID0gJnN6VGV4dFswXSwgcHN6VGl0bGUgPSAmc3pUaXRsZVswXTsKCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7CgoJVFJBQ0UoIiglMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlcClcbiIsIChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ0EoaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQU1RSKWlkVGl0bGU7CgoJaWYgKCEgSElXT1JEIChpZFRleHQpKQoJICBMb2FkU3RyaW5nQShobW9kLGlkVGV4dCxwc3pUZXh0LDEwMCk7CgllbHNlCgkgIHBzelRleHQgPSAoTFBTVFIpaWRUZXh0OwoKCUZvcm1hdE1lc3NhZ2VBKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkgLHBzelRleHQsMCwwLHN6VGVtcCwyNTYsYXJncyk7CglyZXR1cm4gTWVzc2FnZUJveEEoaHduZCxzelRlbXAscHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlc3RyaWN0ZWQJCQkJW1NIRUxMMzIuMTAwXQogKgogKiB3YWxrcyB0aHJvdWdoIHBvbGljeSB0YWJsZSwgcXVlcmllcyA8YXBwPiBrZXksIDx0eXBlPiB2YWx1ZSwgcmV0dXJucyAKICogcXVlcmllZCAoRFdPUkQpIHZhbHVlLCBhbmQgY2FjaGVzIGl0IGJldHdlZW4gY2FsbGVkIHRvIFNISW5pdFJlc3RyaWN0ZWQKICogdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWdpc3RyeSBhY2Nlc3MuCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqCiAqIFJFRkVSRU5DRVM6IAogKiAgICAgTVMgU3lzdGVtIFBvbGljeSBFZGl0b3IKICogICAgIDk4TGl0ZSAyLjAgKHdoaWNoIHVzZXMgbWFueSBvZiB0aGVzZSBwb2xpY3kga2V5cykgaHR0cDovL3d3dy45OGxpdGUubmV0LwogKiAgICAgIlRoZSBXaW5kb3dzIDk1IFJlZ2lzdHJ5IiwgYnkgSm9obiBXb3JhbSwgMTk5NiBNSVM6IFByZXNzCiAqLwpEV09SRCBXSU5BUEkgU0hSZXN0cmljdGVkIChEV09SRCBwb2wpIHsKICAgICAgICBjaGFyIHJlZ3N0clsyNTZdOwoJSEtFWQl4aGtleTsKCURXT1JEICAgcmV0dmFsLCBwb2xpZHgsIGksIGRhdHNpemUgPSA0OwoKCVRSQUNFKCIoJTA4bHgpXG4iLHBvbCk7CgoJcG9saWR4ID0gLTE7CgoJLyogc2NhbiB0byBzZWUgaWYgd2Uga25vdyB0aGlzIHBvbGljeSBJRCAqLwoJZm9yIChpID0gMDsgaSA8IFNIRUxMX01BWF9QT0xJQ0lFUzsgaSsrKQoJewoJICAgICBpZiAocG9sID09IHNoMzJfcG9saWN5X3RhYmxlW2ldLnBvbGZsYWdzKQoJICAgICB7CgkgICAgICAgICBwb2xpZHggPSBpOwoJCSBicmVhazsKCSAgICAgfQoJfQoKCWlmIChwb2xpZHggPT0gLTEpCgl7CgkgICAgLyogd2UgZG9uJ3Qga25vdyB0aGlzIHBvbGljeSwgcmV0dXJuIDAgKi8KCSAgICBUUkFDRSgidW5rbm93biBwb2xpY3k6ICglMDhseClcbiIsIHBvbCk7CgkJcmV0dXJuIDA7Cgl9CgoJLyogd2UgaGF2ZSBhIGtub3duIHBvbGljeSAqLwogICAgICAJbHN0cmNweUEocmVnc3RyLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFBvbGljaWVzXFwiKTsKCWxzdHJjYXRBKHJlZ3N0ciwgc2gzMl9wb2xpY3lfdGFibGVbcG9saWR4XS5hcHBzdHIpOwoKCS8qIGZpcnN0IGNoZWNrIGlmIHRoaXMgcG9saWN5IGhhcyBiZWVuIGNhY2hlZCwgcmV0dXJuIGl0IGlmIHNvICovCglpZiAoc2gzMl9wb2xpY3lfdGFibGVbcG9saWR4XS5jYWNoZSAhPSBTSEVMTF9OT19QT0xJQ1kpCgl7CgkgICAgcmV0dXJuIHNoMzJfcG9saWN5X3RhYmxlW3BvbGlkeF0uY2FjaGU7Cgl9CgoJLyogcmV0dXJuIDAgYW5kIGRvbid0IHNldCB0aGUgY2FjaGUgaWYgYW55IHJlZ2lzdHJ5IGVycm9ycyBvY2N1ciAqLwoJcmV0dmFsID0gMDsKCWlmIChSZWdPcGVuS2V5QShIS0VZX0NVUlJFTlRfVVNFUiwgcmVnc3RyLCAmeGhrZXkpID09IEVSUk9SX1NVQ0NFU1MpCgl7CgkgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEoeGhrZXksIHNoMzJfcG9saWN5X3RhYmxlW3BvbGlkeF0ua2V5c3RyLCBOVUxMLCBOVUxMLCAoTFBCWVRFKSZyZXR2YWwsICZkYXRzaXplKSA9PSBFUlJPUl9TVUNDRVNTKQoJICAgIHsKCSAgICAgICAgc2gzMl9wb2xpY3lfdGFibGVbcG9saWR4XS5jYWNoZSA9IHJldHZhbDsKCSAgICB9CgoJUmVnQ2xvc2VLZXkoeGhrZXkpOwp9CgoJcmV0dXJuIHJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSEluaXRSZXN0cmljdGVkICAgICAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjI0NF0KICoKICogV2luOTgrIGJ5LW9yZGluYWwgb25seSByb3V0aW5lIGNhbGxlZCBieSBFeHBsb3JlciBhbmQgTVNJRSA0IGFuZCA1LgogKiBJbml0cyB0aGUgcG9saWN5IGNhY2hlIHVzZWQgYnkgU0hSZXN0cmljdGVkIHRvIGF2b2lkIGV4Y2VzcwogKiByZWdpc3RyeSBhY2Nlc3MuCiAqCiAqIElOUFVUUwogKiBUd28gaW5wdXRzOiBvbmUgaXMgYSBzdHJpbmcgb3IgTlVMTC4gIElmIG5vbi1OVUxMIHRoZSBwb2ludGVyCiAqIHNob3VsZCBwb2ludCB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhhY3QgdGV4dDoKICogIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFBvbGljaWVzIi4KICogVGhlIG90aGVyIGlucHV0IGlzIHVudXNlZC4KICoKICogTk9URVMKICogSWYgdGhlIGlucHV0IGlzIG5vbi1OVUxMIGFuZCBkb2VzIG5vdCBwb2ludCB0byBhIHN0cmluZyBjb250YWluaW5nCiAqIHRoYXQgZXhhY3QgdGV4dCB0aGUgcm91dGluZSB3aWxsIGRvIG5vdGhpbmcuCiAqCiAqIElmIHRoZSB0ZXh0IGRvZXMgbWF0Y2ggb3IgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiB0aGUgcm91dGluZQogKiB3aWxsIGluaXQgU0hSZXN0cmljdGVkKCkncyBwb2xpY3kgY2FjaGUgdG8gYWxsIDB4ZmZmZmZmZmYgYW5kCiAqIHJldHVybnMgMHhmZmZmZmZmZiBhcyB3ZWxsLgogKgogKiBJIGhhdmVuJ3QgeWV0IHJ1biBpbnRvIGFueXRoaW5nIGNhbGxpbmcgdGhpcyB3aXRoIGlucHV0cyBvdGhlciB0aGFuCiAqIChOVUxMLCBOVUxMKSwgc28gSSBtYXkgaGF2ZSB0aGUgaW5wdXRzIHJldmVyc2VkLgogKi8KCkJPT0wgV0lOQVBJIFNISW5pdFJlc3RyaWN0ZWQoTFBTVFIgaW5wUmVnS2V5LCBMUFNUUiBwYXJtMikKewogICAgIGludCBpOwoKICAgICBUUkFDRSgiKCVwLCAlcClcbiIsIGlucFJlZ0tleSwgcGFybTIpOwoKICAgICAvKiBmaXJzdCBjaGVjayAtIGlmIGlucHV0IGlzIG5vbi1OVUxMIGFuZCBwb2ludHMgdG8gdGhlIHNlY3JldAogICAgICAgIGtleSBzdHJpbmcsIHRoZW4gcGFzcy4gIE90aGVyd2lzZSByZXR1cm4gMC4KICAgICAqLwoKICAgICBpZiAoaW5wUmVnS2V5ICE9IChMUFNUUilOVUxMKQogICAgIHsKICAgICAgICAgaWYgKGxzdHJjbXBpQShpbnBSZWdLZXksICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXMiKSkKCSB7CgkgICAgIC8qIGRvZXNuJ3QgbWF0Y2gsIGZhaWwgKi8KCSAgICAgcmV0dXJuIDA7CgkgfQogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgIC8qIGNoZWNrIHBhc3NlZCwgaW5pdCBhbGwgcG9saWN5IGNhY2hlIGVudHJpZXMgd2l0aCBTSEVMTF9OT19QT0xJQ1kgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgU0hFTExfTUFYX1BPTElDSUVTOyBpKyspCiAgICAgewogICAgICAgICAgc2gzMl9wb2xpY3lfdGFibGVbaV0uY2FjaGUgPSBTSEVMTF9OT19QT0xJQ1k7CiAgICAgfQoKICAgICByZXR1cm4gU0hFTExfTk9fUE9MSUNZOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWUJCQkJCVtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KI2RlZmluZSBNRU1fREVCVUcgMQpEV09SRCBXSU5BUEkgU0hGcmVlKExQVk9JRCB4KSAKewojaWYgTUVNX0RFQlVHCglXT1JEIGxlbiA9ICooTFBXT1JEKSgoTFBCWVRFKXgtMik7CgoJaWYgKCAqKExQV09SRCkoKExQQllURSl4K2xlbikgIT0gMHg3Mzg0KQoJICBFUlIoIk1BR0lDMiFcbiIpOwoKCWlmICggKCooTFBXT1JEKSgoTFBCWVRFKXgtNCkpICE9IDB4ODI3MSkKCSAgRVJSKCJNQUdJQzEhXG4iKTsKCWVsc2UKCSAgbWVtc2V0KChMUEJZVEUpeC00LCAweGRlLCBsZW4rNik7CgoJVFJBQ0UoIiVwIGxlbj0ldVxuIix4LCBsZW4pOwoKCXggPSAoTFBCWVRFKSB4IC0gNDsKI2Vsc2UKCVRSQUNFKCIlcFxuIix4KTsKI2VuZGlmCglyZXR1cm4gSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2MJCQkJCVtTSEVMTDMyLjE5Nl0KICoKICogTk9URVMKICogICAgIHZvaWQgKnRhc2tfYWxsb2MoRFdPUkQgbGVuKSwgdXNlcyBTSE1hbGxvYyBhbGxvY2F0b3IKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pIAp7CglMUEJZVEUgcmV0OwoKI2lmIE1FTV9ERUJVRwoJcmV0ID0gKExQVk9JRCkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4rNik7CiNlbHNlCglyZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CiNlbmRpZgoKI2lmIE1FTV9ERUJVRwoJKihMUFdPUkQpKHJldCkgPSAweDgyNzE7CgkqKExQV09SRCkocmV0KzIpID0gKFdPUkQpbGVuOwoJKihMUFdPUkQpKHJldCs0K2xlbikgPSAweDczODQ7CglyZXQgKz0gNDsKCW1lbXNldChyZXQsIDB4ZGYsIGxlbik7CiNlbmRpZgoJVFJBQ0UoIiVsdSBieXRlcyBhdCAlcFxuIixsZW4sIHJldCk7CglyZXR1cm4gKExQVk9JRClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnaXN0ZXJEcmFnRHJvcAkJCQlbU0hFTEwzMi44Nl0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlZ2lzdGVyRHJhZ0Ryb3AoSFdORCBoV25kLElEcm9wVGFyZ2V0ICogcERyb3BUYXJnZXQpIAp7CglGSVhNRSgiKDB4JTA4eCwlcCk6c3R1Yi5cbiIsIGhXbmQsIHBEcm9wVGFyZ2V0KTsKCXJldHVybiAgICAgUmVnaXN0ZXJEcmFnRHJvcChoV25kLCBwRHJvcFRhcmdldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmV2b2tlRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZXZva2VEcmFnRHJvcChEV09SRCB4KSB7CiAgICBGSVhNRSgiKDB4JTA4bHgpOnN0dWIuXG4iLHgpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRG9EcmFnRHJvcAkJCQkJW1NIRUxMMzIuODhdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hEb0RyYWdEcm9wKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopIHsKICAgIEZJWE1FKCIoMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHgpOnN0dWIuXG4iLHUsdix3LHgseSx6KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5GaWxlRGxnCQkJCQlbU0hFTEwzMi42MV0KICoKICogTk9URVMKICogICAgIE9yaWdpbmFsIG5hbWU6IFJ1bkZpbGVEbGcgKGV4cG9ydGVkIGJ5IG9yZGluYWwpCiAqLwpEV09SRCBXSU5BUEkKUnVuRmlsZURsZyAoSFdORCBod25kT3duZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwKCSAgICBMUFNUUiBscHN6VGl0bGUsIExQU1RSIGxwc3pQcm9tcHQsIFVJTlQgdUZsYWdzKQp7CiAgICBGSVhNRSgiKDB4JTA4eCAweCVseCAweCVseCBcIiVzXCIgXCIlc1wiIDB4JXgpOnN0dWIuXG4iLAoJICAgaHduZE93bmVyLCBkd1BhcmFtMSwgZHdQYXJhbTIsIGxwc3pUaXRsZSwgbHBzelByb21wdCwgdUZsYWdzKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFeGl0V2luZG93c0RpYWxvZwkJCQlbU0hFTEwzMi42MF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCnZvaWQgV0lOQVBJIEV4aXRXaW5kb3dzRGlhbG9nIChIV05EIGhXbmRPd25lcikKewoJVFJBQ0UoIigweCUwOHgpXG4iLCBoV25kT3duZXIpOwoJaWYgKE1lc3NhZ2VCb3hBKCBoV25kT3duZXIsICJEbyB5b3Ugd2FudCB0byBleGl0IFdJTkU/IiwgIlNodXRkb3duIiwgTUJfWUVTTk98TUJfSUNPTlFVRVNUSU9OKSA9PSBJRE9LKQoJeyBTZW5kTWVzc2FnZUEgKCBoV25kT3duZXIsIFdNX1FVSVQsIDAsIDApOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cwkJCQlbU0hFTEwzMi4xODRdCiAqIAogKi8KRFdPUkQgV0lOQVBJCkFycmFuZ2VXaW5kb3dzIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIERXT1JEIGR3UGFyYW0zLAoJCURXT1JEIGR3UGFyYW00LCBEV09SRCBkd1BhcmFtNSkKewogICAgRklYTUUoIigweCVseCAweCVseCAweCVseCAweCVseCAweCVseCk6c3R1Yi5cbiIsCgkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIGR3UGFyYW0zLCBkd1BhcmFtNCwgZHdQYXJhbTUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNpZ25hbEZpbGVPcGVuCQkJCVtTSEVMTDMyLjEwM10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpTaWduYWxGaWxlT3BlbiAoRFdPUkQgZHdQYXJhbTEpCnsKICAgIEZJWE1FKCIoMHglMDhseCk6c3R1Yi5cbiIsIGR3UGFyYW0xKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBZGRUb1JlY2VudERvY3MJCQkJW1NIRUxMMzIuMjM0XQogKgogKiBQQVJBTUVURVJTCiAqICAgdUZsYWdzICBbSU5dIFNIQVJEX1BBVEggb3IgU0hBUkRfUElETAogKiAgIHB2ICAgICAgW0lOXSBzdHJpbmcgb3IgcGlkbCwgTlVMTCBjbGVhcnMgdGhlIGxpc3QKICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEFkZFRvUmVjZW50RG9jcyAoVUlOVCB1RmxhZ3MsTFBDVk9JRCBwdikgICAKeyBpZiAoU0hBUkRfUElETD09dUZsYWdzKQogIHsgRklYTUUoIigweCUwOHgscGlkbD0lcCk6c3R1Yi5cbiIsIHVGbGFncyxwdik7Cgl9CgllbHNlCgl7IEZJWE1FKCIoMHglMDh4LCVzKTpzdHViLlxuIiwgdUZsYWdzLChjaGFyKilwdik7Cgl9CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeAkJCVtTSEVMTDMyLjE3NF0KICoKICogTk9URVMKICogIHNlZSBJU2hlbGxGb2xkZXI6OkNyZWF0ZVZpZXdPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgoCiAgTFBTSEVMTFZJRVdEQVRBIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCiAgTFBWT0lEKiBwcHYpICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7CglJU2hlbGxWaWV3ICogcHNmOwoJSFJFU1VMVCBoUmVzOwoJCglUUkFDRSgic2Y9JXAgcGlkbD0lcCBjYj0lcCBtb2RlPTB4JTA4bHggcGFybT0weCUwOGx4XG4iLCAKCSAgcHN2Y2JpLT5wU2hlbGxGb2xkZXIsIHBzdmNiaS0+cGlkbCwgcHN2Y2JpLT5wQ2FsbEJhY2ssIHBzdmNiaS0+dmlld21vZGUsIHBzdmNiaS0+ZHdVc2VyUGFyYW0pOwoKCXBzZiA9IElTaGVsbFZpZXdfQ29uc3RydWN0b3IocHN2Y2JpLT5wU2hlbGxGb2xkZXIpOwoJCglpZiAoIXBzZikKCSAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgoJSVNoZWxsVmlld19BZGRSZWYocHNmKTsKCWhSZXMgPSBJU2hlbGxWaWV3X1F1ZXJ5SW50ZXJmYWNlKHBzZiwgJklJRF9JU2hlbGxWaWV3LCAoTFBWT0lEICopcHB2KTsKCUlTaGVsbFZpZXdfUmVsZWFzZShwc2YpOwoKCXJldHVybiBoUmVzOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFdpbkhlbHAJCQkJCVtTSEVMTDMyLjEyN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIV2luSGVscCAoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHYsdyx4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIUnVuQ29udHJvbFBhbmVsIFtTSEVMTDMyLjE2MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUnVuQ29udHJvbFBhbmVsIChEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXgJCQkJW1NIRUxMMzIuMjkxXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBVyAoTFBWT0lEIHNlaSkKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU2hlbGxFeGVjdXRlRXhXIChzZWkpOwoJcmV0dXJuIFNoZWxsRXhlY3V0ZUV4QSAoc2VpKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeEEJCQkJW1NIRUxMMzIuMjkyXQogKgogKiBwbGFjZWhvbGRlciBpbiB0aGUgY29tbWFuZGxpbmU6CiAqCSUxIGZpbGUKICoJJTIgcHJpbnRlcgogKgklMyBkcml2ZXIKICoJJTQgcG9ydAogKgklSSBhZHJlc3Mgb2YgYSBnbG9iYWwgaXRlbSBJRCAoZXhwbG9yZXIgc3dpdGNoIC9pZGxpc3QpCiAqCSVMID8/PyBwYXRoL3VybC9jdXJyZW50IGZpbGUgPz8/CiAqCSVTID8/PwogKgklKiBhbGwgZm9sbG93aW5nIHBhcmFtZXRlcnMgKHNlZSBiYXRmaWxlKQogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBIChMUFNIRUxMRVhFQ1VURUlORk9BIHNlaSkKeyAJQ0hBUiBzekFwcGxpY2F0aW9uTmFtZVtNQVhfUEFUSF0sc3pDb21tYW5kbGluZVtNQVhfUEFUSF0sc3pQaWRsWzIwXTsKCUxQU1RSIHBvczsKCWludCBnYXAsIGxlbjsKCVNUQVJUVVBJTkZPQSAgc3RhcnR1cDsKCVBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKCQkJCglXQVJOKCJtYXNrPTB4JTA4bHggaHduZD0weCUwNHggdmVyYj0lcyBmaWxlPSVzIHBhcm09JXMgZGlyPSVzIHNob3c9MHglMDh4IGNsYXNzPSVzIGluY29tcGxldGVcbiIsCgkJc2VpLT5mTWFzaywgc2VpLT5od25kLCBzZWktPmxwVmVyYiwgc2VpLT5scEZpbGUsCgkJc2VpLT5scFBhcmFtZXRlcnMsIHNlaS0+bHBEaXJlY3RvcnksIHNlaS0+blNob3csIAoJCShzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKSA/IHNlaS0+bHBDbGFzcyA6ICJub3QgdXNlZCIpOwoKCVplcm9NZW1vcnkoc3pBcHBsaWNhdGlvbk5hbWUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBGaWxlKQoJICBzdHJjcHkoc3pBcHBsaWNhdGlvbk5hbWUsIHNlaS0+bHBGaWxlKTsKCQoJWmVyb01lbW9yeShzekNvbW1hbmRsaW5lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc3RyY3B5KHN6Q29tbWFuZGxpbmUsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCQkJCglpZiAoc2VpLT5mTWFzayAmIChTRUVfTUFTS19DTEFTU0tFWSB8IFNFRV9NQVNLX0lOVk9LRUlETElTVCB8IFNFRV9NQVNLX0lDT04gfCBTRUVfTUFTS19IT1RLRVkgfAoJCQkgIFNFRV9NQVNLX0NPTk5FQ1RORVREUlYgfCBTRUVfTUFTS19GTEFHX0RERVdBSVQgfAoJCQkgIFNFRV9NQVNLX0RPRU5WU1VCU1QgfCBTRUVfTUFTS19GTEFHX05PX1VJIHwgU0VFX01BU0tfVU5JQ09ERSB8IAoJCQkgIFNFRV9NQVNLX05PX0NPTlNPTEUgfCBTRUVfTUFTS19BU1lOQ09LIHwgU0VFX01BU0tfSE1PTklUT1IgKSkKCXsKCSAgRklYTUUoImZsYWdzIGlnbm9yZWQ6IDB4JTA4bHhcbiIsIHNlaS0+Zk1hc2spOwoJfQoJCgkvKiBsYXVuY2ggYSBkb2N1bWVudCBieSBmaWxlY2xhc3MgbGlrZSAnV29yZHBhZC5Eb2N1bWVudC4xJyAqLwoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7CgkgIC8qIHRoZSBjb21tYW5kbGluZSBjb250YWlucyAnYzpcUGF0aFx3b3JkcGFkLmV4ZSAiJTEiJyAqLwoJICBIQ1JfR2V0RXhlY3V0ZUNvbW1hbmQoc2VpLT5scENsYXNzLCAoc2VpLT5scFZlcmIpID8gc2VpLT5scFZlcmIgOiAib3BlbiIsIHN6Q29tbWFuZGxpbmUsIDI1Nik7CgkgIC8qIGZpeG1lOiBnZXQgdGhlIGV4dGVuc2lvbiBvZiBscEZpbGUsIGNoZWNrIGlmIGl0IGZpdHMgdG8gdGhlIGxwQ2xhc3MgKi8KCSAgVFJBQ0UoIlNFRV9NQVNLX0NMQVNTTkFNRS0+JyVzJ1xuIiwgc3pDb21tYW5kbGluZSk7Cgl9CgoJLyogcHJvY2VzcyB0aGUgSURMaXN0ICovCglpZiAoIChzZWktPmZNYXNrICYgU0VFX01BU0tfSU5WT0tFSURMSVNUKSA9PSBTRUVfTUFTS19JTlZPS0VJRExJU1QpIC8qMHgwYyovCgl7CgkgIFNIR2V0UGF0aEZyb21JRExpc3RBIChzZWktPmxwSURMaXN0LHN6QXBwbGljYXRpb25OYW1lKTsKCSAgVFJBQ0UoIi0tIGlkbGlzdD0lcCAoJXMpXG4iLCBzZWktPmxwSURMaXN0LCBzekFwcGxpY2F0aW9uTmFtZSk7Cgl9CgllbHNlCgl7CgkgIGlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUICkKCSAgewoJICAgIHBvcyA9IHN0cnN0cihzekNvbW1hbmRsaW5lLCAiJUkiKTsKCSAgICBpZiAocG9zKQoJICAgIHsKCSAgICAgIEhHTE9CQUwgaG1lbSA9IFNIQWxsb2NTaGFyZWQgKCBzZWktPmxwSURMaXN0LCBJTEdldFNpemUoc2VpLT5scElETGlzdCksIDApOwoJICAgICAgc3ByaW50ZihzelBpZGwsIjolbGkiLChEV09SRClTSExvY2tTaGFyZWQoaG1lbSwwKSApOwoJICAgICAgU0hVbmxvY2tTaGFyZWQoaG1lbSk7CgkgICAgCgkgICAgICBnYXAgPSBzdHJsZW4oc3pQaWRsKTsKCSAgICAgIGxlbiA9IHN0cmxlbihwb3MpLTI7CgkgICAgICBtZW1tb3ZlKHBvcytnYXAscG9zKzIsbGVuKTsKCSAgICAgIG1lbWNweShwb3Msc3pQaWRsLGdhcCk7CgoJICAgIH0KCSAgfQoJfQoKCVRSQUNFKCJleGVjdXRlOiclcycsJyVzJ1xuIixzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJc3RyY2F0KHN6QXBwbGljYXRpb25OYW1lLCAiICIpOwoJc3RyY2F0KHN6QXBwbGljYXRpb25OYW1lLCBzekNvbW1hbmRsaW5lKTsKCglaZXJvTWVtb3J5KCZzdGFydHVwLHNpemVvZihTVEFSVFVQSU5GT0EpKTsKCXN0YXJ0dXAuY2IgPSBzaXplb2YoU1RBUlRVUElORk9BKTsKCglpZiAoISBDcmVhdGVQcm9jZXNzQShOVUxMLCBzekFwcGxpY2F0aW9uTmFtZSwKCQkJIE5VTEwsIE5VTEwsIEZBTFNFLCAwLCAKCQkJIE5VTEwsIE5VTEwsICZzdGFydHVwLCAmaW5mbykpCgl7CgkgIHNlaS0+aEluc3RBcHAgPSBHZXRMYXN0RXJyb3IoKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKICAgICAgICBzZWktPmhJbnN0QXBwID0gMzM7CgkKICAgIAkvKiBHaXZlIDMwIHNlY29uZHMgdG8gdGhlIGFwcCB0byBjb21lIHVwICovCglpZiAoIFdhaXRGb3JJbnB1dElkbGUgKCBpbmZvLmhQcm9jZXNzLCAzMDAwMCApID09ICAweEZGRkZGRkZGICkKCSAgRVJSKCJXYWl0Rm9ySW5wdXRJZGxlIGZhaWxlZDogRXJyb3IgJWxkXG4iLCBHZXRMYXN0RXJyb3IoKSApOwogCglpZihzZWktPmZNYXNrICYgU0VFX01BU0tfTk9DTE9TRVBST0NFU1MpCgkgIHNlaS0+aFByb2Nlc3MgPSBpbmZvLmhQcm9jZXNzOwkgIAogICAgICAgIGVsc2UKICAgICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhQcm9jZXNzICk7CiAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFRocmVhZCApOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXhXCQkJCVtTSEVMTDMyLjI5M10KICoKICovCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4VyAoTFBTSEVMTEVYRUNVVEVJTkZPVyBzZWkpCnsJU0hFTExFWEVDVVRFSU5GT0Egc2VpQTsKCURXT1JEIHJldDsKCglUUkFDRSgiJXBcbiIsIHNlaSk7CgoJbWVtY3B5KCZzZWlBLCBzZWksIHNpemVvZihTSEVMTEVYRUNVVEVJTkZPQSkpOwoJCiAgICAgICAgaWYgKHNlaS0+bHBWZXJiKQoJICBzZWlBLmxwVmVyYiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scFZlcmIpOwoKICAgICAgICBpZiAoc2VpLT5scEZpbGUpCgkgIHNlaUEubHBGaWxlID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwRmlsZSk7CgogICAgICAgIGlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc2VpQS5scFBhcmFtZXRlcnMgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCglpZiAoc2VpLT5scERpcmVjdG9yeSkKCSAgc2VpQS5scERpcmVjdG9yeSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scERpcmVjdG9yeSk7CgogICAgICAgIGlmICgoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkgJiYgc2VpLT5scENsYXNzKQoJICBzZWlBLmxwQ2xhc3MgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBDbGFzcyk7CgllbHNlCgkgIHNlaUEubHBDbGFzcyA9IE5VTEw7CgkgIAkgIAoJcmV0ID0gU2hlbGxFeGVjdXRlRXhBKCZzZWlBKTsKCiAgICAgICAgaWYgKHNlaUEubHBWZXJiKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwVmVyYiApOwoJaWYgKHNlaUEubHBGaWxlKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRmlsZSApOwoJaWYgKHNlaUEubHBQYXJhbWV0ZXJzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwUGFyYW1ldGVycyApOwoJaWYgKHNlaUEubHBEaXJlY3RvcnkpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBEaXJlY3RvcnkgKTsKCWlmIChzZWlBLmxwQ2xhc3MpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBDbGFzcyApOwoKIAlyZXR1cm4gcmV0Owp9CgpzdGF0aWMgTFBVTktOT1dOIFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlPTA7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjE3Nl0KICoKICogTk9URVMKICogIFNldHMgdGhlIGludGVyZmFjZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gbHBVbmtub3duKQp7CVRSQUNFKCIlcFxuIiwgbHBVbmtub3duKTsKCVNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlID0gbHBVbmtub3duOwoJcmV0dXJuIChIUkVTVUxUKSBscFVua25vd247Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRJbnN0YW5jZUV4cGxvcmVyCQkJW1NIRUxMMzIuMjU2XQogKgogKiBOT1RFUwogKiAgZ2V0cyB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgb2YgdGhlIGV4cGxvcmVyIGFuZCBhIHJlZmVyZW5jZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gKiBscFVua25vd24pCnsJVFJBQ0UoIiVwXG4iLCBscFVua25vd24pOwoKCSpscFVua25vd24gPSBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZTsKCglpZiAoIVNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlKQoJICByZXR1cm4gRV9GQUlMOwoKCUlVbmtub3duX0FkZFJlZihTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSk7CglyZXR1cm4gTk9FUlJPUjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMJCQlbU0hFTEwzMi4xMjNdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1NldERyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzZdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2V0RHJhZ0ltYWdlIChEV09SRCB1LCBEV09SRCB2KQp7IEZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LCB2KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2hvd0RyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzddCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2hvd0RyYWdJbWFnZSAoRFdPUkQgdSkKeyBGSVhNRSgiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnQ2xvc2VLZXkJCQlbTlQ0LjA6U0hFTEwzMi41MDVdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ0Nsb3NlS2V5IChIS0VZIGhrZXkpCnsJVFJBQ0UoIjB4JTA0eFxuIixoa2V5KTsKCXJldHVybiBSZWdDbG9zZUtleSggaGtleSApOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleUEJCQkJW1NIRUxMMzIuNTA2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdPcGVuS2V5QShIS0VZIGhLZXksIExQU1RSIGxwU3ViS2V5LCBMUEhLRVkgcGhrUmVzdWx0KQp7CglUUkFDRSgiKDB4JTA4eCwgJXMsICVwKVxuIiwgaEtleSwgZGVidWdzdHJfYShscFN1YktleSksIHBoa1Jlc3VsdCk7CglyZXR1cm4gUmVnT3BlbktleUEoaEtleSwgbHBTdWJLZXksIHBoa1Jlc3VsdCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleVcJCQkJW05UNC4wOlNIRUxMMzIuNTA3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdPcGVuS2V5VyAoSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIExQSEtFWSByZXRrZXkpCnsJV0FSTigiMHglMDR4ICVzICVwXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxyZXRrZXkpOwoJcmV0dXJuIFJlZ09wZW5LZXlXKCBoa2V5LCBscHN6U3ViS2V5LCByZXRrZXkgKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVFeEEJCQkJW1NIRUxMMzIuNTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdRdWVyeVZhbHVlRXhBKAoJSEtFWSBoa2V5LAoJTFBTVFIgbHBWYWx1ZU5hbWUsCglMUERXT1JEIGxwUmVzZXJ2ZWQsCglMUERXT1JEIGxwVHlwZSwKCUxQQllURSBscERhdGEsCglMUERXT1JEIGxwY2JEYXRhKQp7CglUUkFDRSgiMHglMDR4ICVzICVwICVwICVwICVwXG4iLCBoa2V5LCBscFZhbHVlTmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBscERhdGEsIGxwY2JEYXRhKTsKCXJldHVybiBSZWdRdWVyeVZhbHVlRXhBIChoa2V5LCBscFZhbHVlTmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBscERhdGEsIGxwY2JEYXRhKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVXCQkJCVtOVDQuMDpTSEVMTDMyLjUxMF0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZVcgKEhLRVkgaGtleSwgTFBXU1RSIGxwc3pTdWJLZXksCgkJCQkgTFBXU1RSIGxwc3pEYXRhLCBMUERXT1JEIGxwY2JEYXRhICkKewlXQVJOKCIweCUwNHggJXMgJXAgJXAgc2VtaS1zdHViXG4iLAoJCWhrZXksIGRlYnVnc3RyX3cobHBzelN1YktleSksIGxwc3pEYXRhLCBscGNiRGF0YSk7CglyZXR1cm4gUmVnUXVlcnlWYWx1ZVcoIGhrZXksIGxwc3pTdWJLZXksIGxwc3pEYXRhLCBscGNiRGF0YSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVFeFcJCQkJW05UNC4wOlNIRUxMMzIuNTExXQogKgogKiBGSVhNRSAKICogIGlmIHRoZSBkYXRhdHlwZSBSRUdfRVhQQU5EX1NaIHRoZW4gZXhwYW5kIHRoZSBzdHJpbmcgYW5kIGNoYW5nZQogKiAgKnBkd1R5cGUgdG8gUkVHX1NaLiAKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZUV4VyAoSEtFWSBoa2V5LCBMUFdTVFIgcHN6VmFsdWUsIExQRFdPUkQgcGR3UmVzZXJ2ZWQsCgkJIExQRFdPUkQgcGR3VHlwZSwgTFBWT0lEIHB2RGF0YSwgTFBEV09SRCBwY2JEYXRhKQp7CURXT1JEIHJldDsKCVdBUk4oIjB4JTA0eCAlcyAlcCAlcCAlcCAlcCBzZW1pLXN0dWJcbiIsCgkJaGtleSwgZGVidWdzdHJfdyhwc3pWYWx1ZSksIHBkd1Jlc2VydmVkLCBwZHdUeXBlLCBwdkRhdGEsIHBjYkRhdGEpOwoJcmV0ID0gUmVnUXVlcnlWYWx1ZUV4VyAoIGhrZXksIHBzelZhbHVlLCBwZHdSZXNlcnZlZCwgcGR3VHlwZSwgcHZEYXRhLCBwY2JEYXRhKTsKCXJldHVybiByZXQ7Cn0KCiAvKiBTSEdldFZhbHVlOiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnkgKi8KCkRXT1JEIFdJTkFQSSBTSEdldFZhbHVlQSgKICAgIEhLRVkgICAgIGhrZXksCiAgICBMUENTVFIgICBwU3ViS2V5LAogICAgTFBDU1RSICAgcFZhbHVlLAogICAgTFBEV09SRCAgcHdUeXBlLAogICAgTFBWT0lEICAgcHZEYXRhLAogICAgTFBEV09SRCAgcGJEYXRhCiAgICApCnsKICAgIEZJWE1FKCIoJXApLHN0dWIhXG4iLCBwU3ViS2V5KTsKCglyZXR1cm4gRVJST1JfU1VDQ0VTUzsgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCkRXT1JEIFdJTkFQSSBTSEdldFZhbHVlVygKICAgIEhLRVkgICAgIGhrZXksCiAgICBMUENXU1RSICBwU3ViS2V5LAogICAgTFBDV1NUUiAgcFZhbHVlLAogICAgTFBEV09SRCAgcHdUeXBlLAogICAgTFBWT0lEICAgcHZEYXRhLAogICAgTFBEV09SRCAgcGJEYXRhCiAgICApCnsKICAgIEZJWE1FKCIoJXApLHN0dWIhXG4iLCBwU3ViS2V5KTsKCglyZXR1cm4gRVJST1JfU1VDQ0VTUzsgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIGdldHMgYSB1c2VyLXNwZWNpZmljIHJlZ2lzdHJ5IHZhbHVlLiAqLwoKTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlQSgKICAgIExQQ1NUUiAgIHBTdWJLZXksCiAgICBMUENTVFIgICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlVygKICAgIExQQ1dTVFIgIHBTdWJLZXksCiAgICBMUENXU1RSICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmbGFnSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQogIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleUEgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlBKEhLRVkgaGtleSwgTFBDU1RSIHBzelN1YktleSkKewoJRklYTUUoImhrZXk9MHglMDh4LCAlc1xuIiwgaGtleSwgZGVidWdzdHJfYShwc3pTdWJLZXkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleVcgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlXKEhLRVkgaGtleSwgTFBDV1NUUiBwc3pTdWJLZXkpCnsKCUZJWE1FKCJoa2V5PTB4JTA4eCwgJXNcbiIsIGhrZXksIGRlYnVnc3RyX3cocHN6U3ViS2V5KSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUyXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0clJldFRvU3RyTgkJCQkJW1NIRUxMMzIuOTZdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZkEgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQU1RSIGRlc3QsIERXT1JEIGxlbikKewoJcmV0dXJuIFN0clJldFRvU3RyTkEoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwp9CgpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck5BIChMUFZPSUQgZGVzdCwgRFdPUkQgbGVuLCBMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsKQp7CglUUkFDRSgiZGVzdD0weCVwIGxlbj0weCVseCBzdHJyZXQ9MHglcCBwaWRsPSVwIHN0dWJcbiIsZGVzdCxsZW4sc3JjLHBpZGwpOwoKCXN3aXRjaCAoc3JjLT51VHlwZSkKCXsKCSAgY2FzZSBTVFJSRVRfV1NUUjoKCSAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgc3JjLT51LnBPbGVTdHIsIC0xLCAoTFBTVFIpZGVzdCwgbGVuLCBOVUxMLCBOVUxMKTsKCSAgICBTSEZyZWUoc3JjLT51LnBPbGVTdHIpOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfQ1NUUkE6CgkgICAgbHN0cmNweW5BKChMUFNUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX09GRlNFVEE6CgkgICAgbHN0cmNweW5BKChMUFNUUilkZXN0LCAoKExQQ1NUUikmcGlkbC0+bWtpZCkrc3JjLT51LnVPZmZzZXQsIGxlbik7CgkgICAgYnJlYWs7CgoJICBkZWZhdWx0OgoJICAgIEZJWE1FKCJ1bmtub3duIHR5cGUhXG4iKTsKCSAgICBpZiAobGVuKQoJICAgIHsKCSAgICAgICooTFBTVFIpZGVzdCA9ICdcMCc7CgkgICAgfQoJICAgIHJldHVybihGQUxTRSk7Cgl9CglyZXR1cm4gU19PSzsKfQoKSFJFU1VMVCBXSU5BUEkgU3RyUmV0VG9CdWZXIChMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsLCBMUFdTVFIgZGVzdCwgRFdPUkQgbGVuKQp7CglyZXR1cm4gU3RyUmV0VG9TdHJOVyhkZXN0LCBsZW4sIHNyYywgcGlkbCk7Cn0KCkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTlcgKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsKCVRSQUNFKCJkZXN0PTB4JXAgbGVuPTB4JWx4IHN0cnJldD0weCVwIHBpZGw9JXAgc3R1YlxuIixkZXN0LGxlbixzcmMscGlkbCk7CgoJc3dpdGNoIChzcmMtPnVUeXBlKQoJewoJICBjYXNlIFNUUlJFVF9XU1RSOgoJICAgIGxzdHJjcHluVygoTFBXU1RSKWRlc3QsIHNyYy0+dS5wT2xlU3RyLCBsZW4pOwoJICAgIFNIRnJlZShzcmMtPnUucE9sZVN0cik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9DU1RSQToKCSAgICBsc3RyY3B5bkF0b1coKExQV1NUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX09GRlNFVEE6CgkgICAgaWYgKHBpZGwpCgkgICAgewoJICAgICAgbHN0cmNweW5BdG9XKChMUFdTVFIpZGVzdCwgKChMUENTVFIpJnBpZGwtPm1raWQpK3NyYy0+dS51T2Zmc2V0LCBsZW4pOwoJICAgIH0KCSAgICBicmVhazsKCgkgIGRlZmF1bHQ6CgkgICAgRklYTUUoInVua25vd24gdHlwZSFcbiIpOwoJICAgIGlmIChsZW4pCgkgICAgeyAqKExQU1RSKWRlc3QgPSAnXDAnOwoJICAgIH0KCSAgICByZXR1cm4oRkFMU0UpOwoJfQoJcmV0dXJuIFNfT0s7Cn0KSFJFU1VMVCBXSU5BUEkgU3RyUmV0VG9TdHJOQVcgKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsKCWlmKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFN0clJldFRvU3RyTlcgKGRlc3QsIGxlbiwgc3JjLCBwaWRsKTsKCXJldHVybiBTdHJSZXRUb1N0ck5BIChkZXN0LCBsZW4sIHNyYywgcGlkbCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckNoclcJCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpMUFdTVFIgV0lOQVBJIFN0ckNoclcgKExQV1NUUiBzdHIsIFdDSEFSIHggKQp7CglUUkFDRSgiJXMgMHglMDR4XG4iLGRlYnVnc3RyX3coc3RyKSx4KTsKCXJldHVybiBDUlRETExfd2NzY2hyKHN0ciwgeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckNtcE5JVwkJCQkJW05UIDQuMDpTSEVMTDMyLipdCiAqCiAqLwpJTlQgV0lOQVBJIFN0ckNtcE5JVyAoIExQV1NUUiB3c3RyMSwgTFBXU1RSIHdzdHIyLCBJTlQgbGVuKQp7CglUUkFDRSgiJXMgJXMgJWkgc3R1YlxuIiwgZGVidWdzdHJfdyh3c3RyMSksZGVidWdzdHJfdyh3c3RyMiksbGVuKTsKCXJldHVybiBDUlRETExfX3djc25pY21wKHdzdHIxLCB3c3RyMiwgbGVuKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBbGxvY1NoYXJlZAkJCQlbU0hFTEwzMi41MjBdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMiBpcyBlcXVhbCB0byB0aGUgc2l6ZSBhbGxvY2F0ZWQgd2l0aCBIZWFwQWxsb2MKICogIHBhcmFtZXRlcjMgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKgogKiAgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3N0ZWQgYXMgbFBhcmFtIHdpdGggMHg0MDIgKFdNX1VTRVIrMikgdG8gc29tZXdoZXJlCiAqICBXTV9VU0VSKzIgY291bGQgYmUgdGhlIHVuZG9jdW1lbnRlZCBDV01fU0VUUEFUSAogKiAgdGhlIGFsbG9jYXRlZCBtZW1vcnkgY29udGFpbnMgYSBwaWRsCiAqLwpIR0xPQkFMIFdJTkFQSSBTSEFsbG9jU2hhcmVkKExQVk9JRCBwc3JjLCBEV09SRCBzaXplLCBEV09SRCBwcm9jSUQpCnsJSEdMT0JBTCBobWVtOwoJTFBWT0lEIHBtZW07CgkKCVRSQUNFKCJwdHI9JXAgc2l6ZT0weCUwNGx4IHByb2NJRD0weCUwNGx4XG4iLHBzcmMsc2l6ZSxwcm9jSUQpOwoJaG1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fRklYRUQsIHNpemUpOwoJaWYgKCFobWVtKQoJICByZXR1cm4gMDsKCQoJcG1lbSA9ICBHbG9iYWxMb2NrIChobWVtKTsKCglpZiAoISBwbWVtKQoJICByZXR1cm4gMDsKCSAgCgltZW1jcHkgKHBtZW0sIHBzcmMsIHNpemUpOwoJR2xvYmFsVW5sb2NrKGhtZW0pOyAKCXJldHVybiBobWVtOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9ja1NoYXJlZAkJCQkJW1NIRUxMMzIuNTIxXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSEFsbG9jU2hhcmVkCiAqICBwYXJhbWV0ZXIyIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICogIHRoZSByZWNlaXZlciBvZiAoV01fVVNFUisyKSB0cnlzIHRvIGxvY2sgdGhlIEhBTkRMRSAoPykgCiAqICB0aGUgcmV0dXJudmFsdWUgc2VlbXMgdG8gYmUgYSBtZW1vcnlhZHJlc3MKICovCkxQVk9JRCBXSU5BUEkgU0hMb2NrU2hhcmVkKEhBTkRMRSBobWVtLCBEV09SRCBwcm9jSUQpCnsJVFJBQ0UoImhhbmRsZT0weCUwNHggcHJvY0lEPTB4JTA0bHhcbiIsaG1lbSxwcm9jSUQpOwoJcmV0dXJuIEdsb2JhbExvY2soaG1lbSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hVbmxvY2tTaGFyZWQJCQkJW1NIRUxMMzIuNTIyXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSExvY2tTaGFyZWQKICovCkJPT0wgV0lOQVBJIFNIVW5sb2NrU2hhcmVkKEhBTkRMRSBwbWVtKQp7CVRSQUNFKCJoYW5kbGU9MHglMDR4XG4iLHBtZW0pOwoJcmV0dXJuIEdsb2JhbFVubG9jayhwbWVtKTsgCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlU2hhcmVkCQkJCQlbU0hFTEwzMi41MjNdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKi8KSEFORExFIFdJTkFQSSBTSEZyZWVTaGFyZWQoSEFORExFIGhtZW0sIERXT1JEIHByb2NJRCkKewlUUkFDRSgiaGFuZGxlPTB4JTA0eCAweCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxGcmVlKGhtZW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTZXRBcHBTdGFydGluZ0N1cnNvcgkJCQlbU0hFTEwzMi45OV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNldEFwcFN0YXJ0aW5nQ3Vyc29yKEhXTkQgdSwgRFdPUkQgdikKewlGSVhNRSgiaHduZD0weCUwNHggMHglMDRseCBzdHViXG4iLHUsdiApOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2FkT0xFCQkJCQlbU0hFTEwzMi4xNTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExvYWRPTEUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIFNfT0s7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRHJpdmVUeXBlCQkJCQlbU0hFTEwzMi42NF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERyaXZlVHlwZShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFib3J0SW52b2tlQ29tbWFuZAkJCQlbU0hFTEwzMi4xOThdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEFib3J0SW52b2tlQ29tbWFuZCh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94CQkJW1NIRUxMMzIuMTI2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdykKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYsdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZsdXNoQ2xpcGJvYXJkCQkJCVtTSEVMTDMyLjEyMV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmx1c2hDbGlwYm9hcmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBTdHJGb3JtYXRCeXRlU2l6ZQkJCQlbU0hMV0FQSV0KKi8KTFBTVFIgV0lOQVBJIFN0ckZvcm1hdEJ5dGVTaXplQSAoIERXT1JEIGR3LCBMUFNUUiBwc3pCdWYsIFVJTlQgY2NoQnVmICkKewljaGFyIGJ1Zls2NF07CglUUkFDRSgiJWx4ICVwICVpXG4iLCBkdywgcHN6QnVmLCBjY2hCdWYpOwoJaWYgKCBkdzwxMDI0TCApCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgYnl0ZXMiLCAoRkxPQVQpZHcpOwoJfQoJZWxzZSBpZiAoIGR3PDEwNDg1NzZMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEtCIiwgKEZMT0FUKWR3LzEwMjQpOwoJfQoJZWxzZSBpZiAoIGR3IDwgMTA3Mzc0MTgyNEwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgTUIiLCAoRkxPQVQpZHcvMTA0ODU3NkwpOwoJfQoJZWxzZQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEdCIiwgKEZMT0FUKWR3LzEwNzM3NDE4MjRMKTsKCX0KCWxzdHJjcHluQSAocHN6QnVmLCBidWYsIGNjaEJ1Zik7CglyZXR1cm4gcHN6QnVmOwkKfQpMUFdTVFIgV0lOQVBJIFN0ckZvcm1hdEJ5dGVTaXplVyAoIERXT1JEIGR3LCBMUFdTVFIgcHN6QnVmLCBVSU5UIGNjaEJ1ZiApCnsJY2hhciBidWZbNjRdOwoJVFJBQ0UoIiVseCAlcCAlaVxuIiwgZHcsIHBzekJ1ZiwgY2NoQnVmKTsKCWlmICggZHc8MTAyNEwgKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIGJ5dGVzIiwgKEZMT0FUKWR3KTsKCX0KCWVsc2UgaWYgKCBkdzwxMDQ4NTc2TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBLQiIsIChGTE9BVClkdy8xMDI0KTsKCX0KCWVsc2UgaWYgKCBkdyA8IDEwNzM3NDE4MjRMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIE1CIiwgKEZMT0FUKWR3LzEwNDg1NzZMKTsKCX0KCWVsc2UKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBHQiIsIChGTE9BVClkdy8xMDczNzQxODI0TCk7Cgl9Cglsc3RyY3B5bkF0b1cgKHBzekJ1ZiwgYnVmLCBjY2hCdWYpOwoJcmV0dXJuIHBzekJ1ZjsJCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hXYWl0Rm9yRmlsZVRvT3BlbgkJCQlbU0hFTEwzMi45N10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIV2FpdEZvckZpbGVUb09wZW4oRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdykKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYsdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb250cm9sX0ZpbGxDYWNoZV9SdW5ETEwJCQlbU0hFTEwzMi44XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgQ29udHJvbF9GaWxsQ2FjaGVfUnVuRExMKEhXTkQgaFduZCwgSEFORExFIGhNb2R1bGUsIERXT1JEIHcsIERXT1JEIHgpCnsJRklYTUUoIjB4JTA0eCAweCUwNHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsaFduZCwgaE1vZHVsZSx3LHgpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUnVuRExMX0NhbGxFbnRyeTE2CQkJCVtTSEVMTDMyLjEyMl0KICogdGhlIG5hbWUgaXMgcHJvcGFibHkgd3JvbmcKICovCkhSRVNVTFQgV0lOQVBJIFJ1bkRMTF9DYWxsRW50cnkxNihEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwNGx4IDB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix2LHcseCx5LHopOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJc2hlbGwzMl82NTQJCQkJW1NIRUxMMzIuNjU0XQogKgogKiBOT1RFUzogZmlyc3QgcGFyYW1ldGVyIHNlZW1zIHRvIGJlIGEgcG9pbnRlciAoc2FtZSBhcyBwYXNzZWQgdG8gV3JpdGVDYWJpbmV0U3RhdGUpCiAqIHNlY29uZCBvbmUgY291bGQgYmUgYSBzaXplICgweDBjKS4gVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0cnVjdHVyZSBzYXZlZCB0bwogKiBIQ1VcU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcQ2FiaW5ldFN0YXRlCiAqIEknbSAoanMpIGd1ZXNzaW5nOiB0aGlzIG9uZSBpcyBqdXN0IFJlYWRDYWJpbmV0U3RhdGUgOy0pCiAqLwpIUkVTVUxUIFdJTkFQSSBzaGVsbDMyXzY1NCAoRFdPUkQgeCwgRFdPUkQgeSkKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx5KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVJMQnVpbGRMaXN0T2ZQYXRocwkJCVtTSEVMTDMyLjE0Nl0KICoKICogTk9URVMKICogICBidWlsZHMgYSBEUEEKICovCkRXT1JEIFdJTkFQSSBSTEJ1aWxkTGlzdE9mUGF0aHMgKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTdHJUb09sZVN0cgkJCVtTSEVMTDMyLjE2M10KICoKICovCmludCBXSU5BUEkgU3RyVG9PbGVTdHJBIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDU1RSIGxwTXVsdGlCeXRlU3RyaW5nKQp7CglUUkFDRSgiKCVwLCAlcCAlcylcbiIsCglscFdpZGVDaGFyU3RyLCBscE11bHRpQnl0ZVN0cmluZywgZGVidWdzdHJfYShscE11bHRpQnl0ZVN0cmluZykpOwoKCXJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyKDAsIDAsIGxwTXVsdGlCeXRlU3RyaW5nLCAtMSwgbHBXaWRlQ2hhclN0ciwgTUFYX1BBVEgpOwoKfQppbnQgV0lOQVBJIFN0clRvT2xlU3RyVyAoTFBXU1RSIGxwV2lkZUNoYXJTdHIsIExQQ1dTVFIgbHBXU3RyaW5nKQp7CglUUkFDRSgiKCVwLCAlcCAlcylcbiIsCglscFdpZGVDaGFyU3RyLCBscFdTdHJpbmcsIGRlYnVnc3RyX3cobHBXU3RyaW5nKSk7CgoJaWYgKGxzdHJjcHlXIChscFdpZGVDaGFyU3RyLCBscFdTdHJpbmcgKSkKCXsgcmV0dXJuIGxzdHJsZW5XIChscFdpZGVDaGFyU3RyKTsKCX0KCXJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBTdHJUb09sZVN0ckFXIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDVk9JRCBscFN0cmluZykKewoJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFN0clRvT2xlU3RyVyAobHBXaWRlQ2hhclN0ciwgbHBTdHJpbmcpOwoJcmV0dXJuIFN0clRvT2xlU3RyQSAobHBXaWRlQ2hhclN0ciwgbHBTdHJpbmcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNIVmFsaWRhdGVVTkMJCQkJW1NIRUxMMzIuMTczXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hWYWxpZGF0ZVVOQyAoRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikKewoJRklYTUUoIjB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx5LHopOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLjUzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QShMUFNUUiB4LCBMUFNUUiB5KQp7CglGSVhNRSgiKCVwICVzLCAlcCAlcykgc3R1YlxuIiwgeCwgZGVidWdzdHJfYSh4KSwgeSwgZGVidWdzdHJfYSh5KSk7CglyZXR1cm4gMDsKfQoKSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0VyhMUFdTVFIgeCwgTFBXU1RSIHkpCnsKCUZJWE1FKCIoJXAgJXMsICVwICVzKSBzdHViXG4iLCB4LCBkZWJ1Z3N0cl93KHgpLCB5LCBkZWJ1Z3N0cl93KHkpKTsKCXJldHVybiAwOwp9CgpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RBVyhMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBEb0Vudmlyb25tZW50U3Vic3RXKHgsIHkpOwoJcmV0dXJuIERvRW52aXJvbm1lbnRTdWJzdEEoeCwgeSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgc2hlbGwzMl8yNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjI0M10KICogCiAqIFdpbjk4KyBieS1vcmRpbmFsIHJvdXRpbmUuICBJbiBXaW45OCB0aGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvIGFuZAogKiBkb2VzIG5vdGhpbmcgZWxzZS4gIFBvc3NpYmx5IHRoaXMgZG9lcyBzb21ldGhpbmcgaW4gTlQgb3IgU0hFTEwzMiA1LjA/CiAqCiAqLwoKQk9PTCBXSU5BUEkgc2hlbGwzMl8yNDMoRFdPUkQgYSwgRFdPUkQgYikgCnsgCiAgcmV0dXJuIEZBTFNFOyAKfQoK