LyoKICogIFRDUCBNSUIgZ3JvdXAgVGFibGUgaW1wbGVtZW50YXRpb24gLSB0Y3BUYWJsZS5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlICJtaWJJSV9jb21tb24uaCIKCiNpZiBIQVZFX05FVElORVRfVENQX0gKI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1RDUF9USU1FUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9UQ1BJUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcGlwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1RDUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC90Y3BfdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRMSU5LX05FVExJTktfSAojaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CiNpbmNsdWRlIDxuZXRsaW5rL21zZy5oPgojaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2luY2x1ZGUgInRjcC5oIgojaW5jbHVkZSAidGNwVGFibGUuaCIKCiNpZmRlZiBocHV4MTEKI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCW1pYl90Y3BDb25uRW50IAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlTdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJTG9jYWxBZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX0xPQ0FMUE9SVAlMb2NhbFBvcnQgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFQUREUkVTUwlSZW1BZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJUmVtUG9ydCAKI2RlZmluZQlUQ1BUQUJMRV9JU19UQUJMRQojZWxzZQoKI2lmZGVmIHNvbGFyaXMyCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfdGNwQ29ubkVudHJ5X3MgbmV0c25tcF90Y3BDb25uRW50cnk7CnN0cnVjdCBuZXRzbm1wX3RjcENvbm5FbnRyeV9zIHsKICAgIG1pYjJfdGNwQ29ubkVudHJ5X3QgICBlbnRyeTsKICAgIG5ldHNubXBfdGNwQ29ubkVudHJ5ICppbnBfbmV4dDsKfTsKI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfdGNwQ29ubkVudHJ5CiNkZWZpbmUJVENQVEFCTEVfU1RBVEUJCWVudHJ5LnRjcENvbm5TdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJZW50cnkudGNwQ29ubkxvY2FsQWRkcmVzcyAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTFBPUlQJZW50cnkudGNwQ29ubkxvY2FsUG9ydCAKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVBRERSRVNTCWVudHJ5LnRjcENvbm5SZW1BZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJZW50cnkudGNwQ29ublJlbVBvcnQgCiNkZWZpbmUJVENQVEFCTEVfSVNfTElOS0VEX0xJU1QKI2Vsc2UKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCU1JQl9UQ1BST1cKI2RlZmluZQlUQ1BUQUJMRV9TVEFURQkJZHdTdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJZHdMb2NhbEFkZHIKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTFBPUlQJZHdMb2NhbFBvcnQgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFQUREUkVTUwlkd1JlbW90ZUFkZHIgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFUE9SVAlkd1JlbW90ZVBvcnQgCiNkZWZpbmUJVENQVEFCTEVfSVNfVEFCTEUKI2Vsc2UKCiNpZmRlZiBsaW51eAojZGVmaW5lCVRDUFRBQkxFX0VOVFJZX1RZUEUJc3RydWN0IGlucGNiIAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlpbnBfc3RhdGUgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxBRERSRVNTCWlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxQT1JUCWlucF9scG9ydAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URUFERFJFU1MJaW5wX2ZhZGRyLnNfYWRkciAKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVQT1JUCWlucF9mcG9ydAojZGVmaW5lCVRDUFRBQkxFX0lTX0xJTktFRF9MSVNUCgojZWxzZQkJCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwoKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pbnBjYl9zIG5ldHNubXBfaW5wY2I7CnN0cnVjdCBuZXRzbm1wX2lucGNiX3MgewogICAgc3RydWN0IGlucGNiICAgIHBjYjsKICAgIGludCAgICAgICAgICAgICBzdGF0ZTsKICAgIG5ldHNubXBfaW5wY2IgICppbnBfbmV4dDsKfTsKI2RlZmluZSBJTlBfTkVYVF9TWU1CT0wJCWlucF9uZXh0CiNkZWZpbmUJVENQVEFCTEVfRU5UUllfVFlQRQluZXRzbm1wX2lucGNiIAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlzdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJcGNiLmlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxQT1JUCXBjYi5pbnBfbHBvcnQKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVBRERSRVNTCXBjYi5pbnBfZmFkZHIuc19hZGRyIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJcGNiLmlucF9mcG9ydAojZGVmaW5lCVRDUFRBQkxFX0lTX0xJTktFRF9MSVNUCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCgkJCQkvKiBIZWFkIG9mIGxpbmtlZCBsaXN0LCBvciByb290IG9mIHRhYmxlICovClRDUFRBQkxFX0VOVFJZX1RZUEUJKnRjcF9oZWFkICA9IE5VTEw7CmludCAgICAgICAgICAgICAgICAgICAgICB0Y3Bfc2l6ZSAgPSAwOwkvKiBPbmx5IHVzZWQgZm9yIHRhYmxlLWJhc2VkIHN5c3RlbXMgKi8KaW50ICAgICAgICAgICAgICAgICAgICAgIHRjcF9lc3RhYiA9IDA7CgoKCS8qCgkgKgoJICogSW5pdGlhbGl6YXRpb24gYW5kIGhhbmRsZXIgcm91dGluZXMgYXJlIGNvbW1vbiB0byBhbGwgYXJjaGl0ZWN0dXJlcwoJICoKCSAqLwojaWZuZGVmIE1JQl9TVEFUU19DQUNIRV9USU1FT1VUCiNkZWZpbmUgTUlCX1NUQVRTX0NBQ0hFX1RJTUVPVVQJNQojZW5kaWYKI2lmbmRlZiBUQ1BfU1RBVFNfQ0FDSEVfVElNRU9VVAojZGVmaW5lIFRDUF9TVEFUU19DQUNIRV9USU1FT1VUCU1JQl9TVEFUU19DQUNIRV9USU1FT1VUCiNlbmRpZgoKI2lmIGRlZmluZWQoVENQX1BPUlRTX0lOX0hPU1RfT1JERVIpICYmIFRDUF9QT1JUU19JTl9IT1NUX09SREVSCiNkZWZpbmUgVENQX1BPUlRfVE9fSE9TVF9PUkRFUih4KSB4CiNlbHNlCiNkZWZpbmUgVENQX1BPUlRfVE9fSE9TVF9PUkRFUih4KSBudG9ocyh4KQojZW5kaWYKCnZvaWQKaW5pdF90Y3BUYWJsZSh2b2lkKQp7CiAgICBjb25zdCBvaWQgdGNwVGFibGVfb2lkW10gPSB7IFNOTVBfT0lEX01JQjIsIDYsIDEzIH07CgogICAgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mbyAqdGFibGVfaW5mbzsKICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAgICAgICAgICAgKmlpbmZvOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbzsKICAgIGludCByYzsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiSW5pdGlhbGlzaW5nIFRDUCBUYWJsZVxuIikpOwogICAgLyoKICAgICAqIENyZWF0ZSB0aGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBkZWZpbmUgdGhlIGluZGV4aW5nLi4uLgogICAgICovCiAgICB0YWJsZV9pbmZvID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvKTsKICAgIGlmICghdGFibGVfaW5mbykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG5ldHNubXBfdGFibGVfaGVscGVyX2FkZF9pbmRleGVzKHRhYmxlX2luZm8sIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fSU5URUdFUiwgMCk7CiAgICB0YWJsZV9pbmZvLT5taW5fY29sdW1uID0gVENQQ09OTlNUQVRFOwogICAgdGFibGVfaW5mby0+bWF4X2NvbHVtbiA9IFRDUENPTk5SRU1PVEVQT1JUOwoKCiAgICAvKgogICAgICogLi4uLiBhbmQgaXRlcmF0aW9uIGluZm9ybWF0aW9uIC4uLi4KICAgICAqLwogICAgaWluZm8gICAgICA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9pdGVyYXRvcl9pbmZvKTsKICAgIGlmICghaWluZm8pIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpaW5mby0+Z2V0X2ZpcnN0X2RhdGFfcG9pbnQgPSB0Y3BUYWJsZV9maXJzdF9lbnRyeTsKICAgIGlpbmZvLT5nZXRfbmV4dF9kYXRhX3BvaW50ICA9IHRjcFRhYmxlX25leHRfZW50cnk7CiAgICBpaW5mby0+dGFibGVfcmVnaW5mbyAgICAgICAgPSB0YWJsZV9pbmZvOwojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIGlpbmZvLT5mbGFncyAgICAgICAgICAgICAgIHw9IE5FVFNOTVBfSVRFUkFUT1JfRkxBR19TT1JURUQ7CiNlbmRpZiAvKiBXSU4zMiB8fCBjeWd3aW4gKi8KCgogICAgLyoKICAgICAqIC4uLi4gYW5kIHJlZ2lzdGVyIHRoZSB0YWJsZSB3aXRoIHRoZSBhZ2VudC4KICAgICAqLwogICAgcmVnaW5mbyA9IG5ldHNubXBfY3JlYXRlX2hhbmRsZXJfcmVnaXN0cmF0aW9uKCJ0Y3BUYWJsZSIsCiAgICAgICAgICAgIHRjcFRhYmxlX2hhbmRsZXIsCiAgICAgICAgICAgIHRjcFRhYmxlX29pZCwgT0lEX0xFTkdUSCh0Y3BUYWJsZV9vaWQpLAogICAgICAgICAgICBIQU5ETEVSX0NBTl9ST05MWSksCiAgICByYyA9IG5ldHNubXBfcmVnaXN0ZXJfdGFibGVfaXRlcmF0b3IocmVnaW5mbywgaWluZm8pOwogICAgaWYgKHJjICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIC4uLi4gd2l0aCBhIGxvY2FsIGNhY2hlCiAgICAgKiAgICAoZXhjZXB0IGZvciBTb2xhcmlzLCB3aGljaCB1c2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoKQogICAgICovCiAgICBuZXRzbm1wX2luamVjdF9oYW5kbGVyKCByZWdpbmZvLAoJCSAgICBuZXRzbm1wX2dldF9jYWNoZV9oYW5kbGVyKFRDUF9TVEFUU19DQUNIRV9USU1FT1VULAoJCQkgICAJCXRjcFRhYmxlX2xvYWQsIHRjcFRhYmxlX2ZyZWUsCgkJCQkJdGNwVGFibGVfb2lkLCBPSURfTEVOR1RIKHRjcFRhYmxlX29pZCkpKTsKfQoKCgppbnQKdGNwVGFibGVfaGFuZGxlcihuZXRzbm1wX21pYl9oYW5kbGVyICAgICAgICAgICpoYW5kbGVyLAogICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gICAqcmVxaW5mbywKICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAgICAgICAgICpyZXF1ZXN0cykKewogICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gICpyZXF1ZXN0OwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICpyZXF1ZXN0dmI7CiAgICBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mbyAqdGFibGVfaW5mbzsKICAgIFRDUFRBQkxFX0VOVFJZX1RZUEUJICAqZW50cnk7CiAgICBvaWQgICAgICBzdWJpZDsKICAgIGxvbmcgICAgIHBvcnQ7CiAgICBsb25nICAgICBzdGF0ZTsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiSGFuZGxlciAtIG1vZGUgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc2VfZmluZF9sYWJlbF9pbl9zbGlzdCgiYWdlbnRfbW9kZSIsIHJlcWluZm8tPm1vZGUpKSk7CiAgICBzd2l0Y2ggKHJlcWluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9HRVQ6CiAgICAgICAgZm9yIChyZXF1ZXN0PXJlcXVlc3RzOyByZXF1ZXN0OyByZXF1ZXN0PXJlcXVlc3QtPm5leHQpIHsKICAgICAgICAgICAgcmVxdWVzdHZiID0gcmVxdWVzdC0+cmVxdWVzdHZiOwogICAgICAgICAgICBERUJVR01TR1RMKCggIm1pYklJL3RjcFRhYmxlIiwgIm9pZDogIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoIm1pYklJL3RjcFRhYmxlIiwgcmVxdWVzdHZiLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHZiLT5uYW1lX2xlbmd0aCkpOwogICAgICAgICAgICBERUJVR01TRygoICAgIm1pYklJL3RjcFRhYmxlIiwgIlxuIikpOwoKICAgICAgICAgICAgZW50cnkgPSAoVENQVEFCTEVfRU5UUllfVFlQRSAqKW5ldHNubXBfZXh0cmFjdF9pdGVyYXRvcl9jb250ZXh0KHJlcXVlc3QpOwogICAgICAgICAgICBpZiAoIWVudHJ5KQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIHRhYmxlX2luZm8gPSBuZXRzbm1wX2V4dHJhY3RfdGFibGVfaW5mbyhyZXF1ZXN0KTsKICAgICAgICAgICAgc3ViaWQgICAgICA9IHRhYmxlX2luZm8tPmNvbG51bTsKCiAgICAgICAgICAgIHN3aXRjaCAoc3ViaWQpIHsKICAgICAgICAgICAgY2FzZSBUQ1BDT05OU1RBVEU6CiAgICAgICAgICAgICAgICBzdGF0ZSA9IGVudHJ5LT5UQ1BUQUJMRV9TVEFURTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmc3RhdGUsIHNpemVvZihzdGF0ZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVENQQ09OTkxPQ0FMQUREUkVTUzoKI2lmIGRlZmluZWQob3NmNSkgJiYgZGVmaW5lZChJTjZfRVhUUkFDVF9WNEFERFIpCgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIqKUlONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSkpOwojZWxzZQoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSVBBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopJmVudHJ5LT5UQ1BUQUJMRV9MT0NBTEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW50cnktPlRDUFRBQkxFX0xPQ0FMQUREUkVTUykpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFRDUENPTk5MT0NBTFBPUlQ6CiAgICAgICAgICAgICAgICBwb3J0ID0gVENQX1BPUlRfVE9fSE9TVF9PUkRFUigodV9zaG9ydCllbnRyeS0+VENQVEFCTEVfTE9DQUxQT1JUKTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFRDUENPTk5SRU1PVEVBRERSRVNTOgojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpKSk7CiNlbHNlCgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmZW50cnktPlRDUFRBQkxFX1JFTU9URUFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW50cnktPlRDUFRBQkxFX1JFTU9URUFERFJFU1MpKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBUQ1BDT05OUkVNT1RFUE9SVDoKICAgICAgICAgICAgICAgIHBvcnQgPSBUQ1BfUE9SVF9UT19IT1NUX09SREVSKCh1X3Nob3J0KWVudHJ5LT5UQ1BUQUJMRV9SRU1PVEVQT1JUKTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfR0VUTkVYVDoKICAgIGNhc2UgTU9ERV9HRVRCVUxLOgogICAgY2FzZSBNT0RFX1NFVF9SRVNFUlZFMToKICAgIGNhc2UgTU9ERV9TRVRfUkVTRVJWRTI6CiAgICBjYXNlIE1PREVfU0VUX0FDVElPTjoKICAgIGNhc2UgTU9ERV9TRVRfQ09NTUlUOgogICAgY2FzZSBNT0RFX1NFVF9GUkVFOgogICAgY2FzZSBNT0RFX1NFVF9VTkRPOgogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAibWliSUkvdGNwVGFibGU6IFVuc3VwcG9ydGVkIG1vZGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcWluZm8tPm1vZGUpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgIm1pYklJL3RjcFRhYmxlOiBVbnJlY29nbmlzZWQgbW9kZSAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaW5mby0+bW9kZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludApUQ1BfQ291bnRfQ29ubmVjdGlvbnMoIHZvaWQgKSB7CiAgICB0Y3BUYWJsZV9sb2FkKE5VTEwsIE5VTEwpOwogICAgcmV0dXJuIHRjcF9lc3RhYjsKfQoKCS8qCgkgKiBUd28gZm9ybXMgb2YgaXRlcmF0aW9uIGhvb2sgcm91dGluZXM6CgkgKiAgICBPbmUgZm9yIHdoZW4gdGhlIFRDUCB0YWJsZSBpcyBzdG9yZWQgYXMgYSB0YWJsZQoJICogICAgT25lIGZvciB3aGVuIHRoZSBUQ1AgdGFibGUgaXMgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3QKCSAqCgkgKiBBbHNvIGFwcGxpZXMgdG8gdGhlIGNhY2hlLWhhbmRsZXIgZnJlZSByb3V0aW5lCgkgKi8KCiNpZmRlZglUQ1BUQUJMRV9JU19UQUJMRQpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp0Y3BUYWJsZV9maXJzdF9lbnRyeSh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIC8qCiAgICAgKiBYWFggLSBIb3cgY2FuIHdlIHRlbGwgaWYgdGhlIGNhY2hlIGlzIHZhbGlkPwogICAgICogICAgICAgTm8gYWNjZXNzIHRvICdyZXFpbmZvJwogICAgICovCiAgICBpZiAodGNwX3NpemUgPT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogUG9pbnQgdG8gdGhlIGZpcnN0IGVudHJ5LCBhbmQgdXNlIHRoZQogICAgICogJ25leHRfZW50cnknIGhvb2sgdG8gcmV0cmlldmUgdGhpcyByb3cKICAgICAqLwogICAgKmxvb3BfY29udGV4dCA9IDA7CiAgICByZXR1cm4gdGNwVGFibGVfbmV4dF9lbnRyeSggbG9vcF9jb250ZXh0LCBkYXRhX2NvbnRleHQsIGluZGV4LCBkYXRhICk7Cn0KCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnRjcFRhYmxlX25leHRfZW50cnkoIHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgaW50IGkgPSAoaW50KSpsb29wX2NvbnRleHQ7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmlkeDsKICAgIGxvbmcgcG9ydDsKCiAgICBpZiAodGNwX3NpemUgPCBpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgdGhlIGluZGV4aW5nIGZvciB0aGUgc3BlY2lmaWVkIHJvdy4uLgogICAgICovCiAgICBpZHggPSBpbmRleDsKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICBwb3J0ID0gbnRvaGwoKHVfbG9uZyl0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9MT0NBTEFERFJFU1MpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciAqKSZwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9MT0NBTEFERFJFU1MpKTsKI2Vsc2UKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIgKikmdGNwX2hlYWRbaV0uVENQVEFCTEVfTE9DQUxBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9MT0NBTEFERFJFU1MpKTsKI2VuZGlmCgogICAgcG9ydCA9IFRDUF9QT1JUX1RPX0hPU1RfT1JERVIoKHVfc2hvcnQpdGNwX2hlYWRbaV0uVENQVEFCTEVfTE9DQUxQT1JUKTsKICAgIGlkeCA9IGlkeC0+bmV4dF92YXJpYWJsZTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIqKSZwb3J0LCBzaXplb2YocG9ydCkpOwoKICAgIGlkeCA9IGlkeC0+bmV4dF92YXJpYWJsZTsKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICBwb3J0ID0gbnRvaGwoKHVfbG9uZyl0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9SRU1PVEVBRERSRVNTKTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIgKikmcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwX2hlYWRbaV0uVENQVEFCTEVfUkVNT1RFQUREUkVTUykpOwojZWxzZQogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciAqKSZ0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9SRU1PVEVBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9SRU1PVEVBRERSRVNTKSk7CiNlbmRpZgoKICAgIHBvcnQgPSBUQ1BfUE9SVF9UT19IT1NUX09SREVSKCh1X3Nob3J0KXRjcF9oZWFkW2ldLlRDUFRBQkxFX1JFTU9URVBPUlQpOwogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CgogICAgLyoKICAgICAqIC4uLiByZXR1cm4gdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIHJvdywKICAgICAqIGFuZCB1cGRhdGUgdGhlIGxvb3AgY29udGV4dCByZWFkeSBmb3IgdGhlIG5leHQgb25lLgogICAgICovCiAgICAqZGF0YV9jb250ZXh0ID0gKHZvaWQqKSZ0Y3BfaGVhZFtpXTsKICAgICpsb29wX2NvbnRleHQgPSAodm9pZCopKytpOwoKICAgIHJldHVybiBpbmRleDsKfQoKdm9pZAp0Y3BUYWJsZV9mcmVlKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICptYWdpYykKewojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIGlmICh0Y3BfaGVhZCkgewoJCS8qIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzIGEgY291bnQgZm9sbG93ZWQgYnkgdGFibGUgZW50cmllcyAqLwoJCWZyZWUoKGNoYXIgKikodGNwX2hlYWQpIC0gc2l6ZW9mKERXT1JEKSk7Cgl9CiNlbHNlCglpZiAodGNwX2hlYWQpCiAgICAgICAgZnJlZSh0Y3BfaGVhZCk7CiNlbmRpZgogICAgdGNwX2hlYWQgID0gTlVMTDsKICAgIHRjcF9zaXplICA9IDA7CiAgICB0Y3BfZXN0YWIgPSAwOwp9CiNlbHNlCiNpZmRlZiBUQ1BUQUJMRV9JU19MSU5LRURfTElTVApuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp0Y3BUYWJsZV9maXJzdF9lbnRyeSh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIC8qCiAgICAgKiBYWFggLSBIb3cgY2FuIHdlIHRlbGwgaWYgdGhlIGNhY2hlIGlzIHZhbGlkPwogICAgICogICAgICAgTm8gYWNjZXNzIHRvICdyZXFpbmZvJwogICAgICovCiAgICBpZiAodGNwX2hlYWQgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogUG9pbnQgdG8gdGhlIGZpcnN0IGVudHJ5LCBhbmQgdXNlIHRoZQogICAgICogJ25leHRfZW50cnknIGhvb2sgdG8gcmV0cmlldmUgdGhpcyByb3cKICAgICAqLwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKil0Y3BfaGVhZDsKICAgIHJldHVybiB0Y3BUYWJsZV9uZXh0X2VudHJ5KCBsb29wX2NvbnRleHQsIGRhdGFfY29udGV4dCwgaW5kZXgsIGRhdGEgKTsKfQoKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdGNwVGFibGVfbmV4dF9lbnRyeSggdm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICBUQ1BUQUJMRV9FTlRSWV9UWVBFCSAqZW50cnkgPSAoVENQVEFCTEVfRU5UUllfVFlQRSAqKSpsb29wX2NvbnRleHQ7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmlkeDsKICAgIGxvbmcgYWRkciwgcG9ydDsKCiAgICBpZiAoIWVudHJ5KQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgdGhlIGluZGV4aW5nIGZvciB0aGUgc3BlY2lmaWVkIHJvdy4uLgogICAgICovCiAgICBpZHggPSBpbmRleDsKI2lmIGRlZmluZWQob3NmNSkgJiYgZGVmaW5lZChJTjZfRVhUUkFDVF9WNEFERFIpCiAgICBhZGRyID0gbnRvaGwoSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkcikpOwojZWxzZQogICAgYWRkciA9IG50b2hsKGVudHJ5LT5UQ1BUQUJMRV9MT0NBTEFERFJFU1MpOwojZW5kaWYKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKCiAgICBwb3J0ID0gVENQX1BPUlRfVE9fSE9TVF9PUkRFUihlbnRyeS0+VENQVEFCTEVfTE9DQUxQT1JUKTsKICAgIGlkeCA9IGlkeC0+bmV4dF92YXJpYWJsZTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIqKSZwb3J0LCBzaXplb2YocG9ydCkpOwoKICAgIGlkeCA9IGlkeC0+bmV4dF92YXJpYWJsZTsKI2lmIGRlZmluZWQob3NmNSkgJiYgZGVmaW5lZChJTjZfRVhUUkFDVF9WNEFERFIpCiAgICBhZGRyID0gbnRvaGwoSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9mYWRkcikpOwojZWxzZQogICAgYWRkciA9IG50b2hsKGVudHJ5LT5UQ1BUQUJMRV9SRU1PVEVBRERSRVNTKTsKI2VuZGlmCiAgICBzbm1wX3NldF92YXJfdmFsdWUoaWR4LCAodV9jaGFyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CgogICAgcG9ydCA9IFRDUF9QT1JUX1RPX0hPU1RfT1JERVIoZW50cnktPlRDUFRBQkxFX1JFTU9URVBPUlQpOwogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CgogICAgLyoKICAgICAqIC4uLiByZXR1cm4gdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIHJvdywKICAgICAqIGFuZCB1cGRhdGUgdGhlIGxvb3AgY29udGV4dCByZWFkeSBmb3IgdGhlIG5leHQgb25lLgogICAgICovCiAgICAqZGF0YV9jb250ZXh0ID0gKHZvaWQqKWVudHJ5OwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKillbnRyeS0+SU5QX05FWFRfU1lNQk9MOwogICAgcmV0dXJuIGluZGV4Owp9Cgp2b2lkCnRjcFRhYmxlX2ZyZWUobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKm1hZ2ljKQp7CiAgICBUQ1BUQUJMRV9FTlRSWV9UWVBFICpwOwogICAgd2hpbGUgKHRjcF9oZWFkKSB7CiAgICAgICAgcCA9IHRjcF9oZWFkOwogICAgICAgIHRjcF9oZWFkID0gdGNwX2hlYWQtPklOUF9ORVhUX1NZTUJPTDsKICAgICAgICBmcmVlKHApOwogICAgfQoKICAgIHRjcF9oZWFkICA9IE5VTEw7CiAgICB0Y3Bfc2l6ZSAgPSAwOwogICAgdGNwX2VzdGFiID0gMDsKfQojZW5kaWYJCS8qIFRDUFRBQkxFX0lTX0xJTktFRF9MSVNUICovCiNlbmRpZgkJLyogVENQVEFCTEVfSVNfVEFCTEUgKi8KCgoJLyoKCSAqCgkgKiBUaGUgY2FjaGUtaGFuZGxlciBsb2FkaW5nIHJvdXRpbmUgaXMgdGhlIG1haW4KCSAqICAgIHBsYWNlIGZvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZQoJICoKCSAqIExvYWQgaW50byBlaXRoZXIgYSB0YWJsZSBzdHJ1Y3R1cmUsIG9yIGEgbGlua2VkIGxpc3QKCSAqICAgIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZQoJICovCgoKI2lmZGVmIGhwdXgxMQppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBpbnQgICAgICAgICAgICAgZmQ7CiAgICBzdHJ1Y3Qgbm1wYXJtcyAgcDsKICAgIGludCAgICAgICAgICAgICB2YWwgPSAwOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgdGNwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgIHAub2JqaWQgPSBJRF90Y3BDb25uTnVtRW50OwogICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgJnZhbDsKICAgICAgICB1bGVuID0gc2l6ZW9mKGludCk7CiAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA9PSAwKQogICAgICAgICAgICB0Y3Bfc2l6ZSA9IHZhbDsKCiAgICAgICAgaWYgKHRjcF9zaXplID4gMCkgewogICAgICAgICAgICB1bGVuID0gKHVuc2lnbmVkKSB0Y3Bfc2l6ZSAqc2l6ZW9mKG1pYl90Y3BDb25uRW50KTsKICAgICAgICAgICAgdGNwX2hlYWQgPSAobWliX3RjcENvbm5FbnQgKikgbWFsbG9jKHVsZW4pOwogICAgICAgICAgICBwLm9iamlkID0gSURfdGNwQ29ublRhYmxlOwogICAgICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopIHRjcF9oZWFkOwogICAgICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA8IDApIHsKICAgICAgICAgICAgICAgIHRjcF9zaXplID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgIH0KCiAgICAvKgogICAgICogQ291bnQgdGhlIG51bWJlciBvZiBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucwogICAgICogUHJvYmFibHkgbm90IGFjdHVhbGx5IG5lY2Vzc2FyeSBmb3IgSFAtVVgKICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IHRjcF9zaXplOyBpKyspIHsKICAgICAgICBpZiAodGNwX2hlYWRbaV0uU3RhdGUgPT0gNSAvKiBlc3RhYmxpc2hlZCAqLyB8fAogICAgICAgICAgICB0Y3BfaGVhZFtpXS5TdGF0ZSA9PSA4IC8qICBjbG9zZVdhaXQgICovICkKICAgICAgICAgICAgdGNwX2VzdGFiKys7CiAgICB9CgogICAgaWYgKHRjcF9zaXplID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChocHV4MTEpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlIChocHV4MTEpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCiNpZmRlZiBsaW51eAoKLyogIHNlZSA8bmV0aW5ldC90Y3AuaD4gKi8KI2RlZmluZSBUQ1BfQUxMICgoMSA8PCAoVENQX0NMT1NJTkcgKyAxKSkgLSAxKQoKY29uc3Qgc3RhdGljIGludCBsaW51eF9zdGF0ZXNbMTJdID0geyAxLCA1LCAzLCA0LCA2LCA3LCAxMSwgMSwgOCwgOSwgMiwgMTAgfTsKCiNpZiBIQVZFX05FVExJTktfTkVUTElOS19ICnN0YXRpYyBpbnQKdGNwVGFibGVfbG9hZF9uZXRsaW5rKHZvaWQpCnsKCS8qICBUT0RPOiBwZXJoYXBzIHVzZSBwZXJtYW5lbnQgbmwgaGFuZGxlPyAqLwoJc3RydWN0IG5sX2hhbmRsZSAqbmwgPSBubF9oYW5kbGVfYWxsb2MoKTsKCXN0cnVjdCBpbmV0X2RpYWdfcmVxIHJlcSA9IHsKCQkuaWRpYWdfZmFtaWx5ID0gQUZfSU5FVCwKCQkuaWRpYWdfc3RhdGVzID0gVENQX0FMTCwKCX07CgoJc3RydWN0IG5sX21zZyAqbm07CgoJc3RydWN0IHNvY2thZGRyX25sIHBlZXI7Cgl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOwoJaW50IHJ1bm5pbmcgPSAxLCBsZW47CgoJaWYgKG5sID09IE5VTEwpIHsKCQlERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgaGFuZGxlXG4iKSk7CgkJc25tcF9sb2coTE9HX0VSUiwgInNubXBkOiBGYWlsZWQgdG8gYWxsb2NhdGUgbmV0bGluayBoYW5kbGVcbiIpOwoJCXJldHVybiAtMTsKCX0KCglpZiAobmxfY29ubmVjdChubCwgTkVUTElOS19JTkVUX0RJQUcpIDwgMCkgewoJCURFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gY29ubmVjdCB0byBuZXRsaW5rOiAlc1xuIiwgbmxfZ2V0ZXJyb3IoKSkpOwoJCXNubXBfbG9nKExPR19FUlIsICJzbm1wZDogQ291bGRuJ3QgY29ubmVjdCB0byBuZXRsaW5rOiAlc1xuIiwgbmxfZ2V0ZXJyb3IoKSk7CgkJbmxfaGFuZGxlX2Rlc3Ryb3kobmwpOwoJCXJldHVybiAtMTsKCX0KCglubSA9IG5sbXNnX2FsbG9jX3NpbXBsZShUQ1BESUFHX0dFVFNPQ0ssIE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0h8TkxNX0ZfUkVRVUVTVCk7CglubG1zZ19hcHBlbmQobm0sICZyZXEsIHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSksIDApOwoKCWlmIChubF9zZW5kX2F1dG9fY29tcGxldGUobmwsIG5tKSA8IDApIHsKCQlERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAibmxfc2VuZF9hdXRvY29tcGxldGUoKTogJXNcbiIsIG5sX2dldGVycm9yKCkpKTsKCQlzbm1wX2xvZyhMT0dfRVJSLCAic25tcGQ6IG5sX3NlbmRfYXV0b2NvbXBsZXRlKCk6ICVzXG4iLCBubF9nZXRlcnJvcigpKTsKCQlubF9oYW5kbGVfZGVzdHJveShubCk7CgkJcmV0dXJuIC0xOwoJfQoJbmxtc2dfZnJlZShubSk7CgoJd2hpbGUgKHJ1bm5pbmcpIHsKCQlzdHJ1Y3Qgbmxtc2doZHIgKmg7CgkJaWYgKChsZW4gPSBubF9yZWN2KG5sLCAmcGVlciwgJmJ1ZiwgTlVMTCkpIDw9IDApIHsKCQkJREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIm5sX3JlY3YoKTogJXNcbiIsIG5sX2dldGVycm9yKCkpKTsKCQkJc25tcF9sb2coTE9HX0VSUiwgInNubXBkOiBubF9yZWN2KCk6ICVzXG4iLCBubF9nZXRlcnJvcigpKTsKCQkJbmxfaGFuZGxlX2Rlc3Ryb3kobmwpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQloID0gKHN0cnVjdCBubG1zZ2hkciopYnVmOwoKCQl3aGlsZSAobmxtc2dfb2soaCwgbGVuKSkgewoJCQlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciA9IG5sbXNnX2RhdGEoaCk7CgkJCXN0cnVjdCBpbnBjYiAgICBwY2IsICpubmV3OwoKCQkJaWYgKGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSkgewoJCQkJcnVubmluZyA9IDA7CgkJCQlicmVhazsKCQkJfQoKCQkJciA9IG5sbXNnX2RhdGEoaCk7CgoJCQlpZiAoci0+aWRpYWdfZmFtaWx5ICE9IEFGX0lORVQpIHsKCQkJCWggPSBubG1zZ19uZXh0KGgsICZsZW4pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCW1lbWNweSgmcGNiLmlucF9sYWRkci5zX2FkZHIsIHItPmlkLmlkaWFnX3NyYywgci0+aWRpYWdfZmFtaWx5ID09IEFGX0lORVQgPyA0IDogNik7CgkJCW1lbWNweSgmcGNiLmlucF9mYWRkci5zX2FkZHIsIHItPmlkLmlkaWFnX2RzdCwgci0+aWRpYWdfZmFtaWx5ID09IEFGX0lORVQgPyA0IDogNik7CgoJCQlwY2IuaW5wX2xwb3J0ID0gci0+aWQuaWRpYWdfc3BvcnQ7CgkJCXBjYi5pbnBfZnBvcnQgPSByLT5pZC5pZGlhZ19kcG9ydDsKCgkJCXBjYi5pbnBfc3RhdGUgPSAoci0+aWRpYWdfc3RhdGUgJiAweGYpIDwgMTIgPyBsaW51eF9zdGF0ZXNbci0+aWRpYWdfc3RhdGUgJiAweGZdIDogMjsKCQkJaWYgKHBjYi5pbnBfc3RhdGUgPT0gNSAvKiBlc3RhYmxpc2hlZCAqLyB8fAoJCQkJcGNiLmlucF9zdGF0ZSA9PSA4IC8qICBjbG9zZVdhaXQgICovICkKCQkJCXRjcF9lc3RhYisrOwoJCQlwY2IudWlkID0gci0+aWRpYWdfdWlkOwoKCQkJbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYoc3RydWN0IGlucGNiKTsKCQkJaWYgKG5uZXcgPT0gTlVMTCkgewoJCQkJcnVubmluZyA9IDA7CgkJCQkvKiAgWFhYIHJlcG9ydCBtYWxsb2MgZXJyb3IgYW5kIHJldHVybiAtMT8gKi8KCQkJCWJyZWFrOwoJCQl9CgkJCW1lbWNweShubmV3LCAmcGNiLCBzaXplb2Yoc3RydWN0IGlucGNiKSk7CgkJCW5uZXctPmlucF9uZXh0ID0gdGNwX2hlYWQ7CgkJCXRjcF9oZWFkICAgICAgID0gbm5ldzsKCgkJCWggPSBubG1zZ19uZXh0KGgsICZsZW4pOwoJCX0KCQlmcmVlKGJ1Zik7Cgl9CgoJbmxfaGFuZGxlX2Rlc3Ryb3kobmwpOwoKCWlmICh0Y3BfaGVhZCkgewoJCURFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIHVzaW5nIG5ldGxpbmtcbiIpKTsKCQlyZXR1cm4gMDsKCX0KCURFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKG5ldGxpbmspXG4iKSk7CglyZXR1cm4gLTE7Cn0KI2VuZGlmCgppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBGSUxFICAgICAgICAgICAqaW47CiAgICBjaGFyICAgICAgICAgICAgbGluZVsyNTZdOwoKICAgIHRjcFRhYmxlX2ZyZWUoY2FjaGUsIE5VTEwpOwoKI2lmIEhBVkVfTkVUTElOS19ORVRMSU5LX0gKCWlmICh0Y3BUYWJsZV9sb2FkX25ldGxpbmsoKSA9PSAwKSB7CgkJcmV0dXJuIDA7Cgl9CiNlbmRpZgoKICAgIGlmICghKGluID0gZm9wZW4oIi9wcm9jL25ldC90Y3AiLCAiciIpKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKGxpbnV4MSlcbiIpKTsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic25tcGQ6IGNhbm5vdCBvcGVuIC9wcm9jL25ldC90Y3AgLi4uXG4iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqIHNjYW4gcHJvYy1maWxlIGFuZCBidWlsZCB1cCBhIGxpbmtlZCBsaXN0IAogICAgICogVGhpcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0IHVwIGluIHJldmVyc2UsCiAgICAgKiAgIGJ1dCBzaW5jZSB0aGUgZW50cmllcyBhcmUgdW5zb3J0ZWQsIHRoYXQgZG9lc24ndCBtYXR0ZXIuCiAgICAgKi8KICAgIHdoaWxlIChsaW5lID09IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CiAgICAgICAgc3RydWN0IGlucGNiICAgIHBjYiwgKm5uZXc7CiAgICAgICAgaW50ICAgICAgICAgICAgIHN0YXRlLCBscCwgZnAsIHVpZDsKCiAgICAgICAgaWYgKDYgIT0gc3NjYW5mKGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICIlKmQ6ICV4OiV4ICV4OiV4ICV4ICUqWDolKlggJSpYOiUqWCAlKlggJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAmcGNiLmlucF9sYWRkci5zX2FkZHIsICZscCwKICAgICAgICAgICAgICAgICAgICAgICAgJnBjYi5pbnBfZmFkZHIuc19hZGRyLCAmZnAsICZzdGF0ZSwgJnVpZCkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBwY2IuaW5wX2xwb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KSBscCk7CiAgICAgICAgcGNiLmlucF9mcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgZnApOwoKICAgICAgICBwY2IuaW5wX3N0YXRlID0gKHN0YXRlICYgMHhmKSA8IDEyID8gbGludXhfc3RhdGVzW3N0YXRlICYgMHhmXSA6IDI7CiAgICAgICAgaWYgKHBjYi5pbnBfc3RhdGUgPT0gNSAvKiBlc3RhYmxpc2hlZCAqLyB8fAogICAgICAgICAgICBwY2IuaW5wX3N0YXRlID09IDggLyogIGNsb3NlV2FpdCAgKi8gKQogICAgICAgICAgICB0Y3BfZXN0YWIrKzsKICAgICAgICBwY2IudWlkID0gdWlkOwoKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihzdHJ1Y3QgaW5wY2IpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweShubmV3LCAmcGNiLCBzaXplb2Yoc3RydWN0IGlucGNiKSk7CiAgICAgICAgbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKICAgICAgICB0Y3BfaGVhZCAgICAgICA9IG5uZXc7CiAgICB9CgogICAgZmNsb3NlKGluKTsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiTG9hZGVkIFRDUCBUYWJsZSAobGludXgpXG4iKSk7CiAgICByZXR1cm4gMDsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCgojaWZkZWYgc29sYXJpczIKc3RhdGljIGludApUQ1BfQ21wKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBpZiAobWVtY21wKChtaWIyX3RjcENvbm5FbnRyeV90ICopIGVwLCAobWliMl90Y3BDb25uRW50cnlfdCAqKSBhZGRyLAogICAgICAgICAgICAgICBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCkpID09IDApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOwp9CgppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBtaWIyX3RjcENvbm5FbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3RjcENvbm5FbnRyeSAqbm5ldzsKICAgIG5ldHNubXBfdGNwQ29ubkVudHJ5ICpwcmV2X2VudHJ5ID0gTlVMTDsKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmIChnZXRNaWJzdGF0KE1JQl9UQ1BfQ09OTiwgJmVudHJ5LCBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICBHRVRfRklSU1QsICZUQ1BfQ21wLCAmZW50cnkpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICB3aGlsZSAoMSkgewogICAgICAgIC8qCiAgICAgICAgICogQnVpbGQgdXAgYSBsaW5rZWQgbGlzdCBjb3B5IG9mIHRoZSBnZXRNaWJzdGF0IHJlc3VsdHMKICAgICAgICAgKiBOb3RlIHRoYXQgc2luY2UgZ2V0TWlic3RhdCByZXR1cm5zIHJvd3MgaW4gc29ydGVkIG9yZGVyLAogICAgICAgICAqICAgIHdlIG5lZWQgdG8gcmV0YWluIHRoaXMgb3JkZXIgd2hpbGUgYnVpbGRpbmcgdGhlIGxpc3QKICAgICAgICAgKiAgICBzbyBuZXcgZW50cmllcyBhcmUgYWRkZWQgb250byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICAqIE5vdGUgMjogYXQgbGVhc3QgU29sYXJpcyA4LTEwIGRvIG5vdCByZXR1cm4gcm93cyBpbgogICAgICAgICAqICAgIHNvcnRlZCBvcmRlciBhbnltb3JlCiAgICAgICAgICovCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF90Y3BDb25uRW50cnkpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweSgmKG5uZXctPmVudHJ5KSwgJmVudHJ5LCBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCkpOwogICAgICAgIGlmICghcHJldl9lbnRyeSkKICAgICAgICAgICAgdGNwX2hlYWQgPSBubmV3OwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJldl9lbnRyeS0+aW5wX25leHQgPSBubmV3OwogICAgICAgIHByZXZfZW50cnkgPSBubmV3OwoKICAgICAgICBpZiAoZ2V0TWlic3RhdChNSUJfVENQX0NPTk4sICZlbnRyeSwgc2l6ZW9mKG1pYjJfdGNwQ29ubkVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgICAgIEdFVF9ORVhULCAmVENQX0NtcCwgJmVudHJ5KSAhPSAwKQoJICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh0Y3BfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFRDUCBUYWJsZSAoc29sYXJpcylcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKaW50CnRjcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgUE1JQl9UQ1BUQUJMRSBwVGNwVGFibGUgPSBOVUxMOwogICAgRFdPUkQgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgRFdPUkQgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKCiAgICAvKgogICAgICogcXVlcnkgZm9yIHRoZSBidWZmZXIgc2l6ZSBuZWVkZWQgCiAgICAgKi8KICAgIHN0YXR1cyA9IEdldFRjcFRhYmxlKHBUY3BUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwVGNwVGFibGUgPSAoUE1JQl9UQ1BUQUJMRSkgbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBUY3BUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEdldCB0aGUgc29ydGVkIFRDUCB0YWJsZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXR1cyA9IEdldFRjcFRhYmxlKHBUY3BUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICBpbnQgICAgICAgICAgIGk7CgogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChXSU4zMilcbiIpKTsKICAgICAgICB0Y3Bfc2l6ZSA9IHBUY3BUYWJsZS0+ZHdOdW1FbnRyaWVzIC0xOyAgLyogZW50cmllcyBhcmUgY291bnRlZCBzdGFydGluZyB3aXRoIDAgKi8KICAgICAgICB0Y3BfaGVhZCA9IHBUY3BUYWJsZS0+dGFibGU7CgoJLyoKCSAqIENvdW50IHRoZSBudW1iZXIgb2YgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMKCSAqIFByb2JhYmx5IG5vdCBhY3R1YWxseSBuZWNlc3NhcnkgZm9yIFdpbmRvd3MKCSAqLwoJZm9yIChpID0gMDsgaSA8IHRjcF9zaXplOyBpKyspIHsKCQlpZiAodGNwX2hlYWRbaV0uZHdTdGF0ZSA9PSA1IC8qIGVzdGFibGlzaGVkICovIHx8CgkJCXRjcF9oZWFkW2ldLmR3U3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCgkJCXRjcF9lc3RhYisrOwoJfQogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKHdpbjMyKVxuIikpOwoJaWYgKHBUY3BUYWJsZSkKCQlmcmVlKHBUY3BUYWJsZSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KCiNpZiAoZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSAmJiBkZWZpbmVkKFRDUENUTF9QQ0JMSVNUKSkKCiNpZiBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGRhcndpbikKICAgICNkZWZpbmUgTlNfRUxFTSBzdHJ1Y3QgeHRjcGNiCiNlbHNlCiAgICAjZGVmaW5lIE5TX0VMRU0gc3RydWN0IHhpbnBjYgojZW5kaWYKCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHNpemVfdCAgIGxlbjsKICAgIGludCAgICAgIHNuYW1lW10gPSB7IENUTF9ORVQsIFBGX0lORVQsIElQUFJPVE9fVENQLCBUQ1BDVExfUENCTElTVCB9OwogICAgY2hhciAgICAgKnRjcGNiX2J1ZiA9IE5VTEw7CiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgIHN0cnVjdCB4aW5wY2IgICp4aWcgPSBOVUxMOwogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMSwgMiwgMywgNCwgNSwgOCwgNiwgMTAsIDksIDcsIDExIH07CiNlbHNlCiAgICBzdHJ1Y3QgeGlucGdlbiAqeGlnID0gTlVMTDsKICAgIGludCAgICAgIFN0YXRlTWFwW10gPSB7IDEsIDIsIDMsIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZW5kaWYKICAgIG5ldHNubXBfaW5wY2IgICpubmV3OwoKICAgIHRjcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqICBSZWFkIGluIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVENQIHRhYmxlIGRhdGEKICAgICAqLwogICAgbGVuID0gMDsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIDAsICZsZW4sIDAsIDApIDwgMCB8fAogICAgICAgKHRjcGNiX2J1ZiA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIHRjcGNiX2J1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgZnJlZSh0Y3BjYl9idWYpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFVucGljayB0aGlzIGludG8gdGhlIGNvbnN0aXR1ZW50ICd4aW5wZ2VuJyBzdHJ1Y3R1cmVzLCBhbmQgZXh0cmFjdAogICAgICogICAgIHRoZSAnaW5wY2InIGVsZW1lbnRzIGludG8gYSBsaW5rZWQgbGlzdCAoYnVpbHQgaW4gcmV2ZXJzZSkKICAgICAqLwojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB4aWcgPSAoc3RydWN0IHhpbnBjYiAgKikgdGNwY2JfYnVmOwojZWxzZQogICAgeGlnID0gKHN0cnVjdCB4aW5wZ2VuICopIHRjcGNiX2J1ZjsKICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCgojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB3aGlsZSAoeGlnICYmICgoY2hhciAqKXhpZyArIHhpZy0+eGlfbGVuIDwgdGNwY2JfYnVmICsgbGVuKSkKI2Vsc2UKICAgIHdoaWxlICh4aWcgJiYgKHhpZy0+eGlnX2xlbiA+IHNpemVvZihzdHJ1Y3QgeGlucGdlbikpKQojZW5kaWYKICAgIHsKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2lucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG5uZXctPnN0YXRlID0gU3RhdGVNYXBbKChOU19FTEVNICopIHhpZyktPnh0X3RwLnRfc3RhdGVdOwogICAgICAgIGlmIChubmV3LT5zdGF0ZSA9PSA1IC8qIGVzdGFibGlzaGVkICovIHx8CiAgICAgICAgICAgIG5uZXctPnN0YXRlID09IDggLyogIGNsb3NlV2FpdCAgKi8gKQogICAgICAgICAgICB0Y3BfZXN0YWIrKzsKICAgICAgICBtZW1jcHkoJihubmV3LT5wY2IpLCAmKCgoTlNfRUxFTSAqKSB4aWcpLT54dF9pbnApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGlucGNiKSk7CgoJaWYgKG5uZXctPnBjYi5pbnBfdmZsYWcgJiBJTlBfSVBWNikKCSAgICBmcmVlKG5uZXcpOwoJZWxzZSB7CgkgICAgbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKCSAgICB0Y3BfaGVhZCAgID0gbm5ldzsKCX0KI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGNiICAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aV9sZW4pOwojZWxzZQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCiAgICB9CgogICAgZnJlZSh0Y3BjYl9idWYpOwogICAgaWYgKHRjcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkxvYWRlZCBUQ1AgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgIHJldHVybiAtMTsKfQojdW5kZWYgTlNfRUxFTQoKI2Vsc2UJCS8qIChkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpICYmIGRlZmluZWQoVENQQ1RMX1BDQkxJU1QpKSAqLwojaWZkZWYgUENCX1RBQkxFCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHN0cnVjdCBpbnBjYnRhYmxlIHRhYmxlOwogICAgc3RydWN0IGlucGNiICAgKmVudHJ5OwogICAgc3RydWN0IHRjcGNiICAgIHRjcGNiOwogICAgbmV0c25tcF9pbnBjYiAgKm5uZXc7CiAgICBpbnQgICAgICBTdGF0ZU1hcFtdID0geyAxLCAyLCAzLCA0LCA1LCA4LCA2LCAxMCwgOSwgNywgMTEgfTsKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChUQ1BfU1lNQk9MLCAoY2hhciAqKSAmdGFibGUsIHNpemVvZih0YWJsZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkZhaWxlZCB0byByZWFkIGlucGNidGFibGVcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqICBTZXQgdXAgYSBsaW5rZWQgbGlzdAogICAgICovCiAgICBlbnRyeSAgPSB0YWJsZS5pbnB0X3F1ZXVlLmNxaF9maXJzdDsKICAgIHdoaWxlIChlbnRyeSkgewogICAKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2lucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGVudHJ5LCAoY2hhciAqKSYobm5ldy0+cGNiKSwgc2l6ZW9mKHN0cnVjdCBpbnBjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTpUY3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobm5ldy0+cGNiLmlucF9wcGNiLCAoY2hhciAqKSZ0Y3BjYiwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTpUY3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCW5uZXctPnN0YXRlID0gU3RhdGVNYXBbdGNwY2IudF9zdGF0ZV07CiAgICAgICAgaWYgKG5uZXctPnN0YXRlID09IDUgLyogZXN0YWJsaXNoZWQgKi8gfHwKICAgICAgICAgICAgbm5ldy0+c3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCiAgICAgICAgICAgIHRjcF9lc3RhYisrOwoKICAgICAgICBlbnRyeSAgICAgID0gbm5ldy0+SU5QX05FWFRfU1lNQk9MOwkvKiBOZXh0IGtlcm5lbCBlbnRyeSAqLwoJbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKCXRjcF9oZWFkICAgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdGFibGUuaW5wdF9xdWV1ZS5jcWhfZmlyc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh0Y3BfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KCiNlbHNlCQkJCS8qIFBDQl9UQUJMRSAqLwojaWZkZWYgVENQX1NZTUJPTAppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBzdHJ1Y3QgaW5wY2IgICB0Y3BfaW5wY2I7CiAgICBzdHJ1Y3QgdGNwY2IgICB0Y3BjYjsKICAgIG5ldHNubXBfaW5wY2IgICpubmV3OwogICAgc3RydWN0IGlucGNiICAgKmVudHJ5OwojaWZkZWYgaHB1eAogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMiwgMywgLTEsIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZWxzZQogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMiwgMywgICAgIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZW5kaWYKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChUQ1BfU1lNQk9MLCAoY2hhciAqKSAmdGNwX2lucGNiLCBzaXplb2YodGNwX2lucGNiKSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIHJlYWQgdGNwX3N5bWJvbFxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFNldCB1cCBhIGxpbmtlZCBsaXN0CiAgICAgKi8KICAgIGVudHJ5ICA9IHRjcF9pbnBjYi5JTlBfTkVYVF9TWU1CT0w7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9pbnBjYik7CiAgICAgICAgaWYgKCFubmV3KQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChlbnRyeSwgKGNoYXIgKikmKG5uZXctPnBjYiksIHNpemVvZihzdHJ1Y3QgaW5wY2IpKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGU6dGNwVGFibGVfbG9hZCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobm5ldy0+cGNiLmlucF9wcGNiLCAoY2hhciAqKSZ0Y3BjYiwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTp0Y3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCW5uZXctPnN0YXRlICAgID0gU3RhdGVNYXBbdGNwY2IudF9zdGF0ZV07CiAgICAgICAgaWYgKG5uZXctPnN0YXRlID09IDUgLyogZXN0YWJsaXNoZWQgKi8gfHwKICAgICAgICAgICAgbm5ldy0+c3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCiAgICAgICAgICAgIHRjcF9lc3RhYisrOwoKICAgICAgICBlbnRyeSAgICAgICAgICA9IG5uZXctPnBjYi5JTlBfTkVYVF9TWU1CT0w7CS8qIE5leHQga2VybmVsIGVudHJ5ICovCglubmV3LT5pbnBfbmV4dCA9IHRjcF9oZWFkOwoJdGNwX2hlYWQgICAgICAgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdGNwX2lucGNiLklOUF9ORVhUX1NZTUJPTCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHRjcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkxvYWRlZCBUQ1AgVGFibGUgKHRjcF9zeW1ib2wpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlICh0Y3Bfc3ltYm9sKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CgojZWxzZQkJCQkvKiBVREJfU1lNQk9MICovCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkaW5nIFRDUCBUYWJsZSBub3QgaW1wbGVtZW50ZWRcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZW5kaWYJCQkJLyogVURCX1NZTUJPTCAqLwojZW5kaWYJCQkJLyogUENCX1RBQkxFICovCiNlbmRpZgkJLyogKGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgJiYgZGVmaW5lZChUQ1BDVExfUENCTElTVCkpICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwo=