LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCi8qIE1haW4gZmlsZSBmb3IgQ0QtUk9NIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKiBDb3B5cmlnaHQgMTk5OSwgMjAwMSwgMjAwMyBFcmljIFBvdWVjaAogKiBDb3B5cmlnaHQgMjAwMCBBbmRyZWFzIE1vaHIKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9JT19ICiMgaW5jbHVkZSA8aW8uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0dfSAojIGluY2x1ZGUgPHNjc2kvc2cuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0NTSV9ICiMgaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiMgdW5kZWYgUkVBU1NJR05fQkxPQ0tTICAvKiBhdm9pZCBjb25mbGljdCB3aXRoIHdpbmlvY3RsLmggKi8KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0NTSV9JT0NUTF9ICiMgaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9MSU5VWF9NQUpPUl9ICiMgaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0xJTlVYX0hEUkVHX0gKIyBpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTElOVVhfUEFSQU1fSAojIGluY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9MSU5VWF9DRFJPTV9ICiMgaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0xJTlVYX1VDRFJPTV9ICiMgaW5jbHVkZSA8bGludXgvdWNkcm9tLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfQ0RJT19ICiMgaW5jbHVkZSA8c3lzL2NkaW8uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TQ1NJSU9fSAojIGluY2x1ZGUgPHN5cy9zY3NpaW8uaD4KI2VuZGlmCgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIm50c3RhdHVzLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgIndpbmlvY3RsLmgiCiNpbmNsdWRlICJudGRkc3Rvci5oIgojaW5jbHVkZSAibnRkZGNkcm0uaCIKI2luY2x1ZGUgIm50ZGRzY3NpLmgiCiNpbmNsdWRlICJudGRsbF9taXNjLmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS9saWJyYXJ5LmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBOb24tTGludXggc3lzdGVtcyBkbyBub3QgaGF2ZSBsaW51eC9jZHJvbS5oIGFuZCB0aGUgbGlrZSwgYW5kIHRodXMKICAgbGFjayB0aGUgZm9sbG93aW5nIGNvbnN0YW50cy4gKi8KCiNpZm5kZWYgQ0RfU0VDUwojIGRlZmluZSBDRF9TRUNTICAgICAgICAgICAgICA2MCAvKiBzZWNvbmRzIHBlciBtaW51dGUgKi8KI2VuZGlmCiNpZm5kZWYgQ0RfRlJBTUVTCiMgZGVmaW5lIENEX0ZSQU1FUyAgICAgICAgICAgIDc1IC8qIGZyYW1lcyBwZXIgc2Vjb25kICovCiNlbmRpZgoKLyogZGVmaW5pdGlvbnMgdGFrZW4gZnJvbSBsaWJkdmRjc3MgKi8KCiNkZWZpbmUgSU9DVExfRFZEX0JBU0UgICAgICAgICAgICAgICAgIEZJTEVfREVWSUNFX0RWRAoKI2RlZmluZSBJT0NUTF9EVkRfU1RBUlRfU0VTU0lPTiAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwMCwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9SRUFEX0tFWSAgICAgICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDAxLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX1NFTkRfS0VZICAgICAgICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDIsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfRU5EX1NFU1NJT04gICAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwMywgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9TRVRfUkVBRF9BSEVBRCAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDA0LCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX0dFVF9SRUdJT04gICAgICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDUsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfU0VORF9LRVkyICAgICAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwNiwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTIHwgRklMRV9XUklURV9BQ0NFU1MpCgojZGVmaW5lIElPQ1RMX0RWRF9SRUFEX1NUUlVDVFVSRSAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDUwLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCgp0eXBlZGVmIGVudW0gewogICAgRHZkQ2hhbGxlbmdlS2V5ID0gMHgwMSwKICAgIER2ZEJ1c0tleTEsCiAgICBEdmRCdXNLZXkyLAogICAgRHZkVGl0bGVLZXksCiAgICBEdmRBc2YsCiAgICBEdmRTZXRScGNLZXkgPSAweDYsCiAgICBEdmRHZXRScGNLZXkgPSAweDgsCiAgICBEdmREaXNrS2V5ID0gMHg4MCwKICAgIER2ZEludmFsaWRhdGVBR0lEID0gMHgzZgp9IERWRF9LRVlfVFlQRTsKCnR5cGVkZWYgVUxPTkcgRFZEX1NFU1NJT05fSUQsICpQRFZEX1NFU1NJT05fSUQ7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0NPUFlfUFJPVEVDVF9LRVkgewogICAgVUxPTkcgS2V5TGVuZ3RoOwogICAgRFZEX1NFU1NJT05fSUQgU2Vzc2lvbklkOwogICAgRFZEX0tFWV9UWVBFIEtleVR5cGU7CiAgICBVTE9ORyBLZXlGbGFnczsKICAgIHVuaW9uIHsKICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICBVTE9ORyBGaWxlSGFuZGxlOwogICAgICAgICAgICBVTE9ORyBSZXNlcnZlZDsgICAvKiB1c2VkIGZvciBOVCBhbGlnbm1lbnQgKi8KICAgICAgICB9IHM7CiAgICAgICAgTEFSR0VfSU5URUdFUiBUaXRsZU9mZnNldDsKICAgIH0gUGFyYW1ldGVyczsKICAgIFVDSEFSIEtleURhdGFbMV07Cn0gRFZEX0NPUFlfUFJPVEVDVF9LRVksICpQRFZEX0NPUFlfUFJPVEVDVF9LRVk7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX1JQQ19LRVkgewogICAgVUNIQVIgVXNlclJlc2V0c0F2YWlsYWJsZTozOwogICAgVUNIQVIgTWFudWZhY3R1cmVyUmVzZXRzQXZhaWxhYmxlOjM7CiAgICBVQ0hBUiBUeXBlQ29kZToyOwogICAgVUNIQVIgUmVnaW9uTWFzazsKICAgIFVDSEFSIFJwY1NjaGVtZTsKICAgIFVDSEFSIFJlc2VydmVkMlsxXTsKfSBEVkRfUlBDX0tFWSwgKiBQRFZEX1JQQ19LRVk7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0FTRiB7CiAgICBVQ0hBUiBSZXNlcnZlZDBbM107CiAgICBVQ0hBUiBTdWNjZXNzRmxhZzoxOwogICAgVUNIQVIgUmVzZXJ2ZWQxOjc7Cn0gRFZEX0FTRiwgKiBQRFZEX0FTRjsKCnR5cGVkZWYgc3RydWN0IF9EVkRfUkVHSU9OCnsKICAgICAgICB1bnNpZ25lZCBjaGFyIGNvcHlfc3lzdGVtOwogICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnaW9uX2RhdGE7ICAgICAgICAgICAgICAvKiBjdXJyZW50IG1lZGlhIHJlZ2lvbiAobm90IHBsYXlhYmxlIHdoZW4gc2V0KSAqLwogICAgICAgIHVuc2lnbmVkIGNoYXIgc3lzdGVtX3JlZ2lvbjsgICAgLyogY3VycmVudCBkcml2ZSByZWdpb24gKHBsYXlhYmxlIHdoZW4gc2V0KSAqLwogICAgICAgIHVuc2lnbmVkIGNoYXIgcmVzZXRfY291bnQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzZXRzIGF2YWlsYWJsZSAqLwp9IERWRF9SRUdJT04sICogUERWRF9SRUdJT047Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX1JFQURfU1RSVUNUVVJFIHsKICAgICAgICAvKiBDb250YWlucyBhbiBvZmZzZXQgdG8gdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciB0byBiZSByZXRyaWV2ZWQuICovCiAgICAgICAgTEFSR0VfSU5URUdFUiBibG9ja19ieXRlX29mZnNldDsKCiAgICAgICAgLyogMDpQaHlzaWNhbCBkZXNjcmlwdG9yLCAxOkNvcHlyaWdodCBkZXNjcmlwdG9yLCAyOkRpc2sga2V5IGRlc2NyaXB0b3IKICAgICAgICAgICAzOkJDQSBkZXNjcmlwdG9yLCA0Ok1hbnVmYWN0dXJlciBkZXNjcmlwdG9yLCA1Ok1heCBkZXNjcmlwdG9yCiAgICAgICAgICovCiAgICAgICAgbG9uZyBmb3JtYXQ7CgogICAgICAgIC8qIFNlc3Npb24gSUQsIHRoYXQgaXMgb2J0YWluZWQgYnkgSU9DVExfRFZEX1NUQVJUX1NFU1NJT04gKi8KICAgICAgICBsb25nIHNlc3Npb247CgogICAgICAgIC8qIEZyb20gMCB0byA0ICovCiAgICAgICAgdW5zaWduZWQgY2hhciBsYXllcl9ubzsKfURWRF9SRUFEX1NUUlVDVFVSRSwgKiBQRFZEX1JFQURfU1RSVUNUVVJFOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9MQVlFUl9ERVNDUklQVE9SCnsKICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKCiAgICAgICAgdW5zaWduZWQgY2hhciBib29rX3ZlcnNpb24gOiA0OwoKICAgICAgICAvKiAwOkRWRC1ST00sIDE6RFZELVJBTSwgMjpEVkQtUiwgMzpEVkQtUlcsIDk6RFZELVJXICovCiAgICAgICAgdW5zaWduZWQgY2hhciBib29rX3R5cGUgOiA0OwoKICAgICAgICB1bnNpZ25lZCBjaGFyIG1pbmltdW1fcmF0ZSA6IDQ7CgogICAgICAgIC8qIFRoZSBwaHlzaWNhbCBzaXplIG9mIHRoZSBtZWRpYS4gMDoxMjAgbW0sIDE6ODAgbW0uICovCiAgICB1bnNpZ25lZCBjaGFyIGRpc2tfc2l6ZSA6IDQ7CgogICAgLyogMTpSZWFkLW9ubHkgbGF5ZXIsIDI6UmVjb3JkYWJsZSBsYXllciwgNDpSZXdyaXRhYmxlIGxheWVyICovCiAgICAgICAgdW5zaWduZWQgY2hhciBsYXllcl90eXBlIDogNDsKCiAgICAgICAgLyogMDpwYXJhbGxlbCB0cmFjayBwYXRoLCAxOm9wcG9zaXRlIHRyYWNrIHBhdGggKi8KICAgIHVuc2lnbmVkIGNoYXIgdHJhY2tfcGF0aCA6IDE7CgogICAgICAgIC8qIDA6b25lIGxheWVycywgMTp0d28gbGF5ZXJzLCBhbmQgc28gb24gKi8KICAgIHVuc2lnbmVkIGNoYXIgbnVtX29mX2xheWVycyA6IDI7CgogICAgdW5zaWduZWQgY2hhciByZXNlcnZlZDEgOiAxOwoKICAgICAgICAvKiAwOjAuNzQgtW0vdHJhY2ssIDE6MC44MCC1bS90cmFjaywgMjowLjYxNSC1bS90cmFjayAqLwogICAgdW5zaWduZWQgY2hhciB0cmFja19kZW5zaXR5IDogNDsKCiAgICAgICAgLyogMDowLjI2NyC1bS9iaXQsIDE6MC4yOTMgtW0vYml0LCAyOjAuNDA5IHRvIDAuNDM1ILVtL2JpdCwgNDowLjI4MCB0byAwLjI5MSC1bS9iaXQsIDg6MC4zNTMgtW0vYml0ICovCiAgICB1bnNpZ25lZCBjaGFyIGxpbmVhcl9kZW5zaXR5IDogNDsKCiAgICAgICAgLyogTXVzdCBiZSBlaXRoZXIgMHgzMDAwMDpEVkQtUk9NIG9yIERWRC1SLy1SVyBvciAweDMxMDAwOkRWRC1SQU0gb3IgRFZEK1JXICovCiAgICB1bnNpZ25lZCBsb25nIHN0YXJ0aW5nX2RhdGFfc2VjdG9yOwoKICAgIHVuc2lnbmVkIGxvbmcgZW5kX2RhdGFfc2VjdG9yOwogICAgdW5zaWduZWQgbG9uZyBlbmRfbGF5ZXJfemVyb19zZWN0b3I7CiAgICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkNSA6IDc7CgogICAgICAgIC8qIDAgaW5kaWNhdGVzIG5vIEJDQSBkYXRhICovCiAgICAgICAgdW5zaWduZWQgY2hhciBCQ0FfZmxhZyA6IDE7CgogICAgICAgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ2Owp9RFZEX0xBWUVSX0RFU0NSSVBUT1IsICogUERWRF9MQVlFUl9ERVNDUklQVE9SOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9DT1BZUklHSFRfREVTQ1JJUFRPUgp7CiAgICAgICAgdW5zaWduZWQgY2hhciBwcm90ZWN0aW9uOwogICAgdW5zaWduZWQgY2hhciByZWdpb247CiAgICB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKfURWRF9DT1BZUklHSFRfREVTQ1JJUFRPUiwgKiBQRFZEX0NPUFlSSUdIVF9ERVNDUklQVE9SOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9NQU5VRkFDVFVSRVJfREVTQ1JJUFRPUgp7CiAgICAgICAgdW5zaWduZWQgY2hhciBtYW51ZmFjdHVyaW5nWzIwNDhdOwp9RFZEX01BTlVGQUNUVVJFUl9ERVNDUklQVE9SLCAqIFBEVkRfTUFOVUZBQ1RVUkVSX0RFU0NSSVBUT1I7CgojZGVmaW5lIERWRF9DSEFMTEVOR0VfS0VZX0xFTkdUSCAgICAoMTIgKyBzaXplb2YoRFZEX0NPUFlfUFJPVEVDVF9LRVkpIC0gc2l6ZW9mKFVDSEFSKSkKCiNkZWZpbmUgRFZEX0RJU0tfS0VZX0xFTkdUSCAgICAgICAgICgyMDQ4ICsgc2l6ZW9mKERWRF9DT1BZX1BST1RFQ1RfS0VZKSAtIHNpemVvZihVQ0hBUikpCgojZGVmaW5lIERWRF9LRVlfU0laRSA1CiNkZWZpbmUgRFZEX0NIQUxMRU5HRV9TSVpFIDEwCiNkZWZpbmUgRFZEX0RJU0NLRVlfU0laRSAyMDQ4CiNkZWZpbmUgRFZEX1NFQ1RPUl9QUk9URUNURUQgICAgICAgICAgICAweDAwMDAwMDIwCgpzdGF0aWMgY29uc3Qgc3RydWN0IGlvY29kZXhzCnsKICBEV09SRCBjb2RlOwogIGNvbnN0IGNoYXIgKmNvZGV4Owp9IGlvY29kZXh0YWJsZVtdID0gewojZGVmaW5lIFgoeCkgeyB4LCAjeCB9LApYKElPQ1RMX0NEUk9NX0NIRUNLX1ZFUklGWSkKWChJT0NUTF9DRFJPTV9DVVJSRU5UX1BPU0lUSU9OKQpYKElPQ1RMX0NEUk9NX0RJU0tfVFlQRSkKWChJT0NUTF9DRFJPTV9HRVRfQ09OVFJPTCkKWChJT0NUTF9DRFJPTV9HRVRfRFJJVkVfR0VPTUVUUlkpClgoSU9DVExfQ0RST01fR0VUX1ZPTFVNRSkKWChJT0NUTF9DRFJPTV9MT0FEX01FRElBKQpYKElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0cpClgoSU9DVExfQ0RST01fTUVESUFfUkVNT1ZBTCkKWChJT0NUTF9DRFJPTV9QQVVTRV9BVURJTykKWChJT0NUTF9DRFJPTV9QTEFZX0FVRElPX01TRikKWChJT0NUTF9DRFJPTV9SQVdfUkVBRCkKWChJT0NUTF9DRFJPTV9SRUFEX1FfQ0hBTk5FTCkKWChJT0NUTF9DRFJPTV9SRUFEX1RPQykKWChJT0NUTF9DRFJPTV9SRVNVTUVfQVVESU8pClgoSU9DVExfQ0RST01fU0VFS19BVURJT19NU0YpClgoSU9DVExfQ0RST01fU0VUX1ZPTFVNRSkKWChJT0NUTF9DRFJPTV9TVE9QX0FVRElPKQpYKElPQ1RMX0NEUk9NX1RSQUNLX0lTUkMpClgoSU9DVExfRElTS19NRURJQV9SRU1PVkFMKQpYKElPQ1RMX0RWRF9FTkRfU0VTU0lPTikKWChJT0NUTF9EVkRfR0VUX1JFR0lPTikKWChJT0NUTF9EVkRfUkVBRF9LRVkpClgoSU9DVExfRFZEX1JFQURfU1RSVUNUVVJFKQpYKElPQ1RMX0RWRF9TRU5EX0tFWSkKWChJT0NUTF9EVkRfU1RBUlRfU0VTU0lPTikKWChJT0NUTF9TQ1NJX0dFVF9BRERSRVNTKQpYKElPQ1RMX1NDU0lfR0VUX0NBUEFCSUxJVElFUykKWChJT0NUTF9TQ1NJX1BBU1NfVEhST1VHSCkKWChJT0NUTF9TQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1QpClgoSU9DVExfU1RPUkFHRV9DSEVDS19WRVJJRlkpClgoSU9DVExfU1RPUkFHRV9FSkVDVElPTl9DT05UUk9MKQpYKElPQ1RMX1NUT1JBR0VfRUpFQ1RfTUVESUEpClgoSU9DVExfU1RPUkFHRV9HRVRfREVWSUNFX05VTUJFUikKWChJT0NUTF9TVE9SQUdFX0xPQURfTUVESUEpClgoSU9DVExfU1RPUkFHRV9NRURJQV9SRU1PVkFMKQpYKElPQ1RMX1NUT1JBR0VfUkVTRVRfREVWSUNFKQojdW5kZWYgWAp9OwpzdGF0aWMgY29uc3QgY2hhciAqaW9jb2RleChEV09SRCBjb2RlKQp7CiAgIHVuc2lnbmVkIGludCBpOwogICBzdGF0aWMgY2hhciBidWZmZXJbMjVdOwogICBmb3IoaT0wOyBpPHNpemVvZihpb2NvZGV4dGFibGUpL3NpemVvZihzdHJ1Y3QgaW9jb2RleHMpOyBpKyspCiAgICAgIGlmIChjb2RlPT1pb2NvZGV4dGFibGVbaV0uY29kZSkKCSByZXR1cm4gaW9jb2RleHRhYmxlW2ldLmNvZGV4OwogICBzcHJpbnRmKGJ1ZmZlciwgIklPQ1RMX0NPREVfJXgiLCAoaW50KWNvZGUpOwogICByZXR1cm4gYnVmZmVyOwp9CgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChjZHJvbSk7CgojZGVmaW5lIEZSQU1FX09GX0FERFIoYSkgKCgoaW50KShhKVsxXSAqIENEX1NFQ1MgKyAoYSlbMl0pICogQ0RfRlJBTUVTICsgKGEpWzNdKQojZGVmaW5lIEZSQU1FX09GX01TRihhKSAoKChpbnQpKGEpLk0gKiBDRF9TRUNTICsgKGEpLlMpICogQ0RfRlJBTUVTICsgKGEpLkYpCiNkZWZpbmUgRlJBTUVfT0ZfVE9DKHRvYywgaWR4KSAgRlJBTUVfT0ZfQUREUigodG9jKS5UcmFja0RhdGFbaWR4IC0gKHRvYykuRmlyc3RUcmFja10uQWRkcmVzcykKI2RlZmluZSBNU0ZfT0ZfRlJBTUUobSxmcikge2ludCBmPShmcik7ICgoVUNIQVIgKikmKG0pKVsyXT1mJUNEX0ZSQU1FUztmLz1DRF9GUkFNRVM7KChVQ0hBUiAqKSYobSkpWzFdPWYlQ0RfU0VDUzsoKFVDSEFSICopJihtKSlbMF09Zi9DRF9TRUNTO30KCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9SZWFkVE9DKGludCwgaW50LCBDRFJPTV9UT0MqKTsKc3RhdGljIE5UU1RBVFVTIENEUk9NX0dldFN0YXR1c0NvZGUoaW50KTsKCgojaWZkZWYgbGludXgKCiMgaWZuZGVmIElERTZfTUFKT1IKIyAgZGVmaW5lIElERTZfTUFKT1IgODgKIyBlbmRpZgojIGlmbmRlZiBJREU3X01BSk9SCiMgIGRlZmluZSBJREU3X01BSk9SIDg5CiMgZW5kaWYKCiMgaWZkZWYgQ0RST01fU0VORF9QQUNLRVQKLyogc3RydWN0dXJlIGZvciBDRFJPTV9QQUNLRVRfQ09NTUFORCBpb2N0bCAqLwovKiBub3QgYWxsIExpbnV4IHZlcnNpb25zIGhhdmUgYWxsIHRoZSBmaWVsZHMsIHNvIHdlIGRlZmluZSB0aGUKICogc3RydWN0dXJlIG91cnNlbHZlcyB0byBtYWtlIHN1cmUgKi8Kc3RydWN0IGxpbnV4X2Nkcm9tX2dlbmVyaWNfY29tbWFuZAp7CiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIGNtZFtDRFJPTV9QQUNLRVRfU0laRV07CiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgKmJ1ZmZlcjsKICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgYnVmbGVuOwogICAgaW50ICAgICAgICAgICAgICAgICAgICBzdGF0OwogICAgc3RydWN0IHJlcXVlc3Rfc2Vuc2UgICpzZW5zZTsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgZGF0YV9kaXJlY3Rpb247CiAgICBpbnQgICAgICAgICAgICAgICAgICAgIHF1aWV0OwogICAgaW50ICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OwogICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZXNlcnZlZFsxXTsKfTsKIyBlbmRpZiAgLyogQ0RST01fU0VORF9QQUNLRVQgKi8KCiNlbmRpZiAgLyogbGludXggKi8KCi8qIEZJWE1FOiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbid0IG9wZW4gc2ltdWx0YW5lb3VzbHkgc2V2ZXJhbCB0aW1lcyAvZGV2L2Nkcm9tCiAqIHRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBhIHByb3BlciBkZXZpY2UgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkCiAqIAogKiAoV1MpIFdlIG5lZWQgdGhpcyB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRvIHNhZmVseQogKiBkZXRlY3QgbWVkaWEgY2hhbmdlcy4gQmVzaWRlcyB0aGlzIHNob3VsZCBwcm92aWRlIGEgZ3JlYXQgc3BlZWQgdXAKICogZm9yIHRvYyBpbnF1aXJpZXMuCiAqLwpzdHJ1Y3QgY2Ryb21fY2FjaGUgewogICAgZGV2X3QgICAgICAgZGV2aWNlOwogICAgaW5vX3QgICAgICAgaW5vZGU7CiAgICBjaGFyICAgICAgICB0b2NfZ29vZDsgLyogaWYgZmFsc2UsIHdpbGwgcmVyZWFkIFRPQyBmcm9tIGRpc2sgKi8KICAgIENEUk9NX1RPQyAgIHRvYzsKICAgIFNVQl9RX0NVUlJFTlRfUE9TSVRJT04gQ3VycmVudFBvc2l0aW9uOwp9OwovKiB3aG8gaGFzIG1vcmUgdGhhbiA1IGNkcm9tcyBvbiBoaXMvaGVyIG1hY2hpbmUgPz8gKi8KLyogRklYTUU6IHRoaXMgc2hvdWxkIGdyb3cgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY2Ryb21zIHdlIGluc3RhbGwvY29uZmlndXJlIAogKiBhdCBzdGFydHVwCiAqLwojZGVmaW5lIE1BWF9DQUNIRV9FTlRSSUVTICAgICAgIDUKc3RhdGljIHN0cnVjdCBjZHJvbV9jYWNoZSBjZHJvbV9jYWNoZVtNQVhfQ0FDSEVfRU5UUklFU107CgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBjYWNoZV9zZWN0aW9uOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBjcml0c2VjdF9kZWJ1ZyA9CnsKICAgIDAsIDAsICZjYWNoZV9zZWN0aW9uLAogICAgeyAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCwgJmNyaXRzZWN0X2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAwLCAoRFdPUkQpKF9fRklMRV9fICI6IGNhY2hlX3NlY3Rpb24iKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGNhY2hlX3NlY3Rpb24gPSB7ICZjcml0c2VjdF9kZWJ1ZywgLTEsIDAsIDAsIDAsIDAgfTsKCi8qIFByb3Bvc2VkIG1lZGlhIGNoYW5nZSBmdW5jdGlvbjogbm90IHJlYWxseSBuZWVkZWQgYXQgdGhpcyB0aW1lICovCi8qIFRoaXMgaXMgYSAxIG9yIDAgdHlwZSBvZiBmdW5jdGlvbiAqLwojaWYgMApzdGF0aWMgaW50IENEUk9NX01lZGlhQ2hhbmdlZChpbnQgZGV2KQp7CiAgIGludCBpOwoKICAgc3RydWN0IGNkcm9tX3RvY2hkcgloZHI7CiAgIHN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeTsKCiAgIGlmIChkZXYgPCAwIHx8IGRldiA+PSBNQVhfQ0FDSEVfRU5UUklFUykKICAgICAgcmV0dXJuIDA7CiAgIGlmICggaW9jdGwoY2Ryb21fY2FjaGVbZGV2XS5mZCwgQ0RST01SRUFEVE9DSERSLCAmaGRyKSA9PSAtMSApCiAgICAgIHJldHVybiAwOwoKICAgaWYgKCBtZW1jbXAoJmhkciwgJmNkcm9tX2NhY2hlW2Rldl0uaGRyLCBzaXplb2Yoc3RydWN0IGNkcm9tX3RvY2hkcikpICkKICAgICAgcmV0dXJuIDE7CgogICBmb3IgKGk9aGRyLmNkdGhfdHJrMDsgaTw9aGRyLmNkdGhfdHJrMSsxOyBpKyspCiAgIHsKICAgICAgaWYgKGkgPT0gaGRyLmNkdGhfdHJrMSArIDEpCiAgICAgIHsKCSBlbnRyeS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKICAgICAgfSBlbHNlIHsKICAgICAgICAgZW50cnkuY2R0ZV90cmFjayA9IGk7CiAgICAgIH0KICAgICAgZW50cnkuY2R0ZV9mb3JtYXQgPSBDRFJPTV9NU0Y7CiAgICAgIGlmICggaW9jdGwoY2Ryb21fY2FjaGVbZGV2XS5mZCwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeSkgPT0gLTEpCgkgcmV0dXJuIDA7CiAgICAgIGlmICggbWVtY21wKCZlbnRyeSwgY2Ryb21fY2FjaGVbZGV2XS5lbnRyeStpLWhkci5jZHRoX3RyazAsCgkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY2Ryb21fdG9jZW50cnkpKSApCgkgcmV0dXJuIDE7CiAgIH0KICAgcmV0dXJuIDA7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9TeW5jQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbF0KICoKICogUmVhZCB0aGUgVE9DIGluIGFuZCBzdG9yZSBpdCBpbiB0aGUgY2Ryb21fY2FjaGUgc3RydWN0dXJlLgogKiBGdXJ0aGVyIHJlcXVlc3RzIGZvciB0aGUgVE9DIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIGNhY2hlCiAqIHVubGVzcyBjZXJ0YWluIGV2ZW50cyBsaWtlIGRpc2sgZWplY3Rpb24gaXMgZGV0ZWN0ZWQsIGluIHdoaWNoCiAqIGNhc2UgdGhlIGNhY2hlIHdpbGwgYmUgY2xlYXJlZCwgY2F1c2luZyBpdCB0byBiZSByZXN5bmNlZC4KICogVGhlIGNhY2hlIHNlY3Rpb24gbXVzdCBiZSBoZWxkIGJ5IGNhbGxlci4KICovCnN0YXRpYyBpbnQgQ0RST01fU3luY0NhY2hlKGludCBkZXYsIGludCBmZCkKewogICBpbnQgaSwgaW8gPSAwLCB0c3o7CiNpZmRlZiBsaW51eAogICBzdHJ1Y3QgY2Ryb21fdG9jaGRyCQloZHI7CiAgIHN0cnVjdCBjZHJvbV90b2NlbnRyeQllbnRyeTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICBzdHJ1Y3QgaW9jX3RvY19oZWFkZXIJaGRyOwogICBzdHJ1Y3QgaW9jX3JlYWRfdG9jX2VudHJ5CWVudHJ5OwogICBzdHJ1Y3QgY2RfdG9jX2VudHJ5ICAgICAgICAgdG9jX2J1ZmZlcjsKI2VuZGlmCiAgIENEUk9NX1RPQyAqdG9jID0gJmNkcm9tX2NhY2hlW2Rldl0udG9jOwogICBjZHJvbV9jYWNoZVtkZXZdLnRvY19nb29kID0gMDsKCiNpZmRlZiBsaW51eAoKICAgaW8gPSBpb2N0bChmZCwgQ0RST01SRUFEVE9DSERSLCAmaGRyKTsKICAgaWYgKGlvID09IC0xKQogICB7CiAgICAgIFdBUk4oIiglZCkgLS0gRXJyb3Igb2NjdXJyZWQgKCVzKSFcbiIsIGRldiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgZ290byBlbmQ7CiAgIH0KCiAgIHRvYy0+Rmlyc3RUcmFjayA9IGhkci5jZHRoX3RyazA7CiAgIHRvYy0+TGFzdFRyYWNrICA9IGhkci5jZHRoX3RyazE7CiAgIHRzeiA9IHNpemVvZih0b2MtPkZpcnN0VHJhY2spICsgc2l6ZW9mKHRvYy0+TGFzdFRyYWNrKQogICAgICAgKyBzaXplb2YoVFJBQ0tfREFUQSkgKiAodG9jLT5MYXN0VHJhY2stdG9jLT5GaXJzdFRyYWNrKzIpOwogICB0b2MtPkxlbmd0aFswXSA9IHRzeiA+PiA4OwogICB0b2MtPkxlbmd0aFsxXSA9IHRzejsKCiAgIFRSQUNFKCJjYWNoaW5nIHRvYyBmcm9tPSVkIHRvPSVkXG4iLCB0b2MtPkZpcnN0VHJhY2ssIHRvYy0+TGFzdFRyYWNrICk7CgogICBmb3IgKGkgPSB0b2MtPkZpcnN0VHJhY2s7IGkgPD0gdG9jLT5MYXN0VHJhY2sgKyAxOyBpKyspCiAgIHsKICAgICBpZiAoaSA9PSB0b2MtPkxhc3RUcmFjayArIDEpCiAgICAgICBlbnRyeS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKICAgICBlbHNlIAogICAgICAgZW50cnkuY2R0ZV90cmFjayA9IGk7CiAgICAgZW50cnkuY2R0ZV9mb3JtYXQgPSBDRFJPTV9NU0Y7CiAgICAgaW8gPSBpb2N0bChmZCwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeSk7CiAgICAgaWYgKGlvID09IC0xKSB7CiAgICAgICBXQVJOKCJlcnJvciByZWFkIGVudHJ5ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICBnb3RvIGVuZDsKICAgICB9CiAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQ29udHJvbCA9IGVudHJ5LmNkdGVfY3RybDsKICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5BZHIgPSBlbnRyeS5jZHRlX2FkcjsKICAgICAvKiBtYXJraW5nIGxhc3QgdHJhY2sgd2l0aCBsZWFkb3V0IHZhbHVlIGFzIGluZGV4ICovCiAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uVHJhY2tOdW1iZXIgPSBlbnRyeS5jZHRlX3RyYWNrOwogICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMF0gPSAwOwogICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMV0gPSBlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZTsKICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5BZGRyZXNzWzJdID0gZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQ7CiAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1szXSA9IGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWU7CiAgICB9CiAgICBjZHJvbV9jYWNoZVtkZXZdLnRvY19nb29kID0gMTsKICAgIGlvID0gMDsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQoKICAgIGlvID0gaW9jdGwoZmQsIENESU9SRUFEVE9DSEVBREVSLCAmaGRyKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKICAgICAgICBXQVJOKCIoJWQpIC0tIEVycm9yIG9jY3VycmVkICglcykhXG4iLCBkZXYsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZ290byBlbmQ7CiAgICB9CiAgICB0b2MtPkZpcnN0VHJhY2sgPSBoZHIuc3RhcnRpbmdfdHJhY2s7CiAgICB0b2MtPkxhc3RUcmFjayAgPSBoZHIuZW5kaW5nX3RyYWNrOwogICAgdHN6ID0gc2l6ZW9mKHRvYy0+Rmlyc3RUcmFjaykgKyBzaXplb2YodG9jLT5MYXN0VHJhY2spCiAgICAgICAgKyBzaXplb2YoVFJBQ0tfREFUQSkgKiAodG9jLT5MYXN0VHJhY2stdG9jLT5GaXJzdFRyYWNrKzIpOwogICAgdG9jLT5MZW5ndGhbMF0gPSB0c3ogPj4gODsKICAgIHRvYy0+TGVuZ3RoWzFdID0gdHN6OwoKICAgIFRSQUNFKCJjYWNoaW5nIHRvYyBmcm9tPSVkIHRvPSVkXG4iLCB0b2MtPkZpcnN0VHJhY2ssIHRvYy0+TGFzdFRyYWNrICk7CgogICAgZm9yIChpID0gdG9jLT5GaXJzdFRyYWNrOyBpIDw9IHRvYy0+TGFzdFRyYWNrICsgMTsgaSsrKQogICAgewoJaWYgKGkgPT0gdG9jLT5MYXN0VHJhY2sgKyAxKQogICAgICAgIHsKI2RlZmluZSBMRUFET1VUIDB4YWEKCSAgICBlbnRyeS5zdGFydGluZ190cmFjayA9IExFQURPVVQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW50cnkuc3RhcnRpbmdfdHJhY2sgPSBpOwogICAgICAgIH0KCW1lbXNldCgoY2hhciAqKSZ0b2NfYnVmZmVyLCAwLCBzaXplb2YodG9jX2J1ZmZlcikpOwoJZW50cnkuYWRkcmVzc19mb3JtYXQgPSBDRF9NU0ZfRk9STUFUOwoJZW50cnkuZGF0YV9sZW4gPSBzaXplb2YodG9jX2J1ZmZlcik7CgllbnRyeS5kYXRhID0gJnRvY19idWZmZXI7CglpbyA9IGlvY3RsKGZkLCBDRElPUkVBRFRPQ0VOVFJZUywgJmVudHJ5KTsKCWlmIChpbyA9PSAtMSkgewoJICAgIFdBUk4oImVycm9yIHJlYWQgZW50cnkgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCSAgICBnb3RvIGVuZDsKCX0KICAgICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5Db250cm9sID0gdG9jX2J1ZmZlci5jb250cm9sOwogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkciA9IHRvY19idWZmZXIuYWRkcl90eXBlOwogICAgICAgIC8qIG1hcmtpbmcgbGFzdCB0cmFjayB3aXRoIGxlYWRvdXQgdmFsdWUgYXMgaW5kZXggKi8KICAgICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5UcmFja051bWJlciA9IGVudHJ5LnN0YXJ0aW5nX3RyYWNrOwogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMF0gPSAwOwogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMV0gPSB0b2NfYnVmZmVyLmFkZHIubXNmLm1pbnV0ZTsKICAgICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5BZGRyZXNzWzJdID0gdG9jX2J1ZmZlci5hZGRyLm1zZi5zZWNvbmQ7CiAgICAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1szXSA9IHRvY19idWZmZXIuYWRkci5tc2YuZnJhbWU7CiAgICB9CiAgICBjZHJvbV9jYWNoZVtkZXZdLnRvY19nb29kID0gMTsKICAgIGlvID0gMDsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCmVuZDoKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKfQoKc3RhdGljIHZvaWQgQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGludCBkZXYpCnsKICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgY2Ryb21fY2FjaGVbZGV2XS50b2NfZ29vZCA9IDA7CiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXRJbnRlcmZhY2VJbmZvCiAqCiAqIERldGVybWluZXMgdGhlIGlkZSBpbnRlcmZhY2UgKHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGlkZSksIGFuZCB0aGUKICogbnVtYmVyIG9mIHRoZSBkZXZpY2Ugb24gdGhhdCBpbnRlcmZhY2UgZm9yIGlkZSBjZHJvbXMgKCpwb3J0ID09IDApLgogKiBEZXRlcm1pbmVzIHRoZSBzY3NpIGluZm9ybWF0aW9uIGZvciBzY3NpIGNkcm9tcyAoKnBvcnQgPj0gMSkuCiAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGluZm8gY2Fubm90IG5vdCBiZSBvYnRhaW5lZC4KICovCnN0YXRpYyBpbnQgQ0RST01fR2V0SW50ZXJmYWNlSW5mbyhpbnQgZmQsIGludCogcG9ydCwgaW50KiBpZmFjZSwgaW50KiBkZXZpY2UsaW50KiBsdW4pCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBzdHJ1Y3Qgc3RhdCBzdDsKICAgIGlmICggZnN0YXQoZmQsICZzdCkgPT0gLTEgfHwgISBTX0lTQkxLKHN0LnN0X21vZGUpKSByZXR1cm4gMDsKICAgICpwb3J0ID0gMDsKICAgICppZmFjZSA9IDA7CiAgICAqZGV2aWNlID0gMDsKICAgICpsdW4gPSAwOwogICAgc3dpdGNoIChtYWpvcihzdC5zdF9yZGV2KSkgewogICAgY2FzZSBJREUwX01BSk9SOiAqaWZhY2UgPSAwOyBicmVhazsKICAgIGNhc2UgSURFMV9NQUpPUjogKmlmYWNlID0gMTsgYnJlYWs7CiAgICBjYXNlIElERTJfTUFKT1I6ICppZmFjZSA9IDI7IGJyZWFrOwogICAgY2FzZSBJREUzX01BSk9SOiAqaWZhY2UgPSAzOyBicmVhazsKICAgIGNhc2UgSURFNF9NQUpPUjogKmlmYWNlID0gNDsgYnJlYWs7CiAgICBjYXNlIElERTVfTUFKT1I6ICppZmFjZSA9IDU7IGJyZWFrOwogICAgY2FzZSBJREU2X01BSk9SOiAqaWZhY2UgPSA2OyBicmVhazsKICAgIGNhc2UgSURFN19NQUpPUjogKmlmYWNlID0gNzsgYnJlYWs7CiAgICBkZWZhdWx0OiAqcG9ydCA9IDE7IGJyZWFrOwogICAgfQoKICAgIGlmICgqcG9ydCA9PSAwKQogICAgICAgICpkZXZpY2UgPSAobWlub3Ioc3Quc3RfcmRldikgPj4gNik7CiAgICBlbHNlCiAgICB7CiNpZmRlZiBTQ1NJX0lPQ1RMX0dFVF9JRExVTgogICAgICAgIFVJTlQzMiBpZGx1blsyXTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNDU0lfSU9DVExfR0VUX0lETFVOLCAmaWRsdW4pICE9IC0xKQogICAgICAgIHsKICAgICAgICAgICAgKnBvcnQgPSAoKGlkbHVuWzBdID4+IDI0KSAmIDB4ZmYpICsgMTsKICAgICAgICAgICAgKmlmYWNlID0gKGlkbHVuWzBdID4+IDE2KSAmIDB4ZmY7CiAgICAgICAgICAgICpkZXZpY2UgPSBpZGx1blswXSAmIDB4ZmY7CiAgICAgICAgICAgICpsdW4gPSAoaWRsdW5bMF0gPj4gOCkgJiAweGZmOwogICAgICAgIH0KICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiQ0QtUk9NIGRldmljZSAoJWQsICVkKSBub3Qgc3VwcG9ydGVkXG4iLCBtYWpvcihzdC5zdF9yZGV2KSwgbWlub3Ioc3Quc3RfcmRldikpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQogICAgc3RydWN0IHNjc2lfYWRkciBhZGRyOwogICAgaWYgKGlvY3RsKGZkLCBTQ0lPQ0lERU5USUZZLCAmYWRkcikgIT0gLTEpCiAgICB7CiAgICAgICAgc3dpdGNoIChhZGRyLnR5cGUpIAogICAgICAgIHsKICAgICAgICBjYXNlIFRZUEVfU0NTSTogICpwb3J0ID0gMTsKICAgICAgICAgICAgKmlmYWNlID0gYWRkci5hZGRyLnNjc2kuc2NidXM7CiAgICAgICAgICAgICpkZXZpY2UgPSBhZGRyLmFkZHIuc2NzaS50YXJnZXQ7CiAgICAgICAgICAgICpsdW4gPSBhZGRyLmFkZHIuc2NzaS5sdW47CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9BVEFQSTogKnBvcnQgPSAwOwogICAgICAgICAgICAqaWZhY2UgPSBhZGRyLmFkZHIuYXRhcGkuYXRidXM7CiAgICAgICAgICAgICpkZXZpY2UgPSBhZGRyLmFkZHIuYXRhcGkuZHJpdmU7CiAgICAgICAgICAgICpsdW4gPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWQgZm9yIEJTRFxuIik7CiAgICByZXR1cm4gMDsKI2Vsc2UKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWQgZm9yIG5vbmxpbnV4XG4iKTsKICAgIHJldHVybiAwOwojZW5kaWYKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX09wZW4KICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9PcGVuKGludCBmZCwgaW50KiBkZXYpCnsKICAgIHN0cnVjdCBzdGF0IHN0OwogICAgTlRTVEFUVVMgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAgICBpbnQgICAgICAgICBlbXB0eSA9IC0xOwoKICAgIGZzdGF0KGZkLCAmc3QpOwoKICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgZm9yICgqZGV2ID0gMDsgKmRldiA8IE1BWF9DQUNIRV9FTlRSSUVTOyAoKmRldikrKykKICAgIHsKICAgICAgICBpZiAoZW1wdHkgPT0gLTEgJiYKICAgICAgICAgICAgY2Ryb21fY2FjaGVbKmRldl0uZGV2aWNlID09IDAgJiYKICAgICAgICAgICAgY2Ryb21fY2FjaGVbKmRldl0uaW5vZGUgPT0gMCkKICAgICAgICAgICAgZW1wdHkgPSAqZGV2OwogICAgICAgIGVsc2UgaWYgKGNkcm9tX2NhY2hlWypkZXZdLmRldmljZSA9PSBzdC5zdF9kZXYgJiYKICAgICAgICAgICAgICAgICBjZHJvbV9jYWNoZVsqZGV2XS5pbm9kZSA9PSBzdC5zdF9pbm8pCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKCpkZXYgPT0gTUFYX0NBQ0hFX0VOVFJJRVMpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5ID09IC0xKSByZXQgPSBTVEFUVVNfTk9UX0lNUExFTUVOVEVEOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICpkZXYgPSBlbXB0eTsKICAgICAgICAgICAgY2Ryb21fY2FjaGVbKmRldl0uZGV2aWNlICA9IHN0LnN0X2RldjsKICAgICAgICAgICAgY2Ryb21fY2FjaGVbKmRldl0uaW5vZGUgICA9IHN0LnN0X2lubzsKICAgICAgICB9CiAgICB9CiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKCiAgICBUUkFDRSgiJWQsICVkXG4iLCAqZGV2LCBmZCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXRTdGF0dXNDb2RlCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0U3RhdHVzQ29kZShpbnQgaW8pCnsKICAgIGlmIChpbyA9PSAwKSByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAgICByZXR1cm4gRklMRV9HZXROdFN0YXR1cygpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXRDb250cm9sCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0Q29udHJvbChpbnQgZGV2LCBDRFJPTV9BVURJT19DT05UUk9MKiBjYWMpCnsKICAgIGNhYy0+TGJhRm9ybWF0ID0gMDsgLyogRklYTUUgKi8KICAgIGNhYy0+TG9naWNhbEJsb2Nrc1BlclNlY29uZCA9IDE7IC8qIEZJWE1FICovCiAgICByZXR1cm4gIFNUQVRVU19OT1RfU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXREZXZpY2VOdW1iZXIKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9HZXREZXZpY2VOdW1iZXIoaW50IGRldiwgU1RPUkFHRV9ERVZJQ0VfTlVNQkVSKiBkZXZudW0pCnsKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fR2V0RHJpdmVHZW9tZXRyeQogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX0dldERyaXZlR2VvbWV0cnkoaW50IGRldiwgaW50IGZkLCBESVNLX0dFT01FVFJZKiBkZykKewogIENEUk9NX1RPQyAgICAgdG9jOwogIE5UU1RBVFVTICAgICAgcmV0ID0gMDsKICBpbnQgICAgICAgICAgIGZzaXplID0gMDsKCiAgaWYgKChyZXQgPSBDRFJPTV9SZWFkVE9DKGRldiwgZmQsICZ0b2MpKSAhPSAwKSByZXR1cm4gcmV0OwoKICBmc2l6ZSA9IEZSQU1FX09GX1RPQyh0b2MsIHRvYy5MYXN0VHJhY2srMSkKICAgICAgICAtIEZSQU1FX09GX1RPQyh0b2MsIDEpOyAvKiBUb3RhbCBzaXplIGluIGZyYW1lcyAqLwogIAogIGRnLT5DeWxpbmRlcnMudS5Mb3dQYXJ0ID0gZnNpemUgLyAoNjQgKiAzMik7IAogIGRnLT5DeWxpbmRlcnMudS5IaWdoUGFydCA9IDA7IAogIGRnLT5NZWRpYVR5cGUgPSBSZW1vdmFibGVNZWRpYTsgIAogIGRnLT5UcmFja3NQZXJDeWxpbmRlciA9IDY0OyAKICBkZy0+U2VjdG9yc1BlclRyYWNrID0gMzI7ICAKICBkZy0+Qnl0ZXNQZXJTZWN0b3I9IDIwNDg7IAogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEUk9NX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgW2ludGVybmFsXQogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1Jlc2V0QXVkaW8oaW50IGZkKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENEUk9NUkVTRVQpKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENESU9DUkVTRVQsIE5VTEwpKTsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1NldFRyYXkKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9TZXRUcmF5KGludCBmZCwgQk9PTCBkb0VqZWN0KQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIGRvRWplY3QgPyBDRFJPTUVKRUNUIDogQ0RST01DTE9TRVRSQVkpKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoKGlvY3RsKGZkLCBDRElPQ0FMTE9XLCBOVUxMKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpb2N0bChmZCwgZG9FamVjdCA/IENESU9DRUpFQ1QgOiBDRElPQ0NMT1NFLCBOVUxMKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpb2N0bChmZCwgQ0RJT0NQUkVWRU5ULCBOVUxMKSkpOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fQ29udHJvbEVqZWN0aW9uCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fQ29udHJvbEVqZWN0aW9uKGludCBmZCwgY29uc3QgUFJFVkVOVF9NRURJQV9SRU1PVkFMKiBybXYpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01fTE9DS0RPT1IsIHJtdi0+UHJldmVudE1lZGlhUmVtb3ZhbCkpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgKHJtdi0+UHJldmVudE1lZGlhUmVtb3ZhbCkgPyBDRElPQ1BSRVZFTlQgOiBDRElPQ0FMTE9XLCBOVUxMKSk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9SZWFkVE9DCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUmVhZFRPQyhpbnQgZGV2LCBpbnQgZmQsIENEUk9NX1RPQyogdG9jKQp7CiAgICBOVFNUQVRVUyAgICAgICByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKCiAgICBpZiAoZGV2IDwgMCB8fCBkZXYgPj0gTUFYX0NBQ0hFX0VOVFJJRVMpCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKICAgIGlmIChjZHJvbV9jYWNoZVtkZXZdLnRvY19nb29kIHx8ICEocmV0ID0gQ0RST01fU3luY0NhY2hlKGRldiwgZmQpKSkKICAgIHsKICAgICAgICAqdG9jID0gY2Ryb21fY2FjaGVbZGV2XS50b2M7CiAgICAgICAgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAgICB9CiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldERpc2tEYXRhCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0RGlza0RhdGEoaW50IGRldiwgaW50IGZkLCBDRFJPTV9ESVNLX0RBVEEqIGRhdGEpCnsKICAgIENEUk9NX1RPQyAgIHRvYzsKICAgIE5UU1RBVFVTICAgIHJldDsKICAgIGludCAgICAgICAgIGk7CgogICAgaWYgKChyZXQgPSBDRFJPTV9SZWFkVE9DKGRldiwgZmQsICZ0b2MpKSAhPSAwKSByZXR1cm4gcmV0OwogICAgZGF0YS0+RGlza0RhdGEgPSAwOwogICAgZm9yIChpID0gdG9jLkZpcnN0VHJhY2s7IGkgPD0gdG9jLkxhc3RUcmFjazsgaSsrKSB7CiAgICAgICAgaWYgKHRvYy5UcmFja0RhdGFbaS10b2MuRmlyc3RUcmFja10uQ29udHJvbCAmIDB4MDQpCiAgICAgICAgICAgIGRhdGEtPkRpc2tEYXRhIHw9IENEUk9NX0RJU0tfREFUQV9UUkFDSzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEtPkRpc2tEYXRhIHw9IENEUk9NX0RJU0tfQVVESU9fVFJBQ0s7CiAgICB9CiAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1JlYWRRQ2hhbm5lbAogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1JlYWRRQ2hhbm5lbChpbnQgZGV2LCBpbnQgZmQsIGNvbnN0IENEUk9NX1NVQl9RX0RBVEFfRk9STUFUKiBmbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCX1FfQ0hBTk5FTF9EQVRBKiBkYXRhKQp7CiAgICBOVFNUQVRVUyAgICAgICAgICAgIHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwojaWZkZWYgbGludXgKICAgIHVuc2lnbmVkICAgICAgICAgICAgc2l6ZTsKICAgIFNVQl9RX0hFQURFUiogICAgICAgaGRyID0gKFNVQl9RX0hFQURFUiopZGF0YTsKICAgIGludCAgICAgICAgICAgICAgICAgaW87CiAgICBzdHJ1Y3QgY2Ryb21fc3ViY2hubAlzYzsKICAgIHNjLmNkc2NfZm9ybWF0ID0gQ0RST01fTVNGOwoKICAgIGlvID0gaW9jdGwoZmQsIENEUk9NU1VCQ0hOTCwgJnNjKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKCVRSQUNFKCJvcGVuZWQgb3Igbm9fbWVkaWEgKCVzKSFcbiIsIHN0cmVycm9yKGVycm5vKSk7CgloZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PX1NUQVRVUzsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwoJZ290byBlbmQ7CiAgICB9CgogICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19OT1RfU1VQUE9SVEVEOwoKICAgIHN3aXRjaCAoc2MuY2RzY19hdWRpb3N0YXR1cykgewogICAgY2FzZSBDRFJPTV9BVURJT19JTlZBTElEOgoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CgloZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PVF9TVVBQT1JURUQ7CglicmVhazsKICAgIGNhc2UgQ0RST01fQVVESU9fTk9fU1RBVFVTOgoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CgloZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PX1NUQVRVUzsKCWJyZWFrOwogICAgY2FzZSBDRFJPTV9BVURJT19QTEFZOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfSU5fUFJPR1JFU1M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIENEUk9NX0FVRElPX1BBVVNFRDoKICAgICAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX1BBVVNFRDsKICAgICAgICBicmVhazsKICAgIGNhc2UgQ0RST01fQVVESU9fQ09NUExFVEVEOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfUExBWV9DT01QTEVURTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQ0RST01fQVVESU9fRVJST1I6CiAgICAgICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19QTEFZX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJzdGF0dXM9JTAyWCAhXG4iLCBzYy5jZHNjX2F1ZGlvc3RhdHVzKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHN3aXRjaCAoZm10LT5Gb3JtYXQpCiAgICB7CiAgICBjYXNlIElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT046CiAgICAgICAgc2l6ZSA9IHNpemVvZihTVUJfUV9DVVJSRU5UX1BPU0lUSU9OKTsKICAgICAgICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKCWlmIChoZHItPkF1ZGlvU3RhdHVzPT1BVURJT19TVEFUVVNfSU5fUFJPR1JFU1MpIHsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5Gb3JtYXRDb2RlID0gSU9DVExfQ0RST01fQ1VSUkVOVF9QT1NJVElPTjsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5Db250cm9sID0gc2MuY2RzY19jdHJsOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BRFIgPSBzYy5jZHNjX2FkcjsgCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uVHJhY2tOdW1iZXIgPSBzYy5jZHNjX3RyazsgCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uSW5kZXhOdW1iZXIgPSBzYy5jZHNjX2luZDsgCgogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFic29sdXRlQWRkcmVzc1swXSA9IDA7IAogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFic29sdXRlQWRkcmVzc1sxXSA9IHNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BYnNvbHV0ZUFkZHJlc3NbMl0gPSBzYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZDsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BYnNvbHV0ZUFkZHJlc3NbM10gPSBzYy5jZHNjX2Fic2FkZHIubXNmLmZyYW1lOwogCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uVHJhY2tSZWxhdGl2ZUFkZHJlc3NbMF0gPSAwOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1sxXSA9IHNjLmNkc2NfcmVsYWRkci5tc2YubWludXRlOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1syXSA9IHNjLmNkc2NfcmVsYWRkci5tc2Yuc2Vjb25kOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzNdID0gc2MuY2RzY19yZWxhZGRyLm1zZi5mcmFtZTsKCgkgIGNkcm9tX2NhY2hlW2Rldl0uQ3VycmVudFBvc2l0aW9uID0gZGF0YS0+Q3VycmVudFBvc2l0aW9uOwoJfQoJZWxzZSAvKiBub3QgcGxheWluZyAqLwoJewoJICBjZHJvbV9jYWNoZVtkZXZdLkN1cnJlbnRQb3NpdGlvbi5IZWFkZXIgPSAqaGRyOyAvKiBQcmVzZXJ2ZSBoZWFkZXIgaW5mbyAqLwoJICBkYXRhLT5DdXJyZW50UG9zaXRpb24gPSBjZHJvbV9jYWNoZVtkZXZdLkN1cnJlbnRQb3NpdGlvbjsKCX0KICAgICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fTUVESUFfQ0FUQUxPRzoKICAgICAgICBzaXplID0gc2l6ZW9mKFNVQl9RX01FRElBX0NBVEFMT0dfTlVNQkVSKTsKICAgICAgICBkYXRhLT5NZWRpYUNhdGFsb2cuRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0c7CiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgY2Ryb21fbWNuIG1jbjsKICAgICAgICAgICAgaWYgKChpbyA9IGlvY3RsKGZkLCBDRFJPTV9HRVRfTUNOLCAmbWNuKSkgPT0gLTEpIGdvdG8gZW5kOwoKICAgICAgICAgICAgZGF0YS0+TWVkaWFDYXRhbG9nLkZvcm1hdENvZGUgPSBJT0NUTF9DRFJPTV9NRURJQV9DQVRBTE9HOwogICAgICAgICAgICBkYXRhLT5NZWRpYUNhdGFsb2cuTWN2YWwgPSAwOyAvKiBGSVhNRSAqLwogICAgICAgICAgICBtZW1jcHkoZGF0YS0+TWVkaWFDYXRhbG9nLk1lZGlhQ2F0YWxvZywgbWNuLm1lZGl1bV9jYXRhbG9nX251bWJlciwgMTQpOwogICAgICAgICAgICBkYXRhLT5NZWRpYUNhdGFsb2cuTWVkaWFDYXRhbG9nWzE0XSA9IDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9UUkFDS19JU1JDOgogICAgICAgIHNpemUgPSBzaXplb2YoU1VCX1FfQ1VSUkVOVF9QT1NJVElPTik7CiAgICAgICAgRklYTUUoIlRyYWNrSXNyYzogTklZIG9uIGxpbnV4XG4iKTsKICAgICAgICBkYXRhLT5UcmFja0lzcmMuRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX1RSQUNLX0lTUkM7CiAgICAgICAgZGF0YS0+VHJhY2tJc3JjLlRjdmFsID0gMDsKICAgICAgICBpbyA9IDA7CiAgICAgICAgYnJlYWs7CiAgICB9CgogZW5kOgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHVuc2lnbmVkICAgICAgICAgICAgc2l6ZTsKICAgIFNVQl9RX0hFQURFUiogICAgICAgaGRyID0gKFNVQl9RX0hFQURFUiopZGF0YTsKICAgIGludCAgICAgICAgICAgICAgICAgaW87CiAgICBzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbAlyZWFkX3NjOwogICAgc3RydWN0IGNkX3N1Yl9jaGFubmVsX2luZm8Jc2M7CgogICAgcmVhZF9zYy5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CiAgICByZWFkX3NjLnRyYWNrICAgICAgICAgID0gMDsKICAgIHJlYWRfc2MuZGF0YV9sZW4gICAgICAgPSBzaXplb2Yoc2MpOwogICAgcmVhZF9zYy5kYXRhICAgICAgICAgICA9ICZzYzsKICAgIHN3aXRjaCAoZm10LT5Gb3JtYXQpCiAgICB7CiAgICBjYXNlIElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT046CiAgICAgICAgcmVhZF9zYy5kYXRhX2Zvcm1hdCAgICA9IENEX0NVUlJFTlRfUE9TSVRJT047CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0c6CiAgICAgICAgcmVhZF9zYy5kYXRhX2Zvcm1hdCAgICA9IENEX01FRElBX0NBVEFMT0c7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1RSQUNLX0lTUkM6CiAgICAgICAgcmVhZF9zYy5kYXRhX2Zvcm1hdCAgICA9IENEX1RSQUNLX0lORk87CiAgICAgICAgc2Mud2hhdC50cmFja19pbmZvLnRyYWNrX251bWJlciA9IGRhdGEtPlRyYWNrSXNyYy5UcmFjazsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlvID0gaW9jdGwoZmQsIENESU9DUkVBRFNVQkNIQU5ORUwsICZyZWFkX3NjKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKCVRSQUNFKCJvcGVuZWQgb3Igbm9fbWVkaWEgKCVzKSFcbiIsIHN0cmVycm9yKGVycm5vKSk7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9fU1RBVFVTOwoJZ290byBlbmQ7CiAgICB9CgogICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19OT1RfU1VQUE9SVEVEOwoKICAgIHN3aXRjaCAoc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cykgewogICAgY2FzZSBDRF9BU19BVURJT19JTlZBTElEOgoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CgloZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PVF9TVVBQT1JURUQ7CglicmVhazsKICAgIGNhc2UgQ0RfQVNfTk9fU1RBVFVTOgoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CgloZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PX1NUQVRVUzsKICAgICAgICBicmVhazsKICAgIGNhc2UgQ0RfQVNfUExBWV9JTl9QUk9HUkVTUzoKICAgICAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX0lOX1BST0dSRVNTOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRF9BU19QTEFZX1BBVVNFRDoKICAgICAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX1BBVVNFRDsKICAgICAgICBicmVhazsKICAgIGNhc2UgQ0RfQVNfUExBWV9DT01QTEVURUQ6CiAgICAgICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19QTEFZX0NPTVBMRVRFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRF9BU19QTEFZX0VSUk9SOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfUExBWV9FUlJPUjsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CglUUkFDRSgic3RhdHVzPSUwMlggIVxuIiwgc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cyk7CiAgICB9CiAgICBzd2l0Y2ggKGZtdC0+Rm9ybWF0KQogICAgewogICAgY2FzZSBJT0NUTF9DRFJPTV9DVVJSRU5UX1BPU0lUSU9OOgogICAgICAgIHNpemUgPSBzaXplb2YoU1VCX1FfQ1VSUkVOVF9QT1NJVElPTik7CiAgICAgICAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oICZjYWNoZV9zZWN0aW9uICk7CglpZiAoaGRyLT5BdWRpb1N0YXR1cz09QVVESU9fU1RBVFVTX0lOX1BST0dSRVNTKSB7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT047CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQ29udHJvbCA9IHNjLndoYXQucG9zaXRpb24uY29udHJvbDsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BRFIgPSBzYy53aGF0LnBvc2l0aW9uLmFkZHJfdHlwZTsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja051bWJlciA9IHNjLndoYXQucG9zaXRpb24udHJhY2tfbnVtYmVyOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkluZGV4TnVtYmVyID0gc2Mud2hhdC5wb3NpdGlvbi5pbmRleF9udW1iZXI7CgogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFic29sdXRlQWRkcmVzc1swXSA9IDA7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzFdID0gc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGU7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzJdID0gc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQ7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzNdID0gc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZTsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1swXSA9IDA7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uVHJhY2tSZWxhdGl2ZUFkZHJlc3NbMV0gPSBzYy53aGF0LnBvc2l0aW9uLnJlbGFkZHIubXNmLm1pbnV0ZTsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1syXSA9IHNjLndoYXQucG9zaXRpb24ucmVsYWRkci5tc2Yuc2Vjb25kOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzNdID0gc2Mud2hhdC5wb3NpdGlvbi5yZWxhZGRyLm1zZi5mcmFtZTsKCSAgY2Ryb21fY2FjaGVbZGV2XS5DdXJyZW50UG9zaXRpb24gPSBkYXRhLT5DdXJyZW50UG9zaXRpb247Cgl9CgllbHNlIHsgLyogbm90IHBsYXlpbmcgKi8KCSAgY2Ryb21fY2FjaGVbZGV2XS5DdXJyZW50UG9zaXRpb24uSGVhZGVyID0gKmhkcjsgLyogUHJlc2VydmUgaGVhZGVyIGluZm8gKi8KCSAgZGF0YS0+Q3VycmVudFBvc2l0aW9uID0gY2Ryb21fY2FjaGVbZGV2XS5DdXJyZW50UG9zaXRpb247Cgl9CiAgICAgICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oICZjYWNoZV9zZWN0aW9uICk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0c6CiAgICAgICAgc2l6ZSA9IHNpemVvZihTVUJfUV9NRURJQV9DQVRBTE9HX05VTUJFUik7CiAgICAgICAgZGF0YS0+TWVkaWFDYXRhbG9nLkZvcm1hdENvZGUgPSBJT0NUTF9DRFJPTV9NRURJQV9DQVRBTE9HOwogICAgICAgIGRhdGEtPk1lZGlhQ2F0YWxvZy5NY3ZhbCA9IHNjLndoYXQubWVkaWFfY2F0YWxvZy5tY192YWxpZDsKICAgICAgICBtZW1jcHkoZGF0YS0+TWVkaWFDYXRhbG9nLk1lZGlhQ2F0YWxvZywgc2Mud2hhdC5tZWRpYV9jYXRhbG9nLm1jX251bWJlciwgMTUpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9UUkFDS19JU1JDOgogICAgICAgIHNpemUgPSBzaXplb2YoU1VCX1FfQ1VSUkVOVF9QT1NJVElPTik7CiAgICAgICAgZGF0YS0+VHJhY2tJc3JjLkZvcm1hdENvZGUgPSBJT0NUTF9DRFJPTV9UUkFDS19JU1JDOwogICAgICAgIGRhdGEtPlRyYWNrSXNyYy5UY3ZhbCA9IHNjLndoYXQudHJhY2tfaW5mby50aV92YWxpZDsKICAgICAgICBtZW1jcHkoZGF0YS0+VHJhY2tJc3JjLlRyYWNrSXNyYywgc2Mud2hhdC50cmFja19pbmZvLnRpX251bWJlciwgMTUpOwogICAgICAgIGJyZWFrOwogICAgfQoKIGVuZDoKICAgIHJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwojZW5kaWYKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1ZlcmlmeQogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1ZlcmlmeShpbnQgZGV2LCBpbnQgZmQpCnsKICAgIC8qIHF1aWNrIGltcGxlbWVudGF0aW9uICovCiAgICBDRFJPTV9TVUJfUV9EQVRBX0ZPUk1BVCAgICAgZm10OwogICAgU1VCX1FfQ0hBTk5FTF9EQVRBICAgICAgICAgIGRhdGE7CgogICAgZm10LkZvcm1hdCA9IElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT047CiAgICByZXR1cm4gQ0RST01fUmVhZFFDaGFubmVsKGRldiwgZmQsICZmbXQsICZkYXRhKSA/IDEgOiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9QbGF5QXVkaW9NU0YKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9QbGF5QXVkaW9NU0YoaW50IGZkLCBjb25zdCBDRFJPTV9QTEFZX0FVRElPX01TRiogYXVkaW9fbXNmKQp7CiAgICBOVFNUQVRVUyAgICAgICByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2lmZGVmIGxpbnV4CiAgICBzdHJ1Y3QgCWNkcm9tX21zZgltc2Y7CiAgICBpbnQgICAgICAgICBpbzsKCiAgICBtc2YuY2Rtc2ZfbWluMCAgID0gYXVkaW9fbXNmLT5TdGFydGluZ007CiAgICBtc2YuY2Rtc2Zfc2VjMCAgID0gYXVkaW9fbXNmLT5TdGFydGluZ1M7CiAgICBtc2YuY2Rtc2ZfZnJhbWUwID0gYXVkaW9fbXNmLT5TdGFydGluZ0Y7CiAgICBtc2YuY2Rtc2ZfbWluMSAgID0gYXVkaW9fbXNmLT5FbmRpbmdNOwogICAgbXNmLmNkbXNmX3NlYzEgICA9IGF1ZGlvX21zZi0+RW5kaW5nUzsKICAgIG1zZi5jZG1zZl9mcmFtZTEgPSBhdWRpb19tc2YtPkVuZGluZ0Y7CgogICAgaW8gPSBpb2N0bChmZCwgQ0RST01TVEFSVCk7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglXQVJOKCJtb3RvciBkb2Vzbid0IHN0YXJ0ICFcbiIpOwoJZ290byBlbmQ7CiAgICB9CiAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVBMQVlNU0YsICZtc2YpOwogICAgaWYgKGlvID09IC0xKQogICAgewoJV0FSTigiZGV2aWNlIGRvZXNuJ3QgcGxheSAhXG4iKTsKCWdvdG8gZW5kOwogICAgfQogICAgVFJBQ0UoIm1zZiA9ICVkOiVkOiVkICVkOiVkOiVkXG4iLAoJICBtc2YuY2Rtc2ZfbWluMCwgbXNmLmNkbXNmX3NlYzAsIG1zZi5jZG1zZl9mcmFtZTAsCgkgIG1zZi5jZG1zZl9taW4xLCBtc2YuY2Rtc2Zfc2VjMSwgbXNmLmNkbXNmX2ZyYW1lMSk7CiBlbmQ6CiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgc3RydWN0CWlvY19wbGF5X21zZgltc2Y7CiAgICBpbnQgICAgICAgICBpbzsKCiAgICBtc2Yuc3RhcnRfbSAgICAgID0gYXVkaW9fbXNmLT5TdGFydGluZ007CiAgICBtc2Yuc3RhcnRfcyAgICAgID0gYXVkaW9fbXNmLT5TdGFydGluZ1M7CiAgICBtc2Yuc3RhcnRfZiAgICAgID0gYXVkaW9fbXNmLT5TdGFydGluZ0Y7CiAgICBtc2YuZW5kX20gICAgICAgID0gYXVkaW9fbXNmLT5FbmRpbmdNOwogICAgbXNmLmVuZF9zICAgICAgICA9IGF1ZGlvX21zZi0+RW5kaW5nUzsKICAgIG1zZi5lbmRfZiAgICAgICAgPSBhdWRpb19tc2YtPkVuZGluZ0Y7CgogICAgaW8gPSBpb2N0bChmZCwgQ0RJT0NTVEFSVCwgTlVMTCk7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglXQVJOKCJtb3RvciBkb2Vzbid0IHN0YXJ0ICFcbiIpOwoJZ290byBlbmQ7CiAgICB9CiAgICBpbyA9IGlvY3RsKGZkLCBDRElPQ1BMQVlNU0YsICZtc2YpOwogICAgaWYgKGlvID09IC0xKQogICAgewoJV0FSTigiZGV2aWNlIGRvZXNuJ3QgcGxheSAhXG4iKTsKCWdvdG8gZW5kOwogICAgfQogICAgVFJBQ0UoIm1zZiA9ICVkOiVkOiVkICVkOiVkOiVkXG4iLAoJICBtc2Yuc3RhcnRfbSwgbXNmLnN0YXJ0X3MsIG1zZi5zdGFydF9mLAoJICBtc2YuZW5kX20sICAgbXNmLmVuZF9zLCAgIG1zZi5lbmRfZik7CmVuZDoKICAgIHJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwojZW5kaWYKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1NlZWtBdWRpb01TRgogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1NlZWtBdWRpb01TRihpbnQgZGV2LCBpbnQgZmQsIGNvbnN0IENEUk9NX1NFRUtfQVVESU9fTVNGKiBhdWRpb19tc2YpCnsKICAgIENEUk9NX1RPQyB0b2M7CiAgICBpbnQgaSwgaW8sIGZyYW1lOwogICAgU1VCX1FfQ1VSUkVOVF9QT1NJVElPTiAqY3A7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgc3RydWN0IGNkcm9tX21zZjAJbXNmOwogICAgc3RydWN0IGNkcm9tX3N1YmNobmwgc2M7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHN0cnVjdCBpb2NfcGxheV9tc2YJbXNmOwogICAgc3RydWN0IGlvY19yZWFkX3N1YmNoYW5uZWwJcmVhZF9zYzsKICAgIHN0cnVjdCBjZF9zdWJfY2hhbm5lbF9pbmZvCXNjOwogICAgaW50IGZpbmFsX2ZyYW1lOwojZW5kaWYKCiAgICAvKiBVc2UgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBUT0MgdG8gY29tcHV0ZSB0aGUgbmV3IGN1cnJlbnQKICAgICAqIHBvc2l0aW9uLCB3aGljaCBpcyBzaGFkb3dlZCBvbiB0aGUgY2FjaGUuIFtQb3J0YWJsZV0uICovCiAgICBmcmFtZSA9IEZSQU1FX09GX01TRigqYXVkaW9fbXNmKTsKCiAgICBpZiAoKGlvID0gQ0RST01fUmVhZFRPQyhkZXYsIGZkLCAmdG9jKSkgIT0gMCkgcmV0dXJuIGlvOwoKICAgIGZvcihpPXRvYy5GaXJzdFRyYWNrO2k8PXRvYy5MYXN0VHJhY2srMTtpKyspCiAgICAgIGlmIChGUkFNRV9PRl9UT0ModG9jLGkpPmZyYW1lKSBicmVhazsKICAgIGlmIChpIDw9IHRvYy5GaXJzdFRyYWNrIHx8IGkgPiB0b2MuTGFzdFRyYWNrKzEpCiAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICBpLS07CiAgICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKICAgIGNwID0gJmNkcm9tX2NhY2hlW2Rldl0uQ3VycmVudFBvc2l0aW9uOwogICAgY3AtPkZvcm1hdENvZGUgPSBJT0NUTF9DRFJPTV9DVVJSRU5UX1BPU0lUSU9OOyAKICAgIGNwLT5Db250cm9sID0gdG9jLlRyYWNrRGF0YVtpLXRvYy5GaXJzdFRyYWNrXS5Db250cm9sOyAKICAgIGNwLT5BRFIgPSB0b2MuVHJhY2tEYXRhW2ktdG9jLkZpcnN0VHJhY2tdLkFkcjsgCiAgICBjcC0+VHJhY2tOdW1iZXIgPSB0b2MuVHJhY2tEYXRhW2ktdG9jLkZpcnN0VHJhY2tdLlRyYWNrTnVtYmVyOwogICAgY3AtPkluZGV4TnVtYmVyID0gMDsgLyogRklYTUU6IHdoZXJlIGRvIHRoZXkga2VlcCB0aGVzZT8gKi8KICAgIGNwLT5BYnNvbHV0ZUFkZHJlc3NbMF0gPSAwOyAKICAgIGNwLT5BYnNvbHV0ZUFkZHJlc3NbMV0gPSB0b2MuVHJhY2tEYXRhW2ktdG9jLkZpcnN0VHJhY2tdLkFkZHJlc3NbMV07CiAgICBjcC0+QWJzb2x1dGVBZGRyZXNzWzJdID0gdG9jLlRyYWNrRGF0YVtpLXRvYy5GaXJzdFRyYWNrXS5BZGRyZXNzWzJdOwogICAgY3AtPkFic29sdXRlQWRkcmVzc1szXSA9IHRvYy5UcmFja0RhdGFbaS10b2MuRmlyc3RUcmFja10uQWRkcmVzc1szXTsKICAgIGZyYW1lIC09IEZSQU1FX09GX1RPQyh0b2MsaSk7CiAgICBjcC0+VHJhY2tSZWxhdGl2ZUFkZHJlc3NbMF0gPSAwOwogICAgTVNGX09GX0ZSQU1FKGNwLT5UcmFja1JlbGF0aXZlQWRkcmVzc1sxXSwgZnJhbWUpOyAKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwoKICAgIC8qIElmIHBsYXlpbmcsIHRoZW4gaXNzdWUgYSBzZWVrIGNvbW1hbmQsIG90aGVyd2lzZSBkbyBub3RoaW5nICovCiNpZmRlZiBsaW51eAogICAgc2MuY2RzY19mb3JtYXQgPSBDRFJPTV9NU0Y7CgogICAgaW8gPSBpb2N0bChmZCwgQ0RST01TVUJDSE5MLCAmc2MpOwogICAgaWYgKGlvID09IC0xKQogICAgewoJVFJBQ0UoIm9wZW5lZCBvciBub19tZWRpYSAoJXMpIVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwogICAgICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKICAgIH0KICAgIGlmIChzYy5jZHNjX2F1ZGlvc3RhdHVzPT1DRFJPTV9BVURJT19QTEFZKQogICAgewogICAgICBtc2YubWludXRlID0gYXVkaW9fbXNmLT5NOwogICAgICBtc2Yuc2Vjb25kID0gYXVkaW9fbXNmLT5TOwogICAgICBtc2YuZnJhbWUgID0gYXVkaW9fbXNmLT5GOwogICAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01TRUVLLCAmbXNmKSk7CiAgICB9CiAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHJlYWRfc2MuYWRkcmVzc19mb3JtYXQgPSBDRF9NU0ZfRk9STUFUOwogICAgcmVhZF9zYy50cmFjayAgICAgICAgICA9IDA7CiAgICByZWFkX3NjLmRhdGFfbGVuICAgICAgID0gc2l6ZW9mKHNjKTsKICAgIHJlYWRfc2MuZGF0YSAgICAgICAgICAgPSAmc2M7CiAgICByZWFkX3NjLmRhdGFfZm9ybWF0ICAgID0gQ0RfQ1VSUkVOVF9QT1NJVElPTjsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRElPQ1JFQURTVUJDSEFOTkVMLCAmcmVhZF9zYyk7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglUUkFDRSgib3BlbmVkIG9yIG5vX21lZGlhICglcykhXG4iLCBzdHJlcnJvcihlcnJubykpOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwogICAgfQogICAgaWYgKHNjLmhlYWRlci5hdWRpb19zdGF0dXM9PUNEX0FTX1BMQVlfSU5fUFJPR1JFU1MpIAogICAgewoKICAgICAgbXNmLnN0YXJ0X20gICAgICA9IGF1ZGlvX21zZi0+TTsKICAgICAgbXNmLnN0YXJ0X3MgICAgICA9IGF1ZGlvX21zZi0+UzsKICAgICAgbXNmLnN0YXJ0X2YgICAgICA9IGF1ZGlvX21zZi0+RjsKICAgICAgZmluYWxfZnJhbWUgPSBGUkFNRV9PRl9UT0ModG9jLHRvYy5MYXN0VHJhY2srMSktMTsKICAgICAgTVNGX09GX0ZSQU1FKG1zZi5lbmRfbSwgZmluYWxfZnJhbWUpOwoKICAgICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENESU9DUExBWU1TRiwgJm1zZikpOwogICAgfQogICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fUGF1c2VBdWRpbwogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1BhdXNlQXVkaW8oaW50IGZkKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENEUk9NUEFVU0UpKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENESU9DUEFVU0UsIE5VTEwpKTsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1Jlc3VtZUF1ZGlvCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUmVzdW1lQXVkaW8oaW50IGZkKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENEUk9NUkVTVU1FKSk7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRElPQ1JFU1VNRSwgTlVMTCkpOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU3RvcEF1ZGlvCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fU3RvcEF1ZGlvKGludCBmZCkKewojaWYgZGVmaW5lZChsaW51eCkKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRFJPTVNUT1ApKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENESU9DU1RPUCwgTlVMTCkpOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fR2V0Vm9sdW1lCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0Vm9sdW1lKGludCBmZCwgVk9MVU1FX0NPTlRST0wqIHZjKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgc3RydWN0IGNkcm9tX3ZvbGN0cmwgdm9sYzsKICAgIGludCBpbzsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVZPTFJFQUQsICZ2b2xjKTsKICAgIGlmIChpbyAhPSAtMSkKICAgIHsKICAgICAgICB2Yy0+UG9ydFZvbHVtZVswXSA9IHZvbGMuY2hhbm5lbDA7CiAgICAgICAgdmMtPlBvcnRWb2x1bWVbMV0gPSB2b2xjLmNoYW5uZWwxOwogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzJdID0gdm9sYy5jaGFubmVsMjsKICAgICAgICB2Yy0+UG9ydFZvbHVtZVszXSA9IHZvbGMuY2hhbm5lbDM7CiAgICB9CiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHN0cnVjdCAgaW9jX3ZvbCAgICAgdm9sYzsKICAgIGludCBpbzsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRElPQ0dFVFZPTCwgJnZvbGMpOwogICAgaWYgKGlvICE9IC0xKQogICAgewogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzBdID0gdm9sYy52b2xbMF07CiAgICAgICAgdmMtPlBvcnRWb2x1bWVbMV0gPSB2b2xjLnZvbFsxXTsKICAgICAgICB2Yy0+UG9ydFZvbHVtZVsyXSA9IHZvbGMudm9sWzJdOwogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzNdID0gdm9sYy52b2xbM107CiAgICB9CiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9TZXRWb2x1bWUKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9TZXRWb2x1bWUoaW50IGZkLCBjb25zdCBWT0xVTUVfQ09OVFJPTCogdmMpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2xjOwoKICAgIHZvbGMuY2hhbm5lbDAgPSB2Yy0+UG9ydFZvbHVtZVswXTsKICAgIHZvbGMuY2hhbm5lbDEgPSB2Yy0+UG9ydFZvbHVtZVsxXTsKICAgIHZvbGMuY2hhbm5lbDIgPSB2Yy0+UG9ydFZvbHVtZVsyXTsKICAgIHZvbGMuY2hhbm5lbDMgPSB2Yy0+UG9ydFZvbHVtZVszXTsKCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01WT0xDVFJMLCAmdm9sYykpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBzdHJ1Y3QgIGlvY192b2wgICAgIHZvbGM7CgogICAgdm9sYy52b2xbMF0gPSB2Yy0+UG9ydFZvbHVtZVswXTsKICAgIHZvbGMudm9sWzFdID0gdmMtPlBvcnRWb2x1bWVbMV07CiAgICB2b2xjLnZvbFsyXSA9IHZjLT5Qb3J0Vm9sdW1lWzJdOwogICAgdm9sYy52b2xbM10gPSB2Yy0+UG9ydFZvbHVtZVszXTsKCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RJT0NTRVRWT0wsICZ2b2xjKSk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9SYXdSZWFkCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUmF3UmVhZChpbnQgZmQsIGNvbnN0IFJBV19SRUFEX0lORk8qIHJhdywgdm9pZCogYnVmZmVyLCBEV09SRCBsZW4sIERXT1JEKiBzeikKewogICAgaW50CSAgICAgICAgcmV0ID0gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiAgICBpbnQgICAgICAgICBpbyA9IC0xOwogICAgRFdPUkQgICAgICAgc2VjdFNpemU7CgogICAgc3dpdGNoIChyYXctPlRyYWNrTW9kZSkKICAgIHsKICAgIGNhc2UgWWVsbG93TW9kZTI6ICAgc2VjdFNpemUgPSAyMzM2OyAgICAgICAgYnJlYWs7CiAgICBjYXNlIFhBRm9ybTI6ICAgICAgIHNlY3RTaXplID0gMjMyODsgICAgICAgIGJyZWFrOwogICAgY2FzZSBDRERBOiAgICAgICAgICBzZWN0U2l6ZSA9IDIzNTI7ICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6ICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CiAgICBpZiAobGVuIDwgcmF3LT5TZWN0b3JDb3VudCAqIHNlY3RTaXplKSByZXR1cm4gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAvKiBzdHJhbmdlbHkgZW5vdWdoLCBpdCBzZWVtcyB0aGF0IHNlY3RvciBvZmZzZXRzIGFyZSBhbHdheXMgaW5kaWNhdGVkIHdpdGggYSBzaXplIG9mIDIwNDgsCiAgICAgKiBldmVuIGlmIGEgbGFyZ2VyIHNpemUgaWYgcmVhZC4uLgogICAgICovCiNpZiBkZWZpbmVkKGxpbnV4KQogICAgewogICAgICAgIHN0cnVjdCBjZHJvbV9yZWFkICAgICAgIGNkcjsKICAgICAgICBzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbyBjZHJhOwoKICAgICAgICBzd2l0Y2ggKHJhdy0+VHJhY2tNb2RlKQogICAgICAgIHsKICAgICAgICBjYXNlIFllbGxvd01vZGUyOgogICAgICAgICAgICBpZiAocmF3LT5EaXNrT2Zmc2V0LnUuSGlnaFBhcnQpIEZJWE1FKCJVbnN1cHBvcnRlZCB2YWx1ZVxuIik7CiAgICAgICAgICAgIGNkci5jZHJlYWRfbGJhID0gcmF3LT5EaXNrT2Zmc2V0LnUuTG93UGFydDsgLyogRklYTUUgPyAqLwogICAgICAgICAgICBjZHIuY2RyZWFkX2J1ZmFkZHIgPSBidWZmZXI7CiAgICAgICAgICAgIGNkci5jZHJlYWRfYnVmbGVuID0gcmF3LT5TZWN0b3JDb3VudCAqIHNlY3RTaXplOwogICAgICAgICAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVJFQURNT0RFMiwgJmNkcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWEFGb3JtMjoKICAgICAgICAgICAgRklYTUUoIlhBRm9ybTI6IE5JWVxuIik7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgY2FzZSBDRERBOgogICAgICAgICAgICAvKiBGSVhNRTogdGhlIG91dHB1dCBkb2Vzbid0IHNlZW0gMTAwJSBjb3JyZWN0Li4uIGluIGZhY3Qgb3V0cHV0IGlzIHNoaWZ0ZWQKICAgICAgICAgICAgICogYmV0d2VlbiBieSBOVDJLIGJveCBhbmQgdGhpcy4uLiBzaG91bGQgY2hlY2sgb24gdGhlIHNhbWUgZHJpdmUuLi4KICAgICAgICAgICAgICogb3RoZXJ3aXNlLCBJIGZlYXIgYSAyMzUyLzIzNjggbWlzbWF0Y2ggc29tZXdoZXJlIGluIG9uZSBvZiB0aGUgZHJpdmVycwogICAgICAgICAgICAgKiAobGludXgvTlQpLgogICAgICAgICAgICAgKiBBbnl3YXksIHRoYXQncyBub3QgY3JpdGljYWwgYXQgYWxsLiBXZSdyZSB0YWxraW5nIG9mIDE2LzMyIGJ5dGVzLCB3ZSdyZQogICAgICAgICAgICAgKiB0YWxraW5nIG9mIDAuMiBtcyBvZiBzb3VuZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgLyogMjA0OCA9IDIgKiogMTEgKi8KICAgICAgICAgICAgaWYgKHJhdy0+RGlza09mZnNldC51LkhpZ2hQYXJ0ICYgfjIwNDcpIEZJWE1FKCJVbnN1cHBvcnRlZCB2YWx1ZVxuIik7CiAgICAgICAgICAgIGNkcmEuYWRkci5sYmEgPSAoKHJhdy0+RGlza09mZnNldC51Lkxvd1BhcnQgPj4gMTEpIHwKICAgICAgICAgICAgICAgIChyYXctPkRpc2tPZmZzZXQudS5IaWdoUGFydCA8PCAoMzIgLSAxMSkpKSAtIDE7CiAgICAgICAgICAgIEZJWE1FKCJyZWFkaW5nIGF0ICV1XG4iLCBjZHJhLmFkZHIubGJhKTsKICAgICAgICAgICAgY2RyYS5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKICAgICAgICAgICAgY2RyYS5uZnJhbWVzID0gcmF3LT5TZWN0b3JDb3VudDsKICAgICAgICAgICAgY2RyYS5idWYgPSBidWZmZXI7CiAgICAgICAgICAgIGlvID0gaW9jdGwoZmQsIENEUk9NUkVBREFVRElPLCAmY2RyYSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJOSVk6ICVkXG4iLCByYXctPlRyYWNrTW9kZSk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgfQojZWxzZQogICAgewogICAgICAgIHN3aXRjaCAocmF3LT5UcmFja01vZGUpCiAgICAgICAgewogICAgICAgIGNhc2UgWWVsbG93TW9kZTI6CiAgICAgICAgICAgIEZJWE1FKCJZZWxsb3dNb2RlMjogTklZXG4iKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICBjYXNlIFhBRm9ybTI6CiAgICAgICAgICAgIEZJWE1FKCJYQUZvcm0yOiBOSVlcbiIpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIGNhc2UgQ0REQToKICAgICAgICAgICAgRklYTUUoIkNEREE6IE5JWVxuIik7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgfQojZW5kaWYKCiAgICAqc3ogPSBzZWN0U2l6ZSAqIHJhdy0+U2VjdG9yQ291bnQ7CiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1Njc2lQYXNzVGhyb3VnaERpcmVjdAogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1Njc2lQYXNzVGhyb3VnaERpcmVjdChpbnQgZmQsIFBTQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1QgcFBhY2tldCkKewogICAgaW50IHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChDRFJPTV9TRU5EX1BBQ0tFVCkKICAgIHN0cnVjdCBsaW51eF9jZHJvbV9nZW5lcmljX2NvbW1hbmQgY21kOwogICAgc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CiAgICBpbnQgaW87CgogICAgaWYgKHBQYWNrZXQtPkxlbmd0aCA8IHNpemVvZihTQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1QpKQoJcmV0dXJuIFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwoKICAgIGlmIChwUGFja2V0LT5DZGJMZW5ndGggPiAxMikKICAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwoKICAgIGlmIChwUGFja2V0LT5TZW5zZUluZm9MZW5ndGggPiBzaXplb2Yoc2Vuc2UpKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKICAgIG1lbXNldCgmc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwoKICAgIG1lbWNweSgmKGNtZC5jbWQpLCAmKHBQYWNrZXQtPkNkYiksIHBQYWNrZXQtPkNkYkxlbmd0aCk7CgogICAgY21kLmJ1ZmZlciAgICAgICAgID0gcFBhY2tldC0+RGF0YUJ1ZmZlcjsKICAgIGNtZC5idWZsZW4gICAgICAgICA9IHBQYWNrZXQtPkRhdGFUcmFuc2Zlckxlbmd0aDsKICAgIGNtZC5zZW5zZSAgICAgICAgICA9ICZzZW5zZTsKICAgIGNtZC5xdWlldCAgICAgICAgICA9IDA7CiAgICBjbWQudGltZW91dCAgICAgICAgPSBwUGFja2V0LT5UaW1lT3V0VmFsdWUqSFo7CgogICAgc3dpdGNoIChwUGFja2V0LT5EYXRhSW4pCiAgICB7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9PVVQ6CiAgICAgICAgY21kLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfV1JJVEU7CglicmVhazsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX0lOOgogICAgICAgIGNtZC5kYXRhX2RpcmVjdGlvbiA9IENHQ19EQVRBX1JFQUQ7CglicmVhazsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX1VOU1BFQ0lGSUVEOgogICAgICAgIGNtZC5kYXRhX2RpcmVjdGlvbiA9IENHQ19EQVRBX05PTkU7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgfQoKICAgIGlvID0gaW9jdGwoZmQsIENEUk9NX1NFTkRfUEFDS0VULCAmY21kKTsKCiAgICBpZiAocFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoICE9IDApCiAgICB7CiAgICAgICAgbWVtY3B5KChjaGFyKilwUGFja2V0ICsgcFBhY2tldC0+U2Vuc2VJbmZvT2Zmc2V0LAoJICAgICAgICZzZW5zZSwgcFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoKTsKICAgIH0KCiAgICBwUGFja2V0LT5TY3NpU3RhdHVzID0gY21kLnN0YXQ7CgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CgojZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBzY3NpcmVxX3QgY21kOwogICAgaW50IGlvOwoKICAgIGlmIChwUGFja2V0LT5MZW5ndGggPCBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0hfRElSRUNUKSkKCXJldHVybiBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKCiAgICBpZiAocFBhY2tldC0+Q2RiTGVuZ3RoID4gMTIpCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBpZiAocFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoID4gU0VOU0VCVUZMRU4pCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBtZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogICAgbWVtY3B5KCYoY21kLmNtZCksICYocFBhY2tldC0+Q2RiKSwgcFBhY2tldC0+Q2RiTGVuZ3RoKTsKCiAgICBjbWQuY21kbGVuICAgICAgICAgPSBwUGFja2V0LT5DZGJMZW5ndGg7CiAgICBjbWQuZGF0YWJ1ZiAgICAgICAgPSBwUGFja2V0LT5EYXRhQnVmZmVyOwogICAgY21kLmRhdGFsZW4gICAgICAgID0gcFBhY2tldC0+RGF0YVRyYW5zZmVyTGVuZ3RoOwogICAgY21kLnNlbnNlbGVuICAgICAgID0gcFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoOwogICAgY21kLnRpbWVvdXQgICAgICAgID0gcFBhY2tldC0+VGltZU91dFZhbHVlKjEwMDA7IC8qIGluIG1pbGxpc2Vjb25kcyAqLwoKICAgIHN3aXRjaCAocFBhY2tldC0+RGF0YUluKQogICAgewogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfT1VUOgogICAgICAgIGNtZC5mbGFncyB8PSBTQ0NNRF9XUklURTsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfSU46CiAgICAgICAgY21kLmZsYWdzIHw9IFNDQ01EX1JFQUQ7CglicmVhazsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX1VOU1BFQ0lGSUVEOgogICAgICAgIGNtZC5mbGFncyA9IDA7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgfQoKICAgIGlvID0gaW9jdGwoZmQsIFNDSU9DQ09NTUFORCwgJmNtZCk7CgogICAgc3dpdGNoIChjbWQucmV0c3RzKQogICAgewogICAgY2FzZSBTQ0NNRF9PSzogICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfVElNRU9VVDogICAgcmV0dXJuIFNUQVRVU19USU1FT1VUOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfQlVTWTogICAgICAgcmV0dXJuIFNUQVRVU19ERVZJQ0VfQlVTWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICBjYXNlIFNDQ01EX1NFTlNFOiAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9VTktOT1dOOiAgICByZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCAhPSAwKQogICAgewogICAgICAgIG1lbWNweSgoY2hhciopcFBhY2tldCArIHBQYWNrZXQtPlNlbnNlSW5mb09mZnNldCwKCSAgICAgICBjbWQuc2Vuc2UsIHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCk7CiAgICB9CgogICAgcFBhY2tldC0+U2NzaVN0YXR1cyA9IGNtZC5zdGF0dXM7CgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU2NzaVBhc3NUaHJvdWdoCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fU2NzaVBhc3NUaHJvdWdoKGludCBmZCwgUFNDU0lfUEFTU19USFJPVUdIIHBQYWNrZXQpCnsKICAgIGludCByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoQ0RST01fU0VORF9QQUNLRVQpCiAgICBzdHJ1Y3QgbGludXhfY2Ryb21fZ2VuZXJpY19jb21tYW5kIGNtZDsKICAgIHN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlOwogICAgaW50IGlvOwoKICAgIGlmIChwUGFja2V0LT5MZW5ndGggPCBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0gpKQoJcmV0dXJuIFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwoKICAgIGlmIChwUGFja2V0LT5DZGJMZW5ndGggPiAxMikKICAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwoKICAgIGlmIChwUGFja2V0LT5TZW5zZUluZm9MZW5ndGggPiBzaXplb2Yoc2Vuc2UpKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKICAgIG1lbXNldCgmc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwoKICAgIG1lbWNweSgmKGNtZC5jbWQpLCAmKHBQYWNrZXQtPkNkYiksIHBQYWNrZXQtPkNkYkxlbmd0aCk7CgogICAgaWYgKCBwUGFja2V0LT5EYXRhQnVmZmVyT2Zmc2V0ID4gMHgxMDAwICkKICAgIHsKICAgICAgICBjbWQuYnVmZmVyICAgICA9ICh2b2lkKilwUGFja2V0LT5EYXRhQnVmZmVyT2Zmc2V0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNtZC5idWZmZXIgICAgID0gKGNoYXIqKXBQYWNrZXQgKyBwUGFja2V0LT5EYXRhQnVmZmVyT2Zmc2V0OwogICAgfQogICAgY21kLmJ1ZmxlbiAgICAgICAgID0gcFBhY2tldC0+RGF0YVRyYW5zZmVyTGVuZ3RoOwogICAgY21kLnNlbnNlICAgICAgICAgID0gJnNlbnNlOwogICAgY21kLnF1aWV0ICAgICAgICAgID0gMDsKICAgIGNtZC50aW1lb3V0ICAgICAgICA9IHBQYWNrZXQtPlRpbWVPdXRWYWx1ZSpIWjsKCiAgICBzd2l0Y2ggKHBQYWNrZXQtPkRhdGFJbikKICAgIHsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX09VVDoKICAgICAgICBjbWQuZGF0YV9kaXJlY3Rpb24gPSBDR0NfREFUQV9XUklURTsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfSU46CiAgICAgICAgY21kLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfUkVBRDsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfVU5TUEVDSUZJRUQ6CiAgICAgICAgY21kLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgaW8gPSBpb2N0bChmZCwgQ0RST01fU0VORF9QQUNLRVQsICZjbWQpOwoKICAgIGlmIChwUGFja2V0LT5TZW5zZUluZm9MZW5ndGggIT0gMCkKICAgIHsKICAgICAgICBtZW1jcHkoKGNoYXIqKXBQYWNrZXQgKyBwUGFja2V0LT5TZW5zZUluZm9PZmZzZXQsCgkgICAgICAgJnNlbnNlLCBwUGFja2V0LT5TZW5zZUluZm9MZW5ndGgpOwogICAgfQoKICAgIHBQYWNrZXQtPlNjc2lTdGF0dXMgPSBjbWQuc3RhdDsKCiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKCiNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKICAgIHNjc2lyZXFfdCBjbWQ7CiAgICBpbnQgaW87CgogICAgaWYgKHBQYWNrZXQtPkxlbmd0aCA8IHNpemVvZihTQ1NJX1BBU1NfVEhST1VHSCkpCglyZXR1cm4gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CgogICAgaWYgKHBQYWNrZXQtPkNkYkxlbmd0aCA+IDEyKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCA+IFNFTlNFQlVGTEVOKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKICAgIG1lbWNweSgmKGNtZC5jbWQpLCAmKHBQYWNrZXQtPkNkYiksIHBQYWNrZXQtPkNkYkxlbmd0aCk7CgogICAgaWYgKCBwUGFja2V0LT5EYXRhQnVmZmVyT2Zmc2V0ID4gMHgxMDAwICkKICAgIHsKICAgICAgICBjbWQuZGF0YWJ1ZiAgICAgPSAodm9pZCopcFBhY2tldC0+RGF0YUJ1ZmZlck9mZnNldDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjbWQuZGF0YWJ1ZiAgICAgPSAoY2hhciopcFBhY2tldCArIHBQYWNrZXQtPkRhdGFCdWZmZXJPZmZzZXQ7CiAgICB9CgogICAgY21kLmNtZGxlbiAgICAgICAgID0gcFBhY2tldC0+Q2RiTGVuZ3RoOwogICAgY21kLmRhdGFsZW4gICAgICAgID0gcFBhY2tldC0+RGF0YVRyYW5zZmVyTGVuZ3RoOwogICAgY21kLnNlbnNlbGVuICAgICAgID0gcFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoOwogICAgY21kLnRpbWVvdXQgICAgICAgID0gcFBhY2tldC0+VGltZU91dFZhbHVlKjEwMDA7IC8qIGluIG1pbGxpc2Vjb25kcyAqLwoKICAgIHN3aXRjaCAocFBhY2tldC0+RGF0YUluKQogICAgewogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfT1VUOgogICAgICAgIGNtZC5mbGFncyB8PSBTQ0NNRF9XUklURTsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfSU46CiAgICAgICAgY21kLmZsYWdzIHw9IFNDQ01EX1JFQUQ7CglicmVhazsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX1VOU1BFQ0lGSUVEOgogICAgICAgIGNtZC5mbGFncyA9IDA7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgfQoKICAgIGlvID0gaW9jdGwoZmQsIFNDSU9DQ09NTUFORCwgJmNtZCk7CgogICAgc3dpdGNoIChjbWQucmV0c3RzKQogICAgewogICAgY2FzZSBTQ0NNRF9PSzogICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfVElNRU9VVDogICAgcmV0dXJuIFNUQVRVU19USU1FT1VUOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfQlVTWTogICAgICAgcmV0dXJuIFNUQVRVU19ERVZJQ0VfQlVTWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICBjYXNlIFNDQ01EX1NFTlNFOiAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9VTktOT1dOOiAgICByZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCAhPSAwKQogICAgewogICAgICAgIG1lbWNweSgoY2hhciopcFBhY2tldCArIHBQYWNrZXQtPlNlbnNlSW5mb09mZnNldCwKCSAgICAgICBjbWQuc2Vuc2UsIHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCk7CiAgICB9CgogICAgcFBhY2tldC0+U2NzaVN0YXR1cyA9IGNtZC5zdGF0dXM7CgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU2NzaUdldENhcHMKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9TY3NpR2V0Q2FwcyhQSU9fU0NTSV9DQVBBQklMSVRJRVMgY2FwcykKewogICAgTlRTVEFUVVMgICAgcmV0ID0gU1RBVFVTX05PVF9JTVBMRU1FTlRFRDsKCiAgICBjYXBzLT5MZW5ndGggPSBzaXplb2YoKmNhcHMpOwojaWYgZGVmaW5lZChsaW51eCkKICAgIGNhcHMtPk1heGltdW1UcmFuc2Zlckxlbmd0aCA9IFNHX1NDQVRURVJfU1o7IC8qIEZJWE1FICovCiAgICBjYXBzLT5NYXhpbXVtUGh5c2ljYWxQYWdlcyA9IFNHX1NDQVRURVJfU1ogLyBnZXRwYWdlc2l6ZSgpOwogICAgY2Fwcy0+U3VwcG9ydGVkQXN5bmNocm9ub3VzRXZlbnRzID0gVFJVRTsKICAgIGNhcHMtPkFsaWdubWVudE1hc2sgPSBnZXRwYWdlc2l6ZSgpOwogICAgY2Fwcy0+VGFnZ2VkUXVldWluZyA9IEZBTFNFOyAvKiB3ZSBjb3VsZCBjaGVjayB0aGF0IGl0IHdvcmtzIGFuZCBhbnN3ZXIgVFJVRSAqLwogICAgY2Fwcy0+QWRhcHRlclNjYW5zRG93biA9IEZBTFNFOyAvKiBGSVhNRSA/ICovCiAgICBjYXBzLT5BZGFwdGVyVXNlc1BpbyA9IEZBTFNFOyAvKiBGSVhNRSA/ICovCiAgICByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKI2Vsc2UKICAgIEZJWE1FKCJVbmltcGxlbWVudGVkXG4iKTsKI2VuZGlmCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXRBZGRyZXNzCiAqCiAqIGltcGxlbWVudHMgSU9DVExfU0NTSV9HRVRfQUREUkVTUwogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX0dldEFkZHJlc3MoaW50IGZkLCBTQ1NJX0FERFJFU1MqIGFkZHJlc3MpCnsKICAgIGludCBwb3J0bnVtLCBidXNpZCwgdGFyZ2V0aWQsIGx1bjsKCiAgICBhZGRyZXNzLT5MZW5ndGggPSBzaXplb2YoU0NTSV9BRERSRVNTKTsKICAgIGlmICggISBDRFJPTV9HZXRJbnRlcmZhY2VJbmZvKGZkLCAmcG9ydG51bSwgJmJ1c2lkLCAmdGFyZ2V0aWQsICZsdW4pKQogICAgICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKCiAgICBhZGRyZXNzLT5Qb3J0TnVtYmVyID0gcG9ydG51bTsKICAgIGFkZHJlc3MtPlBhdGhJZCA9IGJ1c2lkOyAvKiBidXMgbnVtYmVyICovCiAgICBhZGRyZXNzLT5UYXJnZXRJZCA9IHRhcmdldGlkOwogICAgYWRkcmVzcy0+THVuID0gbHVuOwogICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEVkRfU3RhcnRTZXNzaW9uCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgRFZEX1N0YXJ0U2Vzc2lvbihpbnQgZmQsIFBEVkRfU0VTU0lPTl9JRCBzaWRfaW4sIFBEVkRfU0VTU0lPTl9JRCBzaWRfb3V0KQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgTlRTVEFUVVMgcmV0ID0gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiAgICBkdmRfYXV0aGluZm8gYXV0aF9pbmZvOwoKICAgIG1lbXNldCggJmF1dGhfaW5mbywgMCwgc2l6ZW9mKCBhdXRoX2luZm8gKSApOwogICAgYXV0aF9pbmZvLnR5cGUgPSBEVkRfTFVfU0VORF9BR0lEOwogICAgaWYgKHNpZF9pbikgYXV0aF9pbmZvLmxzYS5hZ2lkID0gKihpbnQqKXNpZF9pbjsgLyogPyovCgogICAgVFJBQ0UoImZkIDB4JTA4eFxuIixmZCk7CiAgICByZXQgPUNEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvKSk7CiAgICAqc2lkX291dCA9IGF1dGhfaW5mby5sc2EuYWdpZDsKICAgIHJldHVybiByZXQ7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURWRF9FbmRTZXNzaW9uCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgRFZEX0VuZFNlc3Npb24oaW50IGZkLCBQRFZEX1NFU1NJT05fSUQgc2lkKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgZHZkX2F1dGhpbmZvIGF1dGhfaW5mbzsKCiAgICBtZW1zZXQoICZhdXRoX2luZm8sIDAsIHNpemVvZiggYXV0aF9pbmZvICkgKTsKICAgIGF1dGhfaW5mby50eXBlID0gRFZEX0lOVkFMSURBVEVfQUdJRDsKICAgIGF1dGhfaW5mby5sc2EuYWdpZCA9ICooaW50KilzaWQ7CgogICAgVFJBQ0UoIlxuIik7CiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8pKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRFZEX1NlbmRLZXkKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBEVkRfU2VuZEtleShpbnQgZmQsIFBEVkRfQ09QWV9QUk9URUNUX0tFWSBrZXkpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBOVFNUQVRVUyByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKICAgIGR2ZF9hdXRoaW5mbyBhdXRoX2luZm87CgogICAgbWVtc2V0KCAmYXV0aF9pbmZvLCAwLCBzaXplb2YoIGF1dGhfaW5mbyApICk7CiAgICBzd2l0Y2ggKGtleS0+S2V5VHlwZSkKICAgIHsKICAgIGNhc2UgRHZkQ2hhbGxlbmdlS2V5OgoJYXV0aF9pbmZvLnR5cGUgPSBEVkRfSE9TVF9TRU5EX0NIQUxMRU5HRTsKCWF1dGhfaW5mby5oc2MuYWdpZCA9IChpbnQpa2V5LT5TZXNzaW9uSWQ7CglUUkFDRSgiRHZkQ2hhbGxlbmdlS2V5IGlvYyAweCV4XG4iLCBEVkRfQVVUSCApOwoJbWVtY3B5KCBhdXRoX2luZm8uaHNjLmNoYWwsIGtleS0+S2V5RGF0YSwgRFZEX0NIQUxMRU5HRV9TSVpFICk7CglyZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKCBmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8gKSk7CglicmVhazsKICAgIGNhc2UgRHZkQnVzS2V5MjoKCWF1dGhfaW5mby50eXBlID0gRFZEX0hPU1RfU0VORF9LRVkyOwoJYXV0aF9pbmZvLmhzay5hZ2lkID0gKGludClrZXktPlNlc3Npb25JZDsKCgltZW1jcHkoIGF1dGhfaW5mby5oc2sua2V5LCBrZXktPktleURhdGEsIERWRF9LRVlfU0laRSApOwoJCglUUkFDRSgiRHZkQnVzS2V5MlxuIik7CglyZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKCBmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8gKSk7CglicmVhazsKCiAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gS2V5dHlwZSAweCV4XG4iLGtleS0+S2V5VHlwZSk7CiAgICB9CiAgICByZXR1cm4gcmV0OwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBUUkFDRSgiYnNkXG4iKTsKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2Vsc2UKICAgIFRSQUNFKCJvdXRzaWRlXG4iKTsKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCiAgICBUUkFDRSgibm90IHJlYWNoZWRcbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEVkRfUmVhZEtleQogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIERWRF9SZWFkS2V5KGludCBmZCwgUERWRF9DT1BZX1BST1RFQ1RfS0VZIGtleSkKewojaWYgZGVmaW5lZChsaW51eCkKICAgIE5UU1RBVFVTIHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwogICAgZHZkX3N0cnVjdCBkdmQ7CiAgICBkdmRfYXV0aGluZm8gYXV0aF9pbmZvOwoKICAgIG1lbXNldCggJmR2ZCwgMCwgc2l6ZW9mKCBkdmRfc3RydWN0ICkgKTsKICAgIG1lbXNldCggJmF1dGhfaW5mbywgMCwgc2l6ZW9mKCBhdXRoX2luZm8gKSApOwogICAgc3dpdGNoIChrZXktPktleVR5cGUpCiAgICB7CiAgICBjYXNlIER2ZERpc2tLZXk6CgkKCWR2ZC50eXBlID0gRFZEX1NUUlVDVF9ESVNDS0VZOwoJZHZkLmRpc2NrZXkuYWdpZCA9IChpbnQpa2V5LT5TZXNzaW9uSWQ7CgltZW1zZXQoIGR2ZC5kaXNja2V5LnZhbHVlLCAwLCBEVkRfRElTQ0tFWV9TSVpFICk7CgkKCVRSQUNFKCJEdmREaXNrS2V5XG4iKTsKCXJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoIGZkLCBEVkRfUkVBRF9TVFJVQ1QsICZkdmQgKSk7CglpZiAocmV0ID09IFNUQVRVU19TVUNDRVNTKQoJICAgIG1lbWNweShrZXktPktleURhdGEsZHZkLmRpc2NrZXkudmFsdWUsRFZEX0RJU0NLRVlfU0laRSk7CglicmVhazsKICAgIGNhc2UgRHZkVGl0bGVLZXk6CglhdXRoX2luZm8udHlwZSA9IERWRF9MVV9TRU5EX1RJVExFX0tFWTsKCWF1dGhfaW5mby5sc3RrLmFnaWQgPSAoaW50KWtleS0+U2Vzc2lvbklkOwoJYXV0aF9pbmZvLmxzdGsubGJhID0gKGludCkoa2V5LT5QYXJhbWV0ZXJzLlRpdGxlT2Zmc2V0LlF1YWRQYXJ0Pj4xMSk7CglUUkFDRSgiRHZkVGl0bGVLZXkgc2Vzc2lvbiAlZCBRdWFkcGFydCAweCUwOGx4IG9mZnNldCAweCUwOHhcbiIsCgkgICAgICAoaW50KWtleS0+U2Vzc2lvbklkLCAobG9uZylrZXktPlBhcmFtZXRlcnMuVGl0bGVPZmZzZXQuUXVhZFBhcnQsIAoJICAgICAgYXV0aF9pbmZvLmxzdGsubGJhKTsKCXJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoIGZkLCBEVkRfQVVUSCwgJmF1dGhfaW5mbyApKTsKCWlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCgkgICAgbWVtY3B5KGtleS0+S2V5RGF0YSwgYXV0aF9pbmZvLmxzdGsudGl0bGVfa2V5LCBEVkRfS0VZX1NJWkUgKTsKCWJyZWFrOwogICAgY2FzZSBEdmRDaGFsbGVuZ2VLZXk6CgoJYXV0aF9pbmZvLnR5cGUgPSBEVkRfTFVfU0VORF9DSEFMTEVOR0U7CglhdXRoX2luZm8ubHNjLmFnaWQgPSAoaW50KWtleS0+U2Vzc2lvbklkOwoKCVRSQUNFKCJEdmRDaGFsbGVuZ2VLZXlcbiIpOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvICkpOwoJaWYgKHJldCA9PSBTVEFUVVNfU1VDQ0VTUykKCSAgICBtZW1jcHkoIGtleS0+S2V5RGF0YSwgYXV0aF9pbmZvLmxzYy5jaGFsLCBEVkRfQ0hBTExFTkdFX1NJWkUgKTsKCWJyZWFrOwogICAgY2FzZSBEdmRBc2Y6CglhdXRoX2luZm8udHlwZSA9IERWRF9MVV9TRU5EX0FTRjsKCVRSQUNFKCJEdmRBc2ZcbiIpOwoJYXV0aF9pbmZvLmxzYXNmLmFzZj0oKFBEVkRfQVNGKWtleS0+S2V5RGF0YSktPlN1Y2Nlc3NGbGFnOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvICkpOwoJKChQRFZEX0FTRilrZXktPktleURhdGEpLT5TdWNjZXNzRmxhZyA9IGF1dGhfaW5mby5sc2FzZi5hc2Y7CglicmVhazsKICAgIGNhc2UgRHZkQnVzS2V5MToKCWF1dGhfaW5mby50eXBlID0gRFZEX0xVX1NFTkRfS0VZMTsKCWF1dGhfaW5mby5sc2suYWdpZCA9IChpbnQpa2V5LT5TZXNzaW9uSWQ7CgoJVFJBQ0UoIkR2ZEJ1c0tleTFcbiIpOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvICkpOwoKCWlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCgkgICAgbWVtY3B5KCBrZXktPktleURhdGEsIGF1dGhfaW5mby5sc2sua2V5LCBEVkRfS0VZX1NJWkUgKTsKCWJyZWFrOwogICAgY2FzZSBEdmRHZXRScGNLZXk6CglhdXRoX2luZm8udHlwZSA9IERWRF9MVV9TRU5EX1JQQ19TVEFURTsKCglUUkFDRSgiRHZkR2V0UnBjS2V5XG4iKTsKCXJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoIGZkLCBEVkRfQVVUSCwgJmF1dGhfaW5mbyApKTsKCglpZiAocmV0ID09IFNUQVRVU19TVUNDRVNTKQoJewoJICAgICgoUERWRF9SUENfS0VZKWtleS0+S2V5RGF0YSktPlR5cGVDb2RlID0gYXV0aF9pbmZvLmxycGNzLnR5cGU7CgkgICAgKChQRFZEX1JQQ19LRVkpa2V5LT5LZXlEYXRhKS0+UmVnaW9uTWFzayA9IGF1dGhfaW5mby5scnBjcy5yZWdpb25fbWFzazsKCSAgICAoKFBEVkRfUlBDX0tFWSlrZXktPktleURhdGEpLT5ScGNTY2hlbWUgPSBhdXRoX2luZm8ubHJwY3MucnBjX3NjaGVtZTsKCX0KCWJyZWFrOwogICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGtleXR5cGUgMHgleFxuIixrZXktPktleVR5cGUpOwogICAgfQogICAgcmV0dXJuIHJldDsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgVFJBQ0UoImJzZFxuIik7CiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbHNlCiAgICBUUkFDRSgib3V0c2lkZVxuIik7CiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgogICAgVFJBQ0UoIm5vdCByZWFjaGVkXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRFZEX0dldFJlZ2lvbgogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIERWRF9HZXRSZWdpb24oaW50IGRldiwgUERWRF9SRUdJT04gcmVnaW9uKQp7CiAgICBGSVhNRSgiXG4iKTsKICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURWRF9HZXRSZWdpb24KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBEVkRfUmVhZFN0cnVjdHVyZShpbnQgZGV2LCBQRFZEX1JFQURfU1RSVUNUVVJFIHN0cnVjdHVyZSwgUERWRF9MQVlFUl9ERVNDUklQVE9SIGxheWVyKQp7CiAgICBGSVhNRSgiXG4iKTsKICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fRGV2aWNlSW9Db250cm9sCiAqCiAqCiAqLwpOVFNUQVRVUyBDRFJPTV9EZXZpY2VJb0NvbnRyb2woSEFORExFIGhEZXZpY2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGhFdmVudCwgUElPX0FQQ19ST1VUSU5FIFVzZXJBcGNSb3V0aW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgVXNlckFwY0NvbnRleHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElPX1NUQVRVU19CTE9DSyBwaW9zYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBkd0lvQ29udHJvbENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBJbkJ1ZmZlciwgRFdPUkQgbkluQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscE91dEJ1ZmZlciwgRFdPUkQgbk91dEJ1ZmZlclNpemUpCnsKICAgIERXT1JEICAgICAgIHN6ID0gMDsKICAgIE5UU1RBVFVTICAgIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogICAgaW50IGZkLCBkZXY7CgogICAgVFJBQ0UoIiVseCAlcyAlbHggJWxkICVseCAlbGQgJXBcbiIsCiAgICAgICAgICAoRFdPUkQpaERldmljZSwgaW9jb2RleChkd0lvQ29udHJvbENvZGUpLCAoRFdPUkQpbHBJbkJ1ZmZlciwgbkluQnVmZmVyU2l6ZSwKICAgICAgICAgIChEV09SRClscE91dEJ1ZmZlciwgbk91dEJ1ZmZlclNpemUsIHBpb3NiKTsKCiAgICBwaW9zYi0+SW5mb3JtYXRpb24gPSAwOwoKICAgIGlmICgoc3RhdHVzID0gd2luZV9zZXJ2ZXJfaGFuZGxlX3RvX2ZkKCBoRGV2aWNlLCAwLCAmZmQsIE5VTEwgKSkpIGdvdG8gZXJyb3I7CiAgICBpZiAoKHN0YXR1cyA9IENEUk9NX09wZW4oZmQsICZkZXYpKSkKICAgIHsKICAgICAgICB3aW5lX3NlcnZlcl9yZWxlYXNlX2ZkKCBoRGV2aWNlLCBmZCApOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgc3dpdGNoIChkd0lvQ29udHJvbENvZGUpCiAgICB7CiAgICBjYXNlIElPQ1RMX1NUT1JBR0VfQ0hFQ0tfVkVSSUZZOgogICAgY2FzZSBJT0NUTF9DRFJPTV9DSEVDS19WRVJJRlk6CiAgICAgICAgc3ogPSAwOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9WZXJpZnkoZGV2LCBmZCk7CiAgICAgICAgYnJlYWs7CgovKiBFUFAgICAgIGNhc2UgSU9DVExfU1RPUkFHRV9DSEVDS19WRVJJRlkyOiAqLwoKLyogRVBQICAgICBjYXNlIElPQ1RMX1NUT1JBR0VfRklORF9ORVdfREVWSUNFUzogKi8KLyogRVBQICAgICBjYXNlIElPQ1RMX0NEUk9NX0ZJTkRfTkVXX0RFVklDRVM6ICovCgogICAgY2FzZSBJT0NUTF9TVE9SQUdFX0xPQURfTUVESUE6CiAgICBjYXNlIElPQ1RMX0NEUk9NX0xPQURfTUVESUE6CiAgICAgICAgc3ogPSAwOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9TZXRUcmF5KGZkLCBGQUxTRSk7CiAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9TVE9SQUdFX0VKRUNUX01FRElBOgogICAgICAgIHN6ID0gMDsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwIHx8IGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fU2V0VHJheShmZCwgVFJVRSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJT0NUTF9DRFJPTV9NRURJQV9SRU1PVkFMOgogICAgY2FzZSBJT0NUTF9ESVNLX01FRElBX1JFTU9WQUw6CiAgICBjYXNlIElPQ1RMX1NUT1JBR0VfTUVESUFfUkVNT1ZBTDoKICAgIGNhc2UgSU9DVExfU1RPUkFHRV9FSkVDVElPTl9DT05UUk9MOgogICAgICAgIC8qIEZJWE1FIHRoZSBsYXN0IGlvY3RsOnMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0d28gb3RoZXJzLi4uCiAgICAgICAgICogbG9ja2NvdW50L293bmVyIHNob3VsZCBiZSBoYW5kbGVkICovCiAgICAgICAgc3ogPSAwOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgaWYgKGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5JbkJ1ZmZlclNpemUgPCBzaXplb2YoUFJFVkVOVF9NRURJQV9SRU1PVkFMKSkgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9Db250cm9sRWplY3Rpb24oZmQsIChjb25zdCBQUkVWRU5UX01FRElBX1JFTU9WQUwqKWxwSW5CdWZmZXIpOwogICAgICAgIGJyZWFrOwoKLyogRVBQICAgICBjYXNlIElPQ1RMX1NUT1JBR0VfR0VUX01FRElBX1RZUEVTOiAqLwoKICAgIGNhc2UgSU9DVExfU1RPUkFHRV9HRVRfREVWSUNFX05VTUJFUjoKICAgICAgICBzeiA9IHNpemVvZihTVE9SQUdFX0RFVklDRV9OVU1CRVIpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9HZXREZXZpY2VOdW1iZXIoZGV2LCAoU1RPUkFHRV9ERVZJQ0VfTlVNQkVSKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJT0NUTF9TVE9SQUdFX1JFU0VUX0RFVklDRToKICAgICAgICBzeiA9IDA7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCB8fCBscE91dEJ1ZmZlciAhPSBOVUxMIHx8IG5PdXRCdWZmZXJTaXplICE9IDApCiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1Jlc2V0QXVkaW8oZmQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSU9DVExfQ0RST01fR0VUX0NPTlRST0w6CiAgICAgICAgc3ogPSBzaXplb2YoQ0RST01fQVVESU9fQ09OVFJPTCk7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX0dldENvbnRyb2woZGV2LCAoQ0RST01fQVVESU9fQ09OVFJPTCopbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSU9DVExfQ0RST01fR0VUX0RSSVZFX0dFT01FVFJZOgogICAgICAgIHN6ID0gc2l6ZW9mKERJU0tfR0VPTUVUUlkpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9HZXREcml2ZUdlb21ldHJ5KGRldiwgZmQsIChESVNLX0dFT01FVFJZKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJT0NUTF9DRFJPTV9ESVNLX1RZUEU6CiAgICAgICAgc3ogPSBzaXplb2YoQ0RST01fRElTS19EQVRBKTsKCS8qIENEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOyAqLwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9HZXREaXNrRGF0YShkZXYsIGZkLCAoQ0RST01fRElTS19EQVRBKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgovKiBFUFAgICAgIGNhc2UgSU9DVExfQ0RST01fR0VUX0xBU1RfU0VTU0lPTjogKi8KCiAgICBjYXNlIElPQ1RMX0NEUk9NX1JFQURfUV9DSEFOTkVMOgogICAgICAgIHN6ID0gc2l6ZW9mKFNVQl9RX0NIQU5ORUxfREFUQSk7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgPT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplIDwgc2l6ZW9mKENEUk9NX1NVQl9RX0RBVEFfRk9STUFUKSkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUmVhZFFDaGFubmVsKGRldiwgZmQsIChjb25zdCBDRFJPTV9TVUJfUV9EQVRBX0ZPUk1BVCopbHBJbkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVUJfUV9DSEFOTkVMX0RBVEEqKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElPQ1RMX0NEUk9NX1JFQURfVE9DOgogICAgICAgIHN6ID0gc2l6ZW9mKENEUk9NX1RPQyk7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1JlYWRUT0MoZGV2LCBmZCwgKENEUk9NX1RPQyopbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwoKLyogRVBQICAgICBjYXNlIElPQ1RMX0NEUk9NX1JFQURfVE9DX0VYOiAqLwoKICAgIGNhc2UgSU9DVExfQ0RST01fUEFVU0VfQVVESU86CiAgICAgICAgc3ogPSAwOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwIHx8IGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUGF1c2VBdWRpbyhmZCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1BMQVlfQVVESU9fTVNGOgogICAgICAgIHN6ID0gMDsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobkluQnVmZmVyU2l6ZSA8IHNpemVvZihDRFJPTV9QTEFZX0FVRElPX01TRikpIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUGxheUF1ZGlvTVNGKGZkLCAoY29uc3QgQ0RST01fUExBWV9BVURJT19NU0YqKWxwSW5CdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9SRVNVTUVfQVVESU86CiAgICAgICAgc3ogPSAwOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwIHx8IGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUmVzdW1lQXVkaW8oZmQpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9TRUVLX0FVRElPX01TRjoKICAgICAgICBzeiA9IDA7CiAgICAgICAgaWYgKGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5JbkJ1ZmZlclNpemUgPCBzaXplb2YoQ0RST01fU0VFS19BVURJT19NU0YpKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1NlZWtBdWRpb01TRihkZXYsIGZkLCAoY29uc3QgQ0RST01fU0VFS19BVURJT19NU0YqKWxwSW5CdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9TVE9QX0FVRElPOgogICAgICAgIHN6ID0gMDsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOyAvKiBNYXliZSBpbnRlbnRpb24gaXMgdG8gY2hhbmdlIG1lZGlhICovCiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9TdG9wQXVkaW8oZmQpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9HRVRfVk9MVU1FOgogICAgICAgIHN6ID0gc2l6ZW9mKFZPTFVNRV9DT05UUk9MKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fR2V0Vm9sdW1lKGZkLCAoVk9MVU1FX0NPTlRST0wqKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fU0VUX1ZPTFVNRToKICAgICAgICBzeiA9IDA7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciA9PSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgPCBzaXplb2YoVk9MVU1FX0NPTlRST0wpIHx8IGxwT3V0QnVmZmVyICE9IE5VTEwpCiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1NldFZvbHVtZShmZCwgKGNvbnN0IFZPTFVNRV9DT05UUk9MKilscEluQnVmZmVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fUkFXX1JFQUQ6CiAgICAgICAgc3ogPSAwOwogICAgICAgIGlmIChuSW5CdWZmZXJTaXplIDwgc2l6ZW9mKFJBV19SRUFEX0lORk8pKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobHBPdXRCdWZmZXIgPT0gTlVMTCkgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9SYXdSZWFkKGZkLCAoY29uc3QgUkFXX1JFQURfSU5GTyopbHBJbkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE91dEJ1ZmZlciwgbk91dEJ1ZmZlclNpemUsICZzeik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX1NDU0lfR0VUX0FERFJFU1M6CiAgICAgICAgc3ogPSBzaXplb2YoU0NTSV9BRERSRVNTKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fR2V0QWRkcmVzcyhmZCwgKFNDU0lfQUREUkVTUyopbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9TQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1Q6CiAgICAgICAgc3ogPSBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0hfRElSRUNUKTsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgPT0gTlVMTCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc2l6ZW9mKFNDU0lfUEFTU19USFJPVUdIX0RJUkVDVCkpIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fU2NzaVBhc3NUaHJvdWdoRGlyZWN0KGZkLCAoUFNDU0lfUEFTU19USFJPVUdIX0RJUkVDVClscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX1NDU0lfUEFTU19USFJPVUdIOgogICAgICAgIHN6ID0gc2l6ZW9mKFNDU0lfUEFTU19USFJPVUdIKTsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgPT0gTlVMTCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc2l6ZW9mKFNDU0lfUEFTU19USFJPVUdIKSkgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9TY3NpUGFzc1Rocm91Z2goZmQsIChQU0NTSV9QQVNTX1RIUk9VR0gpbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9TQ1NJX0dFVF9DQVBBQklMSVRJRVM6CiAgICAgICAgc3ogPSBzaXplb2YoSU9fU0NTSV9DQVBBQklMSVRJRVMpOwogICAgICAgIGlmIChscE91dEJ1ZmZlciA9PSBOVUxMKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzaXplb2YoSU9fU0NTSV9DQVBBQklMSVRJRVMpKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1Njc2lHZXRDYXBzKChQSU9fU0NTSV9DQVBBQklMSVRJRVMpbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfU1RBUlRfU0VTU0lPTjoKICAgICAgICBzeiA9IHNpemVvZihEVkRfU0VTU0lPTl9JRCk7CiAgICAgICAgaWYgKGxwT3V0QnVmZmVyID09IE5VTEwpIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiYmVmb3JlIGluIDB4JTA4bHggb3V0IDB4JTA4bHhcbiIsKGxwSW5CdWZmZXIpPyooUERWRF9TRVNTSU9OX0lEKWxwSW5CdWZmZXI6MCwKICAgICAgICAgICAgICAgICAgKihQRFZEX1NFU1NJT05fSUQpbHBPdXRCdWZmZXIpOwogICAgICAgICAgICBzdGF0dXMgPSBEVkRfU3RhcnRTZXNzaW9uKGZkLCAoUERWRF9TRVNTSU9OX0lEKWxwSW5CdWZmZXIsIChQRFZEX1NFU1NJT05fSUQpbHBPdXRCdWZmZXIpOwogICAgICAgICAgICBUUkFDRSgiYmVmb3JlIGluIDB4JTA4bHggb3V0IDB4JTA4bHhcbiIsKGxwSW5CdWZmZXIpPyooUERWRF9TRVNTSU9OX0lEKWxwSW5CdWZmZXI6MCwKICAgICAgICAgICAgICAgICAgKihQRFZEX1NFU1NJT05fSUQpbHBPdXRCdWZmZXIpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfRFZEX0VORF9TRVNTSU9OOgogICAgICAgIHN6ID0gc2l6ZW9mKERWRF9TRVNTSU9OX0lEKTsKICAgICAgICBpZiAoKGxwSW5CdWZmZXIgPT0gTlVMTCkgfHwgIChuSW5CdWZmZXJTaXplIDwgc3opKXN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IERWRF9FbmRTZXNzaW9uKGZkLCAoUERWRF9TRVNTSU9OX0lEKWxwSW5CdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfU0VORF9LRVk6CiAgICAgICAgc3ogPSAwOwogICAgICAgIGlmICghbHBJbkJ1ZmZlciB8fAogICAgICAgICAgICAoKChQRFZEX0NPUFlfUFJPVEVDVF9LRVkpbHBJbkJ1ZmZlciktPktleUxlbmd0aCAhPSBuSW5CdWZmZXJTaXplKSkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJkb2luZyBEVkRfU2VuZEtleVxuIik7CiAgICAgICAgICAgIHN0YXR1cyA9IERWRF9TZW5kS2V5KGZkLCAoUERWRF9DT1BZX1BST1RFQ1RfS0VZKWxwSW5CdWZmZXIpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfRFZEX1JFQURfS0VZOgogICAgICAgIGlmICghbHBJbkJ1ZmZlciB8fAogICAgICAgICAgICAoKChQRFZEX0NPUFlfUFJPVEVDVF9LRVkpbHBJbkJ1ZmZlciktPktleUxlbmd0aCAhPSBuSW5CdWZmZXJTaXplKSkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKGxwSW5CdWZmZXIgIT1scE91dEJ1ZmZlcikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoImRvaW5nIERWRF9SRUFEX0tFWVxuIik7CiAgICAgICAgICAgIHN6ID0gKChQRFZEX0NPUFlfUFJPVEVDVF9LRVkpbHBJbkJ1ZmZlciktPktleUxlbmd0aDsKICAgICAgICAgICAgc3RhdHVzID0gRFZEX1JlYWRLZXkoZmQsIChQRFZEX0NPUFlfUFJPVEVDVF9LRVkpbHBJbkJ1ZmZlcik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfR0VUX1JFR0lPTjoKICAgICAgICBzeiA9IHNpemVvZihEVkRfUkVHSU9OKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIFRSQUNFKCJkb2luZyBEVkRfR2V0X1JFR0lPTlxuIik7CiAgICAgICAgc3RhdHVzID0gRFZEX0dldFJlZ2lvbihmZCwgKFBEVkRfUkVHSU9OKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfRFZEX1JFQURfU1RSVUNUVVJFOgogICAgICAgIHN6ID0gc2l6ZW9mKERWRF9MQVlFUl9ERVNDUklQVE9SKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciA9PSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gc2l6ZW9mKERWRF9SRUFEX1NUUlVDVFVSRSkpIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBUUkFDRSgiZG9pbmcgRFZEX1JFQURfU1RSVUNUVVJFXG4iKTsKICAgICAgICBzdGF0dXMgPSBEVkRfUmVhZFN0cnVjdHVyZShmZCwgKFBEVkRfUkVBRF9TVFJVQ1RVUkUpbHBJbkJ1ZmZlciwgKFBEVkRfTEFZRVJfREVTQ1JJUFRPUilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgSU9DVEwgJWx4ICh0eXBlPSVseCBhY2Nlc3M9JWx4IGZ1bmM9JWx4IG1ldGg9JWx4KVxuIiwgCiAgICAgICAgICAgICAgZHdJb0NvbnRyb2xDb2RlLCBkd0lvQ29udHJvbENvZGUgPj4gMTYsIChkd0lvQ29udHJvbENvZGUgPj4gMTQpICYgMywKICAgICAgICAgICAgICAoZHdJb0NvbnRyb2xDb2RlID4+IDIpICYgMHhGRkYsIGR3SW9Db250cm9sQ29kZSAmIDMpOwogICAgICAgIHN6ID0gMDsKICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICB3aW5lX3NlcnZlcl9yZWxlYXNlX2ZkKCBoRGV2aWNlLCBmZCApOwogZXJyb3I6CiAgICBwaW9zYi0+dS5TdGF0dXMgPSBzdGF0dXM7CiAgICBwaW9zYi0+SW5mb3JtYXRpb24gPSBzejsKICAgIGlmIChoRXZlbnQpIE50U2V0RXZlbnQoaEV2ZW50LCBOVUxMKTsKICAgIHJldHVybiBzdGF0dXM7Cn0K