LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSA8c3RkYXJnLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmRlZjE2LmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5udC5oIiAgICAgLyogZm9yIFBDT05URVhUICovCiNpbmNsdWRlICJ3aW5jb24uaCIgICAgLyogZm9yIE1PVVNFX0VWRU5UX1JFQ09SRCAqLwojaW5jbHVkZSAibWlzY2VtdS5oIgoKI2RlZmluZSBNQVhfRE9TX0RSSVZFUyAgMjYKCnN0cnVjdCBfRE9TRVZFTlQ7CgovKiBhbW91bnQgb2Ygc3BhY2UgcmVzZXJ2ZWQgZm9yIHJlbGF5IHN0YWNrICovCiNkZWZpbmUgRE9TVk1fUkVMQVlfREFUQV9TSVpFIDQwOTYKCi8qIHZhcmlvdXMgcmVhbC1tb2RlIGNvZGUgc3R1YnMgKi8Kc3RydWN0IERQTUlfc2VnbWVudHMKewogICAgV09SRCB3cmFwX3NlZzsKICAgIFdPUkQgeG1zX3NlZzsKICAgIFdPUkQgZHBtaV9zZWc7CiAgICBXT1JEIGRwbWlfc2VsOwogICAgV09SRCBpbnQ0OF9zZWw7CiAgICBXT1JEIGludDE2X3NlbDsKICAgIFdPUkQgcmVsYXlfY29kZV9zZWw7CiAgICBXT1JEIHJlbGF5X2RhdGFfc2VsOwp9OwoKLyogNDgtYml0IHNlZ21lbnRlZCBwb2ludGVycyBmb3IgRE9TIERQTUkzMiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgV09SRCAgc2VsZWN0b3I7CiAgRFdPUkQgb2Zmc2V0Owp9IFNFR1BUUjQ4LCBGQVJQUk9DNDg7CgojZGVmaW5lIERPU0NPTkZfTUVNX0hJR0ggICAgICAgIDB4MDAwMQojZGVmaW5lIERPU0NPTkZfTUVNX1VNQiAgICAgICAgIDB4MDAwMgojZGVmaW5lIERPU0NPTkZfTlVNTE9DSyAgICAgICAgIDB4MDAwNAojZGVmaW5lIERPU0NPTkZfS0VZQl9DT05WICAgICAgIDB4MDAwOAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBsYXN0ZHJpdmU7CiAgICBpbnQgYnJrX2ZsYWc7CiAgICBpbnQgZmlsZXM7CiAgICBpbnQgc3RhY2tzX25yOwogICAgaW50IHN0YWNrc19zejsKICAgIGludCBidWY7CiAgICBpbnQgYnVmMjsKICAgIGludCBmY2JzOwogICAgaW50IGZsYWdzOwogICAgY2hhciAqc2hlbGw7CiAgICBjaGFyICpjb3VudHJ5Owp9IERPU0NPTkY7Cgp0eXBlZGVmIHZvaWQgKCpET1NSRUxBWSkoQ09OVEVYVDg2Kix2b2lkKik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpSTUNCUFJPQykoQ09OVEVYVDg2Kik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpJTlRQUk9DKShDT05URVhUODYqKTsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCmV4dGVybiBXT1JEIERPU1ZNX3BzcDsgICAgIC8qIHBzcCBvZiBjdXJyZW50IERPUyB0YXNrICovCmV4dGVybiBXT1JEIERPU1ZNX3JldHZhbDsgIC8qIHJldHVybiB2YWx1ZSBvZiBwcmV2aW91cyBET1MgdGFzayAqLwpleHRlcm4gc3RydWN0IERQTUlfc2VnbWVudHMgKkRPU1ZNX2RwbWlfc2VnbWVudHM7CgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChIQVZFX1NZU19WTTg2X0gpCiMgZGVmaW5lIE1aX1NVUFBPUlRFRAojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKLyoKICogRGVjbGFyZSBzb21lIENPTlRFWFQ4Ni5FRmxhZ3MgYml0cy4KICogSUZfTUFTSyBpcyBvbmx5IHB1c2hlZCBpbnRvIHJlYWwgbW9kZSBzdGFjay4KICovCiNkZWZpbmUgVjg2X0ZMQUcgMHgwMDAyMDAwMAojZGVmaW5lIElGX01BU0sgIDB4MDAwMDAyMDAKI2RlZmluZSBWSUZfTUFTSyAweDAwMDgwMDAwCiNkZWZpbmUgVklQX01BU0sgMHgwMDEwMDAwMAoKI2RlZmluZSBBRERfTE9XT1JEKGR3LHZhbCkgICgoZHcpID0gKChkdykgJiAweGZmZmYwMDAwKSB8IExPV09SRCgoRFdPUkQpKGR3KSsodmFsKSkpCgojZGVmaW5lIFBUUl9SRUFMX1RPX0xJTihzZWcsb2ZmKSAoKHZvaWQqKSgoKHVuc2lnbmVkIGludCkoc2VnKSA8PCA0KSArIExPV09SRChvZmYpKSkKCi8qIE5PVEU6IEludGVycnVwdHMgbWlnaHQgZ2V0IGNhbGxlZCBmcm9tIGZvdXIgbW9kZXM6IHJlYWwgbW9kZSwgMTYtYml0LAogKiAgICAgICAzMi1iaXQgc2VnbWVudGVkIChEUE1JMzIpIGFuZCAzMi1iaXQgbGluZWFyICh2aWEgRGV2aWNlSW9Db250cm9sKS4KICogICAgICAgRm9yIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHBvaW50ZXIKICogICAgICAgcGFyYW1ldGVycywgaW50ZXJydXB0IGhhbmRsZXJzIHNob3VsZCB1c2UgQ1RYX1NFR19PRkZfVE9fTElOIHdpdGgKICogICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgc2VnbWVudCByZWdpc3RlciBhcyBzZWNvbmQgYW5kIHRoZSBjb250ZW50cyBvZgogKiAgICAgICBhICozMi1iaXQqIGdlbmVyYWwgcmVnaXN0ZXIgYXMgdGhpcmQgcGFyYW1ldGVyLCBlLmcuCiAqICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTiggY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLCBFRFhfcmVnKGNvbnRleHQpICkKICogICAgICAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgbGluZWFyIHBvaW50ZXIgaW4gYWxsIHRocmVlIGNhc2VzOgogKiAgICAgICAgIFJlYWwtTW9kZTogICBTZWcqMTYgKyBMT1dPUkQoT2Zmc2V0KQogKiAgICAgICAgIDE2LWJpdDogICAgICBjb252ZXJ0IChTZWcsIExPV09SRChPZmZzZXQpKSB0byBsaW5lYXIKICogICAgICAgICAzMi1iaXQgc2VnbWVudGVkOiBjb252ZXJ0IChTZWcsIE9mZnNldCkgdG8gbGluZWFyCiAqICAgICAgICAgMzItYml0IGxpbmVhcjogICAgdXNlIE9mZnNldCBhcyBsaW5lYXIgYWRkcmVzcyAoRGV2aWNlSW9Db250cm9sISkKICoKICogICAgICAgUmVhbC1tb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgdGhlIFY4NiBiaXQgaW4gdGhlIGZsYWdzIHJlZ2lzdGVyLAogKiAgICAgICAzMi1iaXQgbGluZWFyIG1vZGUgaXMgcmVjb2duaXplZCBieSBjaGVja2luZyB3aGV0aGVyICdzZWcnIGlzCiAqICAgICAgIGEgc3lzdGVtIHNlbGVjdG9yICgwIGNvdW50cyBhbHNvIGFzIDMyLWJpdCBzZWdtZW50KSBhbmQgMzItYml0CiAqICAgICAgIHNlZ21lbnRlZCBtb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgd2hldGhlciAnc2VnJyBpcyAzMi1iaXQKICogICAgICAgc2VsZWN0b3Igd2hpY2ggaXMgbmVpdGhlciBzeXN0ZW0gc2VsZWN0b3Igbm9yIHplcm8uCiAqLwojZGVmaW5lIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LHNlZyxvZmYpIFwKICAgIChJU1Y4Nihjb250ZXh0KSA/IFBUUl9SRUFMX1RPX0xJTigoc2VnKSwob2ZmKSkgOiB3aW5lX2xkdF9nZXRfcHRyKChzZWcpLChvZmYpKSkKCiNkZWZpbmUgSU5UX0JBUkYoY29udGV4dCxudW0pIFwKICAgIEVSUiggImludCV4OiB1bmtub3duL25vdCBpbXBsZW1lbnRlZCBwYXJhbWV0ZXJzOlxuIiBcCiAgICAgICAgICAgICAgICAgICAgICJpbnQleDogQVggJTA0eCwgQlggJTA0eCwgQ1ggJTA0eCwgRFggJTA0eCwgIiBcCiAgICAgICAgICAgICAgICAgICAgICJTSSAlMDR4LCBESSAlMDR4LCBEUyAlMDR4LCBFUyAlMDR4XG4iLCBcCiAgICAgICAgICAgICAobnVtKSwgKG51bSksIExPV09SRCgoY29udGV4dCktPkVheCksIExPV09SRCgoY29udGV4dCktPkVieCksIFwKICAgICAgICAgICAgIExPV09SRCgoY29udGV4dCktPkVjeCksIExPV09SRCgoY29udGV4dCktPkVkeCksIExPV09SRCgoY29udGV4dCktPkVzaSksIFwKICAgICAgICAgICAgIExPV09SRCgoY29udGV4dCktPkVkaSksIChXT1JEKShjb250ZXh0KS0+U2VnRHMsIChXT1JEKShjb250ZXh0KS0+U2VnRXMgKQoKLyogcHVzaGluZyBvbiBzdGFjayBpbiAxNiBiaXQgbmVlZHMgc2VnbWVudCB3cmFwIGFyb3VuZCAqLwojZGVmaW5lIFBVU0hfV09SRDE2KGNvbnRleHQsdmFsKSBcCiAgICAqKChXT1JEKilDVFhfU0VHX09GRl9UT19MSU4oKGNvbnRleHQpLCBcCiAgICAgICAgKGNvbnRleHQpLT5TZWdTcywgQUREX0xPV09SRCggY29udGV4dC0+RXNwLCAtMiApICkpID0gKHZhbCkKCi8qIE1hY3JvcyBmb3IgZWFzaWVyIGFjY2VzcyB0byBpMzg2IGNvbnRleHQgcmVnaXN0ZXJzICovCgojZGVmaW5lIEFYX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVheCkKI2RlZmluZSBCWF9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5FYngpCiNkZWZpbmUgQ1hfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWN4KQojZGVmaW5lIERYX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVkeCkKI2RlZmluZSBTSV9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5Fc2kpCiNkZWZpbmUgRElfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWRpKQoKI2RlZmluZSBBTF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKGNvbnRleHQpLT5FYXgpCiNkZWZpbmUgQUhfcmVnKGNvbnRleHQpICAgICAgKChCWVRFKSgoY29udGV4dCktPkVheCA+PiA4KSkKI2RlZmluZSBCTF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKGNvbnRleHQpLT5FYngpCiNkZWZpbmUgQkhfcmVnKGNvbnRleHQpICAgICAgKChCWVRFKSgoY29udGV4dCktPkVieCA+PiA4KSkKI2RlZmluZSBDTF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKGNvbnRleHQpLT5FY3gpCiNkZWZpbmUgQ0hfcmVnKGNvbnRleHQpICAgICAgKChCWVRFKSgoY29udGV4dCktPkVjeCA+PiA4KSkKI2RlZmluZSBETF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKGNvbnRleHQpLT5FZHgpCiNkZWZpbmUgREhfcmVnKGNvbnRleHQpICAgICAgKChCWVRFKSgoY29udGV4dCktPkVkeCA+PiA4KSkKCiNkZWZpbmUgU0VUX0NGTEFHKGNvbnRleHQpICAgKChjb250ZXh0KS0+RUZsYWdzIHw9IDB4MDAwMSkKI2RlZmluZSBSRVNFVF9DRkxBRyhjb250ZXh0KSAoKGNvbnRleHQpLT5FRmxhZ3MgJj0gfjB4MDAwMSkKI2RlZmluZSBTRVRfWkZMQUcoY29udGV4dCkgICAoKGNvbnRleHQpLT5FRmxhZ3MgfD0gMHgwMDQwKQojZGVmaW5lIFJFU0VUX1pGTEFHKGNvbnRleHQpICgoY29udGV4dCktPkVGbGFncyAmPSB+MHgwMDQwKQojZGVmaW5lIElTVjg2KGNvbnRleHQpICAgICAgICgoY29udGV4dCktPkVGbGFncyAmIDB4MDAwMjAwMDApCgojZGVmaW5lIFNFVF9BWChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYXggPSAoKGNvbnRleHQpLT5FYXggJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfQlgoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWJ4ID0gKChjb250ZXh0KS0+RWJ4ICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCiNkZWZpbmUgU0VUX0NYKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVjeCA9ICgoY29udGV4dCktPkVjeCAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQojZGVmaW5lIFNFVF9EWChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FZHggPSAoKGNvbnRleHQpLT5FZHggJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfU0koY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RXNpID0gKChjb250ZXh0KS0+RXNpICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCiNkZWZpbmUgU0VUX0RJKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVkaSA9ICgoY29udGV4dCktPkVkaSAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQoKI2RlZmluZSBTRVRfQUwoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWF4ID0gKChjb250ZXh0KS0+RWF4ICYgfjB4ZmYpIHwgKEJZVEUpKHZhbCkpKQojZGVmaW5lIFNFVF9CTChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYnggPSAoKGNvbnRleHQpLT5FYnggJiB+MHhmZikgfCAoQllURSkodmFsKSkpCiNkZWZpbmUgU0VUX0NMKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVjeCA9ICgoY29udGV4dCktPkVjeCAmIH4weGZmKSB8IChCWVRFKSh2YWwpKSkKI2RlZmluZSBTRVRfREwoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWR4ID0gKChjb250ZXh0KS0+RWR4ICYgfjB4ZmYpIHwgKEJZVEUpKHZhbCkpKQoKI2RlZmluZSBTRVRfQUgoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWF4ID0gKChjb250ZXh0KS0+RWF4ICYgfjB4ZmYwMCkgfCAoKChCWVRFKSh2YWwpKSA8PCA4KSkpCiNkZWZpbmUgU0VUX0JIKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVieCA9ICgoY29udGV4dCktPkVieCAmIH4weGZmMDApIHwgKCgoQllURSkodmFsKSkgPDwgOCkpKQojZGVmaW5lIFNFVF9DSChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FY3ggPSAoKGNvbnRleHQpLT5FY3ggJiB+MHhmZjAwKSB8ICgoKEJZVEUpKHZhbCkpIDw8IDgpKSkKI2RlZmluZSBTRVRfREgoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWR4ID0gKChjb250ZXh0KS0+RWR4ICYgfjB4ZmYwMCkgfCAoKChCWVRFKSh2YWwpKSA8PCA4KSkpCgovKiBtb2R1bGUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfTG9hZEltYWdlKCBMUENTVFIgZmlsZW5hbWUsIEhBTkRMRSBoRmlsZSApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfRXhlYyggQ09OVEVYVDg2ICpjb250ZXh0LCBMUENTVFIgZmlsZW5hbWUsIEJZVEUgZnVuYywgTFBWT0lEIHBhcmFtYmxrICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9FeGl0KCBDT05URVhUODYgKmNvbnRleHQsIEJPT0wgY3NfcHNwLCBXT1JEIHJldHZhbCApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfQ3VycmVudCggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfQWxsb2NEUE1JVGFzayggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfUnVuSW5UaHJlYWQoIFBBUENGVU5DIHByb2MsIFVMT05HX1BUUiBhcmcgKTsKZXh0ZXJuIEJPT0wgRE9TVk1fSXNXaW4xNih2b2lkKTsKCi8qIGRvc3ZtLmMgKi8KZXh0ZXJuIHZvaWQgRE9TVk1fU2VuZFF1ZXVlZEV2ZW50cyggQ09OVEVYVDg2ICogKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0Fja25vd2xlZGdlSVJRKCBDT05URVhUODYgKiApOwpleHRlcm4gSU5UIFdJTkFQSSBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9XYWl0KCBDT05URVhUODYgKiApOwpleHRlcm4gRFdPUkQgV0lOQVBJIERPU1ZNX0xvb3AoIEhBTkRMRSBoVGhyZWFkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9RdWV1ZUV2ZW50KCBJTlQgaXJxLCBJTlQgcHJpb3JpdHksIERPU1JFTEFZIHJlbGF5LCBMUFZPSUQgZGF0YSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1NldFRpbWVyKCBVSU5UIHRpY2tzICk7CmV4dGVybiBVSU5UIFdJTkFQSSBET1NWTV9HZXRUaW1lciggdm9pZCApOwpleHRlcm4gQklPU0RBVEEgICAqRE9TVk1fQmlvc0RhdGEoIHZvaWQgKTsKCi8qIGRldmljZXMuYyAqLwpleHRlcm4gdm9pZCBET1NERVZfSW5zdGFsbERPU0RldmljZXModm9pZCk7CmV4dGVybiBEV09SRCBET1NERVZfQ29uc29sZSh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9GaW5kQ2hhckRldmljZShjaGFyKm5hbWUpOwpleHRlcm4gaW50IERPU0RFVl9QZWVrKERXT1JEIGRldiwgQllURSpkYXRhKTsKZXh0ZXJuIGludCBET1NERVZfUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBpbnQgRE9TREVWX1dyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuLCBpbnQgdmVyaWZ5KTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxSZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxXcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiB2b2lkIERPU0RFVl9TZXRTaGFyaW5nUmV0cnkoV09SRCBkZWxheSwgV09SRCBjb3VudCk7CmV4dGVybiBTRUdQVFIgRE9TREVWX0dldExPTChCT09MIHY4Nik7CgovKiBkbWEuYyAqLwpleHRlcm4gaW50IERNQV9UcmFuc2ZlcihpbnQgY2hhbm5lbCxpbnQgcmVxbGVuZ3RoLHZvaWQqIGJ1ZmZlcik7CmV4dGVybiB2b2lkIERNQV9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiBCWVRFIERNQV9pb3BvcnRfaW4oIFdPUkQgcG9ydCApOwoKLyogZG9zYXNwaS5jICovCnZvaWQgV0lOQVBJIERPU1ZNX0FTUElIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogZG9zY29uZi5jICovCkRPU0NPTkYgKkRPU0NPTkZfR2V0Q29uZmlnKCB2b2lkICk7CgovKiBmcHUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzRIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzVIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzdIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzhIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzlIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2FIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2JIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2NIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2RIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50M2VIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaGltZW0uYyAqLwpleHRlcm4gdm9pZCBET1NWTV9Jbml0U2VnbWVudHModm9pZCk7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NVTUIoRFdPUkQpOwpleHRlcm4gTFBWT0lEIERPU1ZNX0FsbG9jQ29kZVVNQihEV09SRCwgV09SRCAqLCBXT1JEICopOwpleHRlcm4gTFBWT0lEIERPU1ZNX0FsbG9jRGF0YVVNQihEV09SRCwgV09SRCAqLCBXT1JEICopOwoKLyogaW50MDkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlTZW5kU2NhbihCWVRFIHNjYW4sQllURSBhc2NpaSk7CmV4dGVybiBCWVRFIFdJTkFQSSBET1NWTV9JbnQwOVJlYWRTY2FuKEJZVEUqYXNjaWkpOwoKLyogaW50MTAuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTBIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUHV0Q2hhcihCWVRFIGFzY2lpKTsKCi8qIGludDExLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDExSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDEyLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDEySGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDEzLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDEzSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDE1LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDE1SGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDFhLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDFhSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDE2LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDE2SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIEJPT0wgV0lOQVBJIERPU1ZNX0ludDE2UmVhZENoYXIoIEJZVEUgKiwgQllURSAqLCBDT05URVhUODYgKiApOwpleHRlcm4gaW50IFdJTkFQSSBET1NWTV9JbnQxNkFkZENoYXIoQllURSBhc2NpaSxCWVRFIHNjYW4pOwoKLyogaW50MTcuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTdIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTlIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjAuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjBIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MjUuYyAqLwpCT09MIERPU1ZNX1Jhd1JlYWQoIEJZVEUsIERXT1JELCBEV09SRCwgQllURSAqLCBCT09MICk7CnZvaWQgV0lOQVBJIERPU1ZNX0ludDI1SGFuZGxlciggQ09OVEVYVDg2ICogKTsKCi8qIGludDI2LmMgKi8KQk9PTCBET1NWTV9SYXdXcml0ZSggQllURSwgRFdPUkQsIERXT1JELCBCWVRFICosIEJPT0wgKTsKdm9pZCBXSU5BUEkgRE9TVk1fSW50MjZIYW5kbGVyKCBDT05URVhUODYgKiApOwoKLyogaW50MjkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MjlIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MmEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MmFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MmYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MmZIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MzEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzFIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUmF3TW9kZVN3aXRjaEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiBCT09MIERPU1ZNX0lzRG9zMzIodm9pZCk7CmV4dGVybiBGQVJQUk9DMTYgV0lOQVBJIERQTUlfQWxsb2NJbnRlcm5hbFJNQ0IoUk1DQlBST0MpOwpleHRlcm4gdm9pZCBXSU5BUEkgRFBNSV9GcmVlSW50ZXJuYWxSTUNCKEZBUlBST0MxNik7CmV4dGVybiBpbnQgRFBNSV9DYWxsUk1Qcm9jKENPTlRFWFQ4NiosTFBXT1JELGludCxpbnQpOwpleHRlcm4gQk9PTCBET1NWTV9DaGVja1dyYXBwZXJzKENPTlRFWFQ4NiopOwoKLyogaW50MzMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNNZXNzYWdlKFVJTlQsV1BBUkFNLExQQVJBTSk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0NvbnNvbGUoTU9VU0VfRVZFTlRfUkVDT1JEKik7CgovKiBpbnQ0MS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ0MUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ0Yi5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ0YkhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ1Yy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ1Y0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQ2Ny5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQ2N0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBFTVNfSW9jdGxfSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludGVycnVwdHMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fQ2FsbEJ1aWx0aW5IYW5kbGVyKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fRW11bGF0ZUludGVycnVwdFBNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gQk9PTCBXSU5BUEkgRE9TVk1fRW11bGF0ZUludGVycnVwdFJNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gRkFSUFJPQzE2ICAgRE9TVk1fR2V0UE1IYW5kbGVyMTYoIEJZVEUgKTsKZXh0ZXJuIEZBUlBST0M0OCAgIERPU1ZNX0dldFBNSGFuZGxlcjQ4KCBCWVRFICk7CmV4dGVybiBGQVJQUk9DMTYgICBET1NWTV9HZXRSTUhhbmRsZXIoIEJZVEUgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX0hhcmR3YXJlSW50ZXJydXB0UE0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9IYXJkd2FyZUludGVycnVwdFJNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0UE1IYW5kbGVyMTYoIEJZVEUsIEZBUlBST0MxNiApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0UE1IYW5kbGVyNDgoIEJZVEUsIEZBUlBST0M0OCApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fU2V0Uk1IYW5kbGVyKCBCWVRFLCBGQVJQUk9DMTYgKTsKCi8qIHJlbGF5LmMgKi8Kdm9pZCBET1NWTV9SZWxheUhhbmRsZXIoIENPTlRFWFQ4NiAqICk7CnZvaWQgRE9TVk1fQnVpbGRDYWxsRnJhbWUoIENPTlRFWFQ4NiAqLCBET1NSRUxBWSwgTFBWT0lEICk7CgovKiBzb3VuZGJsYXN0ZXIuYyAqLwpleHRlcm4gdm9pZCBTQl9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiBCWVRFIFNCX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiBwcGRldi5jICovCmV4dGVybiBCT09MIElPX3BwX291dHAoaW50IHBvcnQsIERXT1JEKiByZXMpOwpleHRlcm4gaW50IElPX3BwX2lucChpbnQgcG9ydCwgRFdPUkQqIHJlcyk7CmV4dGVybiBjaGFyIElPX3BwX2luaXQodm9pZCk7CgovKiB0aW1lci5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiB4bXMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgWE1TX0hhbmRsZXIoQ09OVEVYVDg2Kik7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==