LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgImhlYXAuaCIKCiNpbmNsdWRlICJ3aW5lL29ial9iYXNlLmgiCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAic2hsZ3VpZC5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKI2luY2x1ZGUgInVuZG9jc2hlbGwuaCIKI2luY2x1ZGUgInBpZGwuaCIKI2luY2x1ZGUgInNobHdhcGkuaCIKI2luY2x1ZGUgImNvbW1kbGcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHNoZWxsKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwocGlkbCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkQQkJCQkJW2ludGVybmFsXQogKgogKiBjb3BpZXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICogCiAqIGZpcnN0IGZpZWxkIGlzIG5GaWVsZCA9IDEKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQSgKCUxQQ1NUUiBzcmMsCglEV09SRCBuRmllbGQsCglMUFNUUiBkc3QsCglEV09SRCBsZW4pIAp7CglXQVJOKCIoJXMsMHglMDhseCwlcCwlbGQpIHNlbWktc3R1Yi5cbiIsZGVidWdzdHJfYShzcmMpLG5GaWVsZCxkc3QsbGVuKTsKCglpZiAoIXNyYyB8fCAhc3JjWzBdIHx8ICFkc3QgfHwgIWxlbikKCSAgcmV0dXJuIDA7CgoJLyogc2tpcCBuIGZpZWxkcyBkZWxpbWl0ZWQgYnkgJywnICovCgl3aGlsZSAobkZpZWxkID4gMSkKCXsKCSAgaWYgKCpzcmM9PSdcMCcpIHJldHVybiBGQUxTRTsKCSAgaWYgKCooc3JjKyspPT0nLCcpIG5GaWVsZC0tOwoJfQoKCS8qIGNvcHkgcGFydCB0aWxsIHRoZSBuZXh0ICcsJyB0byBkc3QgKi8KCXdoaWxlICggKnNyYyE9J1wwJyAmJiAqc3JjIT0nLCcgJiYgKGxlbi0tKT4wICkgKihkc3QrKyk9KihzcmMrKyk7CgkKCS8qIGZpbmFsaXplIHRoZSBzdHJpbmcgKi8KCSpkc3Q9MHgwOwoJCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZFcJCQlbaW50ZXJuYWxdCiAqCiAqIGNvcGllcyBhIGZpZWxkIGZyb20gYSAnLCcgZGVsaW1pdGVkIHN0cmluZwogKiAKICogZmlyc3QgZmllbGQgaXMgbkZpZWxkID0gMQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRXKExQQ1dTVFIgc3JjLCBEV09SRCBuRmllbGQsIExQV1NUUiBkc3QsIERXT1JEIGxlbikgCnsKCUZJWE1FKCIoJXMsMHglMDhseCwlcCwlbGQpIHN0dWJcbiIsCgkgIGRlYnVnc3RyX3coc3JjKSwgbkZpZWxkLCBkc3QsIGxlbik7CglyZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGQJCQlbU0hFTEwzMi41OF0KICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQVcoTFBDVk9JRCBzcmMsIERXT1JEIG5GaWVsZCwgTFBWT0lEIGRzdCwgRFdPUkQgbGVuKSAKewoJaWYgKFNIRUxMX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBQYXJzZUZpZWxkVyhzcmMsIG5GaWVsZCwgZHN0LCBsZW4pOwoJcmV0dXJuIFBhcnNlRmllbGRBKHNyYywgbkZpZWxkLCBkc3QsIGxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldEZpbGVOYW1lRnJvbUJyb3dzZQkJCVtTSEVMTDMyLjYzXQogKiAKICovCkJPT0wgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZSgKCUhXTkQgaHduZE93bmVyLAoJTFBTVFIgbHBzdHJGaWxlLAoJRFdPUkQgbk1heEZpbGUsCglMUENTVFIgbHBzdHJJbml0aWFsRGlyLAoJTFBDU1RSIGxwc3RyRGVmRXh0LAoJTFBDU1RSIGxwc3RyRmlsdGVyLAoJTFBDU1RSIGxwc3RyVGl0bGUpCnsKICAgIEhNT0RVTEUgaG1vZHVsZTsKICAgIEZBUlBST0MgcEdldE9wZW5GaWxlTmFtZUE7CiAgICBPUEVORklMRU5BTUVBIG9mbjsKICAgIEJPT0wgcmV0OwoKICAgIFRSQUNFKCIlMDR4LCAlcywgJWxkLCAlcywgJXMsICVzLCAlcylcbiIsCgkgIGh3bmRPd25lciwgbHBzdHJGaWxlLCBuTWF4RmlsZSwgbHBzdHJJbml0aWFsRGlyLCBscHN0ckRlZkV4dCwKCSAgbHBzdHJGaWx0ZXIsIGxwc3RyVGl0bGUpOwoKICAgIGhtb2R1bGUgPSBMb2FkTGlicmFyeUEoImNvbWRsZzMyLmRsbCIpOwogICAgaWYoIWhtb2R1bGUpIHJldHVybiBGQUxTRTsKICAgIHBHZXRPcGVuRmlsZU5hbWVBID0gR2V0UHJvY0FkZHJlc3MoaG1vZHVsZSwgIkdldE9wZW5GaWxlTmFtZUEiKTsKICAgIGlmKCFwR2V0T3BlbkZpbGVOYW1lQSkKICAgIHsKCUZyZWVMaWJyYXJ5KGhtb2R1bGUpOwoJcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIG1lbXNldCgmb2ZuLCAwLCBzaXplb2Yob2ZuKSk7CgogICAgb2ZuLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKG9mbik7CiAgICBvZm4uaHduZE93bmVyID0gaHduZE93bmVyOwogICAgb2ZuLmxwc3RyRmlsdGVyID0gbHBzdHJGaWx0ZXI7CiAgICBvZm4ubHBzdHJGaWxlID0gbHBzdHJGaWxlOwogICAgb2ZuLm5NYXhGaWxlID0gbk1heEZpbGU7CiAgICBvZm4ubHBzdHJJbml0aWFsRGlyID0gbHBzdHJJbml0aWFsRGlyOwogICAgb2ZuLmxwc3RyVGl0bGUgPSBscHN0clRpdGxlOwogICAgb2ZuLmxwc3RyRGVmRXh0ID0gbHBzdHJEZWZFeHQ7CiAgICBvZm4uRmxhZ3MgPSBPRk5fRVhQTE9SRVIgfCBPRk5fSElERVJFQURPTkxZIHwgT0ZOX0ZJTEVNVVNURVhJU1Q7CiAgICByZXQgPSBwR2V0T3BlbkZpbGVOYW1lQSgmb2ZuKTsKICAgIAogICAgRnJlZUxpYnJhcnkoaG1vZHVsZSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNldFNldHRpbmdzCQkJCVtTSEVMTDMyLjY4XQogKi8KVk9JRCBXSU5BUEkgU0hHZXRTZXRTZXR0aW5ncyhEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CglGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHhcbiIsIHgsIHksIHopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNldHRpbmdzCQkJCVtTSEVMTDMyLkBdCiAqIAogKiBOT1RFUwogKiAgdGhlIHJlZ2lzdHJ5IHBhdGggYXJlIGZvciB3aW45OCAodGVzdGVkKQogKiAgYW5kIHBvc3NpYmx5IGFyZSB0aGUgc2FtZSBpbiBudDQwCiAqCiAqLwpWT0lEIFdJTkFQSSBTSEdldFNldHRpbmdzKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzaykKewoJSEtFWQloS2V5OwoJRFdPUkQJZHdEYXRhOwoJRFdPUkQJZHdEYXRhU2l6ZSA9IHNpemVvZiAoRFdPUkQpOwoKCVRSQUNFKCIoJXAgMHglMDhseClcbiIsbHBzZnMsZHdNYXNrKTsKCQoJaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcQWR2YW5jZWQiLAoJCQkJIDAsIDAsIDAsIEtFWV9BTExfQUNDRVNTLCAwLCAmaEtleSwgMCkpCgkgIHJldHVybjsKCQoJaWYgKCAoU1NGX1NIT1dFWFRFTlNJT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUZpbGVFeHQiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93RXh0ZW5zaW9ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dJTkZPVElQICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0luZm9UaXAiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93SW5mb1RpcCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0RPTlRQUkVUVFlQQVRIICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiRG9udFByZXR0eVBhdGgiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZEb250UHJldHR5UGF0aCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0hJREVJQ09OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVJY29ucyIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkhpZGVJY29ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX01BUE5FVERSVkJVVFRPTiAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIk1hcE5ldERydkJ0biIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+Zk1hcE5ldERydkJ0biAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dBVFRSSUJDT0wgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93QXR0cmliQ29sIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0F0dHJpYkNvbCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCgoU1NGX1NIT1dBTExPQkpFQ1RTIHwgU1NGX1NIT1dTWVNGSUxFUykgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRkZW4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCXsgaWYgKGR3RGF0YSA9PSAwKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMSkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDE7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDIpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAxOwoJICB9Cgl9CglSZWdDbG9zZUtleSAoaEtleSk7CgoJVFJBQ0UoIi0tIDB4JTA0eFxuIiwgKihXT1JEKilscHNmcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UJCQlbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoCglIV05EIGh3bmRDYWJpbmV0LCAKCURXT1JEIGR3TWVzc2FnZSwKCURXT1JEIGR3UGFyYW0pCnsKCUZJWE1FKCIlMDR4ICUwOGx4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsIGR3TWVzc2FnZSwgZHdQYXJhbSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sJCQkJW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpCT09MIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vaygKCUhXTkQgaFduZCwKCURXT1JEIGR3VHlwZSkKewoJRklYTUUoIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaFduZCwgZHdUeXBlKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsTWVzc2FnZUJveFcJCQkJW1NIRUxMMzIuMTgyXQogKgogKiBGb3JtYXQgYW5kIG91dHB1dCBlcnJvcm1lc3NhZ2UuCiAqCiAqIGlkVGV4dAlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKiBpZFRpdGxlCXJlc291cmNlIElEIG9mIHRpdGxlIG9yIExQU1RSCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwppbnQgV0lOQVBJViBTaGVsbE1lc3NhZ2VCb3hXKAoJSElOU1RBTkNFIGhJbnN0YW5jZSwKCUhXTkQgaFduZCwKCUxQQ1dTVFIgbHBUZXh0LAoJTFBDV1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CglXQ0hBUglzelRleHRbMTAwXSxzelRpdGxlWzEwMF07CglMUENXU1RSIHBzelRleHQgPSBzelRleHQsIHBzelRpdGxlID0gc3pUaXRsZSwgcHN6VGVtcDsKCXZhX2xpc3QgYXJnczsKCWludAlyZXQ7CgoJdmFfc3RhcnQoYXJncywgdVR5cGUpOwoJLyogd3ZzcHJpbnRmQShidWYsZm10LCBhcmdzKTsgKi8KCglUUkFDRSgiKCUwOGx4LCUwOGx4LCVwLCVwLCUwOHgpXG4iLAoJKERXT1JEKWhJbnN0YW5jZSwoRFdPUkQpaFduZCxscFRleHQsbHBDYXB0aW9uLHVUeXBlKTsKCglpZiAoIUhJV09SRChscENhcHRpb24pKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscENhcHRpb24sIHN6VGl0bGUsIHNpemVvZihzelRpdGxlKS9zaXplb2Yoc3pUaXRsZVswXSkpOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgc2l6ZW9mKHN6VGV4dCkvc2l6ZW9mKHN6VGV4dFswXSkpOwoJZWxzZQoJICBwc3pUZXh0ID0gbHBUZXh0OwoKCUZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HLCAKCQkgICAgICAgcHN6VGV4dCwgMCwgMCwgKExQV1NUUikmcHN6VGVtcCwgMCwgJmFyZ3MpOwoKCXZhX2VuZChhcmdzKTsKCglyZXQgPSBNZXNzYWdlQm94VyhoV25kLHBzelRlbXAscHN6VGl0bGUsdVR5cGUpOwoJTG9jYWxGcmVlKChITE9DQUwpcHN6VGVtcCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCmludCBXSU5BUElWIFNoZWxsTWVzc2FnZUJveEEoCglISU5TVEFOQ0UgaEluc3RhbmNlLAoJSFdORCBoV25kLAoJTFBDU1RSIGxwVGV4dCwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CgljaGFyCXN6VGV4dFsxMDBdLHN6VGl0bGVbMTAwXTsKCUxQQ1NUUiAgcHN6VGV4dCA9IHN6VGV4dCwgcHN6VGl0bGUgPSBzelRpdGxlLCBwc3pUZW1wOwoJdmFfbGlzdCBhcmdzOwoJaW50CXJldDsKCgl2YV9zdGFydChhcmdzLCB1VHlwZSk7CgkvKiB3dnNwcmludGZBKGJ1ZixmbXQsIGFyZ3MpOyAqLwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJXAsJXAsJTA4eClcbiIsCgkoRFdPUkQpaEluc3RhbmNlLChEV09SRCloV25kLGxwVGV4dCxscENhcHRpb24sdVR5cGUpOwoKCWlmICghSElXT1JEKGxwQ2FwdGlvbikpCgkgIExvYWRTdHJpbmdBKGhJbnN0YW5jZSwgKERXT1JEKWxwQ2FwdGlvbiwgc3pUaXRsZSwgc2l6ZW9mKHN6VGl0bGUpKTsKCWVsc2UKCSAgcHN6VGl0bGUgPSBscENhcHRpb247CgoJaWYgKCFISVdPUkQobHBUZXh0KSkKCSAgTG9hZFN0cmluZ0EoaEluc3RhbmNlLCAoRFdPUkQpbHBUZXh0LCBzelRleHQsIHNpemVvZihzelRleHQpKTsKCWVsc2UKCSAgcHN6VGV4dCA9IGxwVGV4dDsKCglGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORywgCgkJICAgICAgIHBzelRleHQsIDAsIDAsIChMUFNUUikmcHN6VGVtcCwgMCwgJmFyZ3MpOwoKCXZhX2VuZChhcmdzKTsKCglyZXQgPSBNZXNzYWdlQm94QShoV25kLHBzelRlbXAscHN6VGl0bGUsdVR5cGUpOwoJTG9jYWxGcmVlKChITE9DQUwpcHN6VGVtcCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWUJCQkJCVtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KI2RlZmluZSBNRU1fREVCVUcgMAp2b2lkIFdJTkFQSSBTSEZyZWUoTFBWT0lEIHgpIAp7CiNpZiBNRU1fREVCVUcKCVdPUkQgbGVuID0gKihMUFdPUkQpKChMUEJZVEUpeC0yKTsKCglpZiAoICooTFBXT1JEKSgoTFBCWVRFKXgrbGVuKSAhPSAweDczODQpCgkgIEVSUigiTUFHSUMyIVxuIik7CgoJaWYgKCAoKihMUFdPUkQpKChMUEJZVEUpeC00KSkgIT0gMHg4MjcxKQoJICBFUlIoIk1BR0lDMSFcbiIpOwoJZWxzZQoJICBtZW1zZXQoKExQQllURSl4LTQsIDB4ZGUsIGxlbis2KTsKCglUUkFDRSgiJXAgbGVuPSV1XG4iLHgsIGxlbik7CgoJeCA9IChMUEJZVEUpIHggLSA0OwojZWxzZQoJVFJBQ0UoIiVwXG4iLHgpOwojZW5kaWYKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jCQkJCQlbU0hFTEwzMi4xOTZdCiAqCiAqIE5PVEVTCiAqICAgICB2b2lkICp0YXNrX2FsbG9jKERXT1JEIGxlbiksIHVzZXMgU0hNYWxsb2MgYWxsb2NhdG9yCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUFZPSUQgV0lOQVBJIFNIQWxsb2MoRFdPUkQgbGVuKSAKewoJTFBCWVRFIHJldDsKCiNpZiBNRU1fREVCVUcKCXJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKzYpOwojZWxzZQoJcmV0ID0gKExQVk9JRCkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwojZW5kaWYKCiNpZiBNRU1fREVCVUcKCSooTFBXT1JEKShyZXQpID0gMHg4MjcxOwoJKihMUFdPUkQpKHJldCsyKSA9IChXT1JEKWxlbjsKCSooTFBXT1JEKShyZXQrNCtsZW4pID0gMHg3Mzg0OwoJcmV0ICs9IDQ7CgltZW1zZXQocmV0LCAweGRmLCBsZW4pOwojZW5kaWYKCVRSQUNFKCIlbHUgYnl0ZXMgYXQgJXBcbiIsbGVuLCByZXQpOwoJcmV0dXJuIChMUFZPSUQpcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ2lzdGVyRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODZdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ2lzdGVyRHJhZ0Ryb3AoCglIV05EIGhXbmQsCglMUERST1BUQVJHRVQgcERyb3BUYXJnZXQpCnsKCUZJWE1FKCIoMHglMDh4LCVwKTpzdHViLlxuIiwgaFduZCwgcERyb3BUYXJnZXQpOwoJaWYgKEdldFNoZWxsT2xlKCkpIHJldHVybiBwUmVnaXN0ZXJEcmFnRHJvcChoV25kLCBwRHJvcFRhcmdldCk7CiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmV2b2tlRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJldm9rZURyYWdEcm9wKEhXTkQgaFduZCkKewogICAgRklYTUUoIigweCUwOHgpOnN0dWIuXG4iLGhXbmQpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRG9EcmFnRHJvcAkJCQkJW1NIRUxMMzIuODhdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpIUkVTVUxUIFdJTkFQSSBTSERvRHJhZ0Ryb3AoCglIV05EIGhXbmQsCglMUERBVEFPQkpFQ1QgbHBEYXRhT2JqZWN0LAoJTFBEUk9QU09VUkNFIGxwRHJvcFNvdXJjZSwKCURXT1JEIGR3T0tFZmZlY3QsCglMUERXT1JEIHBkd0VmZmVjdCkKewogICAgRklYTUUoIigweCUwNHggJXAgJXAgMHglMDhseCAlcCk6c3R1Yi5cbiIsCiAgICBoV25kLCBscERhdGFPYmplY3QsIGxwRHJvcFNvdXJjZSwgZHdPS0VmZmVjdCwgcGR3RWZmZWN0KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cwkJCQlbU0hFTEwzMi4xODRdCiAqIAogKi8KV09SRCBXSU5BUEkgQXJyYW5nZVdpbmRvd3MoCglIV05EIGh3bmRQYXJlbnQsCglEV09SRCBkd1Jlc2VydmVkLAoJTFBDUkVDVCBscFJlY3QsCglXT1JEIGNLaWRzLAoJQ09OU1QgSFdORCAqIGxwS2lkcykKewogICAgRklYTUUoIigweCUwOHggMHglMDhseCAlcCAweCUwNHggJXApOnN0dWIuXG4iLAoJICAgaHduZFBhcmVudCwgZHdSZXNlcnZlZCwgbHBSZWN0LCBjS2lkcywgbHBLaWRzKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaWduYWxGaWxlT3BlbgkJCQlbU0hFTEwzMi4xMDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU2lnbmFsRmlsZU9wZW4gKERXT1JEIGR3UGFyYW0xKQp7CiAgICBGSVhNRSgiKDB4JTA4bHgpOnN0dWIuXG4iLCBkd1BhcmFtMSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQUREX2dldF9wb2xpY3kgLSBoZWxwZXIgZnVuY3Rpb24gZm9yIFNIQWRkVG9SZWNlbnREb2NzCiAqCiAqIFBBUkFNRVRFUlMKICogICBwb2xpY3kgICAgW0lOXSAgcG9saWN5IG5hbWUgKG51bGwgdGVybWVkIHN0cmluZykgdG8gZmluZAogKiAgIHR5cGUgICAgICBbT1VUXSBwdHIgdG8gRFdPUkQgdG8gcmVjZWl2ZSB0eXBlCiAqICAgYnVmZmVyICAgIFtPVVRdIHB0ciB0byBhcmVhIHRvIGhvbGQgZGF0YSByZXRyaWV2ZWQKICogICBsZW4gICAgICAgW0lOL09VVF0gcHRyIHRvIERXT1JEIGhvbGRpbmcgc2l6ZSBvZiBidWZmZXIgYW5kIGdldHRpbmcKICogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGZpbGxlZAogKgogKiBSRVRVUk5TCiAqICAgcmVzdWx0IG9mIHRoZSBTSFF1ZXJ5VmFsdWVFeCBjYWxsCiAqLwpzdGF0aWMgSU5UIFNIQUREX2dldF9wb2xpY3koTFBTVFIgcG9saWN5LCBMUERXT1JEIHR5cGUsIExQVk9JRCBidWZmZXIsIExQRFdPUkQgbGVuKQp7CiAgICBIS0VZIFBvbGljeV9iYXNla2V5OwogICAgSU5UIHJldDsKCiAgICAvKiBHZXQgdGhlIGtleSBmb3IgdGhlIHBvbGljaWVzIGxvY2F0aW9uIGluIHRoZSByZWdpc3RyeSAKICAgICAqLwogICAgaWYgKFJlZ09wZW5LZXlFeEEoSEtFWV9MT0NBTF9NQUNISU5FLAoJCSAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXNcXEV4cGxvcmVyIiwKCQkgICAgICAwLCBLRVlfUkVBRCwgJlBvbGljeV9iYXNla2V5KSkgewoKCWlmIChSZWdPcGVuS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLAoJCQkgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXNcXEV4cGxvcmVyIiwKCQkJICAwLCBLRVlfUkVBRCwgJlBvbGljeV9iYXNla2V5KSkgewoJICAgIFRSQUNFKCJObyBFeHBsb3JlciBQb2xpY2llcyBsb2NhdGlvbiBleGlzdHMuIFBvbGljeSB3YW50ZWQ9JXNcbiIsCgkJICBwb2xpY3kpOwoJICAgICpsZW4gPSAwOwoJICAgIHJldHVybiBFUlJPUl9GSUxFX05PVF9GT1VORDsKCX0KICAgIH0KCiAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBpZiBpdCBleGlzdHMKICAgICAqLwogICAgcmV0ID0gU0hRdWVyeVZhbHVlRXhBKFBvbGljeV9iYXNla2V5LCBwb2xpY3ksIDAsIHR5cGUsIGJ1ZmZlciwgbGVuKTsKICAgIFJlZ0Nsb3NlS2V5KFBvbGljeV9iYXNla2V5KTsKICAgIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFERF9jb21wYXJlX21ydSAtIGhlbHBlciBmdW5jdGlvbiBmb3IgU0hBZGRUb1JlY2VudERvY3MKICoKICogUEFSQU1FVEVSUwogKiAgIGRhdGExICAgICBbSU5dIGRhdGEgYmVpbmcgbG9va2VkIGZvcgogKiAgIGRhdGEyICAgICBbSU5dIGRhdGEgaW4gTVJVCiAqICAgY2JkYXRhICAgIFtJTl0gbGVuZ3RoIGZyb20gRmluZE1SVURhdGEgY2FsbCAobm90IHVzZWQpCiAqCiAqIFJFVFVSTlMKICogICBwb3NpdGlvbiB3aXRoaW4gTVJVIGxpc3QgdGhhdCBkYXRhIHdhcyBhZGRlZC4KICovCnN0YXRpYyBJTlQgQ0FMTEJBQ0sgU0hBRERfY29tcGFyZV9tcnUoTFBDVk9JRCBkYXRhMSwgTFBDVk9JRCBkYXRhMiwgRFdPUkQgY2JEYXRhKQp7CiAgICByZXR1cm4gbHN0cmNtcGlBKGRhdGExLCBkYXRhMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEgLSBoZWxwZXIgZnVuY3Rpb24gZm9yIFNIQWRkVG9SZWNlbnREb2NzCiAqCiAqIFBBUkFNRVRFUlMKICogICBtcnVoYW5kbGUgICAgW0lOXSBoYW5kbGUgZm9yIGNyZWF0ZWQgTVJVIGxpc3QKICogICBkb2NfbmFtZSAgICAgW0lOXSBudWxsIHRlcm1lZCBwdXJlIGRvYyBuYW1lCiAqICAgbmV3X2xua19uYW1lIFtJTl0gbnVsbCB0ZXJtZWQgcGF0aCBhbmQgZmlsZSBuYW1lIGZvciAubG5rIGZpbGUKICogICBidWZmZXIgICAgICAgW0lOL09VVF0gMjA0OCBieXRlIGFyZWEgdG8gY29uc3R1cmN0IE1SVSBkYXRhCiAqICAgbGVuICAgICAgICAgIFtPVVRdIHB0ciB0byBpbnQgdG8gcmVjZWl2ZSBzcGFjZSB1c2VkIGluIGJ1ZmZlcgogKgogKiBSRVRVUk5TCiAqICAgcG9zaXRpb24gd2l0aGluIE1SVSBsaXN0IHRoYXQgZGF0YSB3YXMgYWRkZWQuCiAqLwpzdGF0aWMgSU5UIFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEoSEFORExFIG1ydWhhbmRsZSwgTFBTVFIgZG9jX25hbWUsIExQU1RSIG5ld19sbmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UICpsZW4pCnsKICAgIExQU1RSIHB0cjsKICAgIElOVCB3bGVuOwogICAgCiAgICAvKkZJWE1FOiBEb2N1bWVudDoKICAgICAqICBSZWNlbnREb2NzIE1SVSBkYXRhIHN0cnVjdHVyZSBzZWVtcyB0byBiZToKICAgICAqICAgICswaCAgIGRvY3VtZW50IGZpbGUgbmFtZSB3LyB0ZXJtaW5hdGluZyAwaAogICAgICogICAgK25oICAgc2hvcnQgaW50IHcvIHNpemUgb2YgcmVtYWluaW5nCiAgICAgKiAgICArbisyaCAwMmggMzBoLCBvciAwMWggMzBoLCBvciAwMGggMzBoICAtICB1bmtub3duIAogICAgICogICAgK24rNGggMTAgYnl0ZXMgemVyb3MgIC0gICB1bmtub3duCiAgICAgKiAgICArbitlaCBzaG9ydGN1dCBmaWxlIG5hbWUgdy8gdGVybWluYXRpbmcgMGgKICAgICAqICAgICtuK2UrbmggMyB6ZXJvIGJ5dGVzICAtICB1bmtub3duCiAgICAgKi8KCiAgICAvKiBDcmVhdGUgdGhlIE1SVSBkYXRhIHN0cnVjdHVyZSBmb3IgIlJlY2VudERvY3MiCgkgKi8KICAgIHB0ciA9IGJ1ZmZlcjsKICAgIGxzdHJjcHlBKHB0ciwgZG9jX25hbWUpOwogICAgcHRyICs9IChsc3RybGVuQShidWZmZXIpICsgMSk7CiAgICB3bGVuPSBsc3RybGVuQShuZXdfbG5rX25hbWUpICsgMSArIDEyOwogICAgKigoc2hvcnQgaW50KilwdHIpID0gd2xlbjsKICAgIHB0ciArPSAyOyAgIC8qIHN0ZXAgcGFzdCB0aGUgbGVuZ3RoICovCiAgICAqKHB0cisrKSA9IDB4MzA7ICAvKiB1bmtub3duIHJlYXNvbiAqLwogICAgKihwdHIrKykgPSAwOyAgICAgLyogdW5rbm93biwgYnV0IGNhbiBiZSAweDAwLCAweDAxLCAweDAyICovCiAgICBtZW1zZXQocHRyLCAwLCAxMCk7CiAgICBwdHIgKz0gMTA7CiAgICBsc3RyY3B5QShwdHIsIG5ld19sbmtfbmFtZSk7CiAgICBwdHIgKz0gKGxzdHJsZW5BKG5ld19sbmtfbmFtZSkgKyAxKTsKICAgIG1lbXNldChwdHIsIDAsIDMpOwogICAgcHRyICs9IDM7CiAgICAqbGVuID0gcHRyIC0gYnVmZmVyOwoKICAgIC8qIEFkZCB0aGUgbmV3IGVudHJ5IGludG8gdGhlIE1SVSBsaXN0IAogICAgICovCiAgICByZXR1cm4gcEFkZE1SVURhdGEobXJ1aGFuZGxlLCAoTFBDVk9JRClidWZmZXIsICpsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFkZFRvUmVjZW50RG9jcwkJCQlbU0hFTEwzMi5AXQogKgogKiBQQVJBTUVURVJTCiAqICAgdUZsYWdzICBbSU5dIFNIQVJEX1BBVEggb3IgU0hBUkRfUElETAogKiAgIHB2ICAgICAgW0lOXSBzdHJpbmcgb3IgcGlkbCwgTlVMTCBjbGVhcnMgdGhlIGxpc3QKICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICoKICogRklYTUU6ID8/IE1TRE4gc2hvd3MgdGhpcyBhcyBhIFZPSUQKICovCkRXT1JEIFdJTkFQSSBTSEFkZFRvUmVjZW50RG9jcyAoVUlOVCB1RmxhZ3MsTFBDVk9JRCBwdikgICAKewoKLyogRklYTUU6ICEhISBtb3ZlIENSRUFURU1SVUxJU1QgYW5kIGZsYWdzIHRvIGhlYWRlciBmaWxlICEhISAqLwovKiAgICAgICAgISEhIGl0IGlzIGluIGJvdGggaGVyZSBhbmQgY29tY3RsMzJ1bmRvYy5jICAgICAgISEhICovCnR5cGVkZWYgc3RydWN0IHRhZ0NSRUFURU1SVUxJU1QKewogICAgRFdPUkQgIGNiU2l6ZTsgICAgICAgIC8qIHNpemUgb2Ygc3RydWN0ICovCiAgICBEV09SRCAgbk1heEl0ZW1zOyAgICAgLyogbWF4IG5vLiBvZiBpdGVtcyBpbiBsaXN0ICovCiAgICBEV09SRCAgZHdGbGFnczsgICAgICAgLyogc2VlIGJlbG93ICovCiAgICBIS0VZICAgaEtleTsgICAgICAgICAgLyogcm9vdCByZWcuIGtleSB1bmRlciB3aGljaCBsaXN0IGlzIHNhdmVkICovCiAgICBMUENTVFIgbHBzelN1YktleTsgICAgLyogcmVnLiBzdWJrZXkgKi8KICAgIFBST0MgICBscGZuQ29tcGFyZTsgICAvKiBpdGVtIGNvbXBhcmUgcHJvYyAqLwp9IENSRUFURU1SVUxJU1QsICpMUENSRUFURU1SVUxJU1Q7CgovKiBkd0ZsYWdzICovCiNkZWZpbmUgTVJVRl9TVFJJTkdfTElTVCAgMCAvKiBsaXN0IHdpbGwgY29udGFpbiBzdHJpbmdzICovCiNkZWZpbmUgTVJVRl9CSU5BUllfTElTVCAgMSAvKiBsaXN0IHdpbGwgY29udGFpbiBiaW5hcnkgZGF0YSAqLwojZGVmaW5lIE1SVUZfREVMQVlFRF9TQVZFIDIgLyogb25seSBzYXZlIGxpc3Qgb3JkZXIgdG8gcmVnLiBpcyBGcmVlTVJVTGlzdCAqLwoKLyogSWYgbGlzdCBpcyBhIHN0cmluZyBsaXN0IGxwZm5Db21wYXJlIGhhcyB0aGUgZm9sbG93aW5nIHByb3RvdHlwZQogKiBpbnQgQ0FMTEJBQ0sgTVJVQ29tcGFyZVN0cmluZyhMUENTVFIgczEsIExQQ1NUUiBzMikKICogZm9yIGJpbmFyeSBsaXN0cyB0aGUgcHJvdG90eXBlIGlzCiAqIGludCBDQUxMQkFDSyBNUlVDb21wYXJlQmluYXJ5KExQQ1ZPSUQgZGF0YTEsIExQQ1ZPSUQgZGF0YTIsIERXT1JEIGNiRGF0YSkKICogd2hlcmUgY2JEYXRhIGlzIHRoZSBuby4gb2YgYnl0ZXMgdG8gY29tcGFyZS4KICogTmVlZCB0byBjaGVjayB3aGF0IHJldHVybiB2YWx1ZSBtZWFucyBpZGVudGljYWwgLSAwPwogKi8KCgogICAgVUlOVCBvbGRlcnJvcm1vZGU7CiAgICBIS0VZIEhDVWJhc2VrZXk7CiAgICBDSEFSIGRvY19uYW1lW01BWF9QQVRIXTsKICAgIENIQVIgbGlua19kaXJbTUFYX1BBVEhdOwogICAgQ0hBUiBuZXdfbG5rX2ZpbGVwYXRoW01BWF9QQVRIXTsKICAgIENIQVIgbmV3X2xua19uYW1lW01BWF9QQVRIXTsKICAgIElNYWxsb2MgKnBwTTsKICAgIExQSVRFTUlETElTVCBwaWRsOwogICAgSFdORCBod25kID0gMDsgICAgICAgLyogRklYTUU6ICBnZXQgcmVhbCB3aW5kb3cgaGFuZGxlICovCiAgICBJTlQgcmV0OwogICAgRFdPUkQgZGF0YVs2NF0sIGRhdGFsZW4sIHR5cGU7CgogICAgLypGSVhNRTogRG9jdW1lbnQ6CiAgICAgKiAgUmVjZW50RG9jcyBNUlUgZGF0YSBzdHJ1Y3R1cmUgc2VlbXMgdG8gYmU6CiAgICAgKiAgICArMGggICBkb2N1bWVudCBmaWxlIG5hbWUgdy8gdGVybWluYXRpbmcgMGgKICAgICAqICAgICtuaCAgIHNob3J0IGludCB3LyBzaXplIG9mIHJlbWFpbmluZwogICAgICogICAgK24rMmggMDJoIDMwaCwgb3IgMDFoIDMwaCwgb3IgMDBoIDMwaCAgLSAgdW5rbm93biAKICAgICAqICAgICtuKzRoIDEwIGJ5dGVzIHplcm9zICAtICAgdW5rbm93bgogICAgICogICAgK24rZWggc2hvcnRjdXQgZmlsZSBuYW1lIHcvIHRlcm1pbmF0aW5nIDBoCiAgICAgKiAgICArbitlK25oIDMgemVybyBieXRlcyAgLSAgdW5rbm93bgogICAgICovCgogICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICAgKi8KICAgIGRhdGFsZW4gPSA2NDsKICAgIHJldD1TSEFERF9nZXRfcG9saWN5KCAiTm9SZWNlbnREb2NzSGlzdG9yeSIsICZ0eXBlLCAmZGF0YSwgJmRhdGFsZW4pOwogICAgaWYgKChyZXQgPiAwKSAmJiAocmV0ICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSkgewoJRVJSKCJFcnJvciAlZCBnZXR0aW5nIHBvbGljeSBcIk5vUmVjZW50RG9jc0hpc3RvcnlcIlxuIiwgcmV0KTsKCXJldHVybiAwOwogICAgfQogICAgaWYgKHJldCA9PSBFUlJPUl9TVUNDRVNTKSB7CglpZiAoISggKHR5cGUgPT0gUkVHX0RXT1JEKSB8fCAKCSAgICAgICAoKHR5cGUgPT0gUkVHX0JJTkFSWSkgJiYgKGRhdGFsZW4gPT0gNCkpICkpIHsKCSAgICBFUlIoIkVycm9yIHBvbGljeSBkYXRhIGZvciBcIk5vUmVjZW50RG9jc0hpc3RvcnlcIiBub3QgZm9ybWF0ZWQgY29ycmVjdGx5LCB0eXBlPSVsZCwgbGVuPSVsZFxuIiwKCQl0eXBlLCBkYXRhbGVuKTsKCSAgICByZXR1cm4gMDsKCX0KCglUUkFDRSgicG9saWN5IHZhbHVlIGZvciBOb1JlY2VudERvY3NIaXN0b3J5ID0gJTA4bHhcbiIsIGRhdGFbMF0pOwoJLyogbm93IHRlc3QgdGhlIGFjdHVhbCBwb2xpY3kgdmFsdWUgKi8KCWlmICggZGF0YVswXSAhPSAwKQoJICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIE9wZW4ga2V5IHRvIHdoZXJlIHRoZSBuZWNlc3NhcnkgaW5mbyBpcwogICAgICovCiAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSBkdXJpbmcgRExMIFBST0NFU1NfQVRUQUNIIChvciBUSFJFQURfQVRUQUNIKQogICAgICogICAgICAgIGFuZCB0aGUgY2xvc2Ugc2hvdWxkIGJlIGRvbmUgZHVyaW5nIHRoZSBfREVUQUNILiBUaGUgcmVzdWx0aW5nCiAgICAgKiAgICAgICAga2V5IGlzIHN0b3JlZCBpbiB0aGUgRExMIGdsb2JhbCBkYXRhLgogICAgICovCiAgICBpZiAoUmVnQ3JlYXRlS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLAoJCQkiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyIiwKCQkJMCwgMCwgMCwgS0VZX1JFQUQsIDAsICZIQ1ViYXNla2V5LCAwKSkgewoJRVJSKCJGYWlsZWQgdG8gY3JlYXRlICdTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcRXhwbG9yZXInXG4iKTsKCXJldHVybiAwOwogICAgfQoKICAgIC8qIEdldCBwYXRoIHRvIHVzZXIncyAiUmVjZW50IiBkaXJlY3RvcnkKICAgICAqLwogICAgaWYoU1VDQ0VFREVEKFNIR2V0TWFsbG9jKCZwcE0pKSkgewoJaWYgKFNVQ0NFRURFRChTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbihod25kLCBDU0lETF9SRUNFTlQsIAoJCQkJCQkgJnBpZGwpKSkgewoJICAgIFNIR2V0UGF0aEZyb21JRExpc3RBKHBpZGwsIGxpbmtfZGlyKTsKCSAgICBJTWFsbG9jX0ZyZWUocHBNLCBwaWRsKTsKCX0KCWVsc2UgewoJICAgIC8qIHNlcmlvdXMgaXNzdWVzICovCgkgICAgbGlua19kaXJbMF0gPSAwOwoJICAgIEVSUigic2VyaW91cyBpc3N1ZXMgMVxuIik7Cgl9CglJTWFsbG9jX1JlbGVhc2UocHBNKTsKICAgIH0KICAgIGVsc2UgewoJLyogc2VyaW91cyBpc3N1ZXMgKi8KCWxpbmtfZGlyWzBdID0gMDsKCUVSUigic2VyaW91cyBpc3N1ZXMgMlxuIik7CiAgICB9CiAgICBUUkFDRSgiVXNlcnMgUmVjZW50IGRpciAlc1xuIiwgbGlua19kaXIpOwoKICAgIC8qIElmIG5vIGlucHV0LCB0aGVuIGdvIGNsZWFyIHRoZSBsaXN0cyAqLwogICAgaWYgKCFwdikgewoJLyogY2xlYXIgdXNlcidzIFJlY2VudCBkaXIKCSAqLwoKCS8qIEZJWE1FOiBkZWxldGUgYWxsIGZpbGVzIGluICJsaW5rX2RpciIKCSAqCgkgKiB3aGlsZSggbW9yZSBmaWxlcyApIHsKCSAqICAgIGxzdHJjcHlBKG9sZF9sbmtfbmFtZSwgbGlua19kaXIpOwoJICogICAgUGF0aEFwcGVuZEEob2xkX2xua19uYW1lLCBmaWxlbmFtKTsKCSAqICAgIERlbGV0ZUZpbGVBKG9sZF9sbmtfbmFtZSk7CgkgKiB9CgkgKi8KCUZJWE1FKCJzaG91bGQgZGVsZXRlIGFsbCBmaWxlcyBpbiAlc1xcIFxuIiwgbGlua19kaXIpOwoKCS8qIGNsZWFyIE1SVSBsaXN0CgkgKi8KCS8qIE1TIEJ1ZyA/PyB2NC43Mi4zNjEyLjE3MDAgb2Ygc2hlbGwzMiBkb2VzIHRoZSBkZWxldGUgYWdhaW5zdAoJICogIEhLRVlfTE9DQUxfTUFDSElORSB2ZXJzaW9uIG9mIC4uLkN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyCgkgKiAgYW5kIG5hdHVyYWxseSBpdCBmYWlscyB3LyByYz0yLiBJdCBzaG91bGQgZG8gaXQgYWdhaW5zdAoJICogIEhLRVlfQ1VSUkVOVF9VU0VSIHdoaWNoIGlzIHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlCgkgKiAgdGhlIE1SVSByb3V0aW5lcyBleHBlY3QgaXQhISEhCgkgKi8KCVJlZ0RlbGV0ZUtleUEoSENVYmFzZWtleSwgIlJlY2VudERvY3MiKTsKCVJlZ0Nsb3NlS2V5KEhDVWJhc2VrZXkpOwoJcmV0dXJuIDA7CiAgICB9CgogICAgLyogSGF2ZSBkYXRhIHRvIGFkZCwgdGhlIGpvYnMgdG8gYmUgZG9uZToKICAgICAqICAgMS4gQWRkIGRvY3VtZW50IHRvIE1SVSBsaXN0IGluIHJlZ2lzdHJ5ICJIS0NVXFNvZnR3YXJlXAogICAgICogICAgICBNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxSZWNlbnREb2NzIi4KICAgICAqICAgMi4gQWRkIHNob3J0Y3V0IHRvIGRvY3VtZW50IGluIHRoZSB1c2VyJ3MgUmVjZW50IGRpcmVjdG9yeSAKICAgICAqICAgICAgKENTSURMX1JFQ0VOVCkuCiAgICAgKiAgIDMuIEFkZCBzaG9ydGN1dCB0byBTdGFydCBtZW51J3MgRG9jdW1lbnRzIHN1Ym1lbnUuCiAgICAgKi8KCiAgICAvKiBHZXQgdGhlIHB1cmUgZG9jdW1lbnQgbmFtZSBmcm9tIHRoZSBpbnB1dAogICAgICovCiAgICBpZiAodUZsYWdzICYgU0hBUkRfUElETCkgewoJU0hHZXRQYXRoRnJvbUlETGlzdEEoKExQQ0lURU1JRExJU1QpIHB2LCBkb2NfbmFtZSk7CiAgICB9CiAgICBlbHNlIHsKCWxzdHJjcHlBKGRvY19uYW1lLCAoTFBTVFIpIHB2KTsKICAgIH0KICAgIFRSQUNFKCJmdWxsIGRvY3VtZW50IG5hbWUgJXNcbiIsIGRvY19uYW1lKTsKICAgIFBhdGhTdHJpcFBhdGhBKGRvY19uYW1lKTs7CiAgICBUUkFDRSgic3RyaXBwZWQgZG9jdW1lbnQgbmFtZSAlc1xuIiwgZG9jX25hbWUpOwoKCiAgICAvKiAqKiogIEpPQiAxOiBVcGRhdGUgcmVnaXN0cnkgZm9yIC4uLlxFeHBsb3JlclxSZWNlbnREb2NzIGxpc3QgICoqKiAqLwoKICAgIHsgIC8qIG9uIGlucHV0IG5lZWRzOiAKCSogICAgICBkb2NfbmFtZSAgICAtICBwdXJlIGZpbGUtc3BlYywgbm8gcGF0aCAKCSogICAgICBsaW5rX2RpciAgICAtICBwYXRoIHRvIHRoZSB1c2VyJ3MgUmVjZW50IGRpcmVjdG9yeQoJKiAgICAgIEhDVWJhc2VrZXkgIC0gIGtleSBvZiAuLi5XaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyIiBub2RlCgkqIGNyZWF0ZXM6CgkqICAgICAgbmV3X2xua19uYW1lLSAgcHVyZSBmaWxlLXNwZWMsIG5vIHBhdGggZm9yIG5ldyAubG5rIGZpbGUKCSogICAgICBuZXdfbG5rX2ZpbGVwYXRoCgkqICAgICAgICAgICAgICAgICAgLSAgcGF0aCBhbmQgZmlsZSBuYW1lIG9mIG5ldyAubG5rIGZpbGUgCgkqLwoJQ1JFQVRFTVJVTElTVCBteW1ydTsKCUhBTkRMRSBtcnVoYW5kbGU7CglJTlQgbGVuLCBwb3MsIGJ1ZnVzZWQsIGVycjsKCUlOVCBpOwoJRFdPUkQgYXR0cjsKCUNIQVIgYnVmZmVyWzIwNDhdOwoJQ0hBUiAqcHRyOwoJQ0hBUiBvbGRfbG5rX25hbWVbTUFYX1BBVEhdOwoJc2hvcnQgaW50IHNsZW47CgoJbXltcnUuY2JTaXplID0gc2l6ZW9mKENSRUFURU1SVUxJU1QpOwoJbXltcnUubk1heEl0ZW1zID0gMTU7CglteW1ydS5kd0ZsYWdzID0gTVJVRl9CSU5BUllfTElTVCB8IE1SVUZfREVMQVlFRF9TQVZFOwoJbXltcnUuaEtleSA9IEhDVWJhc2VrZXk7CglteW1ydS5scHN6U3ViS2V5ID0gIlJlY2VudERvY3MiOwoJbXltcnUubHBmbkNvbXBhcmUgPSAmU0hBRERfY29tcGFyZV9tcnU7CgltcnVoYW5kbGUgPSBwQ3JlYXRlTVJVTGlzdEEoJm15bXJ1KTsKCWlmICghbXJ1aGFuZGxlKSB7CgkgICAgLyogTVJVIGZhaWxlZCAqLwoJICAgIEVSUigiTVJVIHByb2Nlc3NpbmcgZmFpbGVkLCBoYW5kbGUgemVyb1xuIik7CgkgICAgUmVnQ2xvc2VLZXkoSENVYmFzZWtleSk7CgkgICAgcmV0dXJuIDA7Cgl9CglsZW4gPSBsc3RybGVuQShkb2NfbmFtZSk7Cglwb3MgPSBwRmluZE1SVURhdGEobXJ1aGFuZGxlLCBkb2NfbmFtZSwgbGVuLCAwKTsKCgkvKiBOb3cgZ2V0IHRoZSBNUlUgZW50cnkgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIAoJICogYW5kIGRlbGV0ZSB0aGUgLmxuayBmaWxlIGZvciBpdCAKCSAqLwoJaWYgKChidWZ1c2VkID0gcEVudW1NUlVMaXN0QShtcnVoYW5kbGUsIChwb3MgPT0gLTEpID8gMTQgOiBwb3MsIAoJCQkJICAgICBidWZmZXIsIDIwNDgpKSAhPSAtMSkgewoJICAgIHB0ciA9IGJ1ZmZlcjsKCSAgICBwdHIgKz0gKGxzdHJsZW5BKGJ1ZmZlcikgKyAxKTsKCSAgICBzbGVuID0gKigoc2hvcnQgaW50KilwdHIpOwoJICAgIHB0ciArPSAyOyAgLyogc2tpcCB0aGUgbGVuZ3RoIGFyZWEgKi8KCSAgICBpZiAoYnVmdXNlZCA+PSBzbGVuICsgKHB0ci1idWZmZXIpKSB7CgkJLyogYnVmZmVyIHNpemUgbG9va3MgZ29vZCAqLwoJCXB0ciArPSAxMjsgLyogZ2V0IHRvIHN0cmluZyAqLwoJCWxlbiA9IGJ1ZnVzZWQgLSAocHRyLWJ1ZmZlcik7ICAvKiBnZXQgbGVuZ3RoIG9mIGJ1ZiByZW1haW5pbmcgKi8KCQlpZiAoKGxzdHJsZW5BKHB0cikgPiAwKSAmJiAobHN0cmxlbkEocHRyKSA8PSBsZW4tMSkpIHsKCQkgICAgLyogYXBwZWFycyB0byBiZSBnb29kIHN0cmluZyAqLwoJCSAgICBsc3RyY3B5QShvbGRfbG5rX25hbWUsIGxpbmtfZGlyKTsKCQkgICAgUGF0aEFwcGVuZEEob2xkX2xua19uYW1lLCBwdHIpOwoJCSAgICBpZiAoIURlbGV0ZUZpbGVBKG9sZF9sbmtfbmFtZSkpIHsKCQkJaWYgKChhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNBKG9sZF9sbmtfbmFtZSkpID09IC0xKSB7CgkJCSAgICBpZiAoKGVyciA9IEdldExhc3RFcnJvcigpKSAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgewoJCQkJRVJSKCJEZWxldGUgZm9yICVzIGZhaWxlZCwgZXJyPSVkLCBhdHRyPSUwOGx4XG4iLAoJCQkJICAgIG9sZF9sbmtfbmFtZSwgZXJyLCBhdHRyKTsKCQkJICAgIH0KCQkJICAgIGVsc2UgewoJCQkJVFJBQ0UoIm9sZCAubG5rIGZpbGUgJXMgZGlkIG5vdCBleGlzdFxuIiwKCQkJCSAgICAgIG9sZF9sbmtfbmFtZSk7CgkJCSAgICB9CgkJCX0KCQkJZWxzZSB7CgkJCSAgICBFUlIoIkRlbGV0ZSBmb3IgJXMgZmFpbGVkLCBhdHRyPSUwOGx4XG4iLAoJCQkJb2xkX2xua19uYW1lLCBhdHRyKTsKCQkJfQoJCSAgICB9CgkJICAgIGVsc2UgewoJCQlUUkFDRSgiZGVsZXRlZCBvbGQgLmxuayBmaWxlICVzXG4iLCBvbGRfbG5rX25hbWUpOwoJCSAgICB9CgkJfQoJICAgIH0KCX0KCgkvKiBDcmVhdGUgdXNhYmxlIC5sbmsgZmlsZSBuYW1lIGZvciB0aGUgIlJlY2VudCIgZGlyZWN0b3J5CgkgKi8KCXdzcHJpbnRmQShuZXdfbG5rX25hbWUsICIlcy5sbmsiLCBkb2NfbmFtZSk7Cglsc3RyY3B5QShuZXdfbG5rX2ZpbGVwYXRoLCBsaW5rX2Rpcik7CglQYXRoQXBwZW5kQShuZXdfbG5rX2ZpbGVwYXRoLCBuZXdfbG5rX25hbWUpOwoJaSA9IDE7CglvbGRlcnJvcm1vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7Cgl3aGlsZSAoR2V0RmlsZUF0dHJpYnV0ZXNBKG5ld19sbmtfZmlsZXBhdGgpICE9IC0xKSB7CgkgICAgaSsrOwoJICAgIHdzcHJpbnRmQShuZXdfbG5rX25hbWUsICIlcyAoJXUpLmxuayIsIGRvY19uYW1lLCBpKTsKCSAgICBsc3RyY3B5QShuZXdfbG5rX2ZpbGVwYXRoLCBsaW5rX2Rpcik7CgkgICAgUGF0aEFwcGVuZEEobmV3X2xua19maWxlcGF0aCwgbmV3X2xua19uYW1lKTsKCX0KCVNldEVycm9yTW9kZShvbGRlcnJvcm1vZGUpOwoJVFJBQ0UoIm5ldyBzaG9ydGN1dCB3aWxsIGJlICVzXG4iLCBuZXdfbG5rX2ZpbGVwYXRoKTsKCgkvKiBOb3cgYWRkIHRoZSBuZXcgTVJVIGVudHJ5IGFuZCBkYXRhCgkgKi8KCXBvcyA9IFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEobXJ1aGFuZGxlLCBkb2NfbmFtZSwgbmV3X2xua19uYW1lLAoJCQkJCWJ1ZmZlciwgJmxlbik7CglwRnJlZU1SVUxpc3RBKG1ydWhhbmRsZSk7CglUUkFDRSgiVXBkYXRlZCBNUlUgbGlzdCwgbmV3IGRvYyBpcyBwb3NpdGlvbiAlZFxuIiwgcG9zKTsKICAgIH0KCiAgICAvKiAqKiogIEpPQiAyOiBDcmVhdGUgc2hvcnRjdXQgaW4gdXNlcidzICJSZWNlbnQiIGRpcmVjdG9yeSAgKioqICovCgogICAgeyAgLyogb24gaW5wdXQgbmVlZHM6IAoJKiAgICAgIGRvY19uYW1lICAgIC0gIHB1cmUgZmlsZS1zcGVjLCBubyBwYXRoCgkqICAgICAgbmV3X2xua19maWxlcGF0aAoJKiAgICAgICAgICAgICAgICAgIC0gIHBhdGggYW5kIGZpbGUgbmFtZSBvZiBuZXcgLmxuayBmaWxlIAogCSogICAgICB1RmxhZ3NbaW5dICAtICBmbGFncyBvbiBjYWxsIHRvIFNIQWRkVG9SZWNlbnREb2NzCgkqICAgICAgcHZbaW5dICAgICAgLSAgZG9jdW1lbnQgcGF0aC9waWRsIG9uIGNhbGwgdG8gU0hBZGRUb1JlY2VudERvY3MKCSovCglJU2hlbGxMaW5rQSAqcHNsID0gTlVMTDsKCUlQZXJzaXN0RmlsZSAqcFBmID0gTlVMTDsKCUhSRVNVTFQgaHJlczsKCUNIQVIgZGVzY1tNQVhfUEFUSF07CglXQ0hBUiB3aWRlbGlua1tNQVhfUEFUSF07CgoJQ29Jbml0aWFsaXplKDApOwoKCWhyZXMgPSBDb0NyZWF0ZUluc3RhbmNlKCAmQ0xTSURfU2hlbGxMaW5rLAoJCQkJIE5VTEwsCgkJCQkgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCgkJCQkgJklJRF9JU2hlbGxMaW5rQSwKCQkJCSAoTFBWT0lEICkmcHNsKTsKCWlmKFNVQ0NFRURFRChocmVzKSkgewoKCSAgICBocmVzID0gSVNoZWxsTGlua0FfUXVlcnlJbnRlcmZhY2UocHNsLCAmSUlEX0lQZXJzaXN0RmlsZSwgCgkJCQkJICAgICAoTFBWT0lEICopJnBQZik7CgkgICAgaWYoRkFJTEVEKGhyZXMpKSB7CgkJLyogYm9tYmVkICovCgkJRVJSKCJmYWlsZWQgUXVlcnlJbnRlcmZhY2UgZm9yIElQZXJzaXN0RmlsZSAlMDhseFxuIiwgaHJlcyk7CgkJZ290byBmYWlsOwoJICAgIH0KCgkgICAgLyogU2V0IHRoZSBkb2N1bWVudCBwYXRoIG9yIHBpZGwgKi8KCSAgICBpZiAodUZsYWdzICYgU0hBUkRfUElETCkgewoJCWhyZXMgPSBJU2hlbGxMaW5rQV9TZXRJRExpc3QocHNsLCAoTFBDSVRFTUlETElTVCkgcHYpOwoJICAgIH0gZWxzZSB7CgkJaHJlcyA9IElTaGVsbExpbmtBX1NldFBhdGgocHNsLCAoTFBDU1RSKSBwdik7CgkgICAgfQoJICAgIGlmKEZBSUxFRChocmVzKSkgewoJCS8qIGJvbWJlZCAqLwoJCUVSUigiZmFpbGVkIFNldHtJRExpc3R8UGF0aH0gJTA4bHhcbiIsIGhyZXMpOwoJCWdvdG8gZmFpbDsKCSAgICB9CgoJICAgIGxzdHJjcHlBKGRlc2MsICJTaG9ydGN1dCB0byAiKTsKCSAgICBsc3RyY2F0QShkZXNjLCBkb2NfbmFtZSk7CgkgICAgaHJlcyA9IElTaGVsbExpbmtBX1NldERlc2NyaXB0aW9uKHBzbCwgZGVzYyk7CgkgICAgaWYoRkFJTEVEKGhyZXMpKSB7CgkJLyogYm9tYmVkICovCgkJRVJSKCJmYWlsZWQgU2V0RGVzY3JpcHRpb24gJTA4bHhcbiIsIGhyZXMpOwoJCWdvdG8gZmFpbDsKCSAgICB9CgoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBuZXdfbG5rX2ZpbGVwYXRoLCAtMSwgCgkJCQl3aWRlbGluaywgTUFYX1BBVEgpOwoJICAgIC8qIGNyZWF0ZSB0aGUgc2hvcnQgY3V0ICovCgkgICAgaHJlcyA9IElQZXJzaXN0RmlsZV9TYXZlKHBQZiwgd2lkZWxpbmssIFRSVUUpOwoJICAgIGlmKEZBSUxFRChocmVzKSkgewoJCS8qIGJvbWJlZCAqLwoJCUVSUigiZmFpbGVkIElQZXJzaXN0RmlsZTo6U2F2ZSAlMDhseFxuIiwgaHJlcyk7CgkJSVBlcnNpc3RGaWxlX1JlbGVhc2UocFBmKTsKCQlJU2hlbGxMaW5rQV9SZWxlYXNlKHBzbCk7CgkJZ290byBmYWlsOwoJICAgIH0KCSAgICBocmVzID0gSVBlcnNpc3RGaWxlX1NhdmVDb21wbGV0ZWQocFBmLCB3aWRlbGluayk7CgkgICAgSVBlcnNpc3RGaWxlX1JlbGVhc2UocFBmKTsKCSAgICBJU2hlbGxMaW5rQV9SZWxlYXNlKHBzbCk7CgkgICAgVFJBQ0UoInNob3J0Y3V0ICVzIGhhcyBiZWVuIGNyZWF0ZWQsIHJlc3VsdD0lMDhseFxuIiwgCgkJICBuZXdfbG5rX2ZpbGVwYXRoLCBocmVzKTsKCX0KCWVsc2UgewoJICAgIEVSUigiQ29DcmVhdGVJbnN0YW5jZSBmYWlsZWQsIGhyZXM9JTA4bHhcbiIsIGhyZXMpOwoJfQogICAgfQoKIGZhaWw6CiAgICBDb1VuaW5pdGlhbGl6ZSgpOwoKICAgIC8qIGFsbCBkb25lICovCiAgICBSZWdDbG9zZUtleShIQ1ViYXNla2V5KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4CQkJW1NIRUxMMzIuMTc0XQogKgogKiBOT1RFUwogKiAgc2VlIElTaGVsbEZvbGRlcjo6Q3JlYXRlVmlld09iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeCgKCUxQQ1NIRUxMRk9MREVSVklFV0lORk8gcHN2Y2JpLCAvKiBbaW5dIHNoZWxsdGVtcGxhdGUgc3RydWN0ICovCglMUFNIRUxMVklFVyogcHB2KSAgICAgICAgICAgICAgLyogW291dF0gSVNoZWxsVmlldyBwb2ludGVyICovCnsKCUlTaGVsbFZpZXcgKiBwc2Y7CglIUkVTVUxUIGhSZXM7CgkKCVRSQUNFKCJzZj0lcCBwaWRsPSVwIGNiPSVwIG1vZGU9MHglMDh4IHBhcm09MHglMDhseFxuIiwgCgkgIHBzdmNiaS0+cHNoZiwgcHN2Y2JpLT5waWRsRm9sZGVyLCBwc3ZjYmktPmxwZm5DYWxsYmFjaywKCSAgcHN2Y2JpLT51Vmlld01vZGUsIHBzdmNiaS0+ZHdVc2VyKTsKCglwc2YgPSBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKHBzdmNiaS0+cHNoZik7CgkKCWlmICghcHNmKQoJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCglJU2hlbGxWaWV3X0FkZFJlZihwc2YpOwoJaFJlcyA9IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UocHNmLCAmSUlEX0lTaGVsbFZpZXcsIChMUFZPSUQgKilwcHYpOwoJSVNoZWxsVmlld19SZWxlYXNlKHBzZik7CgoJcmV0dXJuIGhSZXM7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscAkJCQkJW1NIRUxMMzIuMTI3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXaW5IZWxwIChEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIsdix3LHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hSdW5Db250cm9sUGFuZWwgW1NIRUxMMzIuMTYxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSdW5Db250cm9sUGFuZWwgKERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeAkJCQlbU0hFTEwzMi4yOTFdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeEFXIChMUFZPSUQgc2VpKQp7CWlmIChTSEVMTF9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU2hlbGxFeGVjdXRlRXhXIChzZWkpOwoJcmV0dXJuIFNoZWxsRXhlY3V0ZUV4QSAoc2VpKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeEEJCQkJW1NIRUxMMzIuMjkyXQogKgogKiBwbGFjZWhvbGRlciBpbiB0aGUgY29tbWFuZGxpbmU6CiAqCSUxIGZpbGUKICoJJTIgcHJpbnRlcgogKgklMyBkcml2ZXIKICoJJTQgcG9ydAogKgklSSBhZHJlc3Mgb2YgYSBnbG9iYWwgaXRlbSBJRCAoZXhwbG9yZXIgc3dpdGNoIC9pZGxpc3QpCiAqCSVMID8/PyBwYXRoL3VybC9jdXJyZW50IGZpbGUgPz8/CiAqCSVTID8/PwogKgklKiBhbGwgZm9sbG93aW5nIHBhcmFtZXRlcnMgKHNlZSBiYXRmaWxlKQogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBIChMUFNIRUxMRVhFQ1VURUlORk9BIHNlaSkKeyAJQ0hBUiBzekFwcGxpY2F0aW9uTmFtZVtNQVhfUEFUSF0sc3pDb21tYW5kbGluZVtNQVhfUEFUSF0sc3pQaWRsWzIwXTsKCUxQU1RSIHBvczsKCWludCBnYXAsIGxlbjsKCVNUQVJUVVBJTkZPQSAgc3RhcnR1cDsKCVBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKCQkJCglXQVJOKCJtYXNrPTB4JTA4bHggaHduZD0weCUwNHggdmVyYj0lcyBmaWxlPSVzIHBhcm09JXMgZGlyPSVzIHNob3c9MHglMDh4IGNsYXNzPSVzIGluY29tcGxldGVcbiIsCgkgICAgIHNlaS0+Zk1hc2ssIHNlaS0+aHduZCwgZGVidWdzdHJfYShzZWktPmxwVmVyYiksCgkgICAgIGRlYnVnc3RyX2Eoc2VpLT5scEZpbGUpLCBkZWJ1Z3N0cl9hKHNlaS0+bHBQYXJhbWV0ZXJzKSwKCSAgICAgZGVidWdzdHJfYShzZWktPmxwRGlyZWN0b3J5KSwgc2VpLT5uU2hvdywgCgkgICAgIChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKSA/IGRlYnVnc3RyX2Eoc2VpLT5scENsYXNzKSA6ICJub3QgdXNlZCIpOwoKCVplcm9NZW1vcnkoc3pBcHBsaWNhdGlvbk5hbWUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBGaWxlKQoJICBzdHJjcHkoc3pBcHBsaWNhdGlvbk5hbWUsIHNlaS0+bHBGaWxlKTsKCQoJWmVyb01lbW9yeShzekNvbW1hbmRsaW5lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc3RyY3B5KHN6Q29tbWFuZGxpbmUsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCQkJCglpZiAoc2VpLT5mTWFzayAmIChTRUVfTUFTS19DTEFTU0tFWSB8IFNFRV9NQVNLX0lOVk9LRUlETElTVCB8IFNFRV9NQVNLX0lDT04gfCBTRUVfTUFTS19IT1RLRVkgfAoJCQkgIFNFRV9NQVNLX0NPTk5FQ1RORVREUlYgfCBTRUVfTUFTS19GTEFHX0RERVdBSVQgfAoJCQkgIFNFRV9NQVNLX0RPRU5WU1VCU1QgfCBTRUVfTUFTS19GTEFHX05PX1VJIHwgU0VFX01BU0tfVU5JQ09ERSB8IAoJCQkgIFNFRV9NQVNLX05PX0NPTlNPTEUgfCBTRUVfTUFTS19BU1lOQ09LIHwgU0VFX01BU0tfSE1PTklUT1IgKSkKCXsKCSAgRklYTUUoImZsYWdzIGlnbm9yZWQ6IDB4JTA4bHhcbiIsIHNlaS0+Zk1hc2spOwoJfQoJCgkvKiBsYXVuY2ggYSBkb2N1bWVudCBieSBmaWxlY2xhc3MgbGlrZSAnV29yZHBhZC5Eb2N1bWVudC4xJyAqLwoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7CgkgIC8qIEZJWE1FOiBzekNvbW1hbmRsaW5lIHNob3VsZCBub3QgYmUgb2YgYSBmaXhlZCBzaXplLiBQbHVzIE1BWF9QQVRIIGlzIHdheSB0b28gc2hvcnQhICovCgkgIC8qIHRoZSBjb21tYW5kbGluZSBjb250YWlucyAnYzpcUGF0aFx3b3JkcGFkLmV4ZSAiJTEiJyAqLwoJICBIQ1JfR2V0RXhlY3V0ZUNvbW1hbmQoc2VpLT5scENsYXNzLCAoc2VpLT5scFZlcmIpID8gc2VpLT5scFZlcmIgOiAib3BlbiIsIHN6Q29tbWFuZGxpbmUsIHNpemVvZihzekNvbW1hbmRsaW5lKSk7CgkgIC8qIEZJWE1FOiBnZXQgdGhlIGV4dGVuc2lvbiBvZiBscEZpbGUsIGNoZWNrIGlmIGl0IGZpdHMgdG8gdGhlIGxwQ2xhc3MgKi8KCSAgVFJBQ0UoIlNFRV9NQVNLX0NMQVNTTkFNRS0+JyVzJ1xuIiwgc3pDb21tYW5kbGluZSk7Cgl9CgoJLyogcHJvY2VzcyB0aGUgSURMaXN0ICovCglpZiAoIChzZWktPmZNYXNrICYgU0VFX01BU0tfSU5WT0tFSURMSVNUKSA9PSBTRUVfTUFTS19JTlZPS0VJRExJU1QpIC8qMHgwYyovCgl7CgkgIFNIR2V0UGF0aEZyb21JRExpc3RBIChzZWktPmxwSURMaXN0LHN6QXBwbGljYXRpb25OYW1lKTsKCSAgVFJBQ0UoIi0tIGlkbGlzdD0lcCAoJXMpXG4iLCBzZWktPmxwSURMaXN0LCBzekFwcGxpY2F0aW9uTmFtZSk7Cgl9CgllbHNlCgl7CgkgIGlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUICkKCSAgewoJICAgIHBvcyA9IHN0cnN0cihzekNvbW1hbmRsaW5lLCAiJUkiKTsKCSAgICBpZiAocG9zKQoJICAgIHsKCSAgICAgIExQVk9JRCBwdjsKCSAgICAgIEhHTE9CQUwgaG1lbSA9IFNIQWxsb2NTaGFyZWQgKCBzZWktPmxwSURMaXN0LCBJTEdldFNpemUoc2VpLT5scElETGlzdCksIDApOwoJICAgICAgcHYgPSBTSExvY2tTaGFyZWQoaG1lbSwwKTsKCSAgICAgIHNwcmludGYoc3pQaWRsLCI6JXAiLHB2ICk7CgkgICAgICBTSFVubG9ja1NoYXJlZChwdik7CgkgICAgCgkgICAgICBnYXAgPSBzdHJsZW4oc3pQaWRsKTsKCSAgICAgIGxlbiA9IHN0cmxlbihwb3MpLTI7CgkgICAgICBtZW1tb3ZlKHBvcytnYXAscG9zKzIsbGVuKTsKCSAgICAgIG1lbWNweShwb3Msc3pQaWRsLGdhcCk7CgoJICAgIH0KCSAgfQoJfQoKCVRSQUNFKCJleGVjdXRlOiclcycsJyVzJ1xuIixzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJaWYgKHN6Q29tbWFuZGxpbmVbMF0pIHsKCSAgc3RyY2F0KHN6QXBwbGljYXRpb25OYW1lLCAiICIpOwoJICBzdHJjYXQoc3pBcHBsaWNhdGlvbk5hbWUsIHN6Q29tbWFuZGxpbmUpOwoJfQoKCVplcm9NZW1vcnkoJnN0YXJ0dXAsc2l6ZW9mKFNUQVJUVVBJTkZPQSkpOwoJc3RhcnR1cC5jYiA9IHNpemVvZihTVEFSVFVQSU5GT0EpOwoKCWlmICghIENyZWF0ZVByb2Nlc3NBKE5VTEwsIHN6QXBwbGljYXRpb25OYW1lLAoJCQkgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIAoJCQkgTlVMTCwgc2VpLT5scERpcmVjdG9yeSwKCQkJICZzdGFydHVwLCAmaW5mbykpCgl7CiAgICAgICAgQk9PTCBmYWlsZWQgPSBUUlVFOwoKICAgICAgICBpZiAoKCFzZWktPmxwVmVyYil8fChzdHJjYXNlY21wKHNlaS0+bHBWZXJiLCJvcGVuIikpKQogICAgICAgIHsKICAgICAgICAgICAgTFBTVFIgICBleHQgPSBQYXRoRmluZEV4dGVuc2lvbkEoc3pBcHBsaWNhdGlvbk5hbWUpOwogICAgICAgICAgICBDSEFSICAgIGtleVsxMDIzXTsKICAgICAgICAgICAgQ0hBUiAgICBidWZmZXJbMTAyM107CiAgICAgICAgICAgIENIQVIgICAgY21kbGluZVsxMDIzXTsKICAgICAgICAgICAgRFdPUkQgICBzaXplOwoKICAgICAgICAgICAgc3ByaW50ZihrZXksIlNvZnR3YXJlXFxDbGFzc2VzXFwlcyIsZXh0KTsgICAKICAgICAgICAgICAgc2l6ZSA9IDEwMjM7CiAgICAgICAgICAgIGlmICghUmVnUXVlcnlWYWx1ZUEoSEtFWV9MT0NBTF9NQUNISU5FLGtleSxidWZmZXIsJnNpemUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGtleSwiU29mdHdhcmVcXENsYXNzZXNcXCVzXFxzaGVsbFxcJXNcXGNvbW1hbmQiLCBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgKHNlaS0+bHBWZXJiKT9zZWktPmxwVmVyYjoib3BlbiIpOwogICAgICAgICAgICAgICAgc2l6ZSA9IDEwMjM7CiAgICAgICAgICAgICAgICBpZiAoIVJlZ1F1ZXJ5VmFsdWVBKEhLRVlfTE9DQUxfTUFDSElORSxrZXksYnVmZmVyLCZzaXplKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGNtZGxpbmUsIiVzIFwiJXNcIiIsYnVmZmVyLHN6QXBwbGljYXRpb25OYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ3JlYXRlUHJvY2Vzc0EoTlVMTCxjbWRsaW5lLCAgTlVMTCwgTlVMTCwgRkFMU0UsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc2VpLT5scERpcmVjdG9yeSwgJnN0YXJ0dXAsICZpbmZvKSkKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChmYWlsZWQpCiAgICAgICAgewogICAgICAgICAgICBzZWktPmhJbnN0QXBwID0gR2V0TGFzdEVycm9yKCk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9Cgl9CgogICAgICAgIHNlaS0+aEluc3RBcHAgPSAzMzsKIAoJaWYoc2VpLT5mTWFzayAmIFNFRV9NQVNLX05PQ0xPU0VQUk9DRVNTKQoJICBzZWktPmhQcm9jZXNzID0gaW5mby5oUHJvY2VzczsJICAKICAgICAgICBlbHNlCiAgICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oUHJvY2VzcyApOwogICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4VwkJCQlbU0hFTEwzMi4yOTNdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeFcgKExQU0hFTExFWEVDVVRFSU5GT1cgc2VpKQp7CVNIRUxMRVhFQ1VURUlORk9BIHNlaUE7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiVwXG4iLCBzZWkpOwoKCW1lbWNweSgmc2VpQSwgc2VpLCBzaXplb2YoU0hFTExFWEVDVVRFSU5GT0EpKTsKCQogICAgICAgIGlmIChzZWktPmxwVmVyYikKCSAgc2VpQS5scFZlcmIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBWZXJiKTsKCiAgICAgICAgaWYgKHNlaS0+bHBGaWxlKQoJICBzZWlBLmxwRmlsZSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scEZpbGUpOwoKICAgICAgICBpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHNlaUEubHBQYXJhbWV0ZXJzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwUGFyYW1ldGVycyk7CgoJaWYgKHNlaS0+bHBEaXJlY3RvcnkpCgkgIHNlaUEubHBEaXJlY3RvcnkgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBEaXJlY3RvcnkpOwoKICAgICAgICBpZiAoKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpICYmIHNlaS0+bHBDbGFzcykKCSAgc2VpQS5scENsYXNzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwQ2xhc3MpOwoJZWxzZQoJICBzZWlBLmxwQ2xhc3MgPSBOVUxMOwoJICAJICAKCXJldCA9IFNoZWxsRXhlY3V0ZUV4QSgmc2VpQSk7CgogICAgICAgIGlmIChzZWlBLmxwVmVyYikJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFZlcmIgKTsKCWlmIChzZWlBLmxwRmlsZSkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scEZpbGUgKTsKCWlmIChzZWlBLmxwUGFyYW1ldGVycykJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFBhcmFtZXRlcnMgKTsKCWlmIChzZWlBLmxwRGlyZWN0b3J5KQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRGlyZWN0b3J5ICk7CglpZiAoc2VpQS5scENsYXNzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwQ2xhc3MgKTsKCiAJcmV0dXJuIHJldDsKfQoKc3RhdGljIExQVU5LTk9XTiBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZT0wOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4xNzZdCiAqCiAqIE5PVEVTCiAqICBTZXRzIHRoZSBpbnRlcmZhY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLkBdCiAqCiAqIE5PVEVTCiAqICBnZXRzIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBvZiB0aGUgZXhwbG9yZXIgYW5kIGEgcmVmZXJlbmNlCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEdldEluc3RhbmNlRXhwbG9yZXIgKExQVU5LTk9XTiAqIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CgoJKmxwVW5rbm93biA9IFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlOwoKCWlmICghU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UpCgkgIHJldHVybiBFX0ZBSUw7CgoJSVVua25vd25fQWRkUmVmKFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlKTsKCXJldHVybiBOT0VSUk9SOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVVudXNlZExpYnJhcmllcwkJCVtTSEVMTDMyLjEyM10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCnZvaWQgV0lOQVBJIFNIRnJlZVVudXNlZExpYnJhcmllcyAodm9pZCkKewoJRklYTUUoInN0dWJcbiIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TZXREcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KQk9PTCBXSU5BUEkgREFEX1NldERyYWdJbWFnZSgKCUhJTUFHRUxJU1QgaGltbFRyYWNrLAoJTFBQT0lOVCBscHB0KQp7CglGSVhNRSgiJXAgJXAgc3R1YlxuIixoaW1sVHJhY2ssIGxwcHQpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TaG93RHJhZ0ltYWdlCQkJCVtTSEVMTDMyLjEzN10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkJPT0wgV0lOQVBJIERBRF9TaG93RHJhZ0ltYWdlKEJPT0wgYlNob3cpCnsKCUZJWE1FKCIweCUwOHggc3R1YlxuIixiU2hvdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtTSEVMTDMyLjY1MV0gTlQgNC4wCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbU0hFTEwzMi42NTJdIE5UIDQuMAogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtTSEVMTDMyLjY4MF0gTlQgNC4wCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jU2hhcmVkCQkJCVtTSEVMTDMyLjUyMF0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIyIGlzIGVxdWFsIHRvIHRoZSBzaXplIGFsbG9jYXRlZCB3aXRoIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMyBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqCiAqICB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc3RlZCBhcyBsUGFyYW0gd2l0aCAweDQwMiAoV01fVVNFUisyKSB0byBzb21ld2hlcmUKICogIFdNX1VTRVIrMiBjb3VsZCBiZSB0aGUgdW5kb2N1bWVudGVkIENXTV9TRVRQQVRICiAqICB0aGUgYWxsb2NhdGVkIG1lbW9yeSBjb250YWlucyBhIHBpZGwKICovCkhHTE9CQUwgV0lOQVBJIFNIQWxsb2NTaGFyZWQoTFBWT0lEIHBzcmMsIERXT1JEIHNpemUsIERXT1JEIHByb2NJRCkKewlIR0xPQkFMIGhtZW07CglMUFZPSUQgcG1lbTsKCQoJVFJBQ0UoInB0cj0lcCBzaXplPTB4JTA0bHggcHJvY0lEPTB4JTA0bHhcbiIscHNyYyxzaXplLHByb2NJRCk7CglobWVtID0gR2xvYmFsQWxsb2MoR01FTV9GSVhFRCwgc2l6ZSk7CglpZiAoIWhtZW0pCgkgIHJldHVybiAwOwoJCglwbWVtID0gIEdsb2JhbExvY2sgKGhtZW0pOwoKCWlmICghIHBtZW0pCgkgIHJldHVybiAwOwoJICAKCW1lbWNweSAocG1lbSwgcHNyYywgc2l6ZSk7CglHbG9iYWxVbmxvY2soaG1lbSk7IAoJcmV0dXJuIGhtZW07Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2NrU2hhcmVkCQkJCQlbU0hFTEwzMi41MjFdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKiAgdGhlIHJlY2VpdmVyIG9mIChXTV9VU0VSKzIpIHRyaWVzIHRvIGxvY2sgdGhlIEhBTkRMRSAoPykgCiAqICB0aGUgcmV0dXJuIHZhbHVlIHNlZW1zIHRvIGJlIGEgbWVtb3J5IGFkZHJlc3MKICovCkxQVk9JRCBXSU5BUEkgU0hMb2NrU2hhcmVkKEhBTkRMRSBobWVtLCBEV09SRCBwcm9jSUQpCnsJVFJBQ0UoImhhbmRsZT0weCUwNHggcHJvY0lEPTB4JTA0bHhcbiIsaG1lbSxwcm9jSUQpOwoJcmV0dXJuIEdsb2JhbExvY2soaG1lbSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hVbmxvY2tTaGFyZWQJCQkJW1NIRUxMMzIuNTIyXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSExvY2tTaGFyZWQKICovCkJPT0wgV0lOQVBJIFNIVW5sb2NrU2hhcmVkKExQVk9JRCBwdikKewoJVFJBQ0UoIiVwXG4iLHB2KTsKCXJldHVybiBHbG9iYWxVbmxvY2soKEhBTkRMRSlwdik7IAp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVNoYXJlZAkJCQkJW1NIRUxMMzIuNTIzXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSEFsbG9jU2hhcmVkCiAqICBwYXJhbWV0ZXIyIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICovCkJPT0wgV0lOQVBJIFNIRnJlZVNoYXJlZCgKCUhBTkRMRSBoTWVtLAoJRFdPUkQgcGlkKQp7CglUUkFDRSgiaGFuZGxlPTB4JTA0eCAweCUwNGx4XG4iLGhNZW0scGlkKTsKCXJldHVybiBHbG9iYWxGcmVlKGhNZW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTZXRBcHBTdGFydGluZ0N1cnNvcgkJCQlbU0hFTEwzMi45OV0KICovCkhSRVNVTFQgV0lOQVBJIFNldEFwcFN0YXJ0aW5nQ3Vyc29yKEhXTkQgdSwgRFdPUkQgdikKewlGSVhNRSgiaHduZD0weCUwNHggMHglMDRseCBzdHViXG4iLHUsdiApOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2FkT0xFCQkJCQlbU0hFTEwzMi4xNTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExvYWRPTEUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIFNfT0s7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRHJpdmVUeXBlCQkJCQlbU0hFTEwzMi42NF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERyaXZlVHlwZShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFib3J0SW52b2tlQ29tbWFuZAkJCQlbU0hFTEwzMi4xOThdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEFib3J0SW52b2tlQ29tbWFuZCh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94CQkJW1NIRUxMMzIuMTI2XQogKgogKi8KaW50IFdJTkFQSSBTSE91dE9mTWVtb3J5TWVzc2FnZUJveCgKCUhXTkQgaHduZE93bmVyLAoJTFBDU1RSIGxwQ2FwdGlvbiwKCVVJTlQgdVR5cGUpCnsKCUZJWE1FKCIweCUwNHggJXMgMHglMDh4IHN0dWJcbiIsaHduZE93bmVyLCBscENhcHRpb24sIHVUeXBlKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmx1c2hDbGlwYm9hcmQJCQkJW1NIRUxMMzIuMTIxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hGbHVzaENsaXBib2FyZCh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFdhaXRGb3JGaWxlVG9PcGVuCQkJCVtTSEVMTDMyLjk3XQogKgogKi8KQk9PTCBXSU5BUEkgU0hXYWl0Rm9yRmlsZVRvT3BlbigKCUxQQ0lURU1JRExJU1QgcGlkbCwgCglEV09SRCBkd0ZsYWdzLAoJRFdPUkQgZHdUaW1lb3V0KQp7CglGSVhNRSgiJXAgMHglMDhseCAweCUwOGx4IHN0dWJcbiIsIHBpZGwsIGR3RmxhZ3MsIGR3VGltZW91dCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglACQkJCVtTSEVMTDMyLjY1NF0KICoKICogTk9URVM6IGZpcnN0IHBhcmFtZXRlciBzZWVtcyB0byBiZSBhIHBvaW50ZXIgKHNhbWUgYXMgcGFzc2VkIHRvIFdyaXRlQ2FiaW5ldFN0YXRlKQogKiBzZWNvbmQgb25lIGNvdWxkIGJlIGEgc2l6ZSAoMHgwYykuIFRoZSBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBzdHJ1Y3R1cmUgc2F2ZWQgdG8KICogSENVXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXENhYmluZXRTdGF0ZQogKiBJJ20gKGpzKSBndWVzc2luZzogdGhpcyBvbmUgaXMganVzdCBSZWFkQ2FiaW5ldFN0YXRlIDstKQogKi8KSFJFU1VMVCBXSU5BUEkgc2hlbGwzMl82NTQgKERXT1JEIHgsIERXT1JEIHkpCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSTEJ1aWxkTGlzdE9mUGF0aHMJCQlbU0hFTEwzMi4xNDZdCiAqCiAqIE5PVEVTCiAqICAgYnVpbGRzIGEgRFBBCiAqLwpEV09SRCBXSU5BUEkgUkxCdWlsZExpc3RPZlBhdGhzICh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hWYWxpZGF0ZVVOQwkJCQlbU0hFTEwzMi4xNzNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFZhbGlkYXRlVU5DIChEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CglGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3RBCQkJW1NIRUxMMzIuQF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdEEoTFBTVFIgeCwgTFBTVFIgeSkKewoJRklYTUUoIiglcywgJXMpIHN0dWJcbiIsIGRlYnVnc3RyX2EoeCksIGRlYnVnc3RyX2EoeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLkBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RXKExQV1NUUiB4LCBMUFdTVFIgeSkKewoJRklYTUUoIiglcywgJXMpOiBzdHViXG4iLCBkZWJ1Z3N0cl93KHgpLCBkZWJ1Z3N0cl93KHkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURvRW52aXJvbm1lbnRTdWJzdAkJCVtTSEVMTDMyLjUzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QVcoTFBWT0lEIHgsIExQVk9JRCB5KQp7CglpZiAoU0hFTExfT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIERvRW52aXJvbm1lbnRTdWJzdFcoeCwgeSk7CglyZXR1cm4gRG9FbnZpcm9ubWVudFN1YnN0QSh4LCB5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBAICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0hFTEwzMi4yNDNdCiAqIAogKiBXaW45OCsgYnktb3JkaW5hbCByb3V0aW5lLiAgSW4gV2luOTggdGhpcyByb3V0aW5lIHJldHVybnMgemVybyBhbmQKICogZG9lcyBub3RoaW5nIGVsc2UuICBQb3NzaWJseSB0aGlzIGRvZXMgc29tZXRoaW5nIGluIE5UIG9yIFNIRUxMMzIgNS4wPwogKgogKi8KCkJPT0wgV0lOQVBJIHNoZWxsMzJfMjQzKERXT1JEIGEsIERXT1JEIGIpIAp7IAogIHJldHVybiBGQUxTRTsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hFTEwzMi43MTRdCiAqLwpEV09SRCBXSU5BUEkgU0hFTEwzMl83MTQoTFBWT0lEIHgpCnsKIAlGSVhNRSgiKCVzKXN0dWJcbiIsIGRlYnVnc3RyX3coeCkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hBZGRGcm9tUHJvcFNoZWV0RXh0QXJyYXkJW1NIRUxMMzIuMTY3XQogKi8KRFdPUkQgV0lOQVBJIFNIQWRkRnJvbVByb3BTaGVldEV4dEFycmF5KERXT1JEIGEsIERXT1JEIGIsIERXT1JEIGMpCnsKIAlGSVhNRSgiKCUwOGx4LCUwOGx4LCUwOGx4KXN0dWJcbiIsIGEsIGIsIGMpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hDcmVhdGVQcm9wU2hlZXRFeHRBcnJheQlbU0hFTEwzMi4xNjhdCiAqLwpEV09SRCBXSU5BUEkgU0hDcmVhdGVQcm9wU2hlZXRFeHRBcnJheShEV09SRCBhLCBMUENTVFIgYiwgRFdPUkQgYykKewogCUZJWE1FKCIoJTA4bHgsJXMsJTA4bHgpc3R1YlxuIiwgYSwgZGVidWdzdHJfYShiKSwgYyk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSFJlcGxhY2VGcm9tUHJvcFNoZWV0RXh0QXJyYXkJW1NIRUxMMzIuMTcwXQogKi8KRFdPUkQgV0lOQVBJIFNIUmVwbGFjZUZyb21Qcm9wU2hlZXRFeHRBcnJheShEV09SRCBhLCBEV09SRCBiLCBEV09SRCBjLCBEV09SRCBkKQp7CiAJRklYTUUoIiglMDhseCwlMDhseCwlMDhseCwlMDhseClzdHViXG4iLCBhLCBiLCBjLCBkKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIRGVzdHJveVByb3BTaGVldEV4dEFycmF5CVtTSEVMTDMyLjE2OV0KICovCkRXT1JEIFdJTkFQSSBTSERlc3Ryb3lQcm9wU2hlZXRFeHRBcnJheShEV09SRCBhKQp7CiAJRklYTUUoIiglMDhseClzdHViXG4iLCBhKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENJRExEYXRhX0NyZWF0ZUZyb21JREFycmF5CVtTSEVMTDMyLjgzXQogKgogKiAgQ3JlYXRlIElEYXRhT2JqZWN0IGZyb20gUElETHM/PwogKi8KSFJFU1VMVCBXSU5BUEkgQ0lETERhdGFfQ3JlYXRlRnJvbUlEQXJyYXkoCglMUENJVEVNSURMSVNUIHBpZGxGb2xkZXIsCglEV09SRCBjcGlkbEZpbGVzLAoJTFBDSVRFTUlETElTVCAqbHBwaWRsRmlsZXMsCglMUERBVEFPQkpFQ1QgKnBwZGF0YU9iamVjdCkKewogICAgSU5UIGk7CiAgICBIV05EIGh3bmQgPSAwOyAgIC8qRklYTUU6IHdobyBzaG91bGQgYmUgaHduZCBvZiBvd25lcj8gc2V0IHRvIGRlc2t0b3AgKi8KCiAgICBUUkFDRSgiKCVwLCAlbGQsICVwLCAlcClcbiIsIHBpZGxGb2xkZXIsIGNwaWRsRmlsZXMsIGxwcGlkbEZpbGVzLCBwcGRhdGFPYmplY3QpOwogICAgaWYgKFRSQUNFX09OKHBpZGwpKQogICAgewoJcGR1bXAgKHBpZGxGb2xkZXIpOwoJZm9yIChpPTA7IGk8Y3BpZGxGaWxlczsgaSsrKSBwZHVtcCAobHBwaWRsRmlsZXNbaV0pOwogICAgfQogICAgKnBwZGF0YU9iamVjdCA9IElEYXRhT2JqZWN0X0NvbnN0cnVjdG9yKCBod25kLCBwaWRsRm9sZGVyLAoJCQkJCSAgICAgbHBwaWRsRmlsZXMsIGNwaWRsRmlsZXMpOwogICAgaWYgKCpwcGRhdGFPYmplY3QpIHJldHVybiBTX09LOwogICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Cn0K