LyoKICogc25tcF92YXJfcm91dGUuYyAtIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5hbWVkIHZhcmlhYmxlLgogKgogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglDb3B5cmlnaHQgMTk4OCwgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoJQ29weXJpZ2h0IDE5ODkJVEdWLCBJbmNvcnBvcmF0ZWQKCgkJICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgYW5kIFRHViBub3QgYmUgdXNlZAppbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCndpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KCkNNVSBBTkQgVEdWIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLApJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCkVWRU5UIFNIQUxMIENNVSBPUiBUR1YgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgpVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgpQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKLyoKICogYWRkaXRpb25zLCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIGZvciBMaW51eCBieSBFcmlrIFNjaG9lbmZlbGRlcgogKiAoc2Nob2VuZnJAaWJyLmNzLnR1LWJzLmRlKSAxOTk0LzE5OTUuCiAqIExpbnV4IGFkZGl0aW9ucyB0YWtlbiBmcm9tIENNVSB0byBVQ0Qgc3RhY2sgYnkgSmVubmlmZXIgQnJheSBvZiBPcmlnaW4KICogKGpicmF5QG9yaWdpbi1hdC5jby51aykgMTk5NwogKiBTdXBwb3J0IGZvciBzeXNjdGwoe0NUTF9ORVQsUEZfUk9VVEUsLi4uKSBieSBTaW1vbiBMZWluZW4KICogKHNpbW9uQHN3aXRjaC5jaCkgMTk5NwogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWZlYXR1cmVzLmg+CgojaW5jbHVkZSAicm91dGVfaGVhZGVycy5oIgojZGVmaW5lIENBQ0hFX1RJTUUgKDEyMCkgICAgICAgIC8qIFNlY29uZHMgKi8KCiNpZiAhZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKQoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgojaW5jbHVkZSA8bmV0LXNubXAvZGF0YV9hY2Nlc3MvaW50ZXJmYWNlLmg+CgojaW5jbHVkZSAiaXAuaCIKI2luY2x1ZGUgImtlcm5lbC5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic3RydWN0LmgiCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YoZ2V0X3JvdXRlcywgbGlibmV0c25tcG1pYnMpCgojaWZuZGVmICBNSU4KI2RlZmluZSAgTUlOKGEsYikgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2lmZGVmIGhwdXgxMQojaW5jbHVkZSA8c3lzL21pYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9taWJfa2Vybi5oPgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXggKi8KCmV4dGVybiBXcml0ZU1ldGhvZCB3cml0ZV9ydGU7CgojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQoKI2lmZGVmIFVTRV9TWVNDVExfUk9VVEVfRFVNUAoKc3RhdGljIHZvaWQgICAgIFJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpOwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKmFsbF9yb3V0ZXMgPSAwOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqYWxsX3JvdXRlc19lbmQ7CnN0YXRpYyBzaXplX3QgICBhbGxfcm91dGVzX3NpemU7CgpleHRlcm4gY29uc3Qgc3RydWN0IHNvY2thZGRyICpnZXRfYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpnZXRfaW5fYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKCi8qCiAqIHZhcl9pcFJvdXRlRW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgICAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICAgICAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgICAgICAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgICAgICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuICAgICAgIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QgIG91dCAgICAgLSBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHNldCB2YXJpYWJsZSwgb3RoZXJ3aXNlIDAKICovCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjEuMS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwogICAgc3RydWN0IHJ0X21zZ2hkciAqcnRwLCAqc2F2ZVJ0cCA9IDA7CiAgICByZWdpc3RlciBpbnQgICAgU2F2ZV9WYWxpZCwgcmVzdWx0OwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuID0gMCwgc2F2ZUV4YWN0ID0gMDsKICAgIHN0YXRpYyBvaWQgICAgICBzYXZlTmFtZVtNQVhfT0lEX0xFTl0sIEN1cnJlbnRbTUFYX09JRF9MRU5dOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgdV9jaGFyICAgICAgICAgKmFwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKCiAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsgIC8qIHdyaXRlX3J0ZTsgIFhYWDogIFNFVCBzdXBwb3J0IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgKi8KCiNpZiAwCiAgLyoqIAogICoqIHRoaXMgb3B0aW1pc2F0aW9uIGZhaWxzLCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJvdXRlIGF2YWlsLgogICoqIGl0IGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGJ1dCBiZXR0ZXIgbGVhdmUgaXQgb3V0IC4uLgogICoqLwojaWYgMAogICAgaWYgKHJ0c2l6ZSA8PSAxKQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwogICAgZWxzZQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KICAgICAgICAvKgogICAgICAgICAqICBPUFRJTUlaQVRJT046CiAgICAgICAgICoKICAgICAgICAgKiAgSWYgdGhlIG5hbWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG5hbWUsIHdpdGggdGhlIHBvc3NpYmxlCiAgICAgICAgICogIGV4Y2VwdGlvbiBvZiB0aGUgWzlddGggdG9rZW4sIHRoZW4gZG9uJ3QgcmVhZCB0aGUgcm91dGluZyB0YWJsZQogICAgICAgICAqCiAgICAgICAgICovCgogICAgaWYgKChzYXZlTmFtZUxlbiA9PSAqbGVuZ3RoKSAmJiAoc2F2ZUV4YWN0ID09IGV4YWN0KSkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBuYW1lWzldID0gMDsKICAgICAgICBTYXZlX1ZhbGlkID0KICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgc2F2ZU5hbWUsIHNhdmVOYW1lTGVuKSA9PSAwKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgIH0gZWxzZQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwoKICAgIGlmIChTYXZlX1ZhbGlkICYmIHNhdmVSdHApIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07IC8qIEZpeCB1cCAnbG93ZXN0JyBmb3VuZCBlbnRyeSAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICAgICAgcnRwID0gc2F2ZVJ0cDsKICAgIH0gZWxzZSB7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwogICAgICAgIC8qCiAgICAgICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAgICAgKi8KCiAgICAgICAgbWVtY3B5KChjaGFyICopIEN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgICAgICAoaW50KSAodnAtPm5hbWVsZW4pICogc2l6ZW9mKG9pZCkpOwoKI2lmIDAKICAgICAgICAvKgogICAgICAgICAqICBPbmx5IHJlbG9hZCBpZiB0aGlzIGlzIHRoZSBzdGFydCBvZiBhIHdpbGRjYXJkCiAgICAgICAgICovCiAgICAgICAgaWYgKCpsZW5ndGggPCAxNCkgewogICAgICAgICAgICBSb3V0ZV9TY2FuX1JlbG9hZCgpOwogICAgICAgIH0KI2Vsc2UKICAgICAgICBSb3V0ZV9TY2FuX1JlbG9hZCgpOwojZW5kaWYKICAgICAgICBmb3IgKGFwID0gYWxsX3JvdXRlczsgYXAgPCBhbGxfcm91dGVzX2VuZDsgYXAgKz0gcnRwLT5ydG1fbXNnbGVuKSB7CiAgICAgICAgICAgIHJ0cCA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGFwOwogICAgICAgICAgICBpZiAocnRwLT5ydG1fdHlwZSA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV92ZXJzaW9uICE9IFJUTV9WRVJTSU9OKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgInJvdXRpbmcgc29ja2V0IG1lc3NhZ2UgdmVyc2lvbiBtaXNtYXRjaCAoJWQgaW5zdGVhZCBvZiAlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV92ZXJzaW9uLCBSVE1fVkVSU0lPTik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocnRwLT5ydG1fdHlwZSAhPSBSVE1fR0VUKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgInJvdXRpbmcgc29ja2V0IHJldHVybmVkIG1lc3NhZ2Ugb3RoZXIgdGhhbiBHRVQgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX3R5cGUpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEocnRwLT5ydG1fYWRkcnMgJiBSVEFfRFNUKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgZ2V0X2luX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciAqKSAocnRwICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHAtPnJ0bV9hZGRycywgUlRBX0RTVCk7CiAgICAgICAgICAgIGlmIChjcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgICAgICBvcCA9IEN1cnJlbnQgKyAxMDsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKCiAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYXAgPj0gYWxsX3JvdXRlc19lbmQgfHwgcnRwLT5ydG1fdHlwZSA9PSAwKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAvKgogICAgICAgICAqICBTYXZlIGluIHRoZSAnY2FjaGUnCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIHNhdmVOYW1lLCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBTTk1QX01JTigqbGVuZ3RoLCBNQVhfT0lEX0xFTikgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAnXDAnOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlUnRwID0gcnRwOwogICAgICAgIC8qCiAgICAgICAgICogIFJldHVybiB0aGUgbmFtZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiNpZiAwCiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwoKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUFJPVVRFREVTVDoKICAgIAkqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZ2V0X2luX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciAqKSAocnRwICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fYWRkcnMsIFJUQV9EU1QpOwogICAgY2FzZSBJUFJPVVRFSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIHJ0cC0+cnRtX2luZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMxOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX1VQKSA/IDEgOiAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMzoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgIAkqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAJcmV0dXJuICh1X2NoYXIgKikgZ2V0X2luX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciAqKSAocnRwICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwLT5ydG1fYWRkcnMsIFJUQV9HQVRFV0FZKTsKICAgIGNhc2UgSVBST1VURVRZUEU6CiAgICAgICAgaWYgKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX1VQKSB7CiAgICAgICAgICAgIGlmIChydHAtPnJ0bV9mbGFncyAmIFJURl9HQVRFV0FZKSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgICAgICAvKiAgaW5kaXJlY3QoNCkgICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgICAgICAvKiAgZGlyZWN0KDMpICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiAgaW52YWxpZCgyKSAgKi8KICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURVBST1RPOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHJ0cC0+cnRtX2ZsYWdzICYgUlRGX0RZTkFNSUMpCiAgICAgICAgICAgID8gMTAgOiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfU1RBVElDKQogICAgICAgICAgICA/IDIgOiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfRFlOQU1JQykgPyA0IDogMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsgICAJICAgICAKICAgICAgICBpZiAocnRwLT5ydG1fZmxhZ3MgJiBSVEZfSE9TVCkgewogICAgICAgICAgICBhZGRyX3JldCA9IDB4MDAwMDAwMDE7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZ2V0X2luX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciAqKSAocnRwICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cC0+cnRtX2FkZHJzLCBSVEFfTkVUTUFTSyk7CiAgICAgICAgfQogICAgY2FzZSBJUFJPVVRFSU5GTzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pcFJvdXRlRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgVVNFX1NZU0NUTF9ST1VURV9EVU1QICovCgojaWZkZWYgaHB1eDExCnN0YXRpYyBpbnQgICAgICBydHNpemUgPSAwOwpzdGF0aWMgbWliX2lwUm91dGVFbnQgKnJ0ID0gKG1pYl9pcFJvdXRlRW50ICopIDA7CnN0YXRpYyB2b2lkICAgICBSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKTsKI2VsaWYgIWRlZmluZWQoc29sYXJpczIpCnN0YXRpYyBSVEVOVFJZICoqcnRoZWFkID0gTlVMTDsKc3RhdGljIGludCAgICAgIHJ0c2l6ZSA9IDAsIHJ0YWxsb2NhdGUgPSAwOwoKc3RhdGljIHZvaWQgICAgIFJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpOwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0dFVF9ST1VURVMKUlRFTlRSWSAqKm5ldHNubXBfZ2V0X3JvdXRlcyhzaXplX3QgKnNpemUpIHsKICAgIFJvdXRlX1NjYW5fUmVsb2FkKCk7CiAgICBpZiAoc2l6ZSkKICAgICAgICAqc2l6ZSA9IHJ0c2l6ZTsKICAgIHJldHVybiBydGhlYWQ7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfR0VUX1JPVVRFUyAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgZGVmaW5lZChocHV4MTEpKSAmJiBkZWZpbmVkKFJUSE9TVF9TWU1CT0wpICYmIGRlZmluZWQoUlRORVRfU1lNQk9MKQojZGVmaW5lIE5VTV9ST1VURV9TWU1CT0xTIDIKc3RhdGljIGNoYXIgICAgKnJvdXRlX3N5bWJvbHNbXSA9IHsKICAgIFJUSE9TVF9TWU1CT0wsCiAgICBSVE5FVF9TWU1CT0wKfTsKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFVTRV9TWVNDVExfUk9VVEVfRFVNUAoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBzb2xhcmlzMgogICAgaW5pdF9rZXJuZWxfc3Vub3M1KCk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApSb3V0ZV9TY2FuX1JlbG9hZCh2b2lkKQp7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbmFtZVtdID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgMCwgTkVUX1JUX0RVTVAsIDAgfTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsKENUTF9ORVQsUEZfUk9VVEUsMCwwLE5FVF9SVF9EVU1QLDApXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFsbF9yb3V0ZXMgPT0gMCB8fCBhbGxfcm91dGVzX3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChhbGxfcm91dGVzICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoYWxsX3JvdXRlcyk7CiAgICAgICAgICAgICAgICBhbGxfcm91dGVzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGFsbF9yb3V0ZXMgPSBtYWxsb2Moc2l6ZSkpID09IDApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRlIHRhYmxlXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGxfcm91dGVzX3NpemUgPSBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBhbGxfcm91dGVzX3NpemU7CiAgICAgICAgfQogICAgICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksCiAgICAgICAgICAgICAgICAgICBhbGxfcm91dGVzLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgInN5c2N0bChDVExfTkVULFBGX1JPVVRFLDAsMCxORVRfUlRfRFVNUCwwKVxuIik7CiAgICAgICAgfQogICAgICAgIGFsbF9yb3V0ZXNfZW5kID0gYWxsX3JvdXRlcyArIHNpemU7CiAgICB9Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IFVTRV9TWVNDVExfUk9VVEVfRFVNUCAqLwoKdm9pZAppbml0X3Zhcl9yb3V0ZSh2b2lkKQp7CiNpZmRlZiBSVFRBQkxFU19TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRUQUJMRVNfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVEhBU0hTSVpFX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgojaWZkZWYgUlRIT1NUX1NZTUJPTAogICAgYXV0b19ubGlzdChSVEhPU1RfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBSVE5FVF9TWU1CT0wKICAgIGF1dG9fbmxpc3QoUlRORVRfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCn0KCiNpZm5kZWYgc29sYXJpczIKCiNpZiBORUVEX0tMR0VUU0EKc3RhdGljIHVuaW9uIHsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CiAgICB1X3Nob3J0ICAgICAgICAgZGF0YVsxMjhdOwp9IGtsZ2V0c2F0bXA7CgpzdHJ1Y3Qgc29ja2FkZHJfaW4gKgprbGdldHNhKHN0cnVjdCBzb2NrYWRkcl9pbiAqZHN0KQp7CiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChkc3QsIChjaGFyICopICZrbGdldHNhdG1wLnNpbiwgc2l6ZW9mIGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChrbGdldHNhdG1wLnNpbi5zaW5fbGVuID4gc2l6ZW9mKGtsZ2V0c2F0bXAuc2luKSkgewogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGRzdCwgKGNoYXIgKikgJmtsZ2V0c2F0bXAuc2luLCBrbGdldHNhdG1wLnNpbi5zaW5fbGVuKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoJmtsZ2V0c2F0bXAuc2luKTsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2lwUm91dGVFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXg7CiAgICBzdGF0aWMgc2l6ZV90ICAgc2F2ZU5hbWVMZW4gPSAwOwogICAgc3RhdGljIGludCAgICAgIHNhdmVFeGFjdCA9IDAsIHNhdmVSdEluZGV4ID0gMDsKICAgIHN0YXRpYyBvaWQgICAgICBzYXZlTmFtZVtNQVhfT0lEX0xFTl0sIEN1cnJlbnRbTUFYX09JRF9MRU5dOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKI2lmIE5FRURfS0xHRVRTQQogICAgc3RydWN0IHNvY2thZGRyX2luICpzYTsKI2VuZGlmCiNpZiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IGlmbmV0ICAgIHJ0X2lmbmV0OwogICAgc3RydWN0IGluX2lmYWRkciBydF9pZm5ldGFkZHI7CiNlbmRpZgoKICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOyAgLyogd3JpdGVfcnRlOyAgWFhYOiAgU0VUIHN1cHBvcnQgbm90IHJlYWxseSBpbXBsZW1lbnRlZCAqLwoKICAgIC8qKiAKICAgICAqKiB0aGlzIG9wdGltaXNhdGlvbiBmYWlscywgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3V0ZSBhdmFpbC4KICAgICAqKiBpdCBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBidXQgYmV0dGVyIGxlYXZlIGl0IG91dCAuLi4KICAgICAqKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICBzYXZlTmFtZUxlbiA9IDA7CiNlbmRpZgogICAgaWYgKHJ0c2l6ZSA8PSAxKQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwogICAgZWxzZQogICAgICAgIC8qCiAgICAgICAgICogIE9QVElNSVpBVElPTjoKICAgICAgICAgKgogICAgICAgICAqICBJZiB0aGUgbmFtZSB3YXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgbmFtZSwgd2l0aCB0aGUgcG9zc2libGUKICAgICAgICAgKiAgZXhjZXB0aW9uIG9mIHRoZSBbOV10aCB0b2tlbiwgdGhlbiBkb24ndCByZWFkIHRoZSByb3V0aW5nIHRhYmxlCiAgICAgICAgICoKICAgICAgICAgKi8KCiAgICBpZiAoKHNhdmVOYW1lTGVuID09ICpsZW5ndGgpICYmIChzYXZlRXhhY3QgPT0gZXhhY3QpKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG5hbWVbOV0gPSAwOwogICAgICAgIFNhdmVfVmFsaWQgPQogICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBzYXZlTmFtZSwgc2F2ZU5hbWVMZW4pID09IDApOwogICAgICAgIG5hbWVbOV0gPSB0ZW1wOwogICAgfSBlbHNlCiAgICAgICAgU2F2ZV9WYWxpZCA9IDA7CgogICAgaWYgKFNhdmVfVmFsaWQpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgdGVtcCA9IG5hbWVbOV07IC8qIEZpeCB1cCAnbG93ZXN0JyBmb3VuZCBlbnRyeSAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICAgICAgUnRJbmRleCA9IHNhdmVSdEluZGV4OwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgICAgICovCgogICAgICAgIG1lbWNweSgoY2hhciAqKSBDdXJyZW50LCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAgICAgKGludCkgKHZwLT5uYW1lbGVuKSAqIHNpemVvZihvaWQpKTsKCiNpZiAwCiAgICAgICAgLyoKICAgICAgICAgKiAgT25seSByZWxvYWQgaWYgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSB3aWxkY2FyZAogICAgICAgICAqLwogICAgICAgIGlmICgqbGVuZ3RoIDwgMTQpIHsKICAgICAgICAgICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKICAgICAgICB9CiNlbHNlCiAgICAgICAgUm91dGVfU2Nhbl9SZWxvYWQoKTsKI2VuZGlmCiAgICAgICAgZm9yIChSdEluZGV4ID0gMDsgUnRJbmRleCA8IHJ0c2l6ZTsgUnRJbmRleCsrKSB7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpOwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiAoc2EtPnNpbl9hZGRyLnNfYWRkcik7CiNlbGlmIGRlZmluZWQoaHB1eDExKQogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBydFtSdEluZGV4XS5EZXN0OwojZWxzZQogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpKS0+CiAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKI2VuZGlmCiAgICAgICAgICAgIG9wID0gQ3VycmVudCArIDEwOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChSdEluZGV4ID49IHJ0c2l6ZSkKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAvKgogICAgICAgICAqICBTYXZlIGluIHRoZSAnY2FjaGUnCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIHNhdmVOYW1lLCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBTTk1QX01JTigqbGVuZ3RoLCBNQVhfT0lEX0xFTikgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgc2F2ZU5hbWVbOV0gPSAwOwogICAgICAgIHNhdmVOYW1lTGVuID0gKmxlbmd0aDsKICAgICAgICBzYXZlRXhhY3QgPSBleGFjdDsKICAgICAgICBzYXZlUnRJbmRleCA9IFJ0SW5kZXg7CiAgICAgICAgLyoKICAgICAgICAgKiAgUmV0dXJuIHRoZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIEN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpsZW5ndGggPSAxNDsKICAgIH0KCiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBST1VURURFU1Q6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWYgTkVFRF9LTEdFVFNBCiAgICAgICAgc2EgPSBrbGdldHNhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgcnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBhZGRyX3JldCA9IHJ0W1J0SW5kZXhdLkRlc3Q7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2Vsc2UKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0X2RzdCktPnNpbl9hZGRyLnNfYWRkcjsKI2VuZGlmCiAgICBjYXNlIElQUk9VVEVJRklOREVYOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5JZkluZGV4OwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgcnRoZWFkW1J0SW5kZXhdLT5ydF91bml0OwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljMTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IChydGhlYWRbUnRJbmRleF0tPnJ0X2ZsYWdzICYgUlRGX0dBVEVXQVkpID8gMSA6IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMyOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5NZXRyaWMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbGlmIGRlZmluZWQoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzM6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IHJ0W1J0SW5kZXhdLk1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uTWV0cmljNDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTKQogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiNpZiBORUVEX0tMR0VUU0EKICAgICAgICBzYSA9IGtsZ2V0c2EoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBydGhlYWRbUnRJbmRleF0tPnJ0X2dhdGV3YXkpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKHNhLT5zaW5fYWRkci5zX2FkZHIpOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBhZGRyX3JldCA9IHJ0W1J0SW5kZXhdLk5leHRIb3A7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2Vsc2UKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0X2dhdGV3YXkpLT5zaW5fYWRkci5zX2FkZHI7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKmJzZCAqLwogICAgY2FzZSBJUFJPVVRFVFlQRToKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uVHlwZTsKI2Vsc2UKICAgICAgICBpZiAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9VUCkgewogICAgICAgICAgICBpZiAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9HQVRFV0FZKSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgICAgICAvKiAgaW5kaXJlY3QoNCkgICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgICAgICAvKiAgZGlyZWN0KDMpICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiAgaW52YWxpZCgyKSAgKi8KICAgICAgICB9CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVQUk9UTzoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gcnRbUnRJbmRleF0uUHJvdG87CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnRoZWFkW1J0SW5kZXhdLT5ydF9mbGFncyAmIFJURl9EWU5BTUlDKSA/IDQgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBydFtSdEluZGV4XS5BZ2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmIE5FRURfS0xHRVRTQQogICAgICAgIC8qCiAgICAgICAgICogWFhYIC0gQWxtb3N0IGNlcnRhaW5seSBub3QgcmlnaHQKICAgICAgICAgKiBidXQgSSBkb24ndCBoYXZlIGEgc3VpdGFibGUgc3lzdGVtIHRvIHRlc3QgdGhpcyBvbiAKICAgICAgICAgKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGFkZHJfcmV0ID0gMDsKI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgYWRkcl9yZXQgPSBydFtSdEluZGV4XS5NYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIU5FRURfS0xHRVRTQSAmJiAhaHB1eDExICovCiAgICAgICAgaWYgKCgoc3RydWN0IHNvY2thZGRyX2luICopICZydGhlYWRbUnRJbmRleF0tPnJ0X2RzdCktPnNpbl9hZGRyLgogICAgICAgICAgICBzX2FkZHIgPT0gMCkKICAgICAgICAgICAgYWRkcl9yZXQgPSAwOyAgICAvKiBEZWZhdWx0IHJvdXRlICovCiAgICAgICAgZWxzZSB7CiNpZm5kZWYgbGludXgKICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnRoZWFkW1J0SW5kZXhdLT5ydF9pZnAsCiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnJ0X2lmbmV0LCBzaXplb2YocnRfaWZuZXQpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAocnRfaWZuZXQuaWZfYWRkcmxpc3QsCiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnJ0X2lmbmV0YWRkciwgc2l6ZW9mKHJ0X2lmbmV0YWRkcikpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWRkcl9yZXQgPSBydF9pZm5ldGFkZHIuaWFfc3VibmV0bWFzazsKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwogICAgICAgICAgICBjcCA9ICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9kc3QpKS0+CiAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJgogICAgICAgICAgICAgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopICYocnRoZWFkW1J0SW5kZXhdLT5ydF9nZW5tYXNrKSktPgogICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVFRF9LTEdFVFNBICovCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURUlORk86CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBSb3V0ZUVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCnN0YXRpYyBpbnQKSVBfQ21wX1JvdXRlKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBtaWIyX2lwUm91dGVFbnRyeV90ICpFcCA9IGVwLCAqQWRkciA9IGFkZHI7CgogICAgaWYgKChFcC0+aXBSb3V0ZURlc3QgPT0gQWRkci0+aXBSb3V0ZURlc3QpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlTmV4dEhvcCA9PSBBZGRyLT5pcFJvdXRlTmV4dEhvcCkgJiYKICAgICAgICAoRXAtPmlwUm91dGVUeXBlID09IEFkZHItPmlwUm91dGVUeXBlKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZVByb3RvID09IEFkZHItPmlwUm91dGVQcm90bykgJiYKICAgICAgICAoRXAtPmlwUm91dGVNYXNrID09IEFkZHItPmlwUm91dGVNYXNrKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfbWF4X2ZyYWcgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfbWF4X2ZyYWcpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9ydHQgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfcnR0KSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfcmVmID09IEFkZHItPmlwUm91dGVJbmZvLnJlX3JlZikgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX2ZyYWdfZmxhZyA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9mcmFnX2ZsYWcpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9zcmNfYWRkciA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9zcmNfYWRkcikgJiYKICAgICAgICAoRXAtPmlwUm91dGVJbmZvLnJlX2lyZV90eXBlID09IEFkZHItPmlwUm91dGVJbmZvLnJlX2lyZV90eXBlKSAmJgogICAgICAgIChFcC0+aXBSb3V0ZUluZm8ucmVfb2Jwa3QgPT0gQWRkci0+aXBSb3V0ZUluZm8ucmVfb2Jwa3QpICYmCiAgICAgICAgKEVwLT5pcFJvdXRlSW5mby5yZV9pYnBrdCA9PSBBZGRyLT5pcFJvdXRlSW5mby5yZV9pYnBrdCkKICAgICAgICApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiBOb3QgZm91bmQgKi8KfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjEuMS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwojZGVmaW5lIElQX1JPVVRFTkFNRV9MRU5HVEgJMTQKI2RlZmluZQlJUF9ST1VURUFERFJfT0ZGCTEwCiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFtJUF9ST1VURU5BTUVfTEVOR1RIXSwKICAgICAgICBsb3dlc3RbSVBfUk9VVEVOQU1FX0xFTkdUSF07CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBvaWQgICAgICAgICAgICAqb3A7CiAgICBtaWIyX2lwUm91dGVFbnRyeV90IExvd2VudHJ5LCBOZXh0ZW50cnksIGVudHJ5OwogICAgaW50ICAgICAgICAgICAgIEZvdW5kID0gMDsKICAgIHJlcV9lICAgICAgICAgICByZXFfdHlwZTsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CgogICAgKndyaXRlX21ldGhvZCA9IE5VTEw7ICAvKiB3cml0ZV9ydGU7ICBYWFg6ICBTRVQgc3VwcG9ydCBub3QgcmVhbGx5IGltcGxlbWVudGVkICovCgogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KCiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgaWYgKCpsZW5ndGggPT0gSVBfUk9VVEVOQU1FX0xFTkdUSCkgLyogQXNzdW1lIHRoYXQgdGhlIGlucHV0IG5hbWUgaXMgdGhlIGxvd2VzdCAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIG5hbWUsCiAgICAgICAgICAgICAgIElQX1JPVVRFTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICBlbHNlIHsKICAgICAgICBuYW1lW0lQX1JPVVRFQUREUl9PRkZdID0gKG9pZCkgLSAxOyAgICAgLyogR3JoaGg6IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBjb21wYXJpc29uIDotKCAqLwoJbG93ZXN0WzBdID0gMHhmZjsKICAgIH0KICAgIGZvciAoTmV4dGVudHJ5LmlwUm91dGVEZXN0ID0gKHVfbG9uZykgLSAyLCByZXFfdHlwZSA9IEdFVF9GSVJTVDs7CiAgICAgICAgIE5leHRlbnRyeSA9IGVudHJ5LCByZXFfdHlwZSA9IEdFVF9ORVhUKSB7CiAgICAgICAgaWYgKGdldE1pYnN0YXQoTUlCX0lQX1JPVVRFLCAmZW50cnksIHNpemVvZihtaWIyX2lwUm91dGVFbnRyeV90KSwKICAgICAgICAgICAgICAgICAgICAgICByZXFfdHlwZSwgJklQX0NtcF9Sb3V0ZSwgJk5leHRlbnRyeSkgIT0gMCkKICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBIQVZFX0RFRklORURfSVJFX0NBQ0hFCiAgICAgICAgaWYoZW50cnkuaXBSb3V0ZUluZm8ucmVfaXJlX3R5cGUmSVJFX0NBQ0hFKQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmIC8qIEhBVkVfREVGSU5FRF9JUkVfQ0FDSEUgKi8KICAgICAgICBDT1BZX0lQQUREUihjcCwgKHVfY2hhciAqKSAmIGVudHJ5LmlwUm91dGVEZXN0LCBvcCwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICsgSVBfUk9VVEVBRERSX09GRik7CiAgICAgICAgaWYgKGV4YWN0KSB7CiAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAoY3VycmVudCwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX1JPVVRFTkFNRV9MRU5HVEgsIG5hbWUsICpsZW5ndGgpID4gMCkKICAgICAgICAgICAgICAgICYmICgoTmV4dGVudHJ5LmlwUm91dGVEZXN0ID09ICh1X2xvbmcpIC0gMikKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9ST1VURU5BTUVfTEVOR1RILCBsb3dlc3QsCiAgICAgICAgICAgICAgICAgICAgICBJUF9ST1VURU5BTUVfTEVOR1RIKSA8IDApCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgICAgICAobmFtZSwgSVBfUk9VVEVOQU1FX0xFTkdUSCwgbG93ZXN0LAogICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCkgPT0gMCkpKSB7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0IGFuZCBjbG9zZXIgdG8gaW5wdXQgdGhhbgogICAgICAgICAgICAgICAgICogKiBwcmV2aW91cyBsb3dlc3QsIGFuZCBpcyBub3QgZXF1YWwgdG8gaXQsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IiBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd2VudHJ5ID0gZW50cnk7CiAgICAgICAgICAgICAgICBGb3VuZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKEZvdW5kID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBsb3dlc3QsCiAgICAgICAgICAgSVBfUk9VVEVOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSBJUF9ST1VURU5BTUVfTEVOR1RIOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQUk9VVEVERVNUOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd2VudHJ5LmlwUm91dGVEZXN0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgojaWZkZWYgTkVUU05NUF9JTkNMVURFX0lGVEFCTEVfUkVXUklURVMKICAgICAgICBMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2J5dGVzW0xvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgICBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfaW5kZXhfZmluZCgKICAgICAgICAgICAgICAgIExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fYnl0ZXMpOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShMb3dlbnRyeS5pcFJvdXRlSWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvd2VudHJ5LmlwUm91dGVJZkluZGV4Lm9fbGVuZ3RoKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzE6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVNZXRyaWMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZU1ldHJpYzM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzQ6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcFJvdXRlTWV0cmljNDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcFJvdXRlTmV4dEhvcDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVQUk9UTzoKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwUm91dGVQcm90bzsKICAgICAgICBpZiAobG9uZ19yZXR1cm4gPT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBSb3V0ZUFnZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcFJvdXRlTWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwUm91dGVFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH07CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAtIHZhcl9JUHJvdXRlICovCgojaWZuZGVmIHNvbGFyaXMyCnN0YXRpYyBpbnQgICAgICBxc29ydF9jb21wYXJlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKI2VuZGlmCgojaWYgZGVmaW5lZChSVEVOVFJZXzRfNCkgfHwgZGVmaW5lZChSVEVOVFJZX1JUX05FWFQpIHx8IGRlZmluZWQgKGhwdXgxMSkKCiNpZiBkZWZpbmVkKFJURU5UUllfNF80KSAmJiAhZGVmaW5lZChocHV4MTEpCnZvaWQKbG9hZF9ydGVudHJpZXMoc3RydWN0IHJhZGl4X25vZGUgKnB0KQp7CiAgICBzdHJ1Y3QgcmFkaXhfbm9kZSBub2RlOwogICAgUlRFTlRSWSAgICAgICAgIHJ0OwogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMTZdLCB0ZW1wWzE2XTsKI2lmICFIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojZW5kaWYKCiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJm5vZGUsIHNpemVvZihzdHJ1Y3QgcmFkaXhfbm9kZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChub2RlLnJuX2IgPj0gMCkgewogICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fcik7CiAgICAgICAgbG9hZF9ydGVudHJpZXMobm9kZS5ybl9sKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG5vZGUucm5fZmxhZ3MgJiBSTkZfUk9PVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb290IG5vZGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobm9kZS5ybl9kdXBlZGtleSkKICAgICAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fZHVwZWRrZXkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogZ2V0IHRoZSByb3V0ZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChwdCwgKGNoYXIgKikgJnJ0LCBzaXplb2YoUlRFTlRSWSkpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJ0LnJ0X2lmcCAhPSAwKSB7CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LnJ0X2lmcCwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YoaWZuZXQpKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQogICAgICAgICAgICBzdHJsY3B5KG5hbWUsIGlmbmV0LmlmX3huYW1lLCBzaXplb2YobmFtZSkpOwojZWxzZQogICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl94bmFtZSwgbmFtZSwgc2l6ZW9mIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgIG5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOwojZWxzZQojaWZkZWYgTkVUU05NUF9GRUFUVVJFX0NIRUNLSU4KICAgICAgICAgICAgLyogdGhpcyBleGlzdHMgaGVyZSBqdXN0IHNvIHdlIGRvbid0IGNvcHkgaWZkZWYgbG9naWMgZWxzZXdoZXJlICovCiAgICAgICAgICAgIG5ldHNubXBfZmVhdHVyZV9yZXF1aXJlKHN0cmluZ19hcHBlbmRfaW50KTsKI2VuZGlmCiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIG5hbWUsIHNpemVvZiBuYW1lKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOwogICAgICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnXDAnKTsKICAgICAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKI2lmZGVmIE5FVFNOTVBfRkVBVFVSRV9DSEVDS0lOCiAgICAgICAgICAgIG5ldHNubXBfZmVhdHVyZV9yZXF1aXJlKGludGVyZmFjZV9sZWdhY3kpCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfQ0hFQ0tJTiAqLwogICAgICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgICAgIHJ0LnJ0X3VuaXQgPSAwOwogICAgICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dAogICAgICAgICAgICAgICAgICAgKChzaG9ydCAqKSAmKHJ0LnJ0X3VuaXQpLCB0ZW1wLCBOVUxMLCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHRlbXApID09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNpZiBDSEVDS19SVF9GTEFHUwogICAgICAgIGlmICgoKHJ0LnJ0X2ZsYWdzICYgUlRGX0NMT05JTkcpICE9IFJURl9DTE9OSU5HKQogICAgICAgICAgICAmJiAoKHJ0LnJ0X2ZsYWdzICYgUlRGX0xMSU5GTykgIT0gUlRGX0xMSU5GTykpIHsKI2VuZGlmCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNoZWNrIGZvciBzcGFjZSBhbmQgbWFsbG9jIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHJ0c2l6ZSA+PSBydGFsbG9jYXRlKSB7CiAgICAgICAgICAgICAgICBydGhlYWQgPQogICAgICAgICAgICAgICAgICAgIChSVEVOVFJZICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcnRhbGxvY2F0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZydGhlYWRbcnRhbGxvY2F0ZV0sICgwKSwKICAgICAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKFJURU5UUlkgKikpOwoKICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPSAoUlRFTlRSWSAqKSBtYWxsb2Moc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogICAgICBBZGQgdGhpcyB0byB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgJnJ0LCBzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICBydHNpemUrKzsKI2lmIENIRUNLX1JUX0ZMQUdTCiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgaWYgKG5vZGUucm5fZHVwZWRrZXkpCiAgICAgICAgICAgIGxvYWRfcnRlbnRyaWVzKG5vZGUucm5fZHVwZWRrZXkpOwogICAgfQp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlRFTlRSWV80XzQgJiYgIWhwdXgxMSAqLwoKc3RhdGljIHZvaWQKUm91dGVfU2Nhbl9SZWxvYWQodm9pZCkKewojaWZkZWYgaHB1eDExCgogICAgaW50ICAgICAgICAgICAgIGZkOwogICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICBpbnQgICAgICAgICAgICAgdmFsOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmIChydCkKICAgICAgICBmcmVlKHJ0KTsKICAgIHJ0ID0gKG1pYl9pcFJvdXRlRW50ICopIDA7CiAgICBydHNpemUgPSAwOwoKICAgIGlmICgoZmQgPSBvcGVuX21pYigiL2Rldi9pcCIsIE9fUkRPTkxZLCAwLCBOTV9BU1lOQ19PRkYpKSA+PSAwKSB7CiAgICAgICAgcC5vYmppZCA9IElEX2lwUm91dGVOdW1FbnQ7CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIHJ0c2l6ZSA9IHZhbDsKCiAgICAgICAgaWYgKHJ0c2l6ZSA+IDApIHsKICAgICAgICAgICAgdWxlbiA9ICh1bnNpZ25lZCkgcnRzaXplICpzaXplb2YobWliX2lwUm91dGVFbnQpOwogICAgICAgICAgICBydCA9IChtaWJfaXBSb3V0ZUVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF9pcFJvdXRlVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgcnQ7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkKICAgICAgICAgICAgICAgIHJ0c2l6ZSA9IDA7CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0WzBdKSwKI2lmZGVmIF9fU1REQ19fCiAgICAgICAgICAoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHFzb3J0X2NvbXBhcmUKI2Vsc2UKICAgICAgICAgIHFzb3J0X2NvbXBhcmUKI2VuZGlmCiAgICAgICAgKTsKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCiNpZiBkZWZpbmVkKFJURU5UUllfNF80KQogICAgc3RydWN0IHJhZGl4X25vZGVfaGVhZCBoZWFkLCAqcnRfdGFibGVbQUZfTUFYICsgMV07CiAgICBpbnQgICAgICAgICAgICAgaTsKI2Vsc2UKICAgIFJURU5UUlkgICAgICAgKipyb3V0ZWhhc2gsIG1iOwogICAgcmVnaXN0ZXIgUlRFTlRSWSAqbTsKICAgIFJURU5UUlkgICAgICAgICpydDsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIGludCAgICAgICAgICAgICBpLCB0YWJsZTsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XSwgdGVtcFsxNl07CiAgICBpbnQgICAgICAgICAgICAgaGFzaHNpemU7CiNlbmRpZgogICAgc3RhdGljIHRpbWVfdCAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQ7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwoKICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jaygmbm93KTsKICAgIGlmIChUaW1lX09mX0xhc3RfUmVsb2FkICsgQ0FDSEVfVElNRSA+IG5vdy50dl9zZWMpCiAgICAgICAgcmV0dXJuOwogICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CgogICAgLyoKICAgICAqICogIE1ha2VzIHN1cmUgd2UgaGF2ZSBTT01FIHNwYWNlIGFsbG9jYXRlZCBmb3IgbmV3IHJvdXRpbmcgZW50cmllcwogICAgICovCiAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgIHJ0aGVhZCA9IChSVEVOVFJZICoqKSBtYWxsb2MoMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSB0YWJsZSBtYWxsb2MgZmFpbFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KChjaGFyICopIHJ0aGVhZCwgKDApLCAxMDAgKiBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgcnRhbGxvY2F0ZSA9IDEwMDsKICAgIH0KCiAgICAvKgogICAgICogcmVzZXQgdGhlIHJvdXRpbmcgdGFibGUgc2l6ZSB0byB6ZXJvIC0tIHdhcyBhIENNVSBtZW1vcnkgbGVhayAKICAgICAqLwogICAgcnRzaXplID0gMDsKCiNpZmRlZiBSVEVOVFJZXzRfNAogICAgLyoKICAgICAqIHJ0ZW50cnkgaXMgYSBCU0QgNC40IGNvbXBhdCAKICAgICAqLwoKI2lmICFkZWZpbmVkKEFGX1VOU1BFQykKI2RlZmluZSBBRl9VTlNQRUMgQUZfSU5FVAojZW5kaWYKCiAgICBhdXRvX25saXN0KFJUVEFCTEVTX1NZTUJPTCwgKGNoYXIgKikgcnRfdGFibGUsIHNpemVvZihydF90YWJsZSkpOwogICAgZm9yIChpID0gMDsgaSA8PSBBRl9NQVg7IGkrKykgewogICAgICAgIGlmIChydF90YWJsZVtpXSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoTkVUU05NUF9LTE9PS1VQKHJ0X3RhYmxlW2ldLCAoY2hhciAqKSAmaGVhZCwgc2l6ZW9mKGhlYWQpKSkgewogICAgICAgICAgICBsb2FkX3J0ZW50cmllcyhoZWFkLnJuaF90cmVldG9wKTsKICAgICAgICB9CiAgICB9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJ0ZW50cnkgaXMgYSBCU0QgNC4zIGNvbXBhdCAqLwojaWZkZWYgTkVUU05NUF9GRUFUVVJFX0NIRUNLSU4KICAgIC8qIHRoaXMgZXhpc3RzIGhlcmUganVzdCBzbyB3ZSBkb24ndCBjb3B5IGlmZGVmIGxvZ2ljIGVsc2V3aGVyZSAqLwogICAgbmV0c25tcF9mZWF0dXJlX3JlcXVpcmUoc3RyaW5nX2FwcGVuZF9pbnQpOwogICAgbmV0c25tcF9mZWF0dXJlX3JlcXVpcmUoaW50ZXJmYWNlX2xlZ2FjeSkKI2VuZGlmCiAgICBmb3IgKHRhYmxlID0gMDsgdGFibGUgPCBOVU1fUk9VVEVfU1lNQk9MUzsgdGFibGUrKykgewogICAgICAgIGF1dG9fbmxpc3QoUlRIQVNIU0laRV9TWU1CT0wsIChjaGFyICopICZoYXNoc2l6ZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoc2l6ZSkpOwogICAgICAgIHJvdXRlaGFzaCA9IChSVEVOVFJZICoqKSBtYWxsb2MoaGFzaHNpemUgKiBzaXplb2Yoc3RydWN0IG1idWYgKikpOwogICAgICAgIGF1dG9fbmxpc3Qocm91dGVfc3ltYm9sc1t0YWJsZV0sIChjaGFyICopIHJvdXRlaGFzaCwKICAgICAgICAgICAgICAgICAgIGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGFzaHNpemU7IGkrKykgewogICAgICAgICAgICBpZiAocm91dGVoYXNoW2ldID09IDApCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgbSA9IHJvdXRlaGFzaFtpXTsKICAgICAgICAgICAgd2hpbGUgKG0pIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgICAgIERpZyB0aGUgcm91dGUgb3V0IG9mIHRoZSBrZXJuZWwuLi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobSwgKGNoYXIgKikgJm1iLCBzaXplb2YobWIpKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtID0gbWIucnRfbmV4dDsKCiAgICAgICAgICAgICAgICBydCA9ICZtYjsKICAgICAgICAgICAgICAgIGlmIChydC0+cnRfaWZwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChydC0+cnRfaWZwLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZihpZm5ldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCBuYW1lLCAxNikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hbWVbMTVdID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnXDAnKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CgogICAgICAgICAgICAgICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNob3J0ICopICZydC0+cnRfdW5pdCwgdGVtcCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCB0ZW1wKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICAgICAgQWxsb2NhdGUgYSBibG9jayB0byBob2xkIGl0IGFuZCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICAgICAgICAgIHJ0aGVhZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIChSVEVOVFJZICoqKSByZWFsbG9jKChjaGFyICopIHJ0aGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlRFTlRSWSAqKSk7CiAgICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZydGhlYWRbcnRhbGxvY2F0ZV0sICgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqIHNpemVvZihSVEVOVFJZICopKTsKCiAgICAgICAgICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFydGhlYWRbcnRzaXplXSkKICAgICAgICAgICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9IChSVEVOVFJZICopIG1hbGxvYyhzaXplb2YoUlRFTlRSWSkpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICAgICAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIHJ0c2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUocm91dGVoYXNoKTsKICAgIH0KI2VuZGlmCiAgICAvKgogICAgICogIFNvcnQgaXQhCiAgICAgKi8KICAgIHFzb3J0KChjaGFyICopIHJ0aGVhZCwgcnRzaXplLCBzaXplb2YocnRoZWFkWzBdKSwKI2lmZGVmIF9fU1REQ19fCiAgICAgICAgICAoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHFzb3J0X2NvbXBhcmUKI2Vsc2UKICAgICAgICAgIHFzb3J0X2NvbXBhcmUKI2VuZGlmCiAgICAgICAgKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KfQoKI2Vsc2UKCiNpZiBIQVZFX1NZU19NQlVGX0gKbmV0c25tcF9mZWF0dXJlX3JlcXVpcmUoc3RyaW5nX2FwcGVuZF9pbnQpCm5ldHNubXBfZmVhdHVyZV9yZXF1aXJlKGludGVyZmFjZV9sZWdhY3kpCnN0YXRpYyB2b2lkClJvdXRlX1NjYW5fUmVsb2FkKHZvaWQpCnsKICAgIHN0cnVjdCBtYnVmICAgKipyb3V0ZWhhc2gsIG1iOwogICAgcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQ7CiAgICBSVEVOVFJZICAgICAgICAqcnQ7CiAgICBpbnQgICAgICAgICAgICAgaSwgdGFibGU7CiAgICByZWdpc3RlciBjaGFyICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgbmFtZVsxNl0sIHRlbXBbMTZdOwogICAgc3RhdGljIHRpbWVfdCAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQ7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwogICAgaW50ICAgICAgICAgICAgIGhhc2hzaXplOwoKICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jaygmbm93KTsKICAgIGlmIChUaW1lX09mX0xhc3RfUmVsb2FkICsgQ0FDSEVfVElNRSA+IG5vdy50dl9zZWMpCiAgICAgICAgcmV0dXJuOwogICAgVGltZV9PZl9MYXN0X1JlbG9hZCA9IG5vdy50dl9zZWM7CgogICAgLyoKICAgICAqICBNYWtlcyBzdXJlIHdlIGhhdmUgU09NRSBzcGFjZSBhbGxvY2F0ZWQgZm9yIG5ldyByb3V0aW5nIGVudHJpZXMKICAgICAqLwogICAgaWYgKCFydGhlYWQpIHsKICAgICAgICBydGhlYWQgPSAoUlRFTlRSWSAqKikgbWFsbG9jKDEwMCAqIHNpemVvZihSVEVOVFJZICopKTsKICAgICAgICBpZiAoIXJ0aGVhZCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicm91dGUgdGFibGUgbWFsbG9jIGZhaWxcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG1lbXNldCgoY2hhciAqKSBydGhlYWQsICgwKSwgMTAwICogc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgIHJ0YWxsb2NhdGUgPSAxMDA7CiAgICB9CgogICAgLyoKICAgICAqIHJlc2V0IHRoZSByb3V0aW5nIHRhYmxlIHNpemUgdG8gemVybyAtLSB3YXMgYSBDTVUgbWVtb3J5IGxlYWsgCiAgICAgKi8KICAgIHJ0c2l6ZSA9IDA7CgogICAgZm9yICh0YWJsZSA9IDA7IHRhYmxlIDwgTlVNX1JPVVRFX1NZTUJPTFM7IHRhYmxlKyspIHsKI2lmZGVmIHN1blYzCiAgICAgICAgaGFzaHNpemUgPSBSVEhBU0hTSVo7CiNlbHNlCiAgICAgICAgYXV0b19ubGlzdChSVEhBU0hTSVpFX1NZTUJPTCwgKGNoYXIgKikgJmhhc2hzaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhc2hzaXplKSk7CiNlbmRpZgogICAgICAgIHJvdXRlaGFzaCA9CiAgICAgICAgICAgIChzdHJ1Y3QgbWJ1ZiAqKikgbWFsbG9jKGhhc2hzaXplICogc2l6ZW9mKHN0cnVjdCBtYnVmICopKTsKICAgICAgICBhdXRvX25saXN0KHJvdXRlX3N5bWJvbHNbdGFibGVdLCAoY2hhciAqKSByb3V0ZWhhc2gsCiAgICAgICAgICAgICAgICAgICBoYXNoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWJ1ZiAqKSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhc2hzaXplOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJvdXRlaGFzaFtpXSA9PSAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIG0gPSByb3V0ZWhhc2hbaV07CiAgICAgICAgICAgIHdoaWxlIChtKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIERpZyB0aGUgcm91dGUgb3V0IG9mIHRoZSBrZXJuZWwuLi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobSwgKGNoYXIgKikgJm1iLCBzaXplb2YobWIpKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YXJfcm91dGUiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtID0gbWIubV9uZXh0OwogICAgICAgICAgICAgICAgcnQgPSBtdG9kKCZtYiwgUlRFTlRSWSAqKTsKCiAgICAgICAgICAgICAgICBpZiAocnQtPnJ0X2lmcCAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHJ0LT5ydF9pZnAsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mKGlmbmV0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3Zhcl9yb3V0ZSIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIG5hbWUsIDE2KSkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFyX3JvdXRlIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmFtZVsxNV0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKG5hbWUsICdcMCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJsbzAiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2hvcnQgKikgJnJ0LT5ydF91bml0LCB0ZW1wLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHRlbXApID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGEgYmxvY2sgdG8gaG9sZCBpdCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAocnRzaXplID49IHJ0YWxsb2NhdGUpIHsKICAgICAgICAgICAgICAgICAgICBydGhlYWQgPQogICAgICAgICAgICAgICAgICAgICAgICAoUlRFTlRSWSAqKikgcmVhbGxvYygoY2hhciAqKSBydGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBydGFsbG9jYXRlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkgKikpOwogICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmcnRoZWFkW3J0YWxsb2NhdGVdLCAoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKiBzaXplb2YoUlRFTlRSWSAqKSk7CgogICAgICAgICAgICAgICAgICAgIHJ0YWxsb2NhdGUgKj0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcnRoZWFkW3J0c2l6ZV0pCiAgICAgICAgICAgICAgICAgICAgcnRoZWFkW3J0c2l6ZV0gPSAoUlRFTlRSWSAqKSBtYWxsb2Moc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAqICAgICAgQWRkIHRoaXMgdG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJURU5UUlkpKTsKICAgICAgICAgICAgICAgIHJ0c2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUocm91dGVoYXNoKTsKICAgIH0KICAgIC8qCiAgICAgKiAgU29ydCBpdCEKICAgICAqLwogICAgcXNvcnQoKGNoYXIgKikgcnRoZWFkLCBydHNpemUsIHNpemVvZihydGhlYWRbMF0pLCBxc29ydF9jb21wYXJlKTsKfQojZWxzZQojaWZkZWYgbGludXgKc3RhdGljIHZvaWQKUm91dGVfU2Nhbl9SZWxvYWQodm9pZCkKewogICAgRklMRSAgICAgICAgICAgKmluOwogICAgY2hhciAgICAgICAgICAgIGxpbmVbMjU2XTsKICAgIHN0cnVjdCBydGVudHJ5ICpydDsKICAgIGNoYXIgICAgICAgICAgICBuYW1lWzE2XTsKICAgIHN0YXRpYyB0aW1lX3QgICBUaW1lX09mX0xhc3RfUmVsb2FkOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKCiAgICBuZXRzbm1wX2dldF9tb25vdG9uaWNfY2xvY2soJm5vdyk7CiAgICBpZiAoVGltZV9PZl9MYXN0X1JlbG9hZCArIENBQ0hFX1RJTUUgPiBub3cudHZfc2VjKQogICAgICAgIHJldHVybjsKICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSBub3cudHZfc2VjOwoKICAgIC8qCiAgICAgKiAgTWFrZXMgc3VyZSB3ZSBoYXZlIFNPTUUgc3BhY2UgYWxsb2NhdGVkIGZvciBuZXcgcm91dGluZyBlbnRyaWVzCiAgICAgKi8KICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgcnRoZWFkID0gKHN0cnVjdCBydGVudHJ5ICoqKSBjYWxsb2MoMTAwLCBzaXplb2Yoc3RydWN0IHJ0ZW50cnkgKikpOwogICAgICAgIGlmICghcnRoZWFkKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyb3V0ZSB0YWJsZSBtYWxsb2MgZmFpbFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcnRhbGxvY2F0ZSA9IDEwMDsKICAgIH0KCiAgICAvKgogICAgICogZmV0Y2ggcm91dGVzIGZyb20gdGhlIHByb2MgZmlsZS1zeXN0ZW06CiAgICAgKi8KCiAgICBydHNpemUgPSAwOwoKICAgIGlmICghKGluID0gZm9wZW4oIi9wcm9jL25ldC9yb3V0ZSIsICJyIikpKSB7CiAgICAgICAgTkVUU05NUF9MT0dPTkNFKChMT0dfRVJSLCAiY2Fubm90IG9wZW4gL3Byb2MvbmV0L3JvdXRlIC0gYnVycHNcbiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CiAgICAgICAgc3RydWN0IHJ0ZW50cnkgIHJ0ZW50OwogICAgICAgIGNoYXIgICAgICAgICAgICBydGVudF9uYW1lWzMyXTsKICAgICAgICBpbnQgICAgICAgICAgICAgcmVmY250LCBtZXRyaWM7CiAgICAgICAgdW5zaWduZWQgICAgICAgIGZsYWdzLCB1c2U7CgogICAgICAgIHJ0ID0gJnJ0ZW50OwogICAgICAgIG1lbXNldCgoY2hhciAqKSBydCwgKDApLCBzaXplb2YoKnJ0KSk7CiAgICAgICAgcnQtPnJ0X2RldiA9IHJ0ZW50X25hbWU7CgogICAgICAgIC8qCiAgICAgICAgICogYXMgd2l0aCAxLjk5LjE0OgogICAgICAgICAqIElmYWNlIERlc3QgR1cgRmxhZ3MgUmVmQ250IFVzZSBNZXRyaWMgTWFzayBNVFUgV2luIElSVFQKICAgICAgICAgKiBldGgwIDBBMEEwQTBBIDAwMDAwMDAwIDA1IDAgMCAwIEZGRkZGRkZGIDE1MDAgMCAwIAogICAgICAgICAqLwogICAgICAgIGlmICg4ICE9IHNzY2FuZihsaW5lLCAiJXMgJXggJXggJXggJWQgJXUgJWQgJXggJSpkICUqZCAlKmRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5ydF9kZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihydGVudC5ydF9kc3QpKS0+c2luX2FkZHIuc19hZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0ZW50LnJ0X2dhdGV3YXkpKS0+c2luX2FkZHIuc19hZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogWFhYOiBmaXggdHlwZSBvZiB0aGUgYXJncyAKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnJlZmNudCwgJnVzZSwgJm1ldHJpYywKICAgICAgICAgICAgICAgICAgICAgICAgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKHJ0ZW50LnJ0X2dlbm1hc2spKS0+c2luX2FkZHIuc19hZGRyKSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBzdHJsY3B5KG5hbWUsIHJ0LT5ydF9kZXYsIHNpemVvZihuYW1lKSk7CgogICAgICAgIHJ0LT5ydF9mbGFncyA9IGZsYWdzLCBydC0+cnRfcmVmY250ID0gcmVmY250OwogICAgICAgIHJ0LT5ydF91c2UgPSB1c2UsIHJ0LT5ydF9tZXRyaWMgPSBtZXRyaWM7CgogICAgICAgIHJ0LT5ydF91bml0ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQobmFtZSk7CgogICAgICAgIC8qCiAgICAgICAgICogIEFsbG9jYXRlIGEgYmxvY2sgdG8gaG9sZCBpdCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAqLwogICAgICAgIGlmIChydHNpemUgPj0gcnRhbGxvY2F0ZSkgewogICAgICAgICAgICBydGhlYWQgPSAoc3RydWN0IHJ0ZW50cnkgKiopIHJlYWxsb2MoKGNoYXIgKikgcnRoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHJ0YWxsb2NhdGUgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBydGVudHJ5ICopKTsKICAgICAgICAgICAgbWVtc2V0KCZydGhlYWRbcnRhbGxvY2F0ZV0sIDAsCiAgICAgICAgICAgICAgICAgICBydGFsbG9jYXRlICogc2l6ZW9mKHN0cnVjdCBydGVudHJ5ICopKTsKICAgICAgICAgICAgcnRhbGxvY2F0ZSAqPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoIXJ0aGVhZFtydHNpemVdKQogICAgICAgICAgICBydGhlYWRbcnRzaXplXSA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHJ0ZW50cnkgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwogICAgICAgIC8qCiAgICAgICAgICogIEFkZCB0aGlzIHRvIHRoZSBkYXRhYmFzZQogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBydGhlYWRbcnRzaXplXSwgKGNoYXIgKikgcnQsCiAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwogICAgICAgIHJ0c2l6ZSsrOwogICAgfQoKICAgIGZjbG9zZShpbik7CgogICAgLyoKICAgICAqICBTb3J0IGl0IQogICAgICovCiAgICBxc29ydCgoY2hhciAqKSBydGhlYWQsIHJ0c2l6ZSwgc2l6ZW9mKHJ0aGVhZFswXSksIHFzb3J0X2NvbXBhcmUpOwp9CiNlbmRpZgojZW5kaWYKI2VuZGlmCgoKI2lmbmRlZiBzb2xhcmlzMgovKgogKiAgICAgIENyZWF0ZSBhIGhvc3QgdGFibGUKICovCiNpZmRlZiBocHV4MTEKc3RhdGljIGludApxc29ydF9jb21wYXJlKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2b2lkICp2MikKewogICAgY29uc3QgbWliX2lwUm91dGVFbnQgKnIxID0gKGNvbnN0IG1pYl9pcFJvdXRlRW50ICopIHYxOwogICAgY29uc3QgbWliX2lwUm91dGVFbnQgKnIyID0gKGNvbnN0IG1pYl9pcFJvdXRlRW50ICopIHYyOwogICAgLyoKICAgICAqICAgICAgRG8gdGhlIGNvbXBhcmlzb24KICAgICAqLwogICAgaWYgKHIxLT5EZXN0ID09IHIyLT5EZXN0KQogICAgICAgIHJldHVybiAoMCk7CiAgICBpZiAocjEtPkRlc3QgID4gcjItPkRlc3QpCiAgICAgICAgcmV0dXJuICgxKTsKICAgIHJldHVybiAoLTEpOwp9CiNlbHNlCnN0YXRpYyBpbnQKcXNvcnRfY29tcGFyZShjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpCnsKICAgIFJURU5UUlkgKiBjb25zdCAqcjEgPSAoUlRFTlRSWSAqIGNvbnN0ICopIHYxOwogICAgUlRFTlRSWSAqIGNvbnN0ICpyMiA9IChSVEVOVFJZICogY29uc3QgKikgdjI7CiNpZiBORUVEX0tMR0VUU0EKICAgIHJlZ2lzdGVyIHVfbG9uZyBkc3QxID0KICAgICAgICBudG9obChrbGdldHNhKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKCpyMSktPnJ0X2RzdCktPgogICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcik7CiAgICByZWdpc3RlciB1X2xvbmcgZHN0MiA9CiAgICAgICAgbnRvaGwoa2xnZXRzYSgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICgqcjIpLT5ydF9kc3QpLT4KICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZWxzZQogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDEgPQogICAgICAgIG50b2hsKCgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICYoKCpyMSktPnJ0X2RzdCkpLT5zaW5fYWRkci4KICAgICAgICAgICAgICBzX2FkZHIpOwogICAgcmVnaXN0ZXIgdV9sb25nIGRzdDIgPQogICAgICAgIG50b2hsKCgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopICYoKCpyMiktPnJ0X2RzdCkpLT5zaW5fYWRkci4KICAgICAgICAgICAgICBzX2FkZHIpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FRURfS0xHRVRTQSAqLwoKICAgIC8qCiAgICAgKiAgICAgIERvIHRoZSBjb21wYXJpc29uCiAgICAgKi8KICAgIGlmIChkc3QxID09IGRzdDIpCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGlmIChkc3QxID4gZHN0MikKICAgICAgICByZXR1cm4gKDEpOwogICAgcmV0dXJuICgtMSk7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgVVNFX1NZU0NUTF9ST1VURV9EVU1QICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojZWxpZiBkZWZpbmVkKEhBVkVfSVBITFBBUElfSCkgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2lmbmRlZiBNSUJfSVBQUk9UT19ORVRNR01UCiNkZWZpbmUgTUlCX0lQUFJPVE9fTkVUTUdNVCAzCiNlbmRpZgoKUE1JQl9JUEZPUldBUkRST1cgcm91dGVfcm93OwppbnQgICAgICAgICAgICAgY3JlYXRlX2ZsYWc7CnZvaWQKaW5pdF92YXJfcm91dGUodm9pZCkKewp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pcFJvdXRlRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIxLjEuPy5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIHJlZ2lzdGVyIGludCAgICBTYXZlX1ZhbGlkLCByZXN1bHQsIFJ0SW5kZXggPSAwOwogICAgc3RhdGljIGludCAgICAgIHNhdmVOYW1lTGVuID0gMCwgc2F2ZUV4YWN0ID0gMCwgc2F2ZVJ0SW5kZXggPQogICAgICAgIDAsIHJ0c2l6ZSA9IDA7CiAgICBzdGF0aWMgb2lkICAgICAgc2F2ZU5hbWVbTUFYX09JRF9MRU5dLCBDdXJyZW50W01BWF9PSURfTEVOXTsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgc3RhdGljIFBNSUJfSVBGT1JXQVJEVEFCTEUgcElwUnRyVGFibGUgPSBOVUxMOwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIHN0YXRpYyB0aW1lX3QgICAgVGltZV9PZl9MYXN0X1JlbG9hZDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CgoKICAgIC8qKiAKICAgICAqKiB0aGlzIG9wdGltaXNhdGlvbiBmYWlscywgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3V0ZSBhdmFpbC4KICAgICAqKiBpdCBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBidXQgYmV0dGVyIGxlYXZlIGl0IG91dCAuLi4KICAgICAqKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICBzYXZlTmFtZUxlbiA9IDA7CiNlbmRpZgogICAgaWYgKHJvdXRlX3JvdyA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBTRVQgcmVxdWVzdCdzIEZSRUUgcGhhc2UgCiAgICAgICAgICovCiAgICAgICAgcm91dGVfcm93ID0gKFBNSUJfSVBGT1JXQVJEUk9XKSBtYWxsb2Moc2l6ZW9mKE1JQl9JUEZPUldBUkRST1cpKTsKICAgIH0KICAgIG5ldHNubXBfZ2V0X21vbm90b25pY19jbG9jaygmbm93KTsKICAgIGlmICgocnRzaXplIDw9IDEpIHx8IChUaW1lX09mX0xhc3RfUmVsb2FkICsgNSA8PSBub3cudHZfc2VjKSkKICAgICAgICBTYXZlX1ZhbGlkID0gMDsKICAgIGVsc2UKICAgICAgICAvKgogICAgICAgICAqICBPUFRJTUlaQVRJT046CiAgICAgICAgICoKICAgICAgICAgKiAgSWYgdGhlIG5hbWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG5hbWUsIHdpdGggdGhlIHBvc3NpYmxlCiAgICAgICAgICogIGV4Y2VwdGlvbiBvZiB0aGUgWzlddGggdG9rZW4sIHRoZW4gZG9uJ3QgcmVhZCB0aGUgcm91dGluZyB0YWJsZQogICAgICAgICAqCiAgICAgICAgICovCgogICAgaWYgKChzYXZlTmFtZUxlbiA9PSAoaW50KSAqbGVuZ3RoKSAmJiAoc2F2ZUV4YWN0ID09IGV4YWN0KSkgewogICAgICAgIHJlZ2lzdGVyIGludCAgICB0ZW1wID0gbmFtZVs5XTsKICAgICAgICBuYW1lWzldID0gMDsKICAgICAgICBTYXZlX1ZhbGlkID0KICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgc2F2ZU5hbWUsIHNhdmVOYW1lTGVuKSA9PSAwKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgIH0gZWxzZQogICAgICAgIFNhdmVfVmFsaWQgPSAwOwoKICAgIGlmIChTYXZlX1ZhbGlkKSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHRlbXAgPSBuYW1lWzldOyAvKiBGaXggdXAgJ2xvd2VzdCcgZm91bmQgZW50cnkgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgICAgIFJ0SW5kZXggPSBzYXZlUnRJbmRleDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgICAgICovCgogICAgICAgIG1lbWNweSgoY2hhciAqKSBDdXJyZW50LCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAgICAgKGludCkgKHZwLT5uYW1lbGVuKSAqIHNpemVvZihvaWQpKTsKCgogICAgICAgIGlmICgoVGltZV9PZl9MYXN0X1JlbG9hZCArIDUgPD0gbm93LnR2X3NlYykKICAgICAgICAgICAgfHwgKHBJcFJ0clRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgIGlmIChwSXBSdHJUYWJsZSAhPSBOVUxMKQogICAgICAgICAgICAgICAgZnJlZShwSXBSdHJUYWJsZSk7CiAgICAgICAgICAgIFRpbWVfT2ZfTGFzdF9SZWxvYWQgPSBub3cudHZfc2VjOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBxdWVyeSBmb3IgYnVmZmVyIHNpemUgbmVlZGVkIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3RhdHVzID0gR2V0SXBGb3J3YXJkVGFibGUocElwUnRyVGFibGUsICZkd0FjdHVhbFNpemUsIFRSVUUpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICAgICAgICAgIHBJcFJ0clRhYmxlID0gKFBNSUJfSVBGT1JXQVJEVEFCTEUpIG1hbGxvYyhkd0FjdHVhbFNpemUpOwogICAgICAgICAgICAgICAgaWYgKHBJcFJ0clRhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc29ydGVkIElQIFJvdXRlIFRhYmxlIAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIEdldElwRm9yd2FyZFRhYmxlKHBJcFJ0clRhYmxlLCAmZHdBY3R1YWxTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgIHJ0c2l6ZSA9IHBJcFJ0clRhYmxlLT5kd051bUVudHJpZXM7CiAgICAgICAgICAgIGZvciAoUnRJbmRleCA9IDA7IFJ0SW5kZXggPCBydHNpemU7IFJ0SW5kZXgrKykgewogICAgICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLgogICAgICAgICAgICAgICAgICAgIGR3Rm9yd2FyZERlc3Q7CiAgICAgICAgICAgICAgICBvcCA9IEN1cnJlbnQgKyAxMDsKICAgICAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgICAgICpvcCsrID0gKmNwKys7CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBDdXJyZW50LCAxNCk7CiAgICAgICAgICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoUnRJbmRleCA+PSBydHNpemUpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZm9yIGNyZWF0aW9uIG9mIG5ldyByb3csIG9ubHkgaXBOZXRUb01lZGlhVGFibGUgY2FzZSBpcyBjb25zaWRlcmVkIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCpsZW5ndGggPT0gMTQpIHsKICAgICAgICAgICAgICAgIHVfY2hhciAgICAgICAgICAgZGVzdF9hZGRyWzRdOwogICAgICAgICAgICAgICAgTUlCX0lQRk9SV0FSRFJPVyB0ZW1wX3JvdzsKCiAgICAgICAgICAgICAgICBjcmVhdGVfZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzBdID0gKHVfY2hhcikgbmFtZVsxMF07CiAgICAgICAgICAgICAgICBkZXN0X2FkZHJbMV0gPSAodV9jaGFyKSBuYW1lWzExXTsKICAgICAgICAgICAgICAgIGRlc3RfYWRkclsyXSA9ICh1X2NoYXIpIG5hbWVbMTJdOwogICAgICAgICAgICAgICAgZGVzdF9hZGRyWzNdID0gKHVfY2hhcikgbmFtZVsxM107CiAgICAgICAgICAgICAgICBtZW1zZXQoJnRlbXBfcm93LCAwLCBzaXplb2YodGVtcF9yb3cpKTsKICAgICAgICAgICAgICAgIHRlbXBfcm93LmR3Rm9yd2FyZERlc3QgPSAqKChEV09SRCAqKSBkZXN0X2FkZHIpOwogICAgICAgICAgICAgICAgdGVtcF9yb3cuZHdGb3J3YXJkUG9saWN5ID0gMDsKICAgICAgICAgICAgICAgIHRlbXBfcm93LmR3Rm9yd2FyZFByb3RvID0gTUlCX0lQUFJPVE9fTkVUTUdNVDsKICAgICAgICAgICAgICAgICpyb3V0ZV9yb3cgPSB0ZW1wX3JvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKHBJcFJ0clRhYmxlKTsKICAgICAgICAgICAgcElwUnRyVGFibGUgPSBOVUxMOwogICAgICAgICAgICBydHNpemUgPSAwOwogICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVfZmxhZyA9IDA7CiAgICAgICAgLyoKICAgICAgICAgKiAgU2F2ZSBpbiB0aGUgJ2NhY2hlJwogICAgICAgICAqLwogICAgICAgIG1lbWNweSgoY2hhciAqKSBzYXZlTmFtZSwgKGNoYXIgKikgbmFtZSwKICAgICAgICAgICAgICAgU05NUF9NSU4oKmxlbmd0aCwgTUFYX09JRF9MRU4pICogc2l6ZW9mKG9pZCkpOwogICAgICAgIHNhdmVOYW1lWzldID0gMDsKICAgICAgICBzYXZlTmFtZUxlbiA9ICpsZW5ndGg7CiAgICAgICAgc2F2ZUV4YWN0ID0gZXhhY3Q7CiAgICAgICAgc2F2ZVJ0SW5kZXggPSBSdEluZGV4OwoKICAgICAgICAvKgogICAgICAgICAqICBSZXR1cm4gdGhlIG5hbWUKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgfQogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgKnJvdXRlX3JvdyA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUFJPVVRFREVTVDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBhZGRyX3JldCA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmREZXN0OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiAgICBjYXNlIElQUk9VVEVJRklOREVYOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkSWZJbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzI6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUMzOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkTWV0cmljMzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1ldHJpYzQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBST1VURU1FVFJJQzU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRNZXRyaWM1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVORVhUSE9QOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfcnRlOwogICAgICAgIGFkZHJfcmV0ID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE5leHRIb3A7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURVRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3J0ZTsKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVQUk9UTzoKICAgICAgICBsb25nX3JldHVybiA9IHBJcFJ0clRhYmxlLT50YWJsZVtSdEluZGV4XS5kd0ZvcndhcmRQcm90bzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFQUdFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBSdHJUYWJsZS0+dGFibGVbUnRJbmRleF0uZHdGb3J3YXJkQWdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9ydGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gcElwUnRyVGFibGUtPnRhYmxlW1J0SW5kZXhdLmR3Rm9yd2FyZE1hc2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBST1VURUlORk86CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBSb3V0ZUVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KCnN0YXRpYwpUQUlMUV9IRUFEKCwgc25tcHJ0KQogICAgcnRoZWFkOwogICAgIHN0YXRpYyBjaGFyICAgICpydGJ1ZjsKICAgICBzdGF0aWMgc2l6ZV90ICAgcnRidWZsZW47CiAgICAgc3RhdGljIHRpbWVfdCAgIGxhc3R0aW1lOwoKICAgICBzdHJ1Y3Qgc25tcHJ0IHsKICAgICAgICAgVEFJTFFfRU5UUlkoc25tcHJ0KSBsaW5rOwogICAgICAgICBzdHJ1Y3QgcnRfbXNnaGRyICpoZHI7CiAgICAgICAgIHN0cnVjdCBpbl9hZGRyICBkZXN0OwogICAgICAgICBzdHJ1Y3QgaW5fYWRkciAgZ2F0ZXdheTsKICAgICAgICAgc3RydWN0IGluX2FkZHIgIG5ldG1hc2s7CiAgICAgICAgIGludCAgICAgICAgICAgICBpbmRleDsKICAgICAgICAgc3RydWN0IGluX2FkZHIgIGlmYTsKICAgICB9OwoKICAgICBzdGF0aWMgdm9pZAogICAgICAgICAgICAgICAgICAgICBydG1zZyhzdHJ1Y3QgcnRfbXNnaGRyICpydG0pCnsKICAgIHN0cnVjdCBzbm1wcnQgICpydDsKICAgIHN0cnVjdCBzb2NrYWRkciAqc2E7CiAgICBpbnQgICAgICAgICAgICAgYml0LCBnb3RkZXN0LCBnb3RtYXNrOwoKICAgIHJ0ID0gbWFsbG9jKHNpemVvZiAqcnQpOwogICAgaWYgKHJ0ID09IDApCiAgICAgICAgcmV0dXJuOwogICAgcnQtPmhkciA9IHJ0bTsKICAgIHJ0LT5pZmEuc19hZGRyID0gMDsKICAgIHJ0LT5kZXN0ID0gcnQtPmdhdGV3YXkgPSBydC0+bmV0bWFzayA9IHJ0LT5pZmE7CiAgICBydC0+aW5kZXggPSBydG0tPnJ0bV9pbmRleDsKCiAgICBnb3RkZXN0ID0gZ290bWFzayA9IDA7CiAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgKHJ0bSArIDEpOwogICAgZm9yIChiaXQgPSAxOyAoKGNoYXIgKikgc2EgPCAoY2hhciAqKSBydG0gKyBydG0tPnJ0bV9tc2dsZW4pICYmIGJpdDsKICAgICAgICAgYml0IDw8PSAxKSB7CiAgICAgICAgaWYgKChydG0tPnJ0bV9hZGRycyAmIGJpdCkgPT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgc3dpdGNoIChiaXQpIHsKICAgICAgICBjYXNlIFJUQV9EU1Q6CiNkZWZpbmUgc2F0b3NpbihzYSkgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2EpKQogICAgICAgICAgICBydC0+ZGVzdCA9IHNhdG9zaW4oc2EpLT5zaW5fYWRkcjsKICAgICAgICAgICAgZ290ZGVzdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRBX0dBVEVXQVk6CiAgICAgICAgICAgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCiAgICAgICAgICAgICAgICBydC0+Z2F0ZXdheSA9IHNhdG9zaW4oc2EpLT5zaW5fYWRkcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSVEFfTkVUTUFTSzoKICAgICAgICAgICAgaWYgKHNhLT5zYV9sZW4gPj0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQtPm5ldG1hc2sgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgIGdvdG1hc2sgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUQV9JRkE6CiAgICAgICAgICAgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCiAgICAgICAgICAgICAgICBydC0+aWZhID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBmcm9tIHJ0c29jay5jIAogICAgICAgICAqLwojZGVmaW5lIFJPVU5EVVAoYSkgXAogICAgICAgICgoYSkgPiAwID8gKDEgKyAoKChhKSAtIDEpIHwgKHNpemVvZihsb25nKSAtIDEpKSkgOiBzaXplb2YobG9uZykpCiAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopICgoY2hhciAqKSBzYSArIFJPVU5EVVAoc2EtPnNhX2xlbikpOwogICAgfQogICAgaWYgKCFnb3RkZXN0KSB7CiAgICAgICAgLyoKICAgICAgICAgKiBYWFggY2FuJ3QgaGFwcGVuIGlmIGNvZGUgYWJvdmUgaXMgY29ycmVjdCAKICAgICAgICAgKi8KICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAicm91dGUgbm8gZGVzdD9cbiIpOwogICAgICAgIGZyZWUocnQpOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIElmIG5vIG1hc2sgcHJvdmlkZWQsIGl0IHdhcyBhIGhvc3Qgcm91dGUuIAogICAgICAgICAqLwogICAgICAgIGlmICghZ290bWFzaykKICAgICAgICAgICAgcnQtPm5ldG1hc2suc19hZGRyID0gfjA7CiAgICAgICAgVEFJTFFfSU5TRVJUX1RBSUwoJnJ0aGVhZCwgcnQsIGxpbmspOwogICAgfQp9CgpzdGF0aWMgaW50CnN1Y2tfa3J0KGludCBmb3JjZSkKewogICAgdGltZV90ICAgICAgICAgIG5vdzsKICAgIHN0cnVjdCBzbm1wcnQgICpydCwgKm5leHQ7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgc3RhdGljIGludCAgICAgIG5hbWVbNl0gPQogICAgICAgIHsgQ1RMX05FVCwgUEZfUk9VVEUsIDAsIEFGX0lORVQsIE5FVF9SVF9EVU1QLCAwIH07CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydG07CgogICAgdGltZSgmbm93KTsKICAgIGlmIChub3cgPCAobGFzdHRpbWUgKyBDQUNIRV9USU1FKSAmJiAhZm9yY2UpCiAgICAgICAgcmV0dXJuIDA7CiAgICBsYXN0dGltZSA9IG5vdzsKCiAgICBmb3IgKHJ0ID0gcnRoZWFkLnRxaF9maXJzdDsgcnQ7IHJ0ID0gbmV4dCkgewogICAgICAgIG5leHQgPSBydC0+bGluay50cWVfbmV4dDsKICAgICAgICBmcmVlKHJ0KTsKICAgIH0KICAgIFRBSUxRX0lOSVQoJnJ0aGVhZCk7CgogICAgaWYgKHN5c2N0bChuYW1lLCA2LCAwLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBzeXNsb2coTE9HX1dBUk5JTkcsICJzeXNjdGwgbmV0LXJvdXRlLWR1bXA6ICVtIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmIChsZW4gPiBydGJ1ZmxlbikgewogICAgICAgIGNoYXIgICAgICAgICAgICpuZXdidWY7CiAgICAgICAgbmV3YnVmID0gcmVhbGxvYyhydGJ1ZiwgbGVuKTsKICAgICAgICBpZiAobmV3YnVmID09IDApCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBydGJ1ZiA9IG5ld2J1ZjsKICAgICAgICBydGJ1ZmxlbiA9IGxlbjsKICAgIH0KCiAgICBpZiAoc3lzY3RsKG5hbWUsIDYsIHJ0YnVmLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBzeXNsb2coTE9HX1dBUk5JTkcsICJzeXNjdGwgbmV0LXJvdXRlLWR1bXA6ICVtIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGNwID0gcnRidWY7CiAgICB3aGlsZSAoY3AgPCBydGJ1ZiArIGxlbikgewogICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIC8qCiAgICAgICAgICogTkI6CiAgICAgICAgICogWW91IG1pZ2h0IHdhbnQgdG8gZXhjbHVkZSByb3V0ZXMgd2l0aCBSVEZfV0FTQ0xPTkVECiAgICAgICAgICogc2V0LiAgVGhpcyBrZWVwcyB0aGUgY2xvbmVkIGhvc3Qgcm91dGVzIChhbmQgdGh1cyBhbHNvCiAgICAgICAgICogQVJQIGVudHJpZXMpIG91dCBvZiB0aGUgcm91dGluZyB0YWJsZS4gIFRodXMsIGl0IGFsc28KICAgICAgICAgKiBwcmVzZW50cyBtYW5hZ2VtZW50IHN0YXRpb25zIHdpdGggYW4gaW5jb21wbGV0ZSB2aWV3LgogICAgICAgICAqIEkgYmVsaWV2ZSB0aGF0IGl0IHNob3VsZCBiZSBwb3NzaWJsZSBmb3IgYSBtYW5hZ2VtZW50CiAgICAgICAgICogc3RhdGlvbiB0byBleGFtaW5lIChhbmQgcGVyaGFwcyBkZWxldGUpIHN1Y2ggcm91dGVzLgogICAgICAgICAqLwogICAgICAgIGlmIChydG0tPnJ0bV92ZXJzaW9uID09IFJUTV9WRVJTSU9OICYmIHJ0bS0+cnRtX3R5cGUgPT0gUlRNX0dFVCkKICAgICAgICAgICAgcnRtc2cocnRtKTsKICAgICAgICBjcCArPSBydG0tPnJ0bV9tc2dsZW47CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaXBSb3V0ZUVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjEuMS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwogICAgaW50ICAgICAgICAgICAgIFNhdmVfVmFsaWQsIHJlc3VsdDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIHN0cnVjdCBzbm1wcnQgICpydDsKICAgIHN0YXRpYyBzdHJ1Y3Qgc25tcHJ0ICpzYXZlcnQ7CiAgICBzdGF0aWMgaW50ICAgICAgc2F2ZU5hbWVMZW4sIHNhdmVFeGFjdDsKICAgIHN0YXRpYyBvaWQgICAgICBzYXZlTmFtZVsxNF0sIEN1cnJlbnRbMTRdOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKICAgIAogICAgKndyaXRlX21ldGhvZCA9IE5VTEw7ICAvKiB3cml0ZV9ydGU7ICBYWFg6ICBTRVQgc3VwcG9ydCBub3QgcmVhbGx5IGltcGxlbWVudGVkICovCgojaWYgMAogICAgLyoKICAgICAqICAgICAgT1BUSU1JWkFUSU9OOgogICAgICoKICAgICAqICAgICAgSWYgdGhlIG5hbWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG5hbWUsIHdpdGggdGhlIHBvc3NpYmxlCiAgICAgKiAgICAgIGV4Y2VwdGlvbiBvZiB0aGUgWzlddGggdG9rZW4sIHRoZW4gZG9uJ3QgcmVhZCB0aGUgcm91dGluZyB0YWJsZQogICAgICoKICAgICAqLwoKICAgIGlmICgoc2F2ZU5hbWVMZW4gPT0gKmxlbmd0aCkgJiYgKHNhdmVFeGFjdCA9PSBleGFjdCkpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdGVtcCA9IG5hbWVbOV07CiAgICAgICAgbmFtZVs5XSA9IDA7CiAgICAgICAgU2F2ZV9WYWxpZCA9CiAgICAgICAgICAgICFzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIHNhdmVOYW1lLCBzYXZlTmFtZUxlbik7CiAgICAgICAgbmFtZVs5XSA9IHRlbXA7CiAgICB9IGVsc2UgewogICAgICAgIFNhdmVfVmFsaWQgPSAwOwogICAgfQojZWxzZQogICAgU2F2ZV9WYWxpZCA9IDA7CiNlbmRpZgoKICAgIGlmIChTYXZlX1ZhbGlkKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRlbXAgPSBuYW1lWzldOwogICAgICAgIG1lbWNweShuYW1lLCBDdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICBuYW1lWzldID0gdGVtcDsKICAgICAgICAqbGVuZ3RoID0gMTQ7CiAgICAgICAgcnQgPSBzYXZlcnQ7CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50CiAgICAgICAgICogKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICAgICAqLwoKICAgICAgICBtZW1jcHkoQ3VycmVudCwgdnAtPm5hbWUsIFNOTVBfTUlOKHNpemVvZihDdXJyZW50KSwgKGludCkodnAtPm5hbWVsZW4pICogc2l6ZW9mKG9pZCkpKTsKCiAgICAgICAgc3Vja19rcnQoMCk7CgogICAgICAgIGZvciAocnQgPSBydGhlYWQudHFoX2ZpcnN0OyBydDsgcnQgPSBydC0+bGluay50cWVfbmV4dCkgewogICAgICAgICAgICBvcCA9IEN1cnJlbnQgKyAxMDsKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcnQtPmRlc3Q7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgQ3VycmVudCwgMTQpOwogICAgICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpCiAgICAgICAgICAgICAgICB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHJ0ID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAvKgogICAgICAgICAqICBTYXZlIGluIHRoZSAnY2FjaGUnCiAgICAgICAgICovCiAgICAgICAgbWVtY3B5KHNhdmVOYW1lLCBuYW1lLCBTTk1QX01JTihzaXplb2Yoc2F2ZU5hbWUpLCAqbGVuZ3RoICogc2l6ZW9mKG9pZCkpKTsKICAgICAgICBzYXZlTmFtZVs5XSA9IDA7CiAgICAgICAgc2F2ZU5hbWVMZW4gPSAqbGVuZ3RoOwogICAgICAgIHNhdmVFeGFjdCA9IGV4YWN0OwogICAgICAgIHNhdmVydCA9IHJ0OwoKICAgICAgICAvKgogICAgICAgICAqICBSZXR1cm4gdGhlIG5hbWUKICAgICAgICAgKi8KICAgICAgICBtZW1jcHkobmFtZSwgQ3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKmxlbmd0aCA9IDE0OwogICAgfQoKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUFJPVVRFREVTVDoKICAgICAgICBhZGRyX3JldCA9IHJ0LT5kZXN0LnNfYWRkcjsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQUk9VVEVJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gcnQtPmluZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFTUVUUklDMToKICAgICAgICBsb25nX3JldHVybiA9IChydC0+aGRyLT5ydG1fZmxhZ3MgJiBSVEZfR0FURVdBWSkgPyAxIDogMDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMjoKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5oZHItPnJ0bV9ybXgucm14X3J0dDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDMzoKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5oZHItPnJ0bV9ybXgucm14X3J0dHZhcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUFJPVVRFTUVUUklDNDoKICAgICAgICBsb25nX3JldHVybiA9IHJ0LT5oZHItPnJ0bV9ybXgucm14X3NzdGhyZXNoOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQUk9VVEVNRVRSSUM1OgogICAgICAgIGxvbmdfcmV0dXJuID0gcnQtPmhkci0+cnRtX3JteC5ybXhfbXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFTkVYVEhPUDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgaWYgKHJ0LT5nYXRld2F5LnNfYWRkciA9PSAwICYmIHJ0LT5pZmEuc19hZGRyID09IDApCiAgICAgICAgICAgIGFkZHJfcmV0ID0gMDsKICAgICAgICBlbHNlIGlmIChydC0+Z2F0ZXdheS5zX2FkZHIgPT0gMCkKICAgICAgICAgICAgYWRkcl9yZXQgPSBydC0+aWZhLnNfYWRkcjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGFkZHJfcmV0ID0gcnQtPmdhdGV3YXkuc19hZGRyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUFJPVVRFVFlQRToKICAgICAgICBpZiAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX1VQKSB7CiAgICAgICAgICAgIGlmIChydC0+aGRyLT5ydG1fZmxhZ3MgJiBSVEZfR0FURVdBWSkgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAgICAgLyogIGluZGlyZWN0KDQpICAqLwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAgICAgLyogIGRpcmVjdCgzKSAgKi8KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogIGludmFsaWQoMikgICovCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUFJPVVRFUFJPVE86CiAgICAgICAgbG9uZ19yZXR1cm4gPSAocnQtPmhkci0+cnRtX2ZsYWdzICYgUlRGX0RZTkFNSUMpID8gNCA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQUk9VVEVBR0U6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQUk9VVEVNQVNLOgogICAgICAgIGFkZHJfcmV0ID0gcnQtPm5ldG1hc2suc19hZGRyOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwoKICAgIGNhc2UgSVBST1VURUlORk86CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBSb3V0ZUVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKaW5pdF92YXJfcm91dGUodm9pZCkKewogICAgOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KCiNpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0NUTF9IKSAmJiAhZGVmaW5lZChsaW51eCkKLyoKICogZ2V0X2FkZHJlc3MoKQogKiAKICogVHJhdmVyc2UgdGhlIGFkZHJlc3Mgc3RydWN0dXJlcyBhZnRlciBhIHJvdXRpbmcgc29ja2V0IG1lc3NhZ2UgYW5kCiAqIGV4dHJhY3QgYSBzcGVjaWZpYyBvbmUuCiAqIAogKiBTb21lIG9mIHRoaXMgaXMgcGVjdWxpYXIgdG8gSVJJWCA2LjIsIHdoaWNoIGRvZXNuJ3QgaGF2ZSBzYV9sZW4gaW4KICogdGhlIHNvY2thZGRyIHN0cnVjdHVyZSB5ZXQuICBXaXRoIHNhX2xlbiwgc2tpcHBpbmcgYW4gYWRkcmVzcyBlbnRyeQogKiB3b3VsZCBiZSBtdWNoIGVhc2llci4KICovCiNpbmNsdWRlIDxzeXMvdW4uaD4KCi8qCiAqIHJldHVybnMgdGhlIGxlbmd0aCBvZiBhIHNvY2tldCBzdHJ1Y3R1cmUgCiAqLwoKc2l6ZV90CnNubXBfc29ja2V0X2xlbmd0aChpbnQgZmFtaWx5KQp7CiAgICBzaXplX3QgICAgICAgICAgbGVuZ3RoOwoKICAgIHN3aXRjaCAoZmFtaWx5KSB7CiNpZm5kZWYgY3lnd2luCiNpZiAhZGVmaW5lZCAoV0lOMzIpICYmICFkZWZpbmVkIChjeWd3aW4pCiNpZmRlZiBBRl9VTklYCiAgICBjYXNlIEFGX1VOSVg6CiAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bik7CiAgICAgICAgYnJlYWs7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUZfVU5JWCAqLwojZW5kaWYKI2VuZGlmCgojaWZuZGVmIGFpeDMKI2lmZGVmIEFGX0xJTksKICAgIGNhc2UgQUZfTElOSzoKI2lmZGVmIF9NQVhfU0FfTEVOCiAgICAgICAgbGVuZ3RoID0gX01BWF9TQV9MRU47CiNlbGlmIFNPQ0tfTUFYQUREUkxFTgogICAgICAgIGxlbmd0aCA9IFNPQ0tfTUFYQUREUkxFTjsKI2Vsc2UKICAgICAgICBsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2RsKTsKI2VuZGlmCiAgICAgICAgYnJlYWs7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUZfTElOSyAqLwojZW5kaWYKCiAgICBjYXNlIEFGX0lORVQ6CiAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBsZW5ndGg7Cn0KCmNvbnN0IHN0cnVjdCBzb2NrYWRkciAqCmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKl9hcCwgaW50IGFkZHJlc3NlcywgaW50IHdhbnRlZCkKewogICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphcCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikgX2FwOwogICAgaW50ICAgICAgICAgICAgIGlpbmRleDsKICAgIGludCAgICAgICAgICAgICBiaXRtYXNrOwoKICAgIGZvciAoaWluZGV4ID0gMCwgYml0bWFzayA9IDE7CiAgICAgICAgIGlpbmRleCA8IFJUQVhfTUFYOyArK2lpbmRleCwgYml0bWFzayA8PD0gMSkgewogICAgICAgIGlmIChiaXRtYXNrID09IHdhbnRlZCkgewogICAgICAgICAgICBpZiAoYml0bWFzayAmIGFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGJpdG1hc2sgJiBhZGRyZXNzZXMpIHsKICAgICAgICAgICAgdW5zaWduZWQgICAgICAgIGxlbmd0aCA9CiAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNubXBfc29ja2V0X2xlbmd0aChhcC0+c2FfZmFtaWx5KTsKICAgICAgICAgICAgd2hpbGUgKGxlbmd0aCAlIHNpemVvZihsb25nKSAhPSAwKQogICAgICAgICAgICAgICAgKytsZW5ndGg7CiAgICAgICAgICAgIGFwID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAoKGNvbnN0IGNoYXIgKikgYXAgKyBsZW5ndGgpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBnZXRfaW5fYWRkcmVzcygpCiAqIAogKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBnZXRfYWRkcmVzcyB3aGVyZSBhbgogKiBBRl9JTkVUIGFkZHJlc3MgaXMgZGVzaXJlZCwgYW5kIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgaW5fYWRkcgogKiBwYXJ0LgogKi8KY29uc3Qgc3RydWN0IGluX2FkZHIgKgpnZXRfaW5fYWRkcmVzcyhjb25zdCB2b2lkICphcCwgaW50IGFkZHJlc3NlcywgaW50IHdhbnRlZCkKewogICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphOwoKICAgIGEgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIGdldF9hZGRyZXNzKGFwLCBhZGRyZXNzZXMsIHdhbnRlZCk7CiAgICBpZiAoYSA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChhLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLAogICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHNvY2tldCBmYW1pbHkgJWQgW0FGX0lORVQgZXhwZWN0ZWRdIGluIHZhcl9pcFJvdXRlRW50cnkuXG4iLAogICAgICAgICAgICAgICAgICAgIGEtPnNpbl9mYW1pbHkpKTsKICAgIH0KICAgIHJldHVybiAmYS0+c2luX2FkZHI7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NZU19TWVNDVExfSCAqLwo=