LyoKKiogYXRhcmlpbnRzLmggLS0gQXRhcmkgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMKKioKKiogQ29weXJpZ2h0IDE5OTQgYnkgQmqUcm4gQnJhdWVsCioqCioqIDUvMi85NCBSb21hbiBIb2RlazoKKiogICBUVCBpbnRlcnJ1cHQgZGVmaW5pdGlvbnMgYWRkZWQuCioqCioqIDEyLzAyLzk2OiAoUm9tYW4pCioqICAgQWRhcHRlZCB0byBuZXcgaW50IGhhbmRsaW5nIHNjaGVtZSAoc2VlIGF0YWludHMuYyk7IHJldmlzZWQgbnVtYmVyaW5nCioqCioqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCioqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCioqIGZvciBtb3JlIGRldGFpbHMuCioqCiovCgojaWZuZGVmIF9MSU5VWF9BVEFSSUlOVFNfSF8KI2RlZmluZSBfTElOVVhfQVRBUklJTlRTX0hfCgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KCi8qCioqIEF0YXJpIEludGVycnVwdCBzb3VyY2VzLgoqKgoqLwoKI2RlZmluZSBTVE1GUF9TT1VSQ0VfQkFTRSAgOAojZGVmaW5lIFRUTUZQX1NPVVJDRV9CQVNFICAyNAojZGVmaW5lIFNDQ19TT1VSQ0VfQkFTRSAgICA0MAojZGVmaW5lIFZNRV9TT1VSQ0VfQkFTRSAgICA1NgojZGVmaW5lIFZNRV9NQVhfU09VUkNFUyAgICAxNgoKI2RlZmluZSBOVU1fQVRBUklfU09VUkNFUyAgIChWTUVfU09VUkNFX0JBU0UrVk1FX01BWF9TT1VSQ0VTLVNUTUZQX1NPVVJDRV9CQVNFKQoKLyogY29udmVydCB2ZWN0b3IgbnVtYmVyIHRvIGludCBzb3VyY2UgbnVtYmVyICovCiNkZWZpbmUgSVJRX1ZFQ1RPUl9UT19TT1VSQ0UodikJKCh2KSAtICgodikgPCAweDIwID8gMHgxOCA6ICgweDQwLTgpKSkKCi8qIGNvbnZlcnQgaXJxX2hhbmRsZXIgaW5kZXggdG8gdmVjdG9yIG51bWJlciAqLwojZGVmaW5lIElSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpCSgoaSkgKyAoKGkpIDwgOCA/IDB4MTggOiAoMHg0MC04KSkpCgovKiBpbnRlcnJ1cHQgc2VydmljZSB0eXBlcyAqLwojZGVmaW5lIElSUV9UWVBFX1NMT1cgICAgIDAKI2RlZmluZSBJUlFfVFlQRV9GQVNUICAgICAxCiNkZWZpbmUgSVJRX1RZUEVfUFJJTyAgICAgMgoKI2RlZmluZQlJUlFfU1BVUklPVVMgICAgICAoMCkKCi8qIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KI2RlZmluZSBJUlFfQVVUT18xICAgICAgICAoMSkKI2RlZmluZSBJUlFfQVVUT18yICAgICAgICAoMikKI2RlZmluZSBJUlFfQVVUT18zICAgICAgICAoMykKI2RlZmluZSBJUlFfQVVUT180ICAgICAgICAoNCkKI2RlZmluZSBJUlFfQVVUT181ICAgICAgICAoNSkKI2RlZmluZSBJUlFfQVVUT182ICAgICAgICAoNikKI2RlZmluZSBJUlFfQVVUT183ICAgICAgICAoNykKCi8qIFNULU1GUCBpbnRlcnJ1cHRzICovCiNkZWZpbmUgSVJRX01GUF9CVVNZICAgICAgKDgpCiNkZWZpbmUgSVJRX01GUF9EQ0QgICAgICAgKDkpCiNkZWZpbmUgSVJRX01GUF9DVFMJICAoMTApCiNkZWZpbmUgSVJRX01GUF9HUFUJICAoMTEpCiNkZWZpbmUgSVJRX01GUF9USU1EICAgICAgKDEyKQojZGVmaW5lIElSUV9NRlBfVElNQwkgICgxMykKI2RlZmluZSBJUlFfTUZQX0FDSUEJICAoMTQpCiNkZWZpbmUgSVJRX01GUF9GREMgICAgICAgKDE1KQojZGVmaW5lIElSUV9NRlBfQUNTSSAgICAgIElSUV9NRlBfRkRDCiNkZWZpbmUgSVJRX01GUF9GU0NTSSAgICAgSVJRX01GUF9GREMKI2RlZmluZSBJUlFfTUZQX0lERSAgICAgICBJUlFfTUZQX0ZEQwojZGVmaW5lIElSUV9NRlBfVElNQiAgICAgICgxNikKI2RlZmluZSBJUlFfTUZQX1NFUkVSUiAgICAoMTcpCiNkZWZpbmUgSVJRX01GUF9TRVJFTVBUICAgKDE4KQojZGVmaW5lIElSUV9NRlBfUkVDRVJSICAgICgxOSkKI2RlZmluZSBJUlFfTUZQX1JFQ0ZVTEwgICAoMjApCiNkZWZpbmUgSVJRX01GUF9USU1BICAgICAgKDIxKQojZGVmaW5lIElSUV9NRlBfUkkgICAgICAgICgyMikKI2RlZmluZSBJUlFfTUZQX01NRCAgICAgICAoMjMpCgovKiBUVC1NRlAgaW50ZXJydXB0cyAqLwojZGVmaW5lIElSUV9UVF9NRlBfSU8wICAgICAgICgyNCkKI2RlZmluZSBJUlFfVFRfTUZQX0lPMSAgICAgICAoMjUpCiNkZWZpbmUgSVJRX1RUX01GUF9TQ0MJICAgICAoMjYpCiNkZWZpbmUgSVJRX1RUX01GUF9SSQkgICAgICgyNykKI2RlZmluZSBJUlFfVFRfTUZQX1RJTUQgICAgICAoMjgpCiNkZWZpbmUgSVJRX1RUX01GUF9USU1DCSAgICAgKDI5KQojZGVmaW5lIElSUV9UVF9NRlBfRFJWUkRZICAgICgzMCkKI2RlZmluZSBJUlFfVFRfTUZQX1NDU0lETUEgICAoMzEpCiNkZWZpbmUgSVJRX1RUX01GUF9USU1CICAgICAgKDMyKQojZGVmaW5lIElSUV9UVF9NRlBfU0VSRVJSICAgICgzMykKI2RlZmluZSBJUlFfVFRfTUZQX1NFUkVNUFQgICAoMzQpCiNkZWZpbmUgSVJRX1RUX01GUF9SRUNFUlIgICAgKDM1KQojZGVmaW5lIElSUV9UVF9NRlBfUkVDRlVMTCAgICgzNikKI2RlZmluZSBJUlFfVFRfTUZQX1RJTUEgICAgICAoMzcpCiNkZWZpbmUgSVJRX1RUX01GUF9SVEMgICAgICAgKDM4KQojZGVmaW5lIElSUV9UVF9NRlBfU0NTSSAgICAgICgzOSkKCi8qIFNDQyBpbnRlcnJ1cHRzICovCiNkZWZpbmUgSVJRX1NDQ0JfVFgJICAgICAoNDApCiNkZWZpbmUgSVJRX1NDQ0JfU1RBVAkgICAgICg0MikKI2RlZmluZSBJUlFfU0NDQl9SWAkgICAgICg0NCkKI2RlZmluZSBJUlFfU0NDQl9TUENPTkQJICAgICAoNDYpCiNkZWZpbmUgSVJRX1NDQ0FfVFgJICAgICAoNDgpCiNkZWZpbmUgSVJRX1NDQ0FfU1RBVAkgICAgICg1MCkKI2RlZmluZSBJUlFfU0NDQV9SWAkgICAgICg1MikKI2RlZmluZSBJUlFfU0NDQV9TUENPTkQJICAgICAoNTQpCgoKI2RlZmluZSBJTlRfQ0xLICAgMjQ1NzYJICAgIC8qIENMSyB3aGlsZSBpbnRfY2xrID0yLjQ1Nk1IeiBhbmQgZGl2aWRlID0gMTAwICovCiNkZWZpbmUgSU5UX1RJQ0tTIDI0NgkgICAgLyogdG8gbWFrZSBzY2hlZF90aW1lID0gOTkuOTAyLi4uIEhaICovCgoKI2RlZmluZSBNRlBfRU5BQkxFCTAKI2RlZmluZSBNRlBfUEVORElORwkxCiNkZWZpbmUgTUZQX1NFUlZJQ0UJMgojZGVmaW5lIE1GUF9NQVNLCTMKCi8qIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBzZXR0aW5nL2NsZWFyaW5nIGJpdHMgaW4gdGhlIGludGVycnVwdCByZWdpc3RlcnMgb2YKICogdGhlIE1GUC4gJ3R5cGUnIHNob3VsZCBiZSBjb25zdGFudCwgaWYgJ2lycScgaXMgY29uc3RhbnQsIHRvbywgY29kZSBzaXplIGlzCiAqIHJlZHVjZWQuIHNldF9tZnBfYml0KCkgaXMgbm9uc2Vuc2UgZm9yIFBFTkRJTkcgYW5kIFNFUlZJQ0UgcmVnaXN0ZXJzLiAqLwoKc3RhdGljIGlubGluZSBpbnQgZ2V0X21mcF9iaXQoIHVuc2lnbmVkIGlycSwgaW50IHR5cGUgKQoKewl1bnNpZ25lZCBjaGFyCW1hc2ssICpyZWc7CgoJbWFzayA9IDEgPDwgKGlycSAmIDcpOwoJcmVnID0gKHVuc2lnbmVkIGNoYXIgKikmbWZwLmludF9lbl9hICsgdHlwZSo0ICsKCQkgICgoaXJxICYgOCkgPj4gMikgKyAoKChpcnEtOCkgJiAxNikgPDwgMyk7CglyZXR1cm4oICpyZWcgJiBtYXNrICk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbWZwX2JpdCggdW5zaWduZWQgaXJxLCBpbnQgdHlwZSApCgp7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKCgltYXNrID0gMSA8PCAoaXJxICYgNyk7CglyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKwoJCSAgKChpcnEgJiA4KSA+PiAyKSArICgoKGlycS04KSAmIDE2KSA8PCAzKTsKCV9fYXNtX18gX192b2xhdGlsZV9fICggIm9yYiAlMCwlMSIKCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX21mcF9iaXQoIHVuc2lnbmVkIGlycSwgaW50IHR5cGUgKQoKewl1bnNpZ25lZCBjaGFyCW1hc2ssICpyZWc7CgoJbWFzayA9IH4oMSA8PCAoaXJxICYgNykpOwoJcmVnID0gKHVuc2lnbmVkIGNoYXIgKikmbWZwLmludF9lbl9hICsgdHlwZSo0ICsKCQkgICgoaXJxICYgOCkgPj4gMikgKyAoKChpcnEtOCkgJiAxNikgPDwgMyk7CglpZiAodHlwZSA9PSBNRlBfUEVORElORyB8fCB0eXBlID09IE1GUF9TRVJWSUNFKQoJCV9fYXNtX18gX192b2xhdGlsZV9fICggIm1vdmViICUwLCUxIgoJCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKCWVsc2UKCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJhbmRiICUwLCUxIgoJCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKfQoKLyoKICoge2VuLGRpc31hYmxlX2lycSBoYXZlIHRoZSB1c3VhbCBzZW1hbnRpY3Mgb2YgdGVtcG9yYXJ5IGJsb2NraW5nIHRoZQogKiBpbnRlcnJ1cHQsIGJ1dCBub3QgbG9vc2luZyByZXF1ZXN0cyB0aGF0IGhhcHBlbiBiZXR3ZWVuIGRpc2FibGluZyBhbmQKICogZW5hYmxpbmcuIFRoaXMgaXMgZG9uZSB3aXRoIHRoZSBNRlAgbWFzayByZWdpc3RlcnMuCiAqLwoKc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX2VuYWJsZV9pcnEoIHVuc2lnbmVkIGlycSApCgp7CglpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuOwoJc2V0X21mcF9iaXQoIGlycSwgTUZQX01BU0sgKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX2Rpc2FibGVfaXJxKCB1bnNpZ25lZCBpcnEgKQoKewoJaWYgKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpIHJldHVybjsKCWNsZWFyX21mcF9iaXQoIGlycSwgTUZQX01BU0sgKTsKfQoKLyoKICogSW4gb3Bwb3NpdGUgdG8ge2VuLGRpc31hYmxlX2lycSwgcmVxdWVzdHMgYmV0d2VlbiB0dXJue29mZixvbn1faXJxIGFyZSBub3QKICogInN0b3JlZCIKICovCgpzdGF0aWMgaW5saW5lIHZvaWQgYXRhcmlfdHVybm9uX2lycSggdW5zaWduZWQgaXJxICkKCnsKCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm47CglzZXRfbWZwX2JpdCggaXJxLCBNRlBfRU5BQkxFICk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBhdGFyaV90dXJub2ZmX2lycSggdW5zaWduZWQgaXJxICkKCnsKCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm47CgljbGVhcl9tZnBfYml0KCBpcnEsIE1GUF9FTkFCTEUgKTsKCWNsZWFyX21mcF9iaXQoIGlycSwgTUZQX1BFTkRJTkcgKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX2NsZWFyX3BlbmRpbmdfaXJxKCB1bnNpZ25lZCBpcnEgKQoKewoJaWYgKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpIHJldHVybjsKCWNsZWFyX21mcF9iaXQoIGlycSwgTUZQX1BFTkRJTkcgKTsKfQoKc3RhdGljIGlubGluZSBpbnQgYXRhcmlfaXJxX3BlbmRpbmcoIHVuc2lnbmVkIGlycSApCgp7CglpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuKCAwICk7CglyZXR1cm4oIGdldF9tZnBfYml0KCBpcnEsIE1GUF9QRU5ESU5HICkgKTsKfQoKdW5zaWduZWQgbG9uZyBhdGFyaV9yZWdpc3Rlcl92bWVfaW50KCB2b2lkICk7CnZvaWQgYXRhcmlfdW5yZWdpc3Rlcl92bWVfaW50KCB1bnNpZ25lZCBsb25nICk7CgojZW5kaWYgLyogbGludXgvYXRhcmlpbnRzLmggKi8K