LyogRmlsZSAiRmFzdFRpbWVzLmMiIC0gT3JpZ2luYWwgY29kZSBieSBNYXR0IFNsb3QgPGZwcmVmZWN0QGFtYnJvc2lhc3cuY29tPiAgKi8KLyogQ3JlYXRlZCA0LzI0Lzk5ICAgIC0gVGhpcyBmaWxlIGlzIGhlcmVieSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gICAgICAgKi8KLyogVXBkYXRlZCA1LzIxLzk5ICAgIC0gQ2FsaWJyYXRlIHRvIFZJQSwgYWRkIFRCUiBzdXBwb3J0LCByZW5hbWVkIGZ1bmN0aW9ucyAgKi8KLyogVXBkYXRlZCAxMC80Lzk5ICAgIC0gVXNlIEFic29sdXRlVG9OYW5vc2Vjb25kcygpIGluIGNhc2UgQWJzb2x1dGUgPSBkb3VibGUgKi8KLyogVXBkYXRlZCAyLzE1LzAwICAgIC0gQ2hlY2sgZm9yIG5hdGl2ZSBUaW1lIE1hbmFnZXIsIG5vIG5lZWQgdG8gY2FsaWJyYXRlICAgKi8KLyogVXBkYXRlZCAyLzE5LzAwICAgIC0gRml4ZWQgZGVmYXVsdCB2YWx1ZSBmb3IgZ1NjYWxlIHVuZGVyIG5hdGl2ZSBUaW1lIE1nciAgKi8KLyogVXBkYXRlZCAzLzIxLzAwICAgIC0gRml4ZWQgbnMgY29udmVyc2lvbiwgY3JlYXRlIDIgZGlmZmVyZW50IHNjYWxlIGZhY3RvcnMgKi8KLyogVXBkYXRlZCA1LzAzLzAwICAgIC0gQWRkZWQgY29weXJpZ2h0IGFuZCBwbGFjZWQgaW50byBQRC4gTm8gY29kZSBjaGFuZ2VzICAgKi8KLyogVXBkYXRlZCA4LzAxLzAwICAgIC0gTWFkZSAiQ2FyYm9uLWNvbXBhdGlibGUiIGJ5IHJlcGxhY2luZyBMTUdldFRpY2tzKCkgICAgKi8KCi8qIFRoaXMgZmlsZSBpcyBDb3B5cmlnaHQgKEMpIE1hdHQgU2xvdCwgMTk5OS0yMDAwLiBJdCBpcyBoZXJlYnkgcGxhY2VkIGludG8gCiAgIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgYXV0aG9yIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGZpdG5lc3Mgb3Igc3RhYmlsaXR5ICovCgojaW5jbHVkZSA8R2VzdGFsdC5oPgojaW5jbHVkZSA8TG93TWVtLmg+CiNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CiNpbmNsdWRlIDxEcml2ZXJTZXJ2aWNlcy5oPgojaW5jbHVkZSA8VGltZXIuaD4KCiNpbmNsdWRlICJGYXN0VGltZXMuaCIKCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qCglPbiA2ODB4MCBtYWNoaW5lcywgd2UganVzdCB1c2UgTWljcm9zZWNvbmRzKCkuCgkKCU9uIFBvd2VyUEMgbWFjaGluZXMsIHdlIHRyeSBzZXZlcmFsIG1ldGhvZHM6CgkgICogRHJpdmVyU2VydmljZXNMaWIgaXMgYXZhaWxhYmxlIG9uIGFsbCBQQ0kgUG93ZXJNYWNzLCBhbmQgcGVyaGFwcwoJICAgIHNvbWUgTnVCdXMgUG93ZXJNYWNzLiBJZiBpdCBpcywgd2UgdXNlIFVwVGltZSgpIDogT3ZlcmhlYWQgPSAyLjEgtXNlYy4KCSAgKiBUaGUgUG93ZXJQQyA2MDEgaGFzIGEgYnVpbHQtaW4gInJlYWwgdGltZSBjbG9jayIgUlRDLCBhbmQgd2UgZmFsbAoJICAgIGJhY2sgdG8gdGhhdCwgYWNjZXNzaW5nIGl0IGRpcmVjdGx5IGZyb20gYXNtLiBPdmVyaGVhZCA9IDEuMyC1c2VjLgoJICAqIExhdGVyIFBvd2VyUENzIGhhdmUgYW4gYWNjdXJhdGUgInRpbWUgYmFzZSByZWdpc3RlciIgVEJSLCBhbmQgd2UgCgkgICAgZmFsbCBiYWNrIHRvIHRoYXQsIGFjY2VzcyBpdCBmcm9tIFBvd2VyUEMgYXNtLiBPdmVyaGVhZCA9IDEuMyC1c2VjLgoJICAqIFdlIGNhbiBhbHNvIHRyeSBNaWNyb3NlY29uZHMoKSB3aGljaCBpcyBlbXVsYXRlZCA6IE92ZXJoZWFkID0gMzYgtXNlYy4KCglPbiBQb3dlclBDIG1hY2hpbmVzLCB3ZSBhdm9pZCB0aGUgZm9sbG93aW5nOgoJICAqIE9wZW5UcmFuc3BvcnQgaXMgYXZhaWxhYmxlIG9uIGFsbCBQQ0kgYW5kIHNvbWUgTnVCdXMgUG93ZXJNYWNzLCBidXQgaXQKCSAgICB1c2VzIFVwVGltZSgpIGlmIGF2YWlsYWJsZSBhbmQgZmFsbHMgYmFjayB0byBNaWNyb3NlY29uZHMoKSBvdGhlcndpc2UuCgkgICogSW5wdXRTcHJvY2tldCBpcyBhdmFpbGFibGUgb24gbWFueSBQb3dlck1hY3MsIGJ1dCBhZ2FpbiBpdCB1c2VzCgkgICAgVXBUaW1lKCkgaWYgYXZhaWxhYmxlIGFuZCBmYWxscyBiYWNrIHRvIE1pY3Jvc2Vjb25kcygpIG90aGVyd2lzZS4KCglBbm90aGVyIFBvd2VyUEMgbm90ZTogY2VydGFpbiBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSAzcmQgcGFydHkgdXBncmFkZQoJY2FyZHMsIG1heSByZXR1cm4gaW5hY2N1cmF0ZSB0aW1pbmdzIGZvciB0aGUgQ1BVIG9yIG1lbW9yeSBidXMgLS0gY2F1c2luZwoJc2tldyBpbiB2YXJpb3VzIHN5c3RlbSByb3V0aW5lcyAodXAgdG8gMjAlIGRyaWZ0ISkuIFRoZSBWSUEgY2hpcCBpcyB2ZXJ5CglhY2N1cmF0ZSwgYW5kIGl0J3MgdGhlIGJhc2lzIGZvciB0aGUgVGltZSBNYW5hZ2VyIGFuZCBNaWNyb3NlY29uZHMoKS4KCVVuZm9ydHVuYXRlbHksIGl0J3MgYWxzbyB2ZXJ5IHNsb3cgYmVjYXVzZSB0aGUgTWFjT1MgaGFzIHRvIChhKSBzd2l0Y2ggdG8KCTY4SyBhbmQgKGIpIHBvbGwgZm9yIGEgVklBIGV2ZW50LgoJCglXZSBjb21wZW5zYXRlIGZvciB0aGUgZHJpZnQgYnkgY2FsaWJyYXRpbmcgYSBmbG9hdGluZyBwb2ludCBzY2FsZSBmYWN0b3IKCWJldHdlZW4gb3VyIGZhc3QgbWV0aG9kIGFuZCB0aGUgYWNjdXJhdGUgdGltZXIgYXQgc3RhcnR1cCwgdGhlbiBjb252ZXJ0CgllYWNoIHNhbXBsZSBxdWlja2x5IG9uIHRoZSBmbHkuIEknZCByYXRoZXIgbm90IGhhdmUgdGhlIGluaXRpYWxpemF0aW9uIAoJb3ZlcmhlYWQgLS0gYnV0IGl0J3Mgc2ltcGx5IG5lY2Vzc2FyeSBmb3IgYWNjdXJhdGUgdGltaW5nLiBZb3UgY2FuIGRyb3AKCWl0IGRvd24gdG8gMzAgdGlja3MgaWYgeW91IHByZWZlciwgYnV0IHRoYXQncyBhcyBsb3cgYXMgSSdkIHJlY29tbWVuZC4KCglVbmRlciBNYWNPUyA5LCAibmV3IHdvcmxkIiBNYWNzIChpTWFjcywgQitXIEczcyBhbmQgRytXIEc0cykgaGF2ZSBhIG5hdGl2ZQoJVGltZSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uOiBVcFRpbWUoKSwgTWljcm9zZWNvbmRzKCksIGFuZCBUaWNrQ291bnQoKSBhcmUKCWFsbCBiYXNlZCBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGNvdW50ZXIuIFRoaXMgbWFrZXMgaXQgc2lsbHkgdG8gY2FsaWJyYXRlCglVcFRpbWUoKSBhZ2FpbnN0IFRpY2tDb3VudCgpLiBXZSBub3cgY2hlY2sgZm9yIHRoaXMgZmVhdHVyZSB1c2luZyBHZXN0YWx0KCksCglhbmQgc2tpcCB0aGUgd2hvbGUgY2FsaWJyYXRpb24gc3RlcCBpZiBwb3NzaWJsZS4KCiovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgojZGVmaW5lIFJUQ1RvTmFubyh3KQkoKGRvdWJsZSkgKHcpLmhpICogMTAwMDAwMDAwMC4wICsgKGRvdWJsZSkgKHcpLmxvKQojZGVmaW5lIFdpZGVUbzY0Yml0KHcpCSgqKFVJbnQ2NCAqKSAmKHcpKQoKLyogTE1HZXRUaWNrcygpIGlzIG5vdCBpbiBDYXJib24gYW5kIFRpY2tDb3VudCgpIGhhcyBhIGZhaXIgYml0IG9mIG92ZXJoZWFkLAogICBzbyBmb3Igc3BlZWQgd2UgYWx3YXlzIHJlYWQgbG93bWVtIGRpcmVjdGx5LiBUaGlzIGlzIGEgTWFjT1MgWCBuby1ubywgYnV0IAogICBpdCBhbHdheXMgd29yayBvbiB0aG9zZSBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIG5hdGl2ZSBUaW1lIE1hbmFnZXIgKGllLAogICBhbnl0aGluZyBiZWZvcmUgTWFjT1MgOSkgLS0gcmVnYXJkbGVzcyB3aGV0aGVyIHdlIGFyZSBpbiBDYXJib24gb3Igbm90ISAqLwojZGVmaW5lIE15TE1HZXRUaWNrcygpCSgqKHZvbGF0aWxlIFVJbnQzMiAqKSAweDE2QSkKCiNpZiBHRU5FUkFUSU5HUE9XRVJQQwoKc3RhdGljIGFzbSBVbnNpZ25lZFdpZGUgUG9sbFJUQyh2b2lkKTsKc3RhdGljIGFzbSBVbnNpZ25lZFdpZGUgUG9sbFRCUih2b2lkKTsKc3RhdGljIFB0ciBGaW5kRnVuY3Rpb25JblNoYXJlZExpYihTdHJpbmdQdHIgbGliTmFtZSwgU3RyaW5nUHRyIGZ1bmNOYW1lKTsKCnN0YXRpYyBCb29sZWFuCQkJZ0luaXRlZCA9IGZhbHNlOwpzdGF0aWMgQm9vbGVhbgkJCWdOYXRpdmUgPSBmYWxzZTsKc3RhdGljIEJvb2xlYW4JCQlnVXNlUlRDID0gZmFsc2U7CnN0YXRpYyBCb29sZWFuCQkJZ1VzZVRCUiA9IGZhbHNlOwpzdGF0aWMgZG91YmxlCQkJZ1NjYWxlVVNlYyA9IDEuMCAvIDEwMDAuMDsgICAgLyogMSAvICggbnNlYyAvIHVzZWMpICovCnN0YXRpYyBkb3VibGUJCQlnU2NhbGVNU2VjID0gMS4wIC8gMTAwMDAwMC4wOyAvKiAxIC8gKCBuc2VjIC8gbXNlYykgKi8KCi8qIEZ1bmN0aW9ucyBsb2FkZWQgZnJvbSBEcml2ZXJTZXJ2aWNlc0xpYiAqLwp0eXBlZGVmIEFic29sdXRlVGltZSAJKCpVcFRpbWVQcm9jUHRyKSh2b2lkKTsKdHlwZWRlZiBOYW5vc2Vjb25kcyAJKCpBMk5TUHJvY1B0cikoQWJzb2x1dGVUaW1lKTsKc3RhdGljIFVwVGltZVByb2NQdHIgCWdVcFRpbWUgPSBOVUxMOwpzdGF0aWMgQTJOU1Byb2NQdHIgCQlnQTJOUyA9IE5VTEw7CgojZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgp2b2lkIEZhc3RJbml0aWFsaXplKCkgewoJU0ludDMyCQkJcmVzdWx0OwoKCWlmICghZ0luaXRlZCkgewoKI2lmIEdFTkVSQVRJTkdQT1dFUlBDCgoJCS8qIEluaXRpYWxpemUgdGhlIGZlYXR1cmUgZmxhZ3MgKi8KCQlnTmF0aXZlID0gZ1VzZVJUQyA9IGdVc2VUQlIgPSBmYWxzZTsKCgkJLyogV2UgdXNlIENGTSB0byBmaW5kIGFuZCBsb2FkIG5lZWRlZCBzeW1ib2xzIGZyb20gc2hhcmVkIGxpYnJhcmllcywgc28KCQkgICB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBoYXZlIHRvIHdlYWstbGluayB0aGVtLCBmb3IgY29udmVuaWVuY2UuICAgKi8KCQlnVXBUaW1lID0gKFVwVGltZVByb2NQdHIpIEZpbmRGdW5jdGlvbkluU2hhcmVkTGliKAoJCQkJIlxwRHJpdmVyU2VydmljZXNMaWIiLCAiXHBVcFRpbWUiKTsKCQlpZiAoZ1VwVGltZSkgZ0EyTlMgPSAoQTJOU1Byb2NQdHIpIEZpbmRGdW5jdGlvbkluU2hhcmVkTGliKAoJCQkJIlxwRHJpdmVyU2VydmljZXNMaWIiLCAiXHBBYnNvbHV0ZVRvTmFub3NlY29uZHMiKTsKCQlpZiAoIWdBMk5TKSBnVXBUaW1lID0gbmlsOyAvKiBQZWRhbnRpYyBidXQgbmVjZXNzYXJ5ICovCgoJCWlmIChnVXBUaW1lKSB7CgkJCS8qIElmIHdlIGxvYWRlZCBVcFRpbWUoKSwgdGhlbiB3ZSBuZWVkIHRvIGtub3cgaWYgdGhlIHN5c3RlbSBoYXMKCQkJICAgYSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRpbWUgTWFuYWdlci4gSWYgc28sIHRoZW4gaXQncwoJCQkgICBwb2ludGxlc3MgdG8gY2FsY3VsYXRlIGEgc2NhbGUgZmFjdG9yIGFnYWluc3QgdGhlIG1pc3NpbmcgVklBICovCgoJCQkvKiBnZXN0YWx0TmF0aXZlVGltZU1nciA9IDQgaW4gc29tZSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgaGVhZGVycyAqLwoJCQlpZiAoIUdlc3RhbHQoZ2VzdGFsdFRpbWVNZ3JWZXJzaW9uLCAmcmVzdWx0KSAmJgoJCQkJCShyZXN1bHQgPiBnZXN0YWx0RXh0ZW5kZWRUaW1lTWdyKSkgCgkJCQlnTmF0aXZlID0gdHJ1ZTsKCQkJfQoJCSAgZWxzZSB7CgkJCS8qIElmIG5vIERyaXZlclNlcnZpY2VzTGliLCB1c2UgR2VzdGFsdCgpIHRvIGdldCB0aGUgcHJvY2Vzc29yIHR5cGUuIAoJCQkgICBPbmx5IE51QnVzIFBvd2VyTWFjcyB3aXRoIG9sZCBTeXN0ZW0gU29mdHdhcmUgd29uJ3QgaGF2ZSBEU0wsIHNvCgkJCSAgIHdlIGtub3cgaXQgc2hvdWxkIGVpdGhlciBiZSBhIDYwMSBvciA2MDMuICovCgoJCQkvKiBVc2UgdGhlIHByb2Nlc3NvciBnZXN0YWx0IHRvIGRldGVybWluZSB3aGljaCByZWdpc3RlciB0byB1c2UgKi8KCQkgCWlmICghR2VzdGFsdChnZXN0YWx0TmF0aXZlQ1BVdHlwZSwgJnJlc3VsdCkpIHsKCQkJCWlmIChyZXN1bHQgPT0gZ2VzdGFsdENQVTYwMSkgZ1VzZVJUQyA9IHRydWU7CgkJCQkgIGVsc2UgaWYgKHJlc3VsdCA+IGdlc3RhbHRDUFU2MDEpIGdVc2VUQlIgPSB0cnVlOwoJCQkJfQoJCQl9CgoJCS8qIE5vdyBjYWxjdWxhdGUgYSBzY2FsZSBmYWN0b3IgdG8ga2VlcCB1cyBhY2N1cmF0ZS4gKi8KCQlpZiAoKGdVcFRpbWUgJiYgIWdOYXRpdmUpIHx8IGdVc2VSVEMgfHwgZ1VzZVRCUikgewoJCQlVSW50NjQJCQl0aWNrLCB1c2VjMSwgdXNlYzI7CgkJCVVuc2lnbmVkV2lkZQl3aWRlOwoKCQkJLyogV2FpdCBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmVyeSBuZXh0IHRpY2sgKi8KCQkJZm9yKHRpY2sgPSBNeUxNR2V0VGlja3MoKSArIDE7IHRpY2sgPiBNeUxNR2V0VGlja3MoKTsgKTsKCQkJCgkJCS8qIFBvbGwgdGhlIHNlbGVjdGVkIHRpbWVyIGFuZCBwcmVwYXJlIGl0IChzaW5jZSB3ZSBoYXZlIHRpbWUpICovCgkJCXdpZGUgPSAoZ1VwVGltZSkgPyAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpIDogCgkJCQkJKChnVXNlUlRDKSA/IFBvbGxSVEMoKSA6IFBvbGxUQlIoKSk7CgkJCXVzZWMxID0gKGdVc2VSVEMpID8gUlRDVG9OYW5vKHdpZGUpIDogV2lkZVRvNjRiaXQod2lkZSk7CgkJCQoJCQkvKiBXYWl0IGZvciB0aGUgZXhhY3QgNjB0aCB0aWNrIHRvIHJvbGwgb3ZlciAqLwoJCQl3aGlsZSh0aWNrICsgNjAgPiBNeUxNR2V0VGlja3MoKSk7CgoJCQkvKiBQb2xsIHRoZSBzZWxlY3RlZCB0aW1lciBhZ2FpbiBhbmQgcHJlcGFyZSBpdCAgKi8KCQkJd2lkZSA9IChnVXBUaW1lKSA/ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSkgOiAKCQkJCQkoKGdVc2VSVEMpID8gUG9sbFJUQygpIDogUG9sbFRCUigpKTsKCQkJdXNlYzIgPSAoZ1VzZVJUQykgPyBSVENUb05hbm8od2lkZSkgOiBXaWRlVG82NGJpdCh3aWRlKTsKCQkJCgkJCS8qIENhbGN1bGF0ZSBhIHNjYWxlIHZhbHVlIHRoYXQgd2lsbCBnaXZlIG1pY3Jvc2Vjb25kcyBwZXIgc2Vjb25kLgoJCQkgICBSZW1lbWJlciwgdGhlcmUgYXJlIGFjdHVhbGx5IDYwLjE1IHRpY2tzIGluIGEgc2Vjb25kLCBub3QgNjAuICAqLwoJCQlnU2NhbGVVU2VjID0gKDYwLjAgKiAxMDAwMDAwLjApIC8gKCh1c2VjMiAtIHVzZWMxKSAqIDYwLjE1KTsKCQkJZ1NjYWxlTVNlYyA9IGdTY2FsZVVTZWMgLyAxMDAwLjA7CgkJCX0KCiNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwoKCQkvKiBXZSd2ZSBpbml0aWFsaXplZCBvdXIgZ2xvYmFscyAqLwoJCWdJbml0ZWQgPSB0cnVlOwoJCX0KCX0KCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgpVSW50NjQgRmFzdE1pY3Jvc2Vjb25kcygpIHsKCVVuc2lnbmVkV2lkZQl3aWRlOwoJVUludDY0CQkJdXNlYzsKCQojaWYgR0VORVJBVElOR1BPV0VSUEMKCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCglpZiAoIWdJbml0ZWQpIEZhc3RJbml0aWFsaXplKCk7CgkKCWlmIChnTmF0aXZlKSB7CgkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLwoJCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwoJCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXBUaW1lKSB7CgkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLwoJCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwoJCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXNlVEJSKSB7CgkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCgkJd2lkZSA9IFBvbGxUQlIoKTsKCQl1c2VjID0gKGRvdWJsZSkgV2lkZVRvNjRiaXQod2lkZSkgKiBnU2NhbGVVU2VjICsgMC41OwoJCX0KCSAgZWxzZSBpZiAoZ1VzZVJUQykgewoJCS8qIE9uIGEgNjAxLCB3ZSBjYW4gcG9sbCB0aGUgUlRDIGluc3RlYWQgKi8KCQl3aWRlID0gUG9sbFJUQygpOwoJCXVzZWMgPSAoZG91YmxlKSBSVENUb05hbm8od2lkZSkgKiBnU2NhbGVVU2VjICsgMC41OwoJCX0KCSAgZWxzZSAKI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCgkJewoJCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KCQlNaWNyb3NlY29uZHMoJndpZGUpOwoJCXVzZWMgPSBXaWRlVG82NGJpdCh3aWRlKTsKCQl9CgoJcmV0dXJuKHVzZWMpOwoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KClVJbnQ2NCBGYXN0TWlsbGlzZWNvbmRzKCkgewoJVW5zaWduZWRXaWRlCXdpZGU7CglVSW50NjQJCQltc2VjOwkKCQojaWYgR0VORVJBVElOR1BPV0VSUEMKCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCglpZiAoIWdJbml0ZWQpIEZhc3RJbml0aWFsaXplKCk7CgkKCWlmIChnTmF0aXZlKSB7CgkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLwoJCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwoJCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXBUaW1lKSB7CgkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLwoJCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwoJCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXNlVEJSKSB7CgkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCgkJd2lkZSA9IFBvbGxUQlIoKTsKCQltc2VjID0gKGRvdWJsZSkgV2lkZVRvNjRiaXQod2lkZSkgKiBnU2NhbGVNU2VjICsgMC41OwoJCX0KCSAgZWxzZSBpZiAoZ1VzZVJUQykgewoJCS8qIE9uIGEgNjAxLCB3ZSBjYW4gcG9sbCB0aGUgUlRDIGluc3RlYWQgKi8KCQl3aWRlID0gUG9sbFJUQygpOwoJCW1zZWMgPSAoZG91YmxlKSBSVENUb05hbm8od2lkZSkgKiBnU2NhbGVNU2VjICsgMC41OwoJCX0KCSAgZWxzZSAKI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCgkJewoJCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KCQlNaWNyb3NlY29uZHMoJndpZGUpOwoJCW1zZWMgPSAoKGRvdWJsZSkgV2lkZVRvNjRiaXQod2lkZSkgKyA1MDAuMCkgLyAxMDAwLjA7CgkJfQoKCXJldHVybihtc2VjKTsKCX0KCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgpTdHJpbmdQdHIgRmFzdE1ldGhvZCgpIHsKCVN0cmluZ1B0cgltZXRob2QgPSAiXHA8VW5rbm93bj4iOwoKI2lmIEdFTkVSQVRJTkdQT1dFUlBDCgkvKiBJbml0aWFsaXplIGdsb2JhbHMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGNhbGxlZCAqLwoJaWYgKCFnSW5pdGVkKSBGYXN0SW5pdGlhbGl6ZSgpOwoJCglpZiAoZ05hdGl2ZSkgewoJCS8qIFRoZSBUaW1lIE1hbmFnZXIgYW5kIFVwVGltZSgpIGFyZSBlbnRpcmVseSBuYXRpdmUgb24gdGhpcyBtYWNoaW5lICovCgkJbWV0aG9kID0gIlxwTmF0aXZlIFVwVGltZSgpIjsKCQl9CgkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCgkJbWV0aG9kID0gIlxwVXBUaW1lKCkiOwoJCX0KCSAgZWxzZSBpZiAoZ1VzZVRCUikgewoJCS8qIE9uIGEgcmVjZW50IFBvd2VyUEMsIHdlIHBvbGwgdGhlIFRCUiBkaXJlY3RseSAqLwoJCW1ldGhvZCA9ICJccFBvd2VyUEMgVEJSIjsKCQl9CgkgIGVsc2UgaWYgKGdVc2VSVEMpIHsKCQkvKiBPbiBhIDYwMSwgd2UgY2FuIHBvbGwgdGhlIFJUQyBpbnN0ZWFkICovCgkJbWV0aG9kID0gIlxwUG93ZXJQQyBSVEMiOwoJCX0KCSAgZWxzZSAKI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCgkJewoJCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KCQltZXRob2QgPSAiXHBNaWNyb3NlY29uZHMoKSI7CgkJfQoKCXJldHVybihtZXRob2QpOwoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KI3ByYWdtYSBtYXJrIC0KCiNpZiBHRU5FUkFUSU5HUE9XRVJQQwphc20gc3RhdGljIFVuc2lnbmVkV2lkZSBQb2xsUlRDXygpIHsKZW50cnkgUG9sbFJUQyAvKiBBdm9pZCBDb2RlV2FycmlvciBnbHVlICovCgltYWNoaW5lIDYwMQpAQUdBSU46CgltZnJ0Y3UJcjQgLyogUlRDVSA9IFNQUiA0ICovCgltZnJ0Y2wJcjUgLyogUlRDTCA9IFNQUiA1ICovCgltZnJ0Y3UJcjYKCWNtcHcJcjQscjYKCWJuZQkJQEFHQUlOCglzdHcJCXI0LDAocjMpCglzdHcJCXI1LDQocjMpCglibHIKCX0KCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgphc20gc3RhdGljIFVuc2lnbmVkV2lkZSBQb2xsVEJSXygpIHsKZW50cnkgUG9sbFRCUiAvKiBBdm9pZCBDb2RlV2FycmlvciBnbHVlICovCgltYWNoaW5lIDYwNApAQUdBSU46CgltZnRidQlyNCAvKiBUQlJVID0gU1BSIDI2OCAqLwoJbWZ0YglyNSAvKiBUQlJMID0gU1BSIDI2OSAqLwoJbWZ0YnUJcjYKCWNtcHcJcjQscjYKCWJuZQkJQEFHQUlOCglzdHcJCXI0LDAocjMpCglzdHcJCXI1LDQocjMpCglibHIKCX0KCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCgpzdGF0aWMgUHRyIEZpbmRGdW5jdGlvbkluU2hhcmVkTGliKFN0cmluZ1B0ciBsaWJOYW1lLCBTdHJpbmdQdHIgZnVuY05hbWUpIHsKCU9TRXJyCQkJCWVycm9yID0gbm9FcnI7CglTdHIyNTUJCQkJZXJyb3JTdHI7CglQdHIJCQkJCWZ1bmMgPSBOVUxMOwoJUHRyCQkJCQllbnRyeSA9IE5VTEw7CglDRnJhZ1N5bWJvbENsYXNzCXN5bUNsYXNzOwoJQ0ZyYWdDb25uZWN0aW9uSUQJY29ubklEOwoJCgkvKiBGaW5kIENGTSBjb250YWluZXJzIGZvciB0aGUgY3VycmVudCBhcmNoZWN0dXJlIC0tIENGTS1QUEMgb3IgQ0ZNLTY4SyAqLwoJaWYgKC8qIGVycm9yID0gKi8gR2V0U2hhcmVkTGlicmFyeShsaWJOYW1lLCBrQ29tcGlsZWRDRnJhZ0FyY2gsCgkJCWtMb2FkQ0ZyYWcsICZjb25uSUQsICZlbnRyeSwgZXJyb3JTdHIpKSByZXR1cm4oTlVMTCk7CglpZiAoLyogZXJyb3IgPSAqLyBGaW5kU3ltYm9sKGNvbm5JRCwgZnVuY05hbWUsICZmdW5jLCAmc3ltQ2xhc3MpKQoJCXJldHVybihOVUxMKTsKCQoJcmV0dXJuKGZ1bmMpOwoJfQojZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8K