LyoKICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAogKgogKiAgSW5mb3JtYXRpb24gc3RydWN0dXJlcyBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YQogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA0CU5va2lhIENvcnBvcmF0aW9uCiAqICBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqLwoKI2lmbmRlZiBfT01BUF9CT0FSRF9ICiNkZWZpbmUgX09NQVBfQk9BUkRfSAoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KCi8qIERpZmZlcmVudCBwZXJpcGhlcmFsIGlkcyAqLwojZGVmaW5lIE9NQVBfVEFHX0NMT0NLCQkweDRmMDEKI2RlZmluZSBPTUFQX1RBR19NTUMJCTB4NGYwMgojZGVmaW5lIE9NQVBfVEFHX1NFUklBTF9DT05TT0xFIDB4NGYwMwojZGVmaW5lIE9NQVBfVEFHX1VTQgkJMHg0ZjA0CiNkZWZpbmUgT01BUF9UQUdfTENECQkweDRmMDUKI2RlZmluZSBPTUFQX1RBR19HUElPX1NXSVRDSAkweDRmMDYKI2RlZmluZSBPTUFQX1RBR19VQVJUCQkweDRmMDcKCiNkZWZpbmUgT01BUF9UQUdfQk9PVF9SRUFTT04gICAgMHg0ZjgwCiNkZWZpbmUgT01BUF9UQUdfRkxBU0hfUEFSVAkweDRmODEKCnN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyB7CgkvKiAwIGZvciAxMiBNSHosIDEgZm9yIDEzIE1IeiBhbmQgMiBmb3IgMTkuMiBNSHogKi8KCXU4IHN5c3RlbV9jbG9ja190eXBlOwp9OwoKc3RydWN0IG9tYXBfbW1jX2NvbmZpZyB7Cgl1OCBtbWNfYmxvY2tzOwoJczE2IG1tYzFfcG93ZXJfcGluLCBtbWMyX3Bvd2VyX3BpbjsKCXMxNiBtbWMxX3N3aXRjaF9waW4sIG1tYzJfc3dpdGNoX3BpbjsKfTsKCnN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyB7Cgl1OCBjb25zb2xlX3VhcnQ7Cgl1MzIgY29uc29sZV9zcGVlZDsKfTsKCnN0cnVjdCBvbWFwX3VzYl9jb25maWcgewoJLyogQ29uZmlndXJlIGRyaXZlcnMgYWNjb3JkaW5nIHRvIHRoZSBjb25uZWN0b3JzIG9uIHlvdXIgYm9hcmQ6CgkgKiAgLSAiQSIgY29ubmVjdG9yIChyZWN0YWd1bGFyKQoJICoJLi4uIGZvciBob3N0L09IQ0kgdXNlLCBzZXQgInJlZ2lzdGVyX2hvc3QiLgoJICogIC0gIkIiIGNvbm5lY3RvciAoc3F1YXJpc2gpIG9yICJNaW5pLUIiCgkgKgkuLi4gZm9yIGRldmljZS9nYWRnZXQgdXNlLCBzZXQgInJlZ2lzdGVyX2RldiIuCgkgKiAgLSAiTWluaS1BQiIgY29ubmVjdG9yICh2ZXJ5IHNpbWlsYXIgdG8gTWluaS1CKQoJICoJLi4uIGZvciBPVEcgdXNlIGFzIGRldmljZSBPUiBob3N0LCBpbml0aWFsaXplICJvdGciCgkgKi8KCXVuc2lnbmVkCXJlZ2lzdGVyX2hvc3Q6MTsKCXVuc2lnbmVkCXJlZ2lzdGVyX2RldjoxOwoJdTgJCW90ZzsJLyogcG9ydCBudW1iZXIsIDEtYmFzZWQ6ICB1c2IxID09IDIgKi8KCgl1OAkJaG1jX21vZGU7CgoJLyogaW1wbGljaXRseSB0cnVlIGlmIG90ZzogIGhvc3Qgc3VwcG9ydHMgcmVtb3RlIHdha2V1cD8gKi8KCXU4CQlyd2M7CgoJLyogc2lnbmFsaW5nIHBpbnMgdXNlZCB0byB0YWxrIHRvIHRyYW5zY2VpdmVyIG9uIHVzYk46CgkgKiAgMCA9PSB1c2JOIHVudXNlZAoJICogIDIgPT0gdXNiMC1vbmx5LCB1c2luZyBpbnRlcm5hbCB0cmFuc2NlaXZlcgoJICogIDMgPT0gMyB3aXJlIGJpZGlyZWN0aW9uYWwKCSAqICA0ID09IDQgd2lyZSBiaWRpcmVjdGlvbmFsCgkgKiAgNiA9PSA2IHdpcmUgdW5pZGlyZWN0aW9uYWwgKG9yIFRMTCkKCSAqLwoJdTgJCXBpbnNbM107Cn07CgpzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHsKCWNoYXIgcGFuZWxfbmFtZVsxNl07CgljaGFyIGN0cmxfbmFtZVsxNl07Cn07CgovKiBDb3ZlcjoKICogICAgICBoaWdoIC0+IGNsb3NlZAogKiAgICAgIGxvdyAgLT4gb3BlbgogKiBDb25uZWN0aW9uOgogKiAgICAgIGhpZ2ggLT4gY29ubmVjdGVkCiAqICAgICAgbG93ICAtPiBkaXNjb25uZWN0ZWQKICovCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9UWVBFX0NPVkVSCQkweDAwMDAKI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09OTkVDVElPTgkweDAwMDEKI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfSU5WRVJURUQJCTB4MDAwMQojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19PVVRQVVQJCTB4MDAwMgpzdHJ1Y3Qgb21hcF9ncGlvX3N3aXRjaF9jb25maWcgewoJY2hhciBuYW1lWzEyXTsKCXUxNiBncGlvOwoJaW50IGZsYWdzOjQ7CglpbnQgdHlwZTo0OwoJaW50IGtleV9jb2RlOjI0OyAvKiBMaW51eCBrZXkgY29kZSAqLwp9OwoKc3RydWN0IG9tYXBfZmxhc2hfcGFydF9jb25maWcgewoJY2hhciBwYXJ0X3RhYmxlWzBdOwp9OwoKc3RydWN0IG9tYXBfYm9vdF9yZWFzb25fY29uZmlnIHsKCWNoYXIgcmVhc29uX3N0clsxMl07Cn07CgpzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyB7CgkvKiBCaXQgZmllbGQgb2YgVUFSVHMgcHJlc2VudDsgYml0IDAgLS0+IFVBUlQxICovCgl1bnNpZ25lZCBpbnQgZW5hYmxlZF91YXJ0czsKfTsKCnN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSB7Cgl1MTYgdGFnOwoJdTE2IGxlbjsKCXU4ICBkYXRhWzBdOwp9OwoKc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCB7Cgl1MTYgdGFnOwoJY29uc3Qgdm9pZCAqZGF0YTsKfTsKCmV4dGVybiBjb25zdCB2b2lkICpfX29tYXBfZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgbnIpOwoKI2RlZmluZSBvbWFwX2dldF9jb25maWcodGFnLCB0eXBlKSBcCgkoKGNvbnN0IHR5cGUgKikgX19vbWFwX2dldF9jb25maWcoKHRhZyksIHNpemVvZih0eXBlKSwgMCkpCiNkZWZpbmUgb21hcF9nZXRfbnJfY29uZmlnKHRhZywgdHlwZSwgbnIpIFwKCSgoY29uc3QgdHlwZSAqKSBfX29tYXBfZ2V0X2NvbmZpZygodGFnKSwgc2l6ZW9mKHR5cGUpLCAobnIpKSkKCmV4dGVybiBjb25zdCB2b2lkICpvbWFwX2dldF92YXJfY29uZmlnKHUxNiB0YWcsIHNpemVfdCAqbGVuKTsKCmV4dGVybiBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpvbWFwX2JvYXJkX2NvbmZpZzsKZXh0ZXJuIGludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplOwoKI2VuZGlmCg==