LyoKICoKICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgogKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KICoKICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICogMDIxMTEtMTMwNywgVVNBLiAgCiAqLwoKLyogCiAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CiAqCiAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybwogKgogKi8KCi8qIAogKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCiAqLwoKCiNpbmNsdWRlIDx6ZWJyYS5oPgoKI2lmZGVmIEhBVkVfSVJEUCAKCiNpbmNsdWRlICJpZi5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJzb2NrdW5pb24uaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAiY29tbWFuZC5oIgojaW5jbHVkZSAibWVtb3J5LmgiCiNpbmNsdWRlICJzdHJlYW0uaCIKI2luY2x1ZGUgImlvY3RsLmgiCiNpbmNsdWRlICJjb25uZWN0ZWQuaCIKI2luY2x1ZGUgImxvZy5oIgojaW5jbHVkZSAiemNsaWVudC5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgojaW5jbHVkZSAiaWYuaCIKI2luY2x1ZGUgInNvY2t1bmlvbi5oIgojaW5jbHVkZSAibG9nLmgiCgoKLyogTWFzdGVyIG9mIHRocmVhZHMuICovCmV4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CgppbnQgaW5fY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5ieXRlcyk7CmV4dGVybiBpbnQgaXJkcF9zb2NrOwppbnQgaXJkcF9zZW5kX3RocmVhZChzdHJ1Y3QgdGhyZWFkICp0X2FkdmVydCk7CmNoYXIgKmluZXRfMmEodV9pbnQzMl90IGEsIGNoYXIgKmIpOwp2b2lkIGlyZHBfYWR2ZXJ0X29mZihzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwoKCmNoYXIgYjFbMTZdLCBiMlsxNl0sIGIzWzE2XSwgYjRbMTZdOyAgLyogRm9yIGluZXRfMmEgKi8KCnN0YXRpYyBzdHJ1Y3QgcHJlZml4ICoKaXJkcF9nZXRfcHJlZml4KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgY29ubmVjdGVkICppZmM7CiAgCiAgaWYgKGlmcC0+Y29ubmVjdGVkKQogICAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaWZwLT5jb25uZWN0ZWQsIG5vZGUsIGlmYykpCiAgICAgIHJldHVybiBpZmMtPmFkZHJlc3M7CgogIHJldHVybiBOVUxMOwp9CgovKiBKb2luIHRvIHRoZSBhZGQvbGVhdmUgbXVsdGljYXN0IGdyb3VwLiAqLwpzdGF0aWMgaW50CmlmX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAoJICBpbnQgc29jaywgCgkgIHVfaW50MzJfdCBncm91cCwgCgkgIGludCBhZGRfbGVhdmUpCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcF9tcmVxIG07CiAgc3RydWN0IHByZWZpeCAqcDsKICBpbnQgcmV0OwoKICB6aSA9IGlmcC0+aW5mbzsKCiAgYnplcm8gKCZtLCBzaXplb2YgKG0pKTsKICBtLmltcl9tdWx0aWFkZHIuc19hZGRyID0gaHRvbmwgKGdyb3VwKTsKICBwID0gaXJkcF9nZXRfcHJlZml4KGlmcCk7CgogIGlmKCFwKSB7CiAgICAgICAgemxvZ193YXJuICgiSVJEUDogY2FuJ3QgZ2V0IGFkZHJlc3MgZm9yICVzIiwgaWZwLT5uYW1lKTsKCXJldHVybiAxOwogIH0KCiAgbS5pbXJfaW50ZXJmYWNlID0gcC0+dS5wcmVmaXg0OwoKICByZXQgPSBzZXRzb2Nrb3B0IChzb2NrLCBJUFBST1RPX0lQLCBhZGRfbGVhdmUsCgkJICAgIChjaGFyICopICZtLCBzaXplb2YgKHN0cnVjdCBpcF9tcmVxKSk7CiAgaWYgKHJldCA8IDApCiAgICB6bG9nX3dhcm4gKCJJUkRQOiAlcyBjYW4ndCBzZXRzb2Nrb3B0ICVzOiAlcyIsCgkgICAgICAgYWRkX2xlYXZlID09IElQX0FERF9NRU1CRVJTSElQPyAiam9pbiBncm91cCI6ImxlYXZlIGdyb3VwIiwgCiAgICAgICAgICAgICAgIGluZXRfMmEoZ3JvdXAsIGIxKSwKICAgICAgICAgICAgICAgc2FmZV9zdHJlcnJvciAoZXJybm8pKTsKCiAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAppZl9hZGRfZ3JvdXAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCB6ZWJyYV9pZiAqemk9IGlmcC0+aW5mbzsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAgPSAmemktPmlyZHA7CiAgaW50IHJldDsKCiAgcmV0ID0gaWZfZ3JvdXAgKGlmcCwgaXJkcF9zb2NrLCBJTkFERFJfQUxMUlRSU19HUk9VUCwgSVBfQUREX01FTUJFUlNISVApOwogIGlmIChyZXQgPCAwKSB7CiAgICByZXR1cm4gcmV0OwogIH0KCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDICkKICAgIHpsb2dfZGVidWcoIklSRFA6IEFkZGluZyBncm91cCAlcyBmb3IgJXMiLCAKCSAgICAgICBpbmV0XzJhKGh0b25sKElOQUREUl9BTExSVFJTX0dST1VQKSwgYjEpLAoJICAgICAgIGlmcC0+bmFtZSk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKaWZfZHJvcF9ncm91cCAoc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKICBpbnQgcmV0OwoKICByZXQgPSBpZl9ncm91cCAoaWZwLCBpcmRwX3NvY2ssIElOQUREUl9BTExSVFJTX0dST1VQLCBJUF9EUk9QX01FTUJFUlNISVApOwogIGlmIChyZXQgPCAwKQogICAgcmV0dXJuIHJldDsKCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQogICAgemxvZ19kZWJ1ZygiSVJEUDogTGVhdmluZyBncm91cCAlcyBmb3IgJXMiLCAKCSAgICAgICBpbmV0XzJhKGh0b25sKElOQUREUl9BTExSVFJTX0dST1VQKSwgYjEpLAoJICAgICAgIGlmcC0+bmFtZSk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCmlmX3NldF9kZWZhdWx0cyhzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPWlmcC0+aW5mbzsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOwoKICBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbCA9IElSRFBfTUFYQURWRVJUSU5URVJWQUw7CiAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPSBJUkRQX01JTkFEVkVSVElOVEVSVkFMOwogIGlyZHAtPlByZWZlcmVuY2UgPSBJUkRQX1BSRUZFUkVOQ0U7CiAgaXJkcC0+TGlmZXRpbWUgPSBJUkRQX0xJRkVUSU1FOwp9CgoKc3RydWN0IEFkdiAqQWR2X25ldyAodm9pZCkKewogIHN0cnVjdCBBZHYgKm5ldzsKICBuZXcgPSBYTUFMTE9DIChNVFlQRV9UTVAsIHNpemVvZiAoc3RydWN0IEFkdikpOwogIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKHN0cnVjdCBBZHYpKTsKICByZXR1cm4gbmV3Owp9CgpzdGF0aWMgdm9pZApBZHZfZnJlZSAoc3RydWN0IEFkdiAqYWR2KQp7CiAgWEZSRUUgKE1UWVBFX1RNUCwgYWR2KTsKfQoKc3RhdGljIHZvaWQKaXJkcF9pZl9zdGFydChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIGludCBtdWx0aWNhc3QsIGludCBzZXRfZGVmYXVsdHMpCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOwogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgY29ubmVjdGVkICppZmM7CiAgdV9pbnQzMl90IHRpbWVyLCBzZWVkOwoKICBpZiAoaXJkcC0+ZmxhZ3MgJiBJRl9BQ1RJVkUgKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBhbHJlYWR5IGFjdGl2ZSAlcyIsIGlmcC0+bmFtZSk7CiAgICByZXR1cm47CiAgfQogIGlmICgoaXJkcF9zb2NrIDwgMCkgJiYgKChpcmRwX3NvY2sgPSBpcmRwX3NvY2tfaW5pdCgpKSA8IDApKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IENhbm5vdCBhY3RpdmF0ZSBpbnRlcmZhY2UgJXMgKGNhbm5vdCBjcmVhdGUgIgoJICAgICAgIklSRFAgc29ja2V0KSIsIGlmcC0+bmFtZSk7CiAgICByZXR1cm47CiAgfQogIGlyZHAtPmZsYWdzIHw9IElGX0FDVElWRTsKCiAgaWYoIW11bHRpY2FzdCkgCiAgICBpcmRwLT5mbGFncyB8PSBJRl9CUk9BRENBU1Q7CgogIGlmX2FkZF91cGRhdGUoaWZwKTsKCiAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBkb3duICVzIiwgaWZwLT5uYW1lKTsKICB9CgogIC8qIFNoYWxsIHdlIGNhbmNlbCBpZl9zdGFydCBpZiBpZl9hZGRfZ3JvdXAgZmFpbHM/ICovCgogIGlmKCBtdWx0aWNhc3QpIHsKICAgIGlmX2FkZF9ncm91cChpZnApOwogICAgCiAgICBpZiAoISAoaWZwLT5mbGFncyAmIChJRkZfTVVMVElDQVNUfElGRl9BTExNVUxUSSkpKSB7CiAgICAgIHpsb2dfd2FybigiSVJEUDogSW50ZXJmYWNlIG5vdCBtdWx0aWNhc3QgZW5hYmxlZCAlcyIsIGlmcC0+bmFtZSk7CiAgICB9CiAgfQoKICBpZihzZXRfZGVmYXVsdHMpIAogICAgaWZfc2V0X2RlZmF1bHRzKGlmcCk7CgogIGlyZHAtPmlyZHBfc2VudCA9IDA7CgogIC8qIFRoZSBzcGVjIHN1Z2dlc3RzIHRoaXMgZm9yIHJhbmRvbW5lc3MgKi8KCiAgc2VlZCA9IDA7CiAgaWYoIGlmcC0+Y29ubmVjdGVkKQogICAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaWZwLT5jb25uZWN0ZWQsIG5vZGUsIGlmYykpCiAgICAgIHsKICAgICAgICBzZWVkID0gaWZjLT5hZGRyZXNzLT51LnByZWZpeDQuc19hZGRyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgCiAgc3JhbmRvbShzZWVkKTsKICB0aW1lciA9ICAocmFuZG9tICgpICUgSVJEUF9ERUZBVUxUX0lOVEVSVkFMKSArIDE7IAoKICBpcmRwLT5BZHZQcmVmTGlzdCA9IGxpc3RfbmV3KCk7CiAgaXJkcC0+QWR2UHJlZkxpc3QtPmRlbCA9ICAodm9pZCAoKikodm9pZCAqKSkgQWR2X2ZyZWU7IC8qIERlc3RydWN0b3IgKi8KCgogIC8qIEFuZCB0aGlzIGZvciBzdGFydHVwLiBTcGVlZCBsaW1pdCBmcm9tIDE5OTEgOi0pLiBCdXQgaXQncyBPSyovCgogIGlmKGlyZHAtPmlyZHBfc2VudCA8IE1BWF9JTklUSUFMX0FEVkVSVElTRU1FTlRTICYmCiAgICAgdGltZXIgPiBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwgKSAKCSAgdGltZXI9IE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTDsKCiAgCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQogICAgemxvZ19kZWJ1ZygiSVJEUDogSW5pdCB0aW1lciBmb3IgJXMgc2V0IHRvICV1IiwgCgkgICAgICAgaWZwLT5uYW1lLCAKCSAgICAgICB0aW1lcik7CgogIGlyZHAtPnRfYWR2ZXJ0aXNlID0gdGhyZWFkX2FkZF90aW1lcih6ZWJyYWQubWFzdGVyLCAKCQkJCSAgICAgICBpcmRwX3NlbmRfdGhyZWFkLCAKCQkJCSAgICAgICBpZnAsIAoJCQkJICAgICAgIHRpbWVyKTsKfQoKc3RhdGljIHZvaWQKaXJkcF9pZl9zdG9wKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKewogIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CiAgCiAgaWYgKGlyZHAgPT0gTlVMTCkgewogICAgemxvZ193YXJuICgiSW50ZXJmYWNlICVzIHN0cnVjdHVyZSBpcyBOVUxMIiwgaWZwLT5uYW1lKTsKICAgIHJldHVybjsKICB9CgogIGlmICghIChpcmRwLT5mbGFncyAmIElGX0FDVElWRSApKSB7CiAgICB6bG9nX3dhcm4oIkludGVyZmFjZSBpcyBub3QgYWN0aXZlICVzIiwgaWZwLT5uYW1lKTsKICAgIHJldHVybjsKICB9CgogIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSkgCiAgICBpZl9kcm9wX2dyb3VwKGlmcCk7CgogIGlyZHBfYWR2ZXJ0X29mZihpZnApOwoKICBsaXN0X2RlbGV0ZShpcmRwLT5BZHZQcmVmTGlzdCk7CiAgaXJkcC0+QWR2UHJlZkxpc3Q9TlVMTDsKCiAgaXJkcC0+ZmxhZ3MgPSAwOwp9CgoKc3RhdGljIHZvaWQKaXJkcF9pZl9zaHV0ZG93bihzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOwoKICBpZiAoaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTiApIHsKICAgIHpsb2dfd2FybigiSVJEUDogSW50ZXJmYWNlIGlzIGFscmVhZHkgc2h1dGRvd24gJXMiLCBpZnAtPm5hbWUpOwogICAgcmV0dXJuOwogIH0KCiAgaXJkcC0+ZmxhZ3MgfD0gSUZfU0hVVERPV047CiAgaXJkcC0+ZmxhZ3MgJj0gfklGX0FDVElWRTsKCiAgaWYoISAoaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1QpKSAKICAgIGlmX2Ryb3BfZ3JvdXAoaWZwKTsKICAKICAvKiBUZWxsIHRoZSBob3N0cyB3ZSBhcmUgb3V0IG9mIHNlcnZpY2UgKi8KICBpcmRwX2FkdmVydF9vZmYoaWZwKTsKfQoKc3RhdGljIHZvaWQKaXJkcF9pZl9ub19zaHV0ZG93bihzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOwoKICBpZiAoISAoaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTiApKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBub3Qgc2h1dGRvd24gJXMiLCBpZnAtPm5hbWUpOwogICAgcmV0dXJuOwogIH0KCiAgaXJkcC0+ZmxhZ3MgJj0gfklGX1NIVVRET1dOOwoKICBpcmRwX2lmX3N0YXJ0KGlmcCwgaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1Q/IEZBTFNFIDogVFJVRSwgRkFMU0UpOyAKCn0KCgovKiBXcml0ZSBjb25maWd1cmF0aW9uIHRvIHVzZXIgKi8KCnZvaWQgaXJkcF9jb25maWdfd3JpdGUgKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKICBzdHJ1Y3QgQWR2ICphZHY7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwoKICBpZihpcmRwLT5mbGFncyAmIElGX0FDVElWRSB8fCBpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOKSB7CgogICAgaWYoIGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04pIAogICAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBzaHV0ZG93biAlcyIsICBWVFlfTkVXTElORSk7CgogICAgaWYoIGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSAKICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgYnJvYWRjYXN0JXMiLCAgVlRZX05FV0xJTkUpOwogICAgZWxzZSAKICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgbXVsdGljYXN0JXMiLCAgVlRZX05FV0xJTkUpOwoKICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIHByZWZlcmVuY2UgJWxkJXMiLCAgCgkgICAgIGlyZHAtPlByZWZlcmVuY2UsIFZUWV9ORVdMSU5FKTsKCiAgICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChpcmRwLT5BZHZQcmVmTGlzdCwgbm9kZSwgYWR2KSkKICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgYWRkcmVzcyAlcyBwcmVmZXJlbmNlICVkJXMiLAogICAgICAgICAgICAgICAgICAgIGluZXRfMmEoYWR2LT5pcC5zX2FkZHIsIGIxKSwKICAgICAgICAgICAgICAgICAgICBhZHYtPnByZWYsIAogICAgICAgICAgICAgICAgICAgIFZUWV9ORVdMSU5FKTsKCiAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBob2xkdGltZSAlZCVzIiwgIAoJICAgICBpcmRwLT5MaWZldGltZSwgVlRZX05FV0xJTkUpOwoKICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIG1pbmFkdmVydGludGVydmFsICVsZCVzIiwgIAoJICAgICBpcmRwLT5NaW5BZHZlcnRJbnRlcnZhbCwgVlRZX05FV0xJTkUpOwoKICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIG1heGFkdmVydGludGVydmFsICVsZCVzIiwgIAoJICAgICBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbCwgVlRZX05FV0xJTkUpOwoKICB9Cn0KCgpERUZVTiAoaXBfaXJkcF9tdWx0aWNhc3QsCiAgICAgICBpcF9pcmRwX211bHRpY2FzdF9jbWQsCiAgICAgICAiaXAgaXJkcCBtdWx0aWNhc3QiLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlIHVzaW5nIG11bHRpY2FzdFxuIikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIGlyZHBfaWZfc3RhcnQoaWZwLCBUUlVFLCBUUlVFKTsKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChpcF9pcmRwX2Jyb2FkY2FzdCwKICAgICAgIGlwX2lyZHBfYnJvYWRjYXN0X2NtZCwKICAgICAgICJpcCBpcmRwIGJyb2FkY2FzdCIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2UgdXNpbmcgYnJvYWRjYXN0XG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwoKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgaXJkcF9pZl9zdGFydChpZnAsIEZBTFNFLCBUUlVFKTsKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChub19pcF9pcmRwLAogICAgICAgbm9faXBfaXJkcF9jbWQsCiAgICAgICAibm8gaXAgaXJkcCIsCiAgICAgICBOT19TVFIKICAgICAgIElQX1NUUgogICAgICAgIkRpc2FibGUgSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwoKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgaXJkcF9pZl9zdG9wKGlmcCk7CiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAoaXBfaXJkcF9zaHV0ZG93biwKICAgICAgIGlwX2lyZHBfc2h1dGRvd25fY21kLAogICAgICAgImlwIGlyZHAgc2h1dGRvd24iLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHNodXRkb3duIG9uIHRoaXMgaW50ZXJmYWNlXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwoKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgaXJkcF9pZl9zaHV0ZG93bihpZnApOwogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKG5vX2lwX2lyZHBfc2h1dGRvd24sCiAgICAgICBub19pcF9pcmRwX3NodXRkb3duX2NtZCwKICAgICAgICJubyBpcCBpcmRwIHNodXRkb3duIiwKICAgICAgIE5PX1NUUgogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG5vIHNodXRkb3duIG9uIHRoaXMgaW50ZXJmYWNlXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwoKICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OwogIGlmKCFpZnApIHsKCSAgcmV0dXJuIENNRF9XQVJOSU5HOwogIH0KCiAgaXJkcF9pZl9ub19zaHV0ZG93bihpZnApOwogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfaG9sZHRpbWUsCiAgICAgICBpcF9pcmRwX2hvbGR0aW1lX2NtZCwKICAgICAgICJpcCBpcmRwIGhvbGR0aW1lIDwwLTkwMDA+IiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgogICAgICAgIlNldCBob2xkdGltZSB2YWx1ZVxuIgogICAgICAgIkhvbGR0aW1lIHZhbHVlIGluIHNlY29uZHMuIERlZmF1bHQgaXMgMTgwMCBzZWNvbmRzXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPkxpZmV0aW1lID0gYXRvaShhcmd2WzBdKTsKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCkRFRlVOIChpcF9pcmRwX21pbmFkdmVydGludGVydmFsLAogICAgICAgaXBfaXJkcF9taW5hZHZlcnRpbnRlcnZhbF9jbWQsCiAgICAgICAiaXAgaXJkcCBtaW5hZHZlcnRpbnRlcnZhbCA8My0xODAwPiIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJTZXQgbWluaW11bSB0aW1lIGJldHdlZW4gYWR2ZXJ0aXNlbWVudFxuIgogICAgICAgIk1pbmltdW0gYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlmKCAodW5zaWduZWQpIGF0b2koYXJndlswXSkgPD0gaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwpIHsKICAgICAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbMF0pOwoKICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOwogIH0KCiAgdnR5X291dCAodnR5LCAiSUNNUCB3YXJuaW5nIG1heGFkdmVydGludGVydmFsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBtaW5hZHZlcnRpbnRlcnZhbCVzIiwgCgkgICAgIFZUWV9ORVdMSU5FKTsKCiAgdnR5X291dCAodnR5LCAiUGxlYXNlIGNvcnJlY3QhJXMiLCAKCSAgICAgVlRZX05FV0xJTkUpOwogIHJldHVybiBDTURfV0FSTklORzsKfQoKREVGVU4gKGlwX2lyZHBfbWF4YWR2ZXJ0aW50ZXJ2YWwsCiAgICAgICBpcF9pcmRwX21heGFkdmVydGludGVydmFsX2NtZCwKICAgICAgICJpcCBpcmRwIG1heGFkdmVydGludGVydmFsIDw0LTE4MDA+IiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgogICAgICAgIlNldCBtYXhpbXVtIHRpbWUgYmV0d2VlbiBhZHZlcnRpc2VtZW50XG4iCiAgICAgICAiTWF4aW11bSBhZHZlcnRpc2VtZW50IGludGVydmFsIGluIHNlY29uZHNcbiIpCnsKICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgc3RydWN0IHplYnJhX2lmICp6aTsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIHppPWlmcC0+aW5mbzsKICBpcmRwPSZ6aS0+aXJkcDsKCgogIGlmKCBpcmRwLT5NaW5BZHZlcnRJbnRlcnZhbCA8PSAodW5zaWduZWQpIGF0b2koYXJndlswXSkgKSB7CiAgICBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CgogICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CiAgfQoKICB2dHlfb3V0ICh2dHksICJJQ01QIHdhcm5pbmcgbWF4YWR2ZXJ0aW50ZXJ2YWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIG1pbmFkdmVydGludGVydmFsJXMiLCAKCSAgICAgVlRZX05FV0xJTkUpOwoKICB2dHlfb3V0ICh2dHksICJQbGVhc2UgY29ycmVjdCElcyIsIAoJICAgICBWVFlfTkVXTElORSk7CiAgcmV0dXJuIENNRF9XQVJOSU5HOwp9CgovKiBERUZVTiBuZWVkcyB0byBiZSBmaXhlZCBmb3IgbmVnYXRpdmUgcmFuYWdlcy4uLgogKiAiaXAgaXJkcCBwcmVmZXJlbmNlIDwtMjE0NzQ4MzY0OC0yMTQ3NDgzNjQ3PiIsCiAqIEJlIHBvc2l0aXZlIGZvciBub3cuIDotKQogKi8KCkRFRlVOIChpcF9pcmRwX3ByZWZlcmVuY2UsCiAgICAgICBpcF9pcmRwX3ByZWZlcmVuY2VfY21kLAogICAgICAgImlwIGlyZHAgcHJlZmVyZW5jZSA8MC0yMTQ3NDgzNjQ3PiIsCiAgICAgICBJUF9TVFIKICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJTZXQgZGVmYXVsdCBwcmVmZXJlbmNlIGxldmVsIGZvciB0aGlzIGludGVyZmFjZVxuIgogICAgICAgIlByZWZlcmVuY2UgbGV2ZWxcbiIpCnsKICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgc3RydWN0IHplYnJhX2lmICp6aTsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIHppPWlmcC0+aW5mbzsKICBpcmRwPSZ6aS0+aXJkcDsKCiAgaXJkcC0+UHJlZmVyZW5jZSA9IGF0b2koYXJndlswXSk7CiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAoaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2UsCiAgICAgICBpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQsCiAgICAgICAiaXAgaXJkcCBhZGRyZXNzIEEuQi5DLkQgcHJlZmVyZW5jZSA8MC0yMTQ3NDgzNjQ3PiIsCiAgICAgICBJUF9TVFIKICAgICAgICJBbHRlciBJQ01QIFJvdXRlciBkaXNjb3ZlcnkgcHJlZmVyZW5jZSB0aGlzIGludGVyZmFjZVxuIgogICAgICAgIlNwZWNpZnkgSVJEUCBub24tZGVmYXVsdCBwcmVmZXJlbmNlIHRvIGFkdmVydGlzZVxuIgogICAgICAgIlNldCBJUkRQIGFkZHJlc3MgZm9yIGFkdmVydGlzZVxuIgogICAgICAgIlByZWZlcmVuY2UgbGV2ZWxcbiIpCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGluX2FkZHIgaXA7IAogIGludCBwcmVmOwogIGludCByZXQ7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIHN0cnVjdCBBZHYgKmFkdjsKCiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIHppPWlmcC0+aW5mbzsKICBpcmRwPSZ6aS0+aXJkcDsKCiAgcmV0ID0gaW5ldF9hdG9uKGFyZ3ZbMF0sICZpcCk7CiAgaWYoIXJldCkgcmV0dXJuIENNRF9XQVJOSU5HOwoKICBwcmVmID0gYXRvaShhcmd2WzFdKTsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaXJkcC0+QWR2UHJlZkxpc3QsIG5vZGUsIGFkdikpCiAgICBpZihhZHYtPmlwLnNfYWRkciA9PSBpcC5zX2FkZHIpIAogICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CgogIGFkdiA9IEFkdl9uZXcoKTsKICBhZHYtPmlwID0gaXA7CiAgYWR2LT5wcmVmID0gcHJlZjsKICBsaXN0bm9kZV9hZGQoaXJkcC0+QWR2UHJlZkxpc3QsIGFkdik7CgogIHJldHVybiBDTURfU1VDQ0VTUzsKCn0KCkRFRlVOIChub19pcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZSwKICAgICAgIG5vX2lwX2lyZHBfYWRkcmVzc19wcmVmZXJlbmNlX2NtZCwKICAgICAgICJubyBpcCBpcmRwIGFkZHJlc3MgQS5CLkMuRCBwcmVmZXJlbmNlIDwwLTIxNDc0ODM2NDc+IiwKICAgICAgIE5PX1NUUgogICAgICAgSVBfU1RSCiAgICAgICAiQWx0ZXIgSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2VcbiIKICAgICAgICJSZW1vdmVzIElSRFAgbm9uLWRlZmF1bHQgcHJlZmVyZW5jZVxuIgogICAgICAgIlNlbGVjdCBJUkRQIGFkZHJlc3NcbiIKICAgICAgICJPbGQgcHJlZmVyZW5jZSBsZXZlbFxuIikKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBpbl9hZGRyIGlwOyAKICBpbnQgcHJlZjsKICBpbnQgcmV0OwogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBzdHJ1Y3QgQWR2ICphZHY7CgogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIHJldCA9IGluZXRfYXRvbihhcmd2WzBdLCAmaXApOwogIGlmICghcmV0KSAKICAgIHJldHVybiBDTURfV0FSTklORzsKCiAgcHJlZiA9IGF0b2koYXJndlsxXSk7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFMgKGlyZHAtPkFkdlByZWZMaXN0LCBub2RlLCBubm9kZSwgYWR2KSkKICAgIHsKICAgICAgaWYoYWR2LT5pcC5zX2FkZHIgPT0gaXAuc19hZGRyICkKICAgICAgICB7CiAgICAgICAgICBsaXN0bm9kZV9kZWxldGUoaXJkcC0+QWR2UHJlZkxpc3QsIGFkdik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgCiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgpERUZVTiAoaXBfaXJkcF9kZWJ1Z19tZXNzYWdlcywKICAgICAgIGlwX2lyZHBfZGVidWdfbWVzc2FnZXNfY21kLAogICAgICAgImlwIGlyZHAgZGVidWcgbWVzc2FnZXMiLAogICAgICAgSVBfU1RSCiAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IGRlYnVnIEF2ZXJ0cy4gYW5kIFNvbGljaXRzIChzaG9ydClcbiIpCnsKICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CiAgc3RydWN0IHplYnJhX2lmICp6aTsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CiAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKICBpZighaWZwKSB7CgkgIHJldHVybiBDTURfV0FSTklORzsKICB9CgogIHppPWlmcC0+aW5mbzsKICBpcmRwPSZ6aS0+aXJkcDsKCiAgaXJkcC0+ZmxhZ3MgfD0gSUZfREVCVUdfTUVTU0FHRVM7CgogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfZGVidWdfbWlzYywKICAgICAgIGlwX2lyZHBfZGVidWdfbWlzY19jbWQsCiAgICAgICAiaXAgaXJkcCBkZWJ1ZyBtaXNjIiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX01JU0M7CgogIHJldHVybiBDTURfU1VDQ0VTUzsKfQoKREVGVU4gKGlwX2lyZHBfZGVidWdfcGFja2V0LAogICAgICAgaXBfaXJkcF9kZWJ1Z19wYWNrZXRfY21kLAogICAgICAgImlwIGlyZHAgZGVidWcgcGFja2V0IiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX1BBQ0tFVDsKCiAgcmV0dXJuIENNRF9TVUNDRVNTOwp9CgoKREVGVU4gKGlwX2lyZHBfZGVidWdfZGlzYWJsZSwKICAgICAgIGlwX2lyZHBfZGVidWdfZGlzYWJsZV9jbWQsCiAgICAgICAiaXAgaXJkcCBkZWJ1ZyBkaXNhYmxlIiwKICAgICAgIElQX1NUUgogICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQp7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwogIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CiAgaWYoIWlmcCkgewoJICByZXR1cm4gQ01EX1dBUk5JTkc7CiAgfQoKICB6aT1pZnAtPmluZm87CiAgaXJkcD0memktPmlyZHA7CgogIGlyZHAtPmZsYWdzICY9IH5JRl9ERUJVR19QQUNLRVQ7CiAgaXJkcC0+ZmxhZ3MgJj0gfklGX0RFQlVHX01FU1NBR0VTOwogIGlyZHAtPmZsYWdzICY9IH5JRl9ERUJVR19NSVNDOwoKICByZXR1cm4gQ01EX1NVQ0NFU1M7Cn0KCnZvaWQKaXJkcF9pbml0ICgpCnsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9icm9hZGNhc3RfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9tdWx0aWNhc3RfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmbm9faXBfaXJkcF9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX3NodXRkb3duX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJm5vX2lwX2lyZHBfc2h1dGRvd25fY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9ob2xkdGltZV9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX21heGFkdmVydGludGVydmFsX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfbWluYWR2ZXJ0aW50ZXJ2YWxfY21kKTsKICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9wcmVmZXJlbmNlX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfYWRkcmVzc19wcmVmZXJlbmNlX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJm5vX2lwX2lyZHBfYWRkcmVzc19wcmVmZXJlbmNlX2NtZCk7CgogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX21lc3NhZ2VzX2NtZCk7CiAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfZGVidWdfbWlzY19jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX3BhY2tldF9jbWQpOwogIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX2Rpc2FibGVfY21kKTsKfQoKI2VuZGlmIC8qIEhBVkVfSVJEUCAqLwo=