LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludmVyc2lvbi5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAiY3J0ZGxsLmgiCgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCiNpbmNsdWRlICJ3aW5lL3VuZG9jc2hlbGwuaCIKI2luY2x1ZGUgInNocG9saWN5LmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoc2hlbGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZEEJCQkJCVtTSEVMTDMyLjU4XQogKgogKiBjb3B5cyBhIGZpZWxkIGZyb20gYSAnLCcgZGVsaW1pdGVkIHN0cmluZwogKiAKICogZmlyc3QgZmllbGQgaXMgbkZpZWxkID0gMQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRBKExQQ1NUUiBzcmMsIERXT1JEIG5GaWVsZCwgTFBTVFIgZHN0LCBEV09SRCBsZW4pIAp7CglXQVJOKCIoJyVzJywweCUwOGx4LCVwLCVsZCkgc2VtaS1zdHViLlxuIixzcmMsbkZpZWxkLGRzdCxsZW4pOwoKCWlmICghc3JjIHx8ICFzcmNbMF0gfHwgIWRzdCB8fCAhbGVuKQoJICByZXR1cm4gMDsKCgkvKiBza2lwIG4gZmllbGRzIGRlbGltaXRlZCBieSAnLCcgKi8KCXdoaWxlIChuRmllbGQgPiAxKQoJewoJICBpZiAoKnNyYz09J1wwJykgcmV0dXJuIEZBTFNFOwoJICBpZiAoKihzcmMrKyk9PScsJykgbkZpZWxkLS07Cgl9CgoJLyogY29weSBwYXJ0IHRpbGwgdGhlIG5leHQgJywnIHRvIGRzdCAqLwoJd2hpbGUgKCAqc3JjIT0nXDAnICYmICpzcmMhPScsJyAmJiAobGVuLS0pPjAgKSAqKGRzdCsrKT0qKHNyYysrKTsKCQoJLyogZmluYWxpemUgdGhlIHN0cmluZyAqLwoJKmRzdD0weDA7CgkKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaWNrSWNvbkRsZwkJCQkJW1NIRUxMMzIuNjJdCiAqIAogKi8KRFdPUkQgV0lOQVBJIFBpY2tJY29uRGxnKERXT1JEIHgsRFdPUkQgeSxEV09SRCB6LERXT1JEIGEpIAp7CUZJWE1FKCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6LGEpOwoJcmV0dXJuIDB4ZmZmZmZmZmY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldEZpbGVOYW1lRnJvbUJyb3dzZQkJCVtTSEVMTDMyLjYzXQogKiAKICovCkRXT1JEIFdJTkFQSSBHZXRGaWxlTmFtZUZyb21Ccm93c2UoSFdORCBob3duZXIsIExQU1RSIHRhcmdldGJ1ZiwgRFdPUkQgbGVuLCBEV09SRCB4LCBMUENTVFIgc3VmZml4LCBMUENTVFIgeSwgTFBDU1RSIGNtZCkgCnsJRklYTUUoIiglMDR4LCVwLCVsZCwlMDhseCwlcywlcywlcyk6c3R1Yi5cbiIsCgkgICAgaG93bmVyLHRhcmdldGJ1ZixsZW4seCxzdWZmaXgseSxjbWQpOwogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHlBKHRhcmdldGJ1ZiwieDpcXGR1bW15LmV4ZSIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0dGluZ3MJCQkJW1NIRUxMMzIuNjhdCiAqIAogKiBOT1RFUwogKiAgdGhlIHJlZ2lzdHJ5IHBhdGggYXJlIGZvciB3aW45OCAodGVzdGVkKQogKiAgYW5kIHBvc3NpYmx5IGFyZSB0aGUgc2FtZSBpbiBudDQwCiAqLwp2b2lkIFdJTkFQSSBTSEdldFNldHRpbmdzKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzaywgRFdPUkQgZHd4KQp7CglIS0VZCWhLZXk7CglEV09SRAlkd0RhdGE7CglEV09SRAlkd0RhdGFTaXplID0gc2l6ZW9mIChEV09SRCk7CgoJVFJBQ0UoIiglcCAweCUwOGx4IDB4JTA4bHgpXG4iLGxwc2ZzLGR3TWFzaywgZHd4KTsKCQoJaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcQWR2YW5jZWQiLAoJCQkJIDAsIDAsIDAsIEtFWV9BTExfQUNDRVNTLCAwLCAmaEtleSwgMCkpCgkgIHJldHVybjsKCQoJaWYgKCAoU1NGX1NIT1dFWFRFTlNJT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUZpbGVFeHQiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93RXh0ZW5zaW9ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dJTkZPVElQICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0luZm9UaXAiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93SW5mb1RpcCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0RPTlRQUkVUVFlQQVRIICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiRG9udFByZXR0eVBhdGgiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZEb250UHJldHR5UGF0aCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0hJREVJQ09OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVJY29ucyIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkhpZGVJY29ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX01BUE5FVERSVkJVVFRPTiAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIk1hcE5ldERydkJ0biIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+Zk1hcE5ldERydkJ0biAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dBVFRSSUJDT0wgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93QXR0cmliQ29sIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0F0dHJpYkNvbCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCgoU1NGX1NIT1dBTExPQkpFQ1RTIHwgU1NGX1NIT1dTWVNGSUxFUykgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRkZW4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCXsgaWYgKGR3RGF0YSA9PSAwKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMSkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDE7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDIpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAxOwoJICB9Cgl9CglSZWdDbG9zZUtleSAoaEtleSk7CgoJVFJBQ0UoIi0tIDB4JTA0eFxuIiwgKihXT1JEKilscHNmcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UJCQlbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoSFdORCBod25kQ2FiaW5ldCxVSU5UIHVNc2csTFBBUkFNIGxQYXJhbSkKeyBGSVhNRSgiJTA0eCAlMDh1eCAlMDhseCBzdHViXG4iLGh3bmRDYWJpbmV0LHVNc2csbFBhcmFtKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT2xlU3RyVG9TdHJOCQkJCQlbU0hFTEwzMi43OF0KICovCkJPT0wgV0lOQVBJIE9sZVN0clRvU3RyTkEgKExQU1RSIGxwU3RyLCBJTlQgblN0ciwgTFBDV1NUUiBscE9sZSwgSU5UIG5PbGUpIAp7CglUUkFDRSgiKCVwLCAleCwgJXMsICV4KVxuIiwgbHBTdHIsIG5TdHIsIGRlYnVnc3RyX3duKGxwT2xlLG5PbGUpLCBuT2xlKTsKCXJldHVybiBXaWRlQ2hhclRvTXVsdGlCeXRlICgwLCAwLCBscE9sZSwgbk9sZSwgbHBTdHIsIG5TdHIsIE5VTEwsIE5VTEwpOwp9CgpCT09MIFdJTkFQSSBPbGVTdHJUb1N0ck5XIChMUFdTVFIgbHB3U3RyLCBJTlQgbndTdHIsIExQQ1dTVFIgbHBPbGUsIElOVCBuT2xlKSAKewoJVFJBQ0UoIiglcCwgJXgsICVzLCAleClcbiIsIGxwd1N0ciwgbndTdHIsIGRlYnVnc3RyX3duKGxwT2xlLG5PbGUpLCBuT2xlKTsKCglpZiAobHN0cmNweW5XICggbHB3U3RyLCBscE9sZSwgbndTdHIpKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwd1N0cik7Cgl9CglyZXR1cm4gMDsKfQoKQk9PTCBXSU5BUEkgT2xlU3RyVG9TdHJOQVcgKExQVk9JRCBscE91dCwgSU5UIG5PdXQsIExQQ1ZPSUQgbHBJbiwgSU5UIG5JbikgCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBPbGVTdHJUb1N0ck5XIChscE91dCwgbk91dCwgbHBJbiwgbkluKTsKCXJldHVybiBPbGVTdHJUb1N0ck5BIChscE91dCwgbk91dCwgbHBJbiwgbkluKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyVG9PbGVTdHJOCQkJCQlbU0hFTEwzMi43OV0KICogIGxwTXVsdGksIG5NdWx0aSwgbldpZGUgW0lOXQogKiAgbHBXaWRlIFtPVVRdCiAqLwpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5BIChMUFdTVFIgbHBXaWRlLCBJTlQgbldpZGUsIExQQ1NUUiBscFN0ckEsIElOVCBuU3RyKSAKewoJVFJBQ0UoIiglcCwgJXgsICVzLCAleClcbiIsIGxwV2lkZSwgbldpZGUsIGRlYnVnc3RyX2FuKGxwU3RyQSxuU3RyKSwgblN0cik7CglyZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhciAoMCwgMCwgbHBTdHJBLCBuU3RyLCBscFdpZGUsIG5XaWRlKTsKfQpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5XIChMUFdTVFIgbHBXaWRlLCBJTlQgbldpZGUsIExQQ1dTVFIgbHBTdHJXLCBJTlQgblN0cikgCnsKCVRSQUNFKCIoJXAsICV4LCAlcywgJXgpXG4iLCBscFdpZGUsIG5XaWRlLCBkZWJ1Z3N0cl93bihscFN0clcsIG5TdHIpLCBuU3RyKTsKCglpZiAobHN0cmNweW5XIChscFdpZGUsIGxwU3RyVywgbldpZGUpKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwV2lkZSk7Cgl9CglyZXR1cm4gMDsKfQoKQk9PTCBXSU5BUEkgU3RyVG9PbGVTdHJOQVcgKExQV1NUUiBscFdpZGUsIElOVCBuV2lkZSwgTFBDVk9JRCBscFN0ciwgSU5UIG5TdHIpIAp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU3RyVG9PbGVTdHJOVyAobHBXaWRlLCBuV2lkZSwgbHBTdHIsIG5TdHIpOwoJcmV0dXJuIFN0clRvT2xlU3RyTkEgKGxwV2lkZSwgbldpZGUsIGxwU3RyLCBuU3RyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sJCQkJW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vayhIV05EIGh3bmQsIERXT1JEIHkpIHsKICAgIEZJWE1FKCIoMHglMDh4LDB4JTA4bHgpOnN0dWIuXG4iLGh3bmQseSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxNZXNzYWdlQm94VwkJCQlbU0hFTEwzMi4xODJdCiAqCiAqIEZvcm1hdCBhbmQgb3V0cHV0IGVycm9ybWVzc2FnZS4KICoKICogaWRUZXh0CXJlc291cmNlIElEIG9mIHRpdGxlIG9yIExQU1RSCiAqIGlkVGl0bGUJcmVzb3VyY2UgSUQgb2YgdGl0bGUgb3IgTFBTVFIKICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCklOVCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveFcoSE1PRFVMRSBobW9kLEhXTkQgaHduZCxEV09SRCBpZFRleHQsRFdPUkQgaWRUaXRsZSxEV09SRCB1VHlwZSxMUENWT0lEIGFyZ2xpc3QpIAp7CVdDSEFSCXN6VGV4dFsxMDBdLHN6VGl0bGVbMTAwXSxzelRlbXBbMjU2XTsKCUxQV1NUUiAgIHBzelRleHQgPSAmc3pUZXh0WzBdLCBwc3pUaXRsZSA9ICZzelRpdGxlWzBdOwoJTFBWT0lECWFyZ3MgPSAmYXJnbGlzdDsKCglUUkFDRSgiKCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4LCVwKVxuIiwoRFdPUkQpaG1vZCwoRFdPUkQpaHduZCxpZFRleHQsaWRUaXRsZSx1VHlwZSxhcmdsaXN0KTsKCglpZiAoIUhJV09SRCAoaWRUaXRsZSkpCgkgIExvYWRTdHJpbmdXKGhtb2QsaWRUaXRsZSxwc3pUaXRsZSwxMDApOwoJZWxzZQoJICBwc3pUaXRsZSA9IChMUFdTVFIpaWRUaXRsZTsKCglpZiAoISBISVdPUkQgKGlkVGV4dCkpCgkgIExvYWRTdHJpbmdXKGhtb2QsaWRUZXh0LHBzelRleHQsMTAwKTsKCWVsc2UKCSAgcHN6VGV4dCA9IChMUFdTVFIpaWRUZXh0OwoKCUZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkgLHN6VGV4dCwwLDAsc3pUZW1wLDI1NixhcmdzKTsKCXJldHVybiBNZXNzYWdlQm94Vyhod25kLHN6VGVtcCxzelRpdGxlLHVUeXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxNZXNzYWdlQm94QQkJCQlbU0hFTEwzMi4xODNdCiAqLwpJTlQgX19jZGVjbApTaGVsbE1lc3NhZ2VCb3hBKEhNT0RVTEUgaG1vZCxIV05EIGh3bmQsRFdPUkQgaWRUZXh0LERXT1JEIGlkVGl0bGUsRFdPUkQgdVR5cGUsTFBDVk9JRCBhcmdsaXN0KSAKewljaGFyCXN6VGV4dFsxMDBdLHN6VGl0bGVbMTAwXSxzelRlbXBbMjU2XTsKCUxQU1RSICAgcHN6VGV4dCA9ICZzelRleHRbMF0sIHBzelRpdGxlID0gJnN6VGl0bGVbMF07CglMUFZPSUQJYXJncyA9ICZhcmdsaXN0OwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJXApXG4iLCAoRFdPUkQpaG1vZCwoRFdPUkQpaHduZCxpZFRleHQsaWRUaXRsZSx1VHlwZSxhcmdsaXN0KTsKCglpZiAoIUhJV09SRCAoaWRUaXRsZSkpCgkgIExvYWRTdHJpbmdBKGhtb2QsaWRUaXRsZSxwc3pUaXRsZSwxMDApOwoJZWxzZQoJICBwc3pUaXRsZSA9IChMUFNUUilpZFRpdGxlOwoKCWlmICghIEhJV09SRCAoaWRUZXh0KSkKCSAgTG9hZFN0cmluZ0EoaG1vZCxpZFRleHQscHN6VGV4dCwxMDApOwoJZWxzZQoJICBwc3pUZXh0ID0gKExQU1RSKWlkVGV4dDsKCglGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FSR1VNRU5UX0FSUkFZICxwc3pUZXh0LDAsMCxzelRlbXAsMjU2LGFyZ3MpOwoJcmV0dXJuIE1lc3NhZ2VCb3hBKGh3bmQsc3pUZW1wLHBzelRpdGxlLHVUeXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZXN0cmljdGVkCQkJCVtTSEVMTDMyLjEwMF0KICoKICogd2Fsa3MgdGhyb3VnaCBwb2xpY3kgdGFibGUsIHF1ZXJpZXMgPGFwcD4ga2V5LCA8dHlwZT4gdmFsdWUsIHJldHVybnMgCiAqIHF1ZXJpZWQgKERXT1JEKSB2YWx1ZSwgYW5kIGNhY2hlcyBpdCBiZXR3ZWVuIGNhbGxlZCB0byBTSEluaXRSZXN0cmljdGVkCiAqIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVnaXN0cnkgYWNjZXNzLgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKgogKiBSRUZFUkVOQ0VTOiAKICogICAgIE1TIFN5c3RlbSBQb2xpY3kgRWRpdG9yCiAqICAgICA5OExpdGUgMi4wICh3aGljaCB1c2VzIG1hbnkgb2YgdGhlc2UgcG9saWN5IGtleXMpIGh0dHA6Ly93d3cuOThsaXRlLm5ldC8KICogICAgICJUaGUgV2luZG93cyA5NSBSZWdpc3RyeSIsIGJ5IEpvaG4gV29yYW0sIDE5OTYgTUlTOiBQcmVzcwogKi8KRFdPUkQgV0lOQVBJIFNIUmVzdHJpY3RlZCAoRFdPUkQgcG9sKSB7CiAgICAgICAgY2hhciByZWdzdHJbMjU2XTsKCUhLRVkJeGhrZXk7CglEV09SRCAgIHJldHZhbCwgcG9saWR4LCBpLCBkYXRzaXplID0gNDsKCglUUkFDRSgiKCUwOGx4KVxuIixwb2wpOwoKCXBvbGlkeCA9IC0xOwoKCS8qIHNjYW4gdG8gc2VlIGlmIHdlIGtub3cgdGhpcyBwb2xpY3kgSUQgKi8KCWZvciAoaSA9IDA7IGkgPCBTSEVMTF9NQVhfUE9MSUNJRVM7IGkrKykKCXsKCSAgICAgaWYgKHBvbCA9PSBzaDMyX3BvbGljeV90YWJsZVtpXS5wb2xmbGFncykKCSAgICAgewoJICAgICAgICAgcG9saWR4ID0gaTsKCQkgYnJlYWs7CgkgICAgIH0KCX0KCglpZiAocG9saWR4ID09IC0xKQoJewoJICAgIC8qIHdlIGRvbid0IGtub3cgdGhpcyBwb2xpY3ksIHJldHVybiAwICovCgkgICAgVFJBQ0UoInVua25vd24gcG9saWN5OiAoJTA4bHgpXG4iLCBwb2wpOwoJCXJldHVybiAwOwoJfQoKCS8qIHdlIGhhdmUgYSBrbm93biBwb2xpY3kgKi8KICAgICAgCWxzdHJjcHlBKHJlZ3N0ciwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxQb2xpY2llc1xcIik7Cglsc3RyY2F0QShyZWdzdHIsIHNoMzJfcG9saWN5X3RhYmxlW3BvbGlkeF0uYXBwc3RyKTsKCgkvKiBmaXJzdCBjaGVjayBpZiB0aGlzIHBvbGljeSBoYXMgYmVlbiBjYWNoZWQsIHJldHVybiBpdCBpZiBzbyAqLwoJaWYgKHNoMzJfcG9saWN5X3RhYmxlW3BvbGlkeF0uY2FjaGUgIT0gU0hFTExfTk9fUE9MSUNZKQoJewoJICAgIHJldHVybiBzaDMyX3BvbGljeV90YWJsZVtwb2xpZHhdLmNhY2hlOwoJfQoKCS8qIHJldHVybiAwIGFuZCBkb24ndCBzZXQgdGhlIGNhY2hlIGlmIGFueSByZWdpc3RyeSBlcnJvcnMgb2NjdXIgKi8KCXJldHZhbCA9IDA7CglpZiAoUmVnT3BlbktleUEoSEtFWV9DVVJSRU5UX1VTRVIsIHJlZ3N0ciwgJnhoa2V5KSA9PSBFUlJPUl9TVUNDRVNTKQoJewoJICAgIGlmIChSZWdRdWVyeVZhbHVlRXhBKHhoa2V5LCBzaDMyX3BvbGljeV90YWJsZVtwb2xpZHhdLmtleXN0ciwgTlVMTCwgTlVMTCwgKExQQllURSkmcmV0dmFsLCAmZGF0c2l6ZSkgPT0gRVJST1JfU1VDQ0VTUykKCSAgICB7CgkgICAgICAgIHNoMzJfcG9saWN5X3RhYmxlW3BvbGlkeF0uY2FjaGUgPSByZXR2YWw7CgkgICAgfQoKCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKfQoKCXJldHVybiByZXR2YWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hJbml0UmVzdHJpY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICBbU0hFTEwzMi4yNDRdCiAqCiAqIFdpbjk4KyBieS1vcmRpbmFsIG9ubHkgcm91dGluZSBjYWxsZWQgYnkgRXhwbG9yZXIgYW5kIE1TSUUgNCBhbmQgNS4KICogSW5pdHMgdGhlIHBvbGljeSBjYWNoZSB1c2VkIGJ5IFNIUmVzdHJpY3RlZCB0byBhdm9pZCBleGNlc3MKICogcmVnaXN0cnkgYWNjZXNzLgogKgogKiBJTlBVVFMKICogVHdvIGlucHV0czogb25lIGlzIGEgc3RyaW5nIG9yIE5VTEwuICBJZiBub24tTlVMTCB0aGUgcG9pbnRlcgogKiBzaG91bGQgcG9pbnQgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGV4YWN0IHRleHQ6CiAqICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxQb2xpY2llcyIuCiAqIFRoZSBvdGhlciBpbnB1dCBpcyB1bnVzZWQuCiAqCiAqIE5PVEVTCiAqIElmIHRoZSBpbnB1dCBpcyBub24tTlVMTCBhbmQgZG9lcyBub3QgcG9pbnQgdG8gYSBzdHJpbmcgY29udGFpbmluZwogKiB0aGF0IGV4YWN0IHRleHQgdGhlIHJvdXRpbmUgd2lsbCBkbyBub3RoaW5nLgogKgogKiBJZiB0aGUgdGV4dCBkb2VzIG1hdGNoIG9yIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gdGhlIHJvdXRpbmUKICogd2lsbCBpbml0IFNIUmVzdHJpY3RlZCgpJ3MgcG9saWN5IGNhY2hlIHRvIGFsbCAweGZmZmZmZmZmIGFuZAogKiByZXR1cm5zIDB4ZmZmZmZmZmYgYXMgd2VsbC4KICoKICogSSBoYXZlbid0IHlldCBydW4gaW50byBhbnl0aGluZyBjYWxsaW5nIHRoaXMgd2l0aCBpbnB1dHMgb3RoZXIgdGhhbgogKiAoTlVMTCwgTlVMTCksIHNvIEkgbWF5IGhhdmUgdGhlIGlucHV0cyByZXZlcnNlZC4KICovCgpCT09MIFdJTkFQSSBTSEluaXRSZXN0cmljdGVkKExQU1RSIGlucFJlZ0tleSwgTFBTVFIgcGFybTIpCnsKICAgICBpbnQgaTsKCiAgICAgVFJBQ0UoIiglcCwgJXApXG4iLCBpbnBSZWdLZXksIHBhcm0yKTsKCiAgICAgLyogZmlyc3QgY2hlY2sgLSBpZiBpbnB1dCBpcyBub24tTlVMTCBhbmQgcG9pbnRzIHRvIHRoZSBzZWNyZXQKICAgICAgICBrZXkgc3RyaW5nLCB0aGVuIHBhc3MuICBPdGhlcndpc2UgcmV0dXJuIDAuCiAgICAgKi8KCiAgICAgaWYgKGlucFJlZ0tleSAhPSAoTFBTVFIpTlVMTCkKICAgICB7CiAgICAgICAgIGlmIChsc3RyY21waUEoaW5wUmVnS2V5LCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFBvbGljaWVzIikpCgkgewoJICAgICAvKiBkb2Vzbid0IG1hdGNoLCBmYWlsICovCgkgICAgIHJldHVybiAwOwoJIH0KICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAvKiBjaGVjayBwYXNzZWQsIGluaXQgYWxsIHBvbGljeSBjYWNoZSBlbnRyaWVzIHdpdGggU0hFTExfTk9fUE9MSUNZICovCiAgICAgZm9yIChpID0gMDsgaSA8IFNIRUxMX01BWF9QT0xJQ0lFUzsgaSsrKQogICAgIHsKICAgICAgICAgIHNoMzJfcG9saWN5X3RhYmxlW2ldLmNhY2hlID0gU0hFTExfTk9fUE9MSUNZOwogICAgIH0KCiAgICAgcmV0dXJuIFNIRUxMX05PX1BPTElDWTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlCQkJCQlbU0hFTEwzMi4xOTVdCiAqCiAqIE5PVEVTCiAqICAgICBmcmVlX3B0cigpIC0gZnJlZXMgbWVtb3J5IHVzaW5nIElNYWxsb2MKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCiNkZWZpbmUgTUVNX0RFQlVHIDEKRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgCnsKI2lmIE1FTV9ERUJVRwoJV09SRCBsZW4gPSAqKExQV09SRCkoKExQQllURSl4LTIpOwoKCWlmICggKihMUFdPUkQpKChMUEJZVEUpeCtsZW4pICE9IDB4NzM4NCkKCSAgRVJSKCJNQUdJQzIhXG4iKTsKCglpZiAoICgqKExQV09SRCkoKExQQllURSl4LTQpKSAhPSAweDgyNzEpCgkgIEVSUigiTUFHSUMxIVxuIik7CgllbHNlCgkgIG1lbXNldCgoTFBCWVRFKXgtNCwgMHhkZSwgbGVuKzYpOwoKCVRSQUNFKCIlcCBsZW49JXVcbiIseCwgbGVuKTsKCgl4ID0gKExQQllURSkgeCAtIDQ7CiNlbHNlCglUUkFDRSgiJXBcbiIseCk7CiNlbmRpZgoJcmV0dXJuIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jCQkJCQlbU0hFTEwzMi4xOTZdCiAqCiAqIE5PVEVTCiAqICAgICB2b2lkICp0YXNrX2FsbG9jKERXT1JEIGxlbiksIHVzZXMgU0hNYWxsb2MgYWxsb2NhdG9yCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUFZPSUQgV0lOQVBJIFNIQWxsb2MoRFdPUkQgbGVuKSAKewoJTFBCWVRFIHJldDsKCiNpZiBNRU1fREVCVUcKCXJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKzYpOwojZWxzZQoJcmV0ID0gKExQVk9JRCkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwojZW5kaWYKCiNpZiBNRU1fREVCVUcKCSooTFBXT1JEKShyZXQpID0gMHg4MjcxOwoJKihMUFdPUkQpKHJldCsyKSA9IChXT1JEKWxlbjsKCSooTFBXT1JEKShyZXQrNCtsZW4pID0gMHg3Mzg0OwoJcmV0ICs9IDQ7CgltZW1zZXQocmV0LCAweGRmLCBsZW4pOwojZW5kaWYKCVRSQUNFKCIlbHUgYnl0ZXMgYXQgJXBcbiIsbGVuLCByZXQpOwoJcmV0dXJuIChMUFZPSUQpcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ2lzdGVyRHJhZ0Ryb3AJCQkJW1NIRUxMMzIuODZdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZWdpc3RlckRyYWdEcm9wKEhXTkQgaFduZCxJRHJvcFRhcmdldCAqIHBEcm9wVGFyZ2V0KSAKewoJRklYTUUoIigweCUwOHgsJXApOnN0dWIuXG4iLCBoV25kLCBwRHJvcFRhcmdldCk7CglyZXR1cm4gICAgIFJlZ2lzdGVyRHJhZ0Ryb3AoaFduZCwgcERyb3BUYXJnZXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wCQkJCVtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmV2b2tlRHJhZ0Ryb3AoRFdPUkQgeCkgewogICAgRklYTUUoIigweCUwOGx4KTpzdHViLlxuIix4KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSERvRHJhZ0Ryb3AJCQkJCVtTSEVMTDMyLjg4XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIRG9EcmFnRHJvcChEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KSB7CiAgICBGSVhNRSgiKDB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4KTpzdHViLlxuIix1LHYsdyx4LHkseik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUnVuRmlsZURsZwkJCQkJW1NIRUxMMzIuNjFdCiAqCiAqIE5PVEVTCiAqICAgICBPcmlnaW5hbCBuYW1lOiBSdW5GaWxlRGxnIChleHBvcnRlZCBieSBvcmRpbmFsKQogKi8KRFdPUkQgV0lOQVBJClJ1bkZpbGVEbGcgKEhXTkQgaHduZE93bmVyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsCgkgICAgTFBTVFIgbHBzelRpdGxlLCBMUFNUUiBscHN6UHJvbXB0LCBVSU5UIHVGbGFncykKewogICAgRklYTUUoIigweCUwOHggMHglbHggMHglbHggXCIlc1wiIFwiJXNcIiAweCV4KTpzdHViLlxuIiwKCSAgIGh3bmRPd25lciwgZHdQYXJhbTEsIGR3UGFyYW0yLCBscHN6VGl0bGUsIGxwc3pQcm9tcHQsIHVGbGFncyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRXhpdFdpbmRvd3NEaWFsb2cJCQkJW1NIRUxMMzIuNjBdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBFeGl0V2luZG93c0RpYWxvZyAoSFdORCBoV25kT3duZXIpCnsKCVRSQUNFKCIoMHglMDh4KVxuIiwgaFduZE93bmVyKTsKCWlmIChNZXNzYWdlQm94QSggaFduZE93bmVyLCAiRG8geW91IHdhbnQgdG8gZXhpdCBXSU5FPyIsICJTaHV0ZG93biIsIE1CX1lFU05PfE1CX0lDT05RVUVTVElPTikgPT0gSURPSykKCXsgU2VuZE1lc3NhZ2VBICggaFduZE93bmVyLCBXTV9RVUlULCAwLCAwKTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQXJyYW5nZVdpbmRvd3MJCQkJW1NIRUxMMzIuMTg0XQogKiAKICovCkRXT1JEIFdJTkFQSQpBcnJhbmdlV2luZG93cyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywKCQlEV09SRCBkd1BhcmFtNCwgRFdPUkQgZHdQYXJhbTUpCnsKICAgIEZJWE1FKCIoMHglbHggMHglbHggMHglbHggMHglbHggMHglbHgpOnN0dWIuXG4iLAoJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMywgZHdQYXJhbTQsIGR3UGFyYW01KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaWduYWxGaWxlT3BlbgkJCQlbU0hFTEwzMi4xMDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU2lnbmFsRmlsZU9wZW4gKERXT1JEIGR3UGFyYW0xKQp7CiAgICBGSVhNRSgiKDB4JTA4bHgpOnN0dWIuXG4iLCBkd1BhcmFtMSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWRkVG9SZWNlbnREb2NzCQkJCVtTSEVMTDMyLjIzNF0KICoKICogUEFSQU1FVEVSUwogKiAgIHVGbGFncyAgW0lOXSBTSEFSRF9QQVRIIG9yIFNIQVJEX1BJREwKICogICBwdiAgICAgIFtJTl0gc3RyaW5nIG9yIHBpZGwsIE5VTEwgY2xlYXJzIHRoZSBsaXN0CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MgKFVJTlQgdUZsYWdzLExQQ1ZPSUQgcHYpICAgCnsgaWYgKFNIQVJEX1BJREw9PXVGbGFncykKICB7IEZJWE1FKCIoMHglMDh4LHBpZGw9JXApOnN0dWIuXG4iLCB1RmxhZ3MscHYpOwoJfQoJZWxzZQoJeyBGSVhNRSgiKDB4JTA4eCwlcyk6c3R1Yi5cbiIsIHVGbGFncywoY2hhciopcHYpOwoJfQogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgJCQlbU0hFTEwzMi4xNzRdCiAqCiAqIE5PVEVTCiAqICBzZWUgSVNoZWxsRm9sZGVyOjpDcmVhdGVWaWV3T2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4KAogIExQU0hFTExWSUVXREFUQSBwc3ZjYmksIC8qW2luIF0gc2hlbGx0ZW1wbGF0ZSBzdHJ1Y3QqLwogIExQVk9JRCogcHB2KSAgICAgICAgICAgIC8qW291dF0gSVNoZWxsVmlldyBwb2ludGVyKi8KewoJSVNoZWxsVmlldyAqIHBzZjsKCUhSRVNVTFQgaFJlczsKCQoJVFJBQ0UoInNmPSVwIHBpZGw9JXAgY2I9JXAgbW9kZT0weCUwOGx4IHBhcm09MHglMDhseFxuIiwgCgkgIHBzdmNiaS0+cFNoZWxsRm9sZGVyLCBwc3ZjYmktPnBpZGwsIHBzdmNiaS0+cENhbGxCYWNrLCBwc3ZjYmktPnZpZXdtb2RlLCBwc3ZjYmktPmR3VXNlclBhcmFtKTsKCglwc2YgPSBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKHBzdmNiaS0+cFNoZWxsRm9sZGVyKTsKCQoJaWYgKCFwc2YpCgkgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKCUlTaGVsbFZpZXdfQWRkUmVmKHBzZik7CgloUmVzID0gSVNoZWxsVmlld19RdWVyeUludGVyZmFjZShwc2YsICZJSURfSVNoZWxsVmlldywgKExQVk9JRCAqKXBwdik7CglJU2hlbGxWaWV3X1JlbGVhc2UocHNmKTsKCglyZXR1cm4gaFJlczsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hXaW5IZWxwCQkJCQlbU0hFTEwzMi4xMjddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFdpbkhlbHAgKERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix2LHcseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFJ1bkNvbnRyb2xQYW5lbCBbU0hFTEwzMi4xNjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJ1bkNvbnRyb2xQYW5lbCAoRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4CQkJCVtTSEVMTDMyLjI5MV0KICoKICovCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4QVcgKExQVk9JRCBzZWkpCnsJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFNoZWxsRXhlY3V0ZUV4VyAoc2VpKTsKCXJldHVybiBTaGVsbEV4ZWN1dGVFeEEgKHNlaSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXhBCQkJCVtTSEVMTDMyLjI5Ml0KICoKICogcGxhY2Vob2xkZXIgaW4gdGhlIGNvbW1hbmRsaW5lOgogKgklMSBmaWxlCiAqCSUyIHByaW50ZXIKICoJJTMgZHJpdmVyCiAqCSU0IHBvcnQKICoJJUkgYWRyZXNzIG9mIGEgZ2xvYmFsIGl0ZW0gSUQgKGV4cGxvcmVyIHN3aXRjaCAvaWRsaXN0KQogKgklTCA/Pz8gcGF0aC91cmwvY3VycmVudCBmaWxlID8/PwogKgklUyA/Pz8KICoJJSogYWxsIGZvbGxvd2luZyBwYXJhbWV0ZXJzIChzZWUgYmF0ZmlsZSkKICovCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4QSAoTFBTSEVMTEVYRUNVVEVJTkZPQSBzZWkpCnsgCUNIQVIgc3pBcHBsaWNhdGlvbk5hbWVbTUFYX1BBVEhdLHN6Q29tbWFuZGxpbmVbTUFYX1BBVEhdLHN6UGlkbFsyMF07CglMUFNUUiBwb3M7CglpbnQgZ2FwLCBsZW47CglTVEFSVFVQSU5GT0EgIHN0YXJ0dXA7CglQUk9DRVNTX0lORk9STUFUSU9OIGluZm87CgkJCQoJV0FSTigibWFzaz0weCUwOGx4IGh3bmQ9MHglMDR4IHZlcmI9JXMgZmlsZT0lcyBwYXJtPSVzIGRpcj0lcyBzaG93PTB4JTA4eCBjbGFzcz0lcyBpbmNvbXBsZXRlXG4iLAoJCXNlaS0+Zk1hc2ssIHNlaS0+aHduZCwgc2VpLT5scFZlcmIsIHNlaS0+bHBGaWxlLAoJCXNlaS0+bHBQYXJhbWV0ZXJzLCBzZWktPmxwRGlyZWN0b3J5LCBzZWktPm5TaG93LCAKCQkoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkgPyBzZWktPmxwQ2xhc3MgOiAibm90IHVzZWQiKTsKCglaZXJvTWVtb3J5KHN6QXBwbGljYXRpb25OYW1lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwRmlsZSkKCSAgc3RyY3B5KHN6QXBwbGljYXRpb25OYW1lLCBzZWktPmxwRmlsZSk7CgkKCVplcm9NZW1vcnkoc3pDb21tYW5kbGluZSxNQVhfUEFUSCk7CglpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHN0cmNweShzekNvbW1hbmRsaW5lLCBzZWktPmxwUGFyYW1ldGVycyk7CgkJCQoJaWYgKHNlaS0+Zk1hc2sgJiAoU0VFX01BU0tfQ0xBU1NLRVkgfCBTRUVfTUFTS19JTlZPS0VJRExJU1QgfCBTRUVfTUFTS19JQ09OIHwgU0VFX01BU0tfSE9US0VZIHwKCQkJICBTRUVfTUFTS19DT05ORUNUTkVURFJWIHwgU0VFX01BU0tfRkxBR19EREVXQUlUIHwKCQkJICBTRUVfTUFTS19ET0VOVlNVQlNUIHwgU0VFX01BU0tfRkxBR19OT19VSSB8IFNFRV9NQVNLX1VOSUNPREUgfCAKCQkJICBTRUVfTUFTS19OT19DT05TT0xFIHwgU0VFX01BU0tfQVNZTkNPSyB8IFNFRV9NQVNLX0hNT05JVE9SICkpCgl7CgkgIEZJWE1FKCJmbGFncyBpZ25vcmVkOiAweCUwOGx4XG4iLCBzZWktPmZNYXNrKTsKCX0KCQoJLyogbGF1bmNoIGEgZG9jdW1lbnQgYnkgZmlsZWNsYXNzIGxpa2UgJ1dvcmRwYWQuRG9jdW1lbnQuMScgKi8KCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKQoJewoJICAvKiB0aGUgY29tbWFuZGxpbmUgY29udGFpbnMgJ2M6XFBhdGhcd29yZHBhZC5leGUgIiUxIicgKi8KCSAgSENSX0dldEV4ZWN1dGVDb21tYW5kKHNlaS0+bHBDbGFzcywgKHNlaS0+bHBWZXJiKSA/IHNlaS0+bHBWZXJiIDogIm9wZW4iLCBzekNvbW1hbmRsaW5lLCAyNTYpOwoJICAvKiBmaXhtZTogZ2V0IHRoZSBleHRlbnNpb24gb2YgbHBGaWxlLCBjaGVjayBpZiBpdCBmaXRzIHRvIHRoZSBscENsYXNzICovCgkgIFRSQUNFKCJTRUVfTUFTS19DTEFTU05BTUUtPiclcydcbiIsIHN6Q29tbWFuZGxpbmUpOwoJfQoKCS8qIHByb2Nlc3MgdGhlIElETGlzdCAqLwoJaWYgKCAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lOVk9LRUlETElTVCkgPT0gU0VFX01BU0tfSU5WT0tFSURMSVNUKSAvKjB4MGMqLwoJewoJICBTSEdldFBhdGhGcm9tSURMaXN0QSAoc2VpLT5scElETGlzdCxzekFwcGxpY2F0aW9uTmFtZSk7CgkgIFRSQUNFKCItLSBpZGxpc3Q9JXAgKCVzKVxuIiwgc2VpLT5scElETGlzdCwgc3pBcHBsaWNhdGlvbk5hbWUpOwoJfQoJZWxzZQoJewoJICBpZiAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lETElTVCApCgkgIHsKCSAgICBwb3MgPSBzdHJzdHIoc3pDb21tYW5kbGluZSwgIiVJIik7CgkgICAgaWYgKHBvcykKCSAgICB7CgkgICAgICBIR0xPQkFMIGhtZW0gPSBTSEFsbG9jU2hhcmVkICggc2VpLT5scElETGlzdCwgSUxHZXRTaXplKHNlaS0+bHBJRExpc3QpLCAwKTsKCSAgICAgIHNwcmludGYoc3pQaWRsLCI6JWxpIiwoRFdPUkQpU0hMb2NrU2hhcmVkKGhtZW0sMCkgKTsKCSAgICAgIFNIVW5sb2NrU2hhcmVkKGhtZW0pOwoJICAgIAoJICAgICAgZ2FwID0gc3RybGVuKHN6UGlkbCk7CgkgICAgICBsZW4gPSBzdHJsZW4ocG9zKS0yOwoJICAgICAgbWVtbW92ZShwb3MrZ2FwLHBvcysyLGxlbik7CgkgICAgICBtZW1jcHkocG9zLHN6UGlkbCxnYXApOwoKCSAgICB9CgkgIH0KCX0KCglUUkFDRSgiZXhlY3V0ZTonJXMnLCclcydcbiIsc3pBcHBsaWNhdGlvbk5hbWUsIHN6Q29tbWFuZGxpbmUpOwoKCXN0cmNhdChzekFwcGxpY2F0aW9uTmFtZSwgIiAiKTsKCXN0cmNhdChzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJWmVyb01lbW9yeSgmc3RhcnR1cCxzaXplb2YoU1RBUlRVUElORk9BKSk7CglzdGFydHVwLmNiID0gc2l6ZW9mKFNUQVJUVVBJTkZPQSk7CgoJaWYgKCEgQ3JlYXRlUHJvY2Vzc0EoTlVMTCwgc3pBcHBsaWNhdGlvbk5hbWUsCgkJCSBOVUxMLCBOVUxMLCBGQUxTRSwgMCwgCgkJCSBOVUxMLCBOVUxMLCAmc3RhcnR1cCwgJmluZm8pKQoJewoJICBzZWktPmhJbnN0QXBwID0gR2V0TGFzdEVycm9yKCk7CgkgIHJldHVybiBGQUxTRTsKCX0KCiAgICAgICAgc2VpLT5oSW5zdEFwcCA9IDMzOwoJCiAgICAJLyogR2l2ZSAzMCBzZWNvbmRzIHRvIHRoZSBhcHAgdG8gY29tZSB1cCAqLwoJaWYgKCBXYWl0Rm9ySW5wdXRJZGxlICggaW5mby5oUHJvY2VzcywgMzAwMDAgKSA9PSAgMHhGRkZGRkZGRiApCgkgIEVSUigiV2FpdEZvcklucHV0SWRsZSBmYWlsZWQ6IEVycm9yICVsZFxuIiwgR2V0TGFzdEVycm9yKCkgKTsKIAoJaWYoc2VpLT5mTWFzayAmIFNFRV9NQVNLX05PQ0xPU0VQUk9DRVNTKQoJICBzZWktPmhQcm9jZXNzID0gaW5mby5oUHJvY2VzczsJICAKICAgICAgICBlbHNlCiAgICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oUHJvY2VzcyApOwogICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4VwkJCQlbU0hFTEwzMi4yOTNdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeFcgKExQU0hFTExFWEVDVVRFSU5GT1cgc2VpKQp7CVNIRUxMRVhFQ1VURUlORk9BIHNlaUE7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiVwXG4iLCBzZWkpOwoKCW1lbWNweSgmc2VpQSwgc2VpLCBzaXplb2YoU0hFTExFWEVDVVRFSU5GT0EpKTsKCQogICAgICAgIGlmIChzZWktPmxwVmVyYikKCSAgc2VpQS5scFZlcmIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBWZXJiKTsKCiAgICAgICAgaWYgKHNlaS0+bHBGaWxlKQoJICBzZWlBLmxwRmlsZSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scEZpbGUpOwoKICAgICAgICBpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHNlaUEubHBQYXJhbWV0ZXJzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwUGFyYW1ldGVycyk7CgoJaWYgKHNlaS0+bHBEaXJlY3RvcnkpCgkgIHNlaUEubHBEaXJlY3RvcnkgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBEaXJlY3RvcnkpOwoKICAgICAgICBpZiAoKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpICYmIHNlaS0+bHBDbGFzcykKCSAgc2VpQS5scENsYXNzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwQ2xhc3MpOwoJZWxzZQoJICBzZWlBLmxwQ2xhc3MgPSBOVUxMOwoJICAJICAKCXJldCA9IFNoZWxsRXhlY3V0ZUV4QSgmc2VpQSk7CgogICAgICAgIGlmIChzZWlBLmxwVmVyYikJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFZlcmIgKTsKCWlmIChzZWlBLmxwRmlsZSkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scEZpbGUgKTsKCWlmIChzZWlBLmxwUGFyYW1ldGVycykJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFBhcmFtZXRlcnMgKTsKCWlmIChzZWlBLmxwRGlyZWN0b3J5KQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRGlyZWN0b3J5ICk7CglpZiAoc2VpQS5scENsYXNzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwQ2xhc3MgKTsKCiAJcmV0dXJuIHJldDsKfQoKc3RhdGljIExQVU5LTk9XTiBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZT0wOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4xNzZdCiAqCiAqIE5PVEVTCiAqICBTZXRzIHRoZSBpbnRlcmZhY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGdldHMgdGhlIGludGVyZmFjZSBwb2ludGVyIG9mIHRoZSBleHBsb3JlciBhbmQgYSByZWZlcmVuY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOICogbHBVbmtub3duKQp7CVRSQUNFKCIlcFxuIiwgbHBVbmtub3duKTsKCgkqbHBVbmtub3duID0gU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2U7CgoJaWYgKCFTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSkKCSAgcmV0dXJuIEVfRkFJTDsKCglJVW5rbm93bl9BZGRSZWYoU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UpOwoJcmV0dXJuIE5PRVJST1I7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlVW51c2VkTGlicmFyaWVzCQkJW1NIRUxMMzIuMTIzXQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hGcmVlVW51c2VkTGlicmFyaWVzICh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TZXREcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgREFEX1NldERyYWdJbWFnZSAoRFdPUkQgdSwgRFdPUkQgdikKeyBGSVhNRSgiMHglMDhseCAweCUwOGx4IHN0dWJcbiIsdSwgdik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1Nob3dEcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM3XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgREFEX1Nob3dEcmFnSW1hZ2UgKERXT1JEIHUpCnsgRklYTUUoIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0Nsb3NlS2V5CQkJW05UNC4wOlNIRUxMMzIuNTA1XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdDbG9zZUtleSAoSEtFWSBoa2V5KQp7CVRSQUNFKCIweCUwNHhcbiIsaGtleSk7CglyZXR1cm4gUmVnQ2xvc2VLZXkoIGhrZXkgKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ09wZW5LZXlBCQkJCVtTSEVMTDMyLjUwNl0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnT3BlbktleUEoSEtFWSBoS2V5LCBMUFNUUiBscFN1YktleSwgTFBIS0VZIHBoa1Jlc3VsdCkKewoJVFJBQ0UoIigweCUwOHgsICVzLCAlcClcbiIsIGhLZXksIGRlYnVnc3RyX2EobHBTdWJLZXkpLCBwaGtSZXN1bHQpOwoJcmV0dXJuIFJlZ09wZW5LZXlBKGhLZXksIGxwU3ViS2V5LCBwaGtSZXN1bHQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ09wZW5LZXlXCQkJCVtOVDQuMDpTSEVMTDMyLjUwN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnT3BlbktleVcgKEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5KQp7CVdBUk4oIjB4JTA0eCAlcyAlcFxuIixoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSkscmV0a2V5KTsKCXJldHVybiBSZWdPcGVuS2V5VyggaGtleSwgbHBzelN1YktleSwgcmV0a2V5ICk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlRXhBCQkJCVtTSEVMTDMyLjUwOV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZUV4QSgKCUhLRVkgaGtleSwKCUxQU1RSIGxwVmFsdWVOYW1lLAoJTFBEV09SRCBscFJlc2VydmVkLAoJTFBEV09SRCBscFR5cGUsCglMUEJZVEUgbHBEYXRhLAoJTFBEV09SRCBscGNiRGF0YSkKewoJVFJBQ0UoIjB4JTA0eCAlcyAlcCAlcCAlcCAlcFxuIiwgaGtleSwgbHBWYWx1ZU5hbWUsIGxwUmVzZXJ2ZWQsIGxwVHlwZSwgbHBEYXRhLCBscGNiRGF0YSk7CglyZXR1cm4gUmVnUXVlcnlWYWx1ZUV4QSAoaGtleSwgbHBWYWx1ZU5hbWUsIGxwUmVzZXJ2ZWQsIGxwVHlwZSwgbHBEYXRhLCBscGNiRGF0YSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlVwkJCQlbTlQ0LjA6U0hFTEwzMi41MTBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVXIChIS0VZIGhrZXksIExQV1NUUiBscHN6U3ViS2V5LAoJCQkJIExQV1NUUiBscHN6RGF0YSwgTFBEV09SRCBscGNiRGF0YSApCnsJV0FSTigiMHglMDR4ICVzICVwICVwIHNlbWktc3R1YlxuIiwKCQloa2V5LCBkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLCBscHN6RGF0YSwgbHBjYkRhdGEpOwoJcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVXKCBoa2V5LCBscHN6U3ViS2V5LCBscHN6RGF0YSwgbHBjYkRhdGEgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlRXhXCQkJCVtOVDQuMDpTSEVMTDMyLjUxMV0KICoKICogRklYTUUgCiAqICBpZiB0aGUgZGF0YXR5cGUgUkVHX0VYUEFORF9TWiB0aGVuIGV4cGFuZCB0aGUgc3RyaW5nIGFuZCBjaGFuZ2UKICogICpwZHdUeXBlIHRvIFJFR19TWi4gCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVFeFcgKEhLRVkgaGtleSwgTFBXU1RSIHBzelZhbHVlLCBMUERXT1JEIHBkd1Jlc2VydmVkLAoJCSBMUERXT1JEIHBkd1R5cGUsIExQVk9JRCBwdkRhdGEsIExQRFdPUkQgcGNiRGF0YSkKewlEV09SRCByZXQ7CglXQVJOKCIweCUwNHggJXMgJXAgJXAgJXAgJXAgc2VtaS1zdHViXG4iLAoJCWhrZXksIGRlYnVnc3RyX3cocHN6VmFsdWUpLCBwZHdSZXNlcnZlZCwgcGR3VHlwZSwgcHZEYXRhLCBwY2JEYXRhKTsKCXJldCA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKCBoa2V5LCBwc3pWYWx1ZSwgcGR3UmVzZXJ2ZWQsIHBkd1R5cGUsIHB2RGF0YSwgcGNiRGF0YSk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFZhbHVlQQogKgogKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnkKICovCkRXT1JEIFdJTkFQSSBTSEdldFZhbHVlQSgKICAgIEhLRVkgICAgIGhrZXksCiAgICBMUENTVFIgICBwU3ViS2V5LAogICAgTFBDU1RSICAgcFZhbHVlLAogICAgTFBEV09SRCAgcHdUeXBlLAogICAgTFBWT0lEICAgcHZEYXRhLAogICAgTFBEV09SRCAgcGJEYXRhCiAgICApCnsKICAgIEZJWE1FKCIoJXApLHN0dWIhXG4iLCBwU3ViS2V5KTsKCglyZXR1cm4gRVJST1JfU1VDQ0VTUzsgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0VmFsdWVXCiAqCiAqIEdldHMgYSB2YWx1ZSBmcm9tIHRoZSByZWdpc3RyeQogKi8KRFdPUkQgV0lOQVBJIFNIR2V0VmFsdWVXKAogICAgSEtFWSAgICAgaGtleSwKICAgIExQQ1dTVFIgIHBTdWJLZXksCiAgICBMUENXU1RSICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdHZXRVU1ZhbHVlQQogKgogKiBHZXRzIGEgdXNlci1zcGVjaWZpYyByZWdpc3RyeSB2YWx1ZQogKi8KTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlQSgKICAgIExQQ1NUUiAgIHBTdWJLZXksCiAgICBMUENTVFIgICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdHZXRVU1ZhbHVlVwogKgogKiBHZXRzIGEgdXNlci1zcGVjaWZpYyByZWdpc3RyeSB2YWx1ZQogKi8KTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlVygKICAgIExQQ1dTVFIgIHBTdWJLZXksCiAgICBMUENXU1RSICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmbGFnSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQogIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleUEgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlBKEhLRVkgaGtleSwgTFBDU1RSIHBzelN1YktleSkKewoJRklYTUUoImhrZXk9MHglMDh4LCAlc1xuIiwgaGtleSwgZGVidWdzdHJfYShwc3pTdWJLZXkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleVcgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlXKEhLRVkgaGtleSwgTFBDV1NUUiBwc3pTdWJLZXkpCnsKCUZJWE1FKCJoa2V5PTB4JTA4eCwgJXNcbiIsIGhrZXksIGRlYnVnc3RyX3cocHN6U3ViS2V5KSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUyXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSZXRUb0J1ZkEJCQkJCVtTSExXQVBJLkBdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZkEgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQU1RSIGRlc3QsIERXT1JEIGxlbikKewoJcmV0dXJuIFN0clJldFRvU3RyTkEoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSZXRUb0J1ZlcJCQkJCVtTSExXQVBJLkBdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZlcgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQV1NUUiBkZXN0LCBEV09SRCBsZW4pCnsKCXJldHVybiBTdHJSZXRUb1N0ck5XKGRlc3QsIGxlbiwgc3JjLCBwaWRsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyUmV0VG9TdHJOCQkJCQlbU0hFTEwzMi45Nl0KICogCiAqIGNvbnZlcnRzIGEgU1RSUkVUIHRvIGEgbm9ybWFsIHN0cmluZwogKgogKiBOT1RFUwogKiAgdGhlIHBpZGwgaXMgZm9yIFNUUlJFVCBPRkZTRVQKICovCkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTkEgKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsKCVRSQUNFKCJkZXN0PTB4JXAgbGVuPTB4JWx4IHN0cnJldD0weCVwIHBpZGw9JXAgc3R1YlxuIixkZXN0LGxlbixzcmMscGlkbCk7CgoJc3dpdGNoIChzcmMtPnVUeXBlKQoJewoJICBjYXNlIFNUUlJFVF9XU1RSOgoJICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBzcmMtPnUucE9sZVN0ciwgLTEsIChMUFNUUilkZXN0LCBsZW4sIE5VTEwsIE5VTEwpOwoJICAgIFNIRnJlZShzcmMtPnUucE9sZVN0cik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9DU1RSQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsIHNyYy0+dS5jU3RyLCBsZW4pOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfT0ZGU0VUQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICBicmVhazsKCgkgIGRlZmF1bHQ6CgkgICAgRklYTUUoInVua25vd24gdHlwZSFcbiIpOwoJICAgIGlmIChsZW4pCgkgICAgewoJICAgICAgKihMUFNUUilkZXN0ID0gJ1wwJzsKCSAgICB9CgkgICAgcmV0dXJuKEZBTFNFKTsKCX0KCXJldHVybiBTX09LOwp9CgpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck5XIChMUFZPSUQgZGVzdCwgRFdPUkQgbGVuLCBMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsKQp7CglUUkFDRSgiZGVzdD0weCVwIGxlbj0weCVseCBzdHJyZXQ9MHglcCBwaWRsPSVwIHN0dWJcbiIsZGVzdCxsZW4sc3JjLHBpZGwpOwoKCXN3aXRjaCAoc3JjLT51VHlwZSkKCXsKCSAgY2FzZSBTVFJSRVRfV1NUUjoKCSAgICBsc3RyY3B5blcoKExQV1NUUilkZXN0LCBzcmMtPnUucE9sZVN0ciwgbGVuKTsKCSAgICBTSEZyZWUoc3JjLT51LnBPbGVTdHIpOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfQ1NUUkE6CgkgICAgbHN0cmNweW5BdG9XKChMUFdTVFIpZGVzdCwgc3JjLT51LmNTdHIsIGxlbik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9PRkZTRVRBOgoJICAgIGlmIChwaWRsKQoJICAgIHsKCSAgICAgIGxzdHJjcHluQXRvVygoTFBXU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICB9CgkgICAgYnJlYWs7CgoJICBkZWZhdWx0OgoJICAgIEZJWE1FKCJ1bmtub3duIHR5cGUhXG4iKTsKCSAgICBpZiAobGVuKQoJICAgIHsgKihMUFNUUilkZXN0ID0gJ1wwJzsKCSAgICB9CgkgICAgcmV0dXJuKEZBTFNFKTsKCX0KCXJldHVybiBTX09LOwp9CkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTkFXIChMUFZPSUQgZGVzdCwgRFdPUkQgbGVuLCBMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsKQp7CglpZihWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTdHJSZXRUb1N0ck5XIChkZXN0LCBsZW4sIHNyYywgcGlkbCk7CglyZXR1cm4gU3RyUmV0VG9TdHJOQSAoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJDaHJXCQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUxXQogKgogKi8KTFBXU1RSIFdJTkFQSSBTdHJDaHJXIChMUFdTVFIgc3RyLCBXQ0hBUiB4ICkKewoJVFJBQ0UoIiVzIDB4JTA0eFxuIixkZWJ1Z3N0cl93KHN0cikseCk7CglyZXR1cm4gQ1JURExMX3djc2NocihzdHIsIHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJDbXBOSVcJCQkJCVtOVCA0LjA6U0hFTEwzMi4qXQogKgogKi8KSU5UIFdJTkFQSSBTdHJDbXBOSVcgKCBMUFdTVFIgd3N0cjEsIExQV1NUUiB3c3RyMiwgSU5UIGxlbikKewoJVFJBQ0UoIiVzICVzICVpIHN0dWJcbiIsIGRlYnVnc3RyX3cod3N0cjEpLGRlYnVnc3RyX3cod3N0cjIpLGxlbik7CglyZXR1cm4gQ1JURExMX193Y3NuaWNtcCh3c3RyMSwgd3N0cjIsIGxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2NTaGFyZWQJCQkJW1NIRUxMMzIuNTIwXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBIZWFwQWxsb2MKICogIHBhcmFtZXRlcjIgaXMgZXF1YWwgdG8gdGhlIHNpemUgYWxsb2NhdGVkIHdpdGggSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIzIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICoKICogIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zdGVkIGFzIGxQYXJhbSB3aXRoIDB4NDAyIChXTV9VU0VSKzIpIHRvIHNvbWV3aGVyZQogKiAgV01fVVNFUisyIGNvdWxkIGJlIHRoZSB1bmRvY3VtZW50ZWQgQ1dNX1NFVFBBVEgKICogIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGNvbnRhaW5zIGEgcGlkbAogKi8KSEdMT0JBTCBXSU5BUEkgU0hBbGxvY1NoYXJlZChMUFZPSUQgcHNyYywgRFdPUkQgc2l6ZSwgRFdPUkQgcHJvY0lEKQp7CUhHTE9CQUwgaG1lbTsKCUxQVk9JRCBwbWVtOwoJCglUUkFDRSgicHRyPSVwIHNpemU9MHglMDRseCBwcm9jSUQ9MHglMDRseFxuIixwc3JjLHNpemUscHJvY0lEKTsKCWhtZW0gPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCBzaXplKTsKCWlmICghaG1lbSkKCSAgcmV0dXJuIDA7CgkKCXBtZW0gPSAgR2xvYmFsTG9jayAoaG1lbSk7CgoJaWYgKCEgcG1lbSkKCSAgcmV0dXJuIDA7CgkgIAoJbWVtY3B5IChwbWVtLCBwc3JjLCBzaXplKTsKCUdsb2JhbFVubG9jayhobWVtKTsgCglyZXR1cm4gaG1lbTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvY2tTaGFyZWQJCQkJCVtTSEVMTDMyLjUyMV0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqICB0aGUgcmVjZWl2ZXIgb2YgKFdNX1VTRVIrMikgdHJ5cyB0byBsb2NrIHRoZSBIQU5ETEUgKD8pIAogKiAgdGhlIHJldHVybnZhbHVlIHNlZW1zIHRvIGJlIGEgbWVtb3J5YWRyZXNzCiAqLwpMUFZPSUQgV0lOQVBJIFNITG9ja1NoYXJlZChIQU5ETEUgaG1lbSwgRFdPUkQgcHJvY0lEKQp7CVRSQUNFKCJoYW5kbGU9MHglMDR4IHByb2NJRD0weCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxMb2NrKGhtZW0pOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIVW5sb2NrU2hhcmVkCQkJCVtTSEVMTDMyLjUyMl0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hMb2NrU2hhcmVkCiAqLwpCT09MIFdJTkFQSSBTSFVubG9ja1NoYXJlZChIQU5ETEUgcG1lbSkKewlUUkFDRSgiaGFuZGxlPTB4JTA0eFxuIixwbWVtKTsKCXJldHVybiBHbG9iYWxVbmxvY2socG1lbSk7IAp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVNoYXJlZAkJCQkJW1NIRUxMMzIuNTIzXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSEFsbG9jU2hhcmVkCiAqICBwYXJhbWV0ZXIyIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICovCkhBTkRMRSBXSU5BUEkgU0hGcmVlU2hhcmVkKEhBTkRMRSBobWVtLCBEV09SRCBwcm9jSUQpCnsJVFJBQ0UoImhhbmRsZT0weCUwNHggMHglMDRseFxuIixobWVtLHByb2NJRCk7CglyZXR1cm4gR2xvYmFsRnJlZShobWVtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0QXBwU3RhcnRpbmdDdXJzb3IJCQkJW1NIRUxMMzIuOTldCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTZXRBcHBTdGFydGluZ0N1cnNvcihIV05EIHUsIERXT1JEIHYpCnsJRklYTUUoImh3bmQ9MHglMDR4IDB4JTA0bHggc3R1YlxuIix1LHYgKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9hZE9MRQkJCQkJW1NIRUxMMzIuMTUxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMb2FkT0xFKERXT1JEIHUpCnsJRklYTUUoIjB4JTA0bHggc3R1YlxuIix1KTsKCXJldHVybiBTX09LOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERyaXZlVHlwZQkJCQkJW1NIRUxMMzIuNjRdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEcml2ZVR5cGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBYm9ydEludm9rZUNvbW1hbmQJCQkJW1NIRUxMMzIuMTk4XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hBYm9ydEludm9rZUNvbW1hbmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSE91dE9mTWVtb3J5TWVzc2FnZUJveAkJCVtTSEVMTDMyLjEyNl0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94KERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdSx2LHcpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGbHVzaENsaXBib2FyZAkJCQlbU0hFTEwzMi4xMjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZsdXNoQ2xpcGJvYXJkKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckZvcm1hdEJ5dGVTaXplQQkJCQlbU0hMV0FQSV0KICovCkxQU1RSIFdJTkFQSSBTdHJGb3JtYXRCeXRlU2l6ZUEgKCBEV09SRCBkdywgTFBTVFIgcHN6QnVmLCBVSU5UIGNjaEJ1ZiApCnsJY2hhciBidWZbNjRdOwoJVFJBQ0UoIiVseCAlcCAlaVxuIiwgZHcsIHBzekJ1ZiwgY2NoQnVmKTsKCWlmICggZHc8MTAyNEwgKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIGJ5dGVzIiwgKEZMT0FUKWR3KTsKCX0KCWVsc2UgaWYgKCBkdzwxMDQ4NTc2TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBLQiIsIChGTE9BVClkdy8xMDI0KTsKCX0KCWVsc2UgaWYgKCBkdyA8IDEwNzM3NDE4MjRMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIE1CIiwgKEZMT0FUKWR3LzEwNDg1NzZMKTsKCX0KCWVsc2UKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBHQiIsIChGTE9BVClkdy8xMDczNzQxODI0TCk7Cgl9Cglsc3RyY3B5bkEgKHBzekJ1ZiwgYnVmLCBjY2hCdWYpOwoJcmV0dXJuIHBzekJ1ZjsJCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckZvcm1hdEJ5dGVTaXplVwkJCQlbU0hMV0FQSV0KICovCkxQV1NUUiBXSU5BUEkgU3RyRm9ybWF0Qnl0ZVNpemVXICggRFdPUkQgZHcsIExQV1NUUiBwc3pCdWYsIFVJTlQgY2NoQnVmICkKewljaGFyIGJ1Zls2NF07CglUUkFDRSgiJWx4ICVwICVpXG4iLCBkdywgcHN6QnVmLCBjY2hCdWYpOwoJaWYgKCBkdzwxMDI0TCApCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgYnl0ZXMiLCAoRkxPQVQpZHcpOwoJfQoJZWxzZSBpZiAoIGR3PDEwNDg1NzZMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEtCIiwgKEZMT0FUKWR3LzEwMjQpOwoJfQoJZWxzZSBpZiAoIGR3IDwgMTA3Mzc0MTgyNEwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgTUIiLCAoRkxPQVQpZHcvMTA0ODU3NkwpOwoJfQoJZWxzZQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEdCIiwgKEZMT0FUKWR3LzEwNzM3NDE4MjRMKTsKCX0KCWxzdHJjcHluQXRvVyAocHN6QnVmLCBidWYsIGNjaEJ1Zik7CglyZXR1cm4gcHN6QnVmOwkKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFdhaXRGb3JGaWxlVG9PcGVuCQkJCVtTSEVMTDMyLjk3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXYWl0Rm9yRmlsZVRvT3BlbihEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3KQp7CUZJWE1FKCIweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdix3KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTAkJCVtTSEVMTDMyLjhdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBDb250cm9sX0ZpbGxDYWNoZV9SdW5ETEwoSFdORCBoV25kLCBIQU5ETEUgaE1vZHVsZSwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRSgiMHglMDR4IDB4JTA0eCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIixoV25kLCBoTW9kdWxlLHcseCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5ETExfQ2FsbEVudHJ5MTYJCQkJW1NIRUxMMzIuMTIyXQogKiB0aGUgbmFtZSBpcyBwcm9wYWJseSB3cm9uZwogKi8KSFJFU1VMVCBXSU5BUEkgUnVuRExMX0NhbGxFbnRyeTE2KERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHYsdyx4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglzaGVsbDMyXzY1NAkJCQlbU0hFTEwzMi42NTRdCiAqCiAqIE5PVEVTOiBmaXJzdCBwYXJhbWV0ZXIgc2VlbXMgdG8gYmUgYSBwb2ludGVyIChzYW1lIGFzIHBhc3NlZCB0byBXcml0ZUNhYmluZXRTdGF0ZSkKICogc2Vjb25kIG9uZSBjb3VsZCBiZSBhIHNpemUgKDB4MGMpLiBUaGUgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RydWN0dXJlIHNhdmVkIHRvCiAqIEhDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxDYWJpbmV0U3RhdGUKICogSSdtIChqcykgZ3Vlc3Npbmc6IHRoaXMgb25lIGlzIGp1c3QgUmVhZENhYmluZXRTdGF0ZSA7LSkKICovCkhSRVNVTFQgV0lOQVBJIHNoZWxsMzJfNjU0IChEV09SRCB4LCBEV09SRCB5KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUkxCdWlsZExpc3RPZlBhdGhzCQkJW1NIRUxMMzIuMTQ2XQogKgogKiBOT1RFUwogKiAgIGJ1aWxkcyBhIERQQQogKi8KRFdPUkQgV0lOQVBJIFJMQnVpbGRMaXN0T2ZQYXRocyAodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0clRvT2xlU3RyCQkJW1NIRUxMMzIuMTYzXQogKgogKi8KaW50IFdJTkFQSSBTdHJUb09sZVN0ckEgKExQV1NUUiBscFdpZGVDaGFyU3RyLCBMUENTVFIgbHBNdWx0aUJ5dGVTdHJpbmcpCnsKCVRSQUNFKCIoJXAsICVwICVzKVxuIiwKCWxwV2lkZUNoYXJTdHIsIGxwTXVsdGlCeXRlU3RyaW5nLCBkZWJ1Z3N0cl9hKGxwTXVsdGlCeXRlU3RyaW5nKSk7CgoJcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoMCwgMCwgbHBNdWx0aUJ5dGVTdHJpbmcsIC0xLCBscFdpZGVDaGFyU3RyLCBNQVhfUEFUSCk7Cgp9CmludCBXSU5BUEkgU3RyVG9PbGVTdHJXIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDV1NUUiBscFdTdHJpbmcpCnsKCVRSQUNFKCIoJXAsICVwICVzKVxuIiwKCWxwV2lkZUNoYXJTdHIsIGxwV1N0cmluZywgZGVidWdzdHJfdyhscFdTdHJpbmcpKTsKCglpZiAobHN0cmNweVcgKGxwV2lkZUNoYXJTdHIsIGxwV1N0cmluZyApKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwV2lkZUNoYXJTdHIpOwoJfQoJcmV0dXJuIDA7Cn0KCkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyQVcgKExQV1NUUiBscFdpZGVDaGFyU3RyLCBMUENWT0lEIGxwU3RyaW5nKQp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU3RyVG9PbGVTdHJXIChscFdpZGVDaGFyU3RyLCBscFN0cmluZyk7CglyZXR1cm4gU3RyVG9PbGVTdHJBIChscFdpZGVDaGFyU3RyLCBscFN0cmluZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hWYWxpZGF0ZVVOQwkJCQlbU0hFTEwzMi4xNzNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFZhbGlkYXRlVU5DIChEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CglGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3RBCQkJW1NIRUxMMzIuMTIyMl0KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdEEoTFBTVFIgeCwgTFBTVFIgeSkKewoJRklYTUUoIiglcCAlcywgJXAgJXMpIHN0dWJcbiIsIHgsIGRlYnVnc3RyX2EoeCksIHksIGRlYnVnc3RyX2EoeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLjEyMjNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RXKExQV1NUUiB4LCBMUFdTVFIgeSkKewoJRklYTUUoIiglcCAlcywgJXAgJXMpIHN0dWJcbiIsIHgsIGRlYnVnc3RyX3coeCksIHksIGRlYnVnc3RyX3coeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0CQkJW1NIRUxMMzIuNTNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RBVyhMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBEb0Vudmlyb25tZW50U3Vic3RXKHgsIHkpOwoJcmV0dXJuIERvRW52aXJvbm1lbnRTdWJzdEEoeCwgeSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgc2hlbGwzMl8yNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjI0M10KICogCiAqIFdpbjk4KyBieS1vcmRpbmFsIHJvdXRpbmUuICBJbiBXaW45OCB0aGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvIGFuZAogKiBkb2VzIG5vdGhpbmcgZWxzZS4gIFBvc3NpYmx5IHRoaXMgZG9lcyBzb21ldGhpbmcgaW4gTlQgb3IgU0hFTEwzMiA1LjA/CiAqCiAqLwoKQk9PTCBXSU5BUEkgc2hlbGwzMl8yNDMoRFdPUkQgYSwgRFdPUkQgYikgCnsgCiAgcmV0dXJuIEZBTFNFOyAKfQoK