LyoKICogIFVEUCBNSUIgZ3JvdXAgVGFibGUgaW1wbGVtZW50YXRpb24gLSB1ZHBUYWJsZS5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlICJtaWJJSV9jb21tb24uaCIKCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIGxpbnV4CiNpbmNsdWRlICJ0Y3BUYWJsZS5oIgojZW5kaWYKI2luY2x1ZGUgInVkcC5oIgojaW5jbHVkZSAidWRwVGFibGUuaCIKCiNpZmRlZiBocHV4MTEKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW1pYl91ZHBMc25FbnQgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCUxvY2FsQWRkcmVzcyAKI2RlZmluZQlVRFBUQUJMRV9MT0NBTFBPUlQJTG9jYWxQb3J0IAojZGVmaW5lCVVEUFRBQkxFX0lTX1RBQkxFCiNlbHNlCgojaWZkZWYgc29sYXJpczIKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF91ZHBFbnRyeV9zIG5ldHNubXBfdWRwRW50cnk7CnN0cnVjdCBuZXRzbm1wX3VkcEVudHJ5X3MgewogICAgbWliMl91ZHBFbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3VkcEVudHJ5ICppbnBfbmV4dDsKfTsKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfdWRwRW50cnkKI2RlZmluZQlVRFBUQUJMRV9MT0NBTEFERFJFU1MJZW50cnkudWRwTG9jYWxBZGRyZXNzIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAllbnRyeS51ZHBMb2NhbFBvcnQgCiNkZWZpbmUJVURQVEFCTEVfSVNfTElOS0VEX0xJU1QKI2Vsc2UKCiNpZmRlZiBIQVZFX0lQSExQQVBJX0gKI2luY2x1ZGUgPGlwaGxwYXBpLmg+CiNkZWZpbmUJVURQVEFCTEVfRU5UUllfVFlQRQlNSUJfVURQUk9XCQkvKiA/Pz8gKi8KI2RlZmluZQlVRFBUQUJMRV9MT0NBTEFERFJFU1MJZHdMb2NhbEFkZHIKI2RlZmluZQlVRFBUQUJMRV9MT0NBTFBPUlQJZHdMb2NhbFBvcnQgCiNkZWZpbmUJVURQVEFCTEVfSVNfVEFCTEUKI2Vsc2UJCQkvKiBldmVyeXRoaW5nIGVsc2UgKi8KCiNpZmRlZiBsaW51eAojZGVmaW5lIElOUF9ORVhUX1NZTUJPTAkJaW5wX25leHQKI2VuZGlmCiNpZmRlZiBvcGVuYnNkNAojZGVmaW5lIElOUF9ORVhUX1NZTUJPTAkJaW5wX3F1ZXVlLmNxZV9uZXh0CS8qIG9yIHNldCB2aWEgPG5ldC1zbm1wL3N5c3RlbS9vcGVuYnNkLmg+ICovCiNlbmRpZgoKI2lmIGRlZmluZWQoZnJlZWJzZDQpIHx8IGRlZmluZWQoZGFyd2luKSB8fCBkZWZpbmVkKG9zZjUpCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfaW5wY2JfcyBuZXRzbm1wX2lucGNiOwpzdHJ1Y3QgbmV0c25tcF9pbnBjYl9zIHsKICAgIHN0cnVjdCBpbnBjYiAgICBwY2I7CiAgICBpbnQgICAgICAgICAgICAgc3RhdGU7CiAgICBuZXRzbm1wX2lucGNiICAqaW5wX25leHQ7Cn07CiNkZWZpbmUJVURQVEFCTEVfRU5UUllfVFlQRQluZXRzbm1wX2lucGNiIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMQUREUkVTUwlwY2IuaW5wX2xhZGRyLnNfYWRkciAKI2RlZmluZQlVRFBUQUJMRV9MT0NBTFBPUlQJcGNiLmlucF9scG9ydAojZWxzZQojZGVmaW5lCVVEUFRBQkxFX0VOVFJZX1RZUEUJc3RydWN0IGlucGNiIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMQUREUkVTUwlpbnBfbGFkZHIuc19hZGRyIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAlpbnBfbHBvcnQKI2VuZGlmCiNkZWZpbmUJVURQVEFCTEVfSVNfTElOS0VEX0xJU1QKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCgkJCQkvKiBIZWFkIG9mIGxpbmtlZCBsaXN0LCBvciByb290IG9mIHRhYmxlICovClVEUFRBQkxFX0VOVFJZX1RZUEUJKnVkcF9oZWFkICA9IE5VTEw7CmludCAgICAgICAgICAgICAgICAgICAgICB1ZHBfc2l6ZSAgPSAwOwkvKiBPbmx5IHVzZWQgZm9yIHRhYmxlLWJhc2VkIHN5c3RlbXMgKi8KCgoJLyoKCSAqCgkgKiBJbml0aWFsaXphdGlvbiBhbmQgaGFuZGxlciByb3V0aW5lcyBhcmUgY29tbW9uIHRvIGFsbCBhcmNoaXRlY3R1cmVzCgkgKgoJICovCiNpZm5kZWYgTUlCX1NUQVRTX0NBQ0hFX1RJTUVPVVQKI2RlZmluZSBNSUJfU1RBVFNfQ0FDSEVfVElNRU9VVAk1CiNlbmRpZgojaWZuZGVmIFVEUF9TVEFUU19DQUNIRV9USU1FT1VUCiNkZWZpbmUgVURQX1NUQVRTX0NBQ0hFX1RJTUVPVVQJTUlCX1NUQVRTX0NBQ0hFX1RJTUVPVVQKI2VuZGlmCgojaWZkZWYgVURQX0FERFJFU1NFU19JTl9IT1NUX09SREVSCiNkZWZpbmUgVURQX0FERFJFU1NfVE9fSE9TVF9PUkRFUih4KSB4CiNkZWZpbmUgVURQX0FERFJFU1NfVE9fTkVUV09SS19PUkRFUih4KSBodG9ubCh4KQojZWxzZQojZGVmaW5lIFVEUF9BRERSRVNTX1RPX0hPU1RfT1JERVIoeCkgbnRvaGwoeCkKI2RlZmluZSBVRFBfQUREUkVTU19UT19ORVRXT1JLX09SREVSKHgpIHgKI2VuZGlmCgojaWZkZWYgVURQX1BPUlRTX0lOX0hPU1RfT1JERVIKI2RlZmluZSBVRFBfUE9SVF9UT19IT1NUX09SREVSKHgpIHgKI2Vsc2UKI2RlZmluZSBVRFBfUE9SVF9UT19IT1NUX09SREVSKHgpIG50b2hzKHgpCiNlbmRpZgoKCm9pZCAgICAgICAgICAgICB1ZHBUYWJsZV9vaWRbXSA9IHsgU05NUF9PSURfTUlCMiwgNywgNSB9OwoKdm9pZAppbml0X3VkcFRhYmxlKHZvaWQpCnsKICAgIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8gKnRhYmxlX2luZm87CiAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gICAgICAgICAgICppaW5mbzsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gICAgKnJlZ2luZm87CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYzsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiSW5pdGlhbGlzaW5nIFVEUCBUYWJsZVxuIikpOwogICAgLyoKICAgICAqIENyZWF0ZSB0aGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBkZWZpbmUgdGhlIGluZGV4aW5nLi4uLgogICAgICovCiAgICB0YWJsZV9pbmZvID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvKTsKICAgIGlmICghdGFibGVfaW5mbykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG5ldHNubXBfdGFibGVfaGVscGVyX2FkZF9pbmRleGVzKHRhYmxlX2luZm8sIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fSU5URUdFUiwgMCk7CiAgICB0YWJsZV9pbmZvLT5taW5fY29sdW1uID0gVURQTE9DQUxBRERSRVNTOwogICAgdGFibGVfaW5mby0+bWF4X2NvbHVtbiA9IFVEUExPQ0FMUE9SVDsKCgogICAgLyoKICAgICAqIC4uLi4gYW5kIGl0ZXJhdGlvbiBpbmZvcm1hdGlvbiAuLi4uCiAgICAgKi8KICAgIGlpbmZvICAgICAgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfaXRlcmF0b3JfaW5mbyk7CiAgICBpZiAoIWlpbmZvKSB7CiAgICAgICAgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mb19mcmVlKHRhYmxlX2luZm8pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlpbmZvLT5nZXRfZmlyc3RfZGF0YV9wb2ludCA9IHVkcFRhYmxlX2ZpcnN0X2VudHJ5OwogICAgaWluZm8tPmdldF9uZXh0X2RhdGFfcG9pbnQgID0gdWRwVGFibGVfbmV4dF9lbnRyeTsKICAgIGlpbmZvLT50YWJsZV9yZWdpbmZvICAgICAgICA9IHRhYmxlX2luZm87CiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgaWluZm8tPmZsYWdzICAgICAgICAgICAgICAgfD0gTkVUU05NUF9JVEVSQVRPUl9GTEFHX1NPUlRFRDsKI2VuZGlmIC8qIFdJTjMyIHx8IGN5Z3dpbiAqLwoKCiAgICAvKgogICAgICogLi4uLiBhbmQgcmVnaXN0ZXIgdGhlIHRhYmxlIHdpdGggdGhlIGFnZW50LgogICAgICovCiAgICByZWdpbmZvID0gbmV0c25tcF9jcmVhdGVfaGFuZGxlcl9yZWdpc3RyYXRpb24oInVkcFRhYmxlIiwKICAgICAgICAgICAgdWRwVGFibGVfaGFuZGxlciwKICAgICAgICAgICAgdWRwVGFibGVfb2lkLCBPSURfTEVOR1RIKHVkcFRhYmxlX29pZCksCiAgICAgICAgICAgIEhBTkRMRVJfQ0FOX1JPTkxZKSwKICAgIHJjID0gbmV0c25tcF9yZWdpc3Rlcl90YWJsZV9pdGVyYXRvcjIocmVnaW5mbywgaWluZm8pOwogICAgaWYgKHJjICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIC4uLi4gd2l0aCBhIGxvY2FsIGNhY2hlCiAgICAgKi8KICAgIG5ldHNubXBfaW5qZWN0X2hhbmRsZXIoIHJlZ2luZm8sCgkJICAgIG5ldHNubXBfZ2V0X2NhY2hlX2hhbmRsZXIoVURQX1NUQVRTX0NBQ0hFX1RJTUVPVVQsCgkJCSAgIAkJdWRwVGFibGVfbG9hZCwgdWRwVGFibGVfZnJlZSwKCQkJCQl1ZHBUYWJsZV9vaWQsIE9JRF9MRU5HVEgodWRwVGFibGVfb2lkKSkpOwp9CgoKCmludAp1ZHBUYWJsZV9oYW5kbGVyKG5ldHNubXBfbWliX2hhbmRsZXIgICAgICAgICAgKmhhbmRsZXIsCiAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICAgICAgICAgKnJlcXVlc3RzKQp7CiAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAgKnJlcXVlc3Q7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnJlcXVlc3R2YjsKICAgIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICp0YWJsZV9pbmZvOwogICAgVURQVEFCTEVfRU5UUllfVFlQRQkgICplbnRyeTsKICAgIG9pZCAgICAgIHN1YmlkOwogICAgbG9uZyAgICAgcG9ydDsKICAgIGluX2FkZHJfdCBhZGRyOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJIYW5kbGVyIC0gbW9kZSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBzZV9maW5kX2xhYmVsX2luX3NsaXN0KCJhZ2VudF9tb2RlIiwgcmVxaW5mby0+bW9kZSkpKTsKICAgIHN3aXRjaCAocmVxaW5mby0+bW9kZSkgewogICAgY2FzZSBNT0RFX0dFVDoKICAgICAgICBmb3IgKHJlcXVlc3Q9cmVxdWVzdHM7IHJlcXVlc3Q7IHJlcXVlc3Q9cmVxdWVzdC0+bmV4dCkgewogICAgICAgICAgICByZXF1ZXN0dmIgPSByZXF1ZXN0LT5yZXF1ZXN0dmI7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCAibWliSUkvdWRwVGFibGUiLCAib2lkOiAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgibWliSUkvdWRwVGFibGUiLCByZXF1ZXN0dmItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0dmItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCggICAibWliSUkvdWRwVGFibGUiLCAiXG4iKSk7CgogICAgICAgICAgICBlbnRyeSA9IChVRFBUQUJMRV9FTlRSWV9UWVBFICopbmV0c25tcF9leHRyYWN0X2l0ZXJhdG9yX2NvbnRleHQocmVxdWVzdCk7CiAgICAgICAgICAgIGlmICghZW50cnkpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgdGFibGVfaW5mbyA9IG5ldHNubXBfZXh0cmFjdF90YWJsZV9pbmZvKHJlcXVlc3QpOwogICAgICAgICAgICBzdWJpZCAgICAgID0gdGFibGVfaW5mby0+Y29sbnVtOwoKICAgICAgICAgICAgc3dpdGNoIChzdWJpZCkgewogICAgICAgICAgICBjYXNlIFVEUExPQ0FMQUREUkVTUzoKI2lmIGRlZmluZWQob3NmNSkgJiYgZGVmaW5lZChJTjZfRVhUUkFDVF9WNEFERFIpCiAgICAgICAgICAgICAgICBhZGRyID0gbnRvaGwoSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkcikpOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSVBBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIqKSZhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOwojZWxzZQogICAgICAgICAgICAgICAgYWRkciA9IFVEUF9BRERSRVNTX1RPX0hPU1RfT1JERVIoZW50cnktPlVEUFRBQkxFX0xPQ0FMQUREUkVTUyk7CgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFVEUExPQ0FMUE9SVDoKICAgICAgICAgICAgICAgIHBvcnQgPSBVRFBfUE9SVF9UT19IT1NUX09SREVSKCh1X3Nob3J0KWVudHJ5LT5VRFBUQUJMRV9MT0NBTFBPUlQpOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZwb3J0LCBzaXplb2YocG9ydCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgfQoJfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV9HRVRORVhUOgogICAgY2FzZSBNT0RFX0dFVEJVTEs6CiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCiAgICBjYXNlIE1PREVfU0VUX1JFU0VSVkUxOgogICAgY2FzZSBNT0RFX1NFVF9SRVNFUlZFMjoKICAgIGNhc2UgTU9ERV9TRVRfQUNUSU9OOgogICAgY2FzZSBNT0RFX1NFVF9DT01NSVQ6CiAgICBjYXNlIE1PREVfU0VUX0ZSRUU6CiAgICBjYXNlIE1PREVfU0VUX1VORE86CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJtaWJJSS91ZHBUYWJsZTogVW5zdXBwb3J0ZWQgbW9kZSAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaW5mby0+bW9kZSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAibWliSUkvdWRwVGFibGU6IFVucmVjb2duaXNlZCBtb2RlICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFpbmZvLT5tb2RlKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCS8qCgkgKiBUd28gZm9ybXMgb2YgaXRlcmF0aW9uIGhvb2sgcm91dGluZXM6CgkgKiAgICBPbmUgZm9yIHdoZW4gdGhlIFVEUCB0YWJsZSBpcyBzdG9yZWQgYXMgYSB0YWJsZQoJICogICAgT25lIGZvciB3aGVuIHRoZSBVRFAgdGFibGUgaXMgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3QKCSAqCgkgKiBBbHNvIGFwcGxpZXMgdG8gdGhlIGNhY2hlLWhhbmRsZXIgZnJlZSByb3V0aW5lCgkgKi8KCiNpZmRlZglVRFBUQUJMRV9JU19UQUJMRQpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp1ZHBUYWJsZV9maXJzdF9lbnRyeSh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIC8qCiAgICAgKiBYWFggLSBIb3cgY2FuIHdlIHRlbGwgaWYgdGhlIGNhY2hlIGlzIHZhbGlkPwogICAgICogICAgICAgTm8gYWNjZXNzIHRvICdyZXFpbmZvJwogICAgICovCiAgICBpZiAodWRwX3NpemUgPT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogUG9pbnQgdG8gdGhlIGZpcnN0IGVudHJ5LCBhbmQgdXNlIHRoZQogICAgICogJ25leHRfZW50cnknIGhvb2sgdG8gcmV0cmlldmUgdGhpcyByb3cKICAgICAqLwogICAgKmxvb3BfY29udGV4dCA9IDA7CiAgICByZXR1cm4gdWRwVGFibGVfbmV4dF9lbnRyeSggbG9vcF9jb250ZXh0LCBkYXRhX2NvbnRleHQsIGluZGV4LCBkYXRhICk7Cn0KCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnVkcFRhYmxlX25leHRfZW50cnkoIHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgaW50IGkgPSAoaW50KSpsb29wX2NvbnRleHQ7CiAgICBsb25nIHBvcnQ7CgogICAgaWYgKHVkcF9zaXplIDwgaSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogU2V0IHVwIHRoZSBpbmRleGluZyBmb3IgdGhlIHNwZWNpZmllZCByb3cuLi4KICAgICAqLwojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIHBvcnQgPSBudG9obCgodV9sb25nKXVkcF9oZWFkW2ldLlVEUFRBQkxFX0xPQ0FMQUREUkVTUyk7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgsICh1X2NoYXIgKikmcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfaGVhZFtpXS5VRFBUQUJMRV9MT0NBTEFERFJFU1MpKTsKI2Vsc2UKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleCwgKHVfY2hhciAqKSZ1ZHBfaGVhZFtpXS5VRFBUQUJMRV9MT0NBTEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX2hlYWRbaV0uVURQVEFCTEVfTE9DQUxBRERSRVNTKSk7CiNlbmRpZgogICAgcG9ydCA9IFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoKHVfc2hvcnQpdWRwX2hlYWRbaV0uVURQVEFCTEVfTE9DQUxQT1JUKTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleC0+bmV4dF92YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIqKSZwb3J0LCBzaXplb2YocG9ydCkpOwogICAgLyoKICAgICAqIC4uLiByZXR1cm4gdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIHJvdywKICAgICAqIGFuZCB1cGRhdGUgdGhlIGxvb3AgY29udGV4dCByZWFkeSBmb3IgdGhlIG5leHQgb25lLgogICAgICovCiAgICAqZGF0YV9jb250ZXh0ID0gKHZvaWQqKSZ1ZHBfaGVhZFtpXTsKICAgICpsb29wX2NvbnRleHQgPSAodm9pZCopKytpOwogICAgcmV0dXJuIGluZGV4Owp9Cgp2b2lkCnVkcFRhYmxlX2ZyZWUobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKm1hZ2ljKQp7CiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgaWYgKHVkcF9oZWFkKSB7CgkJLyogdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgYSBjb3VudCBmb2xsb3dlZCBieSB0YWJsZSBlbnRyaWVzICovCgkJZnJlZSgoY2hhciAqKSh1ZHBfaGVhZCkgLSBzaXplb2YoRFdPUkQpKTsKCX0KI2Vsc2UKICAgIGlmICh1ZHBfaGVhZCkKICAgICAgICBmcmVlKHVkcF9oZWFkKTsKI2VuZGlmCiAgICB1ZHBfaGVhZCA9IE5VTEw7CiAgICB1ZHBfc2l6ZSA9IDA7Cn0KI2Vsc2UKI2lmZGVmIFVEUFRBQkxFX0lTX0xJTktFRF9MSVNUCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnVkcFRhYmxlX2ZpcnN0X2VudHJ5KHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgLyoKICAgICAqIFhYWCAtIEhvdyBjYW4gd2UgdGVsbCBpZiB0aGUgY2FjaGUgaXMgdmFsaWQ/CiAgICAgKiAgICAgICBObyBhY2Nlc3MgdG8gJ3JlcWluZm8nCiAgICAgKi8KICAgIGlmICh1ZHBfaGVhZCA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBQb2ludCB0byB0aGUgZmlyc3QgZW50cnksIGFuZCB1c2UgdGhlCiAgICAgKiAnbmV4dF9lbnRyeScgaG9vayB0byByZXRyaWV2ZSB0aGlzIHJvdwogICAgICovCiAgICAqbG9vcF9jb250ZXh0ID0gKHZvaWQqKXVkcF9oZWFkOwogICAgcmV0dXJuIHVkcFRhYmxlX25leHRfZW50cnkoIGxvb3BfY29udGV4dCwgZGF0YV9jb250ZXh0LCBpbmRleCwgZGF0YSApOwp9CgpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp1ZHBUYWJsZV9uZXh0X2VudHJ5KCB2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIFVEUFRBQkxFX0VOVFJZX1RZUEUJICplbnRyeSA9IChVRFBUQUJMRV9FTlRSWV9UWVBFICopKmxvb3BfY29udGV4dDsKICAgIGxvbmcgcG9ydDsKICAgIGxvbmcgYWRkcjsKCiAgICBpZiAoIWVudHJ5KQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgdGhlIGluZGV4aW5nIGZvciB0aGUgc3BlY2lmaWVkIHJvdy4uLgogICAgICovCiNpZiBkZWZpbmVkKG9zZjUpICYmIGRlZmluZWQoSU42X0VYVFJBQ1RfVjRBRERSKQogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKikmSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSkpOwojZWxzZQogICAgYWRkciA9IFVEUF9BRERSRVNTX1RPX05FVFdPUktfT1JERVIoKGluX2FkZHJfdCllbnRyeS0+VURQVEFCTEVfTE9DQUxBRERSRVNTKTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleCwgKHVfY2hhciAqKSZhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWRkcikpOwojZW5kaWYKICAgIHBvcnQgPSBVRFBfUE9SVF9UT19IT1NUX09SREVSKGVudHJ5LT5VRFBUQUJMRV9MT0NBTFBPUlQpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LT5uZXh0X3ZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CgogICAgLyoKICAgICAqIC4uLiByZXR1cm4gdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIHJvdywKICAgICAqIGFuZCB1cGRhdGUgdGhlIGxvb3AgY29udGV4dCByZWFkeSBmb3IgdGhlIG5leHQgb25lLgogICAgICovCiAgICAqZGF0YV9jb250ZXh0ID0gKHZvaWQqKWVudHJ5OwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKillbnRyeS0+SU5QX05FWFRfU1lNQk9MOwogICAgcmV0dXJuIGluZGV4Owp9Cgp2b2lkCnVkcFRhYmxlX2ZyZWUobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKm1hZ2ljKQp7CiAgICBVRFBUQUJMRV9FTlRSWV9UWVBFCSAqcDsKICAgIHdoaWxlICh1ZHBfaGVhZCkgewogICAgICAgIHAgPSB1ZHBfaGVhZDsKICAgICAgICB1ZHBfaGVhZCA9IHVkcF9oZWFkLT5JTlBfTkVYVF9TWU1CT0w7CiAgICAgICAgZnJlZShwKTsKICAgIH0KCiAgICB1ZHBfaGVhZCA9IE5VTEw7Cn0KI2VuZGlmCQkvKiBVRFBUQUJMRV9JU19MSU5LRURfTElTVCAqLwojZW5kaWYJCS8qIFVEUFRBQkxFX0lTX1RBQkxFICovCgoKCS8qCgkgKgoJICogVGhlIGNhY2hlLWhhbmRsZXIgbG9hZGluZyByb3V0aW5lIGlzIHRoZSBtYWluCgkgKiAgICBwbGFjZSBmb3IgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUKCSAqCgkgKiBMb2FkIGludG8gZWl0aGVyIGEgdGFibGUgc3RydWN0dXJlLCBvciBhIGxpbmtlZCBsaXN0CgkgKiAgICBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUKCSAqLwoKCiNpZmRlZiBocHV4MTEKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgaW50ICAgICAgICAgICAgIGZkOwogICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICBpbnQgICAgICAgICAgICAgdmFsID0gMDsKICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICB1ZHBUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICgoZmQgPSBvcGVuX21pYigiL2Rldi9pcCIsIE9fUkRPTkxZLCAwLCBOTV9BU1lOQ19PRkYpKSA+PSAwKSB7CiAgICAgICAgcC5vYmppZCA9IElEX3VkcExzbk51bUVudDsKICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopICZ2YWw7CiAgICAgICAgdWxlbiA9IHNpemVvZihpbnQpOwogICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPT0gMCkKICAgICAgICAgICAgdWRwX3NpemUgPSB2YWw7CgogICAgICAgIGlmICh1ZHBfc2l6ZSA+IDApIHsKICAgICAgICAgICAgdWxlbiA9ICh1bnNpZ25lZCkgdWRwX3NpemUgKnNpemVvZihtaWJfdWRwTHNuRW50KTsKICAgICAgICAgICAgdWRwX2hlYWQgPSAobWliX3VkcExzbkVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF91ZHBMc25UYWJsZTsKICAgICAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSB1ZHBfaGVhZDsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPCAwKSB7CiAgICAgICAgICAgICAgICB1ZHBfc2l6ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNsb3NlX21pYihmZCk7CiAgICB9CgogICAgaWYgKHVkcF9zaXplID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlIChocHV4MTEpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChocHV4MTEpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCiNpZmRlZiBsaW51eAppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBGSUxFICAgICAgICAgICAqaW47CiAgICBjaGFyICAgICAgICAgICAgbGluZVsyNTZdOwoKICAgIHVkcFRhYmxlX2ZyZWUoY2FjaGUsIE5VTEwpOwoKICAgIGlmICghKGluID0gZm9wZW4oIi9wcm9jL25ldC91ZHAiLCAiciIpKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKGxpbnV4KVxuIikpOwogICAgICAgIE5FVFNOTVBfTE9HT05DRSgoTE9HX0VSUiwgInNubXBkOiBjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvdWRwIC4uLlxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogc2NhbiBwcm9jLWZpbGUgYW5kIGJ1aWxkIHVwIGEgbGlua2VkIGxpc3QgCiAgICAgKiBUaGlzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQgdXAgaW4gcmV2ZXJzZSwKICAgICAqICAgYnV0IHNpbmNlIHRoZSBlbnRyaWVzIGFyZSB1bnNvcnRlZCwgdGhhdCBkb2Vzbid0IG1hdHRlci4KICAgICAqLwogICAgd2hpbGUgKGxpbmUgPT0gZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKICAgICAgICBzdHJ1Y3QgaW5wY2IgICAgcGNiLCAqbm5ldzsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgc3RhdGUsIGxwb3J0OwoKICAgICAgICBtZW1zZXQoJnBjYiwgMCwgc2l6ZW9mKHBjYikpOwoKICAgICAgICBpZiAoMyAhPSBzc2NhbmYobGluZSwgIiUqZDogJXg6JXggJSp4OiUqeCAleCIsCiAgICAgICAgICAgICAgICAgICAgICAgICZwY2IuaW5wX2xhZGRyLnNfYWRkciwgJmxwb3J0LCAmc3RhdGUpKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHN0YXRlICE9IDcpICAgICAgICAgLyogZml4IG1lOiAgVURQX0xJU1RFTiA/Pz8gKi8KICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIHN0b3JlIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwogICAgICAgIHBjYi5pbnBfbGFkZHIuc19hZGRyID0gaHRvbmwocGNiLmlucF9sYWRkci5zX2FkZHIpOwogICAgICAgIHBjYi5pbnBfbHBvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpIChscG9ydCkpOwoKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihzdHJ1Y3QgaW5wY2IpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweShubmV3LCAmcGNiLCBzaXplb2Yoc3RydWN0IGlucGNiKSk7CiAgICAgICAgbm5ldy0+aW5wX25leHQgPSB1ZHBfaGVhZDsKICAgICAgICB1ZHBfaGVhZCAgICAgICA9IG5uZXc7CiAgICB9CgogICAgZmNsb3NlKGluKTsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAobGludXgpXG4iKSk7CiAgICByZXR1cm4gMDsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCgojaWZkZWYgc29sYXJpczIKc3RhdGljIGludApVRFBfQ21wKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBpZiAobWVtY21wKChtaWIyX3VkcEVudHJ5X3QgKikgZXAsIChtaWIyX3VkcEVudHJ5X3QgKikgYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKG1pYjJfdWRwRW50cnlfdCkpID09IDApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOwp9CgoKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgbWliMl91ZHBFbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3VkcEVudHJ5ICpubmV3OwogICAgbmV0c25tcF91ZHBFbnRyeSAqcHJldl9lbnRyeSA9IE5VTEw7CgoKICAgIHVkcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgaWYgKGdldE1pYnN0YXQoTUlCX1VEUF9MSVNURU4sICZlbnRyeSwgc2l6ZW9mKG1pYjJfdWRwRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICBHRVRfRklSU1QsICZVRFBfQ21wLCAmZW50cnkpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICB3aGlsZSAoMSkgewogICAgICAgIC8qCiAgICAgICAgICogTm90IGludGVyZXN0ZWQgaW4gJ2lkbGUnIGVudHJpZXMsIGFwcGFyZW50bHkuLi4uCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIlVEUCBFbnRyeSAleDolZCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICBlbnRyeS51ZHBMb2NhbEFkZHJlc3MsIGVudHJ5LnVkcExvY2FsUG9ydCwgZW50cnkudWRwRW50cnlJbmZvLnVlX3N0YXRlKSk7CiAgICAgICAgaWYgKGVudHJ5LnVkcEVudHJ5SW5mby51ZV9zdGF0ZSA9PSBNSUIyX1VEUF9pZGxlKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEJ1aWxkIHVwIGEgbGlua2VkIGxpc3QgY29weSBvZiB0aGUgZ2V0TWlic3RhdCByZXN1bHRzCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBzaW5jZSBnZXRNaWJzdGF0IHJldHVybnMgcm93cyBpbiBzb3J0ZWQgb3JkZXIsCgkgICAgICogICAgd2UgbmVlZCB0byByZXRhaW4gdGhpcyBvcmRlciB3aGlsZSBidWlsZGluZyB0aGUgbGlzdAoJICAgICAqICAgIHNvIG5ldyBlbnRyaWVzIGFyZSBhZGRlZCBvbnRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAgICAgICAgICAgICAqIHh4eC1ya3M6IFdBUk5JTkc6IHRoaXMgaXMgTk9UIFRSVUUgb24gdGhlIHNmIGNmIHNvbGFyaXMgYm94ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX3VkcEVudHJ5KTsKICAgICAgICAgICAgaWYgKG5uZXcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBtZW1jcHkoJihubmV3LT5lbnRyeSksICZlbnRyeSwgc2l6ZW9mKG1pYjJfdWRwRW50cnlfdCkpOwogICAgICAgICAgICBpZiAoIXByZXZfZW50cnkpCgkgICAgICAgIHVkcF9oZWFkID0gbm5ldzsKCSAgICBlbHNlCgkgICAgICAgIHByZXZfZW50cnktPmlucF9uZXh0ID0gbm5ldzsKCSAgICBwcmV2X2VudHJ5ID0gbm5ldzsKCX0KCiAgICAgICAgaWYgKGdldE1pYnN0YXQoTUlCX1VEUF9MSVNURU4sICZlbnRyeSwgc2l6ZW9mKG1pYjJfdWRwRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICAgICAgR0VUX05FWFQsICZVRFBfQ21wLCAmZW50cnkpICE9IDApCgkgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHVkcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKHNvbGFyaXMpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBQTUlCX1VEUFRBQkxFIHBVZHBUYWJsZSA9IE5VTEw7CiAgICBEV09SRCAgICAgICAgIGR3QWN0dWFsU2l6ZSA9IDA7CiAgICBEV09SRCAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwoKICAgIC8qCiAgICAgKiBxdWVyeSBmb3IgdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCAKICAgICAqLwogICAgc3RhdHVzID0gR2V0VWRwVGFibGUocFVkcFRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIGlmIChzdGF0dXMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgewogICAgICAgIHBVZHBUYWJsZSA9IChQTUlCX1VEUFRBQkxFKSBtYWxsb2MoZHdBY3R1YWxTaXplKTsKICAgICAgICBpZiAocFVkcFRhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogR2V0IHRoZSBzb3J0ZWQgVURQIHRhYmxlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3RhdHVzID0gR2V0VWRwVGFibGUocFVkcFRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKHdpbjMyKVxuIikpOwogICAgICAgIHVkcF9zaXplID0gcFVkcFRhYmxlLT5kd051bUVudHJpZXMgLTE7ICAvKiBlbnRyaWVzIGFyZSBjb3VudGVkIHN0YXJ0aW5nIHdpdGggMCAqLwogICAgICAgIHVkcF9oZWFkID0gcFVkcFRhYmxlLT50YWJsZTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHdpbjMyKVxuIikpOwogICAgaWYgKHBVZHBUYWJsZSkKCWZyZWUocFVkcFRhYmxlKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiovCgojaWYgKGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgJiYgZGVmaW5lZChVRFBDVExfUENCTElTVCkpCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHNpemVfdCAgIGxlbjsKICAgIGludCAgICAgIHNuYW1lW10gPSB7IENUTF9ORVQsIFBGX0lORVQsIElQUFJPVE9fVURQLCBVRFBDVExfUENCTElTVCB9OwogICAgY2hhciAgICAgKnVkcGNiX2J1ZiA9IE5VTEw7CiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgIHN0cnVjdCB4aW5wY2IgICp4aWcgPSBOVUxMOwojZWxzZQogICAgc3RydWN0IHhpbnBnZW4gKnhpZyA9IE5VTEw7CiNlbmRpZgogICAgVURQVEFCTEVfRU5UUllfVFlQRSAgKm5uZXc7CgogICAgdWRwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICAvKgogICAgICogIFJlYWQgaW4gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBVRFAgdGFibGUgZGF0YQogICAgICovCiAgICBsZW4gPSAwOwogICAgaWYgKHN5c2N0bChzbmFtZSwgNCwgMCwgJmxlbiwgMCwgMCkgPCAwIHx8CiAgICAgICAodWRwY2JfYnVmID0gbWFsbG9jKGxlbikpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwogICAgaWYgKHN5c2N0bChzbmFtZSwgNCwgdWRwY2JfYnVmLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBmcmVlKHVkcGNiX2J1Zik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiAgVW5waWNrIHRoaXMgaW50byB0aGUgY29uc3RpdHVlbnQgJ3hpbnBnZW4nIHN0cnVjdHVyZXMsIGFuZCBleHRyYWN0CiAgICAgKiAgICAgdGhlICdpbnBjYicgZWxlbWVudHMgaW50byBhIGxpbmtlZCBsaXN0IChidWlsdCBpbiByZXZlcnNlKQogICAgICovCiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgIHhpZyA9IChzdHJ1Y3QgeGlucGNiICAqKSB1ZHBjYl9idWY7CiNlbHNlCiAgICB4aWcgPSAoc3RydWN0IHhpbnBnZW4gKikgdWRwY2JfYnVmOwogICAgeGlnID0gKHN0cnVjdCB4aW5wZ2VuICopICgoY2hhciAqKSB4aWcgKyB4aWctPnhpZ19sZW4pOwojZW5kaWYKCiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgIHdoaWxlICh4aWcgJiYgKChjaGFyICopeGlnICsgeGlnLT54aV9sZW4gPCB1ZHBjYl9idWYgKyBsZW4pKQojZWxzZQogICAgd2hpbGUgKHhpZyAmJiAoeGlnLT54aWdfbGVuID4gc2l6ZW9mKHN0cnVjdCB4aW5wZ2VuKSkpCiNlbmRpZgogICAgewogICAgICAgIG5uZXcgPSBTTk1QX01BTExPQ19UWVBFREVGKFVEUFRBQkxFX0VOVFJZX1RZUEUpOwogICAgICAgIGlmICghbm5ldykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbWVtY3B5KCZubmV3LT5wY2IsICYoKHN0cnVjdCB4aW5wY2IgKikgeGlnKS0+eGlfaW5wLCBzaXplb2Yoc3RydWN0IGlucGNiKSk7CglubmV3LT5pbnBfbmV4dCA9IHVkcF9oZWFkOwoJdWRwX2hlYWQgICA9IG5uZXc7CiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgICAgICB4aWcgPSAoc3RydWN0IHhpbnBjYiAgKikgKChjaGFyICopIHhpZyArIHhpZy0+eGlfbGVuKTsKI2Vsc2UKICAgICAgICB4aWcgPSAoc3RydWN0IHhpbnBnZW4gKikgKChjaGFyICopIHhpZyArIHhpZy0+eGlnX2xlbik7CiNlbmRpZgogICAgfQoKICAgIGZyZWUodWRwY2JfYnVmKTsKICAgIGlmICh1ZHBfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlIChzeXNjdGwpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChzeXNjdGwpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UJCS8qIChkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpICYmIGRlZmluZWQoVURQQ1RMX1BDQkxJU1QpKSAqLwojaWZkZWYgUENCX1RBQkxFCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHN0cnVjdCBpbnBjYnRhYmxlIHRhYmxlOwogICAgc3RydWN0IGlucGNiICAgKm5uZXcsICplbnRyeTsKCiAgICB1ZHBUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChVREJfU1lNQk9MLCAoY2hhciAqKSAmdGFibGUsIHNpemVvZih0YWJsZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byByZWFkIGlucGNidGFibGVcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqICBTZXQgdXAgYSBsaW5rZWQgbGlzdAogICAgICovCiAgICBlbnRyeSAgPSB0YWJsZS5pbnB0X3F1ZXVlLmNxaF9maXJzdDsKICAgIHdoaWxlIChlbnRyeSkgewogICAKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihzdHJ1Y3QgaW5wY2IpOwogICAgICAgIGlmICghbm5ldykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGVudHJ5LCAoY2hhciAqKSBubmV3LCBzaXplb2Yoc3RydWN0IGlucGNiKSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlOnVkcFRhYmxlX2xvYWQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBlbnRyeSAgICA9IG5uZXctPmlucF9xdWV1ZS5jcWVfbmV4dDsJLyogTmV4dCBrZXJuZWwgZW50cnkgKi8KCW5uZXctPmlucF9xdWV1ZS5jcWVfbmV4dCA9IHVkcF9oZWFkOwoJdWRwX2hlYWQgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdGFibGUuaW5wdF9xdWV1ZS5jcWhfZmlyc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh1ZHBfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KCiNlbHNlCQkJCS8qIFBDQl9UQUJMRSAqLwojaWZkZWYgVURCX1NZTUJPTAppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBzdHJ1Y3QgaW5wY2IgICB1ZHBfaW5wY2I7CiAgICBzdHJ1Y3QgaW5wY2IgICAqbm5ldywgKmVudHJ5OwoKICAgIHVkcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgaWYgKCFhdXRvX25saXN0KFVEQl9TWU1CT0wsIChjaGFyICopICZ1ZHBfaW5wY2IsIHNpemVvZih1ZHBfaW5wY2IpKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gcmVhZCB1ZGJfc3ltYm9sXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiAgU2V0IHVwIGEgbGlua2VkIGxpc3QKICAgICAqLwogICAgZW50cnkgID0gdWRwX2lucGNiLklOUF9ORVhUX1NZTUJPTDsKICAgIHdoaWxlIChlbnRyeSkgewogICAKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihzdHJ1Y3QgaW5wY2IpOwogICAgICAgIGlmICghbm5ldykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGVudHJ5LCAoY2hhciAqKSBubmV3LCBzaXplb2Yoc3RydWN0IGlucGNiKSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlOnVkcFRhYmxlX2xvYWQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBlbnRyeSAgICA9IG5uZXctPklOUF9ORVhUX1NZTUJPTDsJCS8qIE5leHQga2VybmVsIGVudHJ5ICovCglubmV3LT5JTlBfTkVYVF9TWU1CT0wgPSB1ZHBfaGVhZDsKCXVkcF9oZWFkID0gbm5ldzsKCiAgICAgICAgaWYgKGVudHJ5ID09IHVkcF9pbnBjYi5JTlBfTkVYVF9TWU1CT0wpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh1ZHBfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlICh1ZGJfc3ltYm9sKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAodWRiX3N5bWJvbClcbiIpKTsKICAgIHJldHVybiAtMTsKfQoKI2Vsc2UJCQkJLyogVURCX1NZTUJPTCAqLwppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGluZyBVRFAgVGFibGUgbm90IGltcGxlbWVudGVkXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KI2VuZGlmCQkJCS8qIFVEQl9TWU1CT0wgKi8KI2VuZGlmCQkJCS8qIFBDQl9UQUJMRSAqLwojZW5kaWYJCS8qIChkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpICYmIGRlZmluZWQoVURQQ1RMX1BDQkxJU1QpKSAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwo=