LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YWxpNTEyeC5oPgojaW5jbHVkZSA8c3BpLmg+CiNpbmNsdWRlIDxuZXRkZXYuaD4KCkRFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKI3VuZGVmIFNDNTIwX0NEUF9ERUJVRwoKI2lmZGVmCVNDNTIwX0NEUF9ERUJVRwojZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKI2Vsc2UKI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCi8qCiAqIFRoZW9yeToKICogV2UgZmlyc3Qgc2V0IHVwIGFsbCBJUlFzIHRvIGJlIG5vbi1wY2ksIGVkZ2UgdHJpZ2dlcmVkLAogKiB3aGVuIHdlIGxhdGVyIGVudW1lcmF0ZSB0aGUgcGNpIGJ1cyBhbmQgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIGdldHMKICogY2FsbGVkIHdlIHJlYWxsb2NhdGUgaXJxcyB0byB0aGUgcGNpIGJ1cyB3aXRoIHNjNTIwX3BjaV9zZXRfaXJxKCkKICogYXMgbmVlZGVkLiBXaGUgY2hvb3NlIHRoZSBpcnFzIHRvIGdyYW0gZnJvbSBhIGNvbmZpZ3VyYWJsZSBsaXN0CiAqIGluc2lkZSBwY2lfc2M1MjBfZml4dXBfaXJxKCkgKElmIHRoaXMgbGlzdCBjb250YWlucyBzdHVwaWQgaXJxJ3MKICogc3VjaCBhcyAwIHRobmdhcyB3aWxsIG5vdCB3b3JrKQogKi8KCnN0YXRpYyB2b2lkIGlycV9pbml0KHZvaWQpCnsKCS8qIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdCBtb2RlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElDSUNSLCAweDQwKTsKCgkvKiBzZXQgYWxsIGlycXMgdG8gZWRnZSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX01QSUNNT0RFLCAweDAwKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDFQSUNNT0RFLCAweDAwKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDJQSUNNT0RFLCAweDAwKTsKCgkvKiBhY3RpdmUgbG93IHBvbGFyaXR5IG9uIFBJQyBpbnRlcnJ1cHQgcGlucywKCSAqICBhY3RpdmUgaGlnaCBwb2xhcml0eSBvbiBhbGwgb3RoZXIgaXJxIHBpbnMgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wsIDB4MDAwMCk7CgoJLyogc2V0IGlycSBudW1iZXIgbWFwcGluZyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SME1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDAgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAyIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDBNQVAsIFNDNTIwX0lSUTApOyAgICAgICAgICAgICAvKiBTZXQgUElUIHRpbWVyIDAgSU5UIHRvIElSUTAgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBQSVQgdGltZXIgMSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQyTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBQSVQgdGltZXIgMiBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRCTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRDTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEMgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRETUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9ETUFCQ0lOVE1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBETUEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgU3luY2hyb25pdXMgc2VyaWFsIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1dEVE1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgICAvKiBkaXNhYmxlIFdhdGNoZG9nIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1JUQ01BUCwgU0M1MjBfSVJROCk7ICAgICAgICAgICAgICAvKiBTZXQgUlRDIGludCB0byA4ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV1BWTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgd3JpdGUgcHJvdGVjdCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9JQ0VNQVAsIFNDNTIwX0lSUTEpOyAgICAgICAgICAgICAgLyogU2V0IElDRSBEZWJ1ZyBTZXJpZWxwb3J0IElOVCB0byBJUlExICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRkVSUk1BUCxTQzUyMF9JUlExMyk7ICAgICAgICAgICAgIC8qIFNldCBGUCBlcnJvciBJTlQgdG8gSVJRMTMgKi8KCglpZiAoQ09ORklHX1NZU19VU0VfU0lPX1VBUlQpIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7IC8qIGRpc2FibGUgaW50ZXJuYWwgVUFSVDEgSU5UICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQyTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIGludGVybmFsIFVBUlQyIElOVCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLCBTQzUyMF9JUlEzKTsgICAgICAgICAgLyogU2V0IEdQSVJRMyAoSVNBIElSUTMpIHRvIElSUTMgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A0SU1BUCwgU0M1MjBfSVJRNCk7ICAgICAgICAgIC8qIFNldCBHUElSUTQgKElTQSBJUlE0KSB0byBJUlE0ICovCgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwgU0M1MjBfSVJRNCk7ICAgICAgICAgLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlE0ICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQyTUFQLCBTQzUyMF9JUlEzKTsgICAgICAgICAvKiBTZXQgaW50ZXJuYWwgVUFSVDIgSU5UIHRvIElSUTMgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AzSU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgR1BJUlEzIChJU0EgSVJRMykgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A0SU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgR1BJUlE0IChJU0EgSVJRNCkgKi8KCX0KCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AxSU1BUCwgU0M1MjBfSVJRMSk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTEgKFNJTyBJUlExKSB0byBJUlExICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A1SU1BUCwgU0M1MjBfSVJRNSk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTUgKElTQSBJUlE1KSB0byBJUlE1ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A2SU1BUCwgU0M1MjBfSVJRNik7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTYgKElTQSBJUlE2KSB0byBJUlE2ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A3SU1BUCwgU0M1MjBfSVJRNyk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTcgKElTQSBJUlE3KSB0byBJUlE3ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A4SU1BUCwgU0M1MjBfSVJROCk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTggKFNJTyBJUlE4KSB0byBJUlE4ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A5SU1BUCwgU0M1MjBfSVJROSk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTkgKElTQSBJUlEyKSB0byBJUlE5ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AwSU1BUCwgU0M1MjBfSVJRMTEpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTAgKElTQSBJUlExMSkgdG8gSVJRMTAgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDJJTUFQLCBTQzUyMF9JUlExMik7ICAgICAgICAgICAgLyogU2V0IEdQSVJRMiAoSVNBIElSUTEyKSB0byBJUlExMiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMTBJTUFQLFNDNTIwX0lSUTE0KTsgICAgICAgICAgICAvKiBTZXQgR1BJUlExMCAoSVNBIElSUTE0KSB0byBJUlExNCAqLwoKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QQ0lIT1NUTUFQLCAweDExZik7ICAgICAgICAgICAgICAgIC8qIE1hcCBQQ0kgaG9zdGJyaWRnZSBJTlQgdG8gTk1JICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfRUNDTUFQLCAweDEwMCk7ICAgICAgICAgICAgICAgICAgICAvKiBNYXAgU0RSQU0gRUNDIGZhaWx1cmUgSU5UIHRvIE5NSSAqLwoKfQoKI2lmZGVmIENPTkZJR19QQ0kKLyogUENJIHN0dWZmICovCnN0YXRpYyB2b2lkIHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKewoJLyogYSBjb25maWd1cmFibGUgbGlzdHMgb2YgaXJxcyB0byBzdGVhbAoJICogd2hlbiB3ZSBuZWVkIG9uZSAoYSBib2FyZCB3aXRoIG1vcmUgcGNpIGludGVycnVwdCBwaW5zCgkgKiB3b3VsZCB1c2UgYSBsYXJnZXIgdGFibGUgKi8KCXN0YXRpYyBpbnQgaXJxX2xpc3RbXSA9IHsKCQlDT05GSUdfU1lTX0ZJUlNUX1BDSV9JUlEsCgkJQ09ORklHX1NZU19TRUNPTkRfUENJX0lSUSwKCQlDT05GSUdfU1lTX1RISVJEX1BDSV9JUlEsCgkJQ09ORklHX1NZU19GT1JUSF9QQ0lfSVJRCgl9OwoJc3RhdGljIGludCBuZXh0X2lycV9pbmRleD0wOwoKCXVjaGFyIHRtcF9waW47CglpbnQgcGluOwoKCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOwoJcGluID0gdG1wX3BpbjsKCglwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCglpZiAoLTEgPT0gcGluKSB7CgkJcmV0dXJuOyAvKiBkZXZpY2UgdXNlIG5vIGlycSAqLwoJfQoKCgkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCglzd2l0Y2ggKFBDSV9ERVYoZGV2KSkgewoJY2FzZSAyMDoKCQlwaW4rPVNDNTIwX1BDSV9JTlRBOwoJCWJyZWFrOwoKCWNhc2UgMTk6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQjsKCQlicmVhazsKCgljYXNlIDE4OgoJCXBpbis9U0M1MjBfUENJX0lOVEM7CgkJYnJlYWs7CgoJY2FzZSAxNzoKCQlwaW4rPVNDNTIwX1BDSV9JTlREOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCXBpbiY9MzsgLyogd3JhcCBhcm91bmQgKi8KCglpZiAoc2M1MjBfcGNpX2ludHNbcGluXSA9PSAtMSkgewoJCS8qIHJlLXJvdXRlIG9uZSBpbnRlcnJ1cHQgZm9yIHVzICovCgkJaWYgKG5leHRfaXJxX2luZGV4ID4gMykgewoJCQlyZXR1cm47CgkJfQoJCWlmIChwY2lfc2M1MjBfc2V0X2lycShwaW4sIGlycV9saXN0W25leHRfaXJxX2luZGV4XSkpIHsKCQkJcmV0dXJuOwoJCX0KCQluZXh0X2lycV9pbmRleCsrOwoJfQoKCglpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgewoJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLAoJCQkJCSAgIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOwoJfQoJUFJJTlRGKCJmaXh1cF9pcnE6IGRldmljZSAlZCBwaW4gJWMgaXJxICVkXG4iLAoJICAgICAgIFBDSV9ERVYoZGV2KSwgJ0EnICsgcGluLCBzYzUyMF9wY2lfaW50c1twaW5dKTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9jZHBfaG9zZSA9IHsKCWZpeHVwX2lycTogcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEsCn07Cgp2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCnsKCXBjaV9zYzUyMF9pbml0KCZzYzUyMF9jZHBfaG9zZSk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBzaWxlbmNlX3VhcnQoaW50IHBvcnQpCnsKCW91dGIoMCwgcG9ydCsxKTsKfQoKdm9pZCBzZXR1cF9hbGlfc2lvKGludCB1YXJ0X3ByaW1hcnkpCnsKCWFsaTUxMnhfaW5pdCgpOwoKCWFsaTUxMnhfc2V0X2ZkYyhBTElfRU5BQkxFRCwgMHgzZjIsIDYsIDApOwoJYWxpNTEyeF9zZXRfcHAoQUxJX0VOQUJMRUQsIDB4Mjc4LCA3LCAzKTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMSwgdWFydF9wcmltYXJ5PzB4M2Y4OjB4M2U4LCA0KTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMiwgdWFydF9wcmltYXJ5PzB4MmY4OjB4MmU4LCAzKTsKCWFsaTUxMnhfc2V0X3J0YyhBTElfRElTQUJMRUQsIDAsIDApOwoJYWxpNTEyeF9zZXRfa2JjKEFMSV9FTkFCTEVELCAxLCAxMik7CglhbGk1MTJ4X3NldF9jaW8oQUxJX0VOQUJMRUQpOwoKCS8qIElyRGEgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTMsIDEsIDAsIDApOwoKCS8qIFNTSSBjaGlwIHNlbGVjdCBwaW5zICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNCwgMCwgMCwgMCk7ICAvKiBTU0lfQ1MgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE1LCAwLCAwLCAwKTsgIC8qIFNTSV9NViAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTYsIDAsIDAsIDApOyAgLyogU1NJX1NQSSMgKi8KCgkvKiBCb2FyZCBSRVYgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjAsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjEsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjIsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjMsIDAsIDAsIDEpOwp9CgoKLyogc2V0IHVwIHRoZSBJU0EgYnVzIHRpbWluZyBhbmQgc3lzdGVtIGFkZHJlc3MgbWFwcGluZ3MgKi8Kc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKewoKCS8qIHNldCB1cCB0aGUgR1AgSU8gcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzMxXzE2LCAweGY3ZmYpOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzE1XzAsIDB4ZmZmZik7CS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMTUtMCByZWcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DU1BGUywgMHhmOCk7CQkvKiBzZXQgdGhlIENTIHBpbiBmdW5jdGlvbiAgcmVnICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcwKTsKCgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NSVCwgMSk7ICAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUFcsIDMpOyAgIC8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTT0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRE9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JXLCAzKTsgICAgLyogc2V0IHRoZSBHUCBXUiBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfQk9PVENTQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBCT09UQ1MgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9ST01DUzFDVEwsIDB4MTgyMyk7CQkvKiBzZXQgdXAgdGltaW5nIG9mIFJPTUNTMSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMkNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MyICovCgoJLyogYWRqdXN0IHRoZSBtZW1vcnkgbWFwOgoJICogYnkgZGVmYXVsdCB0aGUgZmlyc3QgMjU2TUIgKDB4MDAwMDAwMDAgLSAweDBmZmZmZmZmKSBpcyBtYXBwZWQgdG8gU0RSQU0KCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCgkgKiB3ZSBuZWVkIHRvIG1hcCAxRy0xMjhrIC0gMUcgKDB4MzgwMDAwMDAgLSAweDNmZmZmZmZmKSB0byBDUzEgKi8KCgoJLyogU1JBTSA9IEdQQ1MzIDEyOGsgQCBkMDAwMC1lZmZmZiovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMiwgIDB4NGUwMDQwMGQpOwoKCS8qIElERTAgPSBHUENTNiAxZjAtMWY3ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMywgIDB4MzgwODAxZjApOwoKCS8qIElERTEgPSBHUENTNyAzZjYgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI0LCAgMHgzYzAwMDNmNik7CgkvKiBib290Y3MgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CgkvKiByb21jczIgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMywgMHhjYmZmZjAwMCk7CgkvKiByb21jczEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxNCwgMHhhYmZmZjgwMCk7CgkvKiA2ODAgTEVEUyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE1LCAweDMwMDAwNjQwKTsKCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCAwKTsKCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8KCglpZiAoQ09ORklHX1NZU19VU0VfU0lPX1VBUlQpIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCByZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpIHwgVUFSVDJfRElTfFVBUlQxX0RJUyk7CgkJc2V0dXBfYWxpX3NpbygxKTsKCX0gZWxzZSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwgcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSAmIH4oVUFSVDJfRElTfFVBUlQxX0RJUykpOwoJCXNldHVwX2FsaV9zaW8oMCk7CgkJc2lsZW5jZV91YXJ0KDB4M2U4KTsKCQlzaWxlbmNlX3VhcnQoMHgyZTgpOwoJfQoKfQoKLyogR1BDUyB1c2FnZQogKiBHUENTMCAgICAgICBQSU8yNyAoTk1JKQogKiBHUENTMSAgICAgICBST01DUzEKICogR1BDUzIgICAgICAgUk9NQ1MyCiAqIEdQQ1MzICAgICAgIFNSQU1DUyAgICAgICBQQVIyCiAqIEdQQ1M0ICAgICAgIHVudXNlZCAgICAgICBQQVIzCiAqIEdQQ1M1ICAgICAgIHVudXNlZCAgICAgICBQQVI0CiAqIEdQQ1M2ICAgICAgIElERQogKiBHUENTNyAgICAgICBJREUKICovCgoKLyogcGFyIHVzYWdlOgogKiBQQVIwICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjEgICBQQ0kgUk9NIG1hcHBpbmcKICogUEFSMiAgIFNSQU0KICogUEFSMyAgIElERQogKiBQQVI0ICAgSURFCiAqIFBBUjUgICBsZWdhY3lfdmlkZW8KICogUEFSNiAgIGxlZ2FjeV92aWRlbwogKiBQQVI3ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjggICBsZWdhY3lfdmlkZW8KICogUEFSOSAgIGxlZ2FjeV92aWRlbwogKiBQQVIxMCAgbGVnYWN5X3ZpZGVvCiAqIFBBUjExICBJU0FST00KICogUEFSMTIgIEJPT1RDUwogKiBQQVIxMyAgUk9NQ1MxCiAqIFBBUjE0ICBST01DUzIKICogUEFSMTUgIFBvcnQgMHg2ODAgTEVEIGRpc3BsYXkKICovCgovKgogKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtYXAgYSBjaHVuayBvZiBzaXplIGJ5dGVzCiAqIG9mIHRoZSBzeXN0ZW0gYWRkcmVzcyBzcGFjZSB0byB0aGUgSVNBIGJ1cwogKgogKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG1lbW9yeSBhZGRyZXNzCiAqIGFzIHNlZW4gYnkgdGhlIGhvc3QgKHdoaWNoIG1heSB2ZXJ5IHdpbGwgYmUgdGhlCiAqIHNhbWUgYXMgdGhlIGJ1cyBhZGRyZXNzKQogKi8KdTMyIGlzYV9tYXBfcm9tKHUzMiBidXNfYWRkciwgaW50IHNpemUpCnsKCXUzMiBwYXI7CgoJUFJJTlRGKCJpc2FfbWFwX3JvbSBhc2tlZCB0byBtYXAgJWQgYnl0ZXMgYXQgJXhcbiIsCgkgICAgICAgc2l6ZSwgYnVzX2FkZHIpOwoKCXBhciA9IHNpemU7CglpZiAocGFyIDwgMHg4MDAwMCkgewoJCXBhciA9IDB4ODAwMDA7Cgl9CglwYXIgPj49IDEyOwoJcGFyLS07CglwYXImPTB4N2Y7CglwYXIgPDw9IDE4OwoJcGFyIHw9IChidXNfYWRkcj4+MTIpOwoJcGFyIHw9IDB4NTAwMDAwMDA7CgoJUFJJTlRGICgic2V0dGluZyBQQVIxMSB0byAleFxuIiwgcGFyKTsKCgkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTEsICBwYXIpOwoKCXJldHVybiBidXNfYWRkcjsKfQoKLyoKICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKICogd2l0aCBwY2lfZ2V0X3JvbV93aW5kb3coKQogKi8Kdm9pZCBpc2FfdW5tYXBfcm9tKHUzMiBhZGRyKQp7CglQUklOVEYoImlzYV91bm1hcF9yb20gYXNrZWQgdG8gdW5tYXAgJXgiLCBhZGRyKTsKCWlmICgoYWRkcj4+MTIpID09IChyZWFkX21tY3JfbG9uZyhTQzUyMF9QQVIxMSkmMHgzZmZmZikpIHsKCQl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTEsIDApOwoJCVBSSU5URigiIGRvbmVcbiIpOwoJCXJldHVybjsKCX0KCVBSSU5URigiIG5vdCBvdXJzXG4iKTsKfQoKI2lmZGVmIENPTkZJR19QQ0kKI2RlZmluZSBQQ0lfUk9NX1RFTVBfU1BBQ0UgMHgxMDAwMAovKgogKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtYXAgYSBjaHVuayBvZiBzaXplIGJ5dGVzCiAqIG9mIHRoZSBzeXN0ZW0gYWRkcmVzcyBzcGFjZSB0byB0aGUgUENJIGJ1cywKICogc3VpdGFibGUgdG8gbWFwIFBDSSBST01TIChidXMgYWRkcmVzcyA8IDE2TSkKICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBob3N0IG1lbW9yeSBhZGRyZXNzCiAqIHdoaWNoIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhIGJ1cyBhZGRyZXNzCiAqIGJlZm9yZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgUENJIHJvbSBhZGRyZXNzCiAqIGRlY29kZXIKICovCnUzMiBwY2lfZ2V0X3JvbV93aW5kb3coc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgc2l6ZSkKewoJdTMyIHBhcjsKCglwYXIgPSBzaXplOwoJaWYgKHBhciA8IDB4ODAwMDApIHsKCQlwYXIgPSAweDgwMDAwOwoJfQoJcGFyID4+PSAxNjsKCXBhci0tOwoJcGFyJj0weDdmZjsKCXBhciA8PD0gMTQ7CglwYXIgfD0gKFBDSV9ST01fVEVNUF9TUEFDRT4+MTYpOwoJcGFyIHw9IDB4NzIwMDAwMDA7CgoJUFJJTlRGICgic2V0dGluZyBQQVIxIHRvICV4XG4iLCBwYXIpOwoKCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxLCAgcGFyKTsKCglyZXR1cm4gUENJX1JPTV9URU1QX1NQQUNFOwp9CgovKgogKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZWQgYW55IG1hcHBpbmcgY3JlYXRlZAogKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCiAqLwp2b2lkIHBjaV9yZW1vdmVfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHUzMiBhZGRyKQp7CglQUklOVEYoInBjaV9yZW1vdmVfcm9tX3dpbmRvdzogJXgiLCBhZGRyKTsKCWlmIChhZGRyID09IFBDSV9ST01fVEVNUF9TUEFDRSkgewoJCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxLCAwKTsKCQlQUklOVEYoIiBkb25lXG4iKTsKCQlyZXR1cm47Cgl9CglQUklOVEYoIiBub3Qgb3Vyc1xuIik7Cgp9CgovKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBwcm92aWRlIGFjY2VzIHRvIHRoZQogKiBsZWdhY3kgdmlkZW8gSS9PIHBvcnRzIG9uIHRoZSBQQ0kgYnVzLgogKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIHRvIEkvTyBwb3J0cyAweDNiMC0weDNiYiBhbmQKICogMHgzYzAtMHgzZGYgc2h1bGQgcmVzdWx0IGluIHRyYW5zYWN0aW9ucyBvbiB0aGUgUENJIGJ1cy4KICoKICovCmludCBwY2lfZW5hYmxlX2xlZ2FjeV92aWRlb19wb3J0cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCnsKCS8qIE1hcCB2aWRlbyBtZW1vcnkgdG8gMHhhMDAwMCovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMCwgIDB4NzIwMDQwMGEpOwoKCS8qIGZvcndhcmQgYWxsIEkvTyBhY2Nlc3NlcyB0byBQQ0kgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsCgkJCXJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgfCBJT19IT0xFX0RFU1RfUENJKTsKCgoJLyogc28gd2UgbWFwIGF3YXkgYWxsIGlvIHBvcnRzIHRvIHBjaSAob25seSB3YXkgdG8gYWNjZXNzIHBjaSBpbwoJICogYmVsb3cgMHg0MDAuIEJ1dCB0aGVuIHdlIGhhdmUgdG8gbWFwIGJhY2sgdGhlIHBvcnRpb25zIHRoYXQgd2UgZG9udAoJICogdXNlIHNvIHRoYXQgdGhlIGdlbmVyYXRlIGN5Y2xlcyBvbiB0aGUgR1BJTyBidXMgd2hlcmUgdGhlIHNpbyBhbmQKCSAqIElTQSBzbG90cyBhcmUgY29ubmVjdGVkLCB0aGlzIHJlcXVyZSB0aGUgdXNlIG9mIHNldmVyYWwgUEFSIHJlZ2lzdGVycwoJICovCgoJLyogYnJpbmcgMHgxMDAgLSAweDFlZiBiYWNrIHRvIElTQSB1c2luZyBQQVI1ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNSwgMHgzMGVmMDEwMCk7CgoJLyogSURFIHVzZSAxZjAtMWY3ICovCgoJLyogYnJpbmcgMHgxZjggLSAweDJmNyBiYWNrIHRvIElTQSB1c2luZyBQQVI2ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNiwgMHgzMGZmMDFmOCk7CgoJLyogY29tMiB1c2UgMmY4LTJmZiAqLwoKCS8qIGJyaW5nIDB4MzAwIC0gMHgzYWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjcsIDB4MzBhZjAzMDApOwoKCS8qIHZnYSB1c2UgM2IwLTNiYiAqLwoKCS8qIGJyaW5nIDB4M2JjIC0gMHgzYmYgYmFjayB0byBJU0EgdXNpbmcgUEFSOCAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjgsIDB4MzAwMzAzYmMpOwoKCS8qIHZnYSB1c2UgM2MwLTNkZiAqLwoKCS8qIGJyaW5nIDB4M2UwIC0gMHgzZjUgYmFjayB0byBJU0EgdXNpbmcgUEFSOSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjksIDB4MzAxNTAzZTApOwoKCS8qIGlkZSB1c2UgM2Y2ICovCgoJLyogYnJpbmcgMHgzZjcgIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjEwICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTAsIDB4MzAwMDAzZjcpOwoKCS8qIGNvbTEgdXNlIDNmOC0zZmYgKi8KCglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIE1pc2NlbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zCiAqLwoKaW50IGJvYXJkX2luaXQodm9pZCkKewoJaW5pdF9zYzUyMCgpOwoJYnVzX2luaXQoKTsKCWlycV9pbml0KCk7CgoJLyogbWF4IGRyaXZlIGN1cnJlbnQgb24gU0RSQU0gKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9EU0NUTCwgMHgwMTAwKTsKCgkvKiBlbnRlciBkZWJ1ZyBtb2RlIGFmdGVyIG5leHQgcmVzZXQgKG9ubHkgaWYganVtcGVyIGlzIGFsc28gc2V0KSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1JFU0NGRywgMHgwOCk7CgkvKiBjb25maWd1cmUgdGhlIHNvZnR3YXJlIHRpbWVyIHRvIDMzLjMzM01IeiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NXVE1SQ0ZHLCAwKTsKCWdkLT5idXNfY2xrID0gMzMzMzMwMDA7CgoJcmV0dXJuIDA7Cn0KCmludCBkcmFtX2luaXQodm9pZCkKewoJaW5pdF9zYzUyMF9kcmFtKCk7CglyZXR1cm4gMDsKfQoKdm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MoaW50IHZhbCkKewoJaWYgKHZhbCA8IC0zMikgdmFsID0gLTE7ICAvKiBsZXQgdGhpbmdzIGNvbXBhdGlibGUgKi8KCW91dGIodmFsJjB4ZmYsIDB4ODApOwoJb3V0YigodmFsJjB4ZmYwMCk+PjgsIDB4NjgwKTsKfQoKCmludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKewoJaW50IG1pbm9yOwoJaW50IG1ham9yOwoKCW1ham9yID0gbWlub3IgPSAwOwoJbWFqb3IgfD0gYWxpNTEyeF9jaW9faW4oMjMpPzI6MDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIyKT8xOjA7CgltaW5vciB8PSBhbGk1MTJ4X2Npb19pbigyMSk/MjowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjApPzE6MDsKCglwcmludGYoIkFNRCBTQzUyMCBDRFAgcmV2aXNpb24gJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7CgoJcmV0dXJuIDA7Cn0KCgp2b2lkIHNzaV9jaGlwX3NlbGVjdChpbnQgZGV2KQp7CgoJLyogU3B1bmsgYm9hcmQ6IFNQSSBFRVBST00gaXMgYWN0aXZlLWxvdywgTVcgRUVQUk9NIGFuZCBBVVggYXJlIGFjdGl2ZSBoaWdoICovCglzd2l0Y2ggKGRldikgewoJY2FzZSAxOiAvKiBTUEkgRUVQUk9NICovCgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAwKTsKCQlicmVhazsKCgljYXNlIDI6IC8qIE1XIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNSwgMSk7CgkJYnJlYWs7CgoJY2FzZSAzOiAvKiBBVVggKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTQsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMDoKCQlhbGk1MTJ4X2Npb19vdXQoMTYsIDEpOwoJCWFsaTUxMnhfY2lvX291dCgxNSwgMCk7CgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAwKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCXByaW50ZigiSWxsZWdhbCBTU0kgZGV2aWNlIHJlcXVlc3RlZDogJWRcbiIsIGRldik7Cgl9Cn0KCnZvaWQgc3BpX2VlcHJvbV9wcm9iZShpbnQgeCkKewp9CgppbnQgc3BpX2VlcHJvbV9yZWFkKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKaW50IHNwaV9lZXByb21fd3JpdGUoaW50IHgsIGludCBvZmZzZXQsIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKICAgICAgIHJldHVybiAwOwp9Cgp2b2lkIHNwaV9pbml0X2Yodm9pZCkKewojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSQoJc3BpX2VlcHJvbV9wcm9iZSgxKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfTVcKCW13X2VlcHJvbV9wcm9iZSgyKTsKI2VuZGlmCn0KCnNzaXplX3Qgc3BpX3JlYWQodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CglpbnQgb2Zmc2V0OwoJaW50IGk7Cglzc2l6ZV90IHJlczsKCglvZmZzZXQgPSAwOwoJZm9yIChpPTA7aTxhbGVuO2krKykgewoJCW9mZnNldCA8PD0gODsKCQlvZmZzZXQgfD0gYWRkcltpXTsKCX0KCiNpZmRlZiBDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfU1BJCglyZXMgPSBzcGlfZWVwcm9tX3JlYWQoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fcmVhZCgyLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZiAhZGVmaW5lZChDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfU1BJKSAmJiAhZGVmaW5lZChDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfTVcpCglyZXMgPSAwOwojZW5kaWYKCXJldHVybiByZXM7Cn0KCnNzaXplX3Qgc3BpX3dyaXRlKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV93cml0ZSgxLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfTVcKCXJlcyA9IG13X2VlcHJvbV93cml0ZSgyLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZiAhZGVmaW5lZChDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfU1BJKSAmJiAhZGVmaW5lZChDT05GSUdfU1lTX1NDNTIwX0NEUF9VU0VfTVcpCglyZXMgPSAwOwojZW5kaWYKCXJldHVybiByZXM7Cn0KCmludCBib2FyZF9ldGhfaW5pdChiZF90ICpiaXMpCnsKCXJldHVybiBwY2lfZXRoX2luaXQoYmlzKTsKfQo=