LyoKICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDYKICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDYKICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CiAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwcGM0eHguaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgInNkcmFtLmgiCgoKI2lmZGVmIENPTkZJR19TRFJBTV9CQU5LMAoKCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygxMjggPDwgMjApLCAxMywgMHgwMDBBNDAwMX0sCSAgICAvKiAoMC0xMjhNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDEwKDQpICovCgl7KDY0IDw8IDIwKSwgIDEzLCAweDAwMDg0MDAxfSwJICAgIC8qICgwLTY0TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3g5KDQpCSAgKi8KCXsoMzIgPDwgMjApLCAgMTIsIDB4MDAwNjIwMDF9LAkgICAgLyogKDAtMzJNQikgQWRkcmVzcyBNb2RlIDIsIDEyeDkoNCkJICAqLwoJeygxNiA8PCAyMCksICAxMiwgMHgwMDA0NjAwMX0sCSAgICAvKiAoMC0xNk1CKSBBZGRyZXNzIE1vZGUgNCwgMTJ4OCg0KQkgICovCgl7KDQgPDwgMjApLCAgIDExLCAweDAwMDA4MDAxfSwJICAgIC8qICgwLTRNQikgQWRkcmVzcyBNb2RlIDUsIDExeDgoMikJICAqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKCiNpZm5kZWYgQ09ORklHXzQ0MAoKI2lmZGVmIENGR19TRFJBTV9DQVNMCnN0YXRpYyB1bG9uZyBuczJjbGtzKHVsb25nIG5zKQp7Cgl1bG9uZyBidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChnZXRfYnVzX2ZyZXEoMCkgLyAxMCk7CgoJcmV0dXJuICgobnMgKiAxMCkgKyBidXNfcGVyaW9kX3hfMTApIC8gYnVzX3BlcmlvZF94XzEwOwp9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoKc3RhdGljIHVsb25nIGNvbXB1dGVfc2R0cjEodWxvbmcgc3BlZWQpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7Cgl1bG9uZyBzZHRyMSA9IDA7CgoJLyogQ0FTTCAqLwoJaWYgKENGR19TRFJBTV9DQVNMIDwgMikKCQlzZHRyMSB8PSAoMSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgllbHNlCgkJaWYgKENGR19TRFJBTV9DQVNMID4gNCkKCQkJc2R0cjEgfD0gKDMgPDwgU0RSQU0wX1RSX0NBU0wpOwoJCWVsc2UKCQkJc2R0cjEgfD0gKChDRkdfU0RSQU1fQ0FTTC0xKSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgoJLyogUFRBICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9QVEEpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1BUQSk7CgoJLyogQ1RQICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9DVFApOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfQ1RQKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX0NUUCk7CgoJLyogTERGICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9MREYpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfTERGKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDItMSkgPDwgU0RSQU0wX1RSX0xERik7CgoJLyogUkZUQSAqLwoJdG1wID0gbnMyY2xrcyhDRkdfU0RSQU1fUkZUQSk7CglpZiAoKHRtcCA+PSA0KSAmJiAodG1wIDw9IDEwKSkKCQlzZHRyMSB8PSAoKHRtcC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgllbHNlCgkJc2R0cjEgfD0gKCgxMC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgoJLyogUkNEICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9SQ0QpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUkNEKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1JDRCk7CgoJcmV0dXJuIHNkdHIxOwojZWxzZSAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoJLyoKCSAqIElmIG5vIHZhbHVlcyBhcmUgY29uZmlndXJlZCBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUKCSAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMsIHdoaWNoIHNlZW0gdG8gYmUgb2sgZm9yIG1vc3QKCSAqIGJvYXJkcy4KCSAqCgkgKiBSRU1BUks6CgkgKiBGb3IgbmV3IGJvYXJkIHBvcnRzIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byBkZWZpbmUgdGhlCgkgKiBjb3JyZWN0IHZhbHVlcyBmb3IgdGhlIHVzZWQgU0RSQU0gY2hpcHMgaW4geW91ciBib2FyZAoJICogY29uZmlnIGZpbGUgKHNlZSBQUENoYW1lbGVvbkVWQi5oKQoJICovCglpZiAoc3BlZWQgPiAxMDAwMDAwMDApIHsKCQkvKgoJCSAqIDEzMyBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwMTA3NDAxNTsKCX0gZWxzZSB7CgkJLyoKCQkgKiBkZWZhdWx0OiAxMDAgTUh6IFNEUkFNCgkJICovCgkJcmV0dXJuIDB4MDA4NjQwMGQ7Cgl9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwp9CgovKiByZWZyZXNoIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwpzdGF0aWMgdWxvbmcgY29tcHV0ZV9ydHIodWxvbmcgc3BlZWQsIHVsb25nIHJvd3MsIHVsb25nIHJlZnJlc2gpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7CgoJdG1wID0gKChyZWZyZXNoKjEwMDAqMTAwMCkgLyAoMSA8PCByb3dzKSkgKiAoc3BlZWQgLyAxMDAwKTsKCXRtcCAvPSAxMDAwMDAwOwoKCXJldHVybiAoKHRtcCAmIDB4MDAwMDNGRjgpIDw8IDE2KTsKI2Vsc2UgLyogQ0ZHX1NEUkFNX0NBU0wgKi8KCWlmIChzcGVlZCA+IDEwMDAwMDAwMCkgewoJCS8qCgkJICogMTMzIE1IeiBTRFJBTQoJCSAqLwoJCXJldHVybiAweDA3ZjAwMDAwOwoJfSBlbHNlIHsKCQkvKgoJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwNWYwMDAwMDsKCX0KI2VuZGlmIC8qIENGR19TRFJBTV9DQVNMICovCn0KCi8qCiAqIEF1dG9kZXRlY3Qgb25ib2FyZCBTRFJBTSBvbiA0MDUgcGxhdGZvcm1zCiAqLwp2b2lkIHNkcmFtX2luaXQodm9pZCkKewoJdWxvbmcgc3BlZWQ7Cgl1bG9uZyBzZHRyMTsKCWludCBpOwoKCS8qCgkgKiBEZXRlcm1pbmUgU0RSQU0gc3BlZWQKCSAqLwoJc3BlZWQgPSBnZXRfYnVzX2ZyZXEoMCk7IC8qIHBhcmFtZXRlciBub3QgdXNlZCBvbiBwcGM0eHggKi8KCgkvKgoJICogc2R0cjEgKHJlZ2lzdGVyIFNEUkFNMF9UUikgbXVzdCB0YWtlIGludG8gYWNjb3VudCB0aW1pbmdzIGxpc3RlZAoJICogaW4gU0RSQU0gY2hpcCBkYXRhc2hlZXQuIHJ0ciAocmVnaXN0ZXIgU0RSQU0wX1JUUikgbXVzdCB0YWtlIGludG8KCSAqIGFjY291bnQgYWN0dWFsIFNEUkFNIHNpemUuIFNvIHdlIGNhbiBzZXQgdXAgc2R0cjEgYWNjb3JkaW5nIHRvIHdoYXQKCSAqIGlzIHNwZWNpZmllZCBpbiBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUgd2hpbGUgcnRyIGRlcGVuZGRzIG9uIFNEUkFNCgkgKiBzaXplIHdlIGFyZSBhc3N1bWluZyBiZWZvcmUgZGV0ZWN0aW9uLgoJICovCglzZHRyMSA9IGNvbXB1dGVfc2R0cjEoc3BlZWQpOwoKCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgewoJCS8qCgkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWNvcHQxLCAweDAwMDAwMDAwKTsKCgkJLyoKCQkgKiBTZXQgTUIwQ0YgZm9yIGJhbmsgMC4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbTAobWVtX3NkdHIxLCBzZHRyMSk7CgkJbXRzZHJhbTAobWVtX3J0ciwgY29tcHV0ZV9ydHIoc3BlZWQsIG1iMGNmW2ldLnJvd3MsIDY0KSk7CgoJCXVkZWxheSgyMDApOwoKCQkvKgoJCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgoJCSAqIFNldCBEQ19FTiB0byAnMScgYW5kIEJSRF9QUkYgdG8gJzAxJyBmb3IgMTYgYnl0ZSBQTEIgQnVyc3QKCQkgKiByZWFkL3ByZWZldGNoLgoJCSAqLwoJCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOwoKCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKCQkJICovCgkJCXJldHVybjsKCQl9Cgl9Cn0KCiNlbHNlIC8qIENPTkZJR180NDAgKi8KCiNkZWZpbmUgTlVNX1RSSUVTIDY0CiNkZWZpbmUgTlVNX1JFQURTIDEwCgpzdGF0aWMgdm9pZCBzZHJhbV90cjFfc2V0KGludCByYW1fYWRkcmVzcywgaW50KiB0cjFfdmFsdWUpCnsKCWludCBpOwoJaW50IGosIGs7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQqIHJhbV9wb2ludGVyID0gKHVuc2lnbmVkIGludCAqKXJhbV9hZGRyZXNzOwoJaW50IGZpcnN0X2dvb2QgPSAtMSwgbGFzdF9iYWQgPSAweDFmZjsKCgl1bnNpZ25lZCBsb25nIHRlc3RbTlVNX1RSSUVTXSA9IHsKCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAoJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCgkJMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAoJCTB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCgkJMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAoJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCgkJMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAoJCTB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCgkJMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAoJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCgkJMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwKCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1IH07CgoJLyogZ28gdGhyb3VnaCBhbGwgcG9zc2libGUgU0RSQU0wX1RSMVtSRENUXSB2YWx1ZXMgKi8KCWZvciAoaT0wOyBpPD0weDFmZjsgaSsrKSB7CgkJLyogc2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBUUjEgKi8KCQltdHNkcmFtKG1lbV90cjEsICgweDgwODAwODAwIHwgaSkpOwoKCQkvKiB3cml0ZSB2YWx1ZXMgKi8KCQlmb3IgKGo9MDsgajxOVU1fVFJJRVM7IGorKykgewoJCQlyYW1fcG9pbnRlcltqXSA9IHRlc3Rbal07CgoJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCgkJCV9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIgKCZyYW1fcG9pbnRlcltqXSkpOwoJCX0KCgkJLyogcmVhZCB2YWx1ZXMgYmFjayAqLwoJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CgkJCWZvciAoaz0wOyBrPE5VTV9SRUFEUzsgaysrKSB7CgkJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCgkJCQlfX2FzbV9fKCJkY2JmIDAsJTAiOiA6InIiICgmcmFtX3BvaW50ZXJbal0pKTsKCgkJCQlpZiAocmFtX3BvaW50ZXJbal0gIT0gdGVzdFtqXSkKCQkJCQlicmVhazsKCQkJfQoKCQkJLyogcmVhZCBlcnJvciAqLwoJCQlpZiAoayAhPSBOVU1fUkVBRFMpCgkJCQlicmVhazsKCQl9CgoJCS8qIHdlIGhhdmUgYSBTRFJBTTBfVFIxW1JEQ1RdIHRoYXQgaXMgcGFydCBvZiB0aGUgd2luZG93ICovCgkJaWYgKGogPT0gTlVNX1RSSUVTKSB7CgkJCWlmIChmaXJzdF9nb29kID09IC0xKQoJCQkJZmlyc3RfZ29vZCA9IGk7CQkvKiBmb3VuZCBiZWdpbm5pbmcgb2Ygd2luZG93ICovCgkJfSBlbHNlIHsgLyogYmFkIHJlYWQgKi8KCQkJLyogaWYgd2UgaGF2ZSBub3QgaGFkIGEgZ29vZCByZWFkIHRoZW4gZG9uJ3QgY2FyZSAqLwoJCQlpZiAoZmlyc3RfZ29vZCAhPSAtMSkgewoJCQkJLyogZmlyc3QgZmFpbHVyZSBhZnRlciBhIGdvb2QgcmVhZCAqLwoJCQkJbGFzdF9iYWQgPSBpLTE7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKiByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZm9yIFRSMSAqLwoJKnRyMV92YWx1ZSA9IChmaXJzdF9nb29kICsgbGFzdF9iYWQpIC8gMjsKfQoKCiNpZmRlZiBDT05GSUdfU0RSQU1fRUNDCnN0YXRpYyB2b2lkIGVjY19pbml0KHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQp7Cgl1bG9uZwljdXJyZW50X2FkZHI7CQkvKiBjdXJyZW50IGJ5dGUgYWRkcmVzcyAqLwoJdWxvbmcJZW5kX2FkZHI7CQkvKiBlbmQgb2YgbWVtb3J5IHJlZ2lvbiAqLwoJdWxvbmcJYWRkcl9pbmM7CQkvKiBhZGRyZXNzIHNraXAgYmV0d2VlbiB3cml0ZXMgKi8KCXVsb25nCWNmZzBfcmVnOwkJLyogZm9yIHJlc3RvcmluZyBFQ0Mgc3RhdGUgKi8KCgkvKgoJICogVE9ETzogRW5hYmxlIGRjYWNoZSBiZWZvcmUgcnVubmluZyB0aGlzIHRlc3QgKHNwZWVkdXApCgkgKi8KCgltZnNkcmFtKG1lbV9jZmcwLCBjZmcwX3JlZyk7CgltdHNkcmFtKG1lbV9jZmcwLCAoY2ZnMF9yZWcgJiB+U0RSQU1fQ0ZHMF9NRU1DSEspIHwgU0RSQU1fQ0ZHMF9NRU1DSEtfR0VOKTsKCgkvKgoJICogbG9vayBhdCBnZW9tZXRyeSBvZiBTRFJBTSAoZGF0YSB3aWR0aCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UKCSAqIGNhbiBza2lwIHdvcmRzIHdoZW4gd3JpdGluZwoJICovCglpZiAoKGNmZzBfcmVnICYgU0RSQU1fQ0ZHMF9EUkFNV0RUSCkgPT0gU0RSQU1fQ0ZHMF9EUkFNV0RUSF8zMikKCQlhZGRyX2luYyA9IDQ7CgllbHNlCgkJYWRkcl9pbmMgPSA4OwoKCWN1cnJlbnRfYWRkciA9IHN0YXJ0OwoJZW5kX2FkZHIgPSBzdGFydCArIHNpemU7CgoJd2hpbGUgKGN1cnJlbnRfYWRkciA8IGVuZF9hZGRyKSB7CgkJKigodWxvbmcgKiljdXJyZW50X2FkZHIpID0gMHgwMDAwMDAwMDsKCQljdXJyZW50X2FkZHIgKz0gYWRkcl9pbmM7Cgl9CgoJLyoKCSAqIFRPRE86IEZsdXNoIGRjYWNoZSBhbmQgZGlzYWJsZSBpdCBhZ2FpbgoJICovCgoJLyoKCSAqIEVuYWJsZSBlY2MgY2hlY2tpbmcgYW5kIHBhcml0eSBlcnJvcnMKCSAqLwoJbXRzZHJhbShtZW1fY2ZnMCwgKGNmZzBfcmVnICYgflNEUkFNX0NGRzBfTUVNQ0hLKSB8IFNEUkFNX0NGRzBfTUVNQ0hLX0NISyk7Cn0KI2VuZGlmCgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgRERSIFNEUkFNIG9uIDQ0MCBwbGF0Zm9ybXMKICoKICogTk9URTogU29tZSBvZiB0aGUgaGFyZGNvZGVkIHZhbHVlcyBhcmUgaGFyZHdhcmUgZGVwZW5kYW50LAogKgkgc28gdGhpcyBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGZ1dHVyZSBib2FyZHMKICoJIHVzaW5nIHRoaXMgcm91dGluZSEKICovCmxvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQp7CglpbnQgaTsKCWludCB0cjFfYmFuazE7CgoJZm9yIChpPTA7IGk8Tl9NQjBDRjsgaSsrKSB7CgkJLyoKCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgoJCSAqLwoJCW10c2RyYW0obWVtX2NmZzAsIDB4MDAwMDAwMDApOwoKCQkvKgoJCSAqIFNldHVwIHNvbWUgZGVmYXVsdAoJCSAqLwoJCW10c2RyYW0obWVtX3VhYmJhLCAweDAwMDAwMDAwKTsgLyogdWJiYT0wIChkZWZhdWx0KQkJKi8KCQltdHNkcmFtKG1lbV9zbGlvLCAweDAwMDAwMDAwKTsJLyogcmRyZT0wIHdycmU9MCByYXJ3PTAJCSovCgkJbXRzZHJhbShtZW1fZGV2b3B0LCAweDAwMDAwMDAwKTsgLyogZGxsPTAgZHM9MCAobm9ybWFsKQkJKi8KCQltdHNkcmFtKG1lbV93ZGRjdHIsIDB4MDAwMDAwMDApOyAvKiB3cmNwPTAgZGNkPTAJCSovCgkJbXRzZHJhbShtZW1fY2xrdHIsIDB4NDAwMDAwMDApOyAvKiBjbGtwPTEgKDkwIGRlZyB3cikgZGNkdD0wCSovCgoJCS8qCgkJICogRm9sbG93aW5nIGZvciBDQVMgTGF0ZW5jeSA9IDIuNSBAIDEzMyBNSHogUExCCgkJICovCgkJbXRzZHJhbShtZW1fYjBjciwgbWIwY2ZbaV0ucmVnKTsKCQltdHNkcmFtKG1lbV90cjAsIDB4NDEwOTQwMTIpOwoJCW10c2RyYW0obWVtX3RyMSwgMHg4MDgwMDgwMCk7CS8qIFNTPVQyIFNMPVNUQUdFIDMgQ0Q9MSBDVD0weDAwKi8KCQltdHNkcmFtKG1lbV9ydHIsIDB4N2UwMDAwMDApOwkvKiBJbnRlcnZhbCAxNS4yMLVzIEAgMTMzTUh6IFBMQiovCgkJbXRzZHJhbShtZW1fY2ZnMSwgMHgwMDAwMDAwMCk7CS8qIFNlbGYtcmVmcmVzaCBleGl0LCBkaXNhYmxlIFBNKi8KCQl1ZGVsYXkoNDAwKTsJCQkvKiBEZWxheSAyMDAgdXNlY3MgKG1pbikJKi8KCgkJLyoKCQkgKiBFbmFibGUgdGhlIGNvbnRyb2xsZXIsIHRoZW4gd2FpdCBmb3IgRENFTiB0byBjb21wbGV0ZQoJCSAqLwoJCW10c2RyYW0obWVtX2NmZzAsIDB4ODYwMDAwMDApOwkvKiBEQ0VOPTEsIFBNVUQ9MSwgNjQtYml0CSovCgkJdWRlbGF5KDEwMDAwKTsKCgkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CgkJCS8qCgkJCSAqIE9wdGltaXplIFRSMSB0byBjdXJyZW50IGhhcmR3YXJlIGVudmlyb25tZW50CgkJCSAqLwoJCQlzZHJhbV90cjFfc2V0KDB4MDAwMDAwMDAsICZ0cjFfYmFuazEpOwoJCQltdHNkcmFtKG1lbV90cjEsICh0cjFfYmFuazEgfCAweDgwODAwODAwKSk7CgojaWZkZWYgQ09ORklHX1NEUkFNX0VDQwoJCQllY2NfaW5pdCgwLCBtYjBjZltpXS5zaXplKTsKI2VuZGlmCgoJCQkvKgoJCQkgKiBPSywgc2l6ZSBkZXRlY3RlZCAtPiBhbGwgZG9uZQoJCQkgKi8KCQkJcmV0dXJuIG1iMGNmW2ldLnNpemU7CgkJfQoJfQoKCXJldHVybiAwOwkJCQkvKiBub3RoaW5nIGZvdW5kICEJCSovCn0KCiNlbmRpZiAvKiBDT05GSUdfNDQwICovCgojZW5kaWYgLyogQ09ORklHX1NEUkFNX0JBTkswICovCg==