LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAqClRoaXMgZmlsZSBpcyBwYXJ0IG9mIENlcnRpVm94IE0tUGluIENsaWVudCBhbmQgU2VydmVyIExpYnJhcmllcy4JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICoKVGhlIENlcnRpVm94IE0tUGluIENsaWVudCBhbmQgU2VydmVyIExpYnJhcmllcyBwcm92aWRlIGRldmVsb3BlcnMgd2l0aCBhbiBleHRlbnNpdmUgYW5kIGVmZmljaWVudCBzZXQgb2Ygc3Ryb25nIGF1dGhlbnRpY2F0aW9uIGFuZCBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucy4JCQkJCQkJCQkJCQkJCQkJICAgKgpGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgZmVhdHVyZXMgYW5kIGZ1bmN0aW9uYWxpdGllcyBwbGVhc2UgcmVmZXIgdG8gaHR0cDovL3d3dy5jZXJ0aXZveC5jb20JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICoKVGhlIENlcnRpVm94IE0tUGluIENsaWVudCBhbmQgU2VydmVyIExpYnJhcmllcyBhcmUgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCAzLUNsYXVzZSBMaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UgYXMgc3RhdGVkIGJlbG93LgkJICAgKgpUaGUgQ2VydGlWb3ggTS1QaW4gQ2xpZW50IGFuZCBTZXJ2ZXIgTGlicmFyaWVzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gICAqCk5vdGUgdGhhdCBDZXJ0aVZveCBMdGQgaXNzdWVzIGEgcGF0ZW50IGdyYW50IGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSB1bmRlciBzcGVjaWZpYyB0ZXJtcyBhbmQgY29uZGl0aW9ucywgd2hpY2ggeW91IGNhbiBmaW5kIGhlcmU6IGh0dHA6Ly9jZXJ0aXZveC5jb20vYWJvdXQtY2VydGl2b3gvcGF0ZW50cy8JCQkJCQkJCQkJCSAgICogCQpDb3B5cmlnaHQgKGMpIDIwMTMsIENlcnRpVm94IFVLIEx0ZAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAqCQpBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAqClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkJCQkJCQkJCQkJCQkJICAgKgqVCVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgKgkKlQlSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJICAgKgkKlQlOZWl0aGVyIHRoZSBuYW1lIG9mIENlcnRpVm94IFVLIEx0ZCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgkJCQkJCQkJICAgKgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCQkJCQkJCQkJCQkJCQkJCQkJICAgKgpUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUwkJCQkJCQkJCQkJCQkJCQkJICAgKgpCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUJCQkJCQkJCQkJCQkJCQkJCSAgICoJCkdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCQkJCQkJCQkJCQkJCQkgICAqCk9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkJCQkJCQkJCQkJICAgKgkKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISBcZmlsZSAgQ3ZUaW1lLmNwcAogICAgXGJyaWVmIFNldCBvZiBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgcHJvdmlkaW5nIHBvcnRhYmxlIHRpbWUgY29udmVydGlvbgoJICAgICAgIGFuZCBoYW5kbGluZyBmdW5jdGlvbmFsaXR5LgoKKi0gIFByb2plY3QgICAgIDogU2t5S2V5IFNESwoqLSAgQXV0aG9ycyAgICAgOiBNb255IEFsYWRqZW0KKi0gIENvbXBhbnkgICAgIDogQ2VydGl2b3gKKi0gIENyZWF0ZWQgICAgIDogQXVndXN0IDI0LCAyMDEyLCA5OjM5IEFNCiotICBMYXN0IHVwZGF0ZSA6IEZlYnJ1YXJ5IDE1LCAyMDEzCiotICBQbGF0Zm9ybSAgICA6IFdpbmRvd3MgWFAgU1AzIC0gV2luZG93cyA3CiotICBEZXBlbmRlbmN5ICA6IAoKIFNldCBvZiBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgcHJvdmlkaW5nIHBvcnRhYmxlIHRpbWUgY29udmVydGlvbgogYW5kIGhhbmRsaW5nIGZ1bmN0aW9uYWxpdHkuCgoqLwoKI2luY2x1ZGUgIkN2VGltZS5oIgoKI2lmZGVmIF9fTUFDSF9fCiAgICAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogICAgI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgojZW5kaWYKCm5hbWVzcGFjZSBDdlNoYXJlZAp7CgkKaW50IERhdGVUaW1lOjpHZXREYXlzSW5ZZWFyKCBpbnQgYVllYXIgKQp7CglEYXRlVGltZSBkYXRlVGltZTsKCQoJZGF0ZVRpbWUubV9kYXkgPSAwOwoJZGF0ZVRpbWUubV9tb250aCA9IDE7CglkYXRlVGltZS5tX3llYXIgPSBhWWVhcisxOwoJCglzdHJ1Y3QgdG0gdG1EYXRlVGltZTsKCWRhdGVUaW1lLlRvVG0oIHRtRGF0ZVRpbWUgKTsKCQoJcmV0dXJuIHRtRGF0ZVRpbWUudG1feWRheSsxOwp9CgppbnQgRGF0ZVRpbWU6OkdldERheXNJbk1vbnRoKCBpbnQgYU1vbnRoLCBpbnQgYVllYXIgKQp7CglEYXRlVGltZSBkYXRlVGltZTsKCQoJZGF0ZVRpbWUubV9kYXkgPSAwOwoJZGF0ZVRpbWUubV9tb250aCA9IGFNb250aCArIDE7CglkYXRlVGltZS5tX3llYXIgPSBhWWVhcjsKCQoJaWYgKCBkYXRlVGltZS5tX21vbnRoID4gMTIgKQoJewoJCWRhdGVUaW1lLm1fbW9udGggPSAxOwoJCSsrZGF0ZVRpbWUubV95ZWFyOwoJfQoJCglzdHJ1Y3QgdG0gdG1EYXRlVGltZTsKCWRhdGVUaW1lLlRvVG0oIHRtRGF0ZVRpbWUgKTsKCQoJcmV0dXJuIHRtRGF0ZVRpbWUudG1fbWRheTsKfQoKI2lmIGRlZmluZWQoX1dJTjMyKQoKaW50IGNsb2NrX2dldHRpbWUoIGludCBhRHVtbXksIFRpbWVTcGVjKiBhcFRpbWVzcGVjICkKewogICAgc3RhdGljIExBUkdFX0lOVEVHRVIgb2Zmc2V0OwogICAgc3RhdGljIGJvb2wgYkluaXRpYWxpemVkID0gZmFsc2U7CiAKCWlmICggIWJJbml0aWFsaXplZCApCgl7CgkJU1lTVEVNVElNRSBzOwoJCXMud1llYXIgPSAxOTcwOwoJCXMud01vbnRoID0gMTsKCQlzLndEYXkgPSAxOwoJCXMud0hvdXIgPSAwOwoJCXMud01pbnV0ZSA9IDA7CgkJcy53U2Vjb25kID0gMDsKCQlzLndNaWxsaXNlY29uZHMgPSAwOwoKCQlGSUxFVElNRSBmOwoJCVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCAmcywgJmYgKTsKCgkJTEFSR0VfSU5URUdFUiBvZmZzZXQ7CgkJb2Zmc2V0LlF1YWRQYXJ0ID0gZi5kd0hpZ2hEYXRlVGltZTsKCQlvZmZzZXQuUXVhZFBhcnQgPSAob2Zmc2V0LlF1YWRQYXJ0IDw8IDMyKSB8IGYuZHdMb3dEYXRlVGltZTsKCgkJYkluaXRpYWxpemVkID0gdHJ1ZTsKCX0KCiAgICBGSUxFVElNRSBmOwoJR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoICZmICk7CgogICAgTEFSR0VfSU5URUdFUiB0OwoJdC5RdWFkUGFydCA9IGYuZHdIaWdoRGF0ZVRpbWU7Cgl0LlF1YWRQYXJ0ID0gKHQuUXVhZFBhcnQgPDwgMzIpIHwgZi5kd0xvd0RhdGVUaW1lOwogICAgdC5RdWFkUGFydCAtPSBvZmZzZXQuUXVhZFBhcnQ7CgoJLy8gdC5RdWFkUGFydCBpcyBpbiAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMKCSphcFRpbWVzcGVjID0gTWljcm9zZWNzKHQuUXVhZFBhcnQvMTApLlRvVGltZVNwZWMoKTsKCglyZXR1cm4gMDsKfQoKI2VsaWYgZGVmaW5lZCAoX19NQUNIX18pCiAgICAKaW50IGNsb2NrX2dldHRpbWUoIGludCBhRHVtbXksIFRpbWVTcGVjKiBhcFRpbWVzcGVjICkKewogICAgY2xvY2tfc2Vydl90IGNjbG9jazsKICAgIG1hY2hfdGltZXNwZWNfdCBtdHM7CiAgICAKICAgIGhvc3RfZ2V0X2Nsb2NrX3NlcnZpY2UoIG1hY2hfaG9zdF9zZWxmKCksIENBTEVOREFSX0NMT0NLLCAmY2Nsb2NrICk7CiAgICAKICAgIGNsb2NrX2dldF90aW1lKGNjbG9jaywgJm10cyk7CiAgICAKICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksIGNjbG9jayk7CiAgICAKICAgIGFwVGltZXNwZWMtPnR2X3NlYyA9IG10cy50dl9zZWM7CiAgICBhcFRpbWVzcGVjLT50dl9uc2VjID0gbXRzLnR2X25zZWM7CiAgICAKICAgIHJldHVybiAwOwp9CiAgICAKI2VuZGlmCgkKfQ==