LyogRGlyZWN0M0QgVGV4dHVyZQogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVMTUVSCiAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgRGlyZWN0M0RUZXh0dXJlMi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gaW50ZXJmYWNlcy4gVGhleSBhcmUgdGh1bmtzIHRvIElEaXJlY3REcmF3U3VyZmFjZTcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX1JlbGVhc2UoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUgaW50ZXJmYWNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMTo6SW5pdGlhbGl6ZQogKgogKiBUaGUgc2RrIHNheXMgaXQncyBub3QgaW1wbGVtZW50ZWQKICoKICogUGFyYW1zOgogKiAgPwogKgogKiBSZXR1cm5zCiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UgKkRpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICpERFN1cmZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgRGlyZWN0M0REZXZpY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIEREU3VyZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSBOb3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMsIGQzZCwgc3VyZik7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIFVuY2hlY2tlZCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTI6OlBhbGV0dGVDaGFuZ2VkCiAqCiAqIEluZm9ybXMgdGhlIHRleHR1cmUgYWJvdXQgYSBwYWxldHRlIGNoYW5nZQogKgogKiBQYXJhbXM6CiAqICBTdGFydDogU3RhcnQgaW5kZXggb2YgdGhlIGNoYW5nZQogKiAgQ291bnQ6IFRoZSBudW1iZXIgb2YgY2hhbmdlZCBlbnRyaWVzCiAqCiAqIFJldHVybnMKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF9QYWxldHRlQ2hhbmdlZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCUwOHgsJTA4eCk6IHN0dWIhXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9QYWxldHRlQ2hhbmdlZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTo6VW5sb2FkCiAqCiAqIERYNSBTREs6ICJUaGUgSURpcmVjdDNEVGV4dHVyZTI6OlVubG9hZCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCiAqCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpOiBub3QgaW1wbGVtZW50ZWQhXG4iLCBUaGlzKTsKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUyOjpHZXRIYW5kbGUKICoKICogUmV0dXJucyBoYW5kbGUgZm9yIHRoZSB0ZXh0dXJlLiBBdCB0aGUgbW9tZW50LCB0aGUgaW50ZXJmYWNlCiAqIHRvIHRoZSBJV2luZUQzRFRleHR1cmUgaXMgdXNlZC4KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0REZXZpY2UyOiBEZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KICogIEhhbmRsZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgaGFuZGxlIGF0LgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFRleHR1cmVJbXBsX0dldEhhbmRsZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTIgKkRpcmVjdDNERGV2aWNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRUhBTkRMRSAqbHBIYW5kbGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBEaXJlY3QzRERldmljZTIpOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBkM2QsIGxwSGFuZGxlKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYoIVRoaXMtPkhhbmRsZSkKICAgIHsKICAgICAgICBUaGlzLT5IYW5kbGUgPSBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShkM2QpOwogICAgICAgIGlmKFRoaXMtPkhhbmRsZSkKICAgICAgICB7CiAgICAgICAgICAgIGQzZC0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS5wdHIgPSBUaGlzOwogICAgICAgICAgICBkM2QtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX1RleHR1cmU7CiAgICAgICAgfQogICAgfQogICAgKmxwSGFuZGxlID0gVGhpcy0+SGFuZGxlOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGhhbmRsZSAlMDh4LlxuIiwgKmxwSGFuZGxlKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfR2V0SGFuZGxlKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEREVWSUNFIGxwRGlyZWN0M0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVEVYVFVSRUhBTkRMRSBscEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBscERpcmVjdDNERGV2aWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVGV4dHVyZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgZDNkLCBscEhhbmRsZSk7CgogICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX0dldEhhbmRsZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RUZXh0dXJlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKGQzZCwgSURpcmVjdDNERGV2aWNlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwSGFuZGxlKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnZXRfc3ViX21pbWFwbGV2ZWwKICoKICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBtaXBtYXAgbGV2ZWwKICoKICogdGV4X3B0cjogU3VyZmFjZSBvZiB3aGljaCB0byByZXR1cm4gdGhlIG5leHQgbGV2ZWwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqCmdldF9zdWJfbWltYXBsZXZlbChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfcHRyKQp7CiAgICAvKiBOb3cgZ28gZG93biB0aGUgbWlwbWFwIGNoYWluIHRvIHRoZSBuZXh0IHN1cmZhY2UgKi8KICAgIHN0YXRpYyBERFNDQVBTMiBtaXBtYXBfY2FwcyA9IHsgRERTQ0FQU19NSVBNQVAgfCBERFNDQVBTX1RFWFRVUkUsIDAsIDAsIDAgfTsKICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IG5leHRfbGV2ZWw7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmX3B0cjsKICAgIEhSRVNVTFQgaHI7CgogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShJQ09NX0lOVEVSRkFDRSh0ZXhfcHRyLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pcG1hcF9jYXBzLCAmbmV4dF9sZXZlbCk7CiAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIE5VTEw7CgogICAgc3VyZl9wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBuZXh0X2xldmVsKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShuZXh0X2xldmVsKTsKCiAgICByZXR1cm4gc3VyZl9wdHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMjo6TG9hZAogKgogKiBMb2FkcyBhIHRleHR1cmUgY3JlYXRlZCB3aXRoIHRoZSBERFNDQVBTX0FMTE9DT05MT0FECiAqCiAqIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVsYXllZCB0byBXaW5lRDNEIGJlY2F1c2UgdGhlIHdob2xlIGludGVyZmFjZSBpcwogKiBpbXBsZW1lbnRlZCBpbiBERHJhdyBvbmx5LiBGb3Igc3BlZWQgaW1wcm92ZW1lbnRzIGEgaW1wbGVtZW50YXRpb24gd2hpY2gKICogdGFrZXMgT3BlbkdMIG1vcmUgaW50byBhY2NvdW50IGNvdWxkIGJlIHBsYWNlZCBpbnRvIFdpbmVEM0QuCiAqCiAqIFBhcmFtczoKICogIEQzRFRleHR1cmUyOiBBZGRyZXNzIG9mIHRoZSB0ZXh0dXJlIHRvIGxvYWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfTG9hZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKkQzRFRleHR1cmUyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3JjX3B0ciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlMik7CiAgICBJV2luZUQzRFBhbGV0dGUgKndpbmVfcGFsLCAqd2luZV9wYWxfc3JjOwogICAgSURpcmVjdERyYXdQYWxldHRlICpwYWwgPSBOVUxMLCAqcGFsX3NyYyA9IE5VTEw7CiAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpwYWxfaW1wbCwgKnBhbF9pbXBsX3NyYzsKICAgIEhSRVNVTFQgcmV0X3ZhbHVlID0gRDNEX09LOwoKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBzcmNfcHRyKTsKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgaWYgKCgoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApICE9IChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkpIHx8CiAgICAgICAgKHNyY19wdHItPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50ICE9IFRoaXMtPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50KSkKICAgIHsKICAgICAgICBFUlIoIlRyeWluZyB0byBsb2FkIHN1cmZhY2VzIHdpdGggZGlmZmVyZW50IG1pcC1tYXAgY291bnRzICFcbiIpOwogICAgfQoKICAgIHdoaWxlKDEpCiAgICB7CiAgICAgICAgRERTVVJGQUNFREVTQyAqc3JjX2QsICpkc3RfZDsKCiAgICAgICAgVFJBQ0UoIiBjb3B5aW5nIHN1cmZhY2UgJXAgdG8gc3VyZmFjZSAlcCAobWlwbWFwIGxldmVsICVkKVxuIiwgc3JjX3B0ciwgVGhpcywgc3JjX3B0ci0+bWlwbWFwX2xldmVsKTsKCiAgICAgICAgaWYgKCBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0FMTE9DT05MT0FEICkKICAgICAgICAgICAgLyogSWYgdGhlIHN1cmZhY2UgaXMgbm90IGFsbG9jYXRlZCBhbmQgaXRzIGxvY2F0aW9uIGlzIG5vdCB5ZXQgc3BlY2lmaWVkLAogICAgICAgICAgICAgIGZvcmNlIGl0IHRvIHZpZGVvIG1lbW9yeSAqLyAKICAgICAgICAgICAgaWYgKCAhKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX1NZU1RFTU1FTU9SWXxERFNDQVBTX1ZJREVPTUVNT1JZKSkgKQogICAgICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfVklERU9NRU1PUlk7CgogICAgICAgIC8qIFN1cHByZXNzIHRoZSBBTExPQ09OTE9BRCBmbGFnICovCiAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICY9IH5ERFNDQVBTX0FMTE9DT05MT0FEOwoKICAgICAgICAvKiBHZXQgdGhlIHBhbGV0dGVzICovCiAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0dldFBhbGV0dGUoVGhpcy0+V2luZUQzRFN1cmZhY2UsICZ3aW5lX3BhbCk7CiAgICAgICAgaWYoIHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICBFUlIoIklXaW5lRDNEU3VyZmFjZTo6R2V0UGFsZXR0ZSBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CiAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICB9CiAgICAgICAgaWYod2luZV9wYWwpCiAgICAgICAgewogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFBhbGV0dGVfR2V0UGFyZW50KHdpbmVfcGFsLCAoSVVua25vd24gKiopICZwYWwpOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIklXaW5lRDNEUGFsZXR0ZTo6R2V0UGFyZW50IGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFsX2ltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIHBhbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBwYWxfaW1wbCA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfR2V0UGFsZXR0ZShzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSwgJndpbmVfcGFsX3NyYyk7CiAgICAgICAgaWYoIHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICBFUlIoIklXaW5lRDNEU3VyZmFjZTo6R2V0UGFsZXR0ZSBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CiAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICB9CiAgICAgICAgaWYod2luZV9wYWxfc3JjKQogICAgICAgIHsKICAgICAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RQYWxldHRlX0dldFBhcmVudCh3aW5lX3BhbF9zcmMsIChJVW5rbm93biAqKikgJnBhbF9zcmMpOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIklXaW5lRDNEUGFsZXR0ZTo6R2V0UGFyZW50IGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWxfc3JjKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIEFmdGVyIHNlZWluZyBzb21lIGxvZ3MsIG5vdCBzdXJlIGF0IGFsbCBhYm91dCB0aGlzLi4uICovCiAgICAgICAgaWYgKHBhbF9pbXBsID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgd2luZV9wYWwpOwogICAgICAgICAgICBpZiAocGFsX2ltcGxfc3JjICE9IE5VTEwpIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGxfc3JjLCBJRGlyZWN0RHJhd1BhbGV0dGUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHBhbF9pbXBsX3NyYyAhPSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgcGFsZW50WzI1Nl07CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbF9zcmMsIElEaXJlY3REcmF3UGFsZXR0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbCwgSURpcmVjdERyYXdQYWxldHRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDI1NiwgcGFsZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQ29weSBvbmUgc3VyZmFjZSBvbiB0aGUgb3RoZXIgKi8KICAgICAgICBkc3RfZCA9IChERFNVUkZBQ0VERVNDICopJihUaGlzLT5zdXJmYWNlX2Rlc2MpOwogICAgICAgIHNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKHNyY19wdHItPnN1cmZhY2VfZGVzYyk7CgogICAgICAgIGlmICgoc3JjX2QtPmR3V2lkdGggIT0gZHN0X2QtPmR3V2lkdGgpIHx8IChzcmNfZC0+ZHdIZWlnaHQgIT0gZHN0X2QtPmR3SGVpZ2h0KSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNob3VsZCBhbHNvIGNoZWNrIGZvciBzYW1lIHBpeGVsIGZvcm1hdCwgdTEubFBpdGNoLCAuLi4gKi8KICAgICAgICAgICAgRVJSKCJFcnJvciBpbiBzdXJmYWNlIHNpemVzXG4iKTsKICAgICAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBXSU5FRDNETE9DS0VEX1JFQ1QgcFNyY1JlY3QsIHBEc3RSZWN0OwoKICAgICAgICAgICAgLyogTFBESVJFQ1QzRERFVklDRTIgZDNkZCA9IChMUERJUkVDVDNEREVWSUNFMikgVGhpcy0+RDNEZGV2aWNlOyAqLwogICAgICAgICAgICAvKiBJIHNob3VsZCBwdXQgYSBtYWNybyBmb3IgdGhlIGNhbGN1bHVzIG9mIGJwcCAqLwoKICAgICAgICAgICAgLyogQ29weSBhbHNvIHRoZSBDb2xvcktleWluZyBzdHVmZiAqLwogICAgICAgICAgICBpZiAoc3JjX2QtPmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOwogICAgICAgICAgICAgICAgZHN0X2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDb3B5IHRoZSBtYWluIG1lbW9yeSB0ZXh0dXJlIGludG8gdGhlIHN1cmZhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgT3BlbkdMCiAgICAgICAgICAgICAgdGV4dHVyZSBvYmplY3QuICovCgogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3Qoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UsICZwU3JjUmVjdCwgTlVMTCwgMCk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiICglcCkgTG9ja2luZyB0aGUgc291cmNlIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChUaGlzLT5XaW5lRDNEU3VyZmFjZSwgJnBEc3RSZWN0LCBOVUxMLCAwKTsKICAgICAgICAgICAgaWYocmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCIgKCVwKSBMb2NraW5nIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGZhaWxlZFxuIiwgVGhpcyk7CiAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCiAgICAgICAgICAgICAgICBtZW1jcHkocERzdFJlY3QucEJpdHMsIHBTcmNSZWN0LnBCaXRzLCBzcmNfcHRyLT5zdXJmYWNlX2Rlc2MudTEuZHdMaW5lYXJTaXplKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbWVtY3B5KHBEc3RSZWN0LnBCaXRzLCBwU3JjUmVjdC5wQml0cywgcFNyY1JlY3QuUGl0Y2ggKiBzcmNfZC0+ZHdIZWlnaHQpOwoKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3Qoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UpOwogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChUaGlzLT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCiAgICAgICAgewogICAgICAgICAgICBzcmNfcHRyID0gZ2V0X3N1Yl9taW1hcGxldmVsKHNyY19wdHIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzcmNfcHRyID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKQogICAgICAgIHsKICAgICAgICAgICAgVGhpcyA9IGdldF9zdWJfbWltYXBsZXZlbChUaGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVGhpcyA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICBpZiAoKHNyY19wdHIgPT0gTlVMTCkgfHwgKFRoaXMgPT0gTlVMTCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3JjX3B0ciAhPSBUaGlzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIiBMb2FkaW5nIHN1cmZhY2Ugd2l0aCBkaWZmZXJlbnQgbWlwbWFwIHN0cnVjdHVyZSAhISFcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIHJldF92YWx1ZTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfTG9hZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUgKkQzRFRleHR1cmUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRleHR1cmUgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBEM0RUZXh0dXJlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIFRleHR1cmUpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9Mb2FkKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUaGUgVlRhYmxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmNvbnN0IElEaXJlY3QzRFRleHR1cmUyVnRibCBJRGlyZWN0M0RUZXh0dXJlMl9WdGJsID0KewogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9SZWxlYXNlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfR2V0SGFuZGxlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfUGFsZXR0ZUNoYW5nZWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF9Mb2FkLAp9OwoKCmNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0YmwgPQp7CiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1JlbGVhc2UsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0xvYWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZCwKfTsK