LyoKICogKEMpIENvcHlyaWdodCAyMDEwIEp1ZXJnZW4gQmVpc2VydCAtIFBlbmd1dHJvbml4CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxpbml0Lmg+CiNpbmNsdWRlIDxncGlvLmg+CiNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPG1jaS5oPgojaW5jbHVkZSA8c2l6ZXMuaD4KI2luY2x1ZGUgPHVzYi9laGNpLmg+CiNpbmNsdWRlIDxhc20vYXJtbGludXguaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL21tdS5oPgojaW5jbHVkZSA8Z2VuZXJhdGVkL21hY2gtdHlwZXMuaD4KI2luY2x1ZGUgPG1hY2gvaW14LXJlZ3MuaD4KI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KI2luY2x1ZGUgPG1hY2gvbWNpLmg+CiNpbmNsdWRlIDxtYWNoL2ZiLmg+CiNpbmNsdWRlIDxtYWNoL3VzYi5oPgoKc3RhdGljIHN0cnVjdCBtZW1vcnlfcGxhdGZvcm1fZGF0YSByYW1fcGRhdGEgPSB7CgkubmFtZSA9ICJyYW0wIiwKCS5mbGFncyA9IERFVkZTX1JEV1IsCn07CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIHNkcmFtX2RldiA9IHsKCS5pZCAgICAgICA9IC0xLAoJLm5hbWUgICAgID0gIm1lbSIsCgkubWFwX2Jhc2UgPSBJTVhfTUVNT1JZX0JBU0UsCgkuc2l6ZSAgICAgPSA2NCAqIDEwMjQgKiAxMDI0LAoJLnBsYXRmb3JtX2RhdGEgPSAmcmFtX3BkYXRhLAp9OwoKc3RhdGljIHN0cnVjdCBteHNfbWNpX3BsYXRmb3JtX2RhdGEgbWNpX3BkYXRhID0gewoJLmNhcHMgPSBNTUNfTU9ERV80QklUIHwgTU1DX01PREVfSFMgfCBNTUNfTU9ERV9IU181Mk1IeiwKCS52b2x0YWdlcyA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAkvKiBmaXhlZCB0byAzLjMgViAqLwp9OwoKc3RhdGljIHN0cnVjdCBkZXZpY2VfZCBtY2lfZGV2ID0gewoJLm5hbWUgICAgID0gIm14c19tY2kiLAoJLm1hcF9iYXNlID0gSU1YX1NTUDFfQkFTRSwKCS5wbGF0Zm9ybV9kYXRhID0gJm1jaV9wZGF0YSwKfTsKCiNkZWZpbmUgR1BJT19MQ0RfUkVTRVQJCTUwCiNkZWZpbmUgR1BJT19MQ0RfQkFDS0xJR0hUCTYwCgpzdGF0aWMgdm9pZCBjaHVtYnlfZmJfZW5hYmxlKGludCBlbmFibGUpCnsKCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0xDRF9SRVNFVCwgZW5hYmxlKTsKCgkvKiBHaXZlIHRoZSBkaXNwbGF5IGEgY2hhbmNlIHRvIHN5bmMgYmVmb3JlIHdlIGVuYWJsZQoJICogdGhlIGJhY2tsaWdodCB0byBhdm9pZCBmbGlja2VyaW5nCgkgKi8KCWlmIChlbmFibGUpCgkJbWRlbGF5KDEwMCk7CgoJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTENEX0JBQ0tMSUdIVCwgZW5hYmxlKTsKfQoKc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZmFsY29ud2luZ192bW9kZSA9IHsKCS8qCgkgKiBOYW5vdmlzaW9uIE5NQTM1UVY2NS1CMi1LMDEgKGRpcmVjdGx5IGNvbm5lY3RlZCkKCSAqIENsb2NrOiA2LjI1IE1IegoJICogU3luY3M6IGhpZ2ggYWN0aXZlLCBERSBsb3cgYWN0aXZlCgkgKiBEaXNwbGF5IGFyZWE6IDcwLjA4IG1tIHggNTIuNTYgbW0KCSAqLwoJLm5hbWUgPSAiTk1BMzUiLAoJLnJlZnJlc2ggPSA2MCwKCS54cmVzID0gMzIwLAoJLnlyZXMgPSAyNDAsCgkucGl4Y2xvY2sgPSBLSFoyUElDT1MoNjI1MCksICAgIC8qIG1heC4gMTAgTUh6ICovCgkvKiBsaW5lIGxlbmdodCBzaG91bGQgYmUgNjQgtXMgKi8KCS5sZWZ0X21hcmdpbiA9IDI4LAoJLmhzeW5jX2xlbiA9IDI0LAoJLnJpZ2h0X21hcmdpbiA9IDI4LAoJLyogZnJhbWUgcmF0ZSBzaG91bGQgYmUgNjAgSHogKi8KCS51cHBlcl9tYXJnaW4gPSA4LAoJLnZzeW5jX2xlbiA9IDQsCgkubG93ZXJfbWFyZ2luID0gOCwKCS5zeW5jID0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCgkudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAoJLmZsYWcgPSAwLAp9OwoKI2RlZmluZSBNQVhfRkJfU0laRSBTWl8xTQoKc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1kYXRhIGZiX21vZGUgPSB7CgkubW9kZV9saXN0ID0gJmZhbGNvbndpbmdfdm1vZGUsCgkubW9kZV9jbnQgPSAxLAoJLyogdGhlIE5NQTM1IGlzIGEgMjQgYml0IGRpc3BsYXksIGJ1dCBvbmx5IDE4IGJpdHMgYXJlIGNvbm5lY3RlZCAqLwoJLmxkX2ludGZfd2lkdGggPSBTVE1MQ0RJRl8xOEJJVCwKCS5lbmFibGUgPSBjaHVtYnlfZmJfZW5hYmxlLAoJLmZpeGVkX3NjcmVlbiA9ICh2b2lkICopKDB4NDAwMDAwMDAgKyBTWl82NE0gLSBNQVhfRkJfU0laRSksCgkuZml4ZWRfc2NyZWVuX3NpemUgPSBNQVhfRkJfU0laRSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2QgbGRjaWZfZGV2ID0gewoJLm5hbWUgPSAic3RtZmIiLAoJLm1hcF9iYXNlID0gSU1YX0ZCX0JBU0UsCgkuc2l6ZSA9IDQwOTYsCgkucGxhdGZvcm1fZGF0YSA9ICZmYl9tb2RlLAp9OwoKc3RhdGljIGNvbnN0IHVpbnQzMl90IHBhZF9zZXR1cFtdID0gewoJLyogbWF5IGJlIG5vdCByZXF1aXJlZCBhcyBhbHJlYWR5IGRvbmUgYnkgdGhlIGJvb3RsZXQgY29kZSAqLwojaWYgMAoJLyogU0RSQU0gZGF0YSBzaWduYWxzICovCglFTUlfRDE1IHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0QxNCB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9EMTMgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDEyIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0QxMSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9EMTAgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDkgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDggfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDcgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDYgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDUgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDQgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDMgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDIgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDEgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfRDAgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCgoJLyogU0RSQU0gZGF0YSBjb250cm9sIHNpZ25hbHMgKi8KCUVNSV9EUU0wIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAkvKiBMRE0gKi8KCUVNSV9EUU0xIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAkvKiBVRE0gKi8KCgkvKiBTRFJBTSBhZGRyZXNzIHNpZ25hbHMgKi8KCUVNSV9BMCB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BMSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BMiB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BMyB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BNCB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BNSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BNiB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BNyB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BOCB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BOSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9BMTAgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfQTExIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0ExMiB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCgkvKiBTRFJBTSBhZGRyZXNzIGNvbnRyb2wgc2lnbmFscyAqLwoJRU1JX1JBU04gfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfQ0FTTiB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCgkvKiBTRFJBTSBjb250cm9sIHNpZ25hbHMgKi8KCUVNSV9DRTBOIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0NMSyB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9DTEtOIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0NLRSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9XRU4gfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCglFTUlfQkEwIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0JBMSB8IFNUUkVOR1RIKDApIHwgVkVfMl81ViwKCUVNSV9EUVMwIHwgU1RSRU5HVEgoMCkgfCBWRV8yXzVWLAoJRU1JX0RRUzEgfCBTVFJFTkdUSCgwKSB8IFZFXzJfNVYsCiNlbmRpZgoJLyogZGVidWcgcG9ydCAqLwoJUFdNMV9EVUFSVF9UWCB8IFNUUkVOR1RIKFM0TUEpLAkvKiAgc3RyZW5ndGggaXMgVEJEICovCglQV00wX0RVQVJUX1JYIHwgU1RSRU5HVEgoUzRNQSksCS8qICBzdHJlbmd0aCBpcyBUQkQgKi8KCgkvKiBsY2QgKi8KCUxDRF9WU1lOQyB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9IU1lOQyB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9FTkFCRSB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9ET1RDTE9DSyB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9EMTcgfCBTVFJFTkdUSChTMTJNQSksCglMQ0RfRDE2IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QxNSB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9EMTQgfCBTVFJFTkdUSChTMTJNQSksCglMQ0RfRDEzIHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QxMiB8IFNUUkVOR1RIKFMxMk1BKSwKCUxDRF9EMTEgfCBTVFJFTkdUSChTMTJNQSksCglMQ0RfRDEwIHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q5IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q4IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q3IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q2IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q1IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0Q0IHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QzIHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QyIHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QxIHwgU1RSRU5HVEgoUzEyTUEpLAoJTENEX0QwIHwgU1RSRU5HVEgoUzEyTUEpLAoKCS8qIExDRCB1c2FnZSBjdXJyZW50bHkgdW5rbm93biAqLwoJTENEX0NTLAkvKiB1c2VkIGFzIFNQSSBTUyAqLwoJTENEX1JTLAkvKiB1c2VkIGFzIFNQSSBDTEsgKi8KCS8qIGtlZXAgdGhlIGRpc3BsYXkgaW4gcmVzZXQgc3RhdGUgKi8KCUxDRF9SRVNFVF9HUElPIHwgU1RSRU5HVEgoUzRNQSkgfCBHUElPX09VVCB8IEdQSU9fVkFMVUUoMCksCglMQ0RfV1IsCS8qIHVzZWQgYXMgU1BJIE1PU0kgKi8KCgkvKiBJMkMgdG8gdGhlIE1NQTc0NTVMLCBLWFRFOSwgQVQyNEMwOCAoRENJRCksIEFUMjRDMTI4QiAoSUQgRUVQUk9NKSBhbmQgUU44MDA1QiAqLwoJSTJDX1NEQSwKCUkyQ19DTEssCgoJLyogUm90YXJ5IGRlY29kZXIgKGV4dGVybmFsIHB1bGwgdXBzKSAqLwoJUk9UQVJZQSwKCVJPVEFSWUIsCgoJLyogdGhlIGNodW1ieSBiZW5kIChleHRlcm5hbCBwdWxsIHVwKSAqLwoJUFdNNF9HUElPIHwgR1BJT19JTiwKCgkvKiBiYWNrbGlnaHQgY29udHJvbCwgdG8gYmUgY29udHJvbGVkIGJ5IFBXTSwgaGVyZSB3ZSBvbmx5IHdhbnQgdG8gZGlzYWJsZSBpdCAqLwoJUFdNMl9HUElPIHwgR1BJT19PVVQgfCBHUElPX1ZBTFVFKDApLAkvKiAxIGVuYWJsZXMsIDAgZGlzYWJsZXMgdGhlIGJhY2tsaWdodCAqLwoKCS8qIFVTQiBodWIgcmVzZXQgKGFjdGl2ZSBsb3cpICovCglBVUFSVDFfVFhfR1BJTyB8IEdQSU9fT1VUIHwgR1BJT19WQUxVRSgwKSwKCgkvKiBVU0IgcG93ZXIgKGFjdGl2ZSBoaWdoKSAqLwoJQVVBUlQxX0NUU19HUElPIHwgR1BJT19PVVQgfCBHUElPX1ZBTFVFKDApLAoKCS8qIERldGVjdGluZyBpZiBhIGRpc3BsYXkgaXMgY29ubmVjdGVkICgwID0gZGlzcGxheSBhdHRhY2hlZCkgKGV4dGVybmFsIHB1bGwgdXApICovCglBVUFSVDFfUlRTX0dQSU8gfCBHUElPX0lOLAoKCS8qIGRpc2FibGUgdGhlIGF1ZGlvIGFtcGxpZmllciAqLwoJR1BNSV9EMDhfR1BJTyB8IEdQSU9fT1VUIHwgR1BJT19WQUxVRSgwKSwKCgkvKiBIZWFkIFBob25lIGRldGVjdGlvbiAoRklYTUUgd2hhdCBsZXZlbCB3aGVuIHBsdWdnZWQgaW4pIChleHRlcm5hbCBwdWxsIHVwKSAqLwoJR1BNSV9EMTFfR1BJTyB8IEdQSU9fSU4sCgojaWYgMAoJLyogRW5hYmxlIHRoZSBsb2NhbCA1ViAoRklYTUUgd2hhdCB0byBkbyB3aGVuIHRoZSBib290bG9hZGVyIHJ1bnMpICovCglHUE1JX0QxMl9HUElPIHwgR1BJT19PVVQgfCBHUElPX1ZBTFVFKDEpLAojZW5kaWYKCgkvKiBub3QgdXNlZCBwaW5zICovCglHUE1JX0QwOV9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCUdQTUlfRDEwX0dQSU8gfCBHUElPX0lOIHwgUFVMTFVQKDEpLAoJR1BNSV9EMTNfR1BJTyB8IEdQSU9fSU4gfCBQVUxMVVAoMSksCgoJLyogdW5rbm93bi4gTm90IGNvbm5lY3RlZCB0byBhbnl0aGluZyB0aGFuIHRlc3QgcGluIEoxMTMgKi8KCUdQTUlfRDE0X0dQSU8gfCBHUElPX0lOIHwgUFVMTFVQKDEpLAoKCS8qIHVua25vd24uIE5vdCBjb25uZWN0ZWQgdG8gYW55dGhpbmcgdGhhbiB0ZXN0IHBpbiBKMTE0ICovCglHUE1JX0QxNV9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCgkvKiBOQU5EIGNvbnRyb2xsZXIgKE5vdGU6IFRoZXJlIGlzIG5vIE5BTkQgZGV2aWNlIG9uIHRoZSBib2FyZCkgKi8KCUdQTUlfRDAwIHwgUFVMTFVQKDEpLAoJR1BNSV9EMDEgfCBQVUxMVVAoMSksCglHUE1JX0QwMiB8IFBVTExVUCgxKSwKCUdQTUlfRDAzIHwgUFVMTFVQKDEpLAoJR1BNSV9EMDQgfCBQVUxMVVAoMSksCglHUE1JX0QwNSB8IFBVTExVUCgxKSwKCUdQTUlfRDA2IHwgUFVMTFVQKDEpLAoJR1BNSV9EMDcgfCBQVUxMVVAoMSksCglHUE1JX0NFME4sCglHUE1JX1JEWTAgfCBQVUxMVVAoMSksCglHUE1JX1dSTiwJLyoga2VybmVsIHRyaWVzIGhlcmUgd2l0aCAxMiBtQSAqLwoJR1BNSV9SRE4sCS8qIGtlcm5lbCB0cmllcyBoZXJlIHdpdGggMTIgbUEgKi8KCUdQTUlfV1BNLAkvKiBrZXJuZWwgdHJpZXMgaGVyZSB3aXRoIDEyIG1BICovCglHUE1JX0NMRSwKCUdQTUlfQUxFLAoKCS8qIFNEIGNhcmQgaW50ZXJmYWNlICovCglTU1AxX0RBVEEwIHwgUFVMTFVQKDEpLAkvKiBhdmFpbGFibGUgYXQgSjIwMSAqLwoJU1NQMV9EQVRBMSB8IFBVTExVUCgxKSwJLyogYXZhaWxhYmxlIGF0IEoyMDAgKi8KCVNTUDFfREFUQTIgfCBQVUxMVVAoMSksCS8qIGF2YWlsYWJsZSBhdCBKMjA1ICovCglTU1AxX0RBVEEzIHwgUFVMTFVQKDEpLAkvKiBhdmFpbGFibGUgYXQgSjIwNCAqLwoJU1NQMV9TQ0ssCQkvKiBhdmFpbGFibGUgYXQgSjIwMiAqLwoJU1NQMV9DTUQgfCBQVUxMVVAoMSksCS8qIGF2YWlsYWJsZSBhdCBKMjAzICovCglTU1AxX0RFVEVDVCB8IFBVTExVUCgxKSwJLyogb25seSBjb25uZWN0ZWQgdG8gdGVzdCBwaW4gSjExNSAqLwoKCS8qIG90aGVyIG5vdCB1c2VkIHBpbnMgKi8KCUdQTUlfQ0UxTl9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCUdQTUlfQ0UyTl9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCUdQTUlfUkRZMV9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCUdQTUlfUkRZMl9HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKCUdQTUlfUkRZM19HUElPIHwgR1BJT19JTiB8IFBVTExVUCgxKSwKfTsKCiNpZmRlZiBDT05GSUdfTU1VCnN0YXRpYyBpbnQgZmFsY29ud2luZ19tbXVfaW5pdCh2b2lkKQp7CgltbXVfaW5pdCgpOwoKCWFybV9jcmVhdGVfc2VjdGlvbigweDQwMDAwMDAwLCAweDQwMDAwMDAwLCA2NCwgUE1EX1NFQ1RfREVGX0NBQ0hFRCk7Cglhcm1fY3JlYXRlX3NlY3Rpb24oMHg1MDAwMDAwMCwgMHg0MDAwMDAwMCwgNjQsIFBNRF9TRUNUX0RFRl9VTkNBQ0hFRCk7CgoJc2V0dXBfZG1hX2NvaGVyZW50KDB4MTAwMDAwMDApOwoKCW1tdV9lbmFibGUoKTsKCglyZXR1cm4gMDsKfQpwb3N0Y29yZV9pbml0Y2FsbChmYWxjb253aW5nX21tdV9pbml0KTsKI2VuZGlmCgovKioKICogVHJ5IHRvIHJlZ2lzdGVyIGFuIGVudmlyb25tZW50IHN0b3JhZ2Ugb24gdGhlIGF0dGFjaGVkIE1DSSBjYXJkCiAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCiAqCiAqIFdlIHJlbHkgb24gdGhlIGV4aXN0ZW5jZSBvZiBhIHVzYWJsZSBTRCBjYXJkLCBhbHJlYWR5IGF0dGFjaGVkIHRvCiAqIG91ciBzeXN0ZW0sIHRvIGdldCBzb21ldGhpbmcgbGlrZSBhIHBlcnNpc3RlbnQgbWVtb3J5IGZvciBvdXIgZW52aXJvbm1lbnQuCiAqIElmIHRoaXMgU0QgY2FyZCBpcyBhbHNvIHRoZSBib290IG1lZGlhLCB3ZSBjYW4gdXNlIHRoZSBzZWNvbmQgcGFydGl0aW9uCiAqIGZvciBvdXIgZW52aXJvbm1lbnQgcHVycG9zZSAoaWYgcHJlc2VudCEpLgogKi8Kc3RhdGljIGludCByZWdpc3Rlcl9wZXJzaXN0YW50X2Vudmlyb25tZW50KHZvaWQpCnsKCXN0cnVjdCBjZGV2ICpjZGV2OwoKCS8qCgkgKiBUaGUgY2h1bWJ5IG9uZSBvbmx5IGhhcyBvbmUgTUNJIGNhcmQgc29ja2V0LgoJICogU28sIHdlIGV4cGVjdCBpdHMgbmFtZSBhcyAiZGlzazAiLgoJICovCgljZGV2ID0gY2Rldl9ieV9uYW1lKCJkaXNrMCIpOwoJaWYgKGNkZXYgPT0gTlVMTCkgewoJCXByX2VycigiTm8gTUNJIGNhcmQgcHJlc2V0XG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBNQ0kgY2FyZCBpcyBwcmVzZW50LCBhbHNvIGEgdXNlYWJsZSBwYXJ0aXRpb24gb24gaXQ/ICovCgljZGV2ID0gY2Rldl9ieV9uYW1lKCJkaXNrMC4xIik7CglpZiAoY2RldiA9PSBOVUxMKSB7CgkJcHJfZXJyKCJObyBzZWNvbmQgcGFydGl0aW9uIGF2YWlsYWJsZVxuIik7CgkJcHJfaW5mbygiUGxlYXNlIGNyZWF0ZSBhdCBsZWFzdCBhIHNlY29uZCBwYXJ0aXRpb24gd2l0aCIKCQkJIiAyNTYga2lCLi4uNTEyIGtpQiBpbiBzaXplICh5b3VyIGNob2ljZSlcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCS8qIHVzZSB0aGUgZnVsbCBwYXJ0aXRpb24gYXMgb3VyIHBlcnNpc3RlbnQgZW52aXJvbm1lbnQgc3RvcmFnZSAqLwoJcmV0dXJuIGRldmZzX2FkZF9wYXJ0aXRpb24oImRpc2swLjEiLCAwLCBjZGV2LT5zaXplLCBERVZGU19QQVJUSVRJT05fRklYRUQsICJlbnYwIik7Cn0KCnN0YXRpYyBzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9kYXRhIGNodW1ieV91c2JfcGRhdGEgPSB7CgkuZmxhZ3MgPSBFSENJX0hBU19UVCwKCS5oY2NyX29mZnNldCA9IDB4MTAwLAoJLmhjb3Jfb2Zmc2V0ID0gMHgxNDAsCn07CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIHVzYl9kZXYgPSB7CgkubmFtZQkJPSAiZWhjaSIsCgkuaWQJCT0gLTEsCgkubWFwX2Jhc2UJPSBJTVhfVVNCX0JBU0UsCgkuc2l6ZQkJPSAweDIwMCwKCS5wbGF0Zm9ybV9kYXRhCT0gJmNodW1ieV91c2JfcGRhdGEsCn07CgojZGVmaW5lIEdQSU9fVVNCX0hVQl9SRVNFVAkyOQojZGVmaW5lIEdQSU9fVVNCX0hVQl9QT1dFUgkyNgoKc3RhdGljIHZvaWQgZmFsY29ud2luZ19pbml0X3VzYih2b2lkKQp7CgkvKiBwb3dlciBVU0IgaHViICovCglncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19VU0JfSFVCX1BPV0VSLCAxKTsKCW1kZWxheSgxKTsKCS8qIGJyaW5nIFVTQiBodWIgb3V0IG9mIHJlc2V0ICovCglncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19VU0JfSFVCX1JFU0VULCAxKTsKCglpbXhfdXNiX3BoeV9lbmFibGUoKTsKCXJlZ2lzdGVyX2RldmljZSgmdXNiX2Rldik7Cn0KCnN0YXRpYyBpbnQgZmFsY29ud2luZ19kZXZpY2VzX2luaXQodm9pZCkKewoJaW50IGksIHJjOwoKCS8qIGluaXRpemFsaXplIGdwaW9zICovCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYWRfc2V0dXApOyBpKyspCgkJaW14X2dwaW9fbW9kZShwYWRfc2V0dXBbaV0pOwoKCXJlZ2lzdGVyX2RldmljZSgmc2RyYW1fZGV2KTsKCWlteF9zZXRfaW9jbGsoNDgwMDAwMDAwKTsgLyogZW5hYmxlIElPQ0xLIHRvIHJ1biBhdCB0aGUgUExMIGZyZXF1ZW5jeSAqLwoJLyogcnVuIHRoZSBTU1AgdW5pdCBjbG9jayBhdCAxMDAsMDAwIGtIeiAqLwoJaW14X3NldF9zc3BjbGsoMCwgMTAwMDAwMDAwLCAxKTsKCXJlZ2lzdGVyX2RldmljZSgmbWNpX2Rldik7CglyZWdpc3Rlcl9kZXZpY2UoJmxkY2lmX2Rldik7CgoJZmFsY29ud2luZ19pbml0X3VzYigpOwoKCWFybWxpbnV4X2FkZF9kcmFtKCZzZHJhbV9kZXYpOwoJYXJtbGludXhfc2V0X2Jvb3RwYXJhbXMoKHZvaWQqKShzZHJhbV9kZXYubWFwX2Jhc2UgKyAweDEwMCkpOwoJYXJtbGludXhfc2V0X2FyY2hpdGVjdHVyZShNQUNIX1RZUEVfQ0hVTUJZKTsKCglyYyA9IHJlZ2lzdGVyX3BlcnNpc3RhbnRfZW52aXJvbm1lbnQoKTsKCWlmIChyYyAhPSAwKQoJCXByaW50ZigiQ2Fubm90IGNyZWF0ZSB0aGUgJ2VudjAnIHBlcnNpc3RhbnQgZW52aXJvbm1lbnQgc3RvcmFnZSAoJWQpXG4iLCByYyk7CgoJcmV0dXJuIDA7Cn0KCmRldmljZV9pbml0Y2FsbChmYWxjb253aW5nX2RldmljZXNfaW5pdCk7CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIGZhbGNvbndpbmdfc2VyaWFsX2RldmljZSA9IHsKCS5uYW1lICAgICA9ICJzdG1fc2VyaWFsIiwKCS5tYXBfYmFzZSA9IElNWF9EQkdVQVJUX0JBU0UsCgkuc2l6ZSAgICAgPSA4MTkyLAp9OwoKc3RhdGljIGludCBmYWxjb253aW5nX2NvbnNvbGVfaW5pdCh2b2lkKQp7CglyZXR1cm4gcmVnaXN0ZXJfZGV2aWNlKCZmYWxjb253aW5nX3NlcmlhbF9kZXZpY2UpOwp9Cgpjb25zb2xlX2luaXRjYWxsKGZhbGNvbndpbmdfY29uc29sZV9pbml0KTsKCi8qKiBAcGFnZSBjaHVtYnlvbmUgQ2h1bWJ5IEluZHVzdHJpZSdzIEZhbGNvbndpbmcKClRoaXMgZGV2aWNlIGlzIGFsc28ga25vd24gYXMgImNodW1ieSBvbmUiIChodHRwOi8vd3d3LmNodW1ieS5jb20vKQoKVGhpcyBDUFUgY2FyZCBpcyBiYXNlZCBvbiBhIEZyZWVzY2FsZSBpLk1YMjMgQ1BVLiBUaGUgY2FyZCBpcyBzaGlwcGVkIHdpdGg6CgotIDY0IE1pQiBzeW5jaHJvbm91cyBkeW5hbWljIFJBTSAoRERSIHR5cGUpCgpNZW1vcnkgbGF5b3V0IHdoZW4gQGIgYmFyZWJveCBpcyBydW5uaW5nOgoKLSAweDQwMDAwMDAwIHN0YXJ0IG9mIFNEUkFNCi0gMHg0MDAwMDEwMCBzdGFydCBvZiBrZXJuZWwncyBib290IHBhcmFtZXRlcnMKICAtIGJlbG93IG1hbGxvYyBhcmVhOiBzdGFjayBhcmVhCiAgLSBiZWxvdyBiYXJlYm94OiBtYWxsb2MgYXJlYQotIDB4NDIwMDAwMDAgc3RhcnQgb2YgQGIgYmFyZWJveAoKQHNlY3Rpb24gZ2V0X2ZhbGNvbndpbmdfYmluYXJ5IEhvdyB0byBnZXQgdGhlIGJvb3Rsb2FkZXIgYmluYXJ5IGltYWdlOgoKVXNpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbjoKCkB2ZXJiYXRpbQptYWtlIEFSQ0g9YXJtIGNodW1ieW9uZV9kZWZjb25maWcKQGVuZHZlcmJhdGltCgpCdWlsZCB0aGUgYm9vdGxvYWRlciBiaW5hcnkgaW1hZ2U6CgpAdmVyYmF0aW0KbWFrZSBBUkNIPWFybSBDUk9TU19DT01QSUxFPWFybXY1Y29tcGlsZXIKQGVuZHZlcmJhdGltCgpAbm90ZSByZXBsYWNlIHRoZSBhcm12NWNvbXBpbGVyIHdpdGggeW91ciBBUk0gdjUgY3Jvc3MgY29tcGlsZXIuCgpAc2VjdGlvbiBzZXR1cF9mYWxjb253aW5nIEhvdyB0byBwcmVwYXJlIGFuIE1DSSBjYXJkIHRvIGJvb3QgdGhlICJjaHVtYnkgb25lIiB3aXRoIGJhcmVib3gKCi0gQ3JlYXRlIGZvdXIgcHJpbWFyeSBwYXJ0aXRpb25zIG9uIHRoZSBNQ0kgY2FyZAogLSB0aGUgZmlyc3Qgb25lIGZvciB0aGUgYm9vdGxldHMgKGFib3V0IDI1NiBraUIpCiAtIHRoZSBzZWNvbmQgb25lIGZvciB0aGUgcGVyc2lzdGFudCBlbnZpcm9ubWVudCAoc2l6ZSBpcyB1cCB0byB5b3UsIGF0IGxlYXN0IDI1NmspCiAtIHRoZSB0aGlyZCBvbmUgZm9yIHRoZSBrZXJuZWwgKDIgTWlCIC4uLiA0IE1pQiBpbiBzaXplKQogLSB0aGUgNHRoIG9uZSBmb3IgdGhlIHJvb3QgZmlsZXN5c3RlbSB3aGljaCBjYW4gZmlsbCB0aGUgcmVzdCBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlCgotIE1hcmsgdGhlIGZpcnN0IHBhcnRpdGlvbiB3aXRoIHRoZSBwYXJ0aXRpb24gSUQgIjUzIiBhbmQgY29weSB0aGUgYm9vdGxldHMKICBpbnRvIHRoaXMgcGFydGl0aW9uIChjdXJyZW50bHkgbm90IHBhcnQgb2YgQGIgYmFyZWJveCEpLgoKLSBDb3B5IHRoZSBkZWZhdWx0IEBiIGJhcmVib3ggZW52aXJvbm1lbnQgaW50byB0aGUgc2Vjb25kIHBhcnRpdGlvbiAobm8gZmlsZXN5c3RlbSByZXF1aXJlZCkuCgotIENvcHkgdGhlIGtlcm5lbCBpbnRvIHRoZSB0aGlyZCBwYXJ0aXRpb24gKG5vIGZpbGVzeXN0ZW0gcmVxdWlyZWQpLgoKLSBDcmVhdGUgdGhlIHJvb3QgZmlsZXN5c3RlbSBpbiB0aGUgNHRoIHBhcnRpdGlvbi4gWW91IG1heSBjb3B5IGFuIGltYWdlIGludG8gdGhpcwogIHBhcnRpdGlvbiBvciB5b3UgY2FuIGRvIGl0IGluIHRoZSBjbGFzc2ljIHdheTogbWtmcyBvbiBpdCwgbW91bnQgaXQgYW5kIGNvcHkKICBhbGwgcmVxdWlyZWQgZGF0YSBhbmQgcHJvZ3JhbXMgaW50byBpdC4KCkBzZWN0aW9uIGdwaW9fZmFsY29ud2luZyBBdmFpbGFibGUgR1BJT3MKClRoZSBGYWxjb253aW5nIHVzZXMgc29tZSBHUElPcyB0byBjb250cm9sIHZhcmlvdXMgZmVhdHVyZXMuIFdpdGggdGhlIHJlZ3VsYXIKR1BJTyBjb21tYW5kcyB0aGVzZSBmZWF0dXJlcyBjYW4gYmUgY29udHJvbGxlZCBhdCBAYSBiYXJlYm94J3MgcnVudGltZS4KCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjMiPgoJPHRyPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkRpcmVjdGlvbjwvdGQ+CgkJPHRkPkZ1bmN0aW9uPC90ZD4KCQk8dGQ+UmVzZXQ8L3RkPgoJCTx0ZD5TZXQ8L3RkPgoJPC90cj4KCTx0cj4KCQk8dGQ+ODwvdGQ+CgkJPHRkPk91dHB1dDwvdGQ+CgkJPHRkPlN3aXRjaCBBdWRpbyBBbXBsaWZpZXI8L3RkPgoJCTx0ZD5PZmY8L3RkPgoJCTx0ZD5PbjwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZD4xMTwvdGQ+CgkJPHRkPklucHV0PC90ZD4KCQk8dGQ+SGVhZCBQaG9uZSBEZXRlY3Rpb248L3RkPgoJCTx0ZD5UQkQ8L3RkPgoJCTx0ZD5UQkQ8L3RkPgoJPC90cj4KCTx0cj4KCQk8dGQ+MTQ8L3RkPgoJCTx0ZD5JbnB1dDwvdGQ+CgkJPHRkPlVudXNlZCAoSjExMyk8L3RkPgoJCTx0ZD5Vc2VyPC90ZD4KCQk8dGQ+VXNlcjwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZD4xNTwvdGQ+CgkJPHRkPklucHV0PC90ZD4KCQk8dGQ+VW51c2VkIChKMTE0KTwvdGQ+CgkJPHRkPlVzZXI8L3RkPgoJCTx0ZD5Vc2VyPC90ZD4KCTwvdHI+Cgk8dHI+CgkJPHRkPjI2PC90ZD4KCQk8dGQ+T3V0cHV0PC90ZD4KCQk8dGQ+VVNCIFBvd2VyPC90ZD4KCQk8dGQ+VEJEPC90ZD4KCQk8dGQ+VEJEPC90ZD4KCTwvdHI+Cgk8dHI+CgkJPHRkPjI3PC90ZD4KCQk8dGQ+SW5wdXQ8L3RkPgoJCTx0ZD5EaXNwbGF5IENvbm5lY3RlZDwvdGQ+CgkJPHRkPkRpc3BsYXk8YnI+QXR0YWNoZWQ8L3RkPgoJCTx0ZD5EaXNwbGF5PGJyPkRpc2Nvbm5lY3RlZDwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZD4yOTwvdGQ+CgkJPHRkPk91dHB1dDwvdGQ+CgkJPHRkPlVTQiBIVUIgUmVzZXQ8L3RkPgoJCTx0ZD5UQkQ8L3RkPgoJCTx0ZD5UQkQ8L3RkPgoJPC90cj4KCTx0cj4KCQk8dGQ+NTA8L3RkPgoJCTx0ZD5PdXRwdXQ8L3RkPgoJCTx0ZD5EaXNwbGF5IFJlc2V0PC90ZD4KCQk8dGQ+RGlzcGxheTxicj5SZXNldDwvdGQ+CgkJPHRkPkRpc3BsYXk8YnI+UnVubmluZzwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZD42MDwvdGQ+CgkJPHRkPk91dHB1dDwvdGQ+CgkJPHRkPkRpc3BsYXkgQmFja2xpZ2h0PC90ZD4KCQk8dGQ+QmFja2xpZ2h0PGJyPk9mZjwvdGQ+CgkJPHRkPkJhY2tsaWdodDxicj5PbiAoMTAwICUpPC90ZD4KCTwvdHI+Cgk8dHI+CgkJPHRkPjYyPC90ZD4KCQk8dGQ+SW5wdXQ8L3RkPgoJCTx0ZD5CZW5kPC90ZD4KCQk8dGQ+Tm90IHByZXNzZWQ8L3RkPgoJCTx0ZD5QcmVzc2VkPC90ZD4KCTwvdHI+CjwvdGFibGU+CgoqLwo=