LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCi8vIE1BUktFUih1cGRhdGVfcHJlY29tcC5weSk6IGF1dG9nZW4gaW5jbHVkZSBzdGF0ZW1lbnQsIGRvIG5vdCByZW1vdmUKI2luY2x1ZGUgInByZWNvbXBpbGVkX3NhbC5oeHgiCi8vIFRlc3RXaW4zMi5jcHAgOiBEZWZpbmllcnQgZGVuIEVpbnNwcnVuZ3B1bmt0IGb8ciBkaWUgQW53ZW5kdW5nLgovLwoKI2RlZmluZSBfV0lOMzJfRENPTQoKI2luY2x1ZGUgInN0ZGFmeC5oIgoKI2luY2x1ZGUgPHdpbmRvd3MuaD4KCiNpbmNsdWRlIDxvbGUyLmg+CiNpbmNsdWRlIDxvYmppZGwuaD4KI2luY2x1ZGUgPG9iamJhc2UuaD4KI2luY2x1ZGUgPHByb2Nlc3MuaD4KI2luY2x1ZGUgPG9sZWN0bC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGNydGRiZy5oPgojaW5jbHVkZSA8Li5cLi5caW5jXHN5c3Rvb2xzXHdpbjMyXE10YU9sZUNsaXBiLmg+CgojaW5jbHVkZSAicmVzb3VyY2UuaCIKCiNkZWZpbmUgTUFYX0xPQURTVFJJTkcgMTAwCgovLyBHbG9iYWxlIFZhcmlhYmxlbjoKSElOU1RBTkNFCQkJZ19oSW5zdDsJCQkJCQkvLyBha3R1ZWxsZSBJbnN0YW56CkhXTkQJCQkgICAgZ19od25kTWFpbjsKV0NIQVIJCQkJc3pUaXRsZVtNQVhfTE9BRFNUUklOR107CQkJLy8gVGV4dCBkZXIgVGl0ZWx6ZWlsZQpXQ0hBUgkJCQlzeldpbmRvd0NsYXNzW01BWF9MT0FEU1RSSU5HXTsJLy8gVGV4dCBkZXIgVGl0ZWx6ZWlsZQpMUFNUUkVBTQkJCWdfcFN0bSAgICA9IE5VTEw7CmNoYXIqCQkJCXBUZXh0QnVmZiA9IE5VTEw7CkRXT1JECQkJCWxEYXRhICAgICA9IDA7ClVJTlQJCQkJZ19uQ0JDaGFuZ2VzID0gMDsKCi8vIGZvcndhcmQgZGVjbGFyYXRpb24KQVRPTSAgTXlSZWdpc3RlckNsYXNzKCBISU5TVEFOQ0UgaEluc3RhbmNlICk7CkJPT0wgIEluaXRJbnN0YW5jZSggSElOU1RBTkNFLCBpbnQgKTsKSE1FTlUgR2V0U3ViTWVudUhhbmRsZSggSFdORCBod25kUGFyZW50LCBVSU5UIHVpVG9wTGV2ZWxJbmRleCApOwpCT09MICBJc0NsaXBib2FyZFZpZXdlciggSFdORCBod25kUGFyZW50ICk7CnZvaWQgIFN3aXRjaE1lbnVTdGF0ZSggSFdORCBod25kUGFyZW50ICk7CnZvaWQgIFJlZ2lzdGVyQ2xpcGJvYXJkVmlld2VyKCBCT09MIGJSZWdpc3RlciApOwp2b2lkIFNob3dBdmFpbGFibGVDbGlwYm9hcmRGb3JtYXRzKCBIV05EIGhXbmQsIEhEQyBoZGMsIFBBSU5UU1RSVUNUIHBzLCBSRUNUIHJjV25kICk7CnZvaWQgQ2xlYXJDbGlwYm9hcmRDb250ZW50KCBIV05EIGhXbmQgKTsKCnZvaWQgICAgQ0FMTEJBQ0sgT25DbGlwYm9hcmRDb250ZW50Q2hhbmdlKCB2b2lkICk7CkxSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyggSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0gKTsKTFJFU1VMVCBDQUxMQkFDSyBBYm91dCggSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0gKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaW5NYWluCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaW50IEFQSUVOVFJZIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgIExQU1RSICAgICBscENtZExpbmUsCiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuQ21kU2hvdyApCnsKIAkvLyBaVSBFUkxFRElHRU46IEb8Z2VuIFNpZSBoaWVyIGRlbiBDb2RlIGVpbi4KCU1TRyAgICAgbXNnOwoJSEFDQ0VMICBoQWNjZWxUYWJsZTsKCUhSRVNVTFQgaHIgPSBFX0ZBSUw7CgkKCS8vIGl0J3MgaW1wb3J0YW50IHRvIGluaXRpYWxpemUgb2xlCgkvLyBpbiBvcmRlciB0byB1c2UgdGhlIGNsaXBib2FyZAoJLy9ociA9IE9sZUluaXRpYWxpemUoIE5VTEwgKTsKCWhyID0gQ29Jbml0aWFsaXplRXgoIE5VTEwsIENPSU5JVF9NVUxUSVRIUkVBREVEICk7CgkKCWdfaEluc3QgPSBoSW5zdGFuY2U7CgoJLy8gR2xvYmFsZSBaZWljaGVuZm9sZ2VuIGluaXRpYWxpc2llcmVuCglMb2FkU3RyaW5nVyhnX2hJbnN0LCBJRFNfQVBQX1RJVExFLCBzelRpdGxlLCBNQVhfTE9BRFNUUklORyk7CglMb2FkU3RyaW5nVyhnX2hJbnN0LCBJRENfVEVTVFdJTjMyLCBzeldpbmRvd0NsYXNzLCBNQVhfTE9BRFNUUklORyk7CglNeVJlZ2lzdGVyQ2xhc3MoZ19oSW5zdCk7CgoJLy8gSW5pdGlhbGlzaWVydW5nIGRlciBBbndlbmR1bmcgZHVyY2hm/GhyZW46CglpZiggIUluaXRJbnN0YW5jZSggZ19oSW5zdCwgbkNtZFNob3cgKSApIAoJewoJCXJldHVybiBGQUxTRTsKCX0KCgloQWNjZWxUYWJsZSA9IExvYWRBY2NlbGVyYXRvcnMoaEluc3RhbmNlLCAoTFBDVFNUUilJRENfVEVTVFdJTjMyKTsKCgkvLyBIYXVwdG5hY2hyaWNodGVuc2NobGVpZmU6Cgl3aGlsZSggR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSApIAoJewoJCWlmKCAhVHJhbnNsYXRlQWNjZWxlcmF0b3IgKG1zZy5od25kLCBoQWNjZWxUYWJsZSwgJm1zZykgKSAKCQl7CgkJCVRyYW5zbGF0ZU1lc3NhZ2UoICZtc2cgKTsKCQkJRGlzcGF0Y2hNZXNzYWdlKCAmbXNnICk7CgkJfQoJfQoKCS8vIHVuaW5pdGlhbGl6aW5nIHRoZSBvbGUgbGlicmFyaWVzCgkvL09sZVVuaW5pdGlhbGl6ZSggKTsKCUNvVW5pbml0aWFsaXplKCApOwoKCXJldHVybiBtc2cud1BhcmFtOwp9CgoKCi8vCi8vICBGVU5LVElPTjogTXlSZWdpc3RlckNsYXNzKCkKLy8KLy8gIEFVRkdBQkU6IFJlZ2lzdHJpZXJ0IGRpZSBGZW5zdGVya2xhc3NlLgovLwovLyAgS09NTUVOVEFSRToKLy8KLy8gICAgRGllc2UgRnVua3Rpb24gdW5kIGlocmUgVmVyd2VuZHVuZyBzaW5kIG51ciBub3R3ZW5kaWcsIHdlbm4gZGllc2VyIENvZGUKLy8gICAgbWl0IFdpbjMyLVN5c3RlbWVuIHZvciBkZXIgJ1JlZ2lzdGVyQ2xhc3NFeCctRnVua3Rpb24ga29tcGF0aWJlbCBzZWluIHNvbGwsCi8vICAgIGRpZSB6dSBXaW5kb3dzIDk1IGhpbnp1Z2Vm/Gd0IHd1cmRlLiBFcyBpc3Qgd2ljaHRpZyBkaWVzZSBGdW5rdGlvbiBhdWZ6dXJ1ZmVuLAovLyAgICBkYW1pdCBkZXIgQW53ZW5kdW5nIGtsZWluZSBTeW1ib2xlIG1pdCBkZW4gcmljaHRpZ2VuIFByb3BvcnRpb25lbiB6dWdld2llc2VuCi8vICAgIHdlcmRlbi4KLy8KQVRPTSBNeVJlZ2lzdGVyQ2xhc3MoIEhJTlNUQU5DRSBoSW5zdGFuY2UgKQp7CglXTkRDTEFTU0VYVyB3Y2V4OwoKCXdjZXguY2JTaXplID0gc2l6ZW9mKFdORENMQVNTRVgpOyAKCgl3Y2V4LnN0eWxlCQkJPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKCXdjZXgubHBmblduZFByb2MJPSAoV05EUFJPQylXbmRQcm9jOwoJd2NleC5jYkNsc0V4dHJhCQk9IDA7Cgl3Y2V4LmNiV25kRXh0cmEJCT0gMDsKCXdjZXguaEluc3RhbmNlCQk9IGhJbnN0YW5jZTsKCXdjZXguaEljb24JCQk9IExvYWRJY29uKGhJbnN0YW5jZSwgKExQQ1RTVFIpSURJX1RFU1RXSU4zMik7Cgl3Y2V4LmhDdXJzb3IJCT0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwoJd2NleC5oYnJCYWNrZ3JvdW5kCT0gKEhCUlVTSCkoQ09MT1JfV0lORE9XKzEpOwoJd2NleC5scHN6TWVudU5hbWUJPSAoTFBDV1NUUilJRENfVEVTVFdJTjMyOwoJd2NleC5scHN6Q2xhc3NOYW1lCT0gc3pXaW5kb3dDbGFzczsKCXdjZXguaEljb25TbQkJPSBMb2FkSWNvbih3Y2V4LmhJbnN0YW5jZSwgKExQQ1RTVFIpSURJX1NNQUxMKTsKCglyZXR1cm4gUmVnaXN0ZXJDbGFzc0V4Vygmd2NleCk7Cn0KCi8vCi8vICAgRlVOS1RJT046IEluaXRJbnN0YW5jZShIQU5ETEUsIGludCkKLy8KLy8gICBBVUZHQUJFOiBTcGVpY2hlcnQgZGllIEluc3Rhbnp6dWdyaWZmc251bW1lciB1bmQgZXJzdGVsbHQgZGFzIEhhdXB0ZmVuc3RlcgovLwovLyAgIEtPTU1FTlRBUkU6Ci8vCi8vICAgICAgICBJbiBkaWVzZXIgRnVua3Rpb24gd2lyZCBkaWUgSW5zdGFuenp1Z3JpZmZzbnVtbWVyIGluIGVpbmVyIGdsb2JhbGVuIFZhcmlhYmxlCi8vICAgICAgICBnZXNwZWljaGVydCB1bmQgZGFzIEhhdXB0cHJvZ3JhbW1mZW5zdGVyIGVyc3RlbGx0IHVuZCBhbmdlemVpZ3QuCi8vCkJPT0wgSW5pdEluc3RhbmNlKCBISU5TVEFOQ0UgaEluc3RhbmNlLCBpbnQgbkNtZFNob3cgKQp7CiAgIGdfaHduZE1haW4gPSBDcmVhdGVXaW5kb3dFeFcoMCwgc3pXaW5kb3dDbGFzcywgc3pUaXRsZSwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKICAgICAgQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsKCiAgIGlmKCAhSXNXaW5kb3coIGdfaHduZE1haW4gKSApIAogICB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgfQoKICAgU2hvd1dpbmRvdyggZ19od25kTWFpbiwgbkNtZFNob3cgKTsKICAgVXBkYXRlV2luZG93KCBnX2h3bmRNYWluICk7CgogICByZXR1cm4gVFJVRTsKfQoKLy8KLy8gIEZVTktUSU9OOiBXbmRQcm9jKEhXTkQsIHVuc2lnbmVkLCBXT1JELCBMT05HKQovLwovLyAgQVVGR0FCRTogIFZlcmFyYmVpdGV0IE5hY2hyaWNodGVuIGb8ciBkYXMgSGF1cHRmZW5zdGVyLgovLwovLyAgV01fQ09NTUFORAktIEFud2VuZHVuZ3NtZW78IHZlcmFyYmVpdGVuCi8vICBXTV9QQUlOVAktIEhhdXB0ZmVuc3RlciBkYXJzdGVsbGVuCi8vICBXTV9ERVNUUk9ZCS0gQmVlbmRpZ3VuZ3NuYWNocmljaHQgYXVzZ2ViZW4gdW5kIHp1cvxja2tlaHJlbgovLwovLwpMUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKCWludCAgICAgICAgIHdtSWQ7CglpbnQgICAgICAgICB3bUV2ZW50OwoJUEFJTlRTVFJVQ1QgcHM7CglIREMgICAgICAgICBoZGM7CglXQ0hBUiAgICAgICBzekhlbGxvW01BWF9MT0FEU1RSSU5HXTsKCQoJCglMb2FkU3RyaW5nVyhnX2hJbnN0LCBJRFNfSEVMTE8sIHN6SGVsbG8sIE1BWF9MT0FEU1RSSU5HKTsKCglzd2l0Y2goIG1lc3NhZ2UgKSAKCXsKCWNhc2UgV01fQ1JFQVRFOgoJCUNsZWFyQ2xpcGJvYXJkQ29udGVudCggaFduZCApOwoJCWJyZWFrOwoKCQljYXNlIFdNX0NPTU1BTkQ6CgkJCXdtSWQgICAgPSBMT1dPUkQod1BhcmFtKTsgCgkJCXdtRXZlbnQgPSBISVdPUkQod1BhcmFtKTsgCgkJCS8vIE1lbvxhdXN3YWhsZW4gYW5hbHlzaWVyZW46CgkJCXN3aXRjaCggd21JZCApIAoJCQl7CgkJCQljYXNlIElERF9DQlZJRVdFUjoKCQkJCQlTd2l0Y2hNZW51U3RhdGUoIGhXbmQgKTsKCQkJCQlSZWdpc3RlckNsaXBib2FyZFZpZXdlciggSXNDbGlwYm9hcmRWaWV3ZXIoIGhXbmQgKSApOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgSURNX0VYSVQ6CgkJCQkgICBEZXN0cm95V2luZG93KCBoV25kICk7CgkJCQkgICBicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJICAgcmV0dXJuIERlZldpbmRvd1Byb2MoIGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgV01fUEFJTlQ6CgkJCWhkYyA9IEJlZ2luUGFpbnQgKGhXbmQsICZwcyk7CgkJCS8vIFpVIEVSTEVESUdFTjogSGllciBiZWxpZWJpZ2VuIENvZGUgenVtIFplaWNobmVuIGhpbnp1ZvxnZW4uLi4KCQkJUkVDVCBydDsKCQkJR2V0Q2xpZW50UmVjdCggaFduZCwgJnJ0ICk7CgkJCQoJCQlpZiAoIElzQ2xpcGJvYXJkVmlld2VyKCBnX2h3bmRNYWluICkgKQoJCQl7CgkJCQlTaG93QXZhaWxhYmxlQ2xpcGJvYXJkRm9ybWF0cyggaFduZCwgaGRjLCBwcywgcnQgKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCVdDSEFSIHdjU3RyaW5nW01BWF9MT0FEU1RSSU5HXTsKCQkJCUxvYWRTdHJpbmdXKGdfaEluc3QsIElEU19NU0dfQ0JWSUVXRVJfSVNfT0ZGLCB3Y1N0cmluZywgTUFYX0xPQURTVFJJTkcpOwkKCQkJCURyYXdUZXh0VyggaGRjLCB3Y1N0cmluZywgd2NzbGVuKCB3Y1N0cmluZyApLCAmcnQsIERUX0NFTlRFUiApOwoJCQl9CgkJCQoJCQlFbmRQYWludCggaFduZCwgJnBzICk7CgkJCWJyZWFrOwoKCQljYXNlIFdNX0RFU1RST1k6CgkJCVBvc3RRdWl0TWVzc2FnZSggMCApOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJcmV0dXJuIERlZldpbmRvd1Byb2MoIGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgIH0KICAgcmV0dXJuIDA7Cn0KCkhNRU5VIEdldFN1Yk1lbnVIYW5kbGUoIEhXTkQgaHduZFBhcmVudCwgVUlOVCB1aVRvcExldmVsSW5kZXggKQp7CglITUVOVSBoTWVudU1haW4gPSBHZXRNZW51KCBod25kUGFyZW50ICk7CglfQVNTRVJUKCBJc01lbnUoIGhNZW51ICkgKTsKCQoJSE1FTlUgaFN1Yk1lbnUgPSBHZXRTdWJNZW51KCBoTWVudU1haW4sIHVpVG9wTGV2ZWxJbmRleCApOwoJX0FTU0VSVCggSXNNZW51KCBoU3ViTWVudSApICk7CgoJcmV0dXJuIGhTdWJNZW51Owp9CgpCT09MIElzQ2xpcGJvYXJkVmlld2VyKCBIV05EIGh3bmRQYXJlbnQgKQp7CglITUVOVSBoU3ViTWVudSA9IEdldFN1Yk1lbnVIYW5kbGUoIGh3bmRQYXJlbnQsIDAgKTsKCVVJTlQgdWlNU3RhdGUgPSBHZXRNZW51U3RhdGUoIGhTdWJNZW51LCAwLCBNRl9CWVBPU0lUSU9OICk7CglyZXR1cm4gKCBNRl9DSEVDS0VEID09IHVpTVN0YXRlICk7Cn0KCnZvaWQgU3dpdGNoTWVudVN0YXRlKCBIV05EIGh3bmRQYXJlbnQgKQp7CglITUVOVSBoU3ViTWVudSA9IEdldFN1Yk1lbnVIYW5kbGUoIGh3bmRQYXJlbnQsIDAgKTsKCVdDSEFSIHdjTWVudVN0cmluZ1tNQVhfTE9BRFNUUklOR107CgoJaWYgKCBJc0NsaXBib2FyZFZpZXdlciggaHduZFBhcmVudCApICkKCXsKCQlMb2FkU3RyaW5nVyhnX2hJbnN0LCBJRFNfQ0JWSUVXRVJfT0ZGLCB3Y01lbnVTdHJpbmcsIE1BWF9MT0FEU1RSSU5HKTsJCQoJCU1vZGlmeU1lbnVXKCBoU3ViTWVudSwgMCwgTUZfQllQT1NJVElPTiB8IE1GX1NUUklORywgSUREX0NCVklFV0VSLCB3Y01lbnVTdHJpbmcgKTsKCQlDaGVja01lbnVJdGVtKCBoU3ViTWVudSwgMCwgTUZfQllQT1NJVElPTiB8IE1GX1VOQ0hFQ0tFRCApOwoJfQoJZWxzZQoJewoJCUxvYWRTdHJpbmdXKGdfaEluc3QsIElEU19DQlZJRVdFUl9PTiwgd2NNZW51U3RyaW5nLCBNQVhfTE9BRFNUUklORyk7CQkKCQlNb2RpZnlNZW51VyggaFN1Yk1lbnUsIDAsIE1GX0JZUE9TSVRJT04gfCBNRl9TVFJJTkcsIElERF9DQlZJRVdFUiwgd2NNZW51U3RyaW5nICk7CgkJQ2hlY2tNZW51SXRlbSggaFN1Yk1lbnUsIDAsIE1GX0JZUE9TSVRJT04gfCBNRl9DSEVDS0VEICk7Cgl9Cn0KCnZvaWQgUmVnaXN0ZXJDbGlwYm9hcmRWaWV3ZXIoIEJPT0wgYlJlZ2lzdGVyICkKewoJaWYgKCBiUmVnaXN0ZXIgKQoJCU1UQVJlZ2lzdGVyQ2xpcGJvYXJkVmlld2VyKCBPbkNsaXBib2FyZENvbnRlbnRDaGFuZ2UgKTsJCQoJZWxzZSAvLyB1bnJlZ2lzdGVyCgkJTVRBUmVnaXN0ZXJDbGlwYm9hcmRWaWV3ZXIoIE5VTEwgKTsKCQoJSW52YWxpZGF0ZVJlY3QoIGdfaHduZE1haW4sIE5VTEwsIFRSVUUgKTsKCVVwZGF0ZVdpbmRvdyggZ19od25kTWFpbiApOwp9Cgp2b2lkIFNob3dBdmFpbGFibGVDbGlwYm9hcmRGb3JtYXRzKCBIV05EIGhXbmQsIEhEQyBoZGMsIFBBSU5UU1RSVUNUIHBzLCBSRUNUIHJjV25kICkKewoJaWYgKCAhT3BlbkNsaXBib2FyZCggaFduZCApICkKCXsKCQlXQ0hBUiBzekVyck1zZ1tdID0geyBMIkNvdWxkbid0IG9wZW4gdGhlIGNsaXBib2FyZCIgfTsKCQlEcmF3VGV4dFcoIGhkYywgc3pFcnJNc2csIHdjc2xlbiggc3pFcnJNc2cgKSwgJnJjV25kLCBEVF9DRU5URVIgKTsKCQlyZXR1cm47Cgl9CgllbHNlCgl7CgkJV0NIQVIgc3pDQkNoYW5nZWRNc2dbMTAwXTsKCgkJd3NwcmludGZXKCBzekNCQ2hhbmdlZE1zZywgTCJDbGlwYm9hcmQgY29udGVudCBjaGFuZ2VkICVkIiwgZ19uQ0JDaGFuZ2VzICk7CgkJRHJhd1RleHRXKCBoZGMsIHN6Q0JDaGFuZ2VkTXNnLCB3Y3NsZW4oIHN6Q0JDaGFuZ2VkTXNnICksICZyY1duZCwgRFRfQ0VOVEVSICk7CgoJCUNsb3NlQ2xpcGJvYXJkKCApOwoJfQp9Cgp2b2lkIENsZWFyQ2xpcGJvYXJkQ29udGVudCggSFdORCBoV25kICkKewoJaWYgKCBPcGVuQ2xpcGJvYXJkKCBoV25kICkgKQoJewoJCUVtcHR5Q2xpcGJvYXJkKCApOwoJCUNsb3NlQ2xpcGJvYXJkKCApOwoJfQp9CgovLyBjbGlwYm9hcmQgdmlld2VyIGNhbGxiYWNrIGZ1bmN0aW9uCnZvaWQgQ0FMTEJBQ0sgT25DbGlwYm9hcmRDb250ZW50Q2hhbmdlKCB2b2lkICkKewoJKytnX25DQkNoYW5nZXM7CglJbnZhbGlkYXRlUmVjdCggZ19od25kTWFpbiwgTlVMTCwgVFJVRSApOwoJVXBkYXRlV2luZG93KCBnX2h3bmRNYWluICk7Cn0KCg==