LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSA8c3RkYXJnLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5lL2xpYnJhcnkuaCIKI2luY2x1ZGUgIndpbmUvd2luZGVmMTYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm50LmgiICAgICAvKiBmb3IgUENPTlRFWFQgKi8KI2luY2x1ZGUgIndpbmNvbi5oIiAgICAvKiBmb3IgTU9VU0VfRVZFTlRfUkVDT1JEICovCgojZGVmaW5lIE1BWF9ET1NfRFJJVkVTICAyNgoKc3RydWN0IF9ET1NFVkVOVDsKCi8qIGFtb3VudCBvZiBzcGFjZSByZXNlcnZlZCBmb3IgcmVsYXkgc3RhY2sgKi8KI2RlZmluZSBET1NWTV9SRUxBWV9EQVRBX1NJWkUgNDA5NgoKLyogdmFyaW91cyByZWFsLW1vZGUgY29kZSBzdHVicyAqLwpzdHJ1Y3QgRFBNSV9zZWdtZW50cwp7CiAgICBXT1JEIHdyYXBfc2VnOwogICAgV09SRCB4bXNfc2VnOwogICAgV09SRCBkcG1pX3NlZzsKICAgIFdPUkQgZHBtaV9zZWw7CiAgICBXT1JEIGludDQ4X3NlbDsKICAgIFdPUkQgaW50MTZfc2VsOwogICAgV09SRCByZWxheV9jb2RlX3NlbDsKICAgIFdPUkQgcmVsYXlfZGF0YV9zZWw7Cn07CgovKiA0OC1iaXQgc2VnbWVudGVkIHBvaW50ZXJzIGZvciBET1MgRFBNSTMyICovCnR5cGVkZWYgc3RydWN0IHsKICBXT1JEICBzZWxlY3RvcjsKICBEV09SRCBvZmZzZXQ7Cn0gU0VHUFRSNDgsIEZBUlBST0M0ODsKCiNkZWZpbmUgRE9TQ09ORl9NRU1fSElHSCAgICAgICAgMHgwMDAxCiNkZWZpbmUgRE9TQ09ORl9NRU1fVU1CICAgICAgICAgMHgwMDAyCiNkZWZpbmUgRE9TQ09ORl9OVU1MT0NLICAgICAgICAgMHgwMDA0CiNkZWZpbmUgRE9TQ09ORl9LRVlCX0NPTlYgICAgICAgMHgwMDA4Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIGxhc3Rkcml2ZTsKICAgIGludCBicmtfZmxhZzsKICAgIGludCBmaWxlczsKICAgIGludCBzdGFja3NfbnI7CiAgICBpbnQgc3RhY2tzX3N6OwogICAgaW50IGJ1ZjsKICAgIGludCBidWYyOwogICAgaW50IGZjYnM7CiAgICBpbnQgZmxhZ3M7CiAgICBjaGFyICpzaGVsbDsKICAgIGNoYXIgKmNvdW50cnk7Cn0gRE9TQ09ORjsKCnR5cGVkZWYgdm9pZCAoKkRPU1JFTEFZKShDT05URVhUODYqLHZvaWQqKTsKdHlwZWRlZiB2b2lkIChXSU5BUEkgKlJNQ0JQUk9DKShDT05URVhUODYqKTsKdHlwZWRlZiB2b2lkIChXSU5BUEkgKklOVFBST0MpKENPTlRFWFQ4NiopOwoKI2RlZmluZSBET1NfUFJJT1JJVFlfUkVBTFRJTUUgMCAgLyogSVJRMCAqLwojZGVmaW5lIERPU19QUklPUklUWV9LRVlCT0FSRCAxICAvKiBJUlExICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1ZHQSAgICAgIDIgIC8qIElSUTkgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfTU9VU0UgICAgNSAgLyogSVJRMTIgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfU0VSSUFMICAgMTAgLyogSVJRNCAqLwoKZXh0ZXJuIFdPUkQgRE9TVk1fcHNwOyAgICAgLyogcHNwIG9mIGN1cnJlbnQgRE9TIHRhc2sgKi8KZXh0ZXJuIFdPUkQgRE9TVk1fcmV0dmFsOyAgLyogcmV0dXJuIHZhbHVlIG9mIHByZXZpb3VzIERPUyB0YXNrICovCmV4dGVybiBzdHJ1Y3QgRFBNSV9zZWdtZW50cyAqRE9TVk1fZHBtaV9zZWdtZW50czsKCiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1ZNODZfSCkKIyBkZWZpbmUgTVpfU1VQUE9SVEVECiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgovKgogKiBEZWNsYXJlIHNvbWUgQ09OVEVYVDg2LkVGbGFncyBiaXRzLgogKiBJRl9NQVNLIGlzIG9ubHkgcHVzaGVkIGludG8gcmVhbCBtb2RlIHN0YWNrLgogKi8KI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCiNkZWZpbmUgVEZfTUFTSyAgMHgwMDAwMDEwMAojZGVmaW5lIElGX01BU0sgIDB4MDAwMDAyMDAKI2RlZmluZSBWSUZfTUFTSyAweDAwMDgwMDAwCiNkZWZpbmUgVklQX01BU0sgMHgwMDEwMDAwMAoKI2RlZmluZSBBRERfTE9XT1JEKGR3LHZhbCkgICgoZHcpID0gKChkdykgJiAweGZmZmYwMDAwKSB8IExPV09SRCgoRFdPUkQpKGR3KSsodmFsKSkpCgojZGVmaW5lIFBUUl9SRUFMX1RPX0xJTihzZWcsb2ZmKSAoKHZvaWQqKSgoKHVuc2lnbmVkIGludCkoc2VnKSA8PCA0KSArIExPV09SRChvZmYpKSkKCi8qIE5PVEU6IEludGVycnVwdHMgbWlnaHQgZ2V0IGNhbGxlZCBmcm9tIGZvdXIgbW9kZXM6IHJlYWwgbW9kZSwgMTYtYml0LAogKiAgICAgICAzMi1iaXQgc2VnbWVudGVkIChEUE1JMzIpIGFuZCAzMi1iaXQgbGluZWFyICh2aWEgRGV2aWNlSW9Db250cm9sKS4KICogICAgICAgRm9yIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHBvaW50ZXIKICogICAgICAgcGFyYW1ldGVycywgaW50ZXJydXB0IGhhbmRsZXJzIHNob3VsZCB1c2UgQ1RYX1NFR19PRkZfVE9fTElOIHdpdGgKICogICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgc2VnbWVudCByZWdpc3RlciBhcyBzZWNvbmQgYW5kIHRoZSBjb250ZW50cyBvZgogKiAgICAgICBhICozMi1iaXQqIGdlbmVyYWwgcmVnaXN0ZXIgYXMgdGhpcmQgcGFyYW1ldGVyLCBlLmcuCiAqICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTiggY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLCBFRFhfcmVnKGNvbnRleHQpICkKICogICAgICAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgbGluZWFyIHBvaW50ZXIgaW4gYWxsIHRocmVlIGNhc2VzOgogKiAgICAgICAgIFJlYWwtTW9kZTogICBTZWcqMTYgKyBMT1dPUkQoT2Zmc2V0KQogKiAgICAgICAgIDE2LWJpdDogICAgICBjb252ZXJ0IChTZWcsIExPV09SRChPZmZzZXQpKSB0byBsaW5lYXIKICogICAgICAgICAzMi1iaXQgc2VnbWVudGVkOiBjb252ZXJ0IChTZWcsIE9mZnNldCkgdG8gbGluZWFyCiAqICAgICAgICAgMzItYml0IGxpbmVhcjogICAgdXNlIE9mZnNldCBhcyBsaW5lYXIgYWRkcmVzcyAoRGV2aWNlSW9Db250cm9sISkKICoKICogICAgICAgUmVhbC1tb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgdGhlIFY4NiBiaXQgaW4gdGhlIGZsYWdzIHJlZ2lzdGVyLAogKiAgICAgICAzMi1iaXQgbGluZWFyIG1vZGUgaXMgcmVjb2duaXplZCBieSBjaGVja2luZyB3aGV0aGVyICdzZWcnIGlzCiAqICAgICAgIGEgc3lzdGVtIHNlbGVjdG9yICgwIGNvdW50cyBhbHNvIGFzIDMyLWJpdCBzZWdtZW50KSBhbmQgMzItYml0CiAqICAgICAgIHNlZ21lbnRlZCBtb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgd2hldGhlciAnc2VnJyBpcyAzMi1iaXQKICogICAgICAgc2VsZWN0b3Igd2hpY2ggaXMgbmVpdGhlciBzeXN0ZW0gc2VsZWN0b3Igbm9yIHplcm8uCiAqLwojZGVmaW5lIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LHNlZyxvZmYpIFwKICAgIChJU1Y4Nihjb250ZXh0KSA/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+RWR4ICYgfjB4ZmYwMCkgfCAoKChCWVRFKSh2YWwpKSA8PCA4KSkpCgojaW5jbHVkZSA8cHNocGFjazEuaD4KCnR5cGVkZWYgc3RydWN0CnsKICAgIFdPUkQgIENvbTFBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDAwOiBDT00xIEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBDb20yQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwMjogQ09NMiBJL08gYWRkcmVzcyAqLwogICAgV09SRCAgQ29tM0FkZHI7ICAgICAgICAgICAgICAgICAgLyogMDQ6IENPTTMgSS9PIGFkZHJlc3MgKi8KICAgIFdPUkQgIENvbTRBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDA2OiBDT000IEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBMcHQxQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwODogTFBUMSBJL08gYWRkcmVzcyAqLwogICAgV09SRCAgTHB0MkFkZHI7ICAgICAgICAgICAgICAgICAgLyogMGE6IExQVDIgSS9PIGFkZHJlc3MgKi8KICAgIFdPUkQgIExwdDNBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDBjOiBMUFQzIEkvTyBhZGRyZXNzICovCiAgICBXT1JEICBMcHQ0QWRkcjsgICAgICAgICAgICAgICAgICAvKiAwZTogTFBUNCBJL08gYWRkcmVzcyAqLwogICAgV09SRCAgSW5zdGFsbGVkSGFyZHdhcmU7ICAgICAgICAgLyogMTA6IEluc3RhbGxlZCBoYXJkd2FyZSBmbGFncyAqLwogICAgQllURSAgUE9TVHN0YXR1czsgICAgICAgICAgICAgICAgLyogMTI6IFBvd2VyLU9uIFNlbGYgVGVzdCBzdGF0dXMgKi8KICAgIFdPUkQgIE1lbVNpemU7ICAgICAgICAgICAgICAgICAgIC8qIDEzOiBCYXNlIG1lbW9yeSBzaXplIGluIEtiICovCiAgICBXT1JEICB1bnVzZWQxOyAgICAgICAgICAgICAgICAgICAvKiAxNTogTWFudWZhY3R1cmluZyB0ZXN0IHNjcmF0Y2ggcGFkICovCiAgICBCWVRFICBLYmRGbGFnczE7ICAgICAgICAgICAgICAgICAvKiAxNzogS2V5Ym9hcmQgZmxhZ3MgMSAqLwogICAgQllURSAgS2JkRmxhZ3MyOyAgICAgICAgICAgICAgICAgLyogMTg6IEtleWJvYXJkIGZsYWdzIDIgKi8KICAgIEJZVEUgIHVudXNlZDI7ICAgICAgICAgICAgICAgICAgIC8qIDE5OiBLZXlib2FyZCBkcml2ZXIgd29ya3NwYWNlICovCiAgICBXT1JEICBOZXh0S2JkQ2hhclB0cjsgICAgICAgICAgICAvKiAxYTogTmV4dCBjaGFyYWN0ZXIgaW4ga2JkIGJ1ZmZlciAqLwogICAgV09SRCAgRmlyc3RLYmRDaGFyUHRyOyAgICAgICAgICAgLyogMWM6IEZpcnN0IGNoYXJhY3RlciBpbiBrYmQgYnVmZmVyICovCiAgICBXT1JEICBLYmRCdWZmZXJbMTZdOyAgICAgICAgICAgICAvKiAxZTogS2V5Ym9hcmQgYnVmZmVyICovCiAgICBCWVRFICBEaXNrZXR0ZVN0YXR1czE7ICAgICAgICAgICAvKiAzZTogRGlza2V0dGUgcmVjYWxpYnJhdGUgc3RhdHVzICovCiAgICBCWVRFICBEaXNrZXR0ZVN0YXR1czI7ICAgICAgICAgICAvKiAzZjogRGlza2V0dGUgbW90b3Igc3RhdHVzICovCiAgICBCWVRFICBEaXNrZXR0ZVN0YXR1czM7ICAgICAgICAgICAvKiA0MDogRGlza2V0dGUgbW90b3IgdGltZW91dCAqLwogICAgQllURSAgRGlza2V0dGVTdGF0dXM0OyAgICAgICAgICAgLyogNDE6IERpc2tldHRlIGxhc3Qgb3BlcmF0aW9uIHN0YXR1cyAqLwogICAgQllURSAgRGlza1N0YXR1c1s3XTsgICAgICAgICAgICAgLyogNDI6IERpc2sgc3RhdHVzL2NvbW1hbmQgYnl0ZXMgKi8KICAgIEJZVEUgIFZpZGVvTW9kZTsgICAgICAgICAgICAgICAgIC8qIDQ5OiBWaWRlbyBtb2RlICovCiAgICBXT1JEICBWaWRlb0NvbHVtbnM7ICAgICAgICAgICAgICAvKiA0YTogTnVtYmVyIG9mIGNvbHVtbnMgKi8KICAgIFdPUkQgIFZpZGVvUGFnZVNpemU7ICAgICAgICAgICAgIC8qIDRjOiBWaWRlbyBwYWdlIHNpemUgaW4gYnl0ZXMgKi8KICAgIFdPUkQgIFZpZGVvUGFnZVN0YXJ0QWRkcjsgICAgICAgIC8qIDRlOiBWaWRlbyBwYWdlIHN0YXJ0IGFkZHJlc3MgKi8KICAgIEJZVEUgIFZpZGVvQ3Vyc29yUG9zWzE2XTsgICAgICAgIC8qIDUwOiBDdXJzb3IgcG9zaXRpb24gZm9yIDggcGFnZXMsIGNvbHVtbi9yb3cgb3JkZXIgKi8KICAgIFdPUkQgIFZpZGVvQ3Vyc29yVHlwZTsgICAgICAgICAgIC8qIDYwOiBWaWRlbyBjdXJzb3IgdHlwZSAqLwogICAgQllURSAgVmlkZW9DdXJQYWdlOyAgICAgICAgICAgICAgLyogNjI6IFZpZGVvIGN1cnJlbnQgcGFnZSAqLwogICAgV09SRCAgVmlkZW9DdHJsQWRkcjsgICAgICAgICAgICAgLyogNjM6IFZpZGVvIGNvbnRyb2xsZXIgYWRkcmVzcyAqLwogICAgQllURSAgVmlkZW9SZWcxOyAgICAgICAgICAgICAgICAgLyogNjU6IFZpZGVvIG1vZGUgc2VsZWN0IHJlZ2lzdGVyICovCiAgICBCWVRFICBWaWRlb1JlZzI7ICAgICAgICAgICAgICAgICAvKiA2NjogVmlkZW8gQ0dBIHBhbGV0dGUgcmVnaXN0ZXIgKi8KICAgIERXT1JEIFJlc2V0RW50cnk7ICAgICAgICAgICAgICAgIC8qIDY3OiBXYXJtIHJlc2V0IGVudHJ5IHBvaW50ICovCiAgICBCWVRFICBMYXN0SVJROyAgICAgICAgICAgICAgICAgICAvKiA2YjogTGFzdCB1bmV4cGVjdGVkIGludGVycnVwdCAqLwogICAgRFdPUkQgVGlja3M7ICAgICAgICAgICAgICAgICAgICAgLyogNmM6IFRpY2tzIHNpbmNlIG1pZG5pZ2h0ICovCiAgICBCWVRFICBUaWNrc092ZXJmbG93OyAgICAgICAgICAgICAvKiA3MDogVGltZXIgb3ZlcmZsb3cgaWYgcGFzdCBtaWRuaWdodCAqLwogICAgQllURSAgQ3RybEJyZWFrRmxhZzsgICAgICAgICAgICAgLyogNzE6IEN0cmwtQnJlYWsgZmxhZyAqLwogICAgV09SRCAgUmVzZXRGbGFnOyAgICAgICAgICAgICAgICAgLyogNzI6IFBPU1QgUmVzZXQgZmxhZyAqLwogICAgQllURSAgRGlza09wU3RhdHVzOyAgICAgICAgICAgICAgLyogNzQ6IExhc3QgaGFyZC1kaXNrIG9wZXJhdGlvbiBzdGF0dXMgKi8KICAgIEJZVEUgIE5iSGFyZERpc2tzOyAgICAgICAgICAgICAgIC8qIDc1OiBOdW1iZXIgb2YgaGFyZCBkaXNrcyAqLwogICAgQllURSAgRGlza0N0cmxCeXRlOyAgICAgICAgICAgICAgLyogNzY6IERpc2sgY29udHJvbCBieXRlICovCiAgICBCWVRFICBEaXNrSU9Qb3J0OyAgICAgICAgICAgICAgICAvKiA3NzogRGlzayBJL08gcG9ydCBvZmZzZXQgKi8KICAgIEJZVEUgIExwdFRpbWVvdXRbNF07ICAgICAgICAgICAgIC8qIDc4OiBUaW1lb3V0cyBmb3IgcGFyYWxsZWwgcG9ydHMgKi8KICAgIEJZVEUgIENvbVRpbWVvdXRbNF07ICAgICAgICAgICAgIC8qIDdjOiBUaW1lb3V0cyBmb3Igc2VyaWFsIHBvcnRzICovCiAgICBXT1JEICBLYmRCdWZmZXJTdGFydDsgICAgICAgICAgICAvKiA4MDogS2V5Ym9hcmQgYnVmZmVyIHN0YXJ0ICovCiAgICBXT1JEICBLYmRCdWZmZXJFbmQ7ICAgICAgICAgICAgICAvKiA4MjogS2V5Ym9hcmQgYnVmZmVyIGVuZCAqLwogICAgQllURSAgUm93c09uU2NyZWVuTWludXMxOyAgICAgICAgLyogODQ6IEVHQSBvbmx5ICovCiAgICBXT1JEICBCeXRlc1BlckNoYXI7ICAgICAgICAgICAgICAvKiA4NTogRUdBIG9ubHkgKi8KICAgIEJZVEUgIE1vZGVPcHRpb25zOyAgICAgICAgICAgICAgIC8qIDg3OiBFR0Egb25seSAqLwogICAgQllURSAgRmVhdHVyZUJpdHNTd2l0Y2hlczsgICAgICAgLyogODg6IEVHQSBvbmx5ICovCiAgICBCWVRFICBWR0FTZXR0aW5nczsgICAgICAgICAgICAgICAvKiA4OTogVkdBIG1pc2Mgc2V0dGluZ3MgKi8KICAgIEJZVEUgIERpc3BsYXlDb21iaW5hdGlvbjsgICAgICAgIC8qIDhBOiBWR0EgZGlzcGxheSBjb21iaW5hdGlvbnMgKi8KICAgIEJZVEUgIERpc2tEYXRhUmF0ZTsgICAgICAgICAgICAgIC8qIDhCOiBMYXN0IGRpc2sgZGF0YSByYXRlIHNlbGVjdGVkICovCn0gQklPU0RBVEE7CgojaW5jbHVkZSA8cG9wcGFjay5oPgoKLyogRGV2aWNlIGRyaXZlciBoZWFkZXIgKi8KCiNkZWZpbmUgTk9ORVhUICgoRFdPUkQpLTEpCgojZGVmaW5lIEFUVFJfU1RESU4gICAgIDB4MDAwMQojZGVmaW5lIEFUVFJfU1RET1VUICAgIDB4MDAwMgojZGVmaW5lIEFUVFJfTlVMICAgICAgIDB4MDAwNAojZGVmaW5lIEFUVFJfQ0xPQ0sgICAgIDB4MDAwOAojZGVmaW5lIEFUVFJfRkFTVENPTiAgIDB4MDAxMAojZGVmaW5lIEFUVFJfUkFXICAgICAgIDB4MDAyMAojZGVmaW5lIEFUVFJfTk9URU9GICAgIDB4MDA0MAojZGVmaW5lIEFUVFJfREVWSUNFICAgIDB4MDA4MAojZGVmaW5lIEFUVFJfUkVNT1ZBQkxFIDB4MDgwMAojZGVmaW5lIEFUVFJfTk9OSUJNICAgIDB4MjAwMCAvKiBibG9jayBkZXZpY2VzICovCiNkZWZpbmUgQVRUUl9VTlRJTEJVU1kgMHgyMDAwIC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIEFUVFJfSU9DVEwgICAgIDB4NDAwMAojZGVmaW5lIEFUVFJfQ0hBUiAgICAgIDB4ODAwMAoKI2luY2x1ZGUgPHBzaHBhY2sxLmg+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBuZXh0X2RldjsKICAgIFdPUkQgIGF0dHI7CiAgICBXT1JEICBzdHJhdGVneTsKICAgIFdPUkQgIGludGVycnVwdDsKICAgIGNoYXIgIG5hbWVbOF07Cn0gRE9TX0RFVklDRV9IRUFERVI7CgojaW5jbHVkZSA8cG9wcGFjay5oPgoKLyogRE9TIERldmljZSByZXF1ZXN0cyAqLwoKI2RlZmluZSBDTURfSU5JVCAgICAgICAwCiNkZWZpbmUgQ01EX01FRElBQ0hFQ0sgMSAvKiBibG9jayBkZXZpY2VzICovCiNkZWZpbmUgQ01EX0JVSUxEQlBCICAgMiAvKiBibG9jayBkZXZpY2VzICovCiNkZWZpbmUgQ01EX0lOSU9DVEwgICAgMwojZGVmaW5lIENNRF9JTlBVVCAgICAgIDQgLyogcmVhZCBkYXRhICovCiNkZWZpbmUgQ01EX1NBRkVJTlBVVCAgNSAvKiAibm9uLWRlc3RydWN0aXZlIGlucHV0IG5vIHdhaXQiLCBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfSU5TVEFUVVMgICA2IC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9JTkZMVVNIICAgIDcgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX09VVFBVVCAgICAgOCAvKiB3cml0ZSBkYXRhICovCiNkZWZpbmUgQ01EX1NBRkVPVVRQVVQgOSAvKiB3cml0ZSBkYXRhIHdpdGggdmVyaWZ5ICovCiNkZWZpbmUgQ01EX09VVFNUQVRVUyAxMCAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfT1VURkxVU0ggIDExIC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9PVVRJT0NUTCAgMTIKI2RlZmluZSBDTURfREVWT1BFTiAgIDEzCiNkZWZpbmUgQ01EX0RFVkNMT1NFICAxNAojZGVmaW5lIENNRF9SRU1PVkFCTEUgMTUgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9VTlRJTEJVU1kgMTYgLyogb3V0cHV0IHVudGlsIGJ1c3kgKi8KCiNkZWZpbmUgU1RBVF9NQVNLICAweDAwRkYKI2RlZmluZSBTVEFUX0RPTkUgIDB4MDEwMAojZGVmaW5lIFNUQVRfQlVTWSAgMHgwMjAwCiNkZWZpbmUgU1RBVF9FUlJPUiAweDgwMDAKCiNpbmNsdWRlIDxwc2hwYWNrMS5oPgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgQllURSBzaXplOyAgICAgICAgICAvKiBsZW5ndGggb2YgaGVhZGVyICsgZGF0YSAqLwogICAgQllURSB1bml0OyAgICAgICAgICAvKiB1bml0IChibG9jayBkZXZpY2VzIG9ubHkpICovCiAgICBCWVRFIGNvbW1hbmQ7CiAgICBXT1JEIHN0YXR1czsKICAgIEJZVEUgcmVzZXJ2ZWRbOF07Cn0gUkVRVUVTVF9IRUFERVI7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBSRVFVRVNUX0hFQURFUiBoZHI7CiAgICBCWVRFIG1lZGlhOyAgICAgICAgIC8qIG1lZGlhIGRlc2NyaXB0b3IgZnJvbSBCUEIgKi8KICAgIFNFR1BUUiBidWZmZXI7CiAgICBXT1JEIGNvdW50OyAgICAgICAgIC8qIGJ5dGUvc2VjdG9yIGNvdW50ICovCiAgICBXT1JEIHNlY3RvcjsgICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciAoYmxvY2sgZGV2aWNlcykgKi8KICAgIERXT1JEIHZvbHVtZTsgICAgICAgLyogdm9sdW1lIElEIChibG9jayBkZXZpY2VzKSAqLwp9IFJFUV9JTzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIFJFUVVFU1RfSEVBREVSIGhkcjsKICAgIEJZVEUgZGF0YTsKfSBSRVFfU0FGRUlOUFVUOwoKLyogV0lORSBkZXZpY2UgZHJpdmVyIHRodW5rIGZyb20gUk0gKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgQllURSBsam1wMTsKICAgIEZBUlBST0MxNiBzdHJhdGVneTsKICAgIEJZVEUgbGptcDI7CiAgICBGQVJQUk9DMTYgaW50ZXJydXB0Owp9IFdJTkVERVZfVEhVTks7CgojaW5jbHVkZSA8cG9wcGFjay5oPgoKLyogRGV2aWNlIGRyaXZlciBpbmZvICh1c2VkIGZvciBpbml0aWFsaXphdGlvbikgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgY2hhciBuYW1lWzhdOwogICAgV09SRCBhdHRyOwogICAgUk1DQlBST0Mgc3RyYXRlZ3k7CiAgICBSTUNCUFJPQyBpbnRlcnJ1cHQ7Cn0gV0lORURFVjsKCi8qIG1vZHVsZS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBNWl9Mb2FkSW1hZ2UoIExQQ1NUUiBmaWxlbmFtZSwgSEFORExFIGhGaWxlICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9FeGVjKCBDT05URVhUODYgKmNvbnRleHQsIExQQ1NUUiBmaWxlbmFtZSwgQllURSBmdW5jLCBMUFZPSUQgcGFyYW1ibGsgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX0V4aXQoIENPTlRFWFQ4NiAqY29udGV4dCwgQk9PTCBjc19wc3AsIFdPUkQgcmV0dmFsICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9DdXJyZW50KCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9BbGxvY0RQTUlUYXNrKCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9SdW5JblRocmVhZCggUEFQQ0ZVTkMgcHJvYywgVUxPTkdfUFRSIGFyZyApOwpleHRlcm4gQk9PTCBET1NWTV9Jc1dpbjE2KHZvaWQpOwoKLyogZG9zdm0uYyAqLwpleHRlcm4gdm9pZCBET1NWTV9TZW5kUXVldWVkRXZlbnRzKCBDT05URVhUODYgKiApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fQWNrbm93bGVkZ2VJUlEoIENPTlRFWFQ4NiAqICk7CmV4dGVybiBJTlQgV0lOQVBJIERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1dhaXQoIENPTlRFWFQ4NiAqICk7CmV4dGVybiBEV09SRCBXSU5BUEkgRE9TVk1fTG9vcCggSEFORExFIGhUaHJlYWQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1F1ZXVlRXZlbnQoIElOVCBpcnEsIElOVCBwcmlvcml0eSwgRE9TUkVMQVkgcmVsYXksIExQVk9JRCBkYXRhICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fU2V0VGltZXIoIFVJTlQgdGlja3MgKTsKZXh0ZXJuIFVJTlQgV0lOQVBJIERPU1ZNX0dldFRpbWVyKCB2b2lkICk7CgovKiBkZXZpY2VzLmMgKi8KZXh0ZXJuIHZvaWQgRE9TREVWX0luc3RhbGxET1NEZXZpY2VzKHZvaWQpOwpleHRlcm4gdm9pZCBET1NERVZfU2V0dXBEZXZpY2UoY29uc3QgV0lORURFViAqIGRldmluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHNlZywgV09SRCBvZmZfZGV2LCBXT1JEIG9mZl90aHVuayk7CmV4dGVybiBEV09SRCBET1NERVZfQ29uc29sZSh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9GaW5kQ2hhckRldmljZShjaGFyKm5hbWUpOwpleHRlcm4gaW50IERPU0RFVl9QZWVrKERXT1JEIGRldiwgQllURSpkYXRhKTsKZXh0ZXJuIGludCBET1NERVZfUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBpbnQgRE9TREVWX1dyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuLCBpbnQgdmVyaWZ5KTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxSZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxXcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiB2b2lkIERPU0RFVl9TZXRTaGFyaW5nUmV0cnkoV09SRCBkZWxheSwgV09SRCBjb3VudCk7CmV4dGVybiBTRUdQVFIgRE9TREVWX0dldExPTChCT09MIHY4Nik7CgovKiBkbWEuYyAqLwpleHRlcm4gaW50IERNQV9UcmFuc2ZlcihpbnQgY2hhbm5lbCxpbnQgcmVxbGVuZ3RoLHZvaWQqIGJ1ZmZlcik7CmV4dGVybiB2b2lkIERNQV9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiBCWVRFIERNQV9pb3BvcnRfaW4oIFdPUkQgcG9ydCApOwoKLyogZG9zYXNwaS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9BU1BJSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGRvc2NvbmYuYyAqLwpleHRlcm4gRE9TQ09ORiAqRE9TQ09ORl9HZXRDb25maWcoIHZvaWQgKTsKCi8qIGRvc21lbS5jICovCmV4dGVybiBCT09MIERPU01FTV9Jbml0RG9zTWVtb3J5KHZvaWQpOwpleHRlcm4gQk9PTCBET1NNRU1fTWFwRG9zTGF5b3V0KHZvaWQpOwpleHRlcm4gV09SRCAgIERPU01FTV9BbGxvY1NlbGVjdG9yKFdPUkQpOyAvKiBGSVhNRTogdG8gYmUgcmVtb3ZlZCAqLwpleHRlcm4gTFBWT0lEIERPU01FTV9BbGxvY0Jsb2NrKFVJTlQgc2l6ZSwgV09SRCogcCk7CmV4dGVybiBCT09MIERPU01FTV9GcmVlQmxvY2sodm9pZCogcHRyKTsKZXh0ZXJuIFVJTlQgRE9TTUVNX1Jlc2l6ZUJsb2NrKHZvaWQqIHB0ciwgVUlOVCBzaXplLCBCT09MIGV4YWN0KTsKZXh0ZXJuIFVJTlQgRE9TTUVNX0F2YWlsYWJsZSh2b2lkKTsKZXh0ZXJuIEJJT1NEQVRBICpET1NWTV9CaW9zRGF0YSggdm9pZCApOwoKLyogZnB1LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM0SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM1SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM2SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM3SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM4SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDM5SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDNhSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDNiSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDNjSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDNkSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDNlSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGhpbWVtLmMgKi8KZXh0ZXJuIHZvaWQgRE9TVk1fSW5pdFNlZ21lbnRzKHZvaWQpOwpleHRlcm4gTFBWT0lEIERPU1ZNX0FsbG9jVU1CKERXT1JEKTsKZXh0ZXJuIExQVk9JRCBET1NWTV9BbGxvY0NvZGVVTUIoRFdPUkQsIFdPUkQgKiwgV09SRCAqKTsKZXh0ZXJuIExQVk9JRCBET1NWTV9BbGxvY0RhdGFVTUIoRFdPUkQsIFdPUkQgKiwgV09SRCAqKTsKCi8qIGludDA5LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDA5SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDA5U2VuZFNjYW4oQllURSBzY2FuLEJZVEUgYXNjaWkpOwpleHRlcm4gQllURSBXSU5BUEkgRE9TVk1fSW50MDlSZWFkU2NhbihCWVRFKmFzY2lpKTsKCi8qIGludDEwLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDEwSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1B1dENoYXIoQllURSBhc2NpaSk7CgovKiBpbnQxMy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxM0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxNS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxNUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxNi5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxNkhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiBCT09MIFdJTkFQSSBET1NWTV9JbnQxNlJlYWRDaGFyKCBCWVRFICosIEJZVEUgKiwgQ09OVEVYVDg2ICogKTsKZXh0ZXJuIGludCBXSU5BUEkgRE9TVk1fSW50MTZBZGRDaGFyKEJZVEUgYXNjaWksQllURSBzY2FuKTsKCi8qIGludDIxLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDIxSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDI1LmMgKi8KQk9PTCBET1NWTV9SYXdSZWFkKCBCWVRFLCBEV09SRCwgRFdPUkQsIEJZVEUgKiwgQk9PTCApOwp2b2lkIFdJTkFQSSBET1NWTV9JbnQyNUhhbmRsZXIoIENPTlRFWFQ4NiAqICk7CgovKiBpbnQyNi5jICovCkJPT0wgRE9TVk1fUmF3V3JpdGUoIEJZVEUsIERXT1JELCBEV09SRCwgQllURSAqLCBCT09MICk7CnZvaWQgV0lOQVBJIERPU1ZNX0ludDI2SGFuZGxlciggQ09OVEVYVDg2ICogKTsKCi8qIGludDJmLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDJmSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgTVNDREVYX0luc3RhbGxDRFJPTSh2b2lkKTsKCi8qIGludDMxLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMxSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1Jhd01vZGVTd2l0Y2hIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gQk9PTCBET1NWTV9Jc0RvczMyKHZvaWQpOwpleHRlcm4gRkFSUFJPQzE2IFdJTkFQSSBEUE1JX0FsbG9jSW50ZXJuYWxSTUNCKFJNQ0JQUk9DKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERQTUlfRnJlZUludGVybmFsUk1DQihGQVJQUk9DMTYpOwpleHRlcm4gaW50IERQTUlfQ2FsbFJNUHJvYyhDT05URVhUODYqLExQV09SRCxpbnQsaW50KTsKZXh0ZXJuIEJPT0wgRE9TVk1fQ2hlY2tXcmFwcGVycyhDT05URVhUODYqKTsKCi8qIGludDMzLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMzSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMzTWVzc2FnZShVSU5ULFdQQVJBTSxMUEFSQU0pOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNDb25zb2xlKE1PVVNFX0VWRU5UX1JFQ09SRCopOwoKLyogaW50NjcuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50NjdIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRU1TX0lvY3RsX0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnRlcnJ1cHRzLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0NhbGxCdWlsdGluSGFuZGxlciggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0VtdWxhdGVJbnRlcnJ1cHRQTSggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIEJPT0wgV0lOQVBJIERPU1ZNX0VtdWxhdGVJbnRlcnJ1cHRSTSggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIEZBUlBST0MxNiAgIERPU1ZNX0dldFBNSGFuZGxlcjE2KCBCWVRFICk7CmV4dGVybiBGQVJQUk9DNDggICBET1NWTV9HZXRQTUhhbmRsZXI0OCggQllURSApOwpleHRlcm4gRkFSUFJPQzE2ICAgRE9TVk1fR2V0Uk1IYW5kbGVyKCBCWVRFICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9IYXJkd2FyZUludGVycnVwdFBNKCBDT05URVhUODYgKiwgQllURSApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fSGFyZHdhcmVJbnRlcnJ1cHRSTSggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX1NldFBNSGFuZGxlcjE2KCBCWVRFLCBGQVJQUk9DMTYgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX1NldFBNSGFuZGxlcjQ4KCBCWVRFLCBGQVJQUk9DNDggKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX1NldFJNSGFuZGxlciggQllURSwgRkFSUFJPQzE2ICk7CgovKiByZWxheS5jICovCnZvaWQgRE9TVk1fUmVsYXlIYW5kbGVyKCBDT05URVhUODYgKiApOwp2b2lkIERPU1ZNX0J1aWxkQ2FsbEZyYW1lKCBDT05URVhUODYgKiwgRE9TUkVMQVksIExQVk9JRCApOwoKLyogc291bmRibGFzdGVyLmMgKi8KZXh0ZXJuIHZvaWQgU0JfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gQllURSBTQl9pb3BvcnRfaW4oIFdPUkQgcG9ydCApOwoKLyogcHBkZXYuYyAqLwpleHRlcm4gQk9PTCBJT19wcF9vdXRwKGludCBwb3J0LCBEV09SRCogcmVzKTsKZXh0ZXJuIGludCBJT19wcF9pbnAoaW50IHBvcnQsIERXT1JEKiByZXMpOwpleHRlcm4gY2hhciBJT19wcF9pbml0KHZvaWQpOwoKLyogdGltZXIuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDhIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogeG1zLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIFhNU19IYW5kbGVyKENPTlRFWFQ4NiopOwoKI2VuZGlmIC8qIF9fV0lORV9ET1NFWEVfSCAqLwo=