LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19BTEFSTSBUZW1wbGF0ZS4KICAqCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGUgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgQUxBUk0gZm9yIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcwogICogICAgICAgICAgICsgVGhlIGFsYXJtIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IGFuIGludGVycnVwdCB3aGVuIHRoZSBSVEMgcmVhY2hlcyAxbXMgCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgYXQgZWFjaCBBbGFybSBldmVudCBhbmQgdGhlIHRpbWUgaXMgcmVzZXQgdG8gMDA6MDA6MDAKICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UgIAogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJmNHh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm0uYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmY0eHhfaGFsX2NvbmYuaCAKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAogICAgKEApIFRoZSBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKICAqIEB7CiAgKi8gCgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgUlRDIENsb2NrIHNvdXJjZSBmb3IgeW91ciBhcHBsaWNhdGlvbjogCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0hTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIHRpbWluZyBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTSTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKi8KI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0hTRQovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgOTlVCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICA5VQogICNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV8xTUhaICAgKCh1aW50MzJfdCkoKHVpbnQzMl90KVJDQ19CRENSX1JUQ1NFTCB8ICh1aW50MzJfdCkoKEhTRV9WQUxVRS8xMDAwMDAwVSkgPDwgMTZVKSkpCiNlbHNlIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFIHx8IFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAwVQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0hTRSAqLwoKLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlOwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpOwovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX0FMQVJNQSBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCiAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CiAgSEFMX1N0YXR1c1R5cGVEZWYgICAgIHN0YXR1czsKCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKICAvKiBFbnN1cmUgdGhhdCBSVEMgaXMgY2xvY2tlZCBieSAxTUh6ICovCiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfMU1IWjsKI2Vsc2UKI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCgogIHN0YXR1cyA9IEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCk7CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOwogICAgc3RhdHVzID0gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCk7CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8KICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7CiAgICAvKiBUaGUgdGltZSBiYXNlIHNob3VsZCBiZSAxbXMKICAgICAgIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLCiAgICAgICBIU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoOTkgKyAxKSAqICg5ICsgMSkpIC8gMU1IegogICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICAgIExTRSBhcyBSVEMgY2xvY2sKICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMi43NjhLSHoKICAgICAgICAgICAgICAgICAgID0gfjFtcwogICAgICAgTFNJIGFzIFJUQyBjbG9jawogICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyS0h6CiAgICAgICAgICAgICAgICAgICA9IDFtcwogICAgKi8KICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOwogICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CiAgICBoUlRDX0hhbmRsZS5Jbml0LkFzeW5jaFByZWRpdiA9IFJUQ19BU1lOQ0hfUFJFRElWOwogICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0UG9sYXJpdHkgPSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0g7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOwogICAgc3RhdHVzID0gSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSk7CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCiAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBDbGVhciBmbGFnIGFsYXJtIEEgKi8KICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpOwoKICAgIGNvdW50ZXIgPSAwVTsKICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQVdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KICAgIHdoaWxlIChfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IFJFU0VUKQogICAgewogICAgICBpZiAoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA0OFUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLwogICAgICB7CiAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KTB4MDFVOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLwogICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoJmhSVENfSGFuZGxlKTsKICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gaW50ZXJydXB0ICovCiAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwoKICAgIC8qIFJUQyBBbGFybSBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCiAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgIC8qIENoZWNrIGlmIHRoZSBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHNldCAqLwogICAgaWYgKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogICAgewogICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwogICAgICBjb3VudGVyID0gMFU7CiAgICAgIHdoaWxlICgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgICAgewogICAgICAgIGlmIChjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvIDQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICAgICAgewogICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+RFIgPSAwVTsKICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5UUiA9IDBVOwoKICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CgogICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIEVuYWJsZSB0aGUgUlRDIEFsYXJtIEludGVycnVwdCAqLwogICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19BbGFybV9JUlFuKTsKCiAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5ICovCiAgICBpZiAoVGlja1ByaW9yaXR5IDwgKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKSkKICAgIHsKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5OwogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICB9CgogIH0KICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIERpc2FibGUgUlRDIEFMQVJNIHVwZGF0ZSBJbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCnsKICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CiAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfQUxBUk0gaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQogICogUlRDX0FMQVJNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgIFJUQyBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIEhBTF9JbmNUaWNrKCk7CgogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKCiAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgaHJ0Yy0+SW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwoKICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICB7CiAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBocnRjLT5JbnN0YW5jZS0+RFIgPSAwVTsKICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7Cn0KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKQp7CiAgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCg==