LyoKICogKEMpIENvcHlyaWdodCAyMDA4LTIwMTEKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgPGRhbmllbEBvbWljcm9uLnNlPgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPHdkQGRlbnguZGU+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiNpbmNsdWRlIDxjb21tYW5kLmg+CiNpbmNsdWRlIDxzdGRpb19kZXYuaD4KI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlIDxuZXQuaD4KI2luY2x1ZGUgPGlkZS5oPgojaW5jbHVkZSA8c2VyaWFsLmg+CiNpbmNsdWRlIDxhc20vdS1ib290LXg4Ni5oPgojaW5jbHVkZSA8ZWxmLmg+CgojaWZkZWYgQ09ORklHX0JJVEJBTkdNSUkKI2luY2x1ZGUgPG1paXBoeS5oPgojZW5kaWYKCi8qCiAqIFBvaW50ZXIgdG8gaW5pdGlhbCBnbG9iYWwgZGF0YSBhcmVhCiAqCiAqIEhlcmUgd2UgaW5pdGlhbGl6ZSBpdC4KICovCiN1bmRlZglYVFJOX0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSCiNkZWZpbmUgWFRSTl9ERUNMQVJFX0dMT0JBTF9EQVRBX1BUUgkvKiBlbXB0eSA9IGFsbG9jYXRlIGhlcmUgKi8KREVDTEFSRV9HTE9CQUxfREFUQV9QVFIgPSAoZ2RfdCAqKSAoQ09ORklHX1NZU19JTklUX0dEX0FERFIpOwoKCi8qIEV4cG9ydHMgZnJvbSB0aGUgTGlua2VyIFNjcmlwdCAqLwpleHRlcm4gdWxvbmcgX190ZXh0X3N0YXJ0OwpleHRlcm4gdWxvbmcgX19kYXRhX2VuZDsKZXh0ZXJuIHVsb25nIF9fcmVsX2R5bl9zdGFydDsKZXh0ZXJuIHVsb25nIF9fcmVsX2R5bl9lbmQ7CmV4dGVybiB1bG9uZyBfX2Jzc19zdGFydDsKZXh0ZXJuIHVsb25nIF9fYnNzX2VuZDsKCmNvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9CglVX0JPT1RfVkVSU0lPTiIgKCIgVV9CT09UX0RBVEUgIiAtICIgVV9CT09UX1RJTUUgIikiOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbml0IFV0aWxpdGllcwkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU29tZSBvZiB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvcmUgZnVuY3Rpb25zLAogKiBvciBkcm9wcGVkIGNvbXBsZXRlbHksCiAqIGJ1dCBsZXQncyBnZXQgaXQgd29ya2luZyAoYWdhaW4pIGZpcnN0Li4uCiAqLwpzdGF0aWMgaW50IGluaXRfYmF1ZHJhdGUgKHZvaWQpCnsKCWNoYXIgdG1wWzY0XTsJLyogbG9uZyBlbm91Z2ggZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwoJaW50IGkgPSBnZXRlbnZfZigiYmF1ZHJhdGUiLCB0bXAsIDY0KTsKCglnZC0+YmF1ZHJhdGUgPSAoaSAhPSAwKQoJCQk/IChpbnQpIHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDEwKQoJCQk6IENPTkZJR19CQVVEUkFURTsKCglyZXR1cm4gKDApOwp9CgpzdGF0aWMgaW50IGRpc3BsYXlfYmFubmVyICh2b2lkKQp7CgoJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKLyoKCXByaW50ZiAoIlUtQm9vdCBjb2RlOiAlMDhsWCAtPiAlMDhsWCAgZGF0YTogJTA4bFggLT4gJTA4bFhcbiIKCQkiICAgICAgICBCU1M6ICUwOGxYIC0+ICUwOGxYIHN0YWNrOiAlMDhsWCAtPiAlMDhsWFxuIiwKCQlpMzg2Ym9vdF9zdGFydCwgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydC0xLAoJCWkzODZib290X3JvbWRhdGFfZGVzdCwgaTM4NmJvb3Rfcm9tZGF0YV9kZXN0K2kzODZib290X3JvbWRhdGFfc2l6ZS0xLAoJCWkzODZib290X2Jzc19zdGFydCwgaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLTEsCgkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLAoJCWkzODZib290X2Jzc19zdGFydCtpMzg2Ym9vdF9ic3Nfc2l6ZStDT05GSUdfU1lTX1NUQUNLX1NJWkUtMSk7CgoqLwoKCXJldHVybiAoMCk7Cn0KCnN0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKewoJaW50IGk7CgoJcHV0cyAoIkRSQU0gQ29uZmlndXJhdGlvbjpcbiIpOwoKCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKCQlwcmludGYgKCJCYW5rICMlZDogJTA4bHggIiwgaSwgZ2QtPmJkLT5iaV9kcmFtW2ldLnN0YXJ0KTsKCQlwcmludF9zaXplIChnZC0+YmQtPmJpX2RyYW1baV0uc2l6ZSwgIlxuIik7Cgl9CgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCnsKCXB1dHMgKCJGbGFzaDogIik7CglwcmludF9zaXplIChzaXplLCAiXG4iKTsKfQoKLyoKICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBib2FyZC4uLgogKgogKiBJbml0aWFsaXplIGFuIFNNQyBmb3Igc2VyaWFsIGNvbW1zLCBhbmQgY2Fycnkgb3V0IHNvbWUgaGFyZHdhcmUKICogdGVzdHMuCiAqCiAqIFRoZSBmaXJzdCBwYXJ0IG9mIGluaXRpYWxpemF0aW9uIGlzIHJ1bm5pbmcgZnJvbSBGbGFzaCBtZW1vcnk7CiAqIGl0cyBtYWluIHB1cnBvc2UgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgUkFNIHNvIHRoYXQgd2UKICogY2FuIHJlbG9jYXRlIHRoZSBtb25pdG9yIGNvZGUgdG8gUkFNLgogKi8KCi8qCiAqIEFsbCBhdHRlbXB0cyB0byBjb21lIHVwIHdpdGggYSAiY29tbW9uIiBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQogKiB0aGF0IHdvcmtzIGZvciBhbGwgYm9hcmRzIGFuZCBhcmNoaXRlY3R1cmVzIGZhaWxlZDogc29tZSBvZiB0aGUKICogcmVxdWlyZW1lbnRzIGFyZSBqdXN0IF90b29fIGRpZmZlcmVudC4gVG8gZ2V0IHJpZCBvZiB0aGUgcmVzdWx0aW5nCiAqIG1lc3Mgb2YgYm9hcmQgZGVwZW5kZW5kICNpZmRlZidlZCBjb2RlIHdlIG5vdyBtYWtlIHRoZSB3aG9sZQogKiBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBjb25maWd1cmFibGUgdG8gdGhlIHVzZXIuCiAqCiAqIFRoZSByZXF1aXJlbWVudHMgZm9yIGFueSBuZXcgaW5pdGFsaXphdGlvbiBmdW5jdGlvbiBpcyBzaW1wbGU6IGl0CiAqIHJlY2VpdmVzIGEgcG9pbnRlciB0byB0aGUgImdsb2JhbCBkYXRhIiBzdHJ1Y3R1cmUgYXMgaXQncyBvbmx5CiAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIHJldHVybiBjb2RlLCB3aGVyZSAwIG1lYW5zCiAqICJjb250aW51ZSIgYW5kICE9IDAgbWVhbnMgImZhdGFsIGVycm9yLCBoYW5nIHRoZSBzeXN0ZW0iLgogKi8KdHlwZWRlZiBpbnQgKGluaXRfZm5jX3QpICh2b2lkKTsKCnN0YXRpYyBpbnQgY2FsY3VsYXRlX3JlbG9jYXRpb25fYWRkcmVzcyh2b2lkKTsKc3RhdGljIGludCBjb3B5X3Vib290X3RvX3JhbSh2b2lkKTsKc3RhdGljIGludCBjbGVhcl9ic3Modm9pZCk7CnN0YXRpYyBpbnQgZG9fZWxmX3JlbG9jX2ZpeHVwcyh2b2lkKTsKCmluaXRfZm5jX3QgKmluaXRfc2VxdWVuY2VfZltdID0gewoJY3B1X2luaXRfZiwKCWJvYXJkX2Vhcmx5X2luaXRfZiwKCWVudl9pbml0LAoJaW5pdF9iYXVkcmF0ZSwKCXNlcmlhbF9pbml0LAoJY29uc29sZV9pbml0X2YsCglkcmFtX2luaXRfZiwKCWNhbGN1bGF0ZV9yZWxvY2F0aW9uX2FkZHJlc3MsCgljb3B5X3Vib290X3RvX3JhbSwKCWNsZWFyX2JzcywKCWRvX2VsZl9yZWxvY19maXh1cHMsCgoJTlVMTCwKfTsKCmluaXRfZm5jX3QgKmluaXRfc2VxdWVuY2VfcltdID0gewoJY3B1X2luaXRfciwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KCWJvYXJkX2Vhcmx5X2luaXRfciwJLyogYmFzaWMgYm9hcmQgZGVwZW5kZW50IHNldHVwICovCglkcmFtX2luaXQsCQkvKiBjb25maWd1cmUgYXZhaWxhYmxlIFJBTSBiYW5rcyAqLwoJaW50ZXJydXB0X2luaXQsCQkvKiBzZXQgdXAgZXhjZXB0aW9ucyAqLwoJdGltZXJfaW5pdCwKCWRpc3BsYXlfYmFubmVyLAoJZGlzcGxheV9kcmFtX2NvbmZpZywKCglOVUxMLAp9OwoKZ2RfdCAqZ2Q7CgpzdGF0aWMgaW50IGNhbGN1bGF0ZV9yZWxvY2F0aW9uX2FkZHJlc3Modm9pZCkKewoJdm9pZCAqdGV4dF9zdGFydCA9ICZfX3RleHRfc3RhcnQ7Cgl2b2lkICpic3NfZW5kID0gJl9fYnNzX2VuZDsKCXZvaWQgKmRlc3RfYWRkcjsKCXVsb25nIHJlbF9vZmZzZXQ7CgoJLyogQ2FsY3VsYXRlIGRlc3RpbmF0aW9uIFJBTSBBZGRyZXNzIGFuZCByZWxvY2F0aW9uIG9mZnNldCAqLwoJZGVzdF9hZGRyID0gKHZvaWQgKilnZC0+cmFtX3NpemU7CglkZXN0X2FkZHIgLT0gQ09ORklHX1NZU19TVEFDS19TSVpFOwoJZGVzdF9hZGRyIC09IChic3NfZW5kIC0gdGV4dF9zdGFydCk7CglyZWxfb2Zmc2V0ID0gZGVzdF9hZGRyIC0gdGV4dF9zdGFydDsKCglnZC0+c3RhcnRfYWRkcl9zcCA9IGdkLT5yYW1fc2l6ZTsKCWdkLT5yZWxvY2FkZHIgPSAodWxvbmcpZGVzdF9hZGRyOwoJZ2QtPnJlbG9jX29mZiA9IHJlbF9vZmZzZXQ7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY29weV91Ym9vdF90b19yYW0odm9pZCkKewoJdWxvbmcgKmRzdF9hZGRyID0gKHVsb25nICopZ2QtPnJlbG9jYWRkcjsKCXVsb25nICpzcmNfYWRkciA9ICh1bG9uZyAqKSZfX3RleHRfc3RhcnQ7Cgl1bG9uZyAqZW5kX2FkZHIgPSAodWxvbmcgKikmX19kYXRhX2VuZDsKCgl3aGlsZSAoc3JjX2FkZHIgPCBlbmRfYWRkcikKCQkqZHN0X2FkZHIrKyA9ICpzcmNfYWRkcisrOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNsZWFyX2Jzcyh2b2lkKQp7Cgl2b2lkICpic3Nfc3RhcnQgPSAmX19ic3Nfc3RhcnQ7Cgl2b2lkICpic3NfZW5kID0gJl9fYnNzX2VuZDsKCgl1bG9uZyAqZHN0X2FkZHIgPSAodWxvbmcgKikoYnNzX3N0YXJ0ICsgZ2QtPnJlbG9jX29mZik7Cgl1bG9uZyAqZW5kX2FkZHIgPSAodWxvbmcgKikoYnNzX2VuZCArIGdkLT5yZWxvY19vZmYpOzsKCgl3aGlsZSAoZHN0X2FkZHIgPCBlbmRfYWRkcikKCQkqZHN0X2FkZHIrKyA9IDB4MDAwMDAwMDA7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgZG9fZWxmX3JlbG9jX2ZpeHVwcyh2b2lkKQp7CglFbGYzMl9SZWwgKnJlX3NyYyA9IChFbGYzMl9SZWwgKikoJl9fcmVsX2R5bl9zdGFydCk7CglFbGYzMl9SZWwgKnJlX2VuZCA9IChFbGYzMl9SZWwgKikoJl9fcmVsX2R5bl9lbmQpOwoKCWRvIHsKCQlpZiAocmVfc3JjLT5yX29mZnNldCA+PSBDT05GSUdfU1lTX1RFWFRfQkFTRSkKCQkJaWYgKCooRWxmMzJfQWRkciAqKShyZV9zcmMtPnJfb2Zmc2V0ICsgZ2QtPnJlbG9jX29mZikgPj0gQ09ORklHX1NZU19URVhUX0JBU0UpCgkJCQkqKEVsZjMyX0FkZHIgKikocmVfc3JjLT5yX29mZnNldCArIGdkLT5yZWxvY19vZmYpICs9IGdkLT5yZWxvY19vZmY7Cgl9IHdoaWxlIChyZV9zcmMrKyA8IHJlX2VuZCk7CgoJcmV0dXJuIDA7Cn0KCi8qIExvYWQgVS1Cb290IGludG8gUkFNLCBpbml0aWFsaXplIEJTUywgcGVyZm9ybSByZWxvY2F0aW9uIGFkanVzdG1lbnRzICovCnZvaWQgYm9hcmRfaW5pdF9mKHVsb25nIGJvb3RfZmxhZ3MpCnsKCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CgoJZ2QtPmZsYWdzID0gYm9vdF9mbGFnczsKCglmb3IgKGluaXRfZm5jX3B0ciA9IGluaXRfc2VxdWVuY2VfZjsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIpIHsKCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkKCQkJaGFuZygpOwoJfQoKCWdkLT5mbGFncyB8PSBHRF9GTEdfUkVMT0M7CgoJLyogRW50ZXIgdGhlIHJlbG9jYXRlZCBVLUJvb3QhICovCglyZWxvY2F0ZV9jb2RlKGdkLT5zdGFydF9hZGRyX3NwLCBnZCwgZ2QtPnJlbG9jYWRkcik7CgoJLyogTk9UUkVBQ0hFRCAtIHJlbG9jYXRlX2NvZGUoKSBkb2VzIG5vdCByZXR1cm4gKi8KCXdoaWxlKDEpOwp9Cgp2b2lkIGJvYXJkX2luaXRfcihnZF90ICppZCwgdWxvbmcgZGVzdF9hZGRyKQp7CgljaGFyICpzOwoJdWxvbmcgc2l6ZTsKCXN0YXRpYyBiZF90IGJkX2RhdGE7CglzdGF0aWMgZ2RfdCBnZF9kYXRhOwoJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMSk7CgoJLyogR2xvYmFsIGRhdGEgcG9pbnRlciBpcyBub3cgd3JpdGFibGUgKi8KCWdkID0gJmdkX2RhdGE7CgltZW1jcHkoZ2QsIGlkLCBzaXplb2YoZ2RfdCkpOwoKCS8qIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiYXJyaWVyIG5lZWRlZCBmb3IgR0NDID49IDMuNCAqLwoJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKTsKCglnZC0+YmQgPSAmYmRfZGF0YTsKCW1lbXNldCAoZ2QtPmJkLCAwLCBzaXplb2YgKGJkX3QpKTsKCXNob3dfYm9vdF9wcm9ncmVzcygweDIyKTsKCglnZC0+YmF1ZHJhdGUgPSAgQ09ORklHX0JBVURSQVRFOwoKCW1lbV9tYWxsb2NfaW5pdCgoKCh1bG9uZylkZXN0X2FkZHIgLSBDT05GSUdfU1lTX01BTExPQ19MRU4pKzMpJn4zLAoJCQlDT05GSUdfU1lTX01BTExPQ19MRU4pOwoKCWZvciAoaW5pdF9mbmNfcHRyID0gaW5pdF9zZXF1ZW5jZV9yOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0cikgewoJCWlmICgoKmluaXRfZm5jX3B0cikoKSAhPSAwKQoJCQloYW5nICgpOwoJfQoJc2hvd19ib290X3Byb2dyZXNzKDB4MjMpOwoKI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVEkKCXNlcmlhbF9pbml0aWFsaXplKCk7CiNlbmRpZgoJLyogY29uZmlndXJlIGF2YWlsYWJsZSBGTEFTSCBiYW5rcyAqLwoJc2l6ZSA9IGZsYXNoX2luaXQoKTsKCWRpc3BsYXlfZmxhc2hfY29uZmlnKHNpemUpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjQpOwoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI1KTsKCgkvKiBpbml0aWFsaXplIGVudmlyb25tZW50ICovCgllbnZfcmVsb2NhdGUgKCk7CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyNik7CgoKI2lmZGVmIENPTkZJR19DTURfTkVUCgkvKiBJUCBBZGRyZXNzICovCgliZF9kYXRhLmJpX2lwX2FkZHIgPSBnZXRlbnZfSVBhZGRyICgiaXBhZGRyIik7CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKCS8qCgkgKiBEbyBwY2kgY29uZmlndXJhdGlvbgoJICovCglwY2lfaW5pdCgpOwojZW5kaWYKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyNyk7CgoKCXN0ZGlvX2luaXQgKCk7CgoJanVtcHRhYmxlX2luaXQgKCk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSAoYWZ0ZXIgdGhlIHJlbG9jYXRpb24gYW5kIGRldmljZXMgaW5pdCkgKi8KCWNvbnNvbGVfaW5pdF9yKCk7CgojaWZkZWYgQ09ORklHX01JU0NfSU5JVF9SCgkvKiBtaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMgKi8KCW1pc2NfaW5pdF9yKCk7CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMgKCJQQ01DSUE6Iik7CglwY21jaWFfaW5pdCgpOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJLR0RCOiAgIik7CglrZ2RiX2luaXQoKTsKI2VuZGlmCgoJLyogZW5hYmxlIGV4Y2VwdGlvbnMgKi8KCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyOCk7CgojaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKCXN0YXR1c19sZWRfc2V0IChTVEFUVVNfTEVEX0JPT1QsIFNUQVRVU19MRURfQkxJTktJTkcpOwojZW5kaWYKCgl1ZGVsYXkoMjApOwoKCS8qIEluaXRpYWxpemUgZnJvbSBlbnZpcm9ubWVudCAqLwoJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewoJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7Cgl9CiNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQoJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewoJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7Cgl9CiNlbmRpZgoKCVdBVENIRE9HX1JFU0VUKCk7CgojaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJJREU6ICAgIik7CglpZGVfaW5pdCgpOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJTQ1NJOiAgIik7CglzY3NpX2luaXQoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJET0M6ICAgIik7Cglkb2NfaW5pdCgpOwojZW5kaWYKCiNpZmRlZiBDT05GSUdfQklUQkFOR01JSQoJYmJfbWlpcGh5X2luaXQoKTsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQojaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMoIk5ldDogICAiKTsKI2VuZGlmCglldGhfaW5pdGlhbGl6ZShnZC0+YmQpOwojZW5kaWYKCiNpZiAoIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpKSAmJiAoMCkKCVdBVENIRE9HX1JFU0VUKCk7CiMgaWZkZWYgREVCVUcKCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOwojIGVuZGlmCglyZXNldF9waHkoKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAoJV0FUQ0hET0dfUkVTRVQoKTsKCS8qCgkgKiBTb21lIHBhcnRzIGNhbiBiZSBvbmx5IGluaXRpYWxpemVkIGlmIGFsbCBvdGhlcnMgKGxpa2UKCSAqIEludGVycnVwdHMpIGFyZSB1cCBhbmQgcnVubmluZyAoaS5lLiB0aGUgUEMtc3R5bGUgSVNBCgkgKiBrZXlib2FyZCkuCgkgKi8KCWxhc3Rfc3RhZ2VfaW5pdCgpOwojZW5kaWYKCgojaWZkZWYgQ09ORklHX1BPU1QKCXBvc3RfcnVuIChOVUxMLCBQT1NUX1JBTSB8IHBvc3RfYm9vdG1vZGVfZ2V0KDApKTsKI2VuZGlmCgoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI5KTsKCgkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KCWZvciAoOzspIHsKCQltYWluX2xvb3AoKTsKCX0KCgkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KfQoKdm9pZCBoYW5nICh2b2lkKQp7CglwdXRzICgiIyMjIEVSUk9SICMjIyBQbGVhc2UgUkVTRVQgdGhlIGJvYXJkICMjI1xuIik7Cglmb3IgKDs7KTsKfQoKdW5zaWduZWQgbG9uZyBkb19nb19leGVjICh1bG9uZyAoKmVudHJ5KShpbnQsIGNoYXIgKiBjb25zdCBbXSksIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7Cgl1bnNpZ25lZCBsb25nIHJldCA9IDA7CgljaGFyICoqYXJndl90bXA7CgoJLyoKCSAqIHg4NiBkb2VzIG5vdCB1c2UgYSBkZWRpY2F0ZWQgcmVnaXN0ZXIgdG8gcGFzcyB0aGUgcG9pbnRlciB0bwoJICogdGhlIGdsb2JhbF9kYXRhLCBzbyBpdCBpcyBpbnN0ZWFkIHBhc3NlZCBhcyBhcmd2Wy0xXS4gQnkgdXNpbmcKCSAqIGFyZ3ZbLTFdLCB0aGUgY2FsbGVkICdBcHBsaWNhdGlvbicgY2FuIHVzZSB0aGUgY29udGVudHMgb2YKCSAqIGFyZ3YgbmF0aXZlbHkuIEhvd2V2ZXIsIHRvIHNhZmVseSB1c2UgYXJndlstMV0gYSBuZXcgY29weSBvZgoJICogYXJndiBpcyBuZWVkZWQgd2l0aCB0aGUgZXh0cmEgZWxlbWVudAoJICovCglhcmd2X3RtcCA9IG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIChhcmdjICsgMSkpOwoKCWlmIChhcmd2X3RtcCkgewoJCWFyZ3ZfdG1wWzBdID0gKGNoYXIgKilnZDsKCgkJbWVtY3B5KCZhcmd2X3RtcFsxXSwgYXJndiwgKHNpemVfdCkoc2l6ZW9mKGNoYXIgKikgKiBhcmdjKSk7CgoJCXJldCA9IChlbnRyeSkgKGFyZ2MsICZhcmd2X3RtcFsxXSk7CgkJZnJlZShhcmd2X3RtcCk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKdm9pZCBzZXR1cF9wY2F0X2NvbXBhdGliaWxpdHkodm9pZCkKCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3NldHVwX3BjYXRfY29tcGF0aWJpbGl0eSIpKSk7Cgp2b2lkIF9fc2V0dXBfcGNhdF9jb21wYXRpYmlsaXR5KHZvaWQpCnsKfQo=