LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAiaGVhcC5oIgoKI2luY2x1ZGUgInNoZWxsYXBpLmgiCiNpbmNsdWRlICJzaGxndWlkLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgojaW5jbHVkZSAid2luZS91bmRvY3NoZWxsLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoc2hlbGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZEEJCQkJCVtpbnRlcm5hbF0KICoKICogY29weXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICogCiAqIGZpcnN0IGZpZWxkIGlzIG5GaWVsZCA9IDEKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQSgKCUxQQ1NUUiBzcmMsCglEV09SRCBuRmllbGQsCglMUFNUUiBkc3QsCglEV09SRCBsZW4pIAp7CglXQVJOKCIoJyVzJywweCUwOGx4LCVwLCVsZCkgc2VtaS1zdHViLlxuIixzcmMsbkZpZWxkLGRzdCxsZW4pOwoKCWlmICghc3JjIHx8ICFzcmNbMF0gfHwgIWRzdCB8fCAhbGVuKQoJICByZXR1cm4gMDsKCgkvKiBza2lwIG4gZmllbGRzIGRlbGltaXRlZCBieSAnLCcgKi8KCXdoaWxlIChuRmllbGQgPiAxKQoJewoJICBpZiAoKnNyYz09J1wwJykgcmV0dXJuIEZBTFNFOwoJICBpZiAoKihzcmMrKyk9PScsJykgbkZpZWxkLS07Cgl9CgoJLyogY29weSBwYXJ0IHRpbGwgdGhlIG5leHQgJywnIHRvIGRzdCAqLwoJd2hpbGUgKCAqc3JjIT0nXDAnICYmICpzcmMhPScsJyAmJiAobGVuLS0pPjAgKSAqKGRzdCsrKT0qKHNyYysrKTsKCQoJLyogZmluYWxpemUgdGhlIHN0cmluZyAqLwoJKmRzdD0weDA7CgkKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkVwkJCVtpbnRlcm5hbF0KICoKICogY29weXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICogCiAqIGZpcnN0IGZpZWxkIGlzIG5GaWVsZCA9IDEKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkVyhMUENXU1RSIHNyYywgRFdPUkQgbkZpZWxkLCBMUFdTVFIgZHN0LCBEV09SRCBsZW4pIAp7CglGSVhNRSgiKCclcycsMHglMDhseCwlcCwlbGQpIHN0dWIuXG4iLAoJICBkZWJ1Z3N0cl93KHNyYyksIG5GaWVsZCwgZHN0LCBsZW4pOwoJcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkQVcJCQlbU0hFTEwzMi41OF0KICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQVcoTFBDVk9JRCBzcmMsIERXT1JEIG5GaWVsZCwgTFBWT0lEIGRzdCwgRFdPUkQgbGVuKSAKewoJaWYgKFNIRUxMX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBQYXJzZUZpZWxkVyhzcmMsIG5GaWVsZCwgZHN0LCBsZW4pOwoJcmV0dXJuIFBhcnNlRmllbGRBKHNyYywgbkZpZWxkLCBkc3QsIGxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldEZpbGVOYW1lRnJvbUJyb3dzZQkJCVtTSEVMTDMyLjYzXQogKiAKICovCkJPT0wgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZSgKCUhXTkQgaHduZE93bmVyLAoJTFBTVFIgbHBzdHJGaWxlLAoJRFdPUkQgbk1heEZpbGUsCglMUENTVFIgbHBzdHJJbml0aWFsRGlyLAoJTFBDU1RSIGxwc3RyRGVmRXh0LAoJTFBDU1RSIGxwc3RyRmlsdGVyLAoJTFBDU1RSIGxwc3RyVGl0bGUpCnsKCUZJWE1FKCIoJTA0eCwlcywlbGQsJXMsJXMsJXMsJXMpOnN0dWIuXG4iLAoJICBod25kT3duZXIsIGxwc3RyRmlsZSwgbk1heEZpbGUsIGxwc3RySW5pdGlhbERpciwgbHBzdHJEZWZFeHQsCgkgIGxwc3RyRmlsdGVyLCBscHN0clRpdGxlKTsKCiAgICAvKiBwdXRzIHVwIGEgT3BlbiBEaWFsb2cgYW5kIHJlcXVlc3RzIGlucHV0IGludG8gdGFyZ2V0YnVmICovCiAgICAvKiBPRk5fSElERVJFQURPTkxZfE9GTl9OT0NIQU5HRURJUnxPRk5fRklMRU1VU1RFWElTVHxPRk5fdW5rbm93biAqLwogICAgc3RyY3B5KGxwc3RyRmlsZSwieDpcXGR1bW15LmV4ZSIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0dGluZ3MJCQkJW1NIRUxMMzIuNjhdCiAqIAogKiBOT1RFUwogKiAgdGhlIHJlZ2lzdHJ5IHBhdGggYXJlIGZvciB3aW45OCAodGVzdGVkKQogKiAgYW5kIHBvc3NpYmx5IGFyZSB0aGUgc2FtZSBpbiBudDQwCiAqLwpWT0lEIFdJTkFQSSBTSEdldFNldHRpbmdzKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzaykKewoJSEtFWQloS2V5OwoJRFdPUkQJZHdEYXRhOwoJRFdPUkQJZHdEYXRhU2l6ZSA9IHNpemVvZiAoRFdPUkQpOwoKCVRSQUNFKCIoJXAgMHglMDhseClcbiIsbHBzZnMsZHdNYXNrKTsKCQoJaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcQWR2YW5jZWQiLAoJCQkJIDAsIDAsIDAsIEtFWV9BTExfQUNDRVNTLCAwLCAmaEtleSwgMCkpCgkgIHJldHVybjsKCQoJaWYgKCAoU1NGX1NIT1dFWFRFTlNJT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUZpbGVFeHQiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93RXh0ZW5zaW9ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dJTkZPVElQICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0luZm9UaXAiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93SW5mb1RpcCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0RPTlRQUkVUVFlQQVRIICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiRG9udFByZXR0eVBhdGgiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZEb250UHJldHR5UGF0aCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0hJREVJQ09OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVJY29ucyIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkhpZGVJY29ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX01BUE5FVERSVkJVVFRPTiAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIk1hcE5ldERydkJ0biIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+Zk1hcE5ldERydkJ0biAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dBVFRSSUJDT0wgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93QXR0cmliQ29sIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0F0dHJpYkNvbCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCgoU1NGX1NIT1dBTExPQkpFQ1RTIHwgU1NGX1NIT1dTWVNGSUxFUykgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRkZW4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCXsgaWYgKGR3RGF0YSA9PSAwKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMSkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDE7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDIpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAxOwoJICB9Cgl9CglSZWdDbG9zZUtleSAoaEtleSk7CgoJVFJBQ0UoIi0tIDB4JTA0eFxuIiwgKihXT1JEKilscHNmcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UJCQlbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoCglIV05EIGh3bmRDYWJpbmV0LCAKCURXT1JEIGR3TWVzc2FnZSwKCURXT1JEIGR3UGFyYW0pCnsKCUZJWE1FKCIlMDR4ICUwOGx4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsIGR3TWVzc2FnZSwgZHdQYXJhbSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sJCQkJW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpCT09MIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vaygKCUhXTkQgaFduZCwKCURXT1JEIGR3VHlwZSkKewoJRklYTUUoIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaFduZCwgZHdUeXBlKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsTWVzc2FnZUJveFcJCQkJW1NIRUxMMzIuMTgyXQogKgogKiBGb3JtYXQgYW5kIG91dHB1dCBlcnJvcm1lc3NhZ2UuCiAqCiAqIGlkVGV4dAlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKiBpZFRpdGxlCXJlc291cmNlIElEIG9mIHRpdGxlIG9yIExQU1RSCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwppbnQgV0lOQVBJViBTaGVsbE1lc3NhZ2VCb3hXKAoJSElOU1RBTkNFIGhJbnN0YW5jZSwKCUhXTkQgaFduZCwKCUxQQ1dTVFIgbHBUZXh0LAoJTFBDV1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CglXQ0hBUglzelRleHRbMTAwXSxzelRpdGxlWzEwMF07CglMUENXU1RSIHBzelRleHQgPSBzelRleHQsIHBzelRpdGxlID0gc3pUaXRsZSwgcHN6VGVtcDsKCXZhX2xpc3QgYXJnczsKCWludAlyZXQ7CgoJdmFfc3RhcnQoYXJncywgdVR5cGUpOwoJLyogd3ZzcHJpbnRmQShidWYsZm10LCBhcmdzKTsgKi8KCglUUkFDRSgiKCUwOGx4LCUwOGx4LCVwLCVwLCUwOHgpXG4iLAoJKERXT1JEKWhJbnN0YW5jZSwoRFdPUkQpaFduZCxscFRleHQsbHBDYXB0aW9uLHVUeXBlKTsKCglpZiAoIUhJV09SRChscENhcHRpb24pKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscENhcHRpb24sIHN6VGl0bGUsIHNpemVvZihzelRpdGxlKS9zaXplb2Yoc3pUaXRsZVswXSkpOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgc2l6ZW9mKHN6VGV4dCkvc2l6ZW9mKHN6VGV4dFswXSkpOwoJZWxzZQoJICBwc3pUZXh0ID0gbHBUZXh0OwoKCUZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HLCAKCQkgICAgICAgcHN6VGV4dCwgMCwgMCwgKExQV1NUUikmcHN6VGVtcCwgMCwgJmFyZ3MpOwoKCXZhX2VuZChhcmdzKTsKCglyZXQgPSBNZXNzYWdlQm94VyhoV25kLHBzelRlbXAscHN6VGl0bGUsdVR5cGUpOwoJTG9jYWxGcmVlKChITE9DQUwpcHN6VGVtcCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCmludCBXSU5BUElWIFNoZWxsTWVzc2FnZUJveEEoCglISU5TVEFOQ0UgaEluc3RhbmNlLAoJSFdORCBoV25kLAoJTFBDU1RSIGxwVGV4dCwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CgljaGFyCXN6VGV4dFsxMDBdLHN6VGl0bGVbMTAwXTsKCUxQQ1NUUiAgcHN6VGV4dCA9IHN6VGV4dCwgcHN6VGl0bGUgPSBzelRpdGxlLCBwc3pUZW1wOwoJdmFfbGlzdCBhcmdzOwoJaW50CXJldDsKCgl2YV9zdGFydChhcmdzLCB1VHlwZSk7CgkvKiB3dnNwcmludGZBKGJ1ZixmbXQsIGFyZ3MpOyAqLwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJXAsJXAsJTA4eClcbiIsCgkoRFdPUkQpaEluc3RhbmNlLChEV09SRCloV25kLGxwVGV4dCxscENhcHRpb24sdVR5cGUpOwoKCWlmICghSElXT1JEKGxwQ2FwdGlvbikpCgkgIExvYWRTdHJpbmdBKGhJbnN0YW5jZSwgKERXT1JEKWxwQ2FwdGlvbiwgc3pUaXRsZSwgc2l6ZW9mKHN6VGl0bGUpKTsKCWVsc2UKCSAgcHN6VGl0bGUgPSBscENhcHRpb247CgoJaWYgKCFISVdPUkQobHBUZXh0KSkKCSAgTG9hZFN0cmluZ0EoaEluc3RhbmNlLCAoRFdPUkQpbHBUZXh0LCBzelRleHQsIHNpemVvZihzelRleHQpKTsKCWVsc2UKCSAgcHN6VGV4dCA9IGxwVGV4dDsKCglGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORywgCgkJICAgICAgIHBzelRleHQsIDAsIDAsIChMUFNUUikmcHN6VGVtcCwgMCwgJmFyZ3MpOwoKCXZhX2VuZChhcmdzKTsKCglyZXQgPSBNZXNzYWdlQm94QShoV25kLHBzelRlbXAscHN6VGl0bGUsdVR5cGUpOwoJTG9jYWxGcmVlKChITE9DQUwpcHN6VGVtcCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWUJCQkJCVtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KI2RlZmluZSBNRU1fREVCVUcgMAp2b2lkIFdJTkFQSSBTSEZyZWUoTFBWT0lEIHgpIAp7CiNpZiBNRU1fREVCVUcKCVdPUkQgbGVuID0gKihMUFdPUkQpKChMUEJZVEUpeC0yKTsKCglpZiAoICooTFBXT1JEKSgoTFBCWVRFKXgrbGVuKSAhPSAweDczODQpCgkgIEVSUigiTUFHSUMyIVxuIik7CgoJaWYgKCAoKihMUFdPUkQpKChMUEJZVEUpeC00KSkgIT0gMHg4MjcxKQoJICBFUlIoIk1BR0lDMSFcbiIpOwoJZWxzZQoJICBtZW1zZXQoKExQQllURSl4LTQsIDB4ZGUsIGxlbis2KTsKCglUUkFDRSgiJXAgbGVuPSV1XG4iLHgsIGxlbik7CgoJeCA9IChMUEJZVEUpIHggLSA0OwojZWxzZQoJVFJBQ0UoIiVwXG4iLHgpOwojZW5kaWYKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jCQkJCQlbU0hFTEwzMi4xOTZdCiAqCiAqIE5PVEVTCiAqICAgICB2b2lkICp0YXNrX2FsbG9jKERXT1JEIGxlbiksIHVzZXMgU0hNYWxsb2MgYWxsb2NhdG9yCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUFZPSUQgV0lOQVBJIFNIQWxsb2MoRFdPUkQgbGVuKSAKewoJTFBCWVRFIHJldDsKCiNpZiBNRU1fREVCVUcKCXJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKzYpOwojZWxzZQoJcmV0ID0gKExQVk9JRCkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwojZW5kaWYKCiNpZiBNRU1fREVCVUcKCSooTFBXT1JEKShyZXQpID0gMHg4MjcxOwoJKihMUFdPUkQpKHJldCsyKSA9IChXT1JEKWxlbjsKCSooTFBXT1JEKShyZXQrNCtsZW4pID0gMHg3Mzg0OwoJcmV0ICs9IDQ7CgltZW1zZXQocmV0LCAweGRmLCBsZW4pOwojZW5kaWYKCVRSQUNFKCIlbHUgYnl0ZXMgYXQgJXBcbiIsbGVuLCByZXQpOwoJcmV0dXJuIChMUFZPSUQpcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ2lzdGVyRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODZdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ2lzdGVyRHJhZ0Ryb3AoCglIV05EIGhXbmQsCglMUERST1BUQVJHRVQgcERyb3BUYXJnZXQpCnsKCUZJWE1FKCIoMHglMDh4LCVwKTpzdHViLlxuIiwgaFduZCwgcERyb3BUYXJnZXQpOwoJaWYgKEdldFNoZWxsT2xlKCkpIHJldHVybiBwUmVnaXN0ZXJEcmFnRHJvcChoV25kLCBwRHJvcFRhcmdldCk7CiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmV2b2tlRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJldm9rZURyYWdEcm9wKEhXTkQgaFduZCkKewogICAgRklYTUUoIigweCUwOHgpOnN0dWIuXG4iLGhXbmQpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRG9EcmFnRHJvcAkJCQkJW1NIRUxMMzIuODhdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSERvRHJhZ0Ryb3AoCglIV05EIGhXbmQsCglMUERBVEFPQkpFQ1QgbHBEYXRhT2JqZWN0LAoJTFBEUk9QU09VUkNFIGxwRHJvcFNvdXJjZSwKCURXT1JEIGR3T0tFZmZlY3QsCglMUERXT1JEIHBkd0VmZmVjdCkKewogICAgRklYTUUoIigweCUwNHggJXAgJXAgMHglMDhseCAlcCk6c3R1Yi5cbiIsCiAgICBoV25kLCBscERhdGFPYmplY3QsIGxwRHJvcFNvdXJjZSwgZHdPS0VmZmVjdCwgcGR3RWZmZWN0KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cwkJCQlbU0hFTEwzMi4xODRdCiAqIAogKi8KV09SRCBXSU5BUEkgQXJyYW5nZVdpbmRvd3MoCglIV05EIGh3bmRQYXJlbnQsCglEV09SRCBkd1Jlc2VydmVkLAoJTFBDUkVDVCBscFJlY3QsCglXT1JEIGNLaWRzLAoJQ09OU1QgSFdORCAqIGxwS2lkcykKewogICAgRklYTUUoIigweCUwOHggMHglMDhseCAlcCAweCUwNHggJXApOnN0dWIuXG4iLAoJICAgaHduZFBhcmVudCwgZHdSZXNlcnZlZCwgbHBSZWN0LCBjS2lkcywgbHBLaWRzKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaWduYWxGaWxlT3BlbgkJCQlbU0hFTEwzMi4xMDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU2lnbmFsRmlsZU9wZW4gKERXT1JEIGR3UGFyYW0xKQp7CiAgICBGSVhNRSgiKDB4JTA4bHgpOnN0dWIuXG4iLCBkd1BhcmFtMSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWRkVG9SZWNlbnREb2NzCQkJCVtTSEVMTDMyLjIzNF0KICoKICogUEFSQU1FVEVSUwogKiAgIHVGbGFncyAgW0lOXSBTSEFSRF9QQVRIIG9yIFNIQVJEX1BJREwKICogICBwdiAgICAgIFtJTl0gc3RyaW5nIG9yIHBpZGwsIE5VTEwgY2xlYXJzIHRoZSBsaXN0CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MgKFVJTlQgdUZsYWdzLExQQ1ZPSUQgcHYpICAgCnsgaWYgKFNIQVJEX1BJREw9PXVGbGFncykKICB7IEZJWE1FKCIoMHglMDh4LHBpZGw9JXApOnN0dWIuXG4iLCB1RmxhZ3MscHYpOwoJfQoJZWxzZQoJeyBGSVhNRSgiKDB4JTA4eCwlcyk6c3R1Yi5cbiIsIHVGbGFncywoY2hhciopcHYpOwoJfQogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgJCQlbU0hFTEwzMi4xNzRdCiAqCiAqIE5PVEVTCiAqICBzZWUgSVNoZWxsRm9sZGVyOjpDcmVhdGVWaWV3T2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4KAoJTFBDU0hFTExGT0xERVJWSUVXSU5GTyBwc3ZjYmksIC8qW2luIF0gc2hlbGx0ZW1wbGF0ZSBzdHJ1Y3QqLwoJTFBTSEVMTFZJRVcqIHBwdikgICAgICAgICAgICAgIC8qW291dF0gSVNoZWxsVmlldyBwb2ludGVyKi8KewoJSVNoZWxsVmlldyAqIHBzZjsKCUhSRVNVTFQgaFJlczsKCQoJVFJBQ0UoInNmPSVwIHBpZGw9JXAgY2I9JXAgbW9kZT0weCUwOHggcGFybT0weCUwOGx4XG4iLCAKCSAgcHN2Y2JpLT5wc2hmLCBwc3ZjYmktPnBpZGxGb2xkZXIsIHBzdmNiaS0+bHBmbkNhbGxiYWNrLAoJICBwc3ZjYmktPnVWaWV3TW9kZSwgcHN2Y2JpLT5kd1VzZXIpOwoKCXBzZiA9IElTaGVsbFZpZXdfQ29uc3RydWN0b3IocHN2Y2JpLT5wc2hmKTsKCQoJaWYgKCFwc2YpCgkgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKCUlTaGVsbFZpZXdfQWRkUmVmKHBzZik7CgloUmVzID0gSVNoZWxsVmlld19RdWVyeUludGVyZmFjZShwc2YsICZJSURfSVNoZWxsVmlldywgKExQVk9JRCAqKXBwdik7CglJU2hlbGxWaWV3X1JlbGVhc2UocHNmKTsKCglyZXR1cm4gaFJlczsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hXaW5IZWxwCQkJCQlbU0hFTEwzMi4xMjddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFdpbkhlbHAgKERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix2LHcseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFJ1bkNvbnRyb2xQYW5lbCBbU0hFTEwzMi4xNjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJ1bkNvbnRyb2xQYW5lbCAoRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4CQkJCVtTSEVMTDMyLjI5MV0KICoKICovCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4QVcgKExQVk9JRCBzZWkpCnsJaWYgKFNIRUxMX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTaGVsbEV4ZWN1dGVFeFcgKHNlaSk7CglyZXR1cm4gU2hlbGxFeGVjdXRlRXhBIChzZWkpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4QQkJCQlbU0hFTEwzMi4yOTJdCiAqCiAqIHBsYWNlaG9sZGVyIGluIHRoZSBjb21tYW5kbGluZToKICoJJTEgZmlsZQogKgklMiBwcmludGVyCiAqCSUzIGRyaXZlcgogKgklNCBwb3J0CiAqCSVJIGFkcmVzcyBvZiBhIGdsb2JhbCBpdGVtIElEIChleHBsb3JlciBzd2l0Y2ggL2lkbGlzdCkKICoJJUwgPz8/IHBhdGgvdXJsL2N1cnJlbnQgZmlsZSA/Pz8KICoJJVMgPz8/CiAqCSUqIGFsbCBmb2xsb3dpbmcgcGFyYW1ldGVycyAoc2VlIGJhdGZpbGUpCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeEEgKExQU0hFTExFWEVDVVRFSU5GT0Egc2VpKQp7IAlDSEFSIHN6QXBwbGljYXRpb25OYW1lW01BWF9QQVRIXSxzekNvbW1hbmRsaW5lW01BWF9QQVRIXSxzelBpZGxbMjBdOwoJTFBTVFIgcG9zOwoJaW50IGdhcCwgbGVuOwoJU1RBUlRVUElORk9BICBzdGFydHVwOwoJUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvOwoJCQkKCVdBUk4oIm1hc2s9MHglMDhseCBod25kPTB4JTA0eCB2ZXJiPSVzIGZpbGU9JXMgcGFybT0lcyBkaXI9JXMgc2hvdz0weCUwOHggY2xhc3M9JXMgaW5jb21wbGV0ZVxuIiwKCQlzZWktPmZNYXNrLCBzZWktPmh3bmQsIHNlaS0+bHBWZXJiLCBzZWktPmxwRmlsZSwKCQlzZWktPmxwUGFyYW1ldGVycywgc2VpLT5scERpcmVjdG9yeSwgc2VpLT5uU2hvdywgCgkJKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpID8gc2VpLT5scENsYXNzIDogIm5vdCB1c2VkIik7CgoJWmVyb01lbW9yeShzekFwcGxpY2F0aW9uTmFtZSxNQVhfUEFUSCk7CglpZiAoc2VpLT5scEZpbGUpCgkgIHN0cmNweShzekFwcGxpY2F0aW9uTmFtZSwgc2VpLT5scEZpbGUpOwoJCglaZXJvTWVtb3J5KHN6Q29tbWFuZGxpbmUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBQYXJhbWV0ZXJzKQoJICBzdHJjcHkoc3pDb21tYW5kbGluZSwgc2VpLT5scFBhcmFtZXRlcnMpOwoJCQkKCWlmIChzZWktPmZNYXNrICYgKFNFRV9NQVNLX0NMQVNTS0VZIHwgU0VFX01BU0tfSU5WT0tFSURMSVNUIHwgU0VFX01BU0tfSUNPTiB8IFNFRV9NQVNLX0hPVEtFWSB8CgkJCSAgU0VFX01BU0tfQ09OTkVDVE5FVERSViB8IFNFRV9NQVNLX0ZMQUdfRERFV0FJVCB8CgkJCSAgU0VFX01BU0tfRE9FTlZTVUJTVCB8IFNFRV9NQVNLX0ZMQUdfTk9fVUkgfCBTRUVfTUFTS19VTklDT0RFIHwgCgkJCSAgU0VFX01BU0tfTk9fQ09OU09MRSB8IFNFRV9NQVNLX0FTWU5DT0sgfCBTRUVfTUFTS19ITU9OSVRPUiApKQoJewoJICBGSVhNRSgiZmxhZ3MgaWdub3JlZDogMHglMDhseFxuIiwgc2VpLT5mTWFzayk7Cgl9CgkKCS8qIGxhdW5jaCBhIGRvY3VtZW50IGJ5IGZpbGVjbGFzcyBsaWtlICdXb3JkcGFkLkRvY3VtZW50LjEnICovCglpZiAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkKCXsKCSAgLyogdGhlIGNvbW1hbmRsaW5lIGNvbnRhaW5zICdjOlxQYXRoXHdvcmRwYWQuZXhlICIlMSInICovCgkgIEhDUl9HZXRFeGVjdXRlQ29tbWFuZChzZWktPmxwQ2xhc3MsIChzZWktPmxwVmVyYikgPyBzZWktPmxwVmVyYiA6ICJvcGVuIiwgc3pDb21tYW5kbGluZSwgMjU2KTsKCSAgLyogZml4bWU6IGdldCB0aGUgZXh0ZW5zaW9uIG9mIGxwRmlsZSwgY2hlY2sgaWYgaXQgZml0cyB0byB0aGUgbHBDbGFzcyAqLwoJICBUUkFDRSgiU0VFX01BU0tfQ0xBU1NOQU1FLT4nJXMnXG4iLCBzekNvbW1hbmRsaW5lKTsKCX0KCgkvKiBwcm9jZXNzIHRoZSBJRExpc3QgKi8KCWlmICggKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19JTlZPS0VJRExJU1QpID09IFNFRV9NQVNLX0lOVk9LRUlETElTVCkgLyoweDBjKi8KCXsKCSAgU0hHZXRQYXRoRnJvbUlETGlzdEEgKHNlaS0+bHBJRExpc3Qsc3pBcHBsaWNhdGlvbk5hbWUpOwoJICBUUkFDRSgiLS0gaWRsaXN0PSVwICglcylcbiIsIHNlaS0+bHBJRExpc3QsIHN6QXBwbGljYXRpb25OYW1lKTsKCX0KCWVsc2UKCXsKCSAgaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19JRExJU1QgKQoJICB7CgkgICAgcG9zID0gc3Ryc3RyKHN6Q29tbWFuZGxpbmUsICIlSSIpOwoJICAgIGlmIChwb3MpCgkgICAgewoJICAgICAgTFBWT0lEIHB2OwoJICAgICAgSEdMT0JBTCBobWVtID0gU0hBbGxvY1NoYXJlZCAoIHNlaS0+bHBJRExpc3QsIElMR2V0U2l6ZShzZWktPmxwSURMaXN0KSwgMCk7CgkgICAgICBwdiA9IFNITG9ja1NoYXJlZChobWVtLDApOwoJICAgICAgc3ByaW50ZihzelBpZGwsIjolcCIscHYgKTsKCSAgICAgIFNIVW5sb2NrU2hhcmVkKHB2KTsKCSAgICAKCSAgICAgIGdhcCA9IHN0cmxlbihzelBpZGwpOwoJICAgICAgbGVuID0gc3RybGVuKHBvcyktMjsKCSAgICAgIG1lbW1vdmUocG9zK2dhcCxwb3MrMixsZW4pOwoJICAgICAgbWVtY3B5KHBvcyxzelBpZGwsZ2FwKTsKCgkgICAgfQoJICB9Cgl9CgoJVFJBQ0UoImV4ZWN1dGU6JyVzJywnJXMnXG4iLHN6QXBwbGljYXRpb25OYW1lLCBzekNvbW1hbmRsaW5lKTsKCglzdHJjYXQoc3pBcHBsaWNhdGlvbk5hbWUsICIgIik7CglzdHJjYXQoc3pBcHBsaWNhdGlvbk5hbWUsIHN6Q29tbWFuZGxpbmUpOwoKCVplcm9NZW1vcnkoJnN0YXJ0dXAsc2l6ZW9mKFNUQVJUVVBJTkZPQSkpOwoJc3RhcnR1cC5jYiA9IHNpemVvZihTVEFSVFVQSU5GT0EpOwoKCWlmICghIENyZWF0ZVByb2Nlc3NBKE5VTEwsIHN6QXBwbGljYXRpb25OYW1lLAoJCQkgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIAoJCQkgTlVMTCwgTlVMTCwgJnN0YXJ0dXAsICZpbmZvKSkKCXsKCSAgc2VpLT5oSW5zdEFwcCA9IEdldExhc3RFcnJvcigpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgogICAgICAgIHNlaS0+aEluc3RBcHAgPSAzMzsKCQogICAgCS8qIEdpdmUgMzAgc2Vjb25kcyB0byB0aGUgYXBwIHRvIGNvbWUgdXAgKi8KCWlmICggV2FpdEZvcklucHV0SWRsZSAoIGluZm8uaFByb2Nlc3MsIDMwMDAwICkgPT0gIDB4RkZGRkZGRkYgKQoJICBFUlIoIldhaXRGb3JJbnB1dElkbGUgZmFpbGVkOiBFcnJvciAlbGRcbiIsIEdldExhc3RFcnJvcigpICk7CiAKCWlmKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19OT0NMT1NFUFJPQ0VTUykKCSAgc2VpLT5oUHJvY2VzcyA9IGluZm8uaFByb2Nlc3M7CSAgCiAgICAgICAgZWxzZQogICAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFByb2Nlc3MgKTsKICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oVGhyZWFkICk7CglyZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeFcJCQkJW1NIRUxMMzIuMjkzXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhXIChMUFNIRUxMRVhFQ1VURUlORk9XIHNlaSkKewlTSEVMTEVYRUNVVEVJTkZPQSBzZWlBOwoJRFdPUkQgcmV0OwoKCVRSQUNFKCIlcFxuIiwgc2VpKTsKCgltZW1jcHkoJnNlaUEsIHNlaSwgc2l6ZW9mKFNIRUxMRVhFQ1VURUlORk9BKSk7CgkKICAgICAgICBpZiAoc2VpLT5scFZlcmIpCgkgIHNlaUEubHBWZXJiID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwVmVyYik7CgogICAgICAgIGlmIChzZWktPmxwRmlsZSkKCSAgc2VpQS5scEZpbGUgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBGaWxlKTsKCiAgICAgICAgaWYgKHNlaS0+bHBQYXJhbWV0ZXJzKQoJICBzZWlBLmxwUGFyYW1ldGVycyA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scFBhcmFtZXRlcnMpOwoKCWlmIChzZWktPmxwRGlyZWN0b3J5KQoJICBzZWlBLmxwRGlyZWN0b3J5ID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwRGlyZWN0b3J5KTsKCiAgICAgICAgaWYgKChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKSAmJiBzZWktPmxwQ2xhc3MpCgkgIHNlaUEubHBDbGFzcyA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scENsYXNzKTsKCWVsc2UKCSAgc2VpQS5scENsYXNzID0gTlVMTDsKCSAgCSAgCglyZXQgPSBTaGVsbEV4ZWN1dGVFeEEoJnNlaUEpOwoKICAgICAgICBpZiAoc2VpQS5scFZlcmIpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBWZXJiICk7CglpZiAoc2VpQS5scEZpbGUpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBGaWxlICk7CglpZiAoc2VpQS5scFBhcmFtZXRlcnMpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBQYXJhbWV0ZXJzICk7CglpZiAoc2VpQS5scERpcmVjdG9yeSkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scERpcmVjdG9yeSApOwoJaWYgKHNlaUEubHBDbGFzcykJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scENsYXNzICk7CgogCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBMUFVOS05PV04gU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2U9MDsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTZXRJbnN0YW5jZUV4cGxvcmVyCQkJW1NIRUxMMzIuMTc2XQogKgogKiBOT1RFUwogKiAgU2V0cyB0aGUgaW50ZXJmYWNlCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFNldEluc3RhbmNlRXhwbG9yZXIgKExQVU5LTk9XTiBscFVua25vd24pCnsJVFJBQ0UoIiVwXG4iLCBscFVua25vd24pOwoJU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UgPSBscFVua25vd247CglyZXR1cm4gKEhSRVNVTFQpIGxwVW5rbm93bjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4yNTZdCiAqCiAqIE5PVEVTCiAqICBnZXRzIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBvZiB0aGUgZXhwbG9yZXIgYW5kIGEgcmVmZXJlbmNlCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEdldEluc3RhbmNlRXhwbG9yZXIgKExQVU5LTk9XTiAqIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CgoJKmxwVW5rbm93biA9IFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlOwoKCWlmICghU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UpCgkgIHJldHVybiBFX0ZBSUw7CgoJSVVua25vd25fQWRkUmVmKFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlKTsKCXJldHVybiBOT0VSUk9SOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVVudXNlZExpYnJhcmllcwkJCVtTSEVMTDMyLjEyM10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCnZvaWQgV0lOQVBJIFNIRnJlZVVudXNlZExpYnJhcmllcyAodm9pZCkKewoJRklYTUUoInN0dWJcbiIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TZXREcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KQk9PTCBXSU5BUEkgREFEX1NldERyYWdJbWFnZSgKCUhJTUFHRUxJU1QgaGltbFRyYWNrLAoJTFBQT0lOVCBscHB0KQp7CglGSVhNRSgiJXAgJXAgc3R1YlxuIixoaW1sVHJhY2ssIGxwcHQpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TaG93RHJhZ0ltYWdlCQkJCVtTSEVMTDMyLjEzN10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkJPT0wgV0lOQVBJIERBRF9TaG93RHJhZ0ltYWdlKEJPT0wgYlNob3cpCnsKCUZJWE1FKCIweCUwOHggc3R1YlxuIixiU2hvdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUyXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jU2hhcmVkCQkJCVtTSEVMTDMyLjUyMF0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIyIGlzIGVxdWFsIHRvIHRoZSBzaXplIGFsbG9jYXRlZCB3aXRoIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMyBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqCiAqICB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc3RlZCBhcyBsUGFyYW0gd2l0aCAweDQwMiAoV01fVVNFUisyKSB0byBzb21ld2hlcmUKICogIFdNX1VTRVIrMiBjb3VsZCBiZSB0aGUgdW5kb2N1bWVudGVkIENXTV9TRVRQQVRICiAqICB0aGUgYWxsb2NhdGVkIG1lbW9yeSBjb250YWlucyBhIHBpZGwKICovCkhHTE9CQUwgV0lOQVBJIFNIQWxsb2NTaGFyZWQoTFBWT0lEIHBzcmMsIERXT1JEIHNpemUsIERXT1JEIHByb2NJRCkKewlIR0xPQkFMIGhtZW07CglMUFZPSUQgcG1lbTsKCQoJVFJBQ0UoInB0cj0lcCBzaXplPTB4JTA0bHggcHJvY0lEPTB4JTA0bHhcbiIscHNyYyxzaXplLHByb2NJRCk7CglobWVtID0gR2xvYmFsQWxsb2MoR01FTV9GSVhFRCwgc2l6ZSk7CglpZiAoIWhtZW0pCgkgIHJldHVybiAwOwoJCglwbWVtID0gIEdsb2JhbExvY2sgKGhtZW0pOwoKCWlmICghIHBtZW0pCgkgIHJldHVybiAwOwoJICAKCW1lbWNweSAocG1lbSwgcHNyYywgc2l6ZSk7CglHbG9iYWxVbmxvY2soaG1lbSk7IAoJcmV0dXJuIGhtZW07Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2NrU2hhcmVkCQkJCQlbU0hFTEwzMi41MjFdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKiAgdGhlIHJlY2VpdmVyIG9mIChXTV9VU0VSKzIpIHRyeXMgdG8gbG9jayB0aGUgSEFORExFICg/KSAKICogIHRoZSByZXR1cm52YWx1ZSBzZWVtcyB0byBiZSBhIG1lbW9yeWFkcmVzcwogKi8KTFBWT0lEIFdJTkFQSSBTSExvY2tTaGFyZWQoSEFORExFIGhtZW0sIERXT1JEIHByb2NJRCkKewlUUkFDRSgiaGFuZGxlPTB4JTA0eCBwcm9jSUQ9MHglMDRseFxuIixobWVtLHByb2NJRCk7CglyZXR1cm4gR2xvYmFsTG9jayhobWVtKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFVubG9ja1NoYXJlZAkJCQlbU0hFTEwzMi41MjJdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNITG9ja1NoYXJlZAogKi8KQk9PTCBXSU5BUEkgU0hVbmxvY2tTaGFyZWQoTFBWT0lEIHB2KQp7CglUUkFDRSgiJXBcbiIscHYpOwoJcmV0dXJuIEdsb2JhbFVubG9jaygoSEFORExFKXB2KTsgCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlU2hhcmVkCQkJCQlbU0hFTEwzMi41MjNdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKi8KQk9PTCBXSU5BUEkgU0hGcmVlU2hhcmVkKAoJSEFORExFIGhNZW0sCglEV09SRCBwaWQpCnsKCVRSQUNFKCJoYW5kbGU9MHglMDR4IDB4JTA0bHhcbiIsaE1lbSxwaWQpOwoJcmV0dXJuIEdsb2JhbEZyZWUoaE1lbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNldEFwcFN0YXJ0aW5nQ3Vyc29yCQkJCVtTSEVMTDMyLjk5XQogKi8KSFJFU1VMVCBXSU5BUEkgU2V0QXBwU3RhcnRpbmdDdXJzb3IoSFdORCB1LCBEV09SRCB2KQp7CUZJWE1FKCJod25kPTB4JTA0eCAweCUwNGx4IHN0dWJcbiIsdSx2ICk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvYWRPTEUJCQkJCVtTSEVMTDMyLjE1MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNITG9hZE9MRShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gU19PSzsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEcml2ZVR5cGUJCQkJCVtTSEVMTDMyLjY0XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRHJpdmVUeXBlKERXT1JEIHUpCnsJRklYTUUoIjB4JTA0bHggc3R1YlxuIix1KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWJvcnRJbnZva2VDb21tYW5kCQkJCVtTSEVMTDMyLjE5OF0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIQWJvcnRJbnZva2VDb21tYW5kKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIDE7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3gJCQlbU0hFTEwzMi4xMjZdCiAqCiAqLwppbnQgV0lOQVBJIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94KAoJSFdORCBod25kT3duZXIsCglMUENTVFIgbHBDYXB0aW9uLAoJVUlOVCB1VHlwZSkKewoJRklYTUUoIjB4JTA0eCAlcyAweCUwOHggc3R1YlxuIixod25kT3duZXIsIGxwQ2FwdGlvbiwgdVR5cGUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGbHVzaENsaXBib2FyZAkJCQlbU0hFTEwzMi4xMjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZsdXNoQ2xpcGJvYXJkKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIV2FpdEZvckZpbGVUb09wZW4JCQkJW1NIRUxMMzIuOTddCiAqCiAqLwpCT09MIFdJTkFQSSBTSFdhaXRGb3JGaWxlVG9PcGVuKAoJTFBDSVRFTUlETElTVCBwaWRsLCAKCURXT1JEIGR3RmxhZ3MsCglEV09SRCBkd1RpbWVvdXQpCnsKCUZJWE1FKCIlcCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIiwgcGlkbCwgZHdGbGFncywgZHdUaW1lb3V0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTAkJCVtTSEVMTDMyLjhdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBDb250cm9sX0ZpbGxDYWNoZV9SdW5ETEwoSFdORCBoV25kLCBIQU5ETEUgaE1vZHVsZSwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRSgiMHglMDR4IDB4JTA0eCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIixoV25kLCBoTW9kdWxlLHcseCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5ETExfQ2FsbEVudHJ5MTYJCQkJW1NIRUxMMzIuMTIyXQogKiB0aGUgbmFtZSBpcyBwcm9wYWJseSB3cm9uZwogKi8KSFJFU1VMVCBXSU5BUEkgUnVuRExMX0NhbGxFbnRyeTE2KERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHYsdyx4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglzaGVsbDMyXzY1NAkJCQlbU0hFTEwzMi42NTRdCiAqCiAqIE5PVEVTOiBmaXJzdCBwYXJhbWV0ZXIgc2VlbXMgdG8gYmUgYSBwb2ludGVyIChzYW1lIGFzIHBhc3NlZCB0byBXcml0ZUNhYmluZXRTdGF0ZSkKICogc2Vjb25kIG9uZSBjb3VsZCBiZSBhIHNpemUgKDB4MGMpLiBUaGUgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RydWN0dXJlIHNhdmVkIHRvCiAqIEhDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxDYWJpbmV0U3RhdGUKICogSSdtIChqcykgZ3Vlc3Npbmc6IHRoaXMgb25lIGlzIGp1c3QgUmVhZENhYmluZXRTdGF0ZSA7LSkKICovCkhSRVNVTFQgV0lOQVBJIHNoZWxsMzJfNjU0IChEV09SRCB4LCBEV09SRCB5KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUkxCdWlsZExpc3RPZlBhdGhzCQkJW1NIRUxMMzIuMTQ2XQogKgogKiBOT1RFUwogKiAgIGJ1aWxkcyBhIERQQQogKi8KRFdPUkQgV0lOQVBJIFJMQnVpbGRMaXN0T2ZQYXRocyAodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNIVmFsaWRhdGVVTkMJCQkJW1NIRUxMMzIuMTczXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hWYWxpZGF0ZVVOQyAoRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikKewoJRklYTUUoIjB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx5LHopOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0QQkJCVtTSEVMTDMyLjEyMjJdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RBKExQU1RSIHgsIExQU1RSIHkpCnsKCUZJWE1FKCIoJXMsICVzKSBzdHViXG4iLCBkZWJ1Z3N0cl9hKHgpLCBkZWJ1Z3N0cl9hKHkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURvRW52aXJvbm1lbnRTdWJzdFcJCQlbU0hFTEwzMi4xMjIzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0VyhMUFdTVFIgeCwgTFBXU1RSIHkpCnsKCUZJWE1FKCIoJXMsICVzKTogc3R1YlxuIiwgZGVidWdzdHJfdyh4KSwgZGVidWdzdHJfdyh5KSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3QJCQlbU0hFTEwzMi41M10KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdEFXKExQVk9JRCB4LCBMUFZPSUQgeSkKewoJaWYgKFNIRUxMX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBEb0Vudmlyb25tZW50U3Vic3RXKHgsIHkpOwoJcmV0dXJuIERvRW52aXJvbm1lbnRTdWJzdEEoeCwgeSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgc2hlbGwzMl8yNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjI0M10KICogCiAqIFdpbjk4KyBieS1vcmRpbmFsIHJvdXRpbmUuICBJbiBXaW45OCB0aGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvIGFuZAogKiBkb2VzIG5vdGhpbmcgZWxzZS4gIFBvc3NpYmx5IHRoaXMgZG9lcyBzb21ldGhpbmcgaW4gTlQgb3IgU0hFTEwzMiA1LjA/CiAqCiAqLwoKQk9PTCBXSU5BUEkgc2hlbGwzMl8yNDMoRFdPUkQgYSwgRFdPUkQgYikgCnsgCiAgcmV0dXJuIEZBTFNFOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSEVMTDMyXzcxNAlbU0hFTEwzMl0KICovCkRXT1JEIFdJTkFQSSBTSEVMTDMyXzcxNChMUFZPSUQgeCkKewogCUZJWE1FKCIoJXMpc3R1YlxuIiwgZGVidWdzdHJfdyh4KSk7CglyZXR1cm4gMDsKfQo=