ZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsNzEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK2V4dHJhLXkgOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCisKK29iai15CTo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gdm04Ni5vIFwKKwkJcHRyYWNlLm8gdGltZS5vIGlvcG9ydC5vIGxkdC5vIHNldHVwLm8gaTgyNTkubyBzeXNfaTM4Ni5vIFwKKwkJcGNpLWRtYS5vIGkzODZfa3N5bXMubyBpMzg3Lm8gZG1pX3NjYW4ubyBib290ZmxhZy5vIFwKKwkJZG91YmxlZmF1bHQubyBxdWlya3MubworCitvYmoteQkJCQkrPSBjcHUvCitvYmoteQkJCQkrPSB0aW1lcnMvCitvYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gYWNwaS8KK29iai0kKENPTkZJR19YODZfQklPU19SRUJPT1QpCSs9IHJlYm9vdC5vCitvYmotJChDT05GSUdfTUNBKQkJKz0gbWNhLm8KK29iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KK29iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCitvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KK29iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubworb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8KK29iai0kKENPTkZJR19YODZfVFJBTVBPTElORSkJKz0gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfWDg2X01QUEFSU0UpCSs9IG1wcGFyc2Uubworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gbm1pLm8KK29iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vCitvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXEubworb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVRfTlVNQSkJKz0gc3VtbWl0Lm8KK29iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCitvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCitvYmoteQkJCQkrPSBzeXNlbnRlci5vIHZzeXNjYWxsLm8KK29iai0kKENPTkZJR19BQ1BJX1NSQVQpIAkrPSBzcmF0Lm8KK29iai0kKENPTkZJR19IUEVUX1RJTUVSKSAJKz0gdGltZV9ocGV0Lm8KK29iai0kKENPTkZJR19FRkkpIAkJKz0gZWZpLm8gZWZpX3N0dWIubworb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KKworRVhUUkFfQUZMQUdTICAgOj0gLXRyYWRpdGlvbmFsCisKK29iai0kKENPTkZJR19TQ3gyMDApCQkrPSBzY3gyMDAubworCisjIHZzeXNjYWxsLm8gY29udGFpbnMgdGhlIHZzeXNjYWxsIERTTyBpbWFnZXMgYXMgX19pbml0ZGF0YS4KKyMgV2UgbXVzdCBidWlsZCBib3RoIGltYWdlcyBiZWZvcmUgd2UgY2FuIGFzc2VtYmxlIGl0LgorIyBOb3RlOiBrYnVpbGQgZG9lcyBub3QgdHJhY2sgdGhpcyBkZXBlbmRlbmN5IGR1ZSB0byB1c2FnZSBvZiAuaW5jYmluCiskKG9iaikvdnN5c2NhbGwubzogJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbwordGFyZ2V0cyArPSAkKGZvcmVhY2ggRixpbnQ4MCBzeXNlbnRlcix2c3lzY2FsbC0kRi5vIHZzeXNjYWxsLSRGLnNvKQordGFyZ2V0cyArPSB2c3lzY2FsbC5sZHMKKworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCitxdWlldF9jbWRfc3lzY2FsbCA9IFNZU0NBTEwgJEAKKyAgICAgIGNtZF9zeXNjYWxsID0gJChDQykgLW0gZWxmX2kzODYgLW5vc3RkbGliICQoU1lTQ0ZMQUdTXyQoQEYpKSBcCisJCSAgICAgICAgICAtV2wsLVQsJChmaWx0ZXItb3V0IEZPUkNFLCReKSAtbyAkQAorCitleHBvcnQgQ1BQRkxBR1NfdnN5c2NhbGwubGRzICs9IC1QIC1DIC1VJChBUkNIKQorCit2c3lzY2FsbC1mbGFncyA9IC1zaGFyZWQgLXMgLVdsLC1zb25hbWU9bGludXgtZ2F0ZS5zby4xCitTWVNDRkxBR1NfdnN5c2NhbGwtc3lzZW50ZXIuc28JPSAkKHZzeXNjYWxsLWZsYWdzKQorU1lTQ0ZMQUdTX3ZzeXNjYWxsLWludDgwLnNvCT0gJCh2c3lzY2FsbC1mbGFncykKKworJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbzogXAorJChvYmopL3ZzeXNjYWxsLSUuc286ICQoc3JjKS92c3lzY2FsbC5sZHMgJChvYmopL3ZzeXNjYWxsLSUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbGwpCisKKyMgV2UgYWxzbyBjcmVhdGUgYSBzcGVjaWFsIHJlbG9jYXRhYmxlIG9iamVjdCB0aGF0IHNob3VsZCBtaXJyb3IgdGhlIHN5bWJvbAorIyB0YWJsZSBhbmQgbGF5b3V0IG9mIHRoZSBsaW5rZWQgRFNPLiAgV2l0aCBsZCAtUiB3ZSBjYW4gdGhlbiByZWZlciB0bworIyB0aGVzZSBzeW1ib2xzIGluIHRoZSBrZXJuZWwgY29kZSByYXRoZXIgdGhhbiBoYW5kLWNvZGVkIGFkZHJlc3Nlcy4KK2V4dHJhLXkgKz0gdnN5c2NhbGwtc3ltcy5vCiskKG9iaikvYnVpbHQtaW4ubzogJChvYmopL3ZzeXNjYWxsLXN5bXMubworJChvYmopL2J1aWx0LWluLm86IGxkX2ZsYWdzICs9IC1SICQob2JqKS92c3lzY2FsbC1zeW1zLm8KKworU1lTQ0ZMQUdTX3ZzeXNjYWxsLXN5bXMubyA9IC1yCiskKG9iaikvdnN5c2NhbGwtc3ltcy5vOiAkKHNyYykvdnN5c2NhbGwubGRzICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCTo9IGJvb3Qubworb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBlYXJseXF1aXJrLm8KK29iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBzbGVlcC5vIHdha2V1cC5vCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogIGJvb3QuYyAtIEFyY2hpdGVjdHVyZS1TcGVjaWZpYyBMb3ctTGV2ZWwgQUNQSSBCb290IFN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEp1biBOYWthamltYSA8anVuLm5ha2FqaW1hQGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorCisjaWZkZWYJQ09ORklHX1g4Nl82NAorCitzdGF0aWMgaW5saW5lIHZvaWQgIGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpIHsgfQorZXh0ZXJuIHZvaWQgX19pbml0IGNsdXN0ZXJlZF9hcGljX2NoZWNrKHZvaWQpOworc3RhdGljIGlubGluZSBpbnQgaW9hcGljX3NldHVwX2Rpc2FibGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKworI2Vsc2UJLyogWDg2ICovCisKKyNpZmRlZglDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX21wcGFyc2UuaD4KKyNlbmRpZgkvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKworI2VuZGlmCS8qIFg4NiAqLworCisjZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICgJCQkJCSAgICBcCisJCSghZW50cnkpIHx8ICh1bnNpZ25lZCBsb25nKWVudHJ5ICsgc2l6ZW9mKCplbnRyeSkgPiBlbmQgfHwgIFwKKwkJKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoICE9IHNpemVvZigqZW50cnkpKQorCisjZGVmaW5lIFBSRUZJWAkJCSJBQ1BJOiAiCisKKyNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBJUlEgaW5pdGlhbGl6YXRpb24gKi8KK2ludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhOyAvKiBza2lwIEFDUEkgUENJIHNjYW4gYW5kIElSUSBpbml0aWFsaXphdGlvbiAqLworI2Vsc2UKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGEgPSAxOworaW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAxOworI2VuZGlmCitpbnQgYWNwaV9odCBfX2luaXRkYXRhID0gMTsJLyogZW5hYmxlIEhUICovCisKK2ludCBhY3BpX2xhcGljOworaW50IGFjcGlfaW9hcGljOworaW50IGFjcGlfc3RyaWN0OworRVhQT1JUX1NZTUJPTChhY3BpX3N0cmljdCk7CisKK2FjcGlfaW50ZXJydXB0X2ZsYWdzIGFjcGlfc2NpX2ZsYWdzIF9faW5pdGRhdGE7CitpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpIF9faW5pdGRhdGE7CitpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyB1NjQgYWNwaV9sYXBpY19hZGRyIF9faW5pdGRhdGEgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfQ01QWENIRworI3dhcm5pbmcgQUNQSSB1c2VzIENNUFhDSEcsIGk0ODYgYW5kIGxhdGVyIGhhcmR3YXJlCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUFEVF9FTlRSSUVTCTI1NgordTggeDg2X2FjcGlpZF90b19hcGljaWRbTUFYX01BRFRfRU5UUklFU10gPQorCQkJeyBbMCAuLi4gTUFYX01BRFRfRU5UUklFUy0xXSA9IDB4ZmYgfTsKK0VYUE9SVF9TWU1CT0woeDg2X2FjcGlpZF90b19hcGljaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdC10aW1lIENvbmZpZ3VyYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgZGVmYXVsdCBpbnRlcnJ1cHQgcm91dGluZyBtb2RlbCBpcyBQSUMgKDgyNTkpLiAgVGhpcyBnZXRzCisgKiBvdmVycmlkZW4gaWYgSU9BUElDcyBhcmUgZW51bWVyYXRlZCAoYmVsb3cpLgorICovCitlbnVtIGFjcGlfaXJxX21vZGVsX2lkCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX1BJQzsKKworI2lmZGVmCUNPTkZJR19YODZfNjQKKworLyogcmVseSBvbiBhbGwgQUNQSSB0YWJsZXMgYmVpbmcgaW4gdGhlIGRpcmVjdCBtYXBwaW5nICovCitjaGFyICpfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJcmV0dXJuIE5VTEw7CisKKwlpZiAocGh5c19hZGRyIDwgKGVuZF9wZm5fbWFwIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gX192YShwaHlzX2FkZHIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlCisKKy8qCisgKiBUZW1wb3JhcmlseSB1c2UgdGhlIHZpcnR1YWwgYXJlYSBzdGFydGluZyBmcm9tIEZJWF9JT19BUElDX0JBU0VfRU5ELAorICogdG8gbWFwIHRoZSB0YXJnZXQgcGh5c2ljYWwgYWRkcmVzcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBzZXRfZml4bWFwKCkKKyAqIHByb3ZpZGVzIGEgc2luZ2xlIHBhZ2UsIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYWdlIGlzIG5vdAorICogc3VmZmljaWVudC4KKyAqIEJ5IHVzaW5nIHRoaXMgYXJlYSwgd2UgY2FuIG1hcCB1cCB0byBNQVhfSU9fQVBJQ1MgcGFnZXMgdGVtcG9yYXJpbHksCisgKiBpLmUuIHVudGlsIHRoZSBuZXh0IF9fdmFfcmFuZ2UoKSBjYWxsLgorICoKKyAqIEltcG9ydGFudCBTYWZldHkgTm90ZTogIFRoZSBmaXhlZCBJL08gQVBJQyBwYWdlIG51bWJlcnMgYXJlICpzdWJ0cmFjdGVkKgorICogZnJvbSB0aGUgZml4ZWQgYmFzZS4gIFRoYXQncyB3aHkgd2Ugc3RhcnQgYXQgRklYX0lPX0FQSUNfQkFTRV9FTkQgYW5kCisgKiBjb3VudCBpZHggZG93biB3aGlsZSBpbmNyZW1lbnRpbmcgdGhlIHBoeXMgYWRkcmVzcy4KKyAqLworY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UsIG9mZnNldCwgbWFwcGVkX3NpemU7CisJaW50IGlkeDsKKworCWlmIChwaHlzICsgc2l6ZSA8IDgqMTAyNCoxMDI0KSAKKwkJcmV0dXJuIF9fdmEocGh5cyk7IAorCisJb2Zmc2V0ID0gcGh5cyAmIChQQUdFX1NJWkUgLSAxKTsKKwltYXBwZWRfc2l6ZSA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwlzZXRfZml4bWFwKEZJWF9BQ1BJX0VORCwgcGh5cyk7CisJYmFzZSA9IGZpeF90b192aXJ0KEZJWF9BQ1BJX0VORCk7CisKKwkvKgorCSAqIE1vc3QgY2FzZXMgY2FuIGJlIGNvdmVyZWQgYnkgdGhlIGJlbG93LgorCSAqLworCWlkeCA9IEZJWF9BQ1BJX0VORDsKKwl3aGlsZSAobWFwcGVkX3NpemUgPCBzaXplKSB7CisJCWlmICgtLWlkeCA8IEZJWF9BQ1BJX0JFR0lOKQorCQkJcmV0dXJuIE5VTEw7CS8qIGNhbm5vdCBoYW5kbGUgdGhpcyAqLworCQlwaHlzICs9IFBBR0VfU0laRTsKKwkJc2V0X2ZpeG1hcChpZHgsIHBoeXMpOworCQltYXBwZWRfc2l6ZSArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuICgodW5zaWduZWQgY2hhciAqKSBiYXNlICsgb2Zmc2V0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRworc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqbWNmZzsKKworCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jZmcgPSAoc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFtY2ZnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1DRkdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobWNmZy0+YmFzZV9yZXNlcnZlZCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfbW1jZmdfYmFzZV9hZGRyID0gbWNmZy0+YmFzZV9hZGRyZXNzOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZQlhY3BpX3BhcnNlX21jZmcgTlVMTAorI2VuZGlmIC8qICFDT05GSUdfUENJX01NQ09ORklHICovCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHQgKAorCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkciwKKwl1bnNpZ25lZCBsb25nCQlzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX21hZHQJKm1hZHQgPSBOVUxMOworCisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKKwlpZiAoIW1hZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgTUFEVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWR0LT5sYXBpY19hZGRyZXNzKSB7CisJCWFjcGlfbGFwaWNfYWRkciA9ICh1NjQpIG1hZHQtPmxhcGljX2FkZHJlc3M7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJMb2NhbCBBUElDIGFkZHJlc3MgMHglMDh4XG4iLAorCQkJbWFkdC0+bGFwaWNfYWRkcmVzcyk7CisJfQorCisJYWNwaV9tYWR0X29lbV9jaGVjayhtYWR0LT5oZWFkZXIub2VtX2lkLCBtYWR0LT5oZWFkZXIub2VtX3RhYmxlX2lkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbGFwaWMJKnByb2Nlc3NvciA9IE5VTEw7CisKKwlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkocHJvY2Vzc29yLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJLyogbm8gdXRpbGl0eSBpbiByZWdpc3RlcmluZyBhIGRpc2FibGVkIHByb2Nlc3NvciAqLworCWlmIChwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl4ODZfYWNwaWlkX3RvX2FwaWNpZFtwcm9jZXNzb3ItPmFjcGlfaWRdID0gcHJvY2Vzc29yLT5pZDsKKworCW1wX3JlZ2lzdGVyX2xhcGljICgKKwkJcHJvY2Vzc29yLT5pZCwJCQkJCSAgIC8qIEFQSUMgSUQgKi8KKwkJcHJvY2Vzc29yLT5mbGFncy5lbmFibGVkKTsJCQkgIC8qIEVuYWJsZWQ/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpY19hZGRyX292ciA9IE5VTEw7CisKKwlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19hZGRyX292ciwgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX2xhcGljX2FkZHIgPSBsYXBpY19hZGRyX292ci0+YWRkcmVzczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpY19ubWkgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqbGFwaWNfbm1pID0gTlVMTDsKKworCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfbm1pLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJaWYgKGxhcGljX25taS0+bGludCAhPSAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiTk1JIG5vdCBjb25uZWN0ZWQgdG8gTElOVCAxIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYgLypDT05GSUdfWDg2X0xPQ0FMX0FQSUMqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX2lvYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICppb2FwaWMgPSBOVUxMOworCisJaW9hcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShpb2FwaWMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworIAorCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJbXBfcmVnaXN0ZXJfaW9hcGljICgKKwkJaW9hcGljLT5pZCwKKwkJaW9hcGljLT5hZGRyZXNzLAorCQlpb2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7CisgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBJbnRlcnJ1cHQgU291cmNlIE92ZXJyaWRlIGZvciB0aGUgQUNQSSBTQ0kKKyAqLworc3RhdGljIHZvaWQKK2FjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQoreworCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KKwkJdHJpZ2dlciA9IDM7CisKKwlpZiAocG9sYXJpdHkgPT0gMCkJLyogY29tcGF0aWJsZSBTQ0kgcG9sYXJpdHkgaXMgbG93ICovCisJCXBvbGFyaXR5ID0gMzsKKworCS8qIENvbW1hbmQtbGluZSBvdmVyLXJpZGUgdmlhIGFjcGlfc2NpPSAqLworCWlmIChhY3BpX3NjaV9mbGFncy50cmlnZ2VyKQorCQl0cmlnZ2VyID0gYWNwaV9zY2lfZmxhZ3MudHJpZ2dlcjsKKworCWlmIChhY3BpX3NjaV9mbGFncy5wb2xhcml0eSkKKwkJcG9sYXJpdHkgPSBhY3BpX3NjaV9mbGFncy5wb2xhcml0eTsKKworCS8qCisgCSAqIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCkgYWxyZWFkeSBzZXR1cCBJUlFzIDwgMTYKKwkgKiBJZiBHU0kgaXMgPCAxNiwgdGhpcyB3aWxsIHVwZGF0ZSBpdHMgZmxhZ3MsCisJICogZWxzZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBtcF9pcnFzW10gZW50cnkuCisJICovCisJbXBfb3ZlcnJpZGVfbGVnYWN5X2lycShnc2ksIHBvbGFyaXR5LCB0cmlnZ2VyLCBnc2kpOworCisJLyoKKwkgKiBzdGFzaCBvdmVyLXJpZGUgdG8gaW5kaWNhdGUgd2UndmUgYmVlbiBoZXJlCisJICogYW5kIGZvciBsYXRlciB1cGRhdGUgb2YgYWNwaV9mYWR0CisJICovCisJYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpID0gZ3NpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICppbnRzcmMgPSBOVUxMOworCisJaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKGludHNyYywgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKKworCWlmIChpbnRzcmMtPmJ1c19pcnEgPT0gYWNwaV9mYWR0LnNjaV9pbnQpIHsKKwkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGludHNyYy0+Z2xvYmFsX2lycSwKKwkJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgJiYKKwkJaW50c3JjLT5idXNfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKKwkJCXByaW50ayhQUkVGSVggIkJJT1MgSVJRMCBwaW4yIG92ZXJyaWRlIGlnbm9yZWQuXG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCW1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKAorCQlpbnRzcmMtPmJ1c19pcnEsCisJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksCisJCWludHNyYy0+ZmxhZ3MudHJpZ2dlciwKKwkJaW50c3JjLT5nbG9iYWxfaXJxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX25taV9zcmMgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKm5taV9zcmMgPSBOVUxMOworCisJbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKG5taV9zcmMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CisKKwkvKiBUQkQ6IFN1cHBvcnQgbmltc3JjIGVudHJpZXM/ICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLworCisjaWZkZWYJQ09ORklHX0FDUElfQlVTCisKKy8qCisgKiBhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoKQorICogCisgKiB1c2UgRUxDUiB0byBzZXQgUElDLW1vZGUgdHJpZ2dlciB0eXBlIGZvciBTQ0kKKyAqCisgKiBJZiBhIFBJQy1tb2RlIFNDSSBpcyBub3QgcmVjb2duaXplZCBvciBnaXZlcyBzcHVyaW91cyBJUlE3J3MKKyAqIGl0IG1heSByZXF1aXJlIEVkZ2UgVHJpZ2dlciAtLSB1c2UgImFjcGlfc2NpPWVkZ2UiCisgKgorICogUG9ydCAweDRkMC00ZDEgYXJlIEVDTFIxIGFuZCBFQ0xSMiwgdGhlIEVkZ2UvTGV2ZWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqIGZvciB0aGUgODI1OSBQSUMuICBiaXRbbl0gPSAxIG1lYW5zIGlycVtuXSBpcyBMZXZlbCwgb3RoZXJ3aXNlIEVkZ2UuCisgKiBFQ0xSMSBpcyBJUlEncyAwLTcgKElSUSAwLCAxLCAyIG11c3QgYmUgMCkKKyAqIEVDTFIyIGlzIElSUSdzIDgtMTUgKElSUSA4LCAxMyBtdXN0IGJlIDApCisgKi8KKwordm9pZCBfX2luaXQKK2FjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKworCS8qIFJlYWwgb2xkIEVMQ1IgbWFzayAqLworCW9sZCA9IGluYigweDRkMCkgfCAoaW5iKDB4NGQxKSA8PCA4KTsKKworCS8qCisJICogSWYgd2UgdXNlIEFDUEkgdG8gc2V0IFBDSSBpcnEncywgdGhlbiB3ZSBzaG91bGQgY2xlYXIgRUxDUgorCSAqIHNpbmNlIHdlIHdpbGwgc2V0IGl0IGNvcnJlY3RseSBhcyB3ZSBlbmFibGUgdGhlIFBDSSBpcnEKKwkgKiByb3V0aW5nLgorCSAqLworCW5ldyA9IGFjcGlfbm9pcnEgPyBvbGQgOiAwOworCisJLyoKKwkgKiBVcGRhdGUgU0NJIGluZm9ybWF0aW9uIGluIHRoZSBFTENSLCBpdCBpc24ndCBpbiB0aGUgUENJCisJICogcm91dGluZyB0YWJsZXMuLgorCSAqLworCXN3aXRjaCAodHJpZ2dlcikgeworCWNhc2UgMToJLyogRWRnZSAtIGNsZWFyICovCisJCW5ldyAmPSB+bWFzazsKKwkJYnJlYWs7CisJY2FzZSAzOiAvKiBMZXZlbCAtIHNldCAqLworCQluZXcgfD0gbWFzazsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9sZCA9PSBuZXcpCisJCXJldHVybjsKKworCXByaW50ayhQUkVGSVggInNldHRpbmcgRUxDUiB0byAlMDR4IChmcm9tICUwNHgpXG4iLCBuZXcsIG9sZCk7CisJb3V0YihuZXcsIDB4NGQwKTsKKwlvdXRiKG5ldyA+PiA4LCAweDRkMSk7Cit9CisKKworI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JVUyAqLworCitpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQoreworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGdzaSkpCisgCQkqaXJxID0gSU9fQVBJQ19WRUNUT1IoZ3NpKTsKKwllbHNlCisjZW5kaWYKKwkJKmlycSA9IGdzaTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoreworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOworCisjaWZkZWYgQ09ORklHX1BDSQorCS8qCisJICogTWFrZSBzdXJlIGFsbCAobGVnYWN5KSBQQ0kgSVJRcyBhcmUgc2V0IGFzIGxldmVsLXRyaWdnZXJlZC4KKwkgKi8KKwlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKSB7CisJCWV4dGVybiB2b2lkIGVpc2Ffc2V0X2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworCQlpZiAoZWRnZV9sZXZlbCA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKKwkJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9JT0FQSUMpIHsKKwkJcGxhdF9nc2kgPSBtcF9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCX0KKyNlbmRpZgorCWFjcGlfZ3NpX3RvX2lycShwbGF0X2dzaSwgJmlycSk7CisJcmV0dXJuIGlycTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9nc2kpOworCisvKgorICogIEFDUEkgYmFzZWQgaG90cGx1ZyBzdXBwb3J0IGZvciBDUFUKKyAqLworI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCitpbnQKK2FjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKK3sKKwkvKiBUQkQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9tYXBfbHNhcGljKTsKKworCitpbnQKK2FjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCit7CisJLyogVEJEICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKK2FjcGlfc2Nhbl9yc2RwICgKKwl1bnNpZ25lZCBsb25nCQlzdGFydCwKKwl1bnNpZ25lZCBsb25nCQlsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nCQlzaWdfbGVuID0gc2l6ZW9mKCJSU0QgUFRSICIpIC0gMTsKKworCS8qCisJICogU2NhbiBhbGwgMTYtYnl0ZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uIGZvciB0aGUKKwkgKiBSU0RQIHNpZ25hdHVyZS4KKwkgKi8KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IDE2KSB7CisJCWlmIChzdHJuY21wKChjaGFyICopIChzdGFydCArIG9mZnNldCksICJSU0QgUFRSICIsIHNpZ19sZW4pKQorCQkJY29udGludWU7CisJCXJldHVybiAoc3RhcnQgKyBvZmZzZXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NiZih1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqc2I7CisKKwlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlyZXR1cm4gLUVJTlZBTDsKKworCXNiID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFzYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBTQkZcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzYmZfcG9ydCA9IHNiLT5zYmZfY21vczsgLyogU2F2ZSBDTU9TIHBvcnQgKi8KKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2hwZXQodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaHBldCAqaHBldF90Ymw7CisKKwlpZiAoIXBoeXMgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaHBldF90YmwgPSAoc3RydWN0IGFjcGlfdGFibGVfaHBldCAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOworCWlmICghaHBldF90YmwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgSFBFVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChocGV0X3RibC0+YWRkci5zcGFjZV9pZCAhPSBBQ1BJX1NQQUNFX01FTSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiSFBFVCB0aW1lcnMgbXVzdCBiZSBsb2NhdGVkIGluICIKKwkJICAgICAgICJtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmCUNPTkZJR19YODZfNjQKKyAgICAgICAgdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIGhwZXRfdGJsLT5hZGRyLmFkZHJoIDw8IDMyKTsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCisgICAgICAgICAgICAgICBocGV0X3RibC0+aWQsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOworI2Vsc2UJLyogWDg2ICovCisJeworCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CisKKwkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmw7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKKwkJCWhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKKwl9CisjZW5kaWYJLyogWDg2ICovCisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lCWFjcGlfcGFyc2VfaHBldAlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQgPSBOVUxMOworCisJZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsc2l6ZSk7CisJaWYoIWZhZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgRkFEVFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmCUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJLyogaW5pdGlhbGl6ZSBzY2lfaW50IGVhcmx5IGZvciBJTlRfU1JDX09WUiBNQURUIHBhcnNpbmcgKi8KKwlhY3BpX2ZhZHQuc2NpX2ludCA9IGZhZHQtPnNjaV9pbnQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkvKiBkZXRlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBBQ1BJIFBNIFRpbWVyICovCisJaWYgKGZhZHQtPnJldmlzaW9uID49IEZBRFQyX1JFVklTSU9OX0lEKSB7CisJCS8qIEZBRFQgcmV2LiAyICovCisJCWlmIChmYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzX3NwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKKwkJCXJldHVybiAwOworCisJCXBtdG1yX2lvcG9ydCA9IGZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3M7CisJfSBlbHNlIHsKKwkJLyogRkFEVCByZXYuIDEgKi8KKwkJcG10bXJfaW9wb3J0ID0gZmFkdC0+VjFfcG1fdG1yX2JsazsKKwl9CisJaWYgKHBtdG1yX2lvcG9ydCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBNLVRpbWVyIElPIFBvcnQ6ICUjeFxuIiwgcG10bXJfaW9wb3J0KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGxvbmcgX19pbml0CithY3BpX2ZpbmRfcnNkcCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCQlyc2RwX3BoeXMgPSAwOworCisJaWYgKGVmaV9lbmFibGVkKSB7CisJCWlmIChlZmkuYWNwaTIwKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkyMCk7CisJCWVsc2UgaWYgKGVmaS5hY3BpKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkpOworCX0KKwkvKgorCSAqIFNjYW4gbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBSU0RQIHNpZ25hdHVyZS4gRmlyc3Qgc2VhcmNoIEVCREEgKGxvdworCSAqIG1lbW9yeSkgcGFyYWdyYXBocyBhbmQgdGhlbiBzZWFyY2ggdXBwZXIgbWVtb3J5IChFMDAwMC1GRkZGRikuCisJICovCisJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDAsIDB4NDAwKTsKKwlpZiAoIXJzZHBfcGh5cykKKwkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDB4RTAwMDAsIDB4RkZGRkYpOworCisJcmV0dXJuIHJzZHBfcGh5czsKK30KKworI2lmZGVmCUNPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqIFBhcnNlIExBUElDIGVudHJpZXMgaW4gTUFEVAorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9tYWR0X2xhcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKiAKKwkgKiBOb3RlIHRoYXQgdGhlIExBUElDIGFkZHJlc3MgaXMgb2J0YWluZWQgZnJvbSB0aGUgTUFEVCAoMzItYml0IHZhbHVlKQorCSAqIGFuZCAob3B0aW9uYWxseSkgb3ZlcnJpZGVuIGJ5IGEgTEFQSUNfQUREUl9PVlIgZW50cnkgKDY0LWJpdCB2YWx1ZSkuCisJICovCisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApOworCWlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCW1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MoYWNwaV9sYXBpY19hZGRyKTsKKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQywgYWNwaV9wYXJzZV9sYXBpYywKKwkJCQkgICAgICAgTUFYX0FQSUNTKTsKKwlpZiAoIWNvdW50KSB7IAorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBMQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwllbHNlIGlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBlbnRyeVxuIik7CisJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KKwkJcmV0dXJuIGNvdW50OworCX0KKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgTk1JIGVudHJ5XG4iKTsKKwkJLyogVEJEOiBDbGVhbnVwIHRvIGFsbG93IGZhbGxiYWNrIHRvIE1QUyAqLworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisvKgorICogUGFyc2UgSU9BUElDIHJlbGF0ZWQgZW50cmllcyBpbiBNQURUCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIEFDUEkgaW50ZXJwcmV0ZXIgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgaW50ZXJydXB0IHNldHVwLAorCSAqIHNvIGlmIGl0IGlzIG9mZiwgZG9uJ3QgZW51bWVyYXRlIHRoZSBpby1hcGljcyB3aXRoIEFDUEkuCisJICogSWYgTVBTIGlzIHByZXNlbnQsIGl0IHdpbGwgaGFuZGxlIHRoZW0sCisJICogb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gd2lsbCBzdGF5IGluIFBJQyBtb2RlCisJICovCisJaWYgKGFjcGlfZGlzYWJsZWQgfHwgYWNwaV9ub2lycSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfQorCisJLyoKKyAJICogaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24sIGRvbid0IGxvb2sgZm9yIElPLUFQSUNzCisJICovCisJaWYgKHNraXBfaW9hcGljX3NldHVwKSB7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJTa2lwcGluZyBJT0FQSUMgcHJvYmUgIgorCQkJImR1ZSB0byAnbm9hcGljJyBvcHRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lPQVBJQywgYWNwaV9wYXJzZV9pb2FwaWMsIE1BWF9JT19BUElDUyk7CisJaWYgKCFjb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBJT0FQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVsc2UgaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIElPQVBJQyBlbnRyeVxuIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU5UX1NSQ19PVlIsIGFjcGlfcGFyc2VfaW50X3NyY19vdnIsIE5SX0lSUV9WRUNUT1JTKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKgorCSAqIElmIEJJT1MgZGlkIG5vdCBzdXBwbHkgYW4gSU5UX1NSQ19PVlIgZm9yIHRoZSBTQ0kKKwkgKiBwcmV0ZW5kIHdlIGdvdCBvbmUgc28gd2UgY2FuIHNldCB0aGUgU0NJIGZsYWdzLgorCSAqLworCWlmICghYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpKQorCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9mYWR0LnNjaV9pbnQsIDAsIDApOworCisJLyogRmlsbCBpbiBpZGVudGl0eSBsZWdhY3kgbWFwaW5ncyB3aGVyZSBubyBvdmVycmlkZSAqLworCW1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCk7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCBOUl9JUlFfVkVDVE9SUyk7CisJaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIE5NSSBTUkMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYgLyogIShDT05GSUdfWDg2X0lPX0FQSUMgJiYgQ09ORklHX0FDUElfSU5URVJQUkVURVIpICovCisKKworc3RhdGljIHZvaWQgX19pbml0CithY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWludCBjb3VudCwgZXJyb3I7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9BUElDLCBhY3BpX3BhcnNlX21hZHQpOworCWlmIChjb3VudCA+PSAxKSB7CisKKwkJLyoKKwkJICogUGFyc2UgTUFEVCBMQVBJQyBlbnRyaWVzCisJCSAqLworCQllcnJvciA9IGFjcGlfcGFyc2VfbWFkdF9sYXBpY19lbnRyaWVzKCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWFjcGlfbGFwaWMgPSAxOworCisJCQkvKgorCQkJICogUGFyc2UgTUFEVCBJTy1BUElDIGVudHJpZXMKKwkJCSAqLworCQkJZXJyb3IgPSBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXMoKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX0lPQVBJQzsKKwkJCQlhY3BpX2lycV9iYWxhbmNlX3NldChOVUxMKTsKKwkJCQlhY3BpX2lvYXBpYyA9IDE7CisKKwkJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKKwkJCQljbHVzdGVyZWRfYXBpY19jaGVjaygpOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSAtRUlOVkFMKSB7CisJCQkvKgorCQkJICogRGVsbCBQcmVjaXNpb24gV29ya3N0YXRpb24gNDEwLCA2MTAgY29tZSBoZXJlLgorCQkJICovCisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIEJJT1MgTUFEVCwgZGlzYWJsaW5nIEFDUElcbiIpOworCQkJZGlzYWJsZV9hY3BpKCk7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhY3BpX2Jvb3RfdGFibGVfaW5pdCgpIGFuZCBhY3BpX2Jvb3RfaW5pdCgpCisgKiAgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCgpLCBhbHdheXMuCisgKgkxLiBjaGVja3N1bXMgYWxsIHRhYmxlcworICoJMi4gZW51bWVyYXRlcyBsYXBpY3MKKyAqCTMuIGVudW1lcmF0ZXMgaW8tYXBpY3MKKyAqCisgKiBhY3BpX3RhYmxlX2luaXQoKSBpcyBzZXBhcmF0ZSB0byBhbGxvdyByZWFkaW5nIFNSQVQgd2l0aG91dAorICogb3RoZXIgc2lkZSBlZmZlY3RzLgorICoKKyAqIHNpZGUgZWZmZWN0cyBvZiBhY3BpX2Jvb3RfaW5pdDoKKyAqCWFjcGlfbGFwaWMgPSAxIGlmIExBUElDIGZvdW5kCisgKglhY3BpX2lvYXBpYyA9IDEgaWYgSU9BUElDIGZvdW5kCisgKglpZiAoYWNwaV9sYXBpYyAmJiBhY3BpX2lvYXBpYykgc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisgKglpZiBhY3BpX2JsYWNrbGlzdGVkKCkgYWNwaV9kaXNhYmxlZCA9IDE7CisgKglhY3BpX2lycV9tb2RlbD0uLi4KKyAqCS4uLgorICoKKyAqIHJldHVybiB2YWx1ZTogKGN1cnJlbnRseSBpZ25vcmVkKQorICoJMDogc3VjY2VzcworICoJITA6IGZhaWx1cmUKKyAqLworCitpbnQgX19pbml0CithY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJLyogCisJICogSW5pdGlhbGl6ZSB0aGUgQUNQSSBib290LXRpbWUgdGFibGUgcGFyc2VyLgorCSAqLworCWVycm9yID0gYWNwaV90YWJsZV9pbml0KCk7CisJaWYgKGVycm9yKSB7CisJCWRpc2FibGVfYWNwaSgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisjaWZkZWYgX19pMzg2X18KKwljaGVja19hY3BpX3BjaSgpOworI2VuZGlmCisKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfQk9PVCwgYWNwaV9wYXJzZV9zYmYpOworCisJLyoKKwkgKiBibGFja2xpc3QgbWF5IGRpc2FibGUgQUNQSSBlbnRpcmVseQorCSAqLworCWVycm9yID0gYWNwaV9ibGFja2xpc3RlZCgpOworCWlmIChlcnJvcikgeworCQlleHRlcm4gaW50IGFjcGlfZm9yY2U7CisKKwkJaWYgKGFjcGlfZm9yY2UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpPWZvcmNlIG92ZXJyaWRlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJEaXNhYmxpbmcgQUNQSSBzdXBwb3J0XG4iKTsKKwkJCWRpc2FibGVfYWNwaSgpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQoreworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKKworCS8qCisJICogc2V0IHNjaV9pbnQgYW5kIFBNIHRpbWVyIGFkZHJlc3MKKwkgKi8KKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfRkFEVCwgYWNwaV9wYXJzZV9mYWR0KTsKKworCS8qCisJICogUHJvY2VzcyB0aGUgTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAoTUFEVCksIGlmIHByZXNlbnQKKwkgKi8KKwlhY3BpX3Byb2Nlc3NfbWFkdCgpOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIGFjcGlfcGFyc2VfaHBldCk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2YTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKQEAgLTAsMCArMSw1MSBAQAorLyogCisgKiBEbyBlYXJseSBQQ0kgcHJvYmluZyBmb3IgYnVnIGRldGVjdGlvbiB3aGVuIHRoZSBtYWluIFBDSSBzdWJzeXN0ZW0gaXMgCisgKiBub3QgdXAgeWV0LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKworc3RhdGljIGludCBfX2luaXQgY2hlY2tfYnJpZGdlKGludCB2ZW5kb3IsIGludCBkZXZpY2UpIAoreworCS8qIEFjY29yZGluZyB0byBOdmlkaWEgYWxsIHRpbWVyIG92ZXJyaWRlcyBhcmUgYm9ndXMuIEp1c3QgaWdub3JlCisJICAgdGhlbSBhbGwuICovCisJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeyAKKwkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsgCQkKKwl9CisJcmV0dXJuIDA7Cit9CisgICAKK3ZvaWQgX19pbml0IGNoZWNrX2FjcGlfcGNpKHZvaWQpIAoreyAKKwlpbnQgbnVtLHNsb3QsZnVuYzsgCisKKwkvKiBBc3N1bWUgdGhlIG1hY2hpbmUgc3VwcG9ydHMgdHlwZSAxLiBJZiBub3QgaXQgd2lsbCAKKwkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4gKi8KKworCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLworCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7IAorCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykgeyAKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsgCisJCQkJdTMyIGNsYXNzOworCQkJCXUzMiB2ZW5kb3I7CisJCQkJY2xhc3MgPSByZWFkX3BjaV9jb25maWcobnVtLHNsb3QsZnVuYywKKwkJCQkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04pOworCQkJCWlmIChjbGFzcyA9PSAweGZmZmZmZmZmKQorCQkJCQlicmVhazsgCisKKwkJCQlpZiAoKGNsYXNzID4+IDE2KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKwkJCQkJY29udGludWU7IAorCQkJCQorCQkJCXZlbmRvciA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsIAorCQkJCQkJCSBQQ0lfVkVORE9SX0lEKTsKKwkJCQkKKwkJCQlpZiAoY2hlY2tfYnJpZGdlKHZlbmRvciYweGZmZmYsIHZlbmRvciA+PiAxNikpCisJCQkJCXJldHVybjsgCisJCQl9IAorCQkJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogc2xlZXAuYyAtIHg4Ni1zcGVjaWZpYyBBQ1BJIHNsZWVwIHN1cHBvcnQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFBhdHJpY2sgTW9jaGVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyogYWRkcmVzcyBpbiBsb3cgbWVtb3J5IG9mIHRoZSB3YWtldXAgcm91dGluZS4gKi8KK3Vuc2lnbmVkIGxvbmcgYWNwaV93YWtldXBfYWRkcmVzcyA9IDA7Cit1bnNpZ25lZCBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7CitleHRlcm4gY2hhciB3YWtldXBfc3RhcnQsIHdha2V1cF9lbmQ7CisKK2V4dGVybiB2b2lkIHphcF9sb3dfbWFwcGluZ3Modm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIEZBU1RDQUxMKGFjcGlfY29weV93YWtldXBfcm91dGluZSh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfbG93X21hcHBpbmcocGdkX3QgKnBnZCwgaW50IHBnZF9saW1pdCkKK3sKKwlpbnQgcGdkX29mcyA9IDA7CisKKwl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7CisJCXNldF9wZ2QocGdkLCAqKHBnZCtVU0VSX1BUUlNfUEVSX1BHRCkpOworCQlwZ2Rfb2ZzKyssIHBnZCsrOworCX0KKwlmbHVzaF90bGJfYWxsKCk7Cit9CisKKy8qKgorICogYWNwaV9zYXZlX3N0YXRlX21lbSAtIHNhdmUga2VybmVsIHN0YXRlCisgKgorICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlIGFuZCBjb3B5IHRoZSB3YWtldXAgcm91dGluZSB0bworICogbG93IG1lbW9yeS4KKyAqLworaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlyZXR1cm4gMTsKKwlpbml0X2xvd19tYXBwaW5nKHN3YXBwZXJfcGdfZGlyLCBVU0VSX1BUUlNfUEVSX1BHRCk7CisJbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKGFjcGlfd2FrZXVwX2FkZHJlc3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhY3BpX3Jlc3RvcmVfc3RhdGUgLSB1bmRvIGVmZmVjdHMgb2YgYWNwaV9zYXZlX3N0YXRlX21lbQorICovCit2b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJemFwX2xvd19tYXBwaW5ncygpOworfQorCisvKioKKyAqIGFjcGlfcmVzZXJ2ZV9ib290bWVtIC0gZG8gX3ZlcnlfIGVhcmx5IEFDUEkgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBXZSBhbGxvY2F0ZSBhIHBhZ2UgZnJvbSB0aGUgZmlyc3QgMU1CIG9mIG1lbW9yeSBmb3IgdGhlIHdha2V1cAorICogcm91dGluZSBmb3Igd2hlbiB3ZSBjb21lIGJhY2sgZnJvbSBhIHNsZWVwIHN0YXRlLiBUaGUKKyAqIHJ1bnRpbWUgYWxsb2NhdG9yIGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIDwxNk1CIHBhZ2VzLCBidXQgbm90CisgKiA8MU1CIHBhZ2VzLgorICovCit2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfYm9vdG1lbSh2b2lkKQoreworCWlmICgoJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KSA+IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCBTMyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJYWNwaV93YWtldXBfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWFsbG9jX2Jvb3RtZW1fbG93KFBBR0VfU0laRSk7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IENhbm5vdCBhbGxvY2F0ZSBsb3dtZW0sIFMzIGRpc2FibGVkLlxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc2xlZXBfc2V0dXAoY2hhciAqc3RyKQoreworCXdoaWxlICgoc3RyICE9IE5VTEwpICYmICgqc3RyICE9ICdcMCcpKSB7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX2Jpb3MiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX21vZGUiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyB8PSAyOworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQlpZiAoc3RyICE9IE5VTEwpCisJCQlzdHIgKz0gc3Ryc3BuKHN0ciwgIiwgXHQiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworX19zZXR1cCgiYWNwaV9zbGVlcD0iLCBhY3BpX3NsZWVwX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCkBAIC0wLDAgKzEsMzE4IEBACisudGV4dAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyMKKyMgd2FrZXVwX2NvZGUgcnVucyBpbiByZWFsIG1vZGUsIGFuZCBhdCB1bmtub3duIGFkZHJlc3MgKGRldGVybWluZWQgYXQgcnVuLXRpbWUpLgorIyBUaGVyZWZvcmUgaXQgbXVzdCBvbmx5IHVzZSByZWxhdGl2ZSBqdW1wcy9jYWxscy4gCisjCisjIERvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIEEyMD8gSXQgaXMgb2theTogQUNQSSBzcGVjcyBzYXlzIEEyMCBtdXN0IGJlIGVuYWJsZWQKKyMKKyMgSWYgcGh5c2ljYWwgYWRkcmVzcyBvZiB3YWtldXBfY29kZSBpcyAweDEyMzQ1LCBCSU9TIHNob3VsZCBjYWxsIHVzIHdpdGgKKyMgY3MgPSAweDEyMzQsIGVpcCA9IDB4MDUKKyMgCisKK0FMSUdOCisJLmFsaWduCTQwOTYKK0VOVFJZKHdha2V1cF9zdGFydCkKK3dha2V1cF9jb2RlOgorCXdha2V1cF9jb2RlX3N0YXJ0ID0gLgorCS5jb2RlMTYKKworIAltb3Z3CSQweGI4MDAsICVheAorCW1vdncJJWF4LCVmcworCW1vdncJJDB4MGUwMCArICdMJywgJWZzOigweDEwKQorCisJY2xpCisJY2xkCisKKwkjIHNldHVwIGRhdGEgc2VnbWVudAorCW1vdncJJWNzLCAlYXgKKwltb3Z3CSVheCwgJWRzCQkJCQkjIE1ha2UgZHM6MCBwb2ludCB0byB3YWtldXBfc3RhcnQKKwltb3Z3CSVheCwgJXNzCisJbW92CSQod2FrZXVwX3N0YWNrIC0gd2FrZXVwX2NvZGUpLCAlc3AJCSMgUHJpdmF0ZSBzdGFjayBpcyBuZWVkZWQgZm9yIEFTVVMgYm9hcmQKKwltb3Z3CSQweDBlMDAgKyAnUycsICVmczooMHgxMikKKworCXB1c2hsCSQwCQkJCQkJIyBLaWxsIGFueSBkYW5nZXJvdXMgZmxhZ3MKKwlwb3BmbAorCisJbW92bAlyZWFsX21hZ2ljIC0gd2FrZXVwX2NvZGUsICVlYXgKKwljbXBsCSQweDEyMzQ1Njc4LCAlZWF4CisJam5lCWJvZ3VzX3JlYWxfbWFnaWMKKworCXRlc3RsCSQxLCB2aWRlb19mbGFncyAtIHdha2V1cF9jb2RlCisJanoJMWYKKwlsY2FsbCAgICQweGMwMDAsJDMKKwltb3Z3CSVjcywgJWF4CisJbW92dwklYXgsICVkcwkJCQkJIyBCaW9zIG1pZ2h0IGhhdmUgcGxheWVkIHdpdGggdGhhdAorCW1vdncJJWF4LCAlc3MKKzE6CisKKwl0ZXN0bAkkMiwgdmlkZW9fZmxhZ3MgLSB3YWtldXBfY29kZQorCWp6CTFmCisJbW92CXZpZGVvX21vZGUgLSB3YWtldXBfY29kZSwgJWF4CisJY2FsbAltb2RlX3NldAorMToKKworCSMgc2V0IHVwIHBhZ2UgdGFibGUKKwltb3ZsCSRzd2FwcGVyX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisKKwl0ZXN0bAkkMSwgcmVhbF9lZmVyX3NhdmVfcmVzdG9yZSAtIHdha2V1cF9jb2RlCisJanoJNGYKKwkjIHJlc3RvcmUgZWZlciBzZXR0aW5nCisJbW92bAlyZWFsX3NhdmVfZWZlcl9lZHggLSB3YWtldXBfY29kZSwgJWVkeAorCW1vdmwJcmVhbF9zYXZlX2VmZXJfZWF4IC0gd2FrZXVwX2NvZGUsICVlYXgKKwltb3YgICAgICQweGMwMDAwMDgwLCAlZWN4CisJd3Jtc3IKKzQ6CisJIyBtYWtlIHN1cmUgJWNyNCBpcyBzZXQgY29ycmVjdGx5IChmZWF0dXJlcywgZXRjKQorCW1vdmwJcmVhbF9zYXZlX2NyNCAtIHdha2V1cF9jb2RlLCAlZWF4CisJbW92bAklZWF4LCAlY3I0CisJbW92dwkkMHhiODAwLCAlYXgKKwltb3Z3CSVheCwlZnMKKwltb3Z3CSQweDBlMDAgKyAnaScsICVmczooMHgxMikKKwkKKwkjIG5lZWQgYSBnZHQKKwlsZ2R0CXJlYWxfc2F2ZV9nZHQgLSB3YWtldXBfY29kZQorCisJbW92bAlyZWFsX3NhdmVfY3IwIC0gd2FrZXVwX2NvZGUsICVlYXgKKwltb3ZsCSVlYXgsICVjcjAKKwlqbXAgMWYKKzE6CisJbW92dwkkMHgwZTAwICsgJ24nLCAlZnM6KDB4MTQpCisKKwltb3ZsCXJlYWxfbWFnaWMgLSB3YWtldXBfY29kZSwgJWVheAorCWNtcGwJJDB4MTIzNDU2NzgsICVlYXgKKwlqbmUJYm9ndXNfcmVhbF9tYWdpYworCisJbGptcGwJJF9fS0VSTkVMX0NTLCR3YWtldXBfcG1vZGVfcmV0dXJuCisKK3JlYWxfc2F2ZV9nZHQ6CS53b3JkIDAKKwkJLmxvbmcgMAorcmVhbF9zYXZlX2NyMDoJLmxvbmcgMAorcmVhbF9zYXZlX2NyMzoJLmxvbmcgMAorcmVhbF9zYXZlX2NyNDoJLmxvbmcgMAorcmVhbF9tYWdpYzoJLmxvbmcgMAordmlkZW9fbW9kZToJLmxvbmcgMAordmlkZW9fZmxhZ3M6CS5sb25nIDAKK3JlYWxfZWZlcl9zYXZlX3Jlc3RvcmU6CS5sb25nIDAKK3JlYWxfc2F2ZV9lZmVyX2VkeDogCS5sb25nIDAKK3JlYWxfc2F2ZV9lZmVyX2VheDogCS5sb25nIDAKKworYm9ndXNfcmVhbF9tYWdpYzoKKwltb3Z3CSQweDBlMDAgKyAnQicsICVmczooMHgxMikKKwlqbXAgYm9ndXNfcmVhbF9tYWdpYworCisvKiBUaGlzIGNvZGUgdXNlcyBhbiBleHRlbmRlZCBzZXQgb2YgdmlkZW8gbW9kZSBudW1iZXJzLiBUaGVzZSBpbmNsdWRlOgorICogQWxpYXNlcyBmb3Igc3RhbmRhcmQgbW9kZXMKKyAqCU5PUk1BTF9WR0EgKC0xKQorICoJRVhURU5ERURfVkdBICgtMikKKyAqCUFTS19WR0EgKC0zKQorICogVmlkZW8gbW9kZXMgbnVtYmVyZWQgYnkgbWVudSBwb3NpdGlvbiAtLSBOT1QgUkVDT01NRU5ERUQgYmVjYXVzZSBvZiBsYWNrCisgKiBvZiBjb21wYXRpYmlsaXR5IHdoZW4gZXh0ZW5kaW5nIHRoZSB0YWJsZS4gVGhlc2UgYXJlIGJldHdlZW4gMHgwMCBhbmQgMHhmZi4KKyAqLworI2RlZmluZSBWSURFT19GSVJTVF9NRU5VIDB4MDAwMAorCisvKiBTdGFuZGFyZCBCSU9TIHZpZGVvIG1vZGVzIChCSU9TIG51bWJlciArIDB4MDEwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfQklPUyAweDAxMDAKKworLyogVkVTQSBCSU9TIHZpZGVvIG1vZGVzIChWRVNBIG51bWJlciArIDB4MDIwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfVkVTQSAweDAyMDAKKworLyogVmlkZW83IHNwZWNpYWwgbW9kZXMgKEJJT1MgbnVtYmVyICsgMHgwOTAwKSAqLworI2RlZmluZSBWSURFT19GSVJTVF9WNyAweDA5MDAKKworIyBTZXR0aW5nIG9mIHVzZXIgbW9kZSAoQVg9bW9kZSBJRCkgPT4gQ0Y9c3VjY2VzcworbW9kZV9zZXQ6CisJbW92dwklYXgsICVieAorI2lmIDAKKwljbXBiCSQweGZmLCAlYWgKKwlqeglzZXRhbGlhcworCisJdGVzdGIJJFZJREVPX1JFQ0FMQz4+OCwgJWFoCisJam56CV9zZXRyZWMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1JFU09MVVRJT04+PjgsICVhaAorCWpuYwlzZXRyZXMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9TUEVDSUFMPj44LCAlYWgKKwlqeglzZXRzcGMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1Y3Pj44LCAlYWgKKwlqeglzZXR2NworI2VuZGlmCisJCisJY21wYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWFoCisJam5jCWNoZWNrX3Zlc2EKKyNpZiAwCQorCW9yYgklYWgsICVhaAorCWp6CXNldG1lbnUKKyNlbmRpZgorCQorCWRlY2IJJWFoCisjCWp6CXNldGJpb3MJCQkJICBBZGQgYmlvcyBtb2RlcyBsYXRlcgorCitzZXRiYWQ6CWNsYworCXJldAorCitjaGVja192ZXNhOgorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW9ydwkkMHg0MDAwLCAlYngJCQkjIFVzZSBsaW5lYXIgZnJhbWUgYnVmZmVyCisJbW92dwkkMHg0ZjAyLCAlYXgJCQkjIFZFU0EgQklPUyBtb2RlIHNldCBjYWxsCisJaW50CSQweDEwCisJY21wdwkkMHgwMDRmLCAlYXgJCQkjIEFMPTRmIGlmIGltcGxlbWVudGVkCisJam56CV9zZXRiYWQJCQkJIyBBSD0wIGlmIE9LCisKKwlzdGMKKwlyZXQKKworX3NldGJhZDogam1wIHNldGJhZAorCisJLmNvZGUzMgorCUFMSUdOCisKKy5vcmcJMHg4MDAKK3dha2V1cF9zdGFja19iZWdpbjoJIyBTdGFjayBncm93cyBkb3duCisKKy5vcmcJMHhmZjAJCSMgSnVzdCBiZWxvdyBlbmQgb2YgcGFnZQord2FrZXVwX3N0YWNrOgorRU5UUlkod2FrZXVwX2VuZCkKKwkKKy5vcmcJMHgxMDAwCisKK3dha2V1cF9wbW9kZV9yZXR1cm46CisJbW92dwkkX19LRVJORUxfRFMsICVheAorCW1vdncJJWF4LCAlc3MKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVlcworCW1vdncJJWF4LCAlZnMKKwltb3Z3CSVheCwgJWdzCisJbW92dwkkMHgwZTAwICsgJ3UnLCAweGI4MDE2CisKKwkjIHJlbG9hZCB0aGUgZ2R0LCBhcyB3ZSBuZWVkIHRoZSBmdWxsIDMyIGJpdCBhZGRyZXNzCisJbGdkdAlzYXZlZF9nZHQKKwlsaWR0CXNhdmVkX2lkdAorCWxsZHQJc2F2ZWRfbGR0CisJbGptcAkkKF9fS0VSTkVMX0NTKSwkMWYKKzE6CisJbW92bAklY3IzLCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisJd2JpbnZkCisKKwkjIGFuZCByZXN0b3JlIHRoZSBzdGFjayAuLi4gYnV0IHlvdSBuZWVkIGdkdCBmb3IgdGhpcyB0byB3b3JrCisJbW92bAlzYXZlZF9jb250ZXh0X2VzcCwgJWVzcAorCisJbW92bAklY3M6c2F2ZWRfbWFnaWMsICVlYXgKKwljbXBsCSQweDEyMzQ1Njc4LCAlZWF4CisJam5lCWJvZ3VzX21hZ2ljCisKKwkjIGp1bXAgdG8gcGxhY2Ugd2hlcmUgd2UgbGVmdCBvZmYKKwltb3ZsCXNhdmVkX2VpcCwlZWF4CisJam1wCSolZWF4CisKK2JvZ3VzX21hZ2ljOgorCW1vdncJJDB4MGUwMCArICdCJywgMHhiODAxOAorCWptcAlib2d1c19tYWdpYworCisKKyMjCisjIGFjcGlfY29weV93YWtldXBfcm91dGluZQorIworIyBDb3B5IHRoZSBhYm92ZSByb3V0aW5lIHRvIGxvdyBtZW1vcnkuCisjCisjIFBhcmFtZXRlcnM6CisjICVlYXg6CXBsYWNlIHRvIGNvcHkgd2FrZXVwIHJvdXRpbmUgdG8KKyMKKyMgUmV0dXJuZWQgYWRkcmVzcyBpcyBsb2NhdGlvbiBvZiBjb2RlIGluIGxvdyBtZW1vcnkgKHBhc3QgZGF0YSBhbmQgc3RhY2spCisjCitFTlRSWShhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUpCisKKwlzZ2R0CXNhdmVkX2dkdAorCXNpZHQJc2F2ZWRfaWR0CisJc2xkdAlzYXZlZF9sZHQKKwlzdHIJc2F2ZWRfdHNzCisKKwltb3ZsCW54X2VuYWJsZWQsICVlZHgKKwltb3ZsCSVlZHgsIHJlYWxfZWZlcl9zYXZlX3Jlc3RvcmUgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJdGVzdGwJJDEsIHJlYWxfZWZlcl9zYXZlX3Jlc3RvcmUgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJanoJMmYKKwkjIHNhdmUgZWZlciBzZXR0aW5nCisJcHVzaGwJJWVheAorCW1vdmwJJWVheCwgJWVieAorCW1vdiAgICAgJDB4YzAwMDAwODAsICVlY3gKKwlyZG1zcgorCW1vdmwJJWVkeCwgcmVhbF9zYXZlX2VmZXJfZWR4IC0gd2FrZXVwX3N0YXJ0ICglZWJ4KQorCW1vdmwJJWVheCwgcmVhbF9zYXZlX2VmZXJfZWF4IC0gd2FrZXVwX3N0YXJ0ICglZWJ4KQorCXBvcGwJJWVheAorMjoKKworCW1vdmwgICAgJWNyMywgJWVkeAorCW1vdmwgICAgJWVkeCwgcmVhbF9zYXZlX2NyMyAtIHdha2V1cF9zdGFydCAoJWVheCkKKwltb3ZsICAgICVjcjQsICVlZHgKKwltb3ZsICAgICVlZHgsIHJlYWxfc2F2ZV9jcjQgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bAklY3IwLCAlZWR4CisJbW92bAklZWR4LCByZWFsX3NhdmVfY3IwIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCXNnZHQgICAgcmVhbF9zYXZlX2dkdCAtIHdha2V1cF9zdGFydCAoJWVheCkKKworCW1vdmwJc2F2ZWRfdmlkZW9tb2RlLCAlZWR4CisJbW92bAklZWR4LCB2aWRlb19tb2RlIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCW1vdmwJYWNwaV92aWRlb19mbGFncywgJWVkeAorCW1vdmwJJWVkeCwgdmlkZW9fZmxhZ3MgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bAkkMHgxMjM0NTY3OCwgcmVhbF9tYWdpYyAtIHdha2V1cF9zdGFydCAoJWVheCkKKwltb3ZsCSQweDEyMzQ1Njc4LCBzYXZlZF9tYWdpYworCXJldAorCisuZGF0YQorQUxJR04KK0VOVFJZKHNhdmVkX21hZ2ljKQkubG9uZwkwCitFTlRSWShzYXZlZF9laXApCS5sb25nCTAKKworc2F2ZV9yZWdpc3RlcnM6CisJbGVhbAk0KCVlc3ApLCAlZWF4CisJbW92bAklZWF4LCBzYXZlZF9jb250ZXh0X2VzcAorCW1vdmwgJWVieCwgc2F2ZWRfY29udGV4dF9lYngKKwltb3ZsICVlYnAsIHNhdmVkX2NvbnRleHRfZWJwCisJbW92bCAlZXNpLCBzYXZlZF9jb250ZXh0X2VzaQorCW1vdmwgJWVkaSwgc2F2ZWRfY29udGV4dF9lZGkKKwlwdXNoZmwgOyBwb3BsIHNhdmVkX2NvbnRleHRfZWZsYWdzCisKKwltb3ZsICRyZXRfcG9pbnQsIHNhdmVkX2VpcAorCXJldAorCisKK3Jlc3RvcmVfcmVnaXN0ZXJzOgorCW1vdmwgc2F2ZWRfY29udGV4dF9lYnAsICVlYnAKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWJ4LCAlZWJ4CisJbW92bCBzYXZlZF9jb250ZXh0X2VzaSwgJWVzaQorCW1vdmwgc2F2ZWRfY29udGV4dF9lZGksICVlZGkKKwlwdXNobCBzYXZlZF9jb250ZXh0X2VmbGFncyA7IHBvcGZsCisJcmV0CQorCitFTlRSWShkb19zdXNwZW5kX2xvd2xldmVsKQorCWNhbGwJc2F2ZV9wcm9jZXNzb3Jfc3RhdGUKKwljYWxsCXNhdmVfcmVnaXN0ZXJzCisJcHVzaGwJJDMKKwljYWxsCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGUKKwlhZGRsCSQ0LCAlZXNwCisJcmV0CisJLnAyYWxpZ24gNCwsNworcmV0X3BvaW50OgorCWNhbGwJcmVzdG9yZV9yZWdpc3RlcnMKKwljYWxsCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlCisJcmV0CisKK0VOVFJZKGRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKQorCWNhbGwgc2F2ZV9wcm9jZXNzb3Jfc3RhdGUKKwljYWxsIHNhdmVfcmVnaXN0ZXJzCisJY2FsbCBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcworCXJldAorCitBTElHTgorIyBzYXZlZCByZWdpc3RlcnMKK3NhdmVkX2dkdDoJLmxvbmcJMCwwCitzYXZlZF9pZHQ6CS5sb25nCTAsMAorc2F2ZWRfbGR0OgkubG9uZwkwCitzYXZlZF90c3M6CS5sb25nCTAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWMxNzUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKQEAgLTAsMCArMSwxMjc4IEBACisvKgorICoJTG9jYWwgQVBJQyBoYW5kbGluZywgbG9jYWwgQVBJQyB0aW1lcnMKKyAqCisgKgkoYykgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglGaXhlcworICoJTWFjaWVqIFcuIFJvenlja2kJOglCaXRzIGZvciBnZW51aW5lIDgyNDg5RFggQVBJQ3M7CisgKgkJCQkJdGhhbmtzIHRvIEVyaWMgR2lsbW9yZQorICoJCQkJCWFuZCBSb2xmIEcuIFRld3MKKyAqCQkJCQlmb3IgdGVzdGluZyB0aGVzZSBleHRlbnNpdmVseS4KKyAqCU1hY2llaiBXLiBSb3p5Y2tpCToJVmFyaW91cyB1cGRhdGVzIGFuZCBmaXhlcy4KKyAqCU1pa2FlbCBQZXR0ZXJzc29uCToJUG93ZXIgTWFuYWdlbWVudCBmb3IgVVAtQVBJQy4KKyAqCVBhdmVsIE1hY2hlayBhbmQKKyAqCU1pa2FlbCBQZXR0ZXJzc29uCToJUE0gY29udmVydGVkIHRvIGRyaXZlciBtb2RlbC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKworI2luY2x1ZGUgImlvX3BvcnRzLmgiCisKKy8qCisgKiBEZWJ1ZyBsZXZlbAorICovCitpbnQgYXBpY192ZXJib3NpdHk7CisKKworc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKTsKKworLyoKKyAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgorICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMuCisgKi8KK3ZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlwcmludGsoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7CisJLyoKKwkgKiBDdXJyZW50bHkgdW5leHBlY3RlZCB2ZWN0b3JzIGhhcHBlbiBvbmx5IG9uIFNNUCBhbmQgQVBJQy4KKwkgKiBXZSBfbXVzdF8gYWNrIHRoZXNlIGJlY2F1c2UgZXZlcnkgbG9jYWwgQVBJQyBoYXMgb25seSBOCisJICogaXJxIHNsb3RzIHBlciBwcmlvcml0eSBsZXZlbCwgYW5kIGEgJ2hhbmdpbmcsIHVuYWNrZWQnIElSUQorCSAqIGhvbGRzIHVwIGFuIGlycSBzbG90IC0gaW4gZXhjZXNzaXZlIGNhc2VzICh3aGVuIG11bHRpcGxlCisJICogdW5leHBlY3RlZCB2ZWN0b3JzIG9jY3VyKSB0aGF0IG1pZ2h0IGxvY2sgdXAgdGhlIEFQSUMKKwkgKiBjb21wbGV0ZWx5LgorCSAqLworCWFja19BUElDX2lycSgpOworfQorCit2b2lkIF9faW5pdCBhcGljX2ludHJfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfaW50cl9pbml0KCk7CisjZW5kaWYKKwkvKiBzZWxmIGdlbmVyYXRlZCBJUEkgZm9yIGxvY2FsIEFQSUMgdGltZXIgKi8KKwlzZXRfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOworCisJLyogSVBJIHZlY3RvcnMgZm9yIEFQSUMgc3B1cmlvdXMgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKwlzZXRfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOworCXNldF9pbnRyX2dhdGUoRVJST1JfQVBJQ19WRUNUT1IsIGVycm9yX2ludGVycnVwdCk7CisKKwkvKiB0aGVybWFsIG1vbml0b3IgTFZUIGludGVycnVwdCAqLworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCXNldF9pbnRyX2dhdGUoVEhFUk1BTF9BUElDX1ZFQ1RPUiwgdGhlcm1hbF9pbnRlcnJ1cHQpOworI2VuZGlmCit9CisKKy8qIFVzaW5nIEFQSUMgdG8gZ2VuZXJhdGUgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdD8gKi8KK2ludCB1c2luZ19hcGljX3RpbWVyID0gMDsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJvZl9tdWx0aXBsaWVyKSA9IDE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX29sZF9tdWx0aXBsaWVyKSA9IDE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX2NvdW50ZXIpID0gMTsKKworc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKKwordm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQoreworCXVuc2lnbmVkIGludCB2LCB2ZXI7CisKKwl2ZXIgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmVyKTsKKwl2ID0gQVBJQ19ETV9OTUk7CQkJLyogdW5tYXNrIGFuZCBzZXQgdG8gTk1JICovCisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyKSkJCS8qIDgyNDg5RFggKi8KKwkJdiB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdik7Cit9CisKK2ludCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGx2ciwgdmVyc2lvbjsKKwlsdnIgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlcnNpb24gPSBHRVRfQVBJQ19WRVJTSU9OKGx2cik7CisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyc2lvbikgfHwgdmVyc2lvbiA+PSAweDE0KQorCQlyZXR1cm4gMHhmZjsKKwllbHNlCisJCXJldHVybiAweGY7Cit9CisKK2ludCBnZXRfbWF4bHZ0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCisJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2KTsKKwkvKiA4MjQ4OURYcyBkbyBub3QgcmVwb3J0ICMgb2YgTFZUIGVudHJpZXMuICovCisJbWF4bHZ0ID0gQVBJQ19JTlRFR1JBVEVEKHZlcikgPyBHRVRfQVBJQ19NQVhMVlQodikgOiAyOworCXJldHVybiBtYXhsdnQ7Cit9CisKK3ZvaWQgY2xlYXJfbG9jYWxfQVBJQyh2b2lkKQoreworCWludCBtYXhsdnQ7CisJdW5zaWduZWQgbG9uZyB2OworCisJbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCisJLyoKKwkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBvbiBhIFA2IGNhbiB0cmlnZ2VyIGEgbG9jYWwgQVBJQyBlcnJvcgorCSAqIGlmIHRoZSB2ZWN0b3IgaXMgemVyby4gTWFzayBMVlRFUlIgZmlyc3QgdG8gcHJldmVudCB0aGlzLgorCSAqLworCWlmIChtYXhsdnQgPj0gMykgeworCQl2ID0gRVJST1JfQVBJQ19WRUNUT1I7IC8qIGFueSBub24temVybyB2ZWN0b3Igd2lsbCBkbyAqLworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorCS8qCisJICogQ2FyZWZ1bDogd2UgaGF2ZSB0byBzZXQgbWFza3Mgb25seSBmaXJzdCB0byBkZWFzc2VydAorCSAqIGFueSBsZXZlbC10cmlnZ2VyZWQgc291cmNlcy4KKwkgKi8KKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwlpZiAobWF4bHZ0ID49IDQpIHsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRQQywgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorCisvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJaWYgKG1heGx2dCA+PSA1KSB7CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRUSE1SLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIENsZWFuIEFQSUMgc3RhdGUgZm9yIG90aGVyIE9TczoKKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgQVBJQ19MVlRfTUFTS0VEKTsKKwlpZiAobWF4bHZ0ID49IDMpCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCBBUElDX0xWVF9NQVNLRUQpOworCWlmIChtYXhsdnQgPj0gNCkKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRQQywgQVBJQ19MVlRfTUFTS0VEKTsKKworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCWlmIChtYXhsdnQgPj0gNSkKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRUSE1SLCBBUElDX0xWVF9NQVNLRUQpOworI2VuZGlmCisJdiA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJaWYgKEFQSUNfSU5URUdSQVRFRCh2KSkgewkvKiAhODI0ODlEWCAqLworCQlpZiAobWF4bHZ0ID4gMykJCS8qIER1ZSB0byBQZW50aXVtIGVycmF0YSAzQVAgYW5kIDExQVAuICovCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkJICovCisJCWNsZWFyX2xvY2FsX0FQSUMoKTsKKwkJLyoKKwkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KKwkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgorCQkgKi8KKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgIgorCQkJCSJlbmFibGluZyBBUElDIG1vZGUuXG4iKTsKKwkJb3V0YigweDcwLCAweDIyKTsKKwkJb3V0YigweDAxLCAweDIzKTsKKwl9CisJZW5hYmxlX2FwaWNfbW9kZSgpOworfQorCit2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKKwkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQworCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKKwkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgorCQkgKi8KKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgorCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOworCQlvdXRiKDB4NzAsIDB4MjIpOworCQlvdXRiKDB4MDAsIDB4MjMpOworCX0KK30KKwordm9pZCBkaXNhYmxlX2xvY2FsX0FQSUModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJY2xlYXJfbG9jYWxfQVBJQygpOworCisJLyoKKwkgKiBEaXNhYmxlIEFQSUMgKGltcGxpZXMgY2xlYXJpbmcgb2YgcmVnaXN0ZXJzCisJICogZm9yIDgyNDg5RFghKS4KKwkgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOworCXZhbHVlICY9IH5BUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKSB7CisJCXVuc2lnbmVkIGludCBsLCBoOworCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRTsKKwkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2UncmUgbG9va2luZyBhdCBhIHJlYWwgbG9jYWwgQVBJQy4KKyAqIENoZWNrIHRoZXNlIGFnYWluc3QgeW91ciBib2FyZCBpZiB0aGUgQ1BVcyBhcmVuJ3QgZ2V0dGluZworICogc3RhcnRlZCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgorICovCitpbnQgX19pbml0IHZlcmlmeV9sb2NhbF9BUElDKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJlZzAsIHJlZzE7CisKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIHJlZ2lzdGVyIGlzIHJlYWQtb25seSBpbiBhIHJlYWwgQVBJQy4KKwkgKi8KKwlyZWcwID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBWRVJTSU9OOiAleFxuIiwgcmVnMCk7CisJYXBpY193cml0ZShBUElDX0xWUiwgcmVnMCBeIEFQSUNfTFZSX01BU0spOworCXJlZzEgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIFZFUlNJT046ICV4XG4iLCByZWcxKTsKKworCS8qCisJICogVGhlIHR3byB2ZXJzaW9uIHJlYWRzIGFib3ZlIHNob3VsZCBwcmludCB0aGUgc2FtZQorCSAqIG51bWJlcnMuICBJZiB0aGUgc2Vjb25kIG9uZSBpcyBkaWZmZXJlbnQsIHRoZW4gd2UKKwkgKiBwb2tlIGF0IGEgbm9uLUFQSUMuCisJICovCisJaWYgKHJlZzEgIT0gcmVnMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSB2ZXJzaW9uIGxvb2tzIHJlYXNvbmFibHkuCisJICovCisJcmVnMSA9IEdFVF9BUElDX1ZFUlNJT04ocmVnMCk7CisJaWYgKHJlZzEgPT0gMHgwMCB8fCByZWcxID09IDB4ZmYpCisJCXJldHVybiAwOworCXJlZzEgPSBnZXRfbWF4bHZ0KCk7CisJaWYgKHJlZzEgPCAweDAyIHx8IHJlZzEgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBJRCByZWdpc3RlciBpcyByZWFkL3dyaXRlIGluIGEgcmVhbCBBUElDLgorCSAqLworCXJlZzAgPSBhcGljX3JlYWQoQVBJQ19JRCk7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgSUQ6ICV4XG4iLCByZWcwKTsKKworCS8qCisJICogVGhlIG5leHQgdHdvIGFyZSBqdXN0IHRvIHNlZSBpZiB3ZSBoYXZlIHNhbmUgdmFsdWVzLgorCSAqIFRoZXkncmUgb25seSByZWFsbHkgcmVsZXZhbnQgaWYgd2UncmUgaW4gVmlydHVhbCBXaXJlCisJICogY29tcGF0aWJpbGl0eSBtb2RlLCBidXQgbW9zdCBib3hlcyBhcmUgYW55bW9yZS4KKwkgKi8KKwlyZWcwID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgTFZUMDogJXhcbiIsIHJlZzApOworCXJlZzEgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBMVlQxOiAleFxuIiwgcmVnMSk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBfX2luaXQgc3luY19BcmJfSURzKHZvaWQpCit7CisJLyogVW5zdXBwb3J0ZWQgb24gUDQgLSBzZWUgSW50ZWwgRGV2LiBNYW51YWwgVm9sLiAzLCBDaC4gOC42LjEgKi8KKwl1bnNpZ25lZCBpbnQgdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwlpZiAodmVyID49IDB4MTQpCS8qIFA0IG9yIGhpZ2hlciAqLworCQlyZXR1cm47CisJLyoKKwkgKiBXYWl0IGZvciBpZGxlLgorCSAqLworCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIlN5bmNocm9uaXppbmcgQXJiIElEcy5cbiIpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBBUElDX0RFU1RfQUxMSU5DIHwgQVBJQ19JTlRfTEVWRUxUUklHCisJCQkJfCBBUElDX0RNX0lOSVQpOworfQorCitleHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7CisKKy8qCisgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KKyAqLwordm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHZlcjsKKworCS8qCisJICogRG9uJ3QgZG8gdGhlIHNldHVwIG5vdyBpZiB3ZSBoYXZlIGEgU01QIEJJT1MgYXMgdGhlCisJICogdGhyb3VnaC1JL08tQVBJQyB2aXJ0dWFsIHdpcmUgbW9kZSBtaWdodCBiZSBhY3RpdmUuCisJICovCisJaWYgKHNtcF9mb3VuZF9jb25maWcgfHwgIWNwdV9oYXNfYXBpYykKKwkJcmV0dXJuOworCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOworCisJLyoKKwkgKiBEbyBub3QgdHJ1c3QgdGhlIGxvY2FsIEFQSUMgYmVpbmcgZW1wdHkgYXQgYm9vdHVwLgorCSAqLworCWNsZWFyX2xvY2FsX0FQSUMoKTsKKworCS8qCisJICogRW5hYmxlIEFQSUMuCisJICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKKwl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQorCS8qIFRoaXMgYml0IGlzIHJlc2VydmVkIG9uIFA0L1hlb24gYW5kIHNob3VsZCBiZSBjbGVhcmVkICovCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKwllbHNlCisJCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKwl2YWx1ZSB8PSBTUFVSSU9VU19BUElDX1ZFQ1RPUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKworCS8qCisJICogU2V0IHVwIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRVhUSU5UKTsKKwl2YWx1ZSA9IEFQSUNfRE1fTk1JOworCWlmICghQVBJQ19JTlRFR1JBVEVEKHZlcikpCQkvKiA4MjQ4OURYICovCisJCXZhbHVlIHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX2xvY2FsX0FQSUMgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIHZlciwgbWF4bHZ0OworCisJLyogUG91bmQgdGhlIEVTUiByZWFsbHkgaGFyZCBvdmVyIHRoZSBoZWFkIHdpdGggYSBiaWcgaGFtbWVyIC0gbWJsaWdoICovCisJaWYgKGVzcl9kaXNhYmxlKSB7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCX0KKworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKKworCWlmICgoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDBmKSAhPSAweDBmKQorCQlfX2Vycm9yX2luX2FwaWNfYygpOworCisJLyoKKwkgKiBEb3VibGUtY2hlY2sgd2hldGhlciB0aGlzIEFQSUMgaXMgcmVhbGx5IHJlZ2lzdGVyZWQuCisJICovCisJaWYgKCFhcGljX2lkX3JlZ2lzdGVyZWQoKSkKKwkJQlVHKCk7CisKKwkvKgorCSAqIEludGVsIHJlY29tbWVuZHMgdG8gc2V0IERGUiwgTERSIGFuZCBUUFIgYmVmb3JlIGVuYWJsaW5nCisJICogYW4gQVBJQy4gIFNlZSBlLmcuICJBUC0zODggODI0ODlEWCBVc2VyJ3MgTWFudWFsIiAoSW50ZWwKKwkgKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgorCSAqLworCWluaXRfYXBpY19sZHIoKTsKKworCS8qCisJICogU2V0IFRhc2sgUHJpb3JpdHkgdG8gJ2FjY2VwdCBhbGwnLiBXZSBuZXZlciBjaGFuZ2UgdGhpcworCSAqIGxhdGVyIG9uLgorCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJdmFsdWUgJj0gfkFQSUNfVFBSSV9NQVNLOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVEFTS1BSSSwgdmFsdWUpOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBhcmUgYWxsIHNldCB1cCwgZW5hYmxlIHRoZSBBUElDCisJICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKKwkvKgorCSAqIEVuYWJsZSBBUElDCisJICovCisJdmFsdWUgfD0gQVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKKworCS8qCisJICogU29tZSB1bmtub3duIEludGVsIElPL0FQSUMgKG9yIEFQSUMpIGVycmF0YSBpcyBiaXRpbmcgdXMgd2l0aAorCSAqIGNlcnRhaW4gbmV0d29ya2luZyBjYXJkcy4gSWYgaGlnaCBmcmVxdWVuY3kgaW50ZXJydXB0cyBhcmUKKwkgKiBoYXBwZW5pbmcgb24gYSBwYXJ0aWN1bGFyIElPQVBJQyBwaW4sIHBsdXMgdGhlIElPQVBJQyByb3V0aW5nCisJICogZW50cnkgaXMgbWFza2VkL3VubWFza2VkIGF0IGEgaGlnaCByYXRlIGFzIHdlbGwgdGhlbiBzb29uZXIgb3IKKwkgKiBsYXRlciBJT0FQSUMgbGluZSBnZXRzICdzdHVjaycsIG5vIG1vcmUgaW50ZXJydXB0cyBhcmUgcmVjZWl2ZWQKKwkgKiBmcm9tIHRoZSBkZXZpY2UuIElmIGZvY3VzIENQVSBpcyBkaXNhYmxlZCB0aGVuIHRoZSBoYW5nIGdvZXMKKwkgKiBhd2F5LCBvaCB3ZWxsIDotKAorCSAqCisJICogWyBUaGlzIGJ1ZyBjYW4gYmUgcmVwcm9kdWNlZCBlYXNpbHkgd2l0aCBhIGxldmVsLXRyaWdnZXJlZAorCSAqICAgUENJIE5lMjAwMCBuZXR3b3JraW5nIGNhcmRzIGFuZCBQSUkvUElJSSBwcm9jZXNzb3JzLCBkdWFsCisJICogICBCWCBjaGlwc2V0LiBdCisJICovCisJLyoKKwkgKiBBY3R1YWxseSBkaXNhYmxpbmcgdGhlIGZvY3VzIENQVSBjaGVjayBqdXN0IG1ha2VzIHRoZSBoYW5nIGxlc3MKKwkgKiBmcmVxdWVudCBhcyBpdCBtYWtlcyB0aGUgaW50ZXJydXB0IGRpc3RyaWJ1dG9uIG1vZGVsIGJlIG1vcmUKKwkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgorCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCisJICovCisjaWYgMQorCS8qIEVuYWJsZSBmb2N1cyBwcm9jZXNzb3IgKGJpdD09MCkgKi8KKwl2YWx1ZSAmPSB+QVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOworI2Vsc2UKKwkvKiBEaXNhYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0xKSAqLworCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKyNlbmRpZgorCS8qCisJICogU2V0IHNwdXJpb3VzIElSUSB2ZWN0b3IKKwkgKi8KKwl2YWx1ZSB8PSBTUFVSSU9VU19BUElDX1ZFQ1RPUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKworCS8qCisJICogU2V0IHVwIExWVDAsIExWVDE6CisJICoKKwkgKiBzZXQgdXAgdGhyb3VnaC1sb2NhbC1BUElDIG9uIHRoZSBCUCdzIExJTlQwLiBUaGlzIGlzIG5vdAorCSAqIHN0cmljdGx5IG5lY2Vzc2VyeSBpbiBwdXJlIHN5bW1ldHJpYy1JTyBtb2RlLCBidXQgc29tZXRpbWVzCisJICogd2UgZGVsZWdhdGUgaW50ZXJydXB0cyB0byB0aGUgODI1OUEuCisJICovCisJLyoKKwkgKiBUT0RPOiBzZXQgdXAgdGhyb3VnaC1sb2NhbC1BUElDIGZyb20gdGhyb3VnaC1JL08tQVBJQz8gLS1tYWNybworCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCkgJiBBUElDX0xWVF9NQVNLRUQ7CisJaWYgKCFzbXBfcHJvY2Vzc29yX2lkKCkgJiYgKHBpY19tb2RlIHx8ICF2YWx1ZSkpIHsKKwkJdmFsdWUgPSBBUElDX0RNX0VYVElOVDsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZW5hYmxlZCBFeHRJTlQgb24gQ1BVIyVkXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBBUElDX0RNX0VYVElOVCB8IEFQSUNfTFZUX01BU0tFRDsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibWFza2VkIEV4dElOVCBvbiBDUFUjJWRcbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl9CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7CisKKwkvKgorCSAqIG9ubHkgdGhlIEJQIHNob3VsZCBzZWUgdGhlIExJTlQxIE5NSSBzaWduYWwsIG9idmlvdXNseS4KKwkgKi8KKwlpZiAoIXNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJdmFsdWUgPSBBUElDX0RNX05NSTsKKwllbHNlCisJCXZhbHVlID0gQVBJQ19ETV9OTUkgfCBBUElDX0xWVF9NQVNLRUQ7CisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyKSkJCS8qIDgyNDg5RFggKi8KKwkJdmFsdWUgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKworCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCisJCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICovCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJb2xkdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCisJCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7ICAgICAgLy8gZW5hYmxlcyBzZW5kaW5nIGVycm9ycworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgdmFsdWUpOworCQkvKgorCQkgKiBzcGVjIHNheXMgY2xlYXIgZXJyb3JzIGFmdGVyIGVuYWJsaW5nIHZlY3Rvci4KKwkJICovCisJCWlmIChtYXhsdnQgPiAzKQorCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwkJaWYgKHZhbHVlICE9IG9sZHZhbHVlKQorCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiRVNSIHZhbHVlIGJlZm9yZSBlbmFibGluZyAiCisJCQkJInZlY3RvcjogMHglMDhseCAgYWZ0ZXI6IDB4JTA4bHhcbiIsCisJCQkJb2xkdmFsdWUsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlpZiAoZXNyX2Rpc2FibGUpCQorCQkJLyogCisJCQkgKiBTb21ldGhpbmcgdW50cmFjZWJsZSBpcyBjcmVhdGluZyBiYWQgaW50ZXJydXB0cyBvbiAKKwkJCSAqIHNlY29uZGFyeSBxdWFkcyAuLi4gZm9yIHRoZSBtb21lbnQsIGp1c3QgbGVhdmUgdGhlCisJCQkgKiBFU1IgZGlzYWJsZWQgLSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGUKKwkJCSAqIGVycm9ycyBhbnl3YXkgLSBtYmxpZ2gKKwkJCSAqLworCQkJcHJpbnRrKCJMZWF2aW5nIEVTUiBkaXNhYmxlZC5cbiIpOworCQllbHNlIAorCQkJcHJpbnRrKCJObyBFU1IgZm9yIDgyNDg5RFguXG4iKTsKKwl9CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlzZXR1cF9hcGljX25taV93YXRjaGRvZygpOworCWFwaWNfcG1fYWN0aXZhdGUoKTsKK30KKworLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdAorICogZGlzYWJsZSBpdCBkb3duIGJlZm9yZSByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4KKyAqIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgcG93ZXItb2ZmLgorICovCit2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCit7CisJaWYgKCFjcHVfaGFzX2FwaWMgfHwgIWVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYWN0aXZlOworCS8qIHIvdyBhcGljIGZpZWxkcyAqLworCXVuc2lnbmVkIGludCBhcGljX2lkOworCXVuc2lnbmVkIGludCBhcGljX3Rhc2twcmk7CisJdW5zaWduZWQgaW50IGFwaWNfbGRyOworCXVuc2lnbmVkIGludCBhcGljX2RmcjsKKwl1bnNpZ25lZCBpbnQgYXBpY19zcGl2OworCXVuc2lnbmVkIGludCBhcGljX2x2dHQ7CisJdW5zaWduZWQgaW50IGFwaWNfbHZ0cGM7CisJdW5zaWduZWQgaW50IGFwaWNfbHZ0MDsKKwl1bnNpZ25lZCBpbnQgYXBpY19sdnQxOworCXVuc2lnbmVkIGludCBhcGljX2x2dGVycjsKKwl1bnNpZ25lZCBpbnQgYXBpY190bWljdDsKKwl1bnNpZ25lZCBpbnQgYXBpY190ZGNyOworCXVuc2lnbmVkIGludCBhcGljX3RobXI7Cit9IGFwaWNfcG1fc3RhdGU7CisKK3N0YXRpYyBpbnQgbGFwaWNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCB1MzIgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCisJCXJldHVybiAwOworCisJYXBpY19wbV9zdGF0ZS5hcGljX2lkID0gYXBpY19yZWFkKEFQSUNfSUQpOworCWFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJYXBpY19wbV9zdGF0ZS5hcGljX2xkciA9IGFwaWNfcmVhZChBUElDX0xEUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX2RmciA9IGFwaWNfcmVhZChBUElDX0RGUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3NwaXYgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0dCA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCWFwaWNfcG1fc3RhdGUuYXBpY19sdnRwYyA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MCA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCWFwaWNfcG1fc3RhdGUuYXBpY19sdnQxID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJYXBpY19wbV9zdGF0ZS5hcGljX2x2dGVyciA9IGFwaWNfcmVhZChBUElDX0xWVEVSUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3RtaWN0ID0gYXBpY19yZWFkKEFQSUNfVE1JQ1QpOworCWFwaWNfcG1fc3RhdGUuYXBpY190ZGNyID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3RobXIgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKKwkKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGljX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBsLCBoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFwaWNfcG1fc3RhdGUuYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBBUElDQkFTRSBwb2ludHMgdG8gdGhlIHJpZ2h0IGFkZHJlc3MKKwkgKgorCSAqIEZJWE1FISBUaGlzIHdpbGwgYmUgd3JvbmcgaWYgd2UgZXZlciBzdXBwb3J0IHN1c3BlbmQgb24KKwkgKiBTTVAhIFdlJ2xsIG5lZWQgdG8gZG8gdGhpcyBhcyBwYXJ0IG9mIHRoZSBDUFUgcmVzdG9yZSEKKwkgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwlsIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IG1wX2xhcGljX2FkZHI7CisJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCisJYXBpY193cml0ZShBUElDX0xWVEVSUiwgRVJST1JfQVBJQ19WRUNUT1IgfCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19JRCwgYXBpY19wbV9zdGF0ZS5hcGljX2lkKTsKKwlhcGljX3dyaXRlKEFQSUNfREZSLCBhcGljX3BtX3N0YXRlLmFwaWNfZGZyKTsKKwlhcGljX3dyaXRlKEFQSUNfTERSLCBhcGljX3BtX3N0YXRlLmFwaWNfbGRyKTsKKwlhcGljX3dyaXRlKEFQSUNfVEFTS1BSSSwgYXBpY19wbV9zdGF0ZS5hcGljX3Rhc2twcmkpOworCWFwaWNfd3JpdGUoQVBJQ19TUElWLCBhcGljX3BtX3N0YXRlLmFwaWNfc3Bpdik7CisJYXBpY193cml0ZShBUElDX0xWVDAsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQwKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMSwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dDEpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBhcGljX3BtX3N0YXRlLmFwaWNfdGhtcik7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0cGMpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRULCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0dCk7CisJYXBpY193cml0ZShBUElDX1REQ1IsIGFwaWNfcG1fc3RhdGUuYXBpY190ZGNyKTsKKwlhcGljX3dyaXRlKEFQSUNfVE1JQ1QsIGFwaWNfcG1fc3RhdGUuYXBpY190bWljdCk7CisJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyKTsKKwlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwlhcGljX3JlYWQoQVBJQ19FU1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZGV2aWNlIGhhcyBubyBzaHV0ZG93biBtZXRob2QgLSBmdWxseSBmdW5jdGlvbmluZyBsb2NhbCBBUElDcworICogYXJlIG5lZWRlZCBvbiBldmVyeSBDUFUgdXAgdW50aWwgbWFjaGluZV9oYWx0L3Jlc3RhcnQvcG93ZXJvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbGFwaWNfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgibGFwaWMiKSwKKwkucmVzdW1lCQk9IGxhcGljX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGxhcGljX3N1c3BlbmQsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2xhcGljID0geworCS5pZAk9IDAsCisJLmNscwk9ICZsYXBpY19zeXNjbGFzcywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpCit7CisJYXBpY19wbV9zdGF0ZS5hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xhcGljX3N5c2ZzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJaWYgKCFjcHVfaGFzX2FwaWMpCisJCXJldHVybiAwOworCS8qIFhYWDogcmVtb3ZlIHN1c3BlbmQvcmVzdW1lIHByb2NzIGlmICFhcGljX3BtX3N0YXRlLmFjdGl2ZT8gKi8KKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZsYXBpY19zeXNjbGFzcyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9sYXBpYyk7CisJcmV0dXJuIGVycm9yOworfQorZGV2aWNlX2luaXRjYWxsKGluaXRfbGFwaWNfc3lzZnMpOworCisjZWxzZQkvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKSB7IH0KKworI2VuZGlmCS8qIENPTkZJR19QTSAqLworCisvKgorICogRGV0ZWN0IGFuZCBlbmFibGUgbG9jYWwgQVBJQ3Mgb24gbm9uLVNNUCBib2FyZHMuCisgKiBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnkgS2VpciBGcmFzZXIuCisgKi8KKworLyoKKyAqIEtub2IgdG8gY29udHJvbCBvdXIgd2lsbGluZ25lc3MgdG8gZW5hYmxlIHRoZSBsb2NhbCBBUElDLgorICovCitpbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBsYXBpY19kaXNhYmxlKGNoYXIgKnN0cikKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IC0xOworCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwlyZXR1cm4gMDsKK30KK19fc2V0dXAoIm5vbGFwaWMiLCBsYXBpY19kaXNhYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgbGFwaWNfZW5hYmxlKGNoYXIgKnN0cikKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJsYXBpYyIsIGxhcGljX2VuYWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFwaWNfc2V0X3ZlcmJvc2l0eShjaGFyICpzdHIpCit7CisJaWYgKHN0cmNtcCgiZGVidWciLCBzdHIpID09IDApCisJCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19ERUJVRzsKKwllbHNlIGlmIChzdHJjbXAoInZlcmJvc2UiLCBzdHIpID09IDApCisJCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19WRVJCT1NFOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBJQyBWZXJib3NpdHkgbGV2ZWwgJXMgbm90IHJlY29nbmlzZWQiCisJCQkJIiB1c2UgYXBpYz12ZXJib3NlIG9yIGFwaWM9ZGVidWciLCBzdHIpOworCisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X2luaXRfQVBJQyAodm9pZCkKK3sKKwl1MzIgaCwgbCwgZmVhdHVyZXM7CisJZXh0ZXJuIHZvaWQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2Kik7CisKKwkvKiBEaXNhYmxlZCBieSBrZXJuZWwgb3B0aW9uPyAqLworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCXJldHVybiAtMTsKKworCS8qIFdvcmthcm91bmQgZm9yIHVzIGJlaW5nIGNhbGxlZCBiZWZvcmUgaWRlbnRpZnlfY3B1KCkuICovCisJZ2V0X2NwdV92ZW5kb3IoJmJvb3RfY3B1X2RhdGEpOworCisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkJICAgIAorCQkJYnJlYWs7CisJCWdvdG8gbm9fYXBpYzsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1IHx8CisJCSAgICAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNSAmJiBjcHVfaGFzX2FwaWMpKQorCQkJYnJlYWs7CisJCWdvdG8gbm9fYXBpYzsKKwlkZWZhdWx0OgorCQlnb3RvIG5vX2FwaWM7CisJfQorCisJaWYgKCFjcHVfaGFzX2FwaWMpIHsKKwkJLyoKKwkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsCisJCSAqIEFQSUMgb25seSBpZiAibGFwaWMiIHNwZWNpZmllZC4KKwkJICovCisJCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7CisJCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSAiCisJCQkgICAgICAgInlvdSBjYW4gZW5hYmxlIGl0IHdpdGggXCJsYXBpY1wiXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKgorCQkgKiBTb21lIEJJT1NlcyBkaXNhYmxlIHRoZSBsb2NhbCBBUElDIGluIHRoZQorCQkgKiBBUElDX0JBU0UgTVNSLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgaW4KKwkJICogc29mdHdhcmUgZm9yIEludGVsIFA2IG9yIGxhdGVyIGFuZCBBTUQgSzcKKwkJICogKE1vZGVsID4gMSkgb3IgbGF0ZXIuCisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJCWlmICghKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpKSB7CisJCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSByZWVuYWJsaW5nLlxuIik7CisJCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOworCQkJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworCQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQkJZW5hYmxlZF92aWFfYXBpY2Jhc2UgPSAxOworCQl9CisJfQorCS8qCisJICogVGhlIEFQSUMgZmVhdHVyZSBiaXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkCisJICogaW4gYGNwdWlkJworCSAqLworCWZlYXR1cmVzID0gY3B1aWRfZWR4KDEpOworCWlmICghKGZlYXR1cmVzICYgKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykpKSB7CisJCXByaW50aygiQ291bGQgbm90IGVuYWJsZSBBUElDIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc2V0X2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKworCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCisJCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJcHJpbnRrKCJGb3VuZCBhbmQgZW5hYmxlZCBsb2NhbCBBUElDIVxuIik7CisKKwlhcGljX3BtX2FjdGl2YXRlKCk7CisKKwlyZXR1cm4gMDsKKworbm9fYXBpYzoKKwlwcmludGsoIk5vIGxvY2FsIEFQSUMgcHJlc2VudCBvciBoYXJkd2FyZSBkaXNhYmxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCit2b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKKworCS8qCisJICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAorCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCisJICogb25lIGZvciB0aGUgSU8tQVBJQy4KKwkgKi8KKwlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7CisJCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKKwl9IGVsc2UKKwkJYXBpY19waHlzID0gbXBfbGFwaWNfYWRkcjsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOworCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLCBBUElDX0JBU0UsCisJICAgICAgIGFwaWNfcGh5cyk7CisKKwkvKgorCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKKwkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgorCSAqLworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQorCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJeworCQl1bnNpZ25lZCBsb25nIGlvYXBpY19waHlzLCBpZHggPSBGSVhfSU9fQVBJQ19CQVNFXzA7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKKwkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7CisJCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKKwkJCQlpZiAoIWlvYXBpY19waHlzKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkgICAgICAgIldBUk5JTkc6IGJvZ3VzIHplcm8gSU8tQVBJQyAiCisJCQkJCSAgICAgICAiYWRkcmVzcyBmb3VuZCBpbiBNUFRBQkxFLCAiCisJCQkJCSAgICAgICAiZGlzYWJsaW5nIElPL0FQSUMgc3VwcG9ydCFcbiIpOworCQkJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKKwkJCQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOworCQkJCQlnb3RvIGZha2VfaW9hcGljX3BhZ2U7CisJCQkJfQorCQkJfSBlbHNlIHsKK2Zha2VfaW9hcGljX3BhZ2U6CisJCQkJaW9hcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJICAgICAgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOworCQkJCWlvYXBpY19waHlzID0gX19wYShpb2FwaWNfcGh5cyk7CisJCQl9CisJCQlzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBpb2FwaWNfcGh5cyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIElPQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAorCQkJICAgICAgIF9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOworCQkJaWR4Kys7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgcGFydCBzZXRzIHVwIHRoZSBBUElDIDMyIGJpdCBjbG9jayBpbiBMVlRUMSwgd2l0aCBIWiBpbnRlcnJ1cHRzCisgKiBwZXIgc2Vjb25kLiBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHNldCB1cCB0aGUgbG9jYWwKKyAqIEFQSUMuCisgKgorICogVGhlIEFQSUMgdGltZXIgaXMgbm90IGV4YWN0bHkgc3luYyB3aXRoIHRoZSBleHRlcm5hbCB0aW1lciBjaGlwLCBpdAorICogY2xvc2VseSBmb2xsb3dzIGJ1cyBjbG9ja3MuCisgKi8KKworLyoKKyAqIFRoZSB0aW1lciBjaGlwIGlzIGFscmVhZHkgc2V0IHVwIGF0IEhaIGludGVycnVwdHMgcGVyIHNlY29uZCBoZXJlLAorICogYnV0IHdlIGRvIG5vdCBhY2NlcHQgdGltZXIgaW50ZXJydXB0cyB5ZXQuIFdlIG9ubHkgYWxsb3cgdGhlIEJQCisgKiB0byBjYWxpYnJhdGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCit7CisJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdW5zaWduZWQgaW50IGNvdW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKworCW91dGJfcCgweDAwLCBQSVRfTU9ERSk7CisJY291bnQgPSBpbmJfcChQSVRfQ0gwKTsKKwljb3VudCB8PSBpbmJfcChQSVRfQ0gwKSA8PCA4OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBuZXh0IHRpY2sgaW4gODI1NCBjYW4gYmUgY2F1Z2h0IGJ5IGNhdGNoaW5nIHRpbWVyIHdyYXBhcm91bmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB3YWl0XzgyNTRfd3JhcGFyb3VuZCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBwcmV2X2NvdW50OworCisJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7CisJZG8geworCQlwcmV2X2NvdW50ID0gY3Vycl9jb3VudDsKKwkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7CisKKwkJLyogd29ya2Fyb3VuZCBmb3IgYnJva2VuIE1lcmN1cnkvTmVwdHVuZSAqLworCQlpZiAocHJldl9jb3VudCA+PSBjdXJyX2NvdW50ICsgMHgxMDApCisJCQljdXJyX2NvdW50ID0gZ2V0XzgyNTRfdGltZXJfY291bnQoKTsKKworCX0gd2hpbGUgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCk7Cit9CisKKy8qCisgKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIGZvciA4MjU0IHRpbWVycy4gSWYgd2UgdXNlIG90aGVyIHRpbWVycyBsaWtlIEhQRVQsCisgKiB3ZSBvdmVycmlkZSB0aGlzIGxhdGVyCisgKi8KK3ZvaWQgKCp3YWl0X3RpbWVyX3RpY2spKHZvaWQpIF9faW5pdGRhdGEgPSB3YWl0XzgyNTRfd3JhcGFyb3VuZDsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbG9jYWwgQVBJQyB0aW1lciwgd2l0aCBhIHRpbWVvdXQgb2YKKyAqICdjbG9ja3MnIEFQSUMgYnVzIGNsb2NrLiBEdXJpbmcgY2FsaWJyYXRpb24gd2UgYWN0dWFsbHkgY2FsbAorICogdGhpcyBmdW5jdGlvbiB0d2ljZSBvbiB0aGUgYm9vdCBDUFUsIG9uY2Ugd2l0aCBhIGJvZ3VzIHRpbWVvdXQKKyAqIHZhbHVlLCBzZWNvbmQgdGltZSBmb3IgcmVhbC4gVGhlIG90aGVyIChub25jYWxpYnJhdGluZykgQ1BVcworICogY2FsbCB0aGlzIGZ1bmN0aW9uIG9ubHkgb25jZSwgd2l0aCB0aGUgcmVhbCwgY2FsaWJyYXRlZCB2YWx1ZS4KKyAqCisgKiBXZSBkbyByZWFkcyBiZWZvcmUgd3JpdGVzIGV2ZW4gaWYgdW5uZWNlc3NhcnksIHRvIGdldCBhcm91bmQgdGhlCisgKiBQNSBBUElDIGRvdWJsZSB3cml0ZSBidWcuCisgKi8KKworI2RlZmluZSBBUElDX0RJVklTT1IgMTYKKworc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcykKK3sKKwl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlLCB2ZXI7CisKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKKwlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQorCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCS8qCisJICogRGl2aWRlIFBJQ0xLIGJ5IDE2CisJICovCisJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19URENSLCAodG1wX3ZhbHVlCisJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCisJCQkJfCBBUElDX1REUl9ESVZfMTYpOworCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgY2xvY2tzL0FQSUNfRElWSVNPUik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9BUElDX3RpbWVyKHVuc2lnbmVkIGludCBjbG9ja3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qCisJICogV2FpdCBmb3IgSVJRMCdzIHNsaWNlOgorCSAqLworCXdhaXRfdGltZXJfdGljaygpOworCisJX19zZXR1cF9BUElDX0xWVFQoY2xvY2tzKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEluIHRoaXMgZnVuY3Rpb24gd2UgY2FsaWJyYXRlIEFQSUMgYnVzIGNsb2NrcyB0byB0aGUgZXh0ZXJuYWwKKyAqIHRpbWVyLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCB1c2UgamlmZmllcyBhbmQgdGhlIHRpbWVyIGlycQorICogdG8gY2FsaWJyYXRlLCBzaW5jZSBzb21lIGxhdGVyIGJvb3R1cCBjb2RlIGRlcGVuZHMgb24gZ2V0dGluZworICogdGhlIGZpcnN0IGlycT8gVWdoLgorICoKKyAqIFdlIHdhbnQgdG8gZG8gdGhlIGNhbGlicmF0aW9uIG9ubHkgb25jZSBzaW5jZSB3ZQorICogd2FudCB0byBoYXZlIGxvY2FsIHRpbWVyIGlycXMgc3luY3Jvbi4gQ1BVcyBjb25uZWN0ZWQKKyAqIGJ5IHRoZSBzYW1lIEFQSUMgYnVzIGhhdmUgdGhlIHZlcnkgc2FtZSBidXMgZnJlcXVlbmN5LgorICogQW5kIHdlIHdhbnQgdG8gaGF2ZSBpcnFzIG9mZiBhbnl3YXlzLCBubyBhY2NpZGVudGFsCisgKiBBUElDIGlycSB0aGF0IHdheS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBjYWxpYnJhdGVfQVBJQ19jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0MSA9IDAsIHQyID0gMDsKKwlsb25nIHR0MSwgdHQyOworCWxvbmcgcmVzdWx0OworCWludCBpOworCWNvbnN0IGludCBMT09QUyA9IEhaLzEwOworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiY2FsaWJyYXRpbmcgQVBJQyB0aW1lciAuLi5cbiIpOworCisJLyoKKwkgKiBQdXQgd2hhdGV2ZXIgYXJiaXRyYXJ5IChidXQgbG9uZyBlbm91Z2gpIHRpbWVvdXQKKwkgKiB2YWx1ZSBpbnRvIHRoZSBBUElDIGNsb2NrLCB3ZSBqdXN0IHdhbnQgdG8gZ2V0IHRoZQorCSAqIGNvdW50ZXIgcnVubmluZyBmb3IgY2FsaWJyYXRpb24uCisJICovCisJX19zZXR1cF9BUElDX0xWVFQoMTAwMDAwMDAwMCk7CisKKwkvKgorCSAqIFRoZSB0aW1lciBjaGlwIGNvdW50cyBkb3duIHRvIHplcm8uIExldCdzIHdhaXQKKwkgKiBmb3IgYSB3cmFwYXJvdW5kIHRvIHN0YXJ0IGV4YWN0IG1lYXN1cmVtZW50OgorCSAqICh0aGUgY3VycmVudCB0aWNrIG1pZ2h0IGhhdmUgYmVlbiBhbHJlYWR5IGhhbGYgZG9uZSkKKwkgKi8KKworCXdhaXRfdGltZXJfdGljaygpOworCisJLyoKKwkgKiBXZSB3cmFwcGVkIGFyb3VuZCBqdXN0IG5vdy4gTGV0J3Mgc3RhcnQ6CisJICovCisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHQxKTsKKwl0dDEgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisKKwkvKgorCSAqIExldCdzIHdhaXQgTE9PUFMgd3JhcHJvdW5kczoKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTE9PUFM7IGkrKykKKwkJd2FpdF90aW1lcl90aWNrKCk7CisKKwl0dDIgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHQyKTsKKworCS8qCisJICogVGhlIEFQSUMgYnVzIGNsb2NrIGNvdW50ZXIgaXMgMzIgYml0cyBvbmx5LCBpdAorCSAqIG1pZ2h0IGhhdmUgb3ZlcmZsb3duLCBidXQgbm90ZSB0aGF0IHdlIHVzZSBzaWduZWQKKwkgKiBsb25ncywgdGh1cyBubyBleHRyYSBjYXJlIG5lZWRlZC4KKwkgKgorCSAqIHVuZGVyZmxvd24gdG8gYmUgZXhhY3QsIGFzIHRoZSB0aW1lciBjb3VudHMgZG93biA7KQorCSAqLworCisJcmVzdWx0ID0gKHR0MS10dDIpKkFQSUNfRElWSVNPUi9MT09QUzsKKworCWlmIChjcHVfaGFzX3RzYykKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gQ1BVIGNsb2NrIHNwZWVkIGlzICIKKwkJCSIlbGQuJTA0bGQgTUh6LlxuIiwKKwkJCSgobG9uZykodDItdDEpL0xPT1BTKS8oMTAwMDAwMC9IWiksCisJCQkoKGxvbmcpKHQyLXQxKS9MT09QUyklKDEwMDAwMDAvSFopKTsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzICIKKwkJIiVsZC4lMDRsZCBNSHouXG4iLAorCQlyZXN1bHQvKDEwMDAwMDAvSFopLAorCQlyZXN1bHQlKDEwMDAwMDAvSFopKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25fcmVzdWx0OworCit2b2lkIF9faW5pdCBzZXR1cF9ib290X0FQSUNfY2xvY2sodm9pZCkKK3sKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJVc2luZyBsb2NhbCBBUElDIHRpbWVyIGludGVycnVwdHMuXG4iKTsKKwl1c2luZ19hcGljX3RpbWVyID0gMTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwljYWxpYnJhdGlvbl9yZXN1bHQgPSBjYWxpYnJhdGVfQVBJQ19jbG9jaygpOworCS8qCisJICogTm93IHNldCB1cCB0aGUgdGltZXIgZm9yIHJlYWwuCisJICovCisJc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQoreworCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKK30KKwordm9pZCBfX2luaXQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpCit7CisJaWYgKHVzaW5nX2FwaWNfdGltZXIpIHsKKwkJdW5zaWduZWQgbG9uZyB2OworCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl9Cit9CisKK3ZvaWQgZW5hYmxlX0FQSUNfdGltZXIodm9pZCkKK3sKKwlpZiAodXNpbmdfYXBpY190aW1lcikgeworCQl1bnNpZ25lZCBsb25nIHY7CisKKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHYgJiB+QVBJQ19MVlRfTUFTS0VEKTsKKwl9Cit9CisKKy8qCisgKiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBwcm9maWxpbmcgdGltZXIgY2FuIGJlIGNoYW5nZWQKKyAqIGJ5IHdyaXRpbmcgYSBtdWx0aXBsaWVyIHZhbHVlIGludG8gL3Byb2MvcHJvZmlsZS4KKyAqLworaW50IHNldHVwX3Byb2ZpbGluZ190aW1lcih1bnNpZ25lZCBpbnQgbXVsdGlwbGllcikKK3sKKwlpbnQgaTsKKworCS8qCisJICogU2FuaXR5IGNoZWNrLiBbYXQgbGVhc3QgNTAwIEFQSUMgY3ljbGVzIHNob3VsZCBiZQorCSAqIGJldHdlZW4gQVBJQyBpbnRlcnJ1cHRzIGFzIGEgcnVsZSBvZiB0aHVtYiwgdG8gYXZvaWQKKwkgKiBpcnFzIGZsb29kaW5nIHVzXQorCSAqLworCWlmICggKCFtdWx0aXBsaWVyKSB8fCAoY2FsaWJyYXRpb25fcmVzdWx0L211bHRpcGxpZXIgPCA1MDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIAorCSAqIFNldCB0aGUgbmV3IG11bHRpcGxpZXIgZm9yIGVhY2ggQ1BVLiBDUFVzIGRvbid0IHN0YXJ0IHVzaW5nIHRoZQorCSAqIG5ldyB2YWx1ZXMgdW50aWwgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0IGluIHdoaWNoIHRoZXkgZG8gcHJvY2VzcworCSAqIGFjY291bnRpbmcuIEF0IHRoYXQgdGltZSB0aGV5IGFsc28gYWRqdXN0IHRoZWlyIEFQSUMgdGltZXJzCisJICogYWNjb3JkaW5nbHkuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKKwkJcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGkpID0gbXVsdGlwbGllcjsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgQVBJQ19ESVZJU09SCisKKy8qCisgKiBMb2NhbCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKKyAqIHByb2Nlc3Mgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcuCisgKgorICogV2UgZG8gcHJvZmlsaW5nIGluIGV2ZXJ5IGxvY2FsIHRpY2ssIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nCisgKiBoYXBwZW4gb25seSBldmVyeSAncHJvZmlsaW5nIG11bHRpcGxpZXInIHRpY2tzLiBUaGUgZGVmYXVsdAorICogbXVsdGlwbGllciBpcyAxIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRoZSBuZXcgbXVsdGlwbGllcgorICogdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgorICovCisKK2lubGluZSB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJaWYgKC0tcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgbXVsdGlwbGllciBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290CisJCSAqIHRvIHRoaXMgcG9pbnQgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgd3JpdGluZyB0bworCQkgKiAvcHJvYy9wcm9maWxlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgdGhlIEFQSUMKKwkJICogdGltZXIgYWNjb3JkaW5nbHkuCisJCSAqCisJCSAqIEludGVycnVwdHMgYXJlIGFscmVhZHkgbWFza2VkIG9mZiBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPSBwZXJfY3B1KHByb2ZfbXVsdGlwbGllciwgY3B1KTsKKwkJaWYgKHBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpICE9CisJCQkJCXBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSkgeworCQkJX19zZXR1cF9BUElDX0xWVFQoCisJCQkJCWNhbGlicmF0aW9uX3Jlc3VsdC8KKwkJCQkJcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkpOworCQkJcGVyX2NwdShwcm9mX29sZF9tdWx0aXBsaWVyLCBjcHUpID0KKwkJCQkJCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpOworCQl9CisKKyNpZmRlZiBDT05GSUdfU01QCisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQorCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgorCSAqCisJICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCisJICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KKwkgKgorCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKKwkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgorCSAqLworfQorCisvKgorICogTG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQuIFRoaXMgaXMgdGhlIG1vc3QgbmF0dXJhbCB3YXkgZm9yIGRvaW5nCisgKiBsb2NhbCBpbnRlcnJ1cHRzLCBidXQgbG9jYWwgdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgZW11bGF0ZWQgYnkKKyAqIGJyb2FkY2FzdCBpbnRlcnJ1cHRzIHRvby4gW2luIGNhc2UgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCBBUElDIHRpbWVyc10KKyAqCisgKiBbIGlmIGEgc2luZ2xlLUNQVSBzeXN0ZW0gcnVucyBhbiBTTVAga2VybmVsIHRoZW4gd2UgY2FsbCB0aGUgbG9jYWwKKyAqICAgaW50ZXJydXB0IGFzIHdlbGwuIFRodXMgd2UgY2Fubm90IGlubGluZSB0aGUgbG9jYWwgaXJxIC4uLiBdCisgKi8KKworZmFzdGNhbGwgdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogdGhlIE5NSSBkZWFkbG9jay1kZXRlY3RvciB1c2VzIHRoaXMuCisJICovCisJcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXMrKzsKKworCS8qCisJICogTk9URSEgV2UnZCBiZXR0ZXIgQUNLIHRoZSBpcnEgaW1tZWRpYXRlbHksCisJICogYmVjYXVzZSB0aW1lciBoYW5kbGluZyBjYW4gYmUgc2xvdy4KKwkgKi8KKwlhY2tfQVBJQ19pcnEoKTsKKwkvKgorCSAqIHVwZGF0ZV9wcm9jZXNzX3RpbWVzKCkgZXhwZWN0cyB1cyB0byBoYXZlIGRvbmUgaXJxX2VudGVyKCkuCisJICogQmVzaWRlcywgaWYgd2UgZG9uJ3QgdGltZXIgaW50ZXJydXB0cyBpZ25vcmUgdGhlIGdsb2JhbAorCSAqIGludGVycnVwdCBsb2NrLCB3aGljaCBpcyB0aGUgV3JvbmdUaGluZyAodG0pIHRvIGRvLgorCSAqLworCWlycV9lbnRlcigpOworCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBfbmV2ZXJfIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLworZmFzdGNhbGwgdm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCWlycV9lbnRlcigpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYW5kIEFDSyBpdAorCSAqIGlmIGl0IGlzIGEgdmVjdG9yZWQgb25lLiAgSnVzdCBpbiBjYXNlLi4uCisJICogU3B1cmlvdXMgaW50ZXJydXB0cyBzaG91bGQgbm90IGJlIEFDS2VkLgorCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19JU1IgKyAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgfjB4MWYpID4+IDEpKTsKKwlpZiAodiAmICgxIDw8IChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MWYpKSkKKwkJYWNrX0FQSUNfaXJxKCk7CisKKwkvKiBzZWUgc3ctZGV2LW1hbiB2b2wgMywgY2hhcHRlciA3LjQuMTMuNSAqLworCXByaW50ayhLRVJOX0lORk8gInNwdXJpb3VzIEFQSUMgaW50ZXJydXB0IG9uIENQVSMlZCwgc2hvdWxkIG5ldmVyIGhhcHBlbi5cbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggb3VyIEFQSUMvU01QIGFyY2hpdGVjdHVyZQorICovCisKK2Zhc3RjYWxsIHZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHYsIHYxOworCisJaXJxX2VudGVyKCk7CisJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCXYxID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhY2tfQVBJQ19pcnEoKTsKKwlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKworCS8qIEhlcmUgaXMgd2hhdCB0aGUgQVBJQyBlcnJvciBiaXRzIG1lYW46CisJICAgMDogU2VuZCBDUyBlcnJvcgorCSAgIDE6IFJlY2VpdmUgQ1MgZXJyb3IKKwkgICAyOiBTZW5kIGFjY2VwdCBlcnJvcgorCSAgIDM6IFJlY2VpdmUgYWNjZXB0IGVycm9yCisJICAgNDogUmVzZXJ2ZWQKKwkgICA1OiBTZW5kIGlsbGVnYWwgdmVjdG9yCisJICAgNjogUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IKKwkgICA3OiBJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MKKwkqLworCXByaW50ayAoS0VSTl9ERUJVRyAiQVBJQyBlcnJvciBvbiBDUFUlZDogJTAybHgoJTAybHgpXG4iLAorCSAgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCB2ICwgdjEpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBUaGlzIGluaXRpYWxpemVzIHRoZSBJTy1BUElDIGFuZCBBUElDIGhhcmR3YXJlIGlmIHRoaXMgaXMKKyAqIGEgVVAga2VybmVsLgorICovCitpbnQgX19pbml0IEFQSUNfaW5pdF91bmlwcm9jZXNzb3IgKHZvaWQpCit7CisJaWYgKGVuYWJsZV9sb2NhbF9hcGljIDwgMCkKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCisJaWYgKCFzbXBfZm91bmRfY29uZmlnICYmICFjcHVfaGFzX2FwaWMpCisJCXJldHVybiAtMTsKKworCS8qCisJICogQ29tcGxhaW4gaWYgdGhlIEJJT1MgcHJldGVuZHMgdGhlcmUgaXMgb25lLgorCSAqLworCWlmICghY3B1X2hhc19hcGljICYmIEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2ZXJpZnlfbG9jYWxfQVBJQygpOworCisJY29ubmVjdF9ic3BfQVBJQygpOworCisJcGh5c19jcHVfcHJlc2VudF9tYXAgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKKworCXNldHVwX2xvY2FsX0FQSUMoKTsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWNoZWNrX25taV93YXRjaGRvZygpOworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChzbXBfZm91bmRfY29uZmlnKQorCQlpZiAoIXNraXBfaW9hcGljX3NldHVwICYmIG5yX2lvYXBpY3MpCisJCQlzZXR1cF9JT19BUElDKCk7CisjZW5kaWYKKwlzZXR1cF9ib290X0FQSUNfY2xvY2soKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2NDFhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTAsMCArMSwyNDI4IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIEFQTSBCSU9TIGRyaXZlciBmb3IgTGludXgKKyAqIENvcHlyaWdodCAxOTk0LTIwMDEgU3RlcGhlbiBSb3Rod2VsbCAoc2ZyQGNhbmIuYXV1Zy5vcmcuYXUpCisgKgorICogSW5pdGlhbCBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlciB3YXMgZnVuZGVkIGJ5IE5FQyBBdXN0cmFsaWEgUC9MCisgKglhbmQgTkVDIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9jdG9iZXIgMTk5NSwgUmlrIEZhaXRoIChmYWl0aEBjcy51bmMuZWR1KToKKyAqICAgIE1pbm9yIGVuaGFuY2VtZW50cyBhbmQgdXBkYXRlcyAodG8gdGhlIHBhdGNoIHNldCkgZm9yIDEuMy54CisgKiAgICBEb2N1bWVudGF0aW9uCisgKiBKYW51YXJ5IDE5OTYsIFJpayBGYWl0aCAoZmFpdGhAY3MudW5jLmVkdSk6CisgKiAgICBNYWtlIC9wcm9jL2FwbSBlYXN5IHRvIGZvcm1hdCAoYnVtcCBkcml2ZXIgdmVyc2lvbikKKyAqIE1hcmNoIDE5OTYsIFJpayBGYWl0aCAoZmFpdGhAY3MudW5jLmVkdSk6CisgKiAgICBQcm9oaWJpdCBBUE0gQklPUyBjYWxscyB1bmxlc3MgYXBtX2VuYWJsZWQuCisgKiAgICAoVGhhbmtzIHRvIFVscmljaCBXaW5kbCA8VWxyaWNoLldpbmRsQHJ6LnVuaS1yZWdlbnNidXJnLmRlPikKKyAqIEFwcmlsIDE5OTYsIFN0ZXBoZW4gUm90aHdlbGwgKHNmckBjYW5iLmF1dWcub3JnLmF1KQorICogICAgVmVyc2lvbiAxLjAgYW5kIDEuMQorICogTWF5IDE5OTYsIFZlcnNpb24gMS4yCisgKiBGZWIgMTk5OCwgVmVyc2lvbiAxLjMKKyAqIEZlYiAxOTk4LCBWZXJzaW9uIDEuNAorICogQXVnIDE5OTgsIFZlcnNpb24gMS41CisgKiBTZXAgMTk5OCwgVmVyc2lvbiAxLjYKKyAqIE5vdiAxOTk4LCBWZXJzaW9uIDEuNworICogSmFuIDE5OTksIFZlcnNpb24gMS44CisgKiBKYW4gMTk5OSwgVmVyc2lvbiAxLjkKKyAqIE9jdCAxOTk5LCBWZXJzaW9uIDEuMTAKKyAqIE5vdiAxOTk5LCBWZXJzaW9uIDEuMTEKKyAqIEphbiAyMDAwLCBWZXJzaW9uIDEuMTIKKyAqIEZlYiAyMDAwLCBWZXJzaW9uIDEuMTMKKyAqIE5vdiAyMDAwLCBWZXJzaW9uIDEuMTQKKyAqIE9jdCAyMDAxLCBWZXJzaW9uIDEuMTUKKyAqIEphbiAyMDAyLCBWZXJzaW9uIDEuMTYKKyAqIE9jdCAyMDAyLCBWZXJzaW9uIDEuMTZhYworICoKKyAqIEhpc3Rvcnk6CisgKiAgICAwLjZiOiBmaXJzdCB2ZXJzaW9uIGluIG9mZmljaWFsIGtlcm5lbCwgTGludXggMS4zLjQ2CisgKiAgICAwLjc6IGNoYW5nZWQgL3Byb2MvYXBtIGZvcm1hdCwgTGludXggMS4zLjU4CisgKiAgICAwLjg6IGZpeGVkIGdjYyAyLjcuWzEyXSBjb21waWxhdGlvbiBwcm9ibGVtcywgTGludXggMS4zLjU5CisgKiAgICAwLjk6IG9ubHkgY2FsbCBiaW9zIGlmIGJpb3MgaXMgcHJlc2VudCwgTGludXggMS4zLjcyCisgKiAgICAxLjA6IHVzZSBmaXhlZCBkZXZpY2UgbnVtYmVyLCBjb25zb2xpZGF0ZSAvcHJvYy9hcG0gaW50byB0aGlzIGZpbGUsCisgKiAgICAgICAgIExpbnV4IDEuMy44NQorICogICAgMS4xOiBzdXBwb3J0IHVzZXItc3BhY2Ugc3RhbmRieSBhbmQgc3VzcGVuZCwgcG93ZXIgb2ZmIGFmdGVyIHN5c3RlbQorICogICAgICAgICBoYWx0ZWQsIExpbnV4IDEuMy45OAorICogICAgMS4yOiBXaGVuIHJlc2V0dGluZyBSVEMgYWZ0ZXIgcmVzdW1lLCB0YWtlIGNhcmUgc28gdGhhdCB0aGUgdGltZQorICogICAgICAgICBpcyBvbmx5IGluY29ycmVjdCBieSAzMC02MG1TICh2cy4gMVMgcHJldmlvdXNseSkgKEdhYm9yIEouIFRvdGgKKyAqICAgICAgICAgPGp0b3RoQHByaW5jZXRvbi5lZHU+KTsgaW1wcm92ZSBpbnRlcmFjdGlvbiBiZXR3ZWVuCisgKiAgICAgICAgIHNjcmVlbi1ibGFua2luZyBhbmQgZ3BtIChTdGVwaGVuIFJvdGh3ZWxsKTsgTGludXggMS45OS40CisgKiAgICAxLjJhOlNpbXBsZSBjaGFuZ2UgdG8gc3RvcCBteXN0ZXJpb3VzIGJ1ZyByZXBvcnRzIHdpdGggU01QIGFsc28gYWRkZWQKKyAqCSAgIGxldmVscyB0byB0aGUgcHJpbnRrIGNhbGxzLiBBUE0gaXMgbm90IGRlZmluZWQgZm9yIFNNUCBtYWNoaW5lcy4KKyAqICAgICAgICAgVGhlIG5ldyByZXBsYWNtZW50IGZvciBpdCBpcywgYnV0IExpbnV4IGRvZXNuJ3QgeWV0IHN1cHBvcnQgdGhpcy4KKyAqICAgICAgICAgQWxhbiBDb3ggTGludXggMi4xLjU1CisgKiAgICAxLjM6IFNldCB1cCBhIHZhbGlkIGRhdGEgZGVzY3JpcHRvciAweDQwIGZvciBidWdneSBCSU9TJ3MKKyAqICAgIDEuNDogVXBncmFkZWQgdG8gc3VwcG9ydCBBUE0gMS4yLiBJbnRlZ3JhdGVkIFRoaW5rUGFkIHN1c3BlbmQgcGF0Y2ggYnkKKyAqICAgICAgICAgRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4uCisgKiAgICAgICAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiBMaW51eCAyLjEuODcKKyAqICAgIDEuNTogRml4IHNlZ21lbnQgcmVnaXN0ZXIgcmVsb2FkaW5nIChpbiBjYXNlIG9mIGJhZCBzZWdtZW50cyBzYXZlZAorICogICAgICAgICBhY3Jvc3MgQklPUyBjYWxsKS4KKyAqICAgICAgICAgU3RlcGhlbiBSb3Rod2VsbAorICogICAgMS42OiBDb3BlIHdpdGggY29tcGxpZXIvYXNzZW1ibGVyIGRpZmZlcmVuY2VzLgorICogICAgICAgICBPbmx5IHRyeSB0byB0dXJuIG9mZiB0aGUgZmlyc3QgZGlzcGxheSBkZXZpY2UuCisgKiAgICAgICAgIEZpeCBPT1BTIGF0IHBvd2VyIG9mZiB3aXRoIG5vIEFQTSBCSU9TIGJ5IEphbiBFY2h0ZXJuYWNoCisgKiAgICAgICAgICAgICAgICAgICA8ZWNodGVyQGluZm9ybWF0aWsudW5pLXJvc3RvY2suZGU+CisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuNzogTW9kaWZ5IGRyaXZlcidzIGNhY2hlZCBjb3B5IG9mIHRoZSBkaXNhYmxlZC9kaXNlbmdhZ2VkIGZsYWdzCisgKiAgICAgICAgIHRvIHJlZmxlY3QgY3VycmVudCBzdGF0ZSBvZiBBUE0gQklPUy4KKyAqICAgICAgICAgQ2hyaXMgUmFua2luIDxyYW5raW5jQGJlbGxzb3V0aC5uZXQ+CisgKiAgICAgICAgIFJlc2V0IGludGVycnVwdCAwIHRpbWVyIHRvIDEwMEh6IGFmdGVyIHN1c3BlbmQKKyAqICAgICAgICAgQ2hhZCBNaWxsZXIgPGNtaWxsZXJAc3VyZnNvdXRoLmNvbT4KKyAqICAgICAgICAgQWRkIENPTkZJR19BUE1fSUdOT1JFX1NVU1BFTkRfQk9VTkNFCisgKiAgICAgICAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICogICAgICAgICBBbGxvdyBib290IHRpbWUgZGlzYWJsaW5nIG9mIEFQTQorICogICAgICAgICBNYWtlIGJvb3QgbWVzc2FnZXMgZmFyIGxlc3MgdmVyYm9zZSBieSBkZWZhdWx0CisgKiAgICAgICAgIE1ha2UgYXNtIHNhZmVyCisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuODogQWRkIENPTkZJR19BUE1fUlRDX0lTX0dNVAorICogICAgICAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAqICAgICAgICAgY2hhbmdlIEFQTV9OT0lOVFMgdG8gQ09ORklHX0FQTV9BTExPV19JTlRTCisgKiAgICAgICAgIHJlbW92ZSBkZXBlbmRlbmN5IG9uIENPTkZJR19QUk9DX0ZTCisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuOTogRml4IHNtYWxsIHR5cG8uICA8bGFzbG9Ad29kaXAub3BvbGUucGw+CisgKiAgICAgICAgIFRyeSB0byBjb3BlIHdpdGggQklPUydzIHRoYXQgbmVlZCB0byBoYXZlIGFsbCBkaXNwbGF5CisgKiAgICAgICAgIGRldmljZXMgYmxhbmtlZCBhbmQgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4KKyAqICAgICAgICAgUm9zcyBQYXRlcnNvbiA8cm9zc0Bzb2kuY2l0eS5hYy51az4KKyAqICAgICAgICAgRml4IHNlZ21lbnQgbGltaXQgc2V0dGluZyBpdCBoYXMgYWx3YXlzIGJlZW4gd3JvbmcgYXMKKyAqICAgICAgICAgdGhlIHNlZ21lbnRzIG5lZWRlZCB0byBoYXZlIGJ5dGUgZ3JhbnVsYXJpdHkuCisgKiAgICAgICAgIE1hcmsgYSBmZXcgdGhpbmdzIF9faW5pdC4KKyAqICAgICAgICAgQWRkIGhhY2sgdG8gYWxsb3cgcG93ZXIgb2ZmIG9mIFNNUCBzeXN0ZW1zIGJ5IHBvcHVsYXIgcmVxdWVzdC4KKyAqICAgICAgICAgVXNlIENPTkZJR19TTVAgaW5zdGVhZCBvZiBfX1NNUF9fCisgKiAgICAgICAgIElnbm9yZSBCT1VOQ0VTIGZvciB0aHJlZSBzZWNvbmRzLgorICogICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKiAgIDEuMTA6IEZpeCBmb3IgVGhpbmtwYWQgcmV0dXJuIGNvZGUuCisgKiAgICAgICAgIE1lcmdlIDIuMiBhbmQgMi4zIGRyaXZlcnMuCisgKiAgICAgICAgIFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGFyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisgKiAgICAgICAgIFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGRyaXZlcnMvY2hhci9zeXNycS5jCisgKiAgICAgICAgIFJlc2V0IHRpbWUgYWNyb3NzIHN0YW5kYnkuCisgKiAgICAgICAgIEFsbG93IG1vcmUgaW5pdGl0aWFsaXNhdGlvbiBvbiBTTVAuCisgKiAgICAgICAgIFJlbW92ZSBDT05GSUdfQVBNX1BPV0VSX09GRiBhbmQgbWFrZSBpdCBib290IHRpbWUKKyAqICAgICAgICAgY29uZmlndXJhYmxlIChkZWZhdWx0IG9uKS4KKyAqICAgICAgICAgTWFrZSBkZWJ1ZyBvbmx5IGEgYm9vdCB0aW1lIHBhcmFtZXRlciAocmVtb3ZlIEFQTV9ERUJVRykuCisgKiAgICAgICAgIFRyeSB0byBibGFuayBhbGwgZGV2aWNlcyBvbiBhbnkgZXJyb3IuCisgKiAgIDEuMTE6IFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGRyaXZlcnMvY2hhci9jb25zb2xlLmMKKyAqICAgICAgICAgQ2hlY2sgbnJfcnVubmluZyB0byBkZXRlY3QgaWYgd2UgYXJlIGlkbGUgKGZyb20KKyAqICAgICAgICAgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAbGl4LnBvbHl0ZWNobmlxdWUuZnI+KQorICogICAgICAgICBGaXggZm9yIGJpb3NlcyB0aGF0IGRvbid0IHplcm8gdGhlIHRvcCBwYXJ0IG9mIHRoZQorICogICAgICAgICBlbnRyeXBvaW50IG9mZnNldCAoTWFyaW8gU2l0dGEgPHNpdHRhQGFsLnVuaXBtbi5pdD4pCisgKiAgICAgICAgIChyZXBvcnRlZCBieSBQYW5vcyBLYXRzYWxvdWxpcyA8dGVyYXNAd3JpdGVtZS5jb20+KS4KKyAqICAgICAgICAgUmVhbCBtb2RlIHBvd2VyIG9mZiBwYXRjaCAoV2FsdGVyIEhvZm1hbm4KKyAqICAgICAgICAgPFdhbHRlci5Ib2ZtYW5uQHBoeXNpay5zdHVkLnVuaS1lcmxhbmdlbi5kZT4pLgorICogICAxLjEyOiBSZW1vdmUgQ09ORklHX1NNUCBhcyB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZQorICogICAgICAgICB0aGUgY29kZSBhd2F5IGFueXdheSAoc21wX251bV9jcHVzID09IDEgaW4gVVApCisgKiAgICAgICAgIG5vdGVkIGJ5IEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4uCisgKiAgICAgICAgIE1ha2UgcG93ZXIgb2ZmIHVuZGVyIFNNUCB3b3JrIGFnYWluLgorICogICAgICAgICBGaXggdGhpbmtvIHdpdGggaW5pdGlhbCBlbmdhZ2luZyBvZiBCSU9TLgorICogICAgICAgICBNYWtlIHN1cmUgcG93ZXIgb2ZmIG9ubHkgaGFwcGVucyBvbiBDUFUgMAorICogICAgICAgICAoUGF1bCAiUnVzdHkiIFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4pLgorICogICAgICAgICBEbyBlcnJvciBub3RpZmljYXRpb24gdG8gdXNlciBtb2RlIGlmIEJJT1MgY2FsbHMgZmFpbC4KKyAqICAgICAgICAgTW92ZSBlbnRyeXBvaW50IG9mZnNldCBmaXggdG8gLi4uYm9vdC9zZXR1cC5TCisgKiAgICAgICAgIHdoZXJlIGl0IGJlbG9uZ3MgKENvc21vcyA8Z2lzODg1NjRAY2lzLm5jdHUuZWR1LnR3PikuCisgKiAgICAgICAgIFJlbW92ZSBzbXAtcG93ZXItb2ZmLiBTTVAgdXNlcnMgbXVzdCBub3cgc3BlY2lmeQorICogICAgICAgICAiYXBtPXBvd2VyLW9mZiIgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFN1Z2dlc3RlZAorICogICAgICAgICBieSBKaW0gQXZlcmEgPGppbWFAaGFsLmNvbT4sIG1vZGlmaWVkIGJ5IEFsYW4gQ294CisgKiAgICAgICAgIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+LgorICogICAgICAgICBSZWdpc3RlciB0aGUgL3Byb2MvYXBtIGVudHJ5IGV2ZW4gb24gU01QIHNvIHRoYXQKKyAqICAgICAgICAgc2NyaXB0cyB0aGF0IGNoZWNrIGZvciBpdCBiZWZvcmUgZG9pbmcgcG93ZXIgb2ZmCisgKiAgICAgICAgIHdvcmsgKEppbSBBdmVyYSA8amltYUBoYWwuY29tPikuCisgKiAgIDEuMTM6IENoYW5nZXMgZm9yIG5ldyBwbV8gaW50ZXJmYWNlcyAoQW5keSBIZW5yb2lkCisgKiAgICAgICAgIDxhbmR5X2hlbnJvaWRAeWFob28uY29tPikuCisgKiAgICAgICAgIE1vZHVsYXJpemUgdGhlIGNvZGUuCisgKiAgICAgICAgIEZpeCB0aGUgVGhpbmtwYWQgKGFnYWluKSA6LSggKENPTkZJR19BUE1fSUdOT1JFX01VTFRJUExFX1NVU1BFTkRTCisgKiAgICAgICAgIGlzIG5vdyB0aGUgd2F5IGxpZmUgd29ya3MpLgorICogICAgICAgICBGaXggdGhpbmtvIGluIHN1c3BlbmQoKSAod3JvbmcgcmV0dXJuKS4KKyAqICAgICAgICAgTm90aWZ5IGRyaXZlcnMgb24gY3JpdGljYWwgc3VzcGVuZC4KKyAqICAgICAgICAgTWFrZSBrYXBtZCBhYnNvcmIgbW9yZSBpZGxlIHRpbWUgKFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqICAgICAgICAgbW9kaWZpZWQgYnkgc2ZyKS4KKyAqICAgICAgICAgRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHdlIGFyZSBzdXNwZW5kZWQgKEFuZHkgSGVucm9pZAorICogICAgICAgICA8YW5keV9oZW5yb2lkQHlhaG9vLmNvbT4gZml4ZWQgYnkgc2ZyKS4KKyAqICAgICAgICAgTWFrZSBwb3dlciBvZmYgd29yayBvbiBTTVAgYWdhaW4gKFRvbnkgSG95bGUKKyAqICAgICAgICAgPHRtaEBtYWdlbnRhLWxvZ2ljLmNvbT4gYW5kIDx6bGF0a29AaXNrb24uaHI+KSBtb2RpZmllZCBieSBzZnIuCisgKiAgICAgICAgIFJlbW92ZSBDT05GSUdfQVBNX1NVU1BFTkRfQk9VTkNFLiAgVGhlIGJvdW5jZSBpZ25vcmUKKyAqICAgICAgICAgaW50ZXJ2YWwgaXMgbm93IGNvbmZpZ3VyYWJsZS4KKyAqICAgMS4xNDogTWFrZSBjb25uZWN0aW9uIHZlcnNpb24gcGVyc2lzdCBhY3Jvc3MgbW9kdWxlIHVubG9hZC9sb2FkLgorICogICAgICAgICBFbmFibGUgYW5kIGVuZ2FnZSBwb3dlciBtYW5hZ2VtZW50IGVhcmxpZXIuCisgKiAgICAgICAgIERpc2VuZ2FnZSBwb3dlciBtYW5hZ2VtZW50IG9uIG1vZHVsZSB1bmxvYWQuCisgKiAgICAgICAgIENoYW5nZWQgdG8gdXNlIHRoZSBzeXNycS1yZWdpc3RlciBoYWNrIGZvciByZWdpc3RlcmluZyB0aGUKKyAqICAgICAgICAgcG93ZXIgb2ZmIGZ1bmN0aW9uIGNhbGxlZCBieSBtYWdpYyBzeXNycSBiYXNlZCB1cG9uIGRpc2N1c3Npb25zCisgKiAgICAgICAgIGluIGlyYzovL2lyYy5vcGVucHJvamVjdHMubmV0LyNrZXJuZWxuZXdiaWVzCisgKiAgICAgICAgIChDcnV0Y2hlciBEdW5uYXZhbnQgPGNydXRjaGVyK2tlcm5lbEBkYXRhc3RhY2tzLmNvbT4pLgorICogICAgICAgICBNYWtlIENPTkZJR19BUE1fUkVBTF9NT0RFX1BPV0VSX09GRiBydW4gdGltZSBjb25maWd1cmFibGUuCisgKiAgICAgICAgIChBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4pIG1vZGlmaWVkIGJ5IHNmci4KKyAqICAgICAgICAgV29yayBhcm91bmQgYnl0ZSBzd2FwIGJ1ZyBpbiBvbmUgb2YgdGhlIFZhaW8ncyBCSU9TJ3MKKyAqICAgICAgICAgKE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPikuCisgKiAgICAgICAgIEV4cG9zZWQgdGhlIGRpc2FibGUgZmxhZyB0byBkbWkgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGtub3duCisgKiAgICAgICAgIGJyb2tlbiBBUE0gKEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+KS4KKyAqICAgMS4xNGFjOiBJZiB0aGUgQklPUyBzYXlzICJJIHNsb3dlZCB0aGUgQ1BVIGRvd24iIHRoZW4gZG9uJ3Qgc3BpbgorICogICAgICAgICBjYWxsaW5nIGl0IC0gaW5zdGVhZCBpZGxlLiAoQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4pCisgKiAgICAgICAgIElmIGFuIEFQTSBpZGxlIGZhaWxzIGxvZyBpdCBhbmQgaWRsZSBzZW5zaWJseQorICogICAxLjE1OiBEb24ndCBxdWV1ZSBldmVudHMgdG8gY2xpZW50cyB3aG8gb3BlbiB0aGUgZGV2aWNlIE9fV1JPTkxZLgorICogICAgICAgICBEb24ndCBleHBlY3QgcmVwbGllcyBmcm9tIGNsaWVudHMgd2hvIG9wZW4gdGhlIGRldmljZSBPX1JET05MWS4KKyAqICAgICAgICAgKElkZWEgZnJvbSBUaG9tYXMgSG9vZCkKKyAqICAgICAgICAgTWlub3Igd2FpdHF1ZXVlIGNsZWFudXBzLiAoSm9obiBGcmVtbGluIDxjaGllZkBiYW5kaXRzLm9yZz4pCisgKiAgIDEuMTY6IEZpeCBpZGxlIGNhbGxpbmcuIChBbmRyZWFzIFN0ZWlubWV0eiA8YXN0QGRvbWR2LmRlPiBldCBhbC4pCisgKiAgICAgICAgIE5vdGlmeSBsaXN0ZW5lcnMgb2Ygc3RhbmRieSBvciBzdXNwZW5kIGV2ZW50cyBiZWZvcmUgbm90aWZ5aW5nCisgKiAgICAgICAgIGRyaXZlcnMuIFJldHVybiBFQlVTWSB0byBpb2N0bCgpIGlmIHN1c3BlbmQgaXMgcmVqZWN0ZWQuCisgKiAgICAgICAgIChSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiBhbmQgVGhvbWFzIEhvb2QpCisgKiAgICAgICAgIElnbm9yZSBmaXJzdCByZXN1bWUgYWZ0ZXIgd2UgZ2VuZXJhdGUgb3VyIG93biByZXN1bWUgZXZlbnQKKyAqICAgICAgICAgYWZ0ZXIgYSBzdXNwZW5kIChUaG9tYXMgSG9vZCkKKyAqICAgICAgICAgRGFlbW9uaXplIG5vdyBnZXRzIHJpZCBvZiBvdXIgY29udHJvbGxpbmcgdGVybWluYWwgKHNmcikuCisgKiAgICAgICAgIENPTkZJR19BUE1fQ1BVX0lETEUgbm93IGp1c3QgYWZmZWN0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZgorICogICAgICAgICBpZGxlX3RocmVzaG9sZCAoc2ZyKS4KKyAqICAgICAgICAgQ2hhbmdlIG5hbWUgb2Yga2VybmVsIGFwbSBkYWVtb24gKGFzIGl0IG5vIGxvbmdlciBpZGxlcykgKHNmcikuCisgKiAgIDEuMTZhYzogRml4IHVwIFNNUCBzdXBwb3J0IHNvbWV3aGF0LiBZb3UgY2FuIG5vdyBmb3JjZSBTTVAgb24gYW5kIHdlCisgKgkgICBtYWtlIF9hbGxfIEFQTSBjYWxscyBvbiB0aGUgQ1BVIzAuIEZpeCB1bnNhZmUgc2lnbiBidWcuCisgKgkgICBUT0RPOiBkZXRlcm1pbmUgaWYgaXRzICJib290IENQVSIgb3IgIkNQVTAiIHdlIHdhbnQgdG8gbG9jayB0by4KKyAqCisgKiBBUE0gMS4xIFJlZmVyZW5jZToKKyAqCisgKiAgIEludGVsIENvcnBvcmF0aW9uLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQKKyAqICAgKEFQTSkgQklPUyBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gMS4xLCBTZXB0ZW1iZXIgMTk5My4KKyAqICAgSW50ZWwgT3JkZXIgTnVtYmVyIDI0MTcwNC0wMDEuICBNaWNyb3NvZnQgUGFydCBOdW1iZXIgNzgxLTExMC1YMDEuCisgKgorICogW1RoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGZyZWUgZnJvbSBJbnRlbCBieSBjYWxsaW5nIDgwMC42MjguODY4NiAoZmF4CisgKiA5MTYuMzU2LjYxMDApIG9yIDgwMC41NDguNDcyNTsgb3IgdmlhIGFub255bW91cyBmdHAgZnJvbQorICogZnRwOi8vZnRwLmludGVsLmNvbS9wdWIvSUFML3NvZnR3YXJlX3NwZWNzL2FwbXYxMS5kb2MuICBJdCBpcyBhbHNvCisgKiBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYnkgY2FsbGluZyAyMDYuODgyLjgwODAuXQorICoKKyAqIEFQTSAxLjIgUmVmZXJlbmNlOgorICogICBJbnRlbCBDb3Jwb3JhdGlvbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50CisgKiAgIChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMiwgRmVicnVhcnkgMTk5Ni4KKyAqCisgKiBbVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYXQ6CisgKiAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaHdkZXYvYnVzYmlvcy9hbXBfMTIuaHRtXQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorCitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKTsKK2V4dGVybiB2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FQTV9ESVNQTEFZX0JMQU5LKSAmJiBkZWZpbmVkKENPTkZJR19WVCkKK2V4dGVybiBpbnQgKCpjb25zb2xlX2JsYW5rX2hvb2spKGludCk7CisjZW5kaWYKKworLyoKKyAqIFRoZSBhcG1fYmlvcyBkZXZpY2UgaXMgb25lIG9mIHRoZSBtaXNjIGNoYXIgZGV2aWNlcy4KKyAqIFRoaXMgaXMgaXRzIG1pbm9yIG51bWJlci4KKyAqLworI2RlZmluZQlBUE1fTUlOT1JfREVWCTEzNAorCisvKgorICogU2VlIERvY3VtZW50YXRpb24vQ29uZmlnLmhlbHAgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgKgorICogVmFyaW91cyBvcHRpb25zIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QgdGltZSBhcyBmb2xsb3dzOgorICogKFdlIGFsbG93IHVuZGVyc2NvcmVzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG1vZHVsZXMgY29kZSkKKyAqCWFwbT1vbi9vZmYJCQllbmFibGUvZGlzYWJsZSBBUE0KKyAqCSAgICBbbm8tXWFsbG93Wy1fXWludHMJCWFsbG93IGludGVycnVwdHMgZHVyaW5nIEJJT1MgY2FsbHMKKyAqCSAgICBbbm8tXWJyb2tlblstX11wc3IJCUJJT1MgaGFzIGEgYnJva2VuIEdldFBvd2VyU3RhdHVzIGNhbGwKKyAqCSAgICBbbm8tXXJlYWxtb2RlWy1fXXBvd2VyWy1fXW9mZglzd2l0Y2ggdG8gcmVhbCBtb2RlIGJlZm9yZQorICoJICAgIAkJCQkJcG93ZXJpbmcgb2ZmCisgKgkgICAgW25vLV1kZWJ1ZwkJCWxvZyBzb21lIGRlYnVnZ2luZyBtZXNzYWdlcworICoJICAgIFtuby1dcG93ZXJbLV9db2ZmCQlwb3dlciBvZmYgb24gc2h1dGRvd24KKyAqCSAgICBbbm8tXXNtcAkJCVVzZSBhcG0gZXZlbiBvbiBhbiBTTVAgYm94CisgKgkgICAgYm91bmNlWy1fXWludGVydmFsPTxuPgludW1iZXIgb2YgdGlja3MgdG8gaWdub3JlIHN1c3BlbmQKKyAqCSAgICAJCQkJYm91bmNlcworICogICAgICAgICAgaWRsZVstX110aHJlc2hvbGQ9PG4+ICAgICAgIFN5c3RlbSBpZGxlIHBlcmNlbnRhZ2UgYWJvdmUgd2hpY2ggdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlIEFQTSBCSU9TIGlkbGUgY2FsbHMuIFNldCBpdCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCB0byBkaXNhYmxlLgorICogICAgICAgICAgaWRsZVstX11wZXJpb2Q9PG4+ICAgICAgICAgIFBlcmlvZCAoaW4gMS8xMDBzIG9mIGEgc2Vjb25kKSBvdmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGlkbGUgcGVyY2VudGFnZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWQuCisgKi8KKworLyogS05PV04gUFJPQkxFTSBNQUNISU5FUzoKKyAqCisgKiBVOiBUSSA0MDAwTSBUcmF2ZWxNYXRlOiBCSU9TIGlzICpOT1QqIEFQTSBjb21wbGlhbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFtDb25maXJtZWQgYnkgVEkgcmVwcmVzZW50YXRpdmVdCisgKiA/OiBBQ0VSIDQ4NkRYNC83NTogdXNlcyBkc2VnIDAwNDAsIGluIHZpb2xhdGlvbiBvZiBBUE0gc3BlY2lmaWNhdGlvbgorICogICAgICAgICAgICAgICAgICAgIFtDb25maXJtZWQgYnkgQklPUyBkaXNhc3NlbWJseV0KKyAqICAgICAgICAgICAgICAgICAgICBbVGhpcyBtYXkgd29yayBub3cgLi4uXQorICogUDogVG9zaGliYSAxOTUwUzogYmF0dGVyeSBsaWZlIGluZm9ybWF0aW9uIG9ubHkgZ2V0cyB1cGRhdGVkIGFmdGVyIHJlc3VtZQorICogUDogTWlkd2VzdCBNaWNybyBTb3VuZGJvb2sgRWxpdGUgRFgyLzY2IG1vbm9jaHJvbWU6IHNjcmVlbiBibGFua2luZworICogCWJyb2tlbiBpbiBCSU9TIFtSZXBvcnRlZCBieSBHYXJzdCBSLiBSZWVzZSA8cmVlc2VAaXNuLm5ldD5dCisgKiA/OiBBY2VyTm90ZS05NTA6IG9vcHMgb24gcmVhZGluZyAvcHJvYy9hcG0gLSB3b3JrYXJvdW5kIGlzIGEgV0lQCisgKiAJTmVhbGUgQmFua3MgPG5lYWxlQGxvd2VuZGFsZS5jb20uYXU+IERlY2VtYmVyIDIwMDAKKyAqCisgKiBMZWdlbmQ6IFUgPSB1bnVzYWJsZSB3aXRoIEFQTSBwYXRjaGVzCisgKiAgICAgICAgIFAgPSBwYXJ0aWFsbHkgdXNhYmxlIHdpdGggQVBNIHBhdGNoZXMKKyAqLworCisvKgorICogRGVmaW5lIGFzIDEgdG8gbWFrZSB0aGUgZHJpdmVyIGFsd2F5cyBjYWxsIHRoZSBBUE0gQklPUyBidXN5CisgKiByb3V0aW5lIGV2ZW4gaWYgdGhlIGNsb2NrIHdhcyBub3QgcmVwb3J0ZWQgYXMgc2xvd2VkIGJ5IHRoZQorICogaWRsZSByb3V0aW5lLiAgT3RoZXJ3aXNlLCBkZWZpbmUgYXMgMC4KKyAqLworI2RlZmluZSBBTFdBWVNfQ0FMTF9CVVNZICAgMQorCisvKgorICogRGVmaW5lIHRvIG1ha2UgdGhlIEFQTSBCSU9TIGNhbGxzIHplcm8gYWxsIGRhdGEgc2VnbWVudCByZWdpc3RlcnMgKHNvCisgKiB0aGF0IGFuIGluY29ycmVjdCBCSU9TIGltcGxlbWVudGF0aW9uIHdpbGwgY2F1c2UgYSBrZXJuZWwgcGFuaWMgaWYgaXQKKyAqIHRyaWVzIHRvIHdyaXRlIHRvIGFyYml0cmFyeSBtZW1vcnkpLgorICovCisjZGVmaW5lIEFQTV9aRVJPX1NFR1MKKworI2luY2x1ZGUgImFwbS5oIgorCisvKgorICogRGVmaW5lIHRvIG1ha2UgYWxsIF9zZXRfbGltaXQgY2FsbHMgdXNlIDY0ayBsaW1pdHMuICBUaGUgQVBNIDEuMSBCSU9TIGlzCisgKiBzdXBwb3NlZCB0byBwcm92aWRlIGxpbWl0IGluZm9ybWF0aW9uIHRoYXQgaXQgcmVjb2duaXplcy4gIE1hbnkgbWFjaGluZXMKKyAqIGRvIHRoaXMgY29ycmVjdGx5LCBidXQgbWFueSBvdGhlcnMgZG8gbm90IHJlc3RyaWN0IHRoZW1zZWx2ZXMgdG8gdGhlaXIKKyAqIGNsYWltZWQgbGltaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhleSB3aWxsIGNhdXNlIGEgc2VnbWVudGF0aW9uCisgKiB2aW9sYXRpb24gaW4gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuICBNb3N0IEJJT1MncywgaG93ZXZlciwgd2lsbAorICogcmVzcGVjdCBhIDY0ayBsaW1pdCwgc28gd2UgdXNlIHRoYXQuICBJZiB5b3Ugd2FudCB0byBiZSBwZWRhbnRpYyBhbmQKKyAqIGhvbGQgeW91ciBCSU9TIHRvIGl0cyBjbGFpbXMsIHRoZW4gdW5kZWZpbmUgdGhpcy4KKyAqLworI2RlZmluZSBBUE1fUkVMQVhfU0VHTUVOVFMKKworLyoKKyAqIERlZmluZSB0byByZS1pbml0aWFsaXplIHRoZSBpbnRlcnJ1cHQgMCB0aW1lciB0byAxMDAgSHogYWZ0ZXIgYSBzdXNwZW5kLgorICogVGhpcyBwYXRjaGVkIGJ5IENoYWQgTWlsbGVyIDxjbWlsbGVyQHN1cmZzb3V0aC5jb20+LCBvcmlnaW5hbCBjb2RlIGJ5CisgKiBEYXZpZCBDaGVuIDxjaGVuQGN0cGEwNC5taXQuZWR1PgorICovCisjdW5kZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECisKKyNpZmRlZiBJTklUX1RJTUVSX0FGVEVSX1NVU1BFTkQKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjZW5kaWYKKworLyoKKyAqIE5lZWQgdG8gcG9sbCB0aGUgQVBNIEJJT1MgZXZlcnkgc2Vjb25kCisgKi8KKyNkZWZpbmUgQVBNX0NIRUNLX1RJTUVPVVQJKEhaKQorCisvKgorICogSWdub3JlIHN1c3BlbmQgZXZlbnRzIGZvciB0aGlzIGFtb3VudCBvZiB0aW1lIGFmdGVyIGEgcmVzdW1lCisgKi8KKyNkZWZpbmUgREVGQVVMVF9CT1VOQ0VfSU5URVJWQUwJCSgzICogSFopCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgc3RvcmVkCisgKi8KKyNkZWZpbmUgQVBNX01BWF9FVkVOVFMJCTIwCisKKy8qCisgKiBUaGUgcGVyLWZpbGUgQVBNIGRhdGEKKyAqLworc3RydWN0IGFwbV91c2VyIHsKKwlpbnQJCW1hZ2ljOworCXN0cnVjdCBhcG1fdXNlciAqCW5leHQ7CisJaW50CQlzdXNlcjogMTsKKwlpbnQJCXdyaXRlcjogMTsKKwlpbnQJCXJlYWRlcjogMTsKKwlpbnQJCXN1c3BlbmRfd2FpdDogMTsKKwlpbnQJCXN1c3BlbmRfcmVzdWx0OworCWludAkJc3VzcGVuZHNfcGVuZGluZzsKKwlpbnQJCXN0YW5kYnlzX3BlbmRpbmc7CisJaW50CQlzdXNwZW5kc19yZWFkOworCWludAkJc3RhbmRieXNfcmVhZDsKKwlpbnQJCWV2ZW50X2hlYWQ7CisJaW50CQlldmVudF90YWlsOworCWFwbV9ldmVudF90CWV2ZW50c1tBUE1fTUFYX0VWRU5UU107Cit9OworCisvKgorICogVGhlIG1hZ2ljIG51bWJlciBpbiBhcG1fdXNlcgorICovCisjZGVmaW5lIEFQTV9CSU9TX01BR0lDCQkweDQxMDEKKworLyoKKyAqIGlkbGUgcGVyY2VudGFnZSBhYm92ZSB3aGljaCBiaW9zIGlkbGUgY2FsbHMgYXJlIGRvbmUKKyAqLworI2lmZGVmIENPTkZJR19BUE1fQ1BVX0lETEUKKyNkZWZpbmUgREVGQVVMVF9JRExFX1RIUkVTSE9MRAk5NQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9JRExFX1RIUkVTSE9MRAkxMDAKKyNlbmRpZgorI2RlZmluZSBERUZBVUxUX0lETEVfUEVSSU9ECSgxMDAgLyAzKQorCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CXNlZ21lbnQ7Cit9CQkJCWFwbV9iaW9zX2VudHJ5Oworc3RhdGljIGludAkJCWNsb2NrX3Nsb3dlZDsKK3N0YXRpYyBpbnQJCQlpZGxlX3RocmVzaG9sZCA9IERFRkFVTFRfSURMRV9USFJFU0hPTEQ7CitzdGF0aWMgaW50CQkJaWRsZV9wZXJpb2QgPSBERUZBVUxUX0lETEVfUEVSSU9EOworc3RhdGljIGludAkJCXNldF9wbV9pZGxlOworc3RhdGljIGludAkJCXN1c3BlbmRzX3BlbmRpbmc7CitzdGF0aWMgaW50CQkJc3RhbmRieXNfcGVuZGluZzsKK3N0YXRpYyBpbnQJCQlpZ25vcmVfc3lzX3N1c3BlbmQ7CitzdGF0aWMgaW50CQkJaWdub3JlX25vcm1hbF9yZXN1bWU7CitzdGF0aWMgaW50CQkJYm91bmNlX2ludGVydmFsID0gREVGQVVMVF9CT1VOQ0VfSU5URVJWQUw7CisKKyNpZmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKKyMJZGVmaW5lCWNsb2NrX2Ntb3NfZGlmZgkwCisjCWRlZmluZQlnb3RfY2xvY2tfZGlmZgkxCisjZWxzZQorc3RhdGljIGxvbmcJCQljbG9ja19jbW9zX2RpZmY7CitzdGF0aWMgaW50CQkJZ290X2Nsb2NrX2RpZmY7CisjZW5kaWYKK3N0YXRpYyBpbnQJCQlkZWJ1ZzsKK3N0YXRpYyBpbnQJCQlzbXA7CitzdGF0aWMgaW50CQkJYXBtX2Rpc2FibGVkID0gLTE7CisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGludAkJCXBvd2VyX29mZjsKKyNlbHNlCitzdGF0aWMgaW50CQkJcG93ZXJfb2ZmID0gMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUE1fUkVBTF9NT0RFX1BPV0VSX09GRgorc3RhdGljIGludAkJCXJlYWxtb2RlX3Bvd2VyX29mZiA9IDE7CisjZWxzZQorc3RhdGljIGludAkJCXJlYWxtb2RlX3Bvd2VyX29mZjsKKyNlbmRpZgorc3RhdGljIGludAkJCWV4aXRfa2FwbWQ7CitzdGF0aWMgaW50CQkJa2FwbWRfcnVubmluZzsKKyNpZmRlZiBDT05GSUdfQVBNX0FMTE9XX0lOVFMKK3N0YXRpYyBpbnQJCQlhbGxvd19pbnRzID0gMTsKKyNlbHNlCitzdGF0aWMgaW50CQkJYWxsb3dfaW50czsKKyNlbmRpZgorc3RhdGljIGludAkJCWJyb2tlbl9wc3I7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fd2FpdHF1ZXVlKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fc3VzcGVuZF93YWl0cXVldWUpOworc3RhdGljIHN0cnVjdCBhcG1fdXNlciAqCXVzZXJfbGlzdDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodXNlcl9saXN0X2xvY2spOworc3RhdGljIHN0cnVjdCBkZXNjX3N0cnVjdAliYWRfYmlvc19kZXNjID0geyAwLCAweDAwNDA5MjAwIH07CisKK3N0YXRpYyBjaGFyCQkJZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjE2YWMiOwkvKiBubyBzcGFjZXMgKi8KKworLyoKKyAqCUFQTSBldmVudCBuYW1lcyB0YWtlbiBmcm9tIHRoZSBBUE0gMS4yIHNwZWNpZmljYXRpb24uIFRoZXNlIGFyZQorICoJdGhlIG1lc3NhZ2UgY29kZXMgdGhhdCB0aGUgQklPUyB1c2VzIHRvIHRlbGwgdXMgYWJvdXQgZXZlbnRzCisgKi8KK3N0YXRpYyBjaGFyICoJYXBtX2V2ZW50X25hbWVbXSA9IHsKKwkic3lzdGVtIHN0YW5kYnkiLAorCSJzeXN0ZW0gc3VzcGVuZCIsCisJIm5vcm1hbCByZXN1bWUiLAorCSJjcml0aWNhbCByZXN1bWUiLAorCSJsb3cgYmF0dGVyeSIsCisJInBvd2VyIHN0YXR1cyBjaGFuZ2UiLAorCSJ1cGRhdGUgdGltZSIsCisJImNyaXRpY2FsIHN1c3BlbmQiLAorCSJ1c2VyIHN0YW5kYnkiLAorCSJ1c2VyIHN1c3BlbmQiLAorCSJzeXN0ZW0gc3RhbmRieSByZXN1bWUiLAorCSJjYXBhYmlsaXRpZXMgY2hhbmdlIgorfTsKKyNkZWZpbmUgTlJfQVBNX0VWRU5UX05BTUUJXAorCQkoc2l6ZW9mKGFwbV9ldmVudF9uYW1lKSAvIHNpemVvZihhcG1fZXZlbnRfbmFtZVswXSkpCisKK3R5cGVkZWYgc3RydWN0IGxvb2t1cF90IHsKKwlpbnQJa2V5OworCWNoYXIgKgltc2c7Cit9IGxvb2t1cF90OworCisvKgorICoJVGhlIEJJT1MgcmV0dXJucyBhIHNldCBvZiBzdGFuZGFyZCBlcnJvciBjb2RlcyBpbiBBWCB3aGVuIHRoZQorICoJY2FycnkgZmxhZyBpcyBzZXQuCisgKi8KKyAKK3N0YXRpYyBjb25zdCBsb29rdXBfdCBlcnJvcl90YWJsZVtdID0geworLyogTi9BCXsgQVBNX1NVQ0NFU1MsCQkiT3BlcmF0aW9uIHN1Y2NlZWRlZCIgfSwgKi8KKwl7IEFQTV9ESVNBQkxFRCwJCSJQb3dlciBtYW5hZ2VtZW50IGRpc2FibGVkIiB9LAorCXsgQVBNX0NPTk5FQ1RFRCwJIlJlYWwgbW9kZSBpbnRlcmZhY2UgYWxyZWFkeSBjb25uZWN0ZWQiIH0sCisJeyBBUE1fTk9UX0NPTk5FQ1RFRCwJIkludGVyZmFjZSBub3QgY29ubmVjdGVkIiB9LAorCXsgQVBNXzE2X0NPTk5FQ1RFRCwJIjE2IGJpdCBpbnRlcmZhY2UgYWxyZWFkeSBjb25uZWN0ZWQiIH0sCisvKiBOL0EJeyBBUE1fMTZfVU5TVVBQT1JURUQsCSIxNiBiaXQgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQiIH0sICovCisJeyBBUE1fMzJfQ09OTkVDVEVELAkiMzIgYml0IGludGVyZmFjZSBhbHJlYWR5IGNvbm5lY3RlZCIgfSwKKwl7IEFQTV8zMl9VTlNVUFBPUlRFRCwJIjMyIGJpdCBpbnRlcmZhY2Ugbm90IHN1cHBvcnRlZCIgfSwKKwl7IEFQTV9CQURfREVWSUNFLAkiVW5yZWNvZ25pemVkIGRldmljZSBJRCIgfSwKKwl7IEFQTV9CQURfUEFSQU0sCSJQYXJhbWV0ZXIgb3V0IG9mIHJhbmdlIiB9LAorCXsgQVBNX05PVF9FTkdBR0VELAkiSW50ZXJmYWNlIG5vdCBlbmdhZ2VkIiB9LAorCXsgQVBNX0JBRF9GVU5DVElPTiwgICAgICJGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorCXsgQVBNX1JFU1VNRV9ESVNBQkxFRCwJIlJlc3VtZSB0aW1lciBkaXNhYmxlZCIgfSwKKwl7IEFQTV9CQURfU1RBVEUsCSJVbmFibGUgdG8gZW50ZXIgcmVxdWVzdGVkIHN0YXRlIiB9LAorLyogTi9BCXsgQVBNX05PX0VWRU5UUywJIk5vIGV2ZW50cyBwZW5kaW5nIiB9LCAqLworCXsgQVBNX05PX0VSUk9SLAkJIkJJT1MgZGlkIG5vdCBzZXQgYSByZXR1cm4gY29kZSIgfSwKKwl7IEFQTV9OT1RfUFJFU0VOVCwJIk5vIEFQTSBwcmVzZW50IiB9Cit9OworI2RlZmluZSBFUlJPUl9DT1VOVAkoc2l6ZW9mKGVycm9yX3RhYmxlKS9zaXplb2YobG9va3VwX3QpKQorCisvKioKKyAqCWFwbV9lcnJvcgktCWRpc3BsYXkgYW4gQVBNIGVycm9yCisgKglAc3RyOiBpbmZvcm1hdGlvbiBzdHJpbmcKKyAqCUBlcnI6IEFQTSBCSU9TIHJldHVybiBjb2RlCisgKgorICoJV3JpdGUgYSBtZWFuaW5nZnVsIGxvZyBlbnRyeSB0byB0aGUga2VybmVsIGxvZyBpbiB0aGUgZXZlbnQgb2YKKyAqCWFuIEFQTSBlcnJvci4KKyAqLworIAorc3RhdGljIHZvaWQgYXBtX2Vycm9yKGNoYXIgKnN0ciwgaW50IGVycikKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBFUlJPUl9DT1VOVDsgaSsrKQorCQlpZiAoZXJyb3JfdGFibGVbaV0ua2V5ID09IGVycikgYnJlYWs7CisJaWYgKGkgPCBFUlJPUl9DT1VOVCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06ICVzOiAlc1xuIiwgc3RyLCBlcnJvcl90YWJsZVtpXS5tc2cpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06ICVzOiB1bmtub3duIGVycm9yIGNvZGUgJSMyLjJ4XG4iLAorCQkJc3RyLCBlcnIpOworfQorCisvKgorICogTG9jayBBUE0gZnVuY3Rpb25hbGl0eSB0byBwaHlzaWNhbCBDUFUgMAorICovCisgCisjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgY3B1bWFza190IGFwbV9zYXZlX2NwdXModm9pZCkKK3sKKwljcHVtYXNrX3QgeCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwkvKiBTb21lIGJpb3NlcyBkb24ndCBsaWtlIGJlaW5nIGNhbGxlZCBmcm9tIENQVSAhPSAwICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFwbV9yZXN0b3JlX2NwdXMoY3B1bWFza190IG1hc2spCit7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBtYXNrKTsKK30KKworI2Vsc2UKKworLyoKKyAqCU5vIENQVSBsb2NrZG93biBuZWVkZWQgb24gYSB1bmlwcm9jZXNzb3IKKyAqLworIAorI2RlZmluZSBhcG1fc2F2ZV9jcHVzKCkJCShjdXJyZW50LT5jcHVzX2FsbG93ZWQpCisjZGVmaW5lIGFwbV9yZXN0b3JlX2NwdXMoeCkJKHZvaWQpKHgpCisKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlIHRoZSBhY3R1YWwgQklPUyBjYWxscy4gIERlcGVuZGluZyBvbiBBUE1fWkVST19TRUdTIGFuZAorICogYXBtX2luZm8uYWxsb3dfaW50cywgd2UgYXJlIGJlaW5nIHJlYWxseSBwYXJhbm9pZCBoZXJlISAgTm90IG9ubHkKKyAqIGFyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLCBidXQgYWxsIHRoZSBzZWdtZW50IHJlZ2lzdGVycyAoZXhjZXB0IFNTKQorICogYXJlIHNhdmVkIGFuZCB6ZXJvZWQgdGhpcyBtZWFucyB0aGF0IGlmIHRoZSBCSU9TIHRyaWVzIHRvIHJlZmVyZW5jZQorICogYW55IGRhdGEgd2l0aG91dCBleHBsaWNpdGx5IGxvYWRpbmcgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzLCB0aGUga2VybmVsCisgKiB3aWxsIGZhdWx0IGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGhhdmUgc29tZSB1bmZvcmVzZWVuIGNpcmN1bXN0YW5jZXMKKyAqIGZvciB0aGUgcmVzdCBvZiB0aGUga2VybmVsLiAgQW5kIGl0IHdpbGwgYmUgdmVyeSBvYnZpb3VzISAgOi0pIERvaW5nCisgKiB0aGlzIGRlcGVuZHMgb24gQ1MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHBoeXNpY2FsIG1lbW9yeSBhcyBEUyBzbyB0aGF0CisgKiBEUyBjYW4gYmUgemVyb2VkIGJlZm9yZSB0aGUgY2FsbC4gVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgZG8gYW55dGhpbmcKKyAqIGFib3V0IHRoZSBzdGFjayBzZWdtZW50L3BvaW50ZXIuICBBbHNvLCB3ZSB0ZWxsIHRoZSBjb21waWxlciB0aGF0CisgKiBldmVyeXRoaW5nIGNvdWxkIGNoYW5nZS4KKyAqCisgKiBBbHNvLCB3ZSBLTk9XIHRoYXQgZm9yIHRoZSBub24gZXJyb3IgY2FzZSBvZiBhcG1fYmlvc19jYWxsLCB0aGVyZQorICogaXMgbm8gdXNlZnVsIGRhdGEgcmV0dXJuZWQgaW4gdGhlIGxvdyBvcmRlciA4IGJpdHMgb2YgZWF4LgorICovCisjZGVmaW5lIEFQTV9ET19DTEkJXAorCWlmIChhcG1faW5mby5hbGxvd19pbnRzKSBcCisJCWxvY2FsX2lycV9lbmFibGUoKTsgXAorCWVsc2UgXAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisjaWZkZWYgQVBNX1pFUk9fU0VHUworIwlkZWZpbmUgQVBNX0RFQ0xfU0VHUyBcCisJCXVuc2lnbmVkIGludCBzYXZlZF9mczsgdW5zaWduZWQgaW50IHNhdmVkX2dzOworIwlkZWZpbmUgQVBNX0RPX1NBVkVfU0VHUyBcCisJCXNhdmVzZWdtZW50KGZzLCBzYXZlZF9mcyk7IHNhdmVzZWdtZW50KGdzLCBzYXZlZF9ncykKKyMJZGVmaW5lIEFQTV9ET19SRVNUT1JFX1NFR1MgXAorCQlsb2Fkc2VnbWVudChmcywgc2F2ZWRfZnMpOyBsb2Fkc2VnbWVudChncywgc2F2ZWRfZ3MpCisjZWxzZQorIwlkZWZpbmUgQVBNX0RFQ0xfU0VHUworIwlkZWZpbmUgQVBNX0RPX1NBVkVfU0VHUworIwlkZWZpbmUgQVBNX0RPX1JFU1RPUkVfU0VHUworI2VuZGlmCisKKy8qKgorICoJYXBtX2Jpb3NfY2FsbAktCU1ha2UgYW4gQVBNIEJJT1MgMzJiaXQgY2FsbAorICoJQGZ1bmM6IEFQTSBmdW5jdGlvbiB0byBleGVjdXRlCisgKglAZWJ4X2luOiBFQlggcmVnaXN0ZXIgZm9yIGNhbGwgZW50cnkKKyAqCUBlY3hfaW46IEVDWCByZWdpc3RlciBmb3IgY2FsbCBlbnRyeQorICoJQGVheDogRUFYIHJlZ2lzdGVyIHJldHVybgorICoJQGVieDogRUJYIHJlZ2lzdGVyIHJldHVybgorICoJQGVjeDogRUNYIHJlZ2lzdGVyIHJldHVybgorICoJQGVkeDogRURYIHJlZ2lzdGVyIHJldHVybgorICoJQGVzaTogRVNJIHJlZ2lzdGVyIHJldHVybgorICoKKyAqCU1ha2UgYW4gQVBNIGNhbGwgdXNpbmcgdGhlIDMyYml0IHByb3RlY3RlZCBtb2RlIGludGVyZmFjZS4gVGhlCisgKgljYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGtub3dpbmcgaWYgQVBNIEJJT1MgaXMgY29uZmlndXJlZCBhbmQKKyAqCWVuYWJsZWQuIFRoaXMgY2FsbCBjYW4gZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciBhIGxvbmcgcGVyaW9kIG9mCisgKgl0aW1lIG9uIHNvbWUgbGFwdG9wcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgaW4gQUggYW5kIHRoZSBjYXJyeQorICoJZmxhZyBpcyBsb2FkZWQgaW50byBBTC4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHRoZSBlcnJvcgorICoJY29kZSBpcyByZXR1cm5lZCBpbiBBSCAoYml0cyA4LTE1IG9mIGVheCkgYW5kIHRoaXMgZnVuY3Rpb24KKyAqCXJldHVybnMgbm9uLXplcm8uCisgKi8KKyAKK3N0YXRpYyB1OCBhcG1fYmlvc19jYWxsKHUzMiBmdW5jLCB1MzIgZWJ4X2luLCB1MzIgZWN4X2luLAorCXUzMiAqZWF4LCB1MzIgKmVieCwgdTMyICplY3gsIHUzMiAqZWR4LCB1MzIgKmVzaSkKK3sKKwlBUE1fREVDTF9TRUdTCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJY3B1bWFza190CQljcHVzOworCWludAkJCWNwdTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QJc2F2ZV9kZXNjXzQwOworCisJY3B1cyA9IGFwbV9zYXZlX2NwdXMoKTsKKwkKKwljcHUgPSBnZXRfY3B1KCk7CisJc2F2ZV9kZXNjXzQwID0gcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpWzB4NDAgLyA4XTsKKwlwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdID0gYmFkX2Jpb3NfZGVzYzsKKworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCUFQTV9ET19DTEk7CisJQVBNX0RPX1NBVkVfU0VHUzsKKwlhcG1fYmlvc19jYWxsX2FzbShmdW5jLCBlYnhfaW4sIGVjeF9pbiwgZWF4LCBlYngsIGVjeCwgZWR4LCBlc2kpOworCUFQTV9ET19SRVNUT1JFX1NFR1M7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVsweDQwIC8gOF0gPSBzYXZlX2Rlc2NfNDA7CisJcHV0X2NwdSgpOworCWFwbV9yZXN0b3JlX2NwdXMoY3B1cyk7CisJCisJcmV0dXJuICplYXggJiAweGZmOworfQorCisvKioKKyAqCWFwbV9iaW9zX2NhbGxfc2ltcGxlCS0JbWFrZSBhIHNpbXBsZSBBUE0gQklPUyAzMmJpdCBjYWxsCisgKglAZnVuYzogQVBNIGZ1bmN0aW9uIHRvIGludm9rZQorICoJQGVieF9pbjogRUJYIHJlZ2lzdGVyIHZhbHVlIGZvciBCSU9TIGNhbGwKKyAqCUBlY3hfaW46IEVDWCByZWdpc3RlciB2YWx1ZSBmb3IgQklPUyBjYWxsCisgKglAZWF4OiBFQVggcmVnaXN0ZXIgb24gcmV0dXJuIGZyb20gdGhlIEJJT1MgY2FsbAorICoKKyAqCU1ha2UgYSBCSU9TIGNhbGwgdGhhdCBkb2VzIG9ubHkgcmV0dXJucyBvbmUgdmFsdWUsIG9yIGp1c3Qgc3RhdHVzLgorICoJSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgaW4gQUgKKyAqCShiaXRzIDgtMTUgb2YgZWF4KSBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvLiBUaGlzIGlzCisgKgl1c2VkIGZvciBzaW1wbGVyIEJJT1Mgb3BlcmF0aW9ucy4gVGhpcyBjYWxsIG1heSBob2xkIGludGVycnVwdHMKKyAqCW9mZiBmb3IgYSBsb25nIHRpbWUgb24gc29tZSBsYXB0b3BzLgorICovCisKK3N0YXRpYyB1OCBhcG1fYmlvc19jYWxsX3NpbXBsZSh1MzIgZnVuYywgdTMyIGVieF9pbiwgdTMyIGVjeF9pbiwgdTMyICplYXgpCit7CisJdTgJCQllcnJvcjsKKwlBUE1fREVDTF9TRUdTCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJY3B1bWFza190CQljcHVzOworCWludAkJCWNwdTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QJc2F2ZV9kZXNjXzQwOworCisKKwljcHVzID0gYXBtX3NhdmVfY3B1cygpOworCQorCWNwdSA9IGdldF9jcHUoKTsKKwlzYXZlX2Rlc2NfNDAgPSBwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdOworCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVsweDQwIC8gOF0gPSBiYWRfYmlvc19kZXNjOworCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJQVBNX0RPX0NMSTsKKwlBUE1fRE9fU0FWRV9TRUdTOworCWVycm9yID0gYXBtX2Jpb3NfY2FsbF9zaW1wbGVfYXNtKGZ1bmMsIGVieF9pbiwgZWN4X2luLCBlYXgpOworCUFQTV9ET19SRVNUT1JFX1NFR1M7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCV9fZ2V0X2NwdV92YXIoY3B1X2dkdF90YWJsZSlbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOworCXB1dF9jcHUoKTsKKwlhcG1fcmVzdG9yZV9jcHVzKGNwdXMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglhcG1fZHJpdmVyX3ZlcnNpb24JLQlBUE0gZHJpdmVyIHZlcnNpb24KKyAqCUB2YWw6CWxvYWRlZCB3aXRoIHRoZSBBUE0gdmVyc2lvbiBvbiByZXR1cm4KKyAqCisgKglSZXRyaWV2ZSB0aGUgQVBNIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBCSU9TLiBUaGlzIGlzIG9ubHkKKyAqCXN1cHBvcnRlZCBmb3IgQVBNIDEuMSBvciBoaWdoZXIuIEFuIGVycm9yIGluZGljYXRlcyBBUE0gMS4wIGlzCisgKglwcm9iYWJseSBwcmVzZW50LgorICoKKyAqCU9uIGVudHJ5IHZhbCBzaG91bGQgcG9pbnQgdG8gYSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBBUE0gZHJpdmVyCisgKgl2ZXJzaW9uIHdpdGggdGhlIGhpZ2ggYnl0ZSBiZWluZyB0aGUgbWFqb3IgYW5kIHRoZSBsb3cgYnl0ZSB0aGUKKyAqCW1pbm9yIG51bWJlciBib3RoIGluIEJDRAorICoKKyAqCU9uIHJldHVybiBpdCB3aWxsIGhvbGQgdGhlIEJJT1MgcmV2aXNpb24gc3VwcG9ydGVkIGluIHRoZQorICoJc2FtZSBmb3JtYXQuCisgKi8KKworc3RhdGljIGludCBhcG1fZHJpdmVyX3ZlcnNpb24odV9zaG9ydCAqdmFsKQoreworCXUzMgllYXg7CisKKwlpZiAoYXBtX2Jpb3NfY2FsbF9zaW1wbGUoQVBNX0ZVTkNfVkVSU0lPTiwgMCwgKnZhbCwgJmVheCkpCisJCXJldHVybiAoZWF4ID4+IDgpICYgMHhmZjsKKwkqdmFsID0gZWF4OworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworLyoqCisgKglhcG1fZ2V0X2V2ZW50CS0JZ2V0IGFuIEFQTSBldmVudCBmcm9tIHRoZSBCSU9TCisgKglAZXZlbnQ6IHBvaW50ZXIgdG8gdGhlIGV2ZW50CisgKglAaW5mbzogcG9pbnQgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uCisgKgorICoJVGhlIEFQTSBCSU9TIHByb3ZpZGVzIGEgcG9sbGVkIGluZm9ybWF0aW9uIGZvciBldmVudAorICoJcmVwb3J0aW5nLiBUaGUgQklPUyBleHBlY3RzIHRvIGJlIHBvbGxlZCBhdCBsZWFzdCBldmVyeSBzZWNvbmQKKyAqCXdoZW4gZXZlbnRzIGFyZSBwZW5kaW5nLiBXaGVuIGEgbWVzc2FnZSBpcyBmb3VuZCB0aGUgY2FsbGVyIHNob3VsZAorICoJcG9sbCB1bnRpbCBubyBtb3JlIG1lc3NhZ2VzIGFyZSBwcmVzZW50LiAgSG93ZXZlciwgdGhpcyBjYXVzZXMKKyAqCXByb2JsZW1zIG9uIHNvbWUgbGFwdG9wcyB3aGVyZSBhIHN1c3BlbmQgZXZlbnQgbm90aWZpY2F0aW9uIGlzCisgKglub3QgY2xlYXJlZCB1bnRpbCBpdCBpcyBhY2tub3dsZWRnZWQuCisgKgorICoJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgaW5mbyBwb2ludGVyLCBwcm92aWRpbmcKKyAqCXRoYXQgQVBNIDEuMiBpcyBpbiB1c2UuIElmIG5vIG1lc3NnZXMgYXJlIHBlbmRpbmcgdGhlIHZhbHVlIDB4ODAKKyAqCWlzIHJldHVybmVkIChObyBwb3dlciBtYW5hZ2VtZW50IGV2ZW50cyBwZW5kaW5nKS4KKyAqLworIAorc3RhdGljIGludCBhcG1fZ2V0X2V2ZW50KGFwbV9ldmVudF90ICpldmVudCwgYXBtX2V2ZW50aW5mb190ICppbmZvKQoreworCXUzMgllYXg7CisJdTMyCWVieDsKKwl1MzIJZWN4OworCXUzMglkdW1teTsKKworCWlmIChhcG1fYmlvc19jYWxsKEFQTV9GVU5DX0dFVF9FVkVOVCwgMCwgMCwgJmVheCwgJmVieCwgJmVjeCwKKwkJCSZkdW1teSwgJmR1bW15KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCSpldmVudCA9IGVieDsKKwlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uIDwgMHgwMTAyKQorCQkqaW5mbyA9IH4wOyAvKiBpbmRpY2F0ZSBpbmZvIG5vdCB2YWxpZCAqLworCWVsc2UKKwkJKmluZm8gPSBlY3g7CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorCisvKioKKyAqCXNldF9wb3dlcl9zdGF0ZQktCXNldCB0aGUgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZQorICoJQHdoYXQ6IHdoaWNoIGl0ZW1zIHRvIHRyYW5zaXRpb24KKyAqCUBzdGF0ZTogc3RhdGUgdG8gdHJhbnNpdGlvbiB0bworICoKKyAqCVJlcXVlc3QgYW4gQVBNIGNoYW5nZSBvZiBzdGF0ZSBmb3Igb25lIG9yIG1vcmUgc3lzdGVtIGRldmljZXMuIFRoZQorICoJcHJvY2Vzc29yIHN0YXRlIG11c3QgYmUgdHJhbnNpdGlvbmVkIGxhc3Qgb2YgYWxsLiB3aGF0IGhvbGRzIHRoZQorICoJY2xhc3Mgb2YgZGV2aWNlIGluIHRoZSB1cHBlciBieXRlIGFuZCB0aGUgZGV2aWNlIG51bWJlciAoMHhGRiBmb3IKKyAqCWFsbCkgZm9yIHRoZSBvYmplY3QgdG8gYmUgdHJhbnNpdGlvbmVkLgorICoKKyAqCVRoZSBzdGF0ZSBob2xkcyB0aGUgc3RhdGUgdG8gdHJhbnNpdGlvbiB0bywgd2hpY2ggbWF5IGluIGZhY3QKKyAqCWJlIGFuIGFjY2VwdGFuY2Ugb2YgYSBCSU9TIHJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2V0X3Bvd2VyX3N0YXRlKHVfc2hvcnQgd2hhdCwgdV9zaG9ydCBzdGF0ZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX1NFVF9TVEFURSwgd2hhdCwgc3RhdGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorCisvKioKKyAqCXNldF9zeXN0ZW1fcG93ZXJfc3RhdGUgLSBzZXQgc3lzdGVtIHdpZGUgcG93ZXIgc3RhdGUKKyAqCUBzdGF0ZTogd2hpY2ggc3RhdGUgdG8gZW50ZXIKKyAqCisgKglUcmFuc2l0aW9uIHRoZSBlbnRpcmUgc3lzdGVtIGludG8gYSBuZXcgQVBNIHBvd2VyIHN0YXRlLgorICovCisgCitzdGF0aWMgaW50IHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUodV9zaG9ydCBzdGF0ZSkKK3sKKwlyZXR1cm4gc2V0X3Bvd2VyX3N0YXRlKEFQTV9ERVZJQ0VfQUxMLCBzdGF0ZSk7Cit9CisKKy8qKgorICoJYXBtX2RvX2lkbGUJLQlwZXJmb3JtIHBvd2VyIHNhdmluZworICoKKyAqCVRoaXMgZnVuY3Rpb24gbm90aWZpZXMgdGhlIEJJT1MgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIChpbiB0aGUgdmlldworICoJb2YgdGhlIE9TKSBpZGxlLiBJdCByZXR1cm5zIC0xIGluIHRoZSBldmVudCB0aGF0IHRoZSBCSU9TIHJlZnVzZXMKKyAqCXRvIGhhbmRsZSB0aGUgaWRsZSByZXF1ZXN0LiBPbiBhIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgMQorICoJaWYgdGhlIEJJT1MgZGlkIGNsb2NrIHNsb3dpbmcgb3IgMCBvdGhlcndpc2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2RvX2lkbGUodm9pZCkKK3sKKwl1MzIJZWF4OworCisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0lETEUsIDAsIDAsICZlYXgpKSB7CisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIHQ7CisKKwkJLyogVGhpcyBhbHdheXMgZmFpbHMgb24gc29tZSBTTVAgYm9hcmRzIHJ1bm5pbmcgVVAga2VybmVscy4KKwkJICogT25seSByZXBvcnQgdGhlIGZhaWx1cmUgdGhlIGZpcnN0IDUgdGltZXMuCisJCSAqLworCQlpZiAoKyt0IDwgNSkKKwkJeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbV9kb19pZGxlIGZhaWxlZCAoJWQpXG4iLAorCQkJCQkoZWF4ID4+IDgpICYgMHhmZik7CisJCQl0ID0gamlmZmllczsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCWNsb2NrX3Nsb3dlZCA9IChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0lETEVfU0xPV1NfQ0xPQ0spICE9IDA7CisJcmV0dXJuIGNsb2NrX3Nsb3dlZDsKK30KKworLyoqCisgKglhcG1fZG9fYnVzeQktCWluZm9ybSB0aGUgQklPUyB0aGUgQ1BVIGlzIGJ1c3kKKyAqCisgKglSZXF1ZXN0IHRoYXQgdGhlIEJJT1MgYnJpbmdzIHRoZSBDUFUgYmFjayB0byBmdWxsIHBlcmZvcm1hbmNlLiAKKyAqLworIAorc3RhdGljIHZvaWQgYXBtX2RvX2J1c3kodm9pZCkKK3sKKwl1MzIJZHVtbXk7CisKKwlpZiAoY2xvY2tfc2xvd2VkIHx8IEFMV0FZU19DQUxMX0JVU1kpIHsKKwkJKHZvaWQpIGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0JVU1ksIDAsIDAsICZkdW1teSk7CisJCWNsb2NrX3Nsb3dlZCA9IDA7CisJfQorfQorCisvKgorICogSWYgbm8gcHJvY2VzcyBoYXMgcmVhbGx5IGJlZW4gaW50ZXJlc3RlZCBpbgorICogdGhlIENQVSBmb3Igc29tZSB0aW1lLCB3ZSB3YW50IHRvIGNhbGwgQklPUworICogcG93ZXIgbWFuYWdlbWVudCAtIHdlIHByb2JhYmx5IHdhbnQKKyAqIHRvIGNvbnNlcnZlIHBvd2VyLgorICovCisjZGVmaW5lIElETEVfQ0FMQ19MSU1JVCAgIChIWiAqIDEwMCkKKyNkZWZpbmUgSURMRV9MRUFLWV9NQVggICAgMTYKKworc3RhdGljIHZvaWQgKCpvcmlnaW5hbF9wbV9pZGxlKSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCisvKioKKyAqIGFwbV9jcHVfaWRsZQkJLQljcHUgaWRsaW5nIGZvciBBUE0gY2FwYWJsZSBMaW51eAorICoKKyAqIFRoaXMgaXMgdGhlIGlkbGluZyBmdW5jdGlvbiB0aGUga2VybmVsIGV4ZWN1dGVzIHdoZW4gQVBNIGlzIGF2YWlsYWJsZS4gSXQgCisgKiB0cmllcyB0byBkbyBCSU9TIHBvd2VybWFuYWdlbWVudCBiYXNlZCBvbiB0aGUgYXZlcmFnZSBzeXN0ZW0gaWRsZSB0aW1lLgorICogRnVydGhlcm1vcmUgaXQgY2FsbHMgdGhlIHN5c3RlbSBkZWZhdWx0IGlkbGUgcm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZCBhcG1fY3B1X2lkbGUodm9pZCkKK3sKKwlzdGF0aWMgaW50IHVzZV9hcG1faWRsZTsgLyogPSAwICovCisJc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2ppZmZpZXM7IC8qID0gMCAqLworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9zdGltZTsgLyogPSAwICovCisKKwlpbnQgYXBtX2lkbGVfZG9uZSA9IDA7CisJdW5zaWduZWQgaW50IGppZmZpZXNfc2luY2VfbGFzdF9jaGVjayA9IGppZmZpZXMgLSBsYXN0X2ppZmZpZXM7CisJdW5zaWduZWQgaW50IGJ1Y2tldDsKKworcmVjYWxjOgorCWlmIChqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2sgPiBJRExFX0NBTENfTElNSVQpIHsKKwkJdXNlX2FwbV9pZGxlID0gMDsKKwkJbGFzdF9qaWZmaWVzID0gamlmZmllczsKKwkJbGFzdF9zdGltZSA9IGN1cnJlbnQtPnN0aW1lOworCX0gZWxzZSBpZiAoamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID4gaWRsZV9wZXJpb2QpIHsKKwkJdW5zaWduZWQgaW50IGlkbGVfcGVyY2VudGFnZTsKKworCQlpZGxlX3BlcmNlbnRhZ2UgPSBjdXJyZW50LT5zdGltZSAtIGxhc3Rfc3RpbWU7CisJCWlkbGVfcGVyY2VudGFnZSAqPSAxMDA7CisJCWlkbGVfcGVyY2VudGFnZSAvPSBqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2s7CisJCXVzZV9hcG1faWRsZSA9IChpZGxlX3BlcmNlbnRhZ2UgPiBpZGxlX3RocmVzaG9sZCk7CisJCWlmIChhcG1faW5mby5mb3JiaWRfaWRsZSkKKwkJCXVzZV9hcG1faWRsZSA9IDA7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJCWxhc3Rfc3RpbWUgPSBjdXJyZW50LT5zdGltZTsKKwl9CisKKwlidWNrZXQgPSBJRExFX0xFQUtZX01BWDsKKworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJaWYgKHVzZV9hcG1faWRsZSkgeworCQkJdW5zaWduZWQgaW50IHQ7CisKKwkJCXQgPSBqaWZmaWVzOworCQkJc3dpdGNoIChhcG1fZG9faWRsZSgpKSB7CisJCQljYXNlIDA6IGFwbV9pZGxlX2RvbmUgPSAxOworCQkJCWlmICh0ICE9IGppZmZpZXMpIHsKKwkJCQkJaWYgKGJ1Y2tldCkgeworCQkJCQkJYnVja2V0ID0gSURMRV9MRUFLWV9NQVg7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoYnVja2V0KSB7CisJCQkJCWJ1Y2tldC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDE6IGFwbV9pZGxlX2RvbmUgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLyogQklPUyByZWZ1c2VkICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG9yaWdpbmFsX3BtX2lkbGUpCisJCQlvcmlnaW5hbF9wbV9pZGxlKCk7CisJCWVsc2UKKwkJCWRlZmF1bHRfaWRsZSgpOworCQlqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2sgPSBqaWZmaWVzIC0gbGFzdF9qaWZmaWVzOworCQlpZiAoamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID4gaWRsZV9wZXJpb2QpCisJCQlnb3RvIHJlY2FsYzsKKwl9CisKKwlpZiAoYXBtX2lkbGVfZG9uZSkKKwkJYXBtX2RvX2J1c3koKTsKK30KKworLyoqCisgKglhcG1fcG93ZXJfb2ZmCS0JYXNrIHRoZSBCSU9TIHRvIHBvd2VyIG9mZgorICoKKyAqCUhhbmRsZSB0aGUgcG93ZXIgb2ZmIHNlcXVlbmNlLiBUaGlzIGlzIHRoZSBvbmUgcGllY2Ugb2YgY29kZSB3ZQorICoJd2lsbCBleGVjdXRlIGV2ZW4gb24gU01QIG1hY2hpbmVzLiBJbiBvcmRlciB0byBkZWFsIHdpdGggQklPUworICoJYnVncyB3ZSBzdXBwb3J0IHJlYWwgbW9kZSBBUE0gQklPUyBwb3dlciBvZmYgY2FsbHMuIFdlIGFsc28gbWFrZQorICoJdGhlIFNNUCBjYWxsIG9uIENQVTAgYXMgc29tZSBzeXN0ZW1zIHdpbGwgb25seSBob25vdXIgdGhpcyBjYWxsCisgKglvbiB0aGVpciBmaXJzdCBjcHUuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFwbV9wb3dlcl9vZmYodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyCXBvX2Jpb3NfY2FsbFtdID0geworCQkweGI4LCAweDAwLCAweDEwLAkvKiBtb3Z3ICAkMHgxMDAwLGF4ICAqLworCQkweDhlLCAweGQwLAkJLyogbW92dyAgYXgsc3MgICAgICAgKi8KKwkJMHhiYywgMHgwMCwgMHhmMCwJLyogbW92dyAgJDB4ZjAwMCxzcCAgKi8KKwkJMHhiOCwgMHgwNywgMHg1MywJLyogbW92dyAgJDB4NTMwNyxheCAgKi8KKwkJMHhiYiwgMHgwMSwgMHgwMCwJLyogbW92dyAgJDB4MDAwMSxieCAgKi8KKwkJMHhiOSwgMHgwMywgMHgwMCwJLyogbW92dyAgJDB4MDAwMyxjeCAgKi8KKwkJMHhjZCwgMHgxNQkJLyogaW50ICAgJDB4MTUgICAgICAgKi8KKwl9OworCisJLyoKKwkgKiBUaGlzIG1heSBiZSBjYWxsZWQgb24gYW4gU01QIG1hY2hpbmUuCisJICovCisjaWZkZWYgQ09ORklHX1NNUAorCS8qIFNvbWUgYmlvc2VzIGRvbid0IGxpa2UgYmVpbmcgY2FsbGVkIGZyb20gQ1BVICE9IDAgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KDApKTsKKwlCVUdfT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApOworI2VuZGlmCisJaWYgKGFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZikKKwl7CisJCSh2b2lkKWFwbV9zYXZlX2NwdXMoKTsKKwkJbWFjaGluZV9yZWFsX3Jlc3RhcnQocG9fYmlvc19jYWxsLCBzaXplb2YocG9fYmlvc19jYWxsKSk7CisJfQorCWVsc2UKKwkJKHZvaWQpIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX09GRik7Cit9CisKKyNpZmRlZiBDT05GSUdfQVBNX0RPX0VOQUJMRQorCisvKioKKyAqCWFwbV9lbmFibGVfcG93ZXJfbWFuYWdlbWVudCAtIGVuYWJsZSBCSU9TIEFQTSBwb3dlciBtYW5hZ2VtZW50CisgKglAZW5hYmxlOiBlbmFibGUgeWVzL25vCisgKgorICoJRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQTSBCSU9TIHBvd2VyIHNlcnZpY2VzLiAKKyAqLworIAorc3RhdGljIGludCBhcG1fZW5hYmxlX3Bvd2VyX21hbmFnZW1lbnQoaW50IGVuYWJsZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKChlbmFibGUgPT0gMCkgJiYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKSkKKwkJcmV0dXJuIEFQTV9OT1RfRU5HQUdFRDsKKwlpZiAoYXBtX2Jpb3NfY2FsbF9zaW1wbGUoQVBNX0ZVTkNfRU5BQkxFX1BNLCBBUE1fREVWSUNFX0JBTEwsCisJCQllbmFibGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJaWYgKGVuYWJsZSkKKwkJYXBtX2luZm8uYmlvcy5mbGFncyAmPSB+QVBNX0JJT1NfRElTQUJMRUQ7CisJZWxzZQorCQlhcG1faW5mby5iaW9zLmZsYWdzIHw9IEFQTV9CSU9TX0RJU0FCTEVEOworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKioKKyAqCWFwbV9nZXRfcG93ZXJfc3RhdHVzCS0JZ2V0IGN1cnJlbnQgcG93ZXIgc3RhdGUKKyAqCUBzdGF0dXM6IHJldHVybmVkIHN0YXR1cworICoJQGJhdDogYmF0dGVyeSBpbmZvCisgKglAbGlmZTogZXN0aW1hdGVkIGxpZmUKKyAqCisgKglPYnRhaW4gdGhlIGN1cnJlbnQgcG93ZXIgc3RhdHVzIGZyb20gdGhlIEFQTSBCSU9TLiBXZSByZXR1cm4gYQorICoJc3RhdHVzIHdoaWNoIGdpdmVzIHRoZSByb3VnaCBiYXR0ZXJ5IHN0YXR1cywgYW5kIGN1cnJlbnQgcG93ZXIKKyAqCXNvdXJjZS4gVGhlIGJhdCB2YWx1ZSByZXR1cm5lZCBnaXZlIGFuIGVzdGltYXRlIGFzIGEgcGVyY2VudGFnZQorICoJb2YgbGlmZSBhbmQgYSBzdGF0dXMgdmFsdWUgZm9yIHRoZSBiYXR0ZXJ5LiBUaGUgZXN0aW1hdGVkIGxpZmUKKyAqCWlmIHJlcG9ydGVkIGlzIGEgbGlmZXRpbWUgaW4gc2Vjb2RuZHMvbWludXRlcyBhdCBjdXJyZW50IHBvd3dlcgorICoJY29uc3VtcHRpb24uCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2dldF9wb3dlcl9zdGF0dXModV9zaG9ydCAqc3RhdHVzLCB1X3Nob3J0ICpiYXQsIHVfc2hvcnQgKmxpZmUpCit7CisJdTMyCWVheDsKKwl1MzIJZWJ4OworCXUzMgllY3g7CisJdTMyCWVkeDsKKwl1MzIJZHVtbXk7CisKKwlpZiAoYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4pCisJCXJldHVybiBBUE1fMzJfVU5TVVBQT1JURUQ7CisJaWYgKGFwbV9iaW9zX2NhbGwoQVBNX0ZVTkNfR0VUX1NUQVRVUywgQVBNX0RFVklDRV9BTEwsIDAsCisJCQkmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4LCAmZHVtbXkpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJKnN0YXR1cyA9IGVieDsKKwkqYmF0ID0gZWN4OworCWlmIChhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX3N3YWJpbm1pbnV0ZXMpIHsKKwkJKmxpZmUgPSBzd2FiMTYoKHUxNillZHgpOworCQkqbGlmZSB8PSAweDgwMDA7CisJfSBlbHNlCisJCSpsaWZlID0gZWR4OworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgYXBtX2dldF9iYXR0ZXJ5X3N0YXR1cyh1X3Nob3J0IHdoaWNoLCB1X3Nob3J0ICpzdGF0dXMsCisJCQkJICB1X3Nob3J0ICpiYXQsIHVfc2hvcnQgKmxpZmUsIHVfc2hvcnQgKm5iYXQpCit7CisJdTMyCWVheDsKKwl1MzIJZWJ4OworCXUzMgllY3g7CisJdTMyCWVkeDsKKwl1MzIJZXNpOworCisJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA8IDB4MDEwMikgeworCQkvKiBwcmV0ZW5kIHdlIG9ubHkgaGF2ZSBvbmUgYmF0dGVyeS4gKi8KKwkJaWYgKHdoaWNoICE9IDEpCisJCQlyZXR1cm4gQVBNX0JBRF9ERVZJQ0U7CisJCSpuYmF0ID0gMTsKKwkJcmV0dXJuIGFwbV9nZXRfcG93ZXJfc3RhdHVzKHN0YXR1cywgYmF0LCBsaWZlKTsKKwl9CisKKwlpZiAoYXBtX2Jpb3NfY2FsbChBUE1fRlVOQ19HRVRfU1RBVFVTLCAoMHg4MDAwIHwgKHdoaWNoKSksIDAsICZlYXgsCisJCQkmZWJ4LCAmZWN4LCAmZWR4LCAmZXNpKSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCSpzdGF0dXMgPSBlYng7CisJKmJhdCA9IGVjeDsKKwkqbGlmZSA9IGVkeDsKKwkqbmJhdCA9IGVzaTsKKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqCisgKglhcG1fZW5nYWdlX3Bvd2VyX21hbmFnZW1lbnQJLQllbmFibGUgUE0gb24gYSBkZXZpY2UKKyAqCUBkZXZpY2U6IGlkZW50aXR5IG9mIGRldmljZQorICoJQGVuYWJsZTogb24vb2ZmCisgKgorICoJQWN0aXZhdGUgb3IgZGVhY3RpdmUgcG93ZXIgbWFuYWdlbWVudCBvbiBlaXRoZXIgYSBzcGVjaWZpYyBkZXZpY2UKKyAqCW9yIHRoZSBlbnRpcmUgc3lzdGVtICglQVBNX0RFVklDRV9BTEwpLgorICovCisgCitzdGF0aWMgaW50IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudCh1X3Nob3J0IGRldmljZSwgaW50IGVuYWJsZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKChlbmFibGUgPT0gMCkgJiYgKGRldmljZSA9PSBBUE1fREVWSUNFX0FMTCkKKwkgICAgJiYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNBQkxFRCkpCisJCXJldHVybiBBUE1fRElTQUJMRUQ7CisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0VOR0FHRV9QTSwgZGV2aWNlLCBlbmFibGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJaWYgKGRldmljZSA9PSBBUE1fREVWSUNFX0FMTCkgeworCQlpZiAoZW5hYmxlKQorCQkJYXBtX2luZm8uYmlvcy5mbGFncyAmPSB+QVBNX0JJT1NfRElTRU5HQUdFRDsKKwkJZWxzZQorCQkJYXBtX2luZm8uYmlvcy5mbGFncyB8PSBBUE1fQklPU19ESVNFTkdBR0VEOworCX0KKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCisKKy8qKgorICoJYXBtX2NvbnNvbGVfYmxhbmsJLQlibGFuayB0aGUgZGlzcGxheQorICoJQGJsYW5rOiBvbi9vZmYKKyAqCisgKglBdHRlbXB0IHRvIGJsYW5rIHRoZSBjb25zb2xlLCBmaXJzdGx5IGJ5IGJsYW5raW5nIGp1c3QgdmlkZW8gZGV2aWNlCisgKgl6ZXJvLCBhbmQgaWYgdGhhdCBmYWlscyAoc29tZSBCSU9TZXMgZG9uJ3Qgc3VwcG9ydCBpdCkgdGhlbiBpdCBibGFua3MKKyAqCWFsbCB2aWRlbyBkZXZpY2VzLiBUeXBpY2FsbHkgdGhlIEJJT1Mgd2lsbCBkbyBsYXB0b3AgYmFja2xpZ2h0IGFuZAorICoJbW9uaXRvciBwb3dlcmRvd24gZm9yIHVzLgorICovCisgCitzdGF0aWMgaW50IGFwbV9jb25zb2xlX2JsYW5rKGludCBibGFuaykKK3sKKwlpbnQJZXJyb3I7CisJdV9zaG9ydAlzdGF0ZTsKKworCXN0YXRlID0gYmxhbmsgPyBBUE1fU1RBVEVfU1RBTkRCWSA6IEFQTV9TVEFURV9SRUFEWTsKKwkvKiBCbGFuayB0aGUgZmlyc3QgZGlzcGxheSBkZXZpY2UgKi8KKwllcnJvciA9IHNldF9wb3dlcl9zdGF0ZSgweDEwMCwgc3RhdGUpOworCWlmICgoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpICYmIChlcnJvciAhPSBBUE1fTk9fRVJST1IpKSB7CisJCS8qIHRyeSB0byBibGFuayB0aGVtIGFsbCBpbnN0ZWFkICovCisJCWVycm9yID0gc2V0X3Bvd2VyX3N0YXRlKDB4MWZmLCBzdGF0ZSk7CisJCWlmICgoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpICYmIChlcnJvciAhPSBBUE1fTk9fRVJST1IpKQorCQkJLyogdHJ5IHRvIGJsYW5rIGRldmljZSBvbmUgaW5zdGVhZCAqLworCQkJZXJyb3IgPSBzZXRfcG93ZXJfc3RhdGUoMHgxMDEsIHN0YXRlKTsKKwl9CisJaWYgKChlcnJvciA9PSBBUE1fU1VDQ0VTUykgfHwgKGVycm9yID09IEFQTV9OT19FUlJPUikpCisJCXJldHVybiAxOworCWlmIChlcnJvciA9PSBBUE1fTk9UX0VOR0FHRUQpIHsKKwkJc3RhdGljIGludCB0cmllZDsKKwkJaW50IGVuZ19lcnJvcjsKKwkJaWYgKHRyaWVkKysgPT0gMCkgeworCQkJZW5nX2Vycm9yID0gYXBtX2VuZ2FnZV9wb3dlcl9tYW5hZ2VtZW50KEFQTV9ERVZJQ0VfQUxMLCAxKTsKKwkJCWlmIChlbmdfZXJyb3IpIHsKKwkJCQlhcG1fZXJyb3IoInNldCBkaXNwbGF5IiwgZXJyb3IpOworCQkJCWFwbV9lcnJvcigiZW5nYWdlIGludGVyZmFjZSIsIGVuZ19lcnJvcik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gYXBtX2NvbnNvbGVfYmxhbmsoYmxhbmspOworCQl9CisJfQorCWFwbV9lcnJvcigic2V0IGRpc3BsYXkiLCBlcnJvcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBxdWV1ZV9lbXB0eShzdHJ1Y3QgYXBtX3VzZXIgKmFzKQoreworCXJldHVybiBhcy0+ZXZlbnRfaGVhZCA9PSBhcy0+ZXZlbnRfdGFpbDsKK30KKworc3RhdGljIGFwbV9ldmVudF90IGdldF9xdWV1ZWRfZXZlbnQoc3RydWN0IGFwbV91c2VyICphcykKK3sKKwlhcy0+ZXZlbnRfdGFpbCA9IChhcy0+ZXZlbnRfdGFpbCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJcmV0dXJuIGFzLT5ldmVudHNbYXMtPmV2ZW50X3RhaWxdOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCwgc3RydWN0IGFwbV91c2VyICpzZW5kZXIpCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisKKwlzcGluX2xvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlpZiAodXNlcl9saXN0ID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZvciAoYXMgPSB1c2VyX2xpc3Q7IGFzICE9IE5VTEw7IGFzID0gYXMtPm5leHQpIHsKKwkJaWYgKChhcyA9PSBzZW5kZXIpIHx8ICghYXMtPnJlYWRlcikpCisJCQljb250aW51ZTsKKwkJYXMtPmV2ZW50X2hlYWQgPSAoYXMtPmV2ZW50X2hlYWQgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCQlpZiAoYXMtPmV2ZW50X2hlYWQgPT0gYXMtPmV2ZW50X3RhaWwpIHsKKwkJCXN0YXRpYyBpbnQgbm90aWZpZWQ7CisKKwkJCWlmIChub3RpZmllZCsrID09IDApCisJCQkgICAgcHJpbnRrKEtFUk5fRVJSICJhcG06IGFuIGV2ZW50IHF1ZXVlIG92ZXJmbG93ZWRcbiIpOworCQkJYXMtPmV2ZW50X3RhaWwgPSAoYXMtPmV2ZW50X3RhaWwgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCQl9CisJCWFzLT5ldmVudHNbYXMtPmV2ZW50X2hlYWRdID0gZXZlbnQ7CisJCWlmICgoIWFzLT5zdXNlcikgfHwgKCFhcy0+d3JpdGVyKSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgQVBNX1NZU19TVVNQRU5EOgorCQljYXNlIEFQTV9VU0VSX1NVU1BFTkQ6CisJCQlhcy0+c3VzcGVuZHNfcGVuZGluZysrOworCQkJc3VzcGVuZHNfcGVuZGluZysrOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fU1lTX1NUQU5EQlk6CisJCWNhc2UgQVBNX1VTRVJfU1RBTkRCWToKKwkJCWFzLT5zdGFuZGJ5c19wZW5kaW5nKys7CisJCQlzdGFuZGJ5c19wZW5kaW5nKys7CisJCQlicmVhazsKKwkJfQorCX0KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwbV93YWl0cXVldWUpOworb3V0OgorCXNwaW5fdW5sb2NrKCZ1c2VyX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90aW1lKHZvaWQpCit7CisJaWYgKGdvdF9jbG9ja19kaWZmKSB7CS8qIE11c3Qga25vdyB0aW1lIHpvbmUgaW4gb3JkZXIgdG8gc2V0IGNsb2NrICovCisJCXh0aW1lLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKSArIGNsb2NrX2Ntb3NfZGlmZjsKKwkJeHRpbWUudHZfbnNlYyA9IDA7IAorCX0gCit9CisKK3N0YXRpYyB2b2lkIGdldF90aW1lX2RpZmYodm9pZCkKK3sKKyNpZm5kZWYgQ09ORklHX0FQTV9SVENfSVNfR01UCisJLyoKKwkgKiBFc3RpbWF0ZSB0aW1lIHpvbmUgc28gdGhhdCBzZXRfdGltZSBjYW4gdXBkYXRlIHRoZSBjbG9jaworCSAqLworCWNsb2NrX2Ntb3NfZGlmZiA9IC1nZXRfY21vc190aW1lKCk7CisJY2xvY2tfY21vc19kaWZmICs9IGdldF9zZWNvbmRzKCk7CisJZ290X2Nsb2NrX2RpZmYgPSAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlaW5pdF90aW1lcih2b2lkKQoreworI2lmZGVmIElOSVRfVElNRVJfQUZURVJfU1VTUEVORAorCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJLyogc2V0IHRoZSBjbG9jayB0byAxMDAgSHogKi8KKwlvdXRiX3AoMHgzNCwgUElUX01PREUpOwkJLyogYmluYXJ5LCBtb2RlIDIsIExTQi9NU0IsIGNoIDAgKi8KKwl1ZGVsYXkoMTApOworCW91dGJfcChMQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwl1ZGVsYXkoMTApOworCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CS8qIE1TQiAqLworCXVkZWxheSgxMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZChpbnQgdmV0b2FibGUpCit7CisJaW50CQllcnI7CisJc3RydWN0IGFwbV91c2VyCSphczsKKworCWlmIChwbV9zZW5kX2FsbChQTV9TVVNQRU5ELCAodm9pZCAqKTMpKSB7CisJCS8qIFZldG9lZCAqLworCQlpZiAodmV0b2FibGUpIHsKKwkJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkKKwkJCQlzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9SRUpFQ1QpOworCQkJZXJyID0gLUVCVVNZOworCQkJaWdub3JlX3N5c19zdXNwZW5kID0gMDsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFwbTogc3VzcGVuZCB3YXMgdmV0b2VkLlxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwcmludGsoS0VSTl9DUklUICJhcG06IHN1c3BlbmQgd2FzIHZldG9lZCwgYnV0IHN1c3BlbmRpbmcgYW55d2F5LlxuIik7CisJfQorCisJZGV2aWNlX3N1c3BlbmQoUE1TR19TVVNQRU5EKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwkvKiBwcm90ZWN0IGFnYWluc3QgYWNjZXNzIHRvIHRpbWVyIGNoaXAgcmVnaXN0ZXJzICovCisJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKworCWdldF90aW1lX2RpZmYoKTsKKwkvKgorCSAqIElycSBzcGlubG9jayBtdXN0IGJlIGRyb3BwZWQgYXJvdW5kIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUuCisJICogV2UnbGwgdW5kbyBhbnkgdGltZXIgY2hhbmdlcyBkdWUgdG8gaW50ZXJydXB0cyBiZWxvdy4KKwkgKi8KKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOworCWVyciA9IHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX1NVU1BFTkQpOworCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisJcmVpbml0X3RpbWVyKCk7CisJc2V0X3RpbWUoKTsKKwlpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9IDE7CisKKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCWlmIChlcnIgPT0gQVBNX05PX0VSUk9SKQorCQllcnIgPSBBUE1fU1VDQ0VTUzsKKwlpZiAoZXJyICE9IEFQTV9TVUNDRVNTKQorCQlhcG1fZXJyb3IoInN1c3BlbmQiLCBlcnIpOworCWVyciA9IChlcnIgPT0gQVBNX1NVQ0NFU1MpID8gMCA6IC1FSU87CisJZGV2aWNlX3Bvd2VyX3VwKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWRldmljZV9yZXN1bWUoKTsKKwlwbV9zZW5kX2FsbChQTV9SRVNVTUUsICh2b2lkICopMCk7CisJcXVldWVfZXZlbnQoQVBNX05PUk1BTF9SRVNVTUUsIE5VTEwpOworIG91dDoKKwlzcGluX2xvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlmb3IgKGFzID0gdXNlcl9saXN0OyBhcyAhPSBOVUxMOyBhcyA9IGFzLT5uZXh0KSB7CisJCWFzLT5zdXNwZW5kX3dhaXQgPSAwOworCQlhcy0+c3VzcGVuZF9yZXN1bHQgPSBlcnI7CisJfQorCXNwaW5fdW5sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcG1fc3VzcGVuZF93YWl0cXVldWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0YW5kYnkodm9pZCkKK3sKKwlpbnQJZXJyOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkZXZpY2VfcG93ZXJfZG93bihQTVNHX1NVU1BFTkQpOworCS8qIHNlcmlhbGl6ZSB3aXRoIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkvKiBJZiBuZWVkZWQsIG5vdGlmeSBkcml2ZXJzIGhlcmUgKi8KKwlnZXRfdGltZV9kaWZmKCk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwllcnIgPSBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9TVEFOREJZKTsKKwlpZiAoKGVyciAhPSBBUE1fU1VDQ0VTUykgJiYgKGVyciAhPSBBUE1fTk9fRVJST1IpKQorCQlhcG1fZXJyb3IoInN0YW5kYnkiLCBlcnIpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkZXZpY2VfcG93ZXJfdXAoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBhcG1fZXZlbnRfdCBnZXRfZXZlbnQodm9pZCkKK3sKKwlpbnQJCWVycm9yOworCWFwbV9ldmVudF90CWV2ZW50OworCWFwbV9ldmVudGluZm9fdAlpbmZvOworCisJc3RhdGljIGludCBub3RpZmllZDsKKworCS8qIHdlIGRvbid0IHVzZSB0aGUgZXZlbnRpbmZvICovCisJZXJyb3IgPSBhcG1fZ2V0X2V2ZW50KCZldmVudCwgJmluZm8pOworCWlmIChlcnJvciA9PSBBUE1fU1VDQ0VTUykKKwkJcmV0dXJuIGV2ZW50OworCisJaWYgKChlcnJvciAhPSBBUE1fTk9fRVZFTlRTKSAmJiAobm90aWZpZWQrKyA9PSAwKSkKKwkJYXBtX2Vycm9yKCJnZXRfZXZlbnQiLCBlcnJvcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZXZlbnRzKHZvaWQpCit7CisJYXBtX2V2ZW50X3QJCWV2ZW50OworCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RfcmVzdW1lOworCXN0YXRpYyBpbnQJCWlnbm9yZV9ib3VuY2U7CisKKwl3aGlsZSAoKGV2ZW50ID0gZ2V0X2V2ZW50KCkpICE9IDApIHsKKwkJaWYgKGRlYnVnKSB7CisJCQlpZiAoZXZlbnQgPD0gTlJfQVBNX0VWRU5UX05BTUUpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbTogcmVjZWl2ZWQgJXMgbm90aWZ5XG4iLAorCQkJCSAgICAgICBhcG1fZXZlbnRfbmFtZVtldmVudCAtIDFdKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBtOiByZWNlaXZlZCB1bmtub3duICIKKwkJCQkgICAgICAgImV2ZW50IDB4JTAyeFxuIiwgZXZlbnQpOworCQl9CisJCWlmIChpZ25vcmVfYm91bmNlCisJCSAgICAmJiAoKGppZmZpZXMgLSBsYXN0X3Jlc3VtZSkgPiBib3VuY2VfaW50ZXJ2YWwpKQorCQkJaWdub3JlX2JvdW5jZSA9IDA7CisKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1RBTkRCWToKKwkJY2FzZSBBUE1fVVNFUl9TVEFOREJZOgorCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJaWYgKHN0YW5kYnlzX3BlbmRpbmcgPD0gMCkKKwkJCQlzdGFuZGJ5KCk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9VU0VSX1NVU1BFTkQ6CisjaWZkZWYgQ09ORklHX0FQTV9JR05PUkVfVVNFUl9TVVNQRU5ECisJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApCisJCQkJc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfUkVKRUNUKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQVBNX1NZU19TVVNQRU5EOgorCQkJaWYgKGlnbm9yZV9ib3VuY2UpIHsKKwkJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApCisJCQkJCXNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX1JFSkVDVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogSWYgd2UgYXJlIGFscmVhZHkgcHJvY2Vzc2luZyBhIFNVU1BFTkQsCisJCQkgKiB0aGVuIGZ1cnRoZXIgU1VTUEVORCBldmVudHMgZnJvbSB0aGUgQklPUworCQkJICogd2lsbCBiZSBpZ25vcmVkLiAgV2UgYWxzbyByZXR1cm4gaGVyZSB0bworCQkJICogY29wZSB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlIFRoaW5rcGFkcyBrZWVwCisJCQkgKiBzZW5kaW5nIGEgU1VTUEVORCBldmVudCB1bnRpbCBzb21ldGhpbmcgZWxzZQorCQkJICogaGFwcGVucyEKKwkJCSAqLworCQkJaWYgKGlnbm9yZV9zeXNfc3VzcGVuZCkKKwkJCQlyZXR1cm47CisJCQlpZ25vcmVfc3lzX3N1c3BlbmQgPSAxOworCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJaWYgKHN1c3BlbmRzX3BlbmRpbmcgPD0gMCkKKwkJCQkodm9pZCkgc3VzcGVuZCgxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX05PUk1BTF9SRVNVTUU6CisJCWNhc2UgQVBNX0NSSVRJQ0FMX1JFU1VNRToKKwkJY2FzZSBBUE1fU1RBTkRCWV9SRVNVTUU6CisJCQlpZ25vcmVfc3lzX3N1c3BlbmQgPSAwOworCQkJbGFzdF9yZXN1bWUgPSBqaWZmaWVzOworCQkJaWdub3JlX2JvdW5jZSA9IDE7CisJCQlpZiAoKGV2ZW50ICE9IEFQTV9OT1JNQUxfUkVTVU1FKQorCQkJICAgIHx8IChpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9PSAwKSkgeworCQkJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCQlzZXRfdGltZSgpOworCQkJCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOworCQkJCWRldmljZV9yZXN1bWUoKTsKKwkJCQlwbV9zZW5kX2FsbChQTV9SRVNVTUUsICh2b2lkICopMCk7CisJCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJfQorCQkJaWdub3JlX25vcm1hbF9yZXN1bWUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fQ0FQQUJJTElUWV9DSEFOR0U6CisJCWNhc2UgQVBNX0xPV19CQVRURVJZOgorCQljYXNlIEFQTV9QT1dFUl9TVEFUVVNfQ0hBTkdFOgorCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCisJCQlicmVhazsKKworCQljYXNlIEFQTV9VUERBVEVfVElNRToKKwkJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCXNldF90aW1lKCk7CisJCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX0NSSVRJQ0FMX1NVU1BFTkQ6CisJCQkvKgorCQkJICogV2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlamVjdCBhIGNyaXRpY2FsIHN1c3BlbmQuCisJCQkgKi8KKwkJCSh2b2lkKSBzdXNwZW5kKDApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFwbV9ldmVudF9oYW5kbGVyKHZvaWQpCit7CisJc3RhdGljIGludAlwZW5kaW5nX2NvdW50ID0gNDsKKwlpbnQJCWVycjsKKworCWlmICgoc3RhbmRieXNfcGVuZGluZyA+IDApIHx8IChzdXNwZW5kc19wZW5kaW5nID4gMCkpIHsKKwkJaWYgKChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgJiYKKwkJCQkocGVuZGluZ19jb3VudC0tIDw9IDApKSB7CisJCQlwZW5kaW5nX2NvdW50ID0gNDsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBtOiBzZXR0aW5nIHN0YXRlIGJ1c3lcbiIpOworCQkJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfQlVTWSk7CisJCQlpZiAoZXJyKQorCQkJCWFwbV9lcnJvcigiYnVzeSIsIGVycik7CisJCX0KKwl9IGVsc2UKKwkJcGVuZGluZ19jb3VudCA9IDQ7CisJY2hlY2tfZXZlbnRzKCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBBUE0gdGhyZWFkIG1haW4gbG9vcC4KKyAqLworCitzdGF0aWMgdm9pZCBhcG1fbWFpbmxvb3Aodm9pZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlKCZhcG1fd2FpdHF1ZXVlLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlmb3IgKDs7KSB7CisJCXNjaGVkdWxlX3RpbWVvdXQoQVBNX0NIRUNLX1RJTUVPVVQpOworCQlpZiAoZXhpdF9rYXBtZCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBPaywgY2hlY2sgYWxsIGV2ZW50cywgY2hlY2sgZm9yIGlkbGUgKGFuZCBtYXJrIHVzIHNsZWVwaW5nCisJCSAqIHNvIGFzIG5vdCB0byBjb3VudCB0b3dhcmRzIHRoZSBsb2FkIGF2ZXJhZ2UpLi4KKwkJICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFwbV9ldmVudF9oYW5kbGVyKCk7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZhcG1fd2FpdHF1ZXVlLCAmd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXBtX3VzZXIoc3RydWN0IGFwbV91c2VyICphcywgY29uc3QgY2hhciAqZnVuYykKK3sKKwlpZiAoKGFzID09IE5VTEwpIHx8IChhcy0+bWFnaWMgIT0gQVBNX0JJT1NfTUFHSUMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXBtOiAlcyBwYXNzZWQgYmFkIGZpbHBcbiIsIGZ1bmMpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRvX3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKglhczsKKwlpbnQJCQlpOworCWFwbV9ldmVudF90CQlldmVudDsKKworCWFzID0gZnAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hlY2tfYXBtX3VzZXIoYXMsICJyZWFkIikpCisJCXJldHVybiAtRUlPOworCWlmICgoaW50KWNvdW50IDwgc2l6ZW9mKGFwbV9ldmVudF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChxdWV1ZV9lbXB0eShhcykpICYmIChmcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVBR0FJTjsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3dhaXRxdWV1ZSwgIXF1ZXVlX2VtcHR5KGFzKSk7CisJaSA9IGNvdW50OworCXdoaWxlICgoaSA+PSBzaXplb2YoZXZlbnQpKSAmJiAhcXVldWVfZW1wdHkoYXMpKSB7CisJCWV2ZW50ID0gZ2V0X3F1ZXVlZF9ldmVudChhcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIHNpemVvZihldmVudCkpKSB7CisJCQlpZiAoaSA8IGNvdW50KQorCQkJCWJyZWFrOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKKwkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgorCQkJYXMtPnN1c3BlbmRzX3JlYWQrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX1NZU19TVEFOREJZOgorCQljYXNlIEFQTV9VU0VSX1NUQU5EQlk6CisJCQlhcy0+c3RhbmRieXNfcmVhZCsrOworCQkJYnJlYWs7CisJCX0KKwkJYnVmICs9IHNpemVvZihldmVudCk7CisJCWkgLT0gc2l6ZW9mKGV2ZW50KTsKKwl9CisJaWYgKGkgPCBjb3VudCkKKwkJcmV0dXJuIGNvdW50IC0gaTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG9fcG9sbChzdHJ1Y3QgZmlsZSAqZnAsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCBhcG1fdXNlciAqIGFzOworCisJYXMgPSBmcC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGVja19hcG1fdXNlcihhcywgInBvbGwiKSkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZwLCAmYXBtX3dhaXRxdWV1ZSwgd2FpdCk7CisJaWYgKCFxdWV1ZV9lbXB0eShhcykpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKglhczsKKworCWFzID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGVja19hcG1fdXNlcihhcywgImlvY3RsIikpCisJCXJldHVybiAtRUlPOworCWlmICgoIWFzLT5zdXNlcikgfHwgKCFhcy0+d3JpdGVyKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVBNX0lPQ19TVEFOREJZOgorCQlpZiAoYXMtPnN0YW5kYnlzX3JlYWQgPiAwKSB7CisJCQlhcy0+c3RhbmRieXNfcmVhZC0tOworCQkJYXMtPnN0YW5kYnlzX3BlbmRpbmctLTsKKwkJCXN0YW5kYnlzX3BlbmRpbmctLTsKKwkJfSBlbHNlCisJCQlxdWV1ZV9ldmVudChBUE1fVVNFUl9TVEFOREJZLCBhcyk7CisJCWlmIChzdGFuZGJ5c19wZW5kaW5nIDw9IDApCisJCQlzdGFuZGJ5KCk7CisJCWJyZWFrOworCWNhc2UgQVBNX0lPQ19TVVNQRU5EOgorCQlpZiAoYXMtPnN1c3BlbmRzX3JlYWQgPiAwKSB7CisJCQlhcy0+c3VzcGVuZHNfcmVhZC0tOworCQkJYXMtPnN1c3BlbmRzX3BlbmRpbmctLTsKKwkJCXN1c3BlbmRzX3BlbmRpbmctLTsKKwkJfSBlbHNlCisJCQlxdWV1ZV9ldmVudChBUE1fVVNFUl9TVVNQRU5ELCBhcyk7CisJCWlmIChzdXNwZW5kc19wZW5kaW5nIDw9IDApIHsKKwkJCXJldHVybiBzdXNwZW5kKDEpOworCQl9IGVsc2UgeworCQkJYXMtPnN1c3BlbmRfd2FpdCA9IDE7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAorCQkJCQlhcy0+c3VzcGVuZF93YWl0ID09IDApOworCQkJcmV0dXJuIGFzLT5zdXNwZW5kX3Jlc3VsdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBhcG1fdXNlciAqCWFzOworCisJYXMgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKGNoZWNrX2FwbV91c2VyKGFzLCAicmVsZWFzZSIpKQorCQlyZXR1cm4gMDsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWlmIChhcy0+c3RhbmRieXNfcGVuZGluZyA+IDApIHsKKwkJc3RhbmRieXNfcGVuZGluZyAtPSBhcy0+c3RhbmRieXNfcGVuZGluZzsKKwkJaWYgKHN0YW5kYnlzX3BlbmRpbmcgPD0gMCkKKwkJCXN0YW5kYnkoKTsKKwl9CisJaWYgKGFzLT5zdXNwZW5kc19wZW5kaW5nID4gMCkgeworCQlzdXNwZW5kc19wZW5kaW5nIC09IGFzLT5zdXNwZW5kc19wZW5kaW5nOworCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA8PSAwKQorCQkJKHZvaWQpIHN1c3BlbmQoMSk7CisJfQorICAJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJaWYgKHVzZXJfbGlzdCA9PSBhcykKKwkJdXNlcl9saXN0ID0gYXMtPm5leHQ7CisJZWxzZSB7CisJCXN0cnVjdCBhcG1fdXNlciAqCWFzMTsKKworCQlmb3IgKGFzMSA9IHVzZXJfbGlzdDsKKwkJICAgICAoYXMxICE9IE5VTEwpICYmIChhczEtPm5leHQgIT0gYXMpOworCQkgICAgIGFzMSA9IGFzMS0+bmV4dCkKKwkJCTsKKwkJaWYgKGFzMSA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fRVJSICJhcG06IGZpbHAgbm90IGluIHVzZXIgbGlzdFxuIik7CisJCWVsc2UKKwkJCWFzMS0+bmV4dCA9IGFzLT5uZXh0OworCX0KKwlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOworCWtmcmVlKGFzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisKKwlhcyA9IChzdHJ1Y3QgYXBtX3VzZXIgKilrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFwbTogY2Fubm90IGFsbG9jYXRlIHN0cnVjdCBvZiBzaXplICVkIGJ5dGVzXG4iLAorCQkgICAgICAgc2l6ZW9mKCphcykpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYXMtPm1hZ2ljID0gQVBNX0JJT1NfTUFHSUM7CisJYXMtPmV2ZW50X3RhaWwgPSBhcy0+ZXZlbnRfaGVhZCA9IDA7CisJYXMtPnN1c3BlbmRzX3BlbmRpbmcgPSBhcy0+c3RhbmRieXNfcGVuZGluZyA9IDA7CisJYXMtPnN1c3BlbmRzX3JlYWQgPSBhcy0+c3RhbmRieXNfcmVhZCA9IDA7CisJLyoKKwkgKiBYWFggLSB0aGlzIGlzIGEgdGlueSBiaXQgYnJva2VuLCB3aGVuIHdlIGNvbnNpZGVyIEJTRAorICAgICAgICAgKiBwcm9jZXNzIGFjY291bnRpbmcuIElmIHRoZSBkZXZpY2UgaXMgb3BlbmVkIGJ5IHJvb3QsIHdlCisJICogaW5zdGFudGx5IGZsYWcgdGhhdCB3ZSB1c2VkIHN1cGVydXNlciBwcml2cy4gV2hvIGtub3dzLAorCSAqIHdlIG1pZ2h0IGNsb3NlIHRoZSBkZXZpY2UgaW1tZWRpYXRlbHkgd2l0aG91dCBkb2luZyBhCisJICogcHJpdmlsZWdlZCBvcGVyYXRpb24gLS0gY2V2YW5zCisJICovCisJYXMtPnN1c2VyID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKKwlhcy0+d3JpdGVyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA9PSBGTU9ERV9XUklURTsKKwlhcy0+cmVhZGVyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID09IEZNT0RFX1JFQUQ7CisJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJYXMtPm5leHQgPSB1c2VyX2xpc3Q7CisJdXNlcl9saXN0ID0gYXM7CisJc3Bpbl91bmxvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBhczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcG1fZ2V0X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgpCit7CisJY2hhciAqCQlwOworCXVuc2lnbmVkIHNob3J0CWJ4OworCXVuc2lnbmVkIHNob3J0CWN4OworCXVuc2lnbmVkIHNob3J0CWR4OworCWludAkJZXJyb3I7CisJdW5zaWduZWQgc2hvcnQgIGFjX2xpbmVfc3RhdHVzID0gMHhmZjsKKwl1bnNpZ25lZCBzaG9ydCAgYmF0dGVyeV9zdGF0dXMgPSAweGZmOworCXVuc2lnbmVkIHNob3J0ICBiYXR0ZXJ5X2ZsYWcgICA9IDB4ZmY7CisJaW50CQlwZXJjZW50YWdlICAgICA9IC0xOworCWludCAgICAgICAgICAgICB0aW1lX3VuaXRzICAgICA9IC0xOworCWNoYXIgICAgICAgICAgICAqdW5pdHMgICAgICAgICA9ICI/IjsKKworCXAgPSBidWY7CisKKwlpZiAoKG51bV9vbmxpbmVfY3B1cygpID09IDEpICYmCisJICAgICEoZXJyb3IgPSBhcG1fZ2V0X3Bvd2VyX3N0YXR1cygmYngsICZjeCwgJmR4KSkpIHsKKwkJYWNfbGluZV9zdGF0dXMgPSAoYnggPj4gOCkgJiAweGZmOworCQliYXR0ZXJ5X3N0YXR1cyA9IGJ4ICYgMHhmZjsKKwkJaWYgKChjeCAmIDB4ZmYpICE9IDB4ZmYpCisJCQlwZXJjZW50YWdlID0gY3ggJiAweGZmOworCisJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgeworCQkJYmF0dGVyeV9mbGFnID0gKGN4ID4+IDgpICYgMHhmZjsKKwkJCWlmIChkeCAhPSAweGZmZmYpIHsKKwkJCQl1bml0cyA9IChkeCAmIDB4ODAwMCkgPyAibWluIiA6ICJzZWMiOworCQkJCXRpbWVfdW5pdHMgPSBkeCAmIDB4N2ZmZjsKKwkJCX0KKwkJfQorCX0KKwkvKiBBcmd1bWVudHMsIHdpdGggc3ltYm9scyBmcm9tIGxpbnV4L2FwbV9iaW9zLmguICBJbmZvcm1hdGlvbiBpcworCSAgIGZyb20gdGhlIEdldCBQb3dlciBTdGF0dXMgKDB4MGEpIGNhbGwgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KKworCSAgIDApIExpbnV4IGRyaXZlciB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQorCSAgIDEpIEFQTSBCSU9TIFZlcnNpb24uICBVc3VhbGx5IDEuMCwgMS4xIG9yIDEuMi4KKwkgICAyKSBBUE0gZmxhZ3MgZnJvbSBBUE0gSW5zdGFsbGF0aW9uIENoZWNrICgweDAwKToKKwkgICAgICBiaXQgMDogQVBNXzE2X0JJVF9TVVBQT1JUCisJICAgICAgYml0IDE6IEFQTV8zMl9CSVRfU1VQUE9SVAorCSAgICAgIGJpdCAyOiBBUE1fSURMRV9TTE9XU19DTE9DSworCSAgICAgIGJpdCAzOiBBUE1fQklPU19ESVNBQkxFRAorCSAgICAgIGJpdCA0OiBBUE1fQklPU19ESVNFTkdBR0VECisJICAgMykgQUMgbGluZSBzdGF0dXMKKwkgICAgICAweDAwOiBPZmYtbGluZQorCSAgICAgIDB4MDE6IE9uLWxpbmUKKwkgICAgICAweDAyOiBPbiBiYWNrdXAgcG93ZXIgKEJJT1MgPj0gMS4xIG9ubHkpCisJICAgICAgMHhmZjogVW5rbm93bgorCSAgIDQpIEJhdHRlcnkgc3RhdHVzCisJICAgICAgMHgwMDogSGlnaAorCSAgICAgIDB4MDE6IExvdworCSAgICAgIDB4MDI6IENyaXRpY2FsCisJICAgICAgMHgwMzogQ2hhcmdpbmcKKwkgICAgICAweDA0OiBTZWxlY3RlZCBiYXR0ZXJ5IG5vdCBwcmVzZW50IChCSU9TID49IDEuMiBvbmx5KQorCSAgICAgIDB4ZmY6IFVua25vd24KKwkgICA1KSBCYXR0ZXJ5IGZsYWcKKwkgICAgICBiaXQgMDogSGlnaAorCSAgICAgIGJpdCAxOiBMb3cKKwkgICAgICBiaXQgMjogQ3JpdGljYWwKKwkgICAgICBiaXQgMzogQ2hhcmdpbmcKKwkgICAgICBiaXQgNzogTm8gc3lzdGVtIGJhdHRlcnkKKwkgICAgICAweGZmOiBVbmtub3duCisJICAgNikgUmVtYWluaW5nIGJhdHRlcnkgbGlmZSAocGVyY2VudGFnZSBvZiBjaGFyZ2UpOgorCSAgICAgIDAtMTAwOiB2YWxpZAorCSAgICAgIC0xOiBVbmtub3duCisJICAgNykgUmVtYWluaW5nIGJhdHRlcnkgbGlmZSAodGltZSB1bml0cyk6CisJICAgICAgTnVtYmVyIG9mIHJlbWFpbmluZyBtaW51dGVzIG9yIHNlY29uZHMKKwkgICAgICAtMTogVW5rbm93bgorCSAgIDgpIG1pbiA9IG1pbnV0ZXM7IHNlYyA9IHNlY29uZHMgKi8KKworCXAgKz0gc3ByaW50ZihwLCAiJXMgJWQuJWQgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4ICVkJSUgJWQgJXNcbiIsCisJCSAgICAgZHJpdmVyX3ZlcnNpb24sCisJCSAgICAgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgYXBtX2luZm8uYmlvcy52ZXJzaW9uICYgMHhmZiwKKwkJICAgICBhcG1faW5mby5iaW9zLmZsYWdzLAorCQkgICAgIGFjX2xpbmVfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfZmxhZywKKwkJICAgICBwZXJjZW50YWdlLAorCQkgICAgIHRpbWVfdW5pdHMsCisJCSAgICAgdW5pdHMpOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgYXBtKHZvaWQgKnVudXNlZCkKK3sKKwl1bnNpZ25lZCBzaG9ydAlieDsKKwl1bnNpZ25lZCBzaG9ydAljeDsKKwl1bnNpZ25lZCBzaG9ydAlkeDsKKwlpbnQJCWVycm9yOworCWNoYXIgKgkJcG93ZXJfc3RhdDsKKwljaGFyICoJCWJhdF9zdGF0OworCisJa2FwbWRfcnVubmluZyA9IDE7CisKKwlkYWVtb25pemUoImthcG1kIik7CisKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkvKiAyMDAyLzA4LzAxIC0gV1QKKwkgKiBUaGlzIGlzIHRvIGF2b2lkIHJhbmRvbSBjcmFzaGVzIGF0IGJvb3QgdGltZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKwkgKiBvbiBTTVAgc3lzdGVtcyBpbiBjYXNlIG9mICJhcG09cG93ZXItb2ZmIiBtb2RlLiBTZWVuIG9uIEFTVVMgQTdNMjY2RC4KKwkgKiBTb21lIGJpb3NlcyBkb24ndCBsaWtlIGJlaW5nIGNhbGxlZCBmcm9tIENQVSAhPSAwLgorCSAqIE1ldGhvZCBzdWdnZXN0ZWQgYnkgSW5nbyBNb2xuYXIuCisJICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKyNlbmRpZgorCisJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9PSAwKSB7CisJCWFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9IGFwbV9pbmZvLmJpb3MudmVyc2lvbjsKKwkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKSB7CisJCQkvKgorCQkJICogV2Ugb25seSBzdXBwb3J0IEJJT1NzIHVwIHRvIHZlcnNpb24gMS4yCisJCQkgKi8KKwkJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDAxMDIpCisJCQkJYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID0gMHgwMTAyOworCQkJZXJyb3IgPSBhcG1fZHJpdmVyX3ZlcnNpb24oJmFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbik7CisJCQlpZiAoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpIHsKKwkJCQlhcG1fZXJyb3IoImRyaXZlciB2ZXJzaW9uIiwgZXJyb3IpOworCQkJCS8qIEZhbGwgYmFjayB0byBhbiBBUE0gMS4wIGNvbm5lY3Rpb24uICovCisJCQkJYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID0gMHgxMDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0lORk8gImFwbTogQ29ubmVjdGlvbiB2ZXJzaW9uICVkLiVkXG4iLAorCQkJKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisJCQlhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gJiAweGZmKTsKKworI2lmZGVmIENPTkZJR19BUE1fRE9fRU5BQkxFCisJaWYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNBQkxFRCkgeworCQkvKgorCQkgKiBUaGlzIGNhbGwgY2F1c2VzIG15IE5FQyBVbHRyYUxpdGUgVmVyc2EgMzMvQyB0byBoYW5nIGlmIGl0CisJCSAqIGlzIGJvb3RlZCB3aXRoIFBNIGRpc2FibGVkIGJ1dCBub3QgaW4gdGhlIGRvY2tpbmcgc3RhdGlvbi4KKwkJICogVW5mb3J0dW5hdGUgLi4uCisJCSAqLworCQllcnJvciA9IGFwbV9lbmFibGVfcG93ZXJfbWFuYWdlbWVudCgxKTsKKwkJaWYgKGVycm9yKSB7CisJCQlhcG1fZXJyb3IoImVuYWJsZSBwb3dlciBtYW5hZ2VtZW50IiwgZXJyb3IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKQorCSAgICAmJiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgwMTAwKSkgeworCQllcnJvciA9IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudChBUE1fREVWSUNFX0FMTCwgMSk7CisJCWlmIChlcnJvcikgeworCQkJYXBtX2Vycm9yKCJlbmdhZ2UgcG93ZXIgbWFuYWdlbWVudCIsIGVycm9yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChkZWJ1ZyAmJiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSB8fCBzbXAgKSkgeworCQllcnJvciA9IGFwbV9nZXRfcG93ZXJfc3RhdHVzKCZieCwgJmN4LCAmZHgpOworCQlpZiAoZXJyb3IpCisJCQlwcmludGsoS0VSTl9JTkZPICJhcG06IHBvd2VyIHN0YXR1cyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJZWxzZSB7CisJCQlzd2l0Y2ggKChieCA+PiA4KSAmIDB4ZmYpIHsKKwkJCWNhc2UgMDogcG93ZXJfc3RhdCA9ICJvZmYgbGluZSI7IGJyZWFrOworCQkJY2FzZSAxOiBwb3dlcl9zdGF0ID0gIm9uIGxpbmUiOyBicmVhazsKKwkJCWNhc2UgMjogcG93ZXJfc3RhdCA9ICJvbiBiYWNrdXAgcG93ZXIiOyBicmVhazsKKwkJCWRlZmF1bHQ6IHBvd2VyX3N0YXQgPSAidW5rbm93biI7IGJyZWFrOworCQkJfQorCQkJc3dpdGNoIChieCAmIDB4ZmYpIHsKKwkJCWNhc2UgMDogYmF0X3N0YXQgPSAiaGlnaCI7IGJyZWFrOworCQkJY2FzZSAxOiBiYXRfc3RhdCA9ICJsb3ciOyBicmVhazsKKwkJCWNhc2UgMjogYmF0X3N0YXQgPSAiY3JpdGljYWwiOyBicmVhazsKKwkJCWNhc2UgMzogYmF0X3N0YXQgPSAiY2hhcmdpbmciOyBicmVhazsKKwkJCWRlZmF1bHQ6IGJhdF9zdGF0ID0gInVua25vd24iOyBicmVhazsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiYXBtOiBBQyAlcywgYmF0dGVyeSBzdGF0dXMgJXMsIGJhdHRlcnkgbGlmZSAiLAorCQkJICAgICAgIHBvd2VyX3N0YXQsIGJhdF9zdGF0KTsKKwkJCWlmICgoY3ggJiAweGZmKSA9PSAweGZmKQorCQkJCXByaW50aygidW5rbm93blxuIik7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlZCUlXG4iLCBjeCAmIDB4ZmYpOworCQkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiYXBtOiBiYXR0ZXJ5IGZsYWcgMHglMDJ4LCBiYXR0ZXJ5IGxpZmUgIiwKKwkJCQkgICAgICAgKGN4ID4+IDgpICYgMHhmZik7CisJCQkJaWYgKGR4ID09IDB4ZmZmZikKKwkJCQkJcHJpbnRrKCJ1bmtub3duXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50aygiJWQgJXNcbiIsIGR4ICYgMHg3ZmZmLAorCQkJCQkJKGR4ICYgMHg4MDAwKSA/CisJCQkJCQkibWludXRlcyIgOiAic2Vjb25kcyIpOworCQkJfQorCQl9CisJfQorCisJLyogSW5zdGFsbCBvdXIgcG93ZXIgb2ZmIGhhbmRsZXIuLiAqLworCWlmIChwb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZiA9IGFwbV9wb3dlcl9vZmY7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSB8fCBzbXApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCisJCWNvbnNvbGVfYmxhbmtfaG9vayA9IGFwbV9jb25zb2xlX2JsYW5rOworI2VuZGlmCisJCWFwbV9tYWlubG9vcCgpOworI2lmIGRlZmluZWQoQ09ORklHX0FQTV9ESVNQTEFZX0JMQU5LKSAmJiBkZWZpbmVkKENPTkZJR19WVCkKKwkJY29uc29sZV9ibGFua19ob29rID0gTlVMTDsKKyNlbmRpZgorCX0KKwlrYXBtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXBtX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQJaW52ZXJ0OworCisJd2hpbGUgKChzdHIgIT0gTlVMTCkgJiYgKCpzdHIgIT0gJ1wwJykpIHsKKwkJaWYgKHN0cm5jbXAoc3RyLCAib2ZmIiwgMykgPT0gMCkKKwkJCWFwbV9kaXNhYmxlZCA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgIm9uIiwgMikgPT0gMCkKKwkJCWFwbV9kaXNhYmxlZCA9IDA7CisJCWlmICgoc3RybmNtcChzdHIsICJib3VuY2UtaW50ZXJ2YWw9IiwgMTYpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJib3VuY2VfaW50ZXJ2YWw9IiwgMTYpID09IDApKQorCQkJYm91bmNlX2ludGVydmFsID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxNiwgTlVMTCwgMCk7CisJCWlmICgoc3RybmNtcChzdHIsICJpZGxlLXRocmVzaG9sZD0iLCAxNSkgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImlkbGVfdGhyZXNob2xkPSIsIDE1KSA9PSAwKSkKKwkJCWlkbGVfdGhyZXNob2xkID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxNSwgTlVMTCwgMCk7CisJCWlmICgoc3RybmNtcChzdHIsICJpZGxlLXBlcmlvZD0iLCAxMikgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImlkbGVfcGVyaW9kPSIsIDEyKSA9PSAwKSkKKwkJCWlkbGVfcGVyaW9kID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxMiwgTlVMTCwgMCk7CisJCWludmVydCA9IChzdHJuY21wKHN0ciwgIm5vLSIsIDMpID09IDApIHx8CisJCQkoc3RybmNtcChzdHIsICJub18iLCAzKSA9PSAwKTsKKwkJaWYgKGludmVydCkKKwkJCXN0ciArPSAzOworCQlpZiAoc3RybmNtcChzdHIsICJkZWJ1ZyIsIDUpID09IDApCisJCQlkZWJ1ZyA9ICFpbnZlcnQ7CisJCWlmICgoc3RybmNtcChzdHIsICJwb3dlci1vZmYiLCA5KSA9PSAwKSB8fAorCQkgICAgKHN0cm5jbXAoc3RyLCAicG93ZXJfb2ZmIiwgOSkgPT0gMCkpCisJCQlwb3dlcl9vZmYgPSAhaW52ZXJ0OworCQlpZiAoc3RybmNtcChzdHIsICJzbXAiLCAzKSA9PSAwKQorCQl7CisJCQlzbXAgPSAhaW52ZXJ0OworCQkJaWRsZV90aHJlc2hvbGQgPSAxMDA7CisJCX0KKwkJaWYgKChzdHJuY21wKHN0ciwgImFsbG93LWludHMiLCAxMCkgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImFsbG93X2ludHMiLCAxMCkgPT0gMCkpCisgCQkJYXBtX2luZm8uYWxsb3dfaW50cyA9ICFpbnZlcnQ7CisJCWlmICgoc3RybmNtcChzdHIsICJicm9rZW4tcHNyIiwgMTApID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJicm9rZW5fcHNyIiwgMTApID09IDApKQorCQkJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4gPSAhaW52ZXJ0OworCQlpZiAoKHN0cm5jbXAoc3RyLCAicmVhbG1vZGUtcG93ZXItb2ZmIiwgMTgpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJyZWFsbW9kZV9wb3dlcl9vZmYiLCAxOCkgPT0gMCkpCisJCQlhcG1faW5mby5yZWFsbW9kZV9wb3dlcl9vZmYgPSAhaW52ZXJ0OworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQlpZiAoc3RyICE9IE5VTEwpCisJCQlzdHIgKz0gc3Ryc3BuKHN0ciwgIiwgXHQiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFwbT0iLCBhcG1fc2V0dXApOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwbV9iaW9zX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRvX3JlYWQsCisJLnBvbGwJCT0gZG9fcG9sbCwKKwkuaW9jdGwJCT0gZG9faW9jdGwsCisJLm9wZW4JCT0gZG9fb3BlbiwKKwkucmVsZWFzZQk9IGRvX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXBtX2RldmljZSA9IHsKKwlBUE1fTUlOT1JfREVWLAorCSJhcG1fYmlvcyIsCisJJmFwbV9iaW9zX2ZvcHMKK307CisKKworLyogU2ltcGxlICJwcmludCBpZiB0cnVlIiBjYWxsYmFjayAqLworc3RhdGljIGludCBfX2luaXQgcHJpbnRfaWZfdHJ1ZShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoIiVzXG4iLCBkLT5pZGVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIEJpb3NlcyBlbmFibGUgdGhlIFBTLzIgbW91c2UgKHRvdWNocGFkKSBhdCByZXN1bWUsIGV2ZW4gaWYgaXQgd2FzCisgKiBkaXNhYmxlZCBiZWZvcmUgdGhlIHN1c3BlbmQuIExpbnV4IHVzZWQgdG8gZ2V0IHRlcnJpYmx5IGNvbmZ1c2VkIGJ5IHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJyb2tlbl9wczJfcmVzdW1lKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIE1vdXNlcGFkIFJlc3VtZSBCdWcgd29ya2Fyb3VuZCBob3BlZnVsbHkgbm90IG5lZWRlZC5cbiIsIGQtPmlkZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogU29tZSBiaW9zZXMgaGF2ZSBhIGJyb2tlbiBwcm90ZWN0ZWQgbW9kZSBwb3dlcm9mZiBhbmQgbmVlZCB0byB1c2UgcmVhbG1vZGUgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9yZWFsbW9kZV9wb3dlcl9vZmYoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKGFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZiA9PSAwKSB7CisJCWFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZiA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGJpb3MgZGV0ZWN0ZWQuIFVzaW5nIHJlYWxtb2RlIHBvd2Vyb2ZmIG9ubHkuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBTb21lIGxhcHRvcHMgcmVxdWlyZSBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgZHVyaW5nIEFQTSBjYWxscyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2FwbV9pbnRzKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5hbGxvd19pbnRzID09IDApIHsKKwkJYXBtX2luZm8uYWxsb3dfaW50cyA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIEVuYWJsaW5nIGludGVycnVwdHMgZHVyaW5nIEFQTSBjYWxscy5cbiIsIGQtPmlkZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgQVBNIGJpb3NlcyBjb3JydXB0IG1lbW9yeSBvciBqdXN0IHBsYWluIGRvIG5vdCB3b3JrICovCitzdGF0aWMgaW50IF9faW5pdCBhcG1faXNfaG9ya2VkKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5kaXNhYmxlZCA9PSAwKSB7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbWFjaGluZSBkZXRlY3RlZC4gRGlzYWJsaW5nIEFQTS5cbiIsIGQtPmlkZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwbV9pc19ob3JrZWRfZDg1MG1kKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5kaXNhYmxlZCA9PSAwKSB7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbWFjaGluZSBkZXRlY3RlZC4gRGlzYWJsaW5nIEFQTS5cbiIsIGQtPmlkZW50KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVGhpcyBidWcgaXMgZml4ZWQgaW4gYmlvcyBQMTUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJkb3dubG9hZCBmcm9tIHN1cHBvcnQuaW50ZWwuY29tIFxuIik7CisJfQorCXJldHVybiAwOworfQorCisvKiBTb21lIEFQTSBiaW9zZXMgaGFuZyBvbiBBUE0gaWRsZSBjYWxscyAqLworc3RhdGljIGludCBfX2luaXQgYXBtX2xpa2VzX3RvX21lbHQoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKGFwbV9pbmZvLmZvcmJpZF9pZGxlID09IDApIHsKKwkJYXBtX2luZm8uZm9yYmlkX2lkbGUgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBtYWNoaW5lIGRldGVjdGVkLiBEaXNhYmxpbmcgQVBNIGlkbGUgY2FsbHMuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIENoZWNrIGZvciBjbHVlIGZyZWUgQklPUyBpbXBsZW1lbnRhdGlvbnMgd2hvIHVzZQorICogIHRoZSBmb2xsb3dpbmcgUUEgdGVjaG5pcXVlCisgKgorICogICAgICBbIFdyaXRlIEJJT1MgQ29kZSBdPC0tLS0tLQorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIF4KKyAqICAgICAgPCBEb2VzIGl0IENvbXBpbGUgPi0tLS1OLS0KKyAqICAgICAgICAgICAgICAgfFkgICAgICAgICAgICAgICBeCisgKgk8IERvZXMgaXQgQm9vdCBXaW45OCA+LU4tLQorICogICAgICAgICAgICAgICB8WQorICogICAgICAgICAgIFtTaGlwIEl0XQorICoKKyAqCVBob2VuaXggQTA0ICAwOC8yNC8yMDAwIGlzIGtub3duIGJhZCAoRGVsbCBJbnNwaXJvbiA1MDAwZSkKKyAqCVBob2VuaXggQTA3ICAwOS8yOS8yMDAwIGlzIGtub3duIGdvb2QgKERlbGwgSW5zcGlyb24gNTAwMCkKKyAqLworc3RhdGljIGludCBfX2luaXQgYnJva2VuX2FwbV9wb3dlcihzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX2Jyb2tlbiA9IDE7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBzdHJpbmdzIHN1Z2dlc3QgQVBNIGJ1Z3MsIGRpc2FibGluZyBwb3dlciBzdGF0dXMgcmVwb3J0aW5nLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGJpb3Mgc3dhcHMgdGhlIEFQTSBtaW51dGUgcmVwb3J0aW5nIGJ5dGVzIG92ZXIgKE1hbnkgc29ueSBsYXB0b3BzCisgKiBoYXZlIHRoaXMgcHJvYmxlbSkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19zd2FiaW5taW51dGVzID0gMTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIHN0cmluZ3Mgc3VnZ2VzdCBBUE0gcmVwb3J0cyBiYXR0ZXJ5IGxpZmUgaW4gbWludXRlcyBhbmQgd3JvbmcgYnl0ZSBvcmRlci5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBhcG1fZG1pX3RhYmxlW10gPSB7CisJeworCQlwcmludF9pZl90cnVlLAorCQlLRVJOX1dBUk5JTkcgIklCTSBUMjMgLSBCSU9TIDEuMDNiKyBhbmQgY29udHJvbGxlciBmaXJtd2FyZSAxLjAyKyBtYXkgYmUgbmVlZGVkIGZvciBMaW51eCBBUE0uIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJQk0iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMUFFVDM4V1cgKDEuMDFiKSIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gdGhlIEM2MDAgKi8KKwkJYnJva2VuX3BzMl9yZXN1bWUsICJEZWxsIExhdGl0dWRlIEM2MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUgQzYwMCIpLCB9LAorCX0sCisJewkvKiBBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBzdXNwZW5kIG9uIERlbGwgTGF0aXR1ZGUgbGFwdG9wcyovCisJCXNldF9hcG1faW50cywgIkRlbGwgTGF0aXR1ZGUiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUgQzUxMCIpLCB9CisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIEluc3Bpcm9uIDI1MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gMjUwMCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiQTExIiksIH0sCisJfSwKKwl7CS8qIEFsbG93IGludGVycnVwdHMgZHVyaW5nIHN1c3BlbmQgb24gRGVsbCBJbnNwaXJvbiBsYXB0b3BzKi8KKwkJc2V0X2FwbV9pbnRzLCAiRGVsbCBJbnNwaXJvbiIsIHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gNDAwMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gSW5zcGlyb24gNTAwMGUgKi8KKwkJYnJva2VuX2FwbV9wb3dlciwgIkRlbGwgSW5zcGlyb24gNTAwMGUiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQTA0IiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzI0LzIwMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIEluc3Bpcm9uIDI1MDAgKi8KKwkJYnJva2VuX2FwbV9wb3dlciwgIkRlbGwgSW5zcGlyb24gMjUwMCIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBMTIiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDIvMDQvMjAwMiIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiRGVsbCBEaW1lbnNpb24gNDEwMCIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMtWiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiSW50ZWwgQ29ycC4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCJBMTEiKSwgfSwKKwl9LAorCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgc3VzcGVuZCBvbiBDb21wYXEgTGFwdG9wcyovCisJCXNldF9hcG1faW50cywgIkNvbXBhcSAxMlhMMTI1IiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDb21wYXEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQ29tcGFxIFBDIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiNC4wNiIpLCB9LAorCX0sCisJewkvKiBBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBBUE0gb3IgdGhlIGNsb2NrIGdvZXMgc2xvdyAqLworCQlzZXRfYXBtX2ludHMsICJBU1VTVGVLIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTDg0MDBLIHNlcmllcyBOb3RlYm9vayBQQyIpLCB9LAorCX0sCisJewkvKiBBUE0gYmxvd3Mgb24gc2h1dGRvd24gKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkFCSVQgS1g3LTMzM1tSXSIsCisJCXsJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJWVDgzNjctODIzM0EgKEtYNy0zMzNbUl0pIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJUcmlnZW0gRGVsaGkzIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUcmlHZW0gQ29tcHV0ZXIsIEluYyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJEZWxoaTMiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkZ1aml0c3UtU2llbWVucyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgImhvZW5peC9GVUpJVFNVIFNJRU1FTlMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiVmVyc2lvbjEuMDEiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZF9kODUwbWQsICJJbnRlbCBEODUwTUQiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJJbnRlbCBDb3JwLiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJNVjg1MDEwQS44NkEuMDAxNi5QMDcuMDIwMTI1MTUzNiIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiSW50ZWwgRDgxMEVNTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkludGVsIENvcnAuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIk1PODEwMTBBLjg2QS4wMDA4LlAwNC4wMDA0MTcwODAwIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIFhQUy1aIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiSW50ZWwgQ29ycC4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQTExIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlhQUy1aIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJTaGFycCBQQy1QSi9BWCIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0hBUlAiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUEMtUEovQVgiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlN5c3RlbVNvZnQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCJWZXJzaW9uIFIyLjA4IiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIEluc3Bpcm9uIDI1MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gMjUwMCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiQTExIiksIH0sCisJfSwKKwl7CS8qIEFQTSBpZGxlIGhhbmdzICovCisJCWFwbV9saWtlc190b19tZWx0LCAiSmFiaWwgQU1EIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjBBQVNOUDA2IiksIH0sCisJfSwKKwl7CS8qIEFQTSBpZGxlIGhhbmdzICovCisJCWFwbV9saWtlc190b19tZWx0LCAiQU1JIEJpb3MiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJBbWVyaWNhbiBNZWdhdHJlbmRzIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMEFBU05QMDUiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctTjUwNVgoREUpICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDZIIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzIzLzk5IiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLU41MDVWWCAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlcySzA2SDAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDIvMDMvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWEcyOSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMTE3QTAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDQvMjUvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjYwME5FICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAxMjFaMSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwNS8xMS8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNjAwTkUgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJXTUUwMVoxIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzExLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo2MDBMRUsoREUpICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDZaMyIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIxMi8yNS8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNTA1TFMgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwM0QwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA1LzEyLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo1MDVMUyAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjAzWjMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDgvMjUvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjUwNUxTICh3aXRoIHVwZGF0ZWQgQklPUykgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwOVozIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA1LzEyLzAxIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUYxMDRLICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDRLMiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwOC8yOC8wMCIpLCB9LAorCX0sCisKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUMxVk4vQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA4UDEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTEvMDkvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA0UDEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDkvMTIvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIldYUE8xWjMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTAvMjYvMDEiKSwgfSwKKwl9LAorCXsJLyogYnJva2VuIFBNIHBvd2Vyb2ZmIGJpb3MgKi8KKwkJc2V0X3JlYWxtb2RlX3Bvd2VyX29mZiwgIkF3YXJkIFNvZnR3YXJlIHY0LjYwIFBHTUEiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJBd2FyZCBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsLCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjQuNjAgUEdNQSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIxMzQ1MjYxODQiKSwgfSwKKwl9LAorCisJLyogR2VuZXJpYyBwZXIgdmVuZG9yIEFQTSBzZXR0aW5ncyAgKi8KKworCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgc3VzcGVuZCBvbiBJQk0gbGFwdG9wcyAqLworCQlzZXRfYXBtX2ludHMsICJJQk0iLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIklCTSIpLCB9LAorCX0sCisKKwl7IH0KK307CisKKy8qCisgKiBKdXN0IHN0YXJ0IHRoZSBBUE0gdGhyZWFkLiBXZSBkbyBOT1Qgd2FudCB0byBkbyBBUE0gQklPUworICogY2FsbHMgZnJvbSBhbnl0aGluZyBidXQgdGhlIEFQTSB0aHJlYWQsIGlmIGZvciBubyBvdGhlciByZWFzb24KKyAqIHRoYW4gdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCB0cnVzdCB0aGUgQVBNIEJJT1MuIFRoaXMgd2F5LAorICogbW9zdCBjb21tb24gQVBNIEJJT1MgcHJvYmxlbXMgdGhhdCBsZWFkIHRvIHByb3RlY3Rpb24gZXJyb3JzCisgKiBldGMgd2lsbCBoYXZlIGF0IGxlYXN0IHNvbWUgbGV2ZWwgb2YgYmVpbmcgY29udGFpbmVkLi4uCisgKgorICogSW4gc2hvcnQsIGlmIHNvbWV0aGluZyBiYWQgaGFwcGVucywgYXQgbGVhc3Qgd2UgaGF2ZSBhIGNob2ljZQorICogb2YganVzdCBraWxsaW5nIHRoZSBhcG0gdGhyZWFkLi4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXBtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFwbV9wcm9jOworCWludCByZXQ7CisJaW50IGk7CisKKwlkbWlfY2hlY2tfc3lzdGVtKGFwbV9kbWlfdGFibGUpOworCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFwbTogQklPUyBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaW50ayhLRVJOX0lORk8KKwkJImFwbTogQklPUyB2ZXJzaW9uICVkLiVkIEZsYWdzIDB4JTAyeCAoRHJpdmVyIHZlcnNpb24gJXMpXG4iLAorCQkoKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+PiA4KSAmIDB4ZmYpLAorCQkoYXBtX2luZm8uYmlvcy52ZXJzaW9uICYgMHhmZiksCisJCWFwbV9pbmZvLmJpb3MuZmxhZ3MsCisJCWRyaXZlcl92ZXJzaW9uKTsKKwlpZiAoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fMzJfQklUX1NVUFBPUlQpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXBtOiBubyAzMiBiaXQgQklPUyBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGFsbG93X2ludHMpCisJCWFwbV9pbmZvLmFsbG93X2ludHMgPSAxOworCWlmIChicm9rZW5fcHNyKQorCQlhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX2Jyb2tlbiA9IDE7CisJaWYgKHJlYWxtb2RlX3Bvd2VyX29mZikKKwkJYXBtX2luZm8ucmVhbG1vZGVfcG93ZXJfb2ZmID0gMTsKKwkvKiBVc2VyIGNhbiBvdmVycmlkZSwgYnV0IGRlZmF1bHQgaXMgdG8gdHJ1c3QgRE1JICovCisJaWYgKGFwbV9kaXNhYmxlZCAhPSAtMSkKKwkJYXBtX2luZm8uZGlzYWJsZWQgPSBhcG1fZGlzYWJsZWQ7CisKKwkvKgorCSAqIEZpeCBmb3IgdGhlIENvbXBhcSBDb250dXJhIDMvMjVjIHdoaWNoIHJlcG9ydHMgQklPUyB2ZXJzaW9uIDAuMQorCSAqIGJ1dCBpcyByZXBvcnRlZGx5IGEgMS4wIEJJT1MuCisJICovCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA9PSAweDAwMSkKKwkJYXBtX2luZm8uYmlvcy52ZXJzaW9uID0gMHgxMDA7CisKKwkvKiBCSU9TIDwgMS4yIGRvZXNuJ3Qgc2V0IGNzZWdfMTZfbGVuICovCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA8IDB4MTAyKQorCQlhcG1faW5mby5iaW9zLmNzZWdfMTZfbGVuID0gMDsgLyogNjRrICovCisKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXBtOiBlbnRyeSAleDolbHggY3NlZzE2ICV4IGRzZWcgJXgiLAorCQkJYXBtX2luZm8uYmlvcy5jc2VnLCBhcG1faW5mby5iaW9zLm9mZnNldCwKKwkJCWFwbV9pbmZvLmJpb3MuY3NlZ18xNiwgYXBtX2luZm8uYmlvcy5kc2VnKTsKKwkJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+IDB4MTAwKQorCQkJcHJpbnRrKCIgY3NlZyBsZW4gJXgsIGRzZWcgbGVuICV4IiwKKwkJCQlhcG1faW5mby5iaW9zLmNzZWdfbGVuLAorCQkJCWFwbV9pbmZvLmJpb3MuZHNlZ19sZW4pOworCQlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID4gMHgxMDEpCisJCQlwcmludGsoIiBjc2VnMTYgbGVuICV4IiwgYXBtX2luZm8uYmlvcy5jc2VnXzE2X2xlbik7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAoYXBtX2luZm8uZGlzYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IGRpc2FibGVkIG9uIHVzZXIgcmVxdWVzdC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmICFwb3dlcl9vZmYgJiYgIXNtcCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFwbTogZGlzYWJsZWQgLSBBUE0gaXMgbm90IFNNUCBzYWZlLlxuIik7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChQTV9JU19BQ1RJVkUoKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFwbTogb3ZlcnJpZGRlbiBieSBBQ1BJLlxuIik7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBtX2FjdGl2ZSA9IDE7CisKKwkvKgorCSAqIFNldCB1cCBhIHNlZ21lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSByZWFsIG1vZGUgc2VnbWVudCAweDQwCisJICogdGhhdCBleHRlbmRzIHVwIHRvIHRoZSBlbmQgb2YgcGFnZSB6ZXJvICh0aGF0IHdlIGhhdmUgcmVzZXJ2ZWQpLgorCSAqIFRoaXMgaXMgZm9yIGJ1Z2d5IEJJT1MncyB0aGF0IHJlZmVyIHRvIChyZWFsIG1vZGUpIHNlZ21lbnQgMHg0MAorCSAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGNhbGxlZCBpbiBwcm90ZWN0ZWQgbW9kZS4KKwkgKi8KKwlzZXRfYmFzZShiYWRfYmlvc19kZXNjLCBfX3ZhKCh1bnNpZ25lZCBsb25nKTB4NDAgPDwgNCkpOworCV9zZXRfbGltaXQoKGNoYXIgKikmYmFkX2Jpb3NfZGVzYywgNDA5NSAtICgweDQwIDw8IDQpKTsKKworCWFwbV9iaW9zX2VudHJ5Lm9mZnNldCA9IGFwbV9pbmZvLmJpb3Mub2Zmc2V0OworCWFwbV9iaW9zX2VudHJ5LnNlZ21lbnQgPSBBUE1fQ1M7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCXNldF9iYXNlKHBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTID4+IDNdLAorCQkJIF9fdmEoKHVuc2lnbmVkIGxvbmcpYXBtX2luZm8uYmlvcy5jc2VnIDw8IDQpKTsKKwkJc2V0X2Jhc2UocGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fQ1NfMTYgPj4gM10sCisJCQkgX192YSgodW5zaWduZWQgbG9uZylhcG1faW5mby5iaW9zLmNzZWdfMTYgPDwgNCkpOworCQlzZXRfYmFzZShwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9EUyA+PiAzXSwKKwkJCSBfX3ZhKCh1bnNpZ25lZCBsb25nKWFwbV9pbmZvLmJpb3MuZHNlZyA8PCA0KSk7CisjaWZuZGVmIEFQTV9SRUxBWF9TRUdNRU5UUworCQlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID09IDB4MTAwKSB7CisjZW5kaWYKKwkJCS8qIEZvciBBU1VTIG1vdGhlcmJvYXJkLCBBd2FyZCBCSU9TIHJldiAxMTAgKGFuZCBvdGhlcnM/KSAqLworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwgNjQgKiAxMDI0IC0gMSk7CisJCQkvKiBGb3Igc29tZSB1bmtub3duIG1hY2hpbmUuICovCisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTXzE2ID4+IDNdLCA2NCAqIDEwMjQgLSAxKTsKKwkJCS8qIEZvciB0aGUgREVDIEhpbm90ZSBVbHRyYSBDVDQ3NSAoYW5kIG90aGVycz8pICovCisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0RTID4+IDNdLCA2NCAqIDEwMjQgLSAxKTsKKyNpZm5kZWYgQVBNX1JFTEFYX1NFR01FTlRTCisJCX0gZWxzZSB7CisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTID4+IDNdLAorCQkJCShhcG1faW5mby5iaW9zLmNzZWdfbGVuIC0gMSkgJiAweGZmZmYpOworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DU18xNiA+PiAzXSwKKwkJCQkoYXBtX2luZm8uYmlvcy5jc2VnXzE2X2xlbiAtIDEpICYgMHhmZmZmKTsKKwkJCV9zZXRfbGltaXQoKGNoYXIgKikmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fRFMgPj4gM10sCisJCQkJKGFwbV9pbmZvLmJpb3MuZHNlZ19sZW4gLSAxKSAmIDB4ZmZmZik7CisJCSAgICAgIC8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBCSU9TZXMgKi8KKwkgICAgICAgICAgICAgICAgaWYgKGFwbV9pbmZvLmJpb3MuY3NlZ19sZW4gPD0gYXBtX2luZm8uYmlvcy5vZmZzZXQpCisgICAgICAgIAkgICAgICAgICAgICAgICAgX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwgNjQgKiAxMDI0IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwbV9pbmZvLmJpb3MuZHNlZ19sZW4gPD0gMHg0MCkgeyAvKiAweDQwICogNGtCID09IDY0a0IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBmb3IgdGhlIEJJT1MgdGhhdCBhc3N1bWVzIGdyYW51bGFyaXR5ID0gMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0RTID4+IDNdLmIgfD0gMHg4MDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IHdlIHNldCB0aGUgZ3JhbnVsYXJpdHkgb2YgZHNlZy5cbiIpOworICAgICAgICAJICAgICAgICB9CisJCX0KKyNlbmRpZgorCX0KKworCWFwbV9wcm9jID0gY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiYXBtIiwgMCwgTlVMTCwgYXBtX2dldF9pbmZvKTsKKwlpZiAoYXBtX3Byb2MpCisJCWFwbV9wcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0ga2VybmVsX3RocmVhZChhcG0sIE5VTEwsIENMT05FX0tFUk5FTCB8IFNJR0NITEQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXBtOiBkaXNhYmxlZCAtIFVuYWJsZSB0byBzdGFydCBrZXJuZWwgdGhyZWFkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEgJiYgIXNtcCApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICJhcG06IGRpc2FibGVkIC0gQVBNIGlzIG5vdCBTTVAgc2FmZSAocG93ZXIgb2ZmIGFjdGl2ZSkuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWlzY19yZWdpc3RlcigmYXBtX2RldmljZSk7CisKKwlpZiAoSFogIT0gMTAwKQorCQlpZGxlX3BlcmlvZCA9IChpZGxlX3BlcmlvZCAqIEhaKSAvIDEwMDsKKwlpZiAoaWRsZV90aHJlc2hvbGQgPCAxMDApIHsKKwkJb3JpZ2luYWxfcG1faWRsZSA9IHBtX2lkbGU7CisJCXBtX2lkbGUgID0gYXBtX2NwdV9pZGxlOworCQlzZXRfcG1faWRsZSA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcG1fZXhpdCh2b2lkKQoreworCWludAllcnJvcjsKKworCWlmIChzZXRfcG1faWRsZSkgeworCQlwbV9pZGxlID0gb3JpZ2luYWxfcG1faWRsZTsKKwkJLyoKKwkJICogV2UgYXJlIGFib3V0IHRvIHVubG9hZCB0aGUgY3VycmVudCBpZGxlIHRocmVhZCBwbSBjYWxsYmFjaworCQkgKiAocG1faWRsZSksIFdhaXQgZm9yIGFsbCBwcm9jZXNzb3JzIHRvIHVwZGF0ZSBjYWNoZWQvbG9jYWwKKwkJICogY29waWVzIG9mIHBtX2lkbGUgYmVmb3JlIHByb2NlZWRpbmcuCisJCSAqLworCQljcHVfaWRsZV93YWl0KCk7CisJfQorCWlmICgoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKSA9PSAwKQorCSAgICAmJiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgwMTAwKSkgeworCQllcnJvciA9IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudChBUE1fREVWSUNFX0FMTCwgMCk7CisJCWlmIChlcnJvcikKKwkJCWFwbV9lcnJvcigiZGlzZW5nYWdlIHBvd2VyIG1hbmFnZW1lbnQiLCBlcnJvcik7CisJfQorCW1pc2NfZGVyZWdpc3RlcigmYXBtX2RldmljZSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOworCWlmIChwb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZiA9IE5VTEw7CisJZXhpdF9rYXBtZCA9IDE7CisJd2hpbGUgKGthcG1kX3J1bm5pbmcpCisJCXNjaGVkdWxlKCk7CisJcG1fYWN0aXZlID0gMDsKK30KKworbW9kdWxlX2luaXQoYXBtX2luaXQpOworbW9kdWxlX2V4aXQoYXBtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIFJvdGh3ZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG1vZGUiKTsKK21vZHVsZV9wYXJhbShwb3dlcl9vZmYsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9vZmYsICJFbmFibGUgcG93ZXIgb2ZmIik7Cittb2R1bGVfcGFyYW0oYm91bmNlX2ludGVydmFsLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhib3VuY2VfaW50ZXJ2YWwsCisJCSJTZXQgdGhlIG51bWJlciBvZiB0aWNrcyB0byBpZ25vcmUgc3VzcGVuZCBib3VuY2VzIik7Cittb2R1bGVfcGFyYW0oYWxsb3dfaW50cywgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsbG93X2ludHMsICJBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBCSU9TIGNhbGxzIik7Cittb2R1bGVfcGFyYW0oYnJva2VuX3BzciwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJyb2tlbl9wc3IsICJCSU9TIGhhcyBhIGJyb2tlbiBHZXRQb3dlclN0YXR1cyBjYWxsIik7Cittb2R1bGVfcGFyYW0ocmVhbG1vZGVfcG93ZXJfb2ZmLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVhbG1vZGVfcG93ZXJfb2ZmLAorCQkiU3dpdGNoIHRvIHJlYWwgbW9kZSBiZWZvcmUgcG93ZXJpbmcgb2ZmIik7Cittb2R1bGVfcGFyYW0oaWRsZV90aHJlc2hvbGQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkbGVfdGhyZXNob2xkLAorCSJTeXN0ZW0gaWRsZSBwZXJjZW50YWdlIGFib3ZlIHdoaWNoIHRvIG1ha2UgQVBNIEJJT1MgaWRsZSBjYWxscyIpOworbW9kdWxlX3BhcmFtKGlkbGVfcGVyaW9kLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZGxlX3BlcmlvZCwKKwkiUGVyaW9kIChpbiBzZWMvMTAwKSBvdmVyIHdoaWNoIHRvIGNhY3VsYXRlIHRoZSBpZGxlIHBlcmNlbnRhZ2UiKTsKK21vZHVsZV9wYXJhbShzbXAsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzbXAsCisJIlNldCB0aGlzIHRvIGVuYWJsZSBBUE0gdXNlIG9uIGFuIFNNUCBwbGF0Zm9ybS4gVXNlIHdpdGggY2F1dGlvbiBvbiBvbGRlciBzeXN0ZW1zIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihBUE1fTUlOT1JfREVWKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ2NmUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBHZW5lcmF0ZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgYXNzZW1ibHkgbGFuZ3VhZ2UgbW9kdWxlcy4KKyAqIFRoaXMgY29kZSBnZW5lcmF0ZXMgcmF3IGFzbSBvdXRwdXQgd2hpY2ggaXMgcG9zdC1wcm9jZXNzZWQKKyAqIHRvIGV4dHJhY3QgYW5kIGZvcm1hdCB0aGUgcmVxdWlyZWQgZGF0YS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlICJzaWdmcmFtZS5oIgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCisgICAgICAgIGFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwpKQorCisjZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQorCisjZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCisJREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7CisKK3ZvaWQgZm9vKHZvaWQpCit7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWF4LCBzaWdjb250ZXh0LCBlYXgpOworCU9GRlNFVChTSUdDT05URVhUX2VieCwgc2lnY29udGV4dCwgZWJ4KTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lY3gsIHNpZ2NvbnRleHQsIGVjeCk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWR4LCBzaWdjb250ZXh0LCBlZHgpOworCU9GRlNFVChTSUdDT05URVhUX2VzaSwgc2lnY29udGV4dCwgZXNpKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lZGksIHNpZ2NvbnRleHQsIGVkaSk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWJwLCBzaWdjb250ZXh0LCBlYnApOworCU9GRlNFVChTSUdDT05URVhUX2VzcCwgc2lnY29udGV4dCwgZXNwKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9laXAsIHNpZ2NvbnRleHQsIGVpcCk7CisJQkxBTksoKTsKKworCU9GRlNFVChDUFVJTkZPX3g4NiwgY3B1aW5mb194ODYsIHg4Nik7CisJT0ZGU0VUKENQVUlORk9feDg2X3ZlbmRvciwgY3B1aW5mb194ODYsIHg4Nl92ZW5kb3IpOworCU9GRlNFVChDUFVJTkZPX3g4Nl9tb2RlbCwgY3B1aW5mb194ODYsIHg4Nl9tb2RlbCk7CisJT0ZGU0VUKENQVUlORk9feDg2X21hc2ssIGNwdWluZm9feDg2LCB4ODZfbWFzayk7CisJT0ZGU0VUKENQVUlORk9faGFyZF9tYXRoLCBjcHVpbmZvX3g4NiwgaGFyZF9tYXRoKTsKKwlPRkZTRVQoQ1BVSU5GT19jcHVpZF9sZXZlbCwgY3B1aW5mb194ODYsIGNwdWlkX2xldmVsKTsKKwlPRkZTRVQoQ1BVSU5GT194ODZfY2FwYWJpbGl0eSwgY3B1aW5mb194ODYsIHg4Nl9jYXBhYmlsaXR5KTsKKwlPRkZTRVQoQ1BVSU5GT194ODZfdmVuZG9yX2lkLCBjcHVpbmZvX3g4NiwgeDg2X3ZlbmRvcl9pZCk7CisJQkxBTksoKTsKKworCU9GRlNFVChUSV90YXNrLCB0aHJlYWRfaW5mbywgdGFzayk7CisJT0ZGU0VUKFRJX2V4ZWNfZG9tYWluLCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pOworCU9GRlNFVChUSV9mbGFncywgdGhyZWFkX2luZm8sIGZsYWdzKTsKKwlPRkZTRVQoVElfc3RhdHVzLCB0aHJlYWRfaW5mbywgc3RhdHVzKTsKKwlPRkZTRVQoVElfY3B1LCB0aHJlYWRfaW5mbywgY3B1KTsKKwlPRkZTRVQoVElfcHJlZW1wdF9jb3VudCwgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpOworCU9GRlNFVChUSV9hZGRyX2xpbWl0LCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CisJT0ZGU0VUKFRJX3Jlc3RhcnRfYmxvY2ssIHRocmVhZF9pbmZvLCByZXN0YXJ0X2Jsb2NrKTsKKwlCTEFOSygpOworCisJT0ZGU0VUKEVYRUNfRE9NQUlOX2hhbmRsZXIsIGV4ZWNfZG9tYWluLCBoYW5kbGVyKTsKKwlPRkZTRVQoUlRfU0lHRlJBTUVfc2lnY29udGV4dCwgcnRfc2lnZnJhbWUsIHVjLnVjX21jb250ZXh0KTsKKwlCTEFOSygpOworCisJT0ZGU0VUKHBiZV9hZGRyZXNzLCBwYmUsIGFkZHJlc3MpOworCU9GRlNFVChwYmVfb3JpZ19hZGRyZXNzLCBwYmUsIG9yaWdfYWRkcmVzcyk7CisJT0ZGU0VUKHBiZV9uZXh0LCBwYmUsIG5leHQpOworCisJLyogT2Zmc2V0IGZyb20gdGhlIHN5c2VudGVyIHN0YWNrIHRvIHRzcy5lc3AwICovCisJREVGSU5FKFRTU19zeXNlbnRlcl9lc3AwLCBvZmZzZXRvZihzdHJ1Y3QgdHNzX3N0cnVjdCwgZXNwMCkgLQorCQkgc2l6ZW9mKHN0cnVjdCB0c3Nfc3RydWN0KSk7CisKKwlERUZJTkUoUEFHRV9TSVpFX2FzbSwgUEFHRV9TSVpFKTsKKwlERUZJTkUoVlNZU0NBTExfQkFTRSwgX19maXhfdG9fdmlydChGSVhfVlNZU0NBTEwpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYm9vdGZsYWcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYm9vdGZsYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMwZWQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ib290ZmxhZy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKglJbXBsZW1lbnQgJ1NpbXBsZSBCb290IEZsYWcgU3BlY2lmaWNhdGlvbiAyLjAnCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKworCisjZGVmaW5lIFNCRl9SRVNFUlZFRCAoMHg3OCkKKyNkZWZpbmUgU0JGX1BOUE9TICAgICgxPDwwKQorI2RlZmluZSBTQkZfQk9PVElORyAgKDE8PDEpCisjZGVmaW5lIFNCRl9ESUFHICAgICAoMTw8MikKKyNkZWZpbmUgU0JGX1BBUklUWSAgICgxPDw3KQorCisKK2ludCBzYmZfcG9ydCBfX2luaXRkYXRhID0gLTE7CS8qIHNldCB2aWEgYWNwaV9ib290X2luaXQoKSAqLworCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcml0eSh1OCB2KQoreworCWludCB4ID0gMDsKKwlpbnQgaTsKKwkKKwlmb3IoaT0wO2k8ODtpKyspCisJeworCQl4Xj0odiYxKTsKKwkJdj4+PTE7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2JmX3dyaXRlKHU4IHYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZihzYmZfcG9ydCAhPSAtMSkKKwl7CisJCXYgJj0gflNCRl9QQVJJVFk7CisJCWlmKCFwYXJpdHkodikpCisJCQl2fD1TQkZfUEFSSVRZOworCisJCXByaW50ayhLRVJOX0lORk8gIlNpbXBsZSBCb290IEZsYWcgYXQgMHgleCBzZXQgdG8gMHgleFxuIiwgc2JmX3BvcnQsIHYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCQlDTU9TX1dSSVRFKHYsIHNiZl9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB1OCBfX2luaXQgc2JmX3JlYWQodm9pZCkKK3sKKwl1OCB2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYoc2JmX3BvcnQgPT0gLTEpCisJCXJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXYgPSBDTU9TX1JFQUQoc2JmX3BvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNiZl92YWx1ZV92YWxpZCh1OCB2KQoreworCWlmKHYmU0JGX1JFU0VSVkVEKQkJLyogUmVzZXJ2ZWQgYml0cyAqLworCQlyZXR1cm4gMDsKKwlpZighcGFyaXR5KHYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2JmX2luaXQodm9pZCkKK3sKKwl1OCB2OworCWlmKHNiZl9wb3J0ID09IC0xKQorCQlyZXR1cm4gMDsKKwl2ID0gc2JmX3JlYWQoKTsKKwlpZighc2JmX3ZhbHVlX3ZhbGlkKHYpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTaW1wbGUgQm9vdCBGbGFnIHZhbHVlIDB4JXggcmVhZCBmcm9tIENNT1MgUkFNIHdhcyBpbnZhbGlkXG4iLHYpOworCisJdiAmPSB+U0JGX1JFU0VSVkVEOworCXYgJj0gflNCRl9CT09USU5HOworCXYgJj0gflNCRl9ESUFHOworI2lmIGRlZmluZWQoQ09ORklHX0lTQVBOUCkKKwl2IHw9IFNCRl9QTlBPUzsKKyNlbmRpZgorCXNiZl93cml0ZSh2KTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoc2JmX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBhZWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIworIyBNYWtlZmlsZSBmb3IgeDg2LWNvbXBhdGlibGUgQ1BVIGRldGFpbHMgYW5kIHF1aXJrcworIworCitvYmoteQk6PQljb21tb24ubyBwcm9jLm8KKworb2JqLXkJKz0JYW1kLm8KK29iai15CSs9CWN5cml4Lm8KK29iai15CSs9CWNlbnRhdXIubworb2JqLXkJKz0JdHJhbnNtZXRhLm8KK29iai15CSs9CWludGVsLm8gaW50ZWxfY2FjaGVpbmZvLm8KK29iai15CSs9CXJpc2Uubworb2JqLXkJKz0JbmV4Z2VuLm8KK29iai15CSs9CXVtYy5vCisKK29iai0kKENPTkZJR19YODZfTUNFKQkrPQltY2hlY2svCisKK29iai0kKENPTkZJR19NVFJSKQkrPSAJbXRyci8KK29iai0kKENPTkZJR19DUFVfRlJFUSkJKz0JY3B1ZnJlcS8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NDU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC0wLDAgKzEsMjQ5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qCisgKglCIHN0ZXAgQU1EIEs2IGJlZm9yZSBCIDk3MzB4eHh4IGhhdmUgaGFyZHdhcmUgYnVncyB0aGF0IGNhbiBjYXVzZQorICoJbWlzZXhlY3V0aW9uIG9mIGNvZGUgdW5kZXIgTGludXguIE93bmVycyBvZiBzdWNoIHByb2Nlc3NvcnMgc2hvdWxkCisgKgljb250YWN0IEFNRCBmb3IgcHJlY2lzZSBkZXRhaWxzIGFuZCBhIENQVSBzd2FwLgorICoKKyAqCVNlZQlodHRwOi8vd3d3Lm11bHRpbWFuaWEuY29tL3BvdWxvdC9rNmJ1Zy5odG1sCisgKgkJaHR0cDovL3d3dy5hbWQuY29tL0s2L2s2ZG9jcy9yZXZnZC5odG1sCisgKgorICoJVGhlIGZvbGxvd2luZyB0ZXN0IGlzIGVybS4uIGludGVyZXN0aW5nLiBBTUQgbmVnbGVjdGVkIHRvIHVwCisgKgl0aGUgY2hpcCBzZXR0aW5nIHdoZW4gZml4aW5nIHRoZSBidWcgYnV0IHRoZXkgYWxzbyB0d2Vha2VkIHNvbWUKKyAqCXBlcmZvcm1hbmNlIGF0IHRoZSBzYW1lIHRpbWUuLgorICovCisgCitleHRlcm4gdm9pZCB2aWRlKHZvaWQpOworX19hc21fXygiLmFsaWduIDRcbnZpZGU6IHJldCIpOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCWludCBtYnl0ZXMgPSBudW1fcGh5c3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKTsKKwlpbnQgcjsKKworCS8qCisJICoJRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgdGhlIEs1IGhlcmUuIFNldCB1cCB0aGUgd3JpdGUKKwkgKglyYW5nZSBhbmQgYWxzbyB0dXJuIG9uIE1TUiA4MyBiaXRzIDQgYW5kIDMxICh3cml0ZSBhbGxvYywKKwkgKglubyBidXMgcGlwZWxpbmUpCisJICovCisKKwkvKiBCaXQgMzEgaW4gbm9ybWFsIENQVUlEIHVzZWQgZm9yIG5vbnN0YW5kYXJkIDNETm93IElEOworCSAgIDNETm93IGlzIElEZCBieSBiaXQgMzEgaW4gZXh0ZW5kZWQgQ1BVSUQgKDEqMzIrMzEpIGFueXdheSAqLworCWNsZWFyX2JpdCgwKjMyKzMxLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCisJciA9IGdldF9tb2RlbF9uYW1lKGMpOworCisJc3dpdGNoKGMtPng4NikKKwl7CisJCWNhc2UgNDoKKwkJLyoKKwkJICogR2VuZXJhbCBTeXN0ZW1zIEJJT1NlbiBhbGlhcyB0aGUgY3B1IGZyZXF1ZW5jeSByZWdpc3RlcnMKKwkJICogb2YgdGhlIEVsYW4gYXQgMHgwMDBkZjAwMC4gVW5mb3J0dWFudGx5LCBvbmUgb2YgdGhlIExpbnV4CisJCSAqIGRyaXZlcnMgc3Vic2VxdWVudGx5IHBva2VzIGl0LCBhbmQgY2hhbmdlcyB0aGUgQ1BVIHNwZWVkLgorCQkgKiBXb3JrYXJvdW5kIDogUmVtb3ZlIHRoZSB1bm5lZWRlZCBhbGlhcy4KKwkJICovCisjZGVmaW5lIENCQVIJCSgweGZmZmMpIC8qIENvbmZpZ3VyYXRpb24gQmFzZSBBZGRyZXNzICAoMzItYml0KSAqLworI2RlZmluZSBDQkFSX0VOQgkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgQ0JBUl9LRVkJKDBYMDAwMDAwQ0IpCisJCQlpZiAoYy0+eDg2X21vZGVsPT05IHx8IGMtPng4Nl9tb2RlbCA9PSAxMCkgeworCQkJCWlmIChpbmwgKENCQVIpICYgQ0JBUl9FTkIpCisJCQkJCW91dGwgKDAgfCBDQkFSX0tFWSwgQ0JBUik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaWYoIGMtPng4Nl9tb2RlbCA8IDYgKQorCQkJeworCQkJCS8qIEJhc2VkIG9uIEFNRCBkb2MgMjA3MzRSIC0gSnVuZSAyMDAwICovCisJCQkJaWYgKCBjLT54ODZfbW9kZWwgPT0gMCApIHsKKwkJCQkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQkJc2V0X2JpdChYODZfRkVBVFVSRV9QR0UsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWlmICggYy0+eDg2X21vZGVsID09IDYgJiYgYy0+eDg2X21hc2sgPT0gMSApIHsKKwkJCQljb25zdCBpbnQgSzZfQlVHX0xPT1AgPSAxMDAwMDAwOworCQkJCWludCBuOworCQkJCXZvaWQgKCpmX3ZpZGUpKHZvaWQpOworCQkJCXVuc2lnbmVkIGxvbmcgZCwgZDI7CisJCQkJCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEs2IHN0ZXBwaW5nIEIgZGV0ZWN0ZWQgLSAiKTsKKwkJCQkKKwkJCQkvKgorCQkJCSAqIEl0IGxvb2tzIGxpa2UgQU1EIGZpeGVkIHRoZSAyLjYuMiBidWcgYW5kIGltcHJvdmVkIGluZGlyZWN0IAorCQkJCSAqIGNhbGxzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisKKwkJCQluID0gSzZfQlVHX0xPT1A7CisJCQkJZl92aWRlID0gdmlkZTsKKwkJCQlyZHRzY2woZCk7CisJCQkJd2hpbGUgKG4tLSkgCisJCQkJCWZfdmlkZSgpOworCQkJCXJkdHNjbChkMik7CisJCQkJZCA9IGQyLWQ7CisJCQkJCisJCQkJLyogS25vY2sgdGhlc2UgdHdvIGxpbmVzIG91dCBpZiBpdCBkZWJ1Z3Mgb3V0IG9rICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEs2IHN0ZXBwaW5nIEIgZGV0ZWN0ZWQgLSAiKTsKKwkJCQkvKiAtLSBjdXQgaGVyZSAtLSAqLworCQkJCWlmIChkID4gMjAqSzZfQlVHX0xPT1ApIAorCQkJCQlwcmludGsoInN5c3RlbSBzdGFiaWxpdHkgbWF5IGJlIGltcGFpcmVkIHdoZW4gbW9yZSB0aGFuIDMyIE1CIGFyZSB1c2VkLlxuIik7CisJCQkJZWxzZSAKKwkJCQkJcHJpbnRrKCJwcm9iYWJseSBPSyAoYWZ0ZXIgQjk3MzB4eHh4KS5cbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBzZWUgaHR0cDovL21lbWJyZXMubHljb3MuZnIvcG91bG90L2s2YnVnLmh0bWxcbiIpOworCQkJfQorCisJCQkvKiBLNiB3aXRoIG9sZCBzdHlsZSBXSENSICovCisJCQlpZiAoYy0+eDg2X21vZGVsIDwgOCB8fAorCQkJICAgKGMtPng4Nl9tb2RlbD09IDggJiYgYy0+eDg2X21hc2sgPCA4KSkgeworCQkJCS8qIFdlIGNhbiBvbmx5IHdyaXRlIGFsbG9jYXRlIG9uIHRoZSBsb3cgNTA4TWIgKi8KKwkJCQlpZihtYnl0ZXM+NTA4KQorCQkJCQltYnl0ZXM9NTA4OworCisJCQkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOworCQkJCWlmICgobCYweDAwMDBGRkZGKT09MCkgeworCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQlsPSgxPDwwKXwoKG1ieXRlcy80KTw8MSk7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJd2JpbnZkKCk7CisJCQkJCXdybXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBvbGQgc3R5bGUgSzYgd3JpdGUgYWxsb2NhdGlvbiBmb3IgJWQgTWJcbiIsCisJCQkJCQltYnl0ZXMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+NykgfHwKKwkJCSAgICAgYy0+eDg2X21vZGVsID09IDkgfHwgYy0+eDg2X21vZGVsID09IDEzKSB7CisJCQkJLyogVGhlIG1vcmUgc2VyaW91cyBjaGlwcyAuLiAqLworCisJCQkJaWYobWJ5dGVzPjQwOTIpCisJCQkJCW1ieXRlcz00MDkyOworCisJCQkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOworCQkJCWlmICgobCYweEZGRkYwMDAwKT09MCkgeworCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQlsPSgobWJ5dGVzPj4yKTw8MjIpfCgxPDwxNik7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJd2JpbnZkKCk7CisJCQkJCXdybXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBuZXcgc3R5bGUgSzYgd3JpdGUgYWxsb2NhdGlvbiBmb3IgJWQgTWJcbiIsCisJCQkJCQltYnl0ZXMpOworCQkJCX0KKworCQkJCS8qICBTZXQgTVRSUiBjYXBhYmlsaXR5IGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwkJCQlpZiAoYy0+eDg2X21vZGVsID09IDEzIHx8IGMtPng4Nl9tb2RlbCA9PSA5IHx8CisJCQkJICAgKGMtPng4Nl9tb2RlbCA9PSA4ICYmIGMtPng4Nl9tYXNrID49IDgpKQorCQkJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0s2X01UUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgNjogLyogQW4gQXRobG9uL0R1cm9uICovCisgCisJCQkvKiBCaXQgMTUgb2YgQXRobG9uIHNwZWNpZmljIE1TUiAxNSwgbmVlZHMgdG8gYmUgMAorIAkJCSAqIHRvIGVuYWJsZSBTU0Ugb24gUGFsb21pbm8vTW9yZ2FuL0JhcnRvbiBDUFUncy4KKwkJCSAqIElmIHRoZSBCSU9TIGRpZG4ndCBlbmFibGUgaXQgYWxyZWFkeSwgZW5hYmxlIGl0IGhlcmUuCisJCQkgKi8KKwkJCWlmIChjLT54ODZfbW9kZWwgPj0gNiAmJiBjLT54ODZfbW9kZWwgPD0gMTApIHsKKwkJCQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NKSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBkaXNhYmxlZCBLNy9TU0UgU3VwcG9ydC5cbiIpOworCQkJCQlyZG1zcihNU1JfSzdfSFdDUiwgbCwgaCk7CisJCQkJCWwgJj0gfjB4MDAwMDgwMDA7CisJCQkJCXdybXNyKE1TUl9LN19IV0NSLCBsLCBoKTsKKwkJCQkJc2V0X2JpdChYODZfRkVBVFVSRV9YTU0sIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEl0J3MgYmVlbiBkZXRlcm1pbmVkIGJ5IEFNRCB0aGF0IEF0aGxvbnMgc2luY2UgbW9kZWwgOCBzdGVwcGluZyAxCisJCQkgKiBhcmUgbW9yZSByb2J1c3Qgd2l0aCBDTEtfQ1RMIHNldCB0byAyMDB4eHh4eCBpbnN0ZWFkIG9mIDYwMHh4eHh4CisJCQkgKiBBcyBwZXIgQU1EIHRlY2huaWNhbCBub3RlIDI3MjEyIDAuMgorCQkJICovCisJCQlpZiAoKGMtPng4Nl9tb2RlbCA9PSA4ICYmIGMtPng4Nl9tYXNrPj0xKSB8fCAoYy0+eDg2X21vZGVsID4gOCkpIHsKKwkJCQlyZG1zcihNU1JfSzdfQ0xLX0NUTCwgbCwgaCk7CisJCQkJaWYgKChsICYgMHhmZmYwMDAwMCkgIT0gMHgyMDAwMDAwMCkgeworCQkJCQlwcmludGsgKCJDUFU6IENMS19DVEwgTVNSIHdhcyAleC4gUmVwcm9ncmFtbWluZyB0byAleFxuIiwgbCwKKwkJCQkJCSgobCAmIDB4MDAwZmZmZmYpfDB4MjAwMDAwMDApKTsKKwkJCQkJd3Jtc3IoTVNSX0s3X0NMS19DVEwsIChsICYgMHgwMDBmZmZmZil8MHgyMDAwMDAwMCwgaCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDE1OgorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0s4LCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2V0X2JpdChYODZfRkVBVFVSRV9LNywgYy0+eDg2X2NhcGFiaWxpdHkpOyAKKwkJYnJlYWs7CisJfQorCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisJZGV0ZWN0X2h0KGMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCS8qIEFNRCBkdWFsIGNvcmUgbG9va3MgbGlrZSBIVCBidXQgaXNuJ3QgcmVhbGx5LiBIaWRlIGl0IGZyb20gdGhlCisJICAgc2NoZWR1bGVyLiBUaGlzIHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIHRoZSBkb21haW4gc2NoZWR1bGVyLgorCSAgIEFsc28gcHJvYmFibHkgZ2l2ZXMgc2xpZ2h0bHkgYmV0dGVyIHNjaGVkdWxpbmcgYW5kIGRpc2FibGVzCisJICAgU01UIG5pY2Ugd2hpY2ggaXMgaGFybWZ1bCBvbiBkdWFsIGNvcmUuCisJICAgVEJEIHR1bmUgdGhlIGRvbWFpbiBzY2hlZHVsZXIgZm9yIGR1YWwgY29yZS4gKi8KKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DTVBfTEVHQUNZKSkKKwkJc21wX251bV9zaWJsaW5ncyA9IDE7CisjZW5kaWYKKworCWlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwOCkgeworCQljLT54ODZfbnVtX2NvcmVzID0gKGNwdWlkX2VjeCgweDgwMDAwMDA4KSAmIDB4ZmYpICsgMTsKKwkJaWYgKGMtPng4Nl9udW1fY29yZXMgJiAoYy0+eDg2X251bV9jb3JlcyAtIDEpKQorCQkJYy0+eDg2X251bV9jb3JlcyA9IDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIEFNRCBlcnJhdGEgVDEzIChvcmRlciAjMjE5MjIpICovCisJaWYgKChjLT54ODYgPT0gNikpIHsKKwkJaWYgKGMtPng4Nl9tb2RlbCA9PSAzICYmIGMtPng4Nl9tYXNrID09IDApCS8qIER1cm9uIFJldiBBMCAqLworCQkJc2l6ZSA9IDY0OworCQlpZiAoYy0+eDg2X21vZGVsID09IDQgJiYKKwkJICAgIChjLT54ODZfbWFzaz09MCB8fCBjLT54ODZfbWFzaz09MSkpCS8qIFRiaXJkIHJldiBBMS9BMiAqLworCQkJc2l6ZSA9IDI1NjsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBhbWRfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJBTUQiLAorCS5jX2lkZW50IAk9IHsgIkF1dGhlbnRpY0FNRCIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfQU1ELCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KKwkJICB7CisJCQkgIFszXSA9ICI0ODYgRFgvMiIsCisJCQkgIFs3XSA9ICI0ODYgRFgvMi1XQiIsCisJCQkgIFs4XSA9ICI0ODYgRFgvNCIsIAorCQkJICBbOV0gPSAiNDg2IERYLzQtV0IiLCAKKwkJCSAgWzE0XSA9ICJBbTV4ODYtV1QiLAorCQkJICBbMTVdID0gIkFtNXg4Ni1XQiIgCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X2FtZCwKKwkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCisJLmNfc2l6ZV9jYWNoZQk9IGFtZF9zaXplX2NhY2hlLAorfTsKKworaW50IF9faW5pdCBhbWRfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX0FNRF0gPSAmYW1kX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChhbWRfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDgxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jZW50YXVyLmMKQEAgLTAsMCArMSw0NzYgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgImNwdS5oIgorCisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisKK3N0YXRpYyB1MzIgX19pbml0IHBvd2VyMih1MzIgeCkKK3sKKwl1MzIgcz0xOworCXdoaWxlKHM8PXgpCisJCXM8PD0xOworCXJldHVybiBzPj49MTsKK30KKworCisvKgorICoJU2V0IHVwIGFuIGFjdHVhbCBNQ1IKKyAqLworIAorc3RhdGljIHZvaWQgX19pbml0IGNlbnRhdXJfbWNyX2luc2VydChpbnQgcmVnLCB1MzIgYmFzZSwgdTMyIHNpemUsIGludCBrZXkpCit7CisJdTMyIGxvLCBoaTsKKwkKKwloaSA9IGJhc2UgJiB+MHhGRkY7CisJbG8gPSB+KHNpemUtMSk7CQkvKiBTaXplIGlzIGEgcG93ZXIgb2YgMiBzbyB0aGlzIG1ha2VzIGEgbWFzayAqLworCWxvICY9IH4weEZGRjsJCS8qIFJlbW92ZSB0aGUgY3RybCB2YWx1ZSBiaXRzICovCisJbG8gfD0ga2V5OwkJLyogQXR0cmlidXRlIHdlIHdpc2ggdG8gc2V0ICovCisJd3Jtc3IocmVnK01TUl9JRFRfTUNSMCwgbG8sIGhpKTsKKwltdHJyX2NlbnRhdXJfcmVwb3J0X21jcihyZWcsIGxvLCBoaSk7CS8qIFRlbGwgdGhlIG10cnIgZHJpdmVyICovCit9CisKKy8qCisgKglGaWd1cmUgd2hhdCB3ZSBjYW4gY292ZXIgd2l0aCBNQ1IncworICoKKyAqCVNob3J0Y3V0OiBXZSBrbm93IHlvdSBjYW4ndCBwdXQgNEdpZyBvZiBSQU0gb24gYSB3aW5jaGlwCisgKi8KKworc3RhdGljIHUzMiBfX2luaXQgcmFtdG9wKHZvaWQpCQkvKiAxNjM4OCAqLworeworCWludCBpOworCXUzMiB0b3AgPSAwOworCXUzMiBjbGlwID0gMHhGRkZGRkZGRlVMOworCQorCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCQlpZiAoZTgyMC5tYXBbaV0uYWRkciA+IDB4RkZGRkZGRkZVTCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKglEb24ndCBNQ1Igb3ZlciByZXNlcnZlZCBzcGFjZS4gSWdub3JlIHRoZSBJU0EgaG9sZQorCQkgKgl3ZSBmcm9iIGFyb3VuZCB0aGF0IGNhdGFzdHJvcGh5IGFscmVhZHkKKwkJICovCisJCSAJCQkKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SRVNFUlZFRCkKKwkJeworCQkJaWYoZTgyMC5tYXBbaV0uYWRkciA+PSAweDEwMDAwMFVMICYmIGU4MjAubWFwW2ldLmFkZHIgPCBjbGlwKQorCQkJCWNsaXAgPSBlODIwLm1hcFtpXS5hZGRyOworCQkJY29udGludWU7CisJCX0KKwkJc3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOworCQllbmQgPSBlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZTsKKwkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZW5kID4gdG9wKQorCQkJdG9wID0gZW5kOworCX0KKwkvKiBFdmVyeXRoaW5nIGJlbG93ICd0b3AnIHNob3VsZCBiZSBSQU0gZXhjZXB0IGZvciB0aGUgSVNBIGhvbGUuCisJICAgQmVjYXVzZSBvZiB0aGUgbGltaXRlZCBNQ1IncyB3ZSB3YW50IHRvIG1hcCBOVi9BQ1BJIGludG8gb3VyCisJICAgTUNSIHJhbmdlIGZvciBndW5rIGluIFJBTSAKKwkgICAKKwkgICBDbGlwIG1pZ2h0IGNhdXNlIHVzIHRvIE1DUiBpbnN1ZmZpY2llbnQgUkFNIGJ1dCB0aGF0IGlzIGFuCisJICAgYWNjZXB0YWJsZSBmYWlsdXJlIG1vZGUgYW5kIHNob3VsZCBvbmx5IGJpdGUgb2JzY3VyZSBib3hlcyB3aXRoCisJICAgYSBWRVNBIGhvbGUgYXQgMTVNYgorCSAgIAorCSAgIFRoZSBzZWNvbmQgY2FzZSBDbGlwIHNvbWV0aW1lcyBraWNrcyBpbiBpcyB3aGVuIHRoZSBFQkRBIGlzIG1hcmtlZAorCSAgIGFzIHJlc2VydmVkLiBBZ2FpbiB3ZSBmYWlsIHNhZmUgd2l0aCByZWFzb25hYmxlIHJlc3VsdHMKKwkqLworCQorCWlmKHRvcD5jbGlwKQorCQl0b3A9Y2xpcDsKKwkJCisJcmV0dXJuIHRvcDsKK30KKworLyoKKyAqCUNvbXB1dGUgYSBzZXQgb2YgTUNSJ3MgdG8gZ2l2ZSBtYXhpbXVtIGNvdmVyYWdlCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2VudGF1cl9tY3JfY29tcHV0ZShpbnQgbnIsIGludCBrZXkpCit7CisJdTMyIG1lbSA9IHJhbXRvcCgpOworCXUzMiByb290ID0gcG93ZXIyKG1lbSk7CisJdTMyIGJhc2UgPSByb290OworCXUzMiB0b3AgPSByb290OworCXUzMiBmbG9vciA9IDA7CisJaW50IGN0ID0gMDsKKwkKKwl3aGlsZShjdDxucikKKwl7CisJCXUzMiBmc3BhY2UgPSAwOworCisJCS8qCisJCSAqCUZpbmQgdGhlIGxhcmdlc3QgYmxvY2sgd2Ugd2lsbCBmaWxsIGdvaW5nIHVwd2FyZHMKKwkJICovCisKKwkJdTMyIGhpZ2ggPSBwb3dlcjIobWVtLXRvcCk7CQorCisJCS8qCisJCSAqCUZpbmQgdGhlIGxhcmdlc3QgYmxvY2sgd2Ugd2lsbCBmaWxsIGdvaW5nIGRvd253YXJkcworCQkgKi8KKworCQl1MzIgbG93ID0gYmFzZS8yOworCisJCS8qCisJCSAqCURvbid0IGZpbGwgYmVsb3cgMU1iIGdvaW5nIGRvd253YXJkcyBhcyB0aGVyZQorCQkgKglpcyBhbiBJU0EgaG9sZSBpbiB0aGUgd2F5LgorCQkgKi8JCQorCQkgCisJCWlmKGJhc2UgPD0gMTAyNCoxMDI0KQorCQkJbG93ID0gMDsKKwkJCQorCQkvKgorCQkgKglTZWUgaG93IG11Y2ggc3BhY2Ugd2UgY291bGQgY292ZXIgYnkgZmlsbGluZyBiZWxvdworCQkgKgl0aGUgSVNBIGhvbGUKKwkJICovCisJCSAKKwkJaWYoZmxvb3IgPT0gMCkKKwkJCWZzcGFjZSA9IDUxMioxMDI0OworCQllbHNlIGlmKGZsb29yID09NTEyKjEwMjQpCisJCQlmc3BhY2UgPSAxMjgqMTAyNDsKKworCQkvKiBBbmQgZm9yZ2V0IFJPTSBzcGFjZSAqLworCQkKKwkJLyoKKwkJICoJTm93IGluc3RhbGwgdGhlIGxhcmdlc3QgY292ZXJhZ2Ugd2UgZ2V0CisJCSAqLworCQkgCisJCWlmKGZzcGFjZSA+IGhpZ2ggJiYgZnNwYWNlID4gbG93KQorCQl7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIGZsb29yLCBmc3BhY2UsIGtleSk7CisJCQlmbG9vciArPSBmc3BhY2U7CisJCX0KKwkJZWxzZSBpZihoaWdoID4gbG93KQorCQl7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIHRvcCwgaGlnaCwga2V5KTsKKwkJCXRvcCArPSBoaWdoOworCQl9CisJCWVsc2UgaWYobG93ID4gMCkKKwkJeworCQkJYmFzZSAtPSBsb3c7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIGJhc2UsIGxvdywga2V5KTsKKwkJfQorCQllbHNlIGJyZWFrOworCQljdCsrOworCX0KKwkvKgorCSAqCVdlIGxvYWRlZCBjdCB2YWx1ZXMuIFdlIG5vdyBuZWVkIHRvIHNldCB0aGUgbWFzay4gVGhlIGNhbGxlcgorCSAqCW11c3QgZG8gdGhpcyBiaXQuCisJICovCisJIAorCXJldHVybiBjdDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNlbnRhdXJfY3JlYXRlX29wdGltYWxfbWNyKHZvaWQpCit7CisJaW50IGk7CisJLyoKKwkgKglBbGxvY2F0ZSB1cCB0byA2IG1jcnMgdG8gbWFyayBhcyBtdWNoIG9mIHJhbSBhcyBwb3NzaWJsZQorCSAqCWFzIHdyaXRlIGNvbWJpbmluZyBhbmQgd2VhayB3cml0ZSBvcmRlcmVkLgorCSAqCisJICoJVG8gZXhwZXJpbWVudCB3aXRoOiBMaW51eCBuZXZlciB1c2VzIHN0YWNrIG9wZXJhdGlvbnMgZm9yIAorCSAqCW1taW8gc3BhY2VzIHNvIHdlIGNvdWxkIGdsb2JhbGx5IGVuYWJsZSBzdGFjayBvcGVyYXRpb24gd2MKKwkgKgorCSAqCUxvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIHR5cGUgMzEgLSBmdWxsIHdyaXRlIGNvbWJpbmluZywgYWxsCisJICoJd3JpdGVzIHdlYWtseSBvcmRlcmVkLgorCSAqLworCWludCB1c2VkID0gY2VudGF1cl9tY3JfY29tcHV0ZSg2LCAzMSk7CisKKwkvKgorCSAqCVdpcGUgdW51c2VkIE1DUnMKKwkgKi8KKwkgCisJZm9yKGk9dXNlZDtpPDg7aSsrKQorCQl3cm1zcihNU1JfSURUX01DUjAraSwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl9jcmVhdGVfb3B0aW1hbF9tY3Iodm9pZCkKK3sKKwl1MzIgbG8sIGhpOworCWludCBpOworCisJLyoKKwkgKglBbGxvY2F0ZSB1cCB0byA2IG1jcnMgdG8gbWFyayBhcyBtdWNoIG9mIHJhbSBhcyBwb3NzaWJsZQorCSAqCWFzIHdyaXRlIGNvbWJpbmluZywgd2VhayBzdG9yZSBvcmRlcmVkLgorCSAqCisJICoJTG9hZCB0aGUgcmVnaXN0ZXJzIHdpdGggdHlwZSAyNQorCSAqCQk4CS0Jd2VhayB3cml0ZSBvcmRlcmluZworCSAqCQkxNgktCXdlYWsgcmVhZCBvcmRlcmluZworCSAqCQkxCS0Jd3JpdGUgY29tYmluaW5nCisJICovCisKKwlpbnQgdXNlZCA9IGNlbnRhdXJfbWNyX2NvbXB1dGUoNiwgMjUpOworCQorCS8qCisJICoJTWFyayB0aGUgcmVnaXN0ZXJzIHdlIGFyZSB1c2luZy4KKwkgKi8KKwkgCisJcmRtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwlmb3IoaT0wO2k8dXNlZDtpKyspCisJCWxvfD0xPDwoOStpKTsKKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQorCS8qCisJICoJV2lwZSB1bnVzZWQgTUNScworCSAqLworCSAKKwlmb3IoaT11c2VkO2k8ODtpKyspCisJCXdybXNyKE1TUl9JRFRfTUNSMCtpLCAwLCAwKTsKK30KKworLyoKKyAqCUhhbmRsZSB0aGUgTUNSIGtleSBvbiB0aGUgV2luY2hpcCAyLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl91bnByb3RlY3RfbWNyKHZvaWQpCit7CisJdTMyIGxvLCBoaTsKKwl1MzIga2V5OworCQorCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJbG8mPX4weDFDMDsJLyogYmxhbmsgYml0cyA4LTYgKi8KKwlrZXkgPSAobG8+PjE3KSAmIDc7CisJbG8gfD0ga2V5PDw2OwkvKiByZXBsYWNlIHdpdGggdW5sb2NrIGtleSAqLworCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl9wcm90ZWN0X21jcih2b2lkKQoreworCXUzMiBsbywgaGk7CisJCisJcmRtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwlsbyY9fjB4MUMwOwkvKiBibGFuayBiaXRzIDgtNiAqLworCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9PT1NUT1JFICovCisKKyNkZWZpbmUgQUNFX1BSRVNFTlQJKDEgPDwgNikKKyNkZWZpbmUgQUNFX0VOQUJMRUQJKDEgPDwgNykKKyNkZWZpbmUgQUNFX0ZDUgkJKDEgPDwgMjgpCS8qIE1TUl9WSUFfRkNSICovCisKKyNkZWZpbmUgUk5HX1BSRVNFTlQJKDEgPDwgMikKKyNkZWZpbmUgUk5HX0VOQUJMRUQJKDEgPDwgMykKKyNkZWZpbmUgUk5HX0VOQUJMRQkoMSA8PCA2KQkvKiBNU1JfVklBX1JORyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9jMyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyICBsbywgaGk7CisKKwkvKiBUZXN0IGZvciBDZW50YXVyIEV4dGVuZGVkIEZlYXR1cmUgRmxhZ3MgcHJlc2VuY2UgKi8KKwlpZiAoY3B1aWRfZWF4KDB4QzAwMDAwMDApID49IDB4QzAwMDAwMDEpIHsKKwkJdTMyIHRtcCA9IGNwdWlkX2VkeCgweEMwMDAwMDAxKTsKKworCQkvKiBlbmFibGUgQUNFIHVuaXQsIGlmIHByZXNlbnQgYW5kIGRpc2FibGVkICovCisJCWlmICgodG1wICYgKEFDRV9QUkVTRU5UIHwgQUNFX0VOQUJMRUQpKSA9PSBBQ0VfUFJFU0VOVCkgeworCQkJcmRtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQkJbG8gfD0gQUNFX0ZDUjsJCS8qIGVuYWJsZSBBQ0UgdW5pdCAqLworCQkJd3Jtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBFbmFibGVkIEFDRSBoL3cgY3J5cHRvXG4iKTsKKwkJfQorCisJCS8qIGVuYWJsZSBSTkcgdW5pdCwgaWYgcHJlc2VudCBhbmQgZGlzYWJsZWQgKi8KKwkJaWYgKCh0bXAgJiAoUk5HX1BSRVNFTlQgfCBSTkdfRU5BQkxFRCkpID09IFJOR19QUkVTRU5UKSB7CisJCQlyZG1zciAoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisJCQlsbyB8PSBSTkdfRU5BQkxFOwkvKiBlbmFibGUgUk5HIHVuaXQgKi8KKwkJCXdybXNyIChNU1JfVklBX1JORywgbG8sIGhpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVTogRW5hYmxlZCBoL3cgUk5HXG4iKTsKKwkJfQorCisJCS8qIHN0b3JlIENlbnRhdXIgRXh0ZW5kZWQgRmVhdHVyZSBGbGFncyBhcworCQkgKiB3b3JkIDUgb2YgdGhlIENQVSBjYXBhYmlsaXR5IGJpdCBhcnJheQorCQkgKi8KKwkJYy0+eDg2X2NhcGFiaWxpdHlbNV0gPSBjcHVpZF9lZHgoMHhDMDAwMDAwMSk7CisJfQorCisJLyogQ3lyaXggSUlJIGZhbWlseSBuZWVkcyBDWDggJiBQR0UgZXhwbGljaXR5IGVuYWJsZWQuICovCisJaWYgKGMtPng4Nl9tb2RlbCA+PTYgJiYgYy0+eDg2X21vZGVsIDw9IDkpIHsKKwkJcmRtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQlsbyB8PSAoMTw8MSB8IDE8PDcpOworCQl3cm1zciAoTVNSX1ZJQV9GQ1IsIGxvLCBoaSk7CisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1g4LCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQorCisJLyogQmVmb3JlIE5laGVtaWFoLCB0aGUgQzMncyBoYWQgM2ROT1chICovCisJaWYgKGMtPng4Nl9tb2RlbCA+PTYgJiYgYy0+eDg2X21vZGVsIDw5KQorCQlzZXRfYml0KFg4Nl9GRUFUVVJFXzNETk9XLCBjLT54ODZfY2FwYWJpbGl0eSk7CisKKwlnZXRfbW9kZWxfbmFtZShjKTsKKwlkaXNwbGF5X2NhY2hlaW5mbyhjKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfY2VudGF1cihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJZW51bSB7CisJCUVDWDg9MTw8MSwKKwkJRUlFUlJJTlQ9MTw8MiwKKwkJRFBNPTE8PDMsCisJCURNQ0U9MTw8NCwKKwkJRFNUUENMSz0xPDw1LAorCQlFTElORUFSPTE8PDYsCisJCURTTUM9MTw8NywKKwkJRFRMT0NLPTE8PDgsCisJCUVEQ1RMQj0xPDw4LAorCQlFTU1YPTE8PDksCisJCURQREM9MTw8MTEsCisJCUVCUlBSRUQ9MTw8MTIsCisJCURJQz0xPDwxMywKKwkJRERDPTE8PDE0LAorCQlETkE9MTw8MTUsCisJCUVSRVRTVEs9MTw8MTYsCisJCUUyTU1YPTE8PDE5LAorCQlFQU1EM0Q9MTw8MjAsCisJfTsKKworCWNoYXIgKm5hbWU7CisJdTMyICBmY3Jfc2V0PTA7CisJdTMyICBmY3JfY2xyPTA7CisJdTMyICBsbyxoaSxuZXdsbzsKKwl1MzIgIGFhLGJiLGNjLGRkOworCisJLyogQml0IDMxIGluIG5vcm1hbCBDUFVJRCB1c2VkIGZvciBub25zdGFuZGFyZCAzRE5vdyBJRDsKKwkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KKwljbGVhcl9iaXQoMCozMiszMSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJc3dpdGNoIChjLT54ODYpIHsKKworCQljYXNlIDU6CisJCQlzd2l0Y2goYy0+eDg2X21vZGVsKSB7CisJCQljYXNlIDQ6CisJCQkJbmFtZT0iQzYiOworCQkJCWZjcl9zZXQ9RUNYOHxEU01DfEVEQ1RMQnxFTU1YfEVSRVRTVEs7CisJCQkJZmNyX2Nscj1EUERDOworCQkJCXByaW50ayhLRVJOX05PVElDRSAiRGlzYWJsaW5nIGJ1Z2dlZCBUU0MuXG4iKTsKKwkJCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfVFNDLCBjLT54ODZfY2FwYWJpbGl0eSk7CisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisJCQkJY2VudGF1cl9jcmVhdGVfb3B0aW1hbF9tY3IoKTsKKwkJCQkvKiBFbmFibGUKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIG5vbi1zdGFjaywgbm9uLXN0cmluZworCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gc3RyaW5nLCBhbGwgdHlwZXMKKwkJCQkJd2VhayB3cml0ZSBvcmRlcmluZyAKKwkJCQkJCisJCQkJICAgVGhlIEM2IG9yaWdpbmFsIGxhY2tzIHdlYWsgcmVhZCBvcmRlciAKKwkJCQkgICAKKwkJCQkgICBOb3RlIDB4MTIwIGlzIHdyaXRlIG9ubHkgb24gV2luY2hpcCAxICovCisJCQkJICAgCisJCQkJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgMHgwMUYwMDAxRiwgMCk7CisjZW5kaWYJCQkJCisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJc3dpdGNoKGMtPng4Nl9tYXNrKSB7CisJCQkJZGVmYXVsdDoKKwkJCQkJbmFtZT0iMiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNyAuLi4gOToKKwkJCQkJbmFtZT0iMkEiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEwIC4uLiAxNToKKwkJCQkJbmFtZT0iMkIiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZmNyX3NldD1FQ1g4fERTTUN8RFRMT0NLfEVNTVh8RUJSUFJFRHxFUkVUU1RLfEUyTU1YfEVBTUQzRDsKKwkJCQlmY3JfY2xyPURQREM7CisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisJCQkJd2luY2hpcDJfdW5wcm90ZWN0X21jcigpOworCQkJCXdpbmNoaXAyX2NyZWF0ZV9vcHRpbWFsX21jcigpOworCQkJCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJCQkJLyogRW5hYmxlCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBub24tc3RhY2ssIG5vbi1zdHJpbmcKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIHN0cmluZywgYWxsIHR5cGVzCisJCQkJCXdlYWsgd3JpdGUgb3JkZXJpbmcgCisJCQkJKi8KKwkJCQlsb3w9MzE7CQkJCQorCQkJCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJCQkJd2luY2hpcDJfcHJvdGVjdF9tY3IoKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCW5hbWU9IjMiOworCQkJCWZjcl9zZXQ9RUNYOHxEU01DfERUTE9DS3xFTU1YfEVCUlBSRUR8RVJFVFNUS3xFMk1NWHxFQU1EM0Q7CisJCQkJZmNyX2Nscj1EUERDOworI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorCQkJCXdpbmNoaXAyX3VucHJvdGVjdF9tY3IoKTsKKwkJCQl3aW5jaGlwMl9jcmVhdGVfb3B0aW1hbF9tY3IoKTsKKwkJCQlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCS8qIEVuYWJsZQorCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gbm9uLXN0YWNrLCBub24tc3RyaW5nCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBzdHJpbmcsIGFsbCB0eXBlcworCQkJCQl3ZWFrIHdyaXRlIG9yZGVyaW5nIAorCQkJCSovCisJCQkJbG98PTMxOwkJCQkKKwkJCQl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCXdpbmNoaXAyX3Byb3RlY3RfbWNyKCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJbmFtZT0iNCI7CisJCQkJLyogbm8gaW5mbyBvbiB0aGUgV0M0IHlldCAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluYW1lPSI/PyI7CisJCQl9CisKKwkJCXJkbXNyKE1TUl9JRFRfRkNSMSwgbG8sIGhpKTsKKwkJCW5ld2xvPShsb3xmY3Jfc2V0KSAmICh+ZmNyX2Nscik7CisKKwkJCWlmIChuZXdsbyE9bG8pIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJDZW50YXVyIEZDUiB3YXMgMHglWCBub3cgMHglWFxuIiwgbG8sIG5ld2xvICk7CisJCQkJd3Jtc3IoTVNSX0lEVF9GQ1IxLCBuZXdsbywgaGkgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2VudGF1ciBGQ1IgaXMgMHglWFxuIixsbyk7CisJCQl9CisJCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIENlbnRhdXIncyBNQ1IuICovCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkvKiBSZXBvcnQgQ1g4ICovCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQkJLyogU2V0IDNETm93ISBvbiBXaW5jaGlwIDIgYW5kIGFib3ZlLiAqLworCQkJaWYgKGMtPng4Nl9tb2RlbCA+PTgpCisJCQkJc2V0X2JpdChYODZfRkVBVFVSRV8zRE5PVywgYy0+eDg2X2NhcGFiaWxpdHkpOworCQkJLyogU2VlIGlmIHdlIGNhbiBmaW5kIG91dCBzb21lIG1vcmUuICovCisJCQlpZiAoIGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA1ICkgeworCQkJCS8qIFllcywgd2UgY2FuLiAqLworCQkJCWNwdWlkKDB4ODAwMDAwMDUsJmFhLCZiYiwmY2MsJmRkKTsKKwkJCQkvKiBBZGQgTDEgZGF0YSBhbmQgY29kZSBjYWNoZSBzaXplcy4gKi8KKwkJCQljLT54ODZfY2FjaGVfc2l6ZSA9IChjYz4+MjQpKyhkZD4+MjQpOworCQkJfQorCQkJc3ByaW50ZiggYy0+eDg2X21vZGVsX2lkLCAiV2luQ2hpcCAlcyIsIG5hbWUgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgNjoKKwkJCWluaXRfYzMoYyk7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2VudGF1cl9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIFZJQSBDMyBDUFVzICg2NzAtNjhGKSBuZWVkIGZ1cnRoZXIgc2hpZnRpbmcuICovCisJaWYgKChjLT54ODYgPT0gNikgJiYgKChjLT54ODZfbW9kZWwgPT0gNykgfHwgKGMtPng4Nl9tb2RlbCA9PSA4KSkpCisJCXNpemUgPj49IDg7CisKKwkvKiBWSUEgYWxzbyBzY3Jld2VkIHVwIE5laGVtaWFoIHN0ZXBwaW5nIDEsIGFuZCBtYWRlCisJICAgaXQgcmV0dXJuICc2NUtCJyBpbnN0ZWFkIG9mICc2NEtCJworCSAgIC0gTm90ZSwgaXQgc2VlbXMgdGhpcyBtYXkgb25seSBiZSBpbiBlbmdpbmVlcmluZyBzYW1wbGVzLiAqLworCWlmICgoYy0+eDg2PT02KSAmJiAoYy0+eDg2X21vZGVsPT05KSAmJiAoYy0+eDg2X21hc2s9PTEpICYmIChzaXplPT02NSkpCisJCXNpemUgLT0xOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjZW50YXVyX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiQ2VudGF1ciIsCisJLmNfaWRlbnQJPSB7ICJDZW50YXVySGF1bHMiIH0sCisJLmNfaW5pdAkJPSBpbml0X2NlbnRhdXIsCisJLmNfc2l6ZV9jYWNoZQk9IGNlbnRhdXJfc2l6ZV9jYWNoZSwKK307CisKK2ludCBfX2luaXQgY2VudGF1cl9pbml0X2NwdSh2b2lkKQoreworCWNwdV9kZXZzW1g4Nl9WRU5ET1JfQ0VOVEFVUl0gPSAmY2VudGF1cl9jcHVfZGV2OworCXJldHVybiAwOworfQorCisvL2Vhcmx5X2FyY2hfaW5pdGNhbGwoY2VudGF1cl9pbml0X2NwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNzZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NoYW5nZWxvZwpAQCAtMCwwICsxLDYzIEBACisvKgorICogIEVuaGFuY2VkIENQVSB0eXBlIGRldGVjdGlvbiBieSBNaWtlIEphZ2RpcywgUGF0cmljayBTdC4gSmVhbgorICogIGFuZCBNYXJ0aW4gTWFyZXMsIE5vdmVtYmVyIDE5OTcuCisgKgorICogIEZvcmNlIEN5cml4IDZ4ODYoTVgpIGFuZCBNIElJIHByb2Nlc3NvcnMgdG8gcmVwb3J0IE1UUlIgY2FwYWJpbGl0eQorICogIGFuZCBDeXJpeCAiY29tYSBidWciIHJlY29nbml0aW9uIGJ5CisgKiAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+IEZlYnJ1YXJ5IDE5OTkuCisgKiAKKyAqICBGb3JjZSBDZW50YXVyIEM2IHByb2Nlc3NvcnMgdG8gcmVwb3J0IE1UUlIgY2FwYWJpbGl0eS4KKyAqICBCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4sIE1heSAxOTk5LgorICoKKyAqICBJbnRlbCBNb2JpbGUgUGVudGl1bSBJSSBkZXRlY3Rpb24gZml4LiBTZWFuIEdpbGxleSwgSnVuZSAxOTk5LgorICoKKyAqICBJRFQgV2luY2hpcCB0d2Vha3MsIG1pc2MgY2xlYW4gdXBzLgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBdWd1c3QgMTk5OQorICoKKyAqICBCZXR0ZXIgZGV0ZWN0aW9uIG9mIENlbnRhdXIvSURUIFdpbkNoaXAgbW9kZWxzLgorICogIEJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPiwgQXVndXN0IDE5OTkuCisgKgorICogIENsZWFuZWQgdXAgY2FjaGUtZGV0ZWN0aW9uIGNvZGUKKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgT2N0b2JlciAxOTk5CisgKgorICogIEFkZGVkIHByb3BlciBMMiBjYWNoZSBkZXRlY3Rpb24gZm9yIENvcHBlcm1pbmUKKyAqICBEcmFnYW4gU3RhbmNldmljIDx2aXNpdG9yQHZhbGludXguY29tPiwgT2N0b2JlciAxOTk5CisgKgorICogIEFkZGVkIHRoZSBvcmlnaW5hbCBhcnJheSBmb3IgY2FwYWJpbGl0eSBmbGFncyBidXQgZm9yZ290IHRvIGNyZWRpdCAKKyAqICBteXNlbGYgOikgKH4xOTk4KSBGaXhlZC9jbGVhbmVkIHVwIHNvbWUgY3B1X21vZGVsX2luZm8gYW5kIG90aGVyIHN0dWZmCisgKiAgSmF1ZGVyIEhvIDxqYXVkZXJob0BjYXJ1bWJhLmNvbT4sIEphbnVhcnkgMjAwMAorICoKKyAqICBEZXRlY3Rpb24gZm9yIENlbGVyb24gY29wcGVybWluZSwgaWRlbnRpZnlfY3B1KCkgb3ZlcmhhdWxlZCwKKyAqICBhbmQgYSBmZXcgb3RoZXIgY2xlYW4gdXBzLgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBcHJpbCAyMDAwCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKiAgR2VuZXJhbCBGUFUgc3RhdGUgaGFuZGxpbmcgY2xlYW51cHMKKyAqICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICoKKyAqICBBZGRlZCBwcm9wZXIgQ2FzY2FkZXMgQ1BVIGFuZCBMMiBjYWNoZSBkZXRlY3Rpb24gZm9yIENhc2NhZGVzCisgKiAgYW5kIDgtd2F5IHR5cGUgY2FjaGUgaGFwcHkgYnVuY2ggZnJvbSBJbnRlbDpeKQorICogIERyYWdhbiBTdGFuY2V2aWMgPHZpc2l0b3JAdmFsaW51eC5jb20+LCBNYXkgMjAwMCAKKyAqCisgKiAgRm9yd2FyZCBwb3J0IEFNRCBEdXJvbiBlcnJhdGEgVDEzIGZyb20gMi4yLjE3cHJlCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIEF1Z3VzdCAyMDAwCisgKgorICogIEZvcndhcmQgcG9ydCBsb3RzIG9mIGZpeGVzL2ltcHJvdmVtZW50cyBmcm9tIDIuMi4xOHByZQorICogIEN5cml4IElJSSwgUGVudGl1bSBJViBzdXBwb3J0LgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBPY3RvYmVyIDIwMDAKKyAqCisgKiAgTWFzc2l2ZSBjbGVhbnVwIG9mIENQVSBkZXRlY3Rpb24gYW5kIGJ1ZyBoYW5kbGluZzsKKyAqICBUcmFuc21ldGEgQ1BVIGRldGVjdGlvbiwKKyAqICBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4sIE5vdmVtYmVyIDIwMDAKKyAqCisgKiAgVklBIEMzIFN1cHBvcnQuCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIE1hcmNoIDIwMDEKKyAqCisgKiAgQU1EIEF0aGxvbi9EdXJvbi9UaHVuZGVyYmlyZCBibHVlc21va2Ugc3VwcG9ydC4KKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXByaWwgMjAwMS4KKyAqCisgKiAgQ2FjaGVTaXplIGJ1ZyB3b3JrYXJvdW5kIHVwZGF0ZXMgZm9yIEFNRCwgSW50ZWwgJiBWSUEgQ3lyaXguCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIFNlcHRlbWJlciwgT2N0b2JlciAyMDAxLgorICoKKyAqLworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMCwwICsxLDYzNCBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNwdS5oIgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZGVzY19zdHJ1Y3QsIGNwdV9nZHRfdGFibGVbR0RUX0VOVFJJRVNdKTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChjcHVfZ2R0X3RhYmxlKTsKKworREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgY3B1XzE2Yml0X3N0YWNrW0NQVV8xNkJJVF9TVEFDS19TSVpFXSk7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1XzE2Yml0X3N0YWNrKTsKKworc3RhdGljIGludCBjYWNoZXNpemVfb3ZlcnJpZGUgX19pbml0ZGF0YSA9IC0xOworc3RhdGljIGludCBkaXNhYmxlX3g4Nl9meHNyIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgX19pbml0ZGF0YSA9IDE7CisKK3N0cnVjdCBjcHVfZGV2ICogY3B1X2RldnNbWDg2X1ZFTkRPUl9OVU1dID0ge307CisKK2V4dGVybiB2b2lkIG1jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKK2V4dGVybiBpbnQgZGlzYWJsZV9wc2U7CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCS8qIE5vdCBtdWNoIHdlIGNhbiBkbyBoZXJlLi4uICovCisJLyogQ2hlY2sgaWYgYXQgbGVhc3QgaXQgaGFzIGNwdWlkICovCisJaWYgKGMtPmNwdWlkX2xldmVsID09IC0xKSB7CisJCS8qIE5vIGNwdWlkLiBJdCBtdXN0IGJlIGFuIGFuY2llbnQgQ1BVICovCisJCWlmIChjLT54ODYgPT0gNCkKKwkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICI0ODYiKTsKKwkJZWxzZSBpZiAoYy0+eDg2ID09IDMpCisJCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCAiMzg2Iik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgZGVmYXVsdF9jcHUgPSB7CisJLmNfaW5pdAk9IGRlZmF1bHRfaW5pdCwKK307CitzdGF0aWMgc3RydWN0IGNwdV9kZXYgKiB0aGlzX2NwdSA9ICZkZWZhdWx0X2NwdTsKKworc3RhdGljIGludCBfX2luaXQgY2FjaGVzaXplX3NldHVwKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uICgmc3RyLCAmY2FjaGVzaXplX292ZXJyaWRlKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNhY2hlc2l6ZT0iLCBjYWNoZXNpemVfc2V0dXApOworCitpbnQgX19pbml0IGdldF9tb2RlbF9uYW1lKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgKnY7CisJY2hhciAqcCwgKnE7CisKKwlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApIDwgMHg4MDAwMDAwNCkKKwkJcmV0dXJuIDA7CisKKwl2ID0gKHVuc2lnbmVkIGludCAqKSBjLT54ODZfbW9kZWxfaWQ7CisJY3B1aWQoMHg4MDAwMDAwMiwgJnZbMF0sICZ2WzFdLCAmdlsyXSwgJnZbM10pOworCWNwdWlkKDB4ODAwMDAwMDMsICZ2WzRdLCAmdls1XSwgJnZbNl0sICZ2WzddKTsKKwljcHVpZCgweDgwMDAwMDA0LCAmdls4XSwgJnZbOV0sICZ2WzEwXSwgJnZbMTFdKTsKKwljLT54ODZfbW9kZWxfaWRbNDhdID0gMDsKKworCS8qIEludGVsIGNoaXBzIHJpZ2h0LWp1c3RpZnkgdGhpcyBzdHJpbmcgZm9yIHNvbWUgZHVtYiByZWFzb247CisJICAgdW5kbyB0aGF0IGJyYWluIGRhbWFnZSAqLworCXAgPSBxID0gJmMtPng4Nl9tb2RlbF9pZFswXTsKKwl3aGlsZSAoICpwID09ICcgJyApCisJICAgICBwKys7CisJaWYgKCBwICE9IHEgKSB7CisJICAgICB3aGlsZSAoICpwICkKKwkJICAqcSsrID0gKnArKzsKKwkgICAgIHdoaWxlICggcSA8PSAmYy0+eDg2X21vZGVsX2lkWzQ4XSApCisJCSAgKnErKyA9ICdcMCc7CS8qIFplcm8tcGFkIHRoZSByZXN0ICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKKwordm9pZCBfX2luaXQgZGlzcGxheV9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCBuLCBkdW1teSwgZWN4LCBlZHgsIGwyc2l6ZTsKKworCW4gPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisKKwlpZiAobiA+PSAweDgwMDAwMDA1KSB7CisJCWNwdWlkKDB4ODAwMDAwMDUsICZkdW1teSwgJmR1bW15LCAmZWN4LCAmZWR4KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBMMSBJIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpLCBEIGNhY2hlICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCisJCQllZHg+PjI0LCBlZHgmMHhGRiwgZWN4Pj4yNCwgZWN4JjB4RkYpOworCQljLT54ODZfY2FjaGVfc2l6ZT0oZWN4Pj4yNCkrKGVkeD4+MjQpOwkKKwl9CisKKwlpZiAobiA8IDB4ODAwMDAwMDYpCS8qIFNvbWUgY2hpcHMganVzdCBoYXMgYSBsYXJnZSBMMS4gKi8KKwkJcmV0dXJuOworCisJZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDYpOworCWwyc2l6ZSA9IGVjeCA+PiAxNjsKKwkKKwkvKiBkbyBwcm9jZXNzb3Itc3BlY2lmaWMgY2FjaGUgcmVzaXppbmcgKi8KKwlpZiAodGhpc19jcHUtPmNfc2l6ZV9jYWNoZSkKKwkJbDJzaXplID0gdGhpc19jcHUtPmNfc2l6ZV9jYWNoZShjLGwyc2l6ZSk7CisKKwkvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGFsbCB0aGlzIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAoY2FjaGVzaXplX292ZXJyaWRlICE9IC0xKQorCQlsMnNpemUgPSBjYWNoZXNpemVfb3ZlcnJpZGU7CisKKwlpZiAoIGwyc2l6ZSA9PSAwICkKKwkJcmV0dXJuOwkJLyogQWdhaW4sIG5vIEwyIGNhY2hlIGlzIHBvc3NpYmxlICovCisKKwljLT54ODZfY2FjaGVfc2l6ZSA9IGwyc2l6ZTsKKworCXByaW50ayhLRVJOX0lORk8gIkNQVTogTDIgQ2FjaGU6ICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCisJICAgICAgIGwyc2l6ZSwgZWN4ICYgMHhGRik7Cit9CisKKy8qIE5hbWluZyBjb252ZW50aW9uIHNob3VsZCBiZTogPE5hbWU+IFsoPENvZGVuYW1lPildICovCisvKiBUaGlzIHRhYmxlIG9ubHkgaXMgdXNlZCB1bmxlc3MgaW5pdF88dmVuZG9yPigpIGJlbG93IGRvZXNuJ3Qgc2V0IGl0OyAqLworLyogaW4gcGFydGljdWxhciwgaWYgQ1BVSUQgbGV2ZWxzIDB4ODAwMDAwMDIuLjQgYXJlIHN1cHBvcnRlZCwgdGhpcyBpc24ndCB1c2VkICovCisKKy8qIExvb2sgdXAgQ1BVIG5hbWVzIGJ5IHRhYmxlIGxvb2t1cC4gKi8KK3N0YXRpYyBjaGFyIF9faW5pdCAqdGFibGVfbG9va3VwX21vZGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlzdHJ1Y3QgY3B1X21vZGVsX2luZm8gKmluZm87CisKKwlpZiAoIGMtPng4Nl9tb2RlbCA+PSAxNiApCisJCXJldHVybiBOVUxMOwkvKiBSYW5nZSBjaGVjayAqLworCisJaWYgKCF0aGlzX2NwdSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmZvID0gdGhpc19jcHUtPmNfbW9kZWxzOworCisJd2hpbGUgKGluZm8gJiYgaW5mby0+ZmFtaWx5KSB7CisJCWlmIChpbmZvLT5mYW1pbHkgPT0gYy0+eDg2KQorCQkJcmV0dXJuIGluZm8tPm1vZGVsX25hbWVzW2MtPng4Nl9tb2RlbF07CisJCWluZm8rKzsKKwl9CisJcmV0dXJuIE5VTEw7CQkvKiBOb3QgZm91bmQgKi8KK30KKworCit2b2lkIF9faW5pdCBnZXRfY3B1X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGludCBlYXJseSkKK3sKKwljaGFyICp2ID0gYy0+eDg2X3ZlbmRvcl9pZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYODZfVkVORE9SX05VTTsgaSsrKSB7CisJCWlmIChjcHVfZGV2c1tpXSkgeworCQkJaWYgKCFzdHJjbXAodixjcHVfZGV2c1tpXS0+Y19pZGVudFswXSkgfHwKKwkJCSAgICAoY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0gJiYgCisJCQkgICAgICFzdHJjbXAodixjcHVfZGV2c1tpXS0+Y19pZGVudFsxXSkpKSB7CisJCQkJYy0+eDg2X3ZlbmRvciA9IGk7CisJCQkJaWYgKCFlYXJseSkKKwkJCQkJdGhpc19jcHUgPSBjcHVfZGV2c1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IF9faW5pdCB4ODZfZnhzcl9zZXR1cChjaGFyICogcykKK3sKKwlkaXNhYmxlX3g4Nl9meHNyID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vZnhzciIsIHg4Nl9meHNyX3NldHVwKTsKKworCisvKiBTdGFuZGFyZCBtYWNybyB0byBzZWUgaWYgYSBzcGVjaWZpYyBmbGFnIGlzIGNoYW5nZWFibGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZsYWdfaXNfY2hhbmdlYWJsZV9wKHUzMiBmbGFnKQoreworCXUzMiBmMSwgZjI7CisKKwlhc20oInB1c2hmbFxuXHQiCisJICAgICJwdXNoZmxcblx0IgorCSAgICAicG9wbCAlMFxuXHQiCisJICAgICJtb3ZsICUwLCUxXG5cdCIKKwkgICAgInhvcmwgJTIsJTBcblx0IgorCSAgICAicHVzaGwgJTBcblx0IgorCSAgICAicG9wZmxcblx0IgorCSAgICAicHVzaGZsXG5cdCIKKwkgICAgInBvcGwgJTBcblx0IgorCSAgICAicG9wZmxcblx0IgorCSAgICA6ICI9JnIiIChmMSksICI9JnIiIChmMikKKwkgICAgOiAiaXIiIChmbGFnKSk7CisKKwlyZXR1cm4gKChmMV5mMikgJiBmbGFnKSAhPSAwOworfQorCisKKy8qIFByb2JlIGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IGhhdmVfY3B1aWRfcCh2b2lkKQoreworCXJldHVybiBmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0lEKTsKK30KKworLyogRG8gbWluaW11bSBDUFUgZGV0ZWN0aW9uIGVhcmx5LgorICAgRmllbGRzIHJlYWxseSBuZWVkZWQ6IHZlbmRvciwgY3B1aWRfbGV2ZWwsIGZhbWlseSwgbW9kZWwsIG1hc2ssIGNhY2hlIGFsaWdubWVudC4KKyAgIFRoZSBvdGhlcnMgYXJlIG5vdCB0b3VjaGVkIHRvIGF2b2lkIHVud2FudGVkIHNpZGUgZWZmZWN0cy4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jcHVfZGV0ZWN0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisKKwljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gMzI7CisKKwlpZiAoIWhhdmVfY3B1aWRfcCgpKQorCQlyZXR1cm47CisKKwkvKiBHZXQgdmVuZG9yIG5hbWUgKi8KKwljcHVpZCgweDAwMDAwMDAwLCAmYy0+Y3B1aWRfbGV2ZWwsCisJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzBdLAorCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs4XSwKKwkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbNF0pOworCisJZ2V0X2NwdV92ZW5kb3IoYywgMSk7CisKKwljLT54ODYgPSA0OworCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7CisJCXUzMiBqdW5rLCB0Zm1zLCBjYXAwLCBtaXNjOworCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJm1pc2MsICZqdW5rLCAmY2FwMCk7CisJCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7CisJCWMtPng4Nl9tb2RlbCA9ICh0Zm1zID4+IDQpICYgMTU7CisJCWlmIChjLT54ODYgPT0gMHhmKSB7CisJCQljLT54ODYgKz0gKHRmbXMgPj4gMjApICYgMHhmZjsKKwkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OworCQl9CisJCWMtPng4Nl9tYXNrID0gdGZtcyAmIDE1OworCQlpZiAoY2FwMCAmICgxPDwxOSkpCisJCQljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gKChtaXNjID4+IDgpICYgMHhmZikgKiA4OworCX0KKworCWVhcmx5X2ludGVsX3dvcmthcm91bmQoYyk7Cit9CisKK3ZvaWQgX19pbml0IGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKwl1MzIgdGZtcywgeGx2bDsKKwlpbnQganVuazsKKworCWlmIChoYXZlX2NwdWlkX3AoKSkgeworCQkvKiBHZXQgdmVuZG9yIG5hbWUgKi8KKwkJY3B1aWQoMHgwMDAwMDAwMCwgJmMtPmNwdWlkX2xldmVsLAorCQkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbMF0sCisJCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs4XSwKKwkJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzRdKTsKKwkJCisJCWdldF9jcHVfdmVuZG9yKGMsIDApOworCQkvKiBJbml0aWFsaXplIHRoZSBzdGFuZGFyZCBzZXQgb2YgY2FwYWJpbGl0aWVzICovCisJCS8qIE5vdGUgdGhhdCB0aGUgdmVuZG9yLXNwZWNpZmljIGNvZGUgYmVsb3cgbWlnaHQgb3ZlcnJpZGUgKi8KKwkKKwkJLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLworCQlpZiAoIGMtPmNwdWlkX2xldmVsID49IDB4MDAwMDAwMDEgKSB7CisJCQl1MzIgY2FwYWJpbGl0eSwgZXhjYXA7CisJCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJmp1bmssICZleGNhcCwgJmNhcGFiaWxpdHkpOworCQkJYy0+eDg2X2NhcGFiaWxpdHlbMF0gPSBjYXBhYmlsaXR5OworCQkJYy0+eDg2X2NhcGFiaWxpdHlbNF0gPSBleGNhcDsKKwkJCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7CisJCQljLT54ODZfbW9kZWwgPSAodGZtcyA+PiA0KSAmIDE1OworCQkJaWYgKGMtPng4NiA9PSAweGYpIHsKKwkJCQljLT54ODYgKz0gKHRmbXMgPj4gMjApICYgMHhmZjsKKwkJCQljLT54ODZfbW9kZWwgKz0gKCh0Zm1zID4+IDE2KSAmIDB4RikgPDwgNDsKKwkJCX0gCisJCQljLT54ODZfbWFzayA9IHRmbXMgJiAxNTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhhdmUgQ1BVSUQgbGV2ZWwgMCBvbmx5IC0gdW5oZWFyZCBvZiAqLworCQkJYy0+eDg2ID0gNDsKKwkJfQorCisJCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCisJCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisJCWlmICggKHhsdmwgJiAweGZmZmYwMDAwKSA9PSAweDgwMDAwMDAwICkgeworCQkJaWYgKCB4bHZsID49IDB4ODAwMDAwMDEgKSB7CisJCQkJYy0+eDg2X2NhcGFiaWxpdHlbMV0gPSBjcHVpZF9lZHgoMHg4MDAwMDAwMSk7CisJCQkJYy0+eDg2X2NhcGFiaWxpdHlbNl0gPSBjcHVpZF9lY3goMHg4MDAwMDAwMSk7CisJCQl9CisJCQlpZiAoIHhsdmwgPj0gMHg4MDAwMDAwNCApCisJCQkJZ2V0X21vZGVsX25hbWUoYyk7IC8qIERlZmF1bHQgbmFtZSAqLworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3F1YXNoX3RoZV9zdHVwaWRfc2VyaWFsX251bWJlcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUE4pICYmIGRpc2FibGVfeDg2X3NlcmlhbF9uciApIHsKKwkJLyogRGlzYWJsZSBwcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworCQl1bnNpZ25lZCBsb25nIGxvLGhpOworCQlyZG1zcihNU1JfSUEzMl9CQkxfQ1JfQ1RMLGxvLGhpKTsKKwkJbG8gfD0gMHgyMDAwMDA7CisJCXdybXNyKE1TUl9JQTMyX0JCTF9DUl9DVEwsbG8saGkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSBzZXJpYWwgbnVtYmVyIGRpc2FibGVkLlxuIik7CisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9QTiwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJCS8qIERpc2FibGluZyB0aGUgc2VyaWFsIG51bWJlciBtYXkgYWZmZWN0IHRoZSBjcHVpZCBsZXZlbCAqLworCQljLT5jcHVpZF9sZXZlbCA9IGNwdWlkX2VheCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHg4Nl9zZXJpYWxfbnJfc2V0dXAoY2hhciAqcykKK3sKKwlkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgPSAwOworCXJldHVybiAxOworfQorX19zZXR1cCgic2VyaWFsbnVtYmVyIiwgeDg2X3NlcmlhbF9ucl9zZXR1cCk7CisKKworCisvKgorICogVGhpcyBkb2VzIHRoZSBoYXJkIHdvcmsgb2YgYWN0dWFsbHkgcGlja2luZyBhcGFydCB0aGUgQ1BVIHN0dWZmLi4uCisgKi8KK3ZvaWQgX19pbml0IGlkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaW50IGk7CisKKwljLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJYy0+eDg2X2NhY2hlX3NpemUgPSAtMTsKKwljLT54ODZfdmVuZG9yID0gWDg2X1ZFTkRPUl9VTktOT1dOOworCWMtPmNwdWlkX2xldmVsID0gLTE7CS8qIENQVUlEIG5vdCBkZXRlY3RlZCAqLworCWMtPng4Nl9tb2RlbCA9IGMtPng4Nl9tYXNrID0gMDsJLyogU28gZmFyIHVua25vd24uLi4gKi8KKwljLT54ODZfdmVuZG9yX2lkWzBdID0gJ1wwJzsgLyogVW5zZXQgKi8KKwljLT54ODZfbW9kZWxfaWRbMF0gPSAnXDAnOyAgLyogVW5zZXQgKi8KKwljLT54ODZfbnVtX2NvcmVzID0gMTsKKwltZW1zZXQoJmMtPng4Nl9jYXBhYmlsaXR5LCAwLCBzaXplb2YgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJaWYgKCFoYXZlX2NwdWlkX3AoKSkgeworCQkvKiBGaXJzdCBvZiBhbGwsIGRlY2lkZSBpZiB0aGlzIGlzIGEgNDg2IG9yIGhpZ2hlciAqLworCQkvKiBJdCdzIGEgNDg2IGlmIHdlIGNhbiBtb2RpZnkgdGhlIEFDIGZsYWcgKi8KKwkJaWYgKCBmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0FDKSApCisJCQljLT54ODYgPSA0OworCQllbHNlCisJCQljLT54ODYgPSAzOworCX0KKworCWdlbmVyaWNfaWRlbnRpZnkoYyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiQ1BVOiBBZnRlciBnZW5lcmljIGlkZW50aWZ5LCBjYXBzOiIpOworCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQorCQlwcmludGsoIiAlMDhseCIsIGMtPng4Nl9jYXBhYmlsaXR5W2ldKTsKKwlwcmludGsoIlxuIik7CisKKwlpZiAodGhpc19jcHUtPmNfaWRlbnRpZnkpIHsKKwkJdGhpc19jcHUtPmNfaWRlbnRpZnkoYyk7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNQVTogQWZ0ZXIgdmVuZG9yIGlkZW50aWZ5LCBjYXBzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykKKwkJCXByaW50aygiICUwOGx4IiwgYy0+eDg2X2NhcGFiaWxpdHlbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCisJLyoKKwkgKiBWZW5kb3Itc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBJbiB0aGlzIHNlY3Rpb24gd2UKKwkgKiBjYW5vbmljYWxpemUgdGhlIGZlYXR1cmUgZmxhZ3MsIG1lYW5pbmcgaWYgdGhlcmUgYXJlCisJICogZmVhdHVyZXMgYSBjZXJ0YWluIENQVSBzdXBwb3J0cyB3aGljaCBDUFVJRCBkb2Vzbid0CisJICogdGVsbCB1cywgQ1BVSUQgY2xhaW1pbmcgaW5jb3JyZWN0IGZsYWdzLCBvciBvdGhlciBidWdzLAorCSAqIHdlIGhhbmRsZSB0aGVtIGhlcmUuCisJICoKKwkgKiBBdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiwgYy0+eDg2X2NhcGFiaWxpdHkgYmV0dGVyCisJICogaW5kaWNhdGUgdGhlIGZlYXR1cmVzIHRoaXMgQ1BVIGdlbnVpbmVseSBzdXBwb3J0cyEKKwkgKi8KKwlpZiAodGhpc19jcHUtPmNfaW5pdCkKKwkJdGhpc19jcHUtPmNfaW5pdChjKTsKKworCS8qIERpc2FibGUgdGhlIFBOIGlmIGFwcHJvcHJpYXRlICovCisJc3F1YXNoX3RoZV9zdHVwaWRfc2VyaWFsX251bWJlcihjKTsKKworCS8qCisJICogVGhlIHZlbmRvci1zcGVjaWZpYyBmdW5jdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGZlYXR1cmVzLiAgTm93CisJICogd2UgZG8gImdlbmVyaWMgY2hhbmdlcy4iCisJICovCisKKwkvKiBUU0MgZGlzYWJsZWQ/ICovCisJaWYgKCB0c2NfZGlzYWJsZSApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9UU0MsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCS8qIEZYU1IgZGlzYWJsZWQ/ICovCisJaWYgKGRpc2FibGVfeDg2X2Z4c3IpIHsKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0ZYU1IsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1hNTSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKworCWlmIChkaXNhYmxlX3BzZSkKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJLyogSWYgdGhlIG1vZGVsIG5hbWUgaXMgc3RpbGwgdW5zZXQsIGRvIHRhYmxlIGxvb2t1cC4gKi8KKwlpZiAoICFjLT54ODZfbW9kZWxfaWRbMF0gKSB7CisJCWNoYXIgKnA7CisJCXAgPSB0YWJsZV9sb29rdXBfbW9kZWwoYyk7CisJCWlmICggcCApCisJCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCBwKTsKKwkJZWxzZQorCQkJLyogTGFzdCByZXNvcnQuLi4gKi8KKwkJCXNwcmludGYoYy0+eDg2X21vZGVsX2lkLCAiJTAyeC8lMDJ4IiwKKwkJCQljLT54ODZfdmVuZG9yLCBjLT54ODZfbW9kZWwpOworCX0KKworCS8qIE5vdyB0aGUgZmVhdHVyZSBmbGFncyBiZXR0ZXIgcmVmbGVjdCBhY3R1YWwgQ1BVIGZlYXR1cmVzISAqLworCisJcHJpbnRrKEtFUk5fREVCVUcgIkNQVTogQWZ0ZXIgYWxsIGluaXRzLCBjYXBzOiIpOworCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQorCQlwcmludGsoIiAlMDhseCIsIGMtPng4Nl9jYXBhYmlsaXR5W2ldKTsKKwlwcmludGsoIlxuIik7CisKKwkvKgorCSAqIE9uIFNNUCwgYm9vdF9jcHVfZGF0YSBob2xkcyB0aGUgY29tbW9uIGZlYXR1cmUgc2V0IGJldHdlZW4KKwkgKiBhbGwgQ1BVczsgc28gbWFrZSBzdXJlIHRoYXQgd2UgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgYXJlCisJICogY29tbW9uIGJldHdlZW4gdGhlIENQVXMuICBUaGUgZmlyc3QgdGltZSB0aGlzIHJvdXRpbmUgZ2V0cworCSAqIGV4ZWN1dGVkLCBjID09ICZib290X2NwdV9kYXRhLgorCSAqLworCWlmICggYyAhPSAmYm9vdF9jcHVfZGF0YSApIHsKKwkJLyogQU5EIHRoZSBhbHJlYWR5IGFjY3VtdWxhdGVkIGZsYWdzIHdpdGggdGhlc2UgKi8KKwkJZm9yICggaSA9IDAgOyBpIDwgTkNBUElOVFMgOyBpKysgKQorCQkJYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVtpXSAmPSBjLT54ODZfY2FwYWJpbGl0eVtpXTsKKwl9CisKKwkvKiBJbml0IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIGlmIGF2YWlsYWJsZS4gKi8KKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCW1jaGVja19pbml0KGMpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0hUCit2b2lkIF9faW5pdCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiAJZWF4LCBlYngsIGVjeCwgZWR4OworCWludCAJaW5kZXhfbHNiLCBpbmRleF9tc2IsIHRtcDsKKwlpbnQgCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9IVCkpCisJCXJldHVybjsKKworCWNwdWlkKDEsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCXNtcF9udW1fc2libGluZ3MgPSAoZWJ4ICYgMHhmZjAwMDApID4+IDE2OworCisJaWYgKHNtcF9udW1fc2libGluZ3MgPT0gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBIeXBlci1UaHJlYWRpbmcgaXMgZGlzYWJsZWRcbiIpOworCX0gZWxzZSBpZiAoc21wX251bV9zaWJsaW5ncyA+IDEgKSB7CisJCWluZGV4X2xzYiA9IDA7CisJCWluZGV4X21zYiA9IDMxOworCisJCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gTlJfQ1BVUykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1BVOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgdGhlIHNpYmxpbmdzICVkIiwgc21wX251bV9zaWJsaW5ncyk7CisJCQlzbXBfbnVtX3NpYmxpbmdzID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQl0bXAgPSBzbXBfbnVtX3NpYmxpbmdzOworCQl3aGlsZSAoKHRtcCAmIDEpID09IDApIHsKKwkJCXRtcCA+Pj0xIDsKKwkJCWluZGV4X2xzYisrOworCQl9CisJCXRtcCA9IHNtcF9udW1fc2libGluZ3M7CisJCXdoaWxlICgodG1wICYgMHg4MDAwMDAwMCApID09IDApIHsKKwkJCXRtcCA8PD0xIDsKKwkJCWluZGV4X21zYi0tOworCQl9CisJCWlmIChpbmRleF9sc2IgIT0gaW5kZXhfbXNiICkKKwkJCWluZGV4X21zYisrOworCQlwaHlzX3Byb2NfaWRbY3B1XSA9IHBoeXNfcGtnX2lkKChlYnggPj4gMjQpICYgMHhGRiwgaW5kZXhfbXNiKTsKKworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAorCQkgICAgICAgcGh5c19wcm9jX2lkW2NwdV0pOworCX0KK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJY2hhciAqdmVuZG9yID0gTlVMTDsKKworCWlmIChjLT54ODZfdmVuZG9yIDwgWDg2X1ZFTkRPUl9OVU0pCisJCXZlbmRvciA9IHRoaXNfY3B1LT5jX3ZlbmRvcjsKKwllbHNlIGlmIChjLT5jcHVpZF9sZXZlbCA+PSAwKQorCQl2ZW5kb3IgPSBjLT54ODZfdmVuZG9yX2lkOworCisJaWYgKHZlbmRvciAmJiBzdHJuY21wKGMtPng4Nl9tb2RlbF9pZCwgdmVuZG9yLCBzdHJsZW4odmVuZG9yKSkpCisJCXByaW50aygiJXMgIiwgdmVuZG9yKTsKKworCWlmICghYy0+eDg2X21vZGVsX2lkWzBdKQorCQlwcmludGsoIiVkODYiLCBjLT54ODYpOworCWVsc2UKKwkJcHJpbnRrKCIlcyIsIGMtPng4Nl9tb2RlbF9pZCk7CisKKwlpZiAoYy0+eDg2X21hc2sgfHwgYy0+Y3B1aWRfbGV2ZWwgPj0gMCkgCisJCXByaW50aygiIHN0ZXBwaW5nICUwMnhcbiIsIGMtPng4Nl9tYXNrKTsKKwllbHNlCisJCXByaW50aygiXG4iKTsKK30KKworY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2luaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKKworLyogVGhpcyBpcyBoYWNreS4gOikKKyAqIFdlJ3JlIGVtdWxhdGluZyBmdXR1cmUgYmVoYXZpb3IuCisgKiBJbiB0aGUgZnV0dXJlLCB0aGUgY3B1LXNwZWNpZmljIGluaXQgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGltcGxpY2l0bHkKKyAqIHZpYSB0aGUgbWFnaWMgb2YgaW5pdGNhbGxzLgorICogVGhleSB3aWxsIGluc2VydCB0aGVtc2VsdmVzIGludG8gdGhlIGNwdV9kZXZzIHN0cnVjdHVyZS4KKyAqIFRoZW4sIHdoZW4gY3B1X2luaXQoKSBpcyBjYWxsZWQsIHdlIGNhbiBqdXN0IGl0ZXJhdGUgb3ZlciB0aGF0IGFycmF5LgorICovCisKK2V4dGVybiBpbnQgaW50ZWxfY3B1X2luaXQodm9pZCk7CitleHRlcm4gaW50IGN5cml4X2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCBuc2NfaW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IGFtZF9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgY2VudGF1cl9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgdHJhbnNtZXRhX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCByaXNlX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCBuZXhnZW5faW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IHVtY19pbml0X2NwdSh2b2lkKTsKKwordm9pZCBfX2luaXQgZWFybHlfY3B1X2luaXQodm9pZCkKK3sKKwlpbnRlbF9jcHVfaW5pdCgpOworCWN5cml4X2luaXRfY3B1KCk7CisJbnNjX2luaXRfY3B1KCk7CisJYW1kX2luaXRfY3B1KCk7CisJY2VudGF1cl9pbml0X2NwdSgpOworCXRyYW5zbWV0YV9pbml0X2NwdSgpOworCXJpc2VfaW5pdF9jcHUoKTsKKwluZXhnZW5faW5pdF9jcHUoKTsKKwl1bWNfaW5pdF9jcHUoKTsKKwllYXJseV9jcHVfZGV0ZWN0KCk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJLyogcHNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb24tdGhlLWZseSB1bm1hcHBpbmcsCisJICogZGlzYWJsZSBpdCBldmVuIGlmIHRoZSBjcHVzIGNsYWltIHRvIHN1cHBvcnQgaXQuCisJICovCisJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJZGlzYWJsZV9wc2UgPSAxOworI2VuZGlmCit9CisvKgorICogY3B1X2luaXQoKSBpbml0aWFsaXplcyBzdGF0ZSB0aGF0IGlzIHBlci1DUFUuIFNvbWUgZGF0YSBpcyBhbHJlYWR5CisgKiBpbml0aWFsaXplZCAobmF0dXJhbGx5KSBpbiB0aGUgYm9vdHN0cmFwIHByb2Nlc3MsIHN1Y2ggYXMgdGhlIEdEVAorICogYW5kIElEVC4gV2UgcmVsb2FkIHRoZW0gbmV2ZXJ0aGVsZXNzLCB0aGlzIGZ1bmN0aW9uIGFjdHMgYXMgYQorICogJ0NQVSBzdGF0ZSBiYXJyaWVyJywgbm90aGluZyBzaG91bGQgZ2V0IGFjcm9zcy4KKyAqLwordm9pZCBfX2luaXQgY3B1X2luaXQgKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqIHQgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKKwlfX3UzMiBzdGsxNl9vZmYgPSAoX191MzIpJnBlcl9jcHUoY3B1XzE2Yml0X3N0YWNrLCBjcHUpOworCisJaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVSMlZCBhbHJlYWR5IGluaXRpYWxpemVkIVxuIiwgY3B1KTsKKwkJZm9yICg7OykgbG9jYWxfaXJxX2VuYWJsZSgpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ1BVIyVkXG4iLCBjcHUpOworCisJaWYgKGNwdV9oYXNfdm1lIHx8IGNwdV9oYXNfdHNjIHx8IGNwdV9oYXNfZGUpCisJCWNsZWFyX2luX2NyNChYODZfQ1I0X1ZNRXxYODZfQ1I0X1BWSXxYODZfQ1I0X1RTRHxYODZfQ1I0X0RFKTsKKwlpZiAodHNjX2Rpc2FibGUgJiYgY3B1X2hhc190c2MpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJEaXNhYmxpbmcgVFNDLi4uXG4iKTsKKwkJLyoqKiogRklYLUhQQTogRE9FUyBUSElTIFJFQUxMWSBCRUxPTkcgSEVSRT8gKioqKi8KKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1RTQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCXNldF9pbl9jcjQoWDg2X0NSNF9UU0QpOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcGVyLUNQVSBHRFQgd2l0aCB0aGUgYm9vdCBHRFQsCisJICogYW5kIHNldCB1cCB0aGUgR0RUIGRlc2NyaXB0b3I6CisJICovCisJbWVtY3B5KCZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSksIGNwdV9nZHRfdGFibGUsCisJICAgICAgIEdEVF9TSVpFKTsKKworCS8qIFNldCB1cCBHRFQgZW50cnkgZm9yIDE2Yml0IHN0YWNrICovCisJKihfX3U2NCAqKSYocGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpW0dEVF9FTlRSWV9FU1BGSVhfU1NdKSB8PQorCQkoKCgoX191NjQpc3RrMTZfb2ZmKSA8PCAxNikgJiAweDAwMDAwMGZmZmZmZjAwMDBVTEwpIHwKKwkJKCgoKF9fdTY0KXN0azE2X29mZikgPDwgMzIpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB8CisJCShDUFVfMTZCSVRfU1RBQ0tfU0laRSAtIDEpOworCisJY3B1X2dkdF9kZXNjcltjcHVdLnNpemUgPSBHRFRfU0laRSAtIDE7CisJY3B1X2dkdF9kZXNjcltjcHVdLmFkZHJlc3MgPQorCSAgICAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHBlci10aHJlYWQgVExTIGRlc2NyaXB0b3IgY2FjaGU6CisJICovCisJbWVtY3B5KHRocmVhZC0+dGxzX2FycmF5LCAmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpLAorCQlHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZ2R0ICUwIiA6IDogIm0iIChjcHVfZ2R0X2Rlc2NyW2NwdV0pKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCIgOiA6ICJtIiAoaWR0X2Rlc2NyKSk7CisKKwkvKgorCSAqIERlbGV0ZSBOVAorCSAqLworCV9fYXNtX18oInB1c2hmbCA7IGFuZGwgJDB4ZmZmZmJmZmYsKCVlc3ApIDsgcG9wZmwiKTsKKworCS8qCisJICogU2V0IHVwIGFuZCBsb2FkIHRoZSBwZXItQ1BVIFRTUyBhbmQgTERUCisJICovCisJYXRvbWljX2luYygmaW5pdF9tbS5tbV9jb3VudCk7CisJY3VycmVudC0+YWN0aXZlX21tID0gJmluaXRfbW07CisJaWYgKGN1cnJlbnQtPm1tKQorCQlCVUcoKTsKKwllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgY3VycmVudCk7CisKKwlsb2FkX2VzcDAodCwgdGhyZWFkKTsKKwlzZXRfdHNzX2Rlc2MoY3B1LHQpOworCWxvYWRfVFJfZGVzYygpOworCWxvYWRfTERUKCZpbml0X21tLmNvbnRleHQpOworCisJLyogU2V0IHVwIGRvdWJsZWZhdWx0IFRTUyBwb2ludGVyIGluIHRoZSBHRFQgKi8KKwlfX3NldF90c3NfZGVzYyhjcHUsIEdEVF9FTlRSWV9ET1VCTEVGQVVMVF9UU1MsICZkb3VibGVmYXVsdF90c3MpOworCisJLyogQ2xlYXIgJWZzIGFuZCAlZ3MuICovCisJYXNtIHZvbGF0aWxlICgieG9ybCAlZWF4LCAlZWF4OyBtb3ZsICVlYXgsICVmczsgbW92bCAlZWF4LCAlZ3MiKTsKKworCS8qIENsZWFyIGFsbCA2IGRlYnVnIHJlZ2lzdGVyczogKi8KKworI2RlZmluZSBDRChyZWdpc3RlcikgX19hc21fXygibW92bCAlMCwlJWRiIiAjcmVnaXN0ZXIgOjoiciIoMCkgKTsKKworCUNEKDApOyBDRCgxKTsgQ0QoMik7IENEKDMpOyAvKiBubyBkYjQgYW5kIGRiNSAqLzsgQ0QoNik7IENEKDcpOworCisjdW5kZWYgQ0QKKworCS8qCisJICogRm9yY2UgRlBVIGluaXRpYWxpemF0aW9uOgorCSAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzID0gMDsKKwljbGVhcl91c2VkX21hdGgoKTsKKwlteGNzcl9mZWF0dXJlX21hc2tfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFkNGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmgKQEAgLTAsMCArMSwzMCBAQAorCitzdHJ1Y3QgY3B1X21vZGVsX2luZm8geworCWludCB2ZW5kb3I7CisJaW50IGZhbWlseTsKKwljaGFyICptb2RlbF9uYW1lc1sxNl07Cit9OworCisvKiBhdHRlbXB0IHRvIGNvbnNvbGlkYXRlIGNwdSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgY3B1X2RldiB7CisJY2hhcgkqIGNfdmVuZG9yOworCisJLyogc29tZSBoYXZlIHR3byBwb3NzaWJpbGl0aWVzIGZvciBjcHVpZCBzdHJpbmcgKi8KKwljaGFyCSogY19pZGVudFsyXTsJCisKKwlzdHJ1Y3QJCWNwdV9tb2RlbF9pbmZvIGNfbW9kZWxzWzRdOworCisJdm9pZAkJKCpjX2luaXQpKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworCXZvaWQJCSgqY19pZGVudGlmeSkoc3RydWN0IGNwdWluZm9feDg2ICogYyk7CisJdW5zaWduZWQgaW50CSgqY19zaXplX2NhY2hlKShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Cit9OworCitleHRlcm4gc3RydWN0IGNwdV9kZXYgKiBjcHVfZGV2cyBbWDg2X1ZFTkRPUl9OVU1dOworCitleHRlcm4gaW50IGdldF9tb2RlbF9uYW1lKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CitleHRlcm4gdm9pZCBkaXNwbGF5X2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCitleHRlcm4gdm9pZCBnZW5lcmljX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworCitleHRlcm4gdm9pZCBlYXJseV9pbnRlbF93b3JrYXJvdW5kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVmZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0wLDAgKzEsMjMxIEBACisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworCittZW51ICJDUFUgRnJlcXVlbmN5IHNjYWxpbmciCisKK3NvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCisKK2lmIENQVV9GUkVRCisKK2NvbW1lbnQgIkNQVUZyZXEgcHJvY2Vzc29yIGRyaXZlcnMiCisKK2NvbmZpZyBYODZfQUNQSV9DUFVGUkVRCisJdHJpc3RhdGUgIkFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIGRyaXZlciIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBhIENQVUZyZXEgZHJpdmVyIHdoaWNoIHV0aWxpemVzIHRoZSBBQ1BJCisJICBQcm9jZXNzb3IgUGVyZm9ybWFuY2UgU3RhdGVzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBFTEFOX0NQVUZSRVEKKwl0cmlzdGF0ZSAiQU1EIEVsYW4iCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBYODZfRUxBTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEFNRCBFbGFuIFNDNDAwIGFuZCBTQzQxMAorCSAgcHJvY2Vzc29ycy4KKworCSAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgcHJvY2Vzc29yIG1heGltdW0gc3BlZWQgYXMgYm9vdAorCSAgcGFyYW1ldGVyOiBlbGFuZnJlcT1tYXhzcGVlZCAoaW4ga0h6KSBvciBhcyBtb2R1bGUKKwkgIHBhcmFtZXRlciAibWF4X2ZyZXEiLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzYKKwl0cmlzdGF0ZSAiQU1EIE1vYmlsZSBLNi0yL0s2LTMgUG93ZXJOb3chIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIG1vYmlsZSBBTUQgSzYtMisgYW5kIG1vYmlsZQorCSAgQU1EIEs2LTMrIHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QT1dFUk5PV19LNworCXRyaXN0YXRlICJBTUQgTW9iaWxlIEF0aGxvbi9EdXJvbiBQb3dlck5vdyEiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgbW9iaWxlIEFNRCBLNyBtb2JpbGUgcHJvY2Vzc29ycy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1BPV0VSTk9XX0s3X0FDUEkKKwlib29sCisJZGVwZW5kcyBvbiBYODZfUE9XRVJOT1dfSzcgJiYgQUNQSV9QUk9DRVNTT1IKKwlkZXBlbmRzIG9uICEoWDg2X1BPV0VSTk9XX0s3ID0geSAmJiBBQ1BJX1BST0NFU1NPUiA9IG0pCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzgKKwl0cmlzdGF0ZSAiQU1EIE9wdGVyb24vQXRobG9uNjQgUG93ZXJOb3chIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgbW9iaWxlIEFNRCBPcHRlcm9uL0F0aGxvbjY0IHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QT1dFUk5PV19LOF9BQ1BJCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1BPV0VSTk9XX0s4ICYmIEFDUElfUFJPQ0VTU09SCisJZGVwZW5kcyBvbiAhKFg4Nl9QT1dFUk5PV19LOCA9IHkgJiYgQUNQSV9QUk9DRVNTT1IgPSBtKQorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0dYX1NVU1BNT0QKKwl0cmlzdGF0ZSAiQ3lyaXggTWVkaWFHWC9OYXRTZW1pIEdlb2RlIFN1c3BlbmQgTW9kdWxhdGlvbiIKKwloZWxwCisJIFRoaXMgYWRkIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgTmF0U2VtaSBHZW9kZSBwcm9jZXNzb3JzIHdoaWNoCisJIHN1cHBvcnQgc3VzcGVuZCBtb2R1bGF0aW9uLgorCisJIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOTworCXRyaXN0YXRlICJJbnRlbCBFbmhhbmNlZCBTcGVlZFN0ZXAiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJc2VsZWN0IFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fVEFCTEUgaWYgKCFYODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkpCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgRW5oYW5jZWQgU3BlZWRTdGVwIGVuYWJsZWQKKwkgIG1vYmlsZSBDUFVzLiAgVGhpcyBtZWFucyBJbnRlbCBQZW50aXVtIE0gKENlbnRyaW5vKSBDUFVzLiBIb3dldmVyLAorCSAgeW91IGFsc28gbmVlZCB0byBzYXkgWSB0byAiVXNlIEFDUEkgdGFibGVzIHRvIGRlY29kZS4uLiIgYmVsb3cKKwkgIFt3aGljaCBtaWdodCBpbXBseSBlbmFibGluZyBBQ1BJXSBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBkcml2ZXIKKwkgIG9uIG5vbi1CYW5pYXMgQ1BVcy4KKwkgIAorCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKwkgIAorCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisJYm9vbCAiVXNlIEFDUEkgdGFibGVzIHRvIGRlY29kZSB2YWxpZCBmcmVxdWVuY3kvdm9sdGFnZSBwYWlycyIKKwlkZXBlbmRzIG9uIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8gJiYgQUNQSV9QUk9DRVNTT1IKKwlkZXBlbmRzIG9uICEoWDg2X1NQRUVEU1RFUF9DRU5UUklOTyA9IHkgJiYgQUNQSV9QUk9DRVNTT1IgPSBtKQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFVzZSBwcmltYXJpbHkgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBCSU9TIEFDUEkgdGFibGVzCisJICB0byBkZXRlcm1pbmUgdmFsaWQgQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBwYWlyaW5ncy4gSXQgaXMKKwkgIHJlcXVpcmVkIGZvciB0aGUgZHJpdmVyIHRvIHdvcmsgb24gbm9uLUJhbmlhcyBDUFVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkuCisKK2NvbmZpZyBYODZfU1BFRURTVEVQX0NFTlRSSU5PX1RBQkxFCisJYm9vbCAiQnVpbHQtaW4gdGFibGVzIGZvciBCYW5pYXMgQ1BVcyIKKwlkZXBlbmRzIG9uIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8KKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgYnVpbHQtaW4gdGFibGVzIGZvciBCYW5pYXMgQ1BVcyBpZiBBQ1BJIGVuY29kaW5nCisJICBpcyBub3QgYXZhaWxhYmxlLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfU1BFRURTVEVQX0lDSAorCXRyaXN0YXRlICJJbnRlbCBTcGVlZHN0ZXAgb24gSUNILU0gY2hpcHNldHMgKGlvcG9ydCBpbnRlcmZhY2UpIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIGNlcnRhaW4gbW9iaWxlIEludGVsIFBlbnRpdW0gSUlJCisJICAoQ29wcGVybWluZSksIGFsbCBtb2JpbGUgSW50ZWwgUGVudGl1bSBJSUktTSAoVHVhbGF0aW4pIGFuZCBhbGwKKwkgIG1vYmlsZSBJbnRlbCBQZW50aXVtIDQgUDQtTSBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgYW4gSW50ZWwgSUNIMiwgCisJICBJQ0gzIG9yIElDSDQgc291dGhicmlkZ2UuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9TUEVFRFNURVBfU01JCisJdHJpc3RhdGUgIkludGVsIFNwZWVkU3RlcCBvbiA0NDBCWC9aWC9NWCBjaGlwc2V0cyAoU01JIGludGVyZmFjZSkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBjZXJ0YWluIG1vYmlsZSBJbnRlbCBQZW50aXVtIElJSQorCSAgKENvcHBlcm1pbmUpLCBhbGwgbW9iaWxlIEludGVsIFBlbnRpdW0gSUlJLU0gKFR1YWxhdGluKSAgCisJICBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgYW4gSW50ZWwgNDQwQlgvWlgvTVggc291dGhicmlkZ2UuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QNF9DTE9DS01PRAorCXRyaXN0YXRlICJJbnRlbCBQZW50aXVtIDQgY2xvY2sgbW9kdWxhdGlvbiIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBJbnRlbCBQZW50aXVtIDQgLyBYRU9OCisJICBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfQ1BVRlJFUV9ORk9SQ0UyCisJdHJpc3RhdGUgIm5WaWRpYSBuRm9yY2UyIEZTQiBjaGFuZ2luZyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEZTQiBjaGFuZ2luZyBvbiBuVmlkaWEgbkZvcmNlMgorCSAgcGxhdGZvcm1zLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfTE9OR1JVTgorCXRyaXN0YXRlICJUcmFuc21ldGEgTG9uZ1J1biIKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBUcmFuc21ldGEgQ3J1c29lIGFuZCBFZmZpY2VvbiBwcm9jZXNzb3JzCisJICB3aGljaCBzdXBwb3J0IExvbmdSdW4uCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9MT05HSEFVTAorCXRyaXN0YXRlICJWSUEgQ3lyaXggSUlJIExvbmdoYXVsIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFZJQSBTYW11ZWwvQ3lyaXhJSUksIAorCSAgVklBIEN5cml4IFNhbXVlbC9DMywgVklBIEN5cml4IEV6cmEgYW5kIFZJQSBDeXJpeCBFenJhLVQgCisJICBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbW1lbnQgInNoYXJlZCBvcHRpb25zIgorCitjb25maWcgWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYKKyAgICAgICAgYm9vbCAiL3Byb2MvYWNwaS9wcm9jZXNzb3IvLi4vcGVyZm9ybWFuY2UgaW50ZXJmYWNlIChkZXByZWNhdGVkKSIKKwlkZXBlbmRzIG9uIFBST0NfRlMKKwlkZXBlbmRzIG9uIFg4Nl9BQ1BJX0NQVUZSRVEgfHwgWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJIHx8IFg4Nl9QT1dFUk5PV19LN19BQ1BJIHx8IFg4Nl9QT1dFUk5PV19LOF9BQ1BJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBkZXByZWNhdGVkIC9wcm9jL2FjcGkvcHJvY2Vzc29yLy4uL3BlcmZvcm1hbmNlIAorCSAgaW50ZXJmYWNlLiBXaGlsZSBpdCBpcyBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcsIHRoZSBnZW5lcmljLAorCSAgY3Jvc3MtYXJjaGl0ZWN0dXJlIGNwdWZyZXEgaW50ZXJmYWNlcyBzaG91bGQgYmUgdXNlZC4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9MSUIKKwl0cmlzdGF0ZQorCWRlZmF1bHQgWDg2X1NQRUVEU1RFUF9JQ0ggfHwgWDg2X1NQRUVEU1RFUF9TTUkgfHwgWDg2X1A0X0NMT0NLTU9ECisKK2NvbmZpZyBYODZfU1BFRURTVEVQX1JFTEFYRURfQ0FQX0NIRUNLCisJYm9vbCAiUmVsYXhlZCBzcGVlZHN0ZXAgY2FwYWJpbGl0eSBjaGVja3MiCisJZGVwZW5kcyBvbiAoWDg2X1NQRUVEU1RFUF9TTUkgfHwgWDg2X1NQRUVEU1RFUF9JQ0gpCisJaGVscAorCSAgRG9uJ3QgcGVyZm9ybSBhbGwgY2hlY2tzIGZvciBhIHNwZWVkc3RlcCBjYXBhYmxlIHN5c3RlbSB3aGljaCB3b3VsZCAKKwkgIG5vcm1hbGx5IGJlIGRvbmUuIFNvbWUgYW5jaWVudCBvciBzdHJhbmdlIHN5c3RlbXMsIHRob3VnaCBzcGVlZHN0ZXAgCisJICBjYXBhYmxlLCBkb24ndCBhbHdheXMgaW5kaWNhdGUgdGhhdCB0aGV5IGFyZSBzcGVlZHN0ZXAgY2FwYWJsZS4gVGhpcyAKKwkgIG9wdGlvbiBsZXRzIHRoZSBwcm9iaW5nIGNvZGUgYnlwYXNzIHNvbWUgb2YgdGhvc2UgY2hlY2tzIGlmIHRoZQorCSAgcGFyYW1ldGVyICJyZWxheGVkX2NoZWNrPTEiIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlLgorCitlbmRpZgkjIENQVV9GUkVRCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK29iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzYpCQkrPSBwb3dlcm5vdy1rNi5vCitvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubworb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KK29iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9MT05HUlVOKQkJKz0gbG9uZ3J1bi5vICAKK29iai0kKENPTkZJR19YODZfR1hfU1VTUE1PRCkJCSs9IGd4LXN1c3Btb2Qubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfSUNIKQkJKz0gc3BlZWRzdGVwLWljaC5vCitvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOTykJKz0gc3BlZWRzdGVwLWNlbnRyaW5vLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0xJQikJCSs9IHNwZWVkc3RlcC1saWIubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JKQkJKz0gc3BlZWRzdGVwLXNtaS5vCitvYmotJChDT05GSUdfWDg2X0FDUElfQ1BVRlJFUSkJCSs9IGFjcGktY3B1ZnJlcS5vCitvYmotJChDT05GSUdfWDg2X1A0X0NMT0NLTU9EKQkJKz0gcDQtY2xvY2ttb2Qubworb2JqLSQoQ09ORklHX1g4Nl9DUFVGUkVRX05GT1JDRTIpCSs9IGNwdWZyZXEtbmZvcmNlMi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNlMTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIGFjcGktY3B1ZnJlcS5jIC0gQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyICgkUmV2aXNpb246IDEuMyAkKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5keSBHcm92ZXIgPGFuZHJldy5ncm92ZXJAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBQYXVsIERpZWZlbmJhdWdoIDxwYXVsLnMuZGllZmVuYmF1Z2hAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDQgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgInNwZWVkc3RlcC1lc3QtY29tbW9uLmgiCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiYWNwaS1jcHVmcmVxIiwgbXNnKQorCitNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoLCBEb21pbmlrIEJyb2Rvd3NraSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvIHsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJYWNwaV9kYXRhOworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQkJKmZyZXFfdGFibGU7CisJdW5zaWduZWQgaW50CQkJCXJlc3VtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSphY3BpX2lvX2RhdGFbTlJfQ1BVU107CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlcjsKKworc3RhdGljIGludAorYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcG9ydCgKKwl1MTYJcG9ydCwKKwl1OAliaXRfd2lkdGgsCisJdTMyCXZhbHVlKQoreworCWlmIChiaXRfd2lkdGggPD0gOCkgeworCQlvdXRiKHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAxNikgeworCQlvdXR3KHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAzMikgeworCQlvdXRsKHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydCgKKwl1MTYJcG9ydCwKKwl1OAliaXRfd2lkdGgsCisJdTMyCSpyZXQpCit7CisJKnJldCA9IDA7CisJaWYgKGJpdF93aWR0aCA8PSA4KSB7CisJCSpyZXQgPSBpbmIocG9ydCk7CisJfSBlbHNlIGlmIChiaXRfd2lkdGggPD0gMTYpIHsKKwkJKnJldCA9IGludyhwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAzMikgeworCQkqcmV0ID0gaW5sKHBvcnQpOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlICgKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSpkYXRhLAorCXVuc2lnbmVkIGludAkJY3B1LAorCWludAkJCXN0YXRlKQoreworCXUxNgkJCXBvcnQgPSAwOworCXU4CQkJYml0X3dpZHRoID0gMDsKKwlpbnQJCQlyZXQgPSAwOworCXUzMgkJCXZhbHVlID0gMDsKKwlpbnQJCQlpID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBjcHVmcmVxX2ZyZXFzOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwlpbnQJCQlyZXR2YWw7CisKKwlkcHJpbnRrKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2VcbiIpOworCisJLyoKKwkgKiBUQkQ6IFVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXRfY3B1c19hbGxvd2VkLgorCSAqIEFzIHNldF9jcHVzX2FsbG93ZWQgaXMgYSBiaXQgcmFjeSwgCisJICogd2l0aCBhbnkgb3RoZXIgc2V0X2NwdXNfYWxsb3dlZCBmb3IgdGhpcyBwcm9jZXNzLgorCSAqLworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkgeworCQlyZXR1cm4gKC1FQUdBSU4pOworCX0KKwkKKwlpZiAoc3RhdGUgPT0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlKSB7CisJCWlmICh1bmxpa2VseShkYXRhLT5yZXN1bWUpKSB7CisJCQlkcHJpbnRrKCJDYWxsZWQgYWZ0ZXIgcmVzdW1lLCByZXNldHRpbmcgdG8gUCVkXG4iLCBzdGF0ZSk7CisJCQlkYXRhLT5yZXN1bWUgPSAwOworCQl9IGVsc2UgeworCQkJZHByaW50aygiQWxyZWFkeSBhdCB0YXJnZXQgc3RhdGUgKFAlZClcbiIsIHN0YXRlKTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG1pZ3JhdGVfZW5kOworCQl9CisJfQorCisJZHByaW50aygiVHJhbnNpdGlvbmluZyBmcm9tIFAlZCB0byBQJWRcbiIsCisJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSwgc3RhdGUpOworCisJLyogY3B1ZnJlcSBmcmVxdWVuY3kgc3RydWN0ICovCisJY3B1ZnJlcV9mcmVxcy5jcHUgPSBjcHU7CisJY3B1ZnJlcV9mcmVxcy5vbGQgPSBkYXRhLT5mcmVxX3RhYmxlW2RhdGEtPmFjcGlfZGF0YS5zdGF0ZV0uZnJlcXVlbmN5OworCWNwdWZyZXFfZnJlcXMubmV3ID0gZGF0YS0+ZnJlcV90YWJsZVtzdGF0ZV0uZnJlcXVlbmN5OworCisJLyogbm90aWZ5IGNwdWZyZXEgKi8KKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKgorCSAqIEZpcnN0IHdlIHdyaXRlIHRoZSB0YXJnZXQgc3RhdGUncyAnY29udHJvbCcgdmFsdWUgdG8gdGhlCisJICogY29udHJvbF9yZWdpc3Rlci4KKwkgKi8KKworCXBvcnQgPSBkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5hZGRyZXNzOworCWJpdF93aWR0aCA9IGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLmJpdF93aWR0aDsKKwl2YWx1ZSA9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLmNvbnRyb2w7CisKKwlkcHJpbnRrKCJXcml0aW5nIDB4JTA4eCB0byBwb3J0IDB4JTA0eFxuIiwgdmFsdWUsIHBvcnQpOworCisJcmV0ID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcG9ydChwb3J0LCBiaXRfd2lkdGgsIHZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7CisJCXJldHZhbCA9IHJldDsKKwkJZ290byBtaWdyYXRlX2VuZDsKKwl9CisKKwkvKgorCSAqIFRoZW4gd2UgcmVhZCB0aGUgJ3N0YXR1c19yZWdpc3RlcicgYW5kIGNvbXBhcmUgdGhlIHZhbHVlIHdpdGggdGhlCisJICogdGFyZ2V0IHN0YXRlJ3MgJ3N0YXR1cycgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc2l0aW9uIHdhcyBzdWNjZXNzZnVsLgorCSAqIE5vdGUgdGhhdCB3ZSdsbCBwb2xsIGZvciB1cCB0byAxbXMgKDEwMCBjeWNsZXMgb2YgMTB1cykgYmVmb3JlCisJICogZ2l2aW5nIHVwLgorCSAqLworCisJcG9ydCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuYWRkcmVzczsKKwliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmJpdF93aWR0aDsKKworCWRwcmludGsoIkxvb2tpbmcgZm9yIDB4JTA4eCBmcm9tIHBvcnQgMHglMDR4XG4iLAorCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMsIHBvcnQpOworCisJZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKKwkJcmV0ID0gYWNwaV9wcm9jZXNzb3JfcmVhZF9wb3J0KHBvcnQsIGJpdF93aWR0aCwgJnZhbHVlKTsKKwkJaWYgKHJldCkgewkKKwkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7CisJCQlyZXR2YWwgPSByZXQ7CisJCQlnb3RvIG1pZ3JhdGVfZW5kOworCQl9CisJCWlmICh2YWx1ZSA9PSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBub3RpZnkgY3B1ZnJlcSAqLworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlpZiAodmFsdWUgIT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBjcHVmcmVxX2ZyZXFzLm5ldzsKKwkJY3B1ZnJlcV9mcmVxcy5uZXcgPSBjcHVmcmVxX2ZyZXFzLm9sZDsKKwkJY3B1ZnJlcV9mcmVxcy5vbGQgPSB0bXA7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNwaS1jcHVmcmVxOiBUcmFuc2l0aW9uIGZhaWxlZFxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJZHByaW50aygiVHJhbnNpdGlvbiBzdWNjZXNzZnVsIGFmdGVyICVkIG1pY3Jvc2Vjb25kc1xuIiwgaSAqIDEwKTsKKworCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSA9IHN0YXRlOworCisJcmV0dmFsID0gMDsKK21pZ3JhdGVfZW5kOgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCisKK3N0YXRpYyBpbnQKK2FjcGlfY3B1ZnJlcV90YXJnZXQgKAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3ksCisJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCXVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKKwl1bnNpZ25lZCBpbnQgbmV4dF9zdGF0ZSA9IDA7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfc2V0cG9saWN5XG4iKTsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksCisJCQlkYXRhLT5mcmVxX3RhYmxlLAorCQkJdGFyZ2V0X2ZyZXEsCisJCQlyZWxhdGlvbiwKKwkJCSZuZXh0X3N0YXRlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKwlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2UgKGRhdGEsIHBvbGljeS0+Y3B1LCBuZXh0X3N0YXRlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfdmVyaWZ5ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3ZlcmlmeVxuIik7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAKKwkJCWRhdGEtPmZyZXFfdGFibGUpOworCisJcmV0dXJuIChyZXN1bHQpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCithY3BpX2NwdWZyZXFfZ3Vlc3NfZnJlcSAoCisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKKwl1bnNpZ25lZCBpbnQJCWNwdSkKK3sKKwlpZiAoY3B1X2toeikgeworCQkvKiBzZWFyY2ggdGhlIGNsb3Nlc3QgbWF0Y2ggdG8gY3B1X2toeiAqLworCQl1bnNpZ25lZCBpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBmcmVxOworCQl1bnNpZ25lZCBsb25nIGZyZXFuID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisKKwkJZm9yIChpPTA7IGkgPCAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IC0gMSk7IGkrKykgeworCQkJZnJlcSA9IGZyZXFuOworCQkJZnJlcW4gPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2krMV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQkJaWYgKCgyICogY3B1X2toeikgPiAoZnJlcW4gKyBmcmVxKSkgeworCQkJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSA9IGk7CisJCQkJcmV0dXJuIChmcmVxKTsKKwkJCX0KKwkJfQorCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgLSAxOworCQlyZXR1cm4gKGZyZXFuKTsKKwl9IGVsc2UKKwkJLyogYXNzdW1lIENQVSBpcyBhdCBQMC4uLiAqLworCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSAwOworCQlyZXR1cm4gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisJCit9CisKKworLyogCisgKiBhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0IC0gbGV0IEJJT1Mga25vdyBhYm91dCB0aGUgU01QIGNhcGFiaWxpdGllcworICogb2YgdGhpcyBkcml2ZXIKKyAqIEBwZXJmOiBwcm9jZXNzb3Itc3BlY2lmaWMgYWNwaV9pb19kYXRhIHN0cnVjdAorICogQGNwdTogQ1BVIGJlaW5nIGluaXRpYWxpemVkCisgKgorICogVG8gYXZvaWQgaXNzdWVzIHdpdGggbGVnYWN5IE9TZXMsIHNvbWUgQklPU2VzIHJlcXVpcmUgdG8gYmUgaW5mb3JtZWQgb2YKKyAqIHRoZSBTTVAgY2FwYWJpbGl0aWVzIG9mIE9TIFAtc3RhdGUgZHJpdmVyLiBIZXJlIHdlIHNldCB0aGUgYml0cyBpbiBfUERDIAorICogYWNjb3JkaW5nbHksIGZvciBFbmhhbmNlZCBTcGVlZHN0ZXAuIEFjdHVhbCBjYWxsIHRvIF9QREMgaXMgZG9uZSBpbgorICogZHJpdmVyL2FjcGkvcHJvY2Vzc29yLmMKKyAqLworc3RhdGljIHZvaWQgCithY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0KAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmYsIAorCQl1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3QKKwkJKQoreworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJdTMyICpidWY7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisJZHByaW50aygiYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdFxuIik7CisKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSBwZGMuIEl0IHdpbGwgYmUgdXNlZCBsYXRlci4gKi8KKwlpZiAoIW9ial9saXN0KQorCQlyZXR1cm47CisJCQorCWlmICghKG9ial9saXN0LT5jb3VudCAmJiBvYmpfbGlzdC0+cG9pbnRlcikpCisJCXJldHVybjsKKworCW9iaiA9IG9ial9saXN0LT5wb2ludGVyOworCWlmICgob2JqLT5idWZmZXIubGVuZ3RoID09IDEyKSAmJiBvYmotPmJ1ZmZlci5wb2ludGVyKSB7CisJCWJ1ZiA9ICh1MzIgKilvYmotPmJ1ZmZlci5wb2ludGVyOworICAgICAgIAkJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisgICAgICAgCQlidWZbMV0gPSAxOworICAgICAgIAkJYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCQlwZXJmLT5wZGMgPSBvYmpfbGlzdDsKKwl9CisJcmV0dXJuOworfQorIAorCisvKiBDUFUgc3BlY2lmaWMgUERDIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZCAKK2FjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkYygKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmLCAKKwkJdW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0CisJCSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKwlkcHJpbnRrKCJhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNcbiIpOworCXBlcmYtPnBkYyA9IE5VTEw7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdChwZXJmLCBjcHUsIG9ial9saXN0KTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX2NwdV9pbml0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXVuc2lnbmVkIGludAkJaTsKKwl1bnNpZ25lZCBpbnQJCWNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7CisJdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOworCisJdW5pb24gYWNwaV9vYmplY3QJCWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07CisJdTMyCQkJCWFyZzBfYnVmWzNdOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IAlhcmdfbGlzdCA9IHsxLCAmYXJnMH07CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2luaXRcbiIpOworCS8qIHNldHVwIGFyZ19saXN0IGZvciBfUERDIHNldHRpbmdzICovCisgICAgICAgIGFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOworICAgICAgICBhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2FjcGlfaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAoLUVOT01FTSk7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSk7CisKKwlhY3BpX2lvX2RhdGFbY3B1XSA9IGRhdGE7CisKKwlhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGMoJmRhdGEtPmFjcGlfZGF0YSwgY3B1LCAmYXJnX2xpc3QpOworCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGNwdSk7CisJZGF0YS0+YWNwaV9kYXRhLnBkYyA9IE5VTEw7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycl9mcmVlOworCisJaWYgKGlzX2NvbnN0X2xvb3BzX2NwdShjcHUpKSB7CisJCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKKwl9CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA8PSAxKSB7CisJCWRwcmludGsoIk5vIFAtU3RhdGVzXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCWlmICgoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSB8fAorCSAgICAoZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pKSB7CisJCWRwcmludGsoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgWyVkLCAlZF1cbiIsCisJCQkodTMyKSAoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpLAorCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJLyogYWxsb2MgZnJlcV90YWJsZSAqLworCWRhdGEtPmZyZXFfdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpICogKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEtPmZyZXFfdGFibGUpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJLyogZGV0ZWN0IHRyYW5zaXRpb24gbGF0ZW5jeSAqLworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAwOworCWZvciAoaT0wOyBpPGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICgoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwKSA+IHBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kpCisJCQlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwOworCX0KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJLyogVGhlIGN1cnJlbnQgc3BlZWQgaXMgdW5rbm93biBhbmQgbm90IGRldGVjdGFibGUgYnkgQUNQSS4uLiAgKi8KKwlwb2xpY3ktPmN1ciA9IGFjcGlfY3B1ZnJlcV9ndWVzc19mcmVxKGRhdGEsIHBvbGljeS0+Y3B1KTsKKworCS8qIHRhYmxlIGluaXQgKi8KKwlmb3IgKGk9MDsgaTw9ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspCisJeworCQlkYXRhLT5mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwkJaWYgKGk8ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50KQorCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJZWxzZQorCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwl9CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgZGF0YS0+ZnJlcV90YWJsZSk7CisJaWYgKHJlc3VsdCkgeworCQlnb3RvIGVycl9mcmVxZnJlZTsKKwl9CisKKwkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCisJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJhY3BpLWNwdWZyZXE6IENQVSV1IC0gQUNQSSBwZXJmb3JtYW5jZSBtYW5hZ2VtZW50IGFjdGl2YXRlZC5cbiIsCisJICAgICAgIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKQorCQlkcHJpbnRrKCIgICAgICVjUCVkOiAlZCBNSHosICVkIG1XLCAlZCB1U1xuIiwKKwkJCShpID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZT8nKic6JyAnKSwgaSwKKwkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnBvd2VyLAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+ZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOworCXJldHVybiAocmVzdWx0KTsKKworIGVycl9mcmVxZnJlZToKKwlrZnJlZShkYXRhLT5mcmVxX3RhYmxlKTsKKyBlcnJfdW5yZWc6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBjcHUpOworIGVycl9mcmVlOgorCWtmcmVlKGRhdGEpOworCWFjcGlfaW9fZGF0YVtjcHVdID0gTlVMTDsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfY3B1X2V4aXQgKAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisKKworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9jcHVfZXhpdFxuIik7CisKKwlpZiAoZGF0YSkgeworCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJCWFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV0gPSBOVUxMOworCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIHBvbGljeS0+Y3B1KTsKKwkJa2ZyZWUoZGF0YSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX3Jlc3VtZSAoCisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKKworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3Jlc3VtZVxuIik7CisKKwlkYXRhLT5yZXN1bWUgPSAxOworCisJcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogYWNwaV9jcHVmcmVxX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlciA9IHsKKwkudmVyaWZ5IAk9IGFjcGlfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldCAJPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAorCS5pbml0CQk9IGFjcGlfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBhY3BpX2NwdWZyZXFfY3B1X2V4aXQsCisJLnJlc3VtZQkJPSBhY3BpX2NwdWZyZXFfcmVzdW1lLAorCS5uYW1lCQk9ICJhY3BpLWNwdWZyZXEiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXR0ciAgICAgICAgICAgPSBhY3BpX2NwdWZyZXFfYXR0ciwKK307CisKKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfY3B1ZnJlcV9pbml0ICh2b2lkKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfaW5pdFxuIik7CisKKyAJcmVzdWx0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCQorCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FjcGlfY3B1ZnJlcV9leGl0ICh2b2lkKQoreworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9leGl0XG4iKTsKKworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCisJcmV0dXJuOworfQorCisKK2xhdGVfaW5pdGNhbGwoYWNwaV9jcHVmcmVxX2luaXQpOworbW9kdWxlX2V4aXQoYWNwaV9jcHVmcmVxX2V4aXQpOworCitNT0RVTEVfQUxJQVMoImFjcGkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvY3B1ZnJlcS1uZm9yY2UyLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTQwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogKEMpIDIwMDQgIFNlYmFzdGlhbiBXaXR0IDxzZS53aXR0QGdteC5uZXQ+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqICBCYXNlZCB1cG9uIHJldmVyc2UgZW5naW5lZXJlZCBpbmZvcm1hdGlvbgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgTkZPUkNFMl9YVEFMIDI1CisjZGVmaW5lIE5GT1JDRTJfQk9PVEZTQiAweDQ4CisjZGVmaW5lIE5GT1JDRTJfUExMRU5BQkxFIDB4YTgKKyNkZWZpbmUgTkZPUkNFMl9QTExSRUcgMHhhNAorI2RlZmluZSBORk9SQ0UyX1BMTEFEUiAweGEwCisjZGVmaW5lIE5GT1JDRTJfUExMKG11bCwgZGl2KSAoMHgxMDAwMDAgfCAobXVsIDw8IDgpIHwgZGl2KQorCisjZGVmaW5lIE5GT1JDRTJfTUlOX0ZTQiA1MAorI2RlZmluZSBORk9SQ0UyX1NBRkVfRElTVEFOQ0UgNTAKKworLyogRGVsYXkgaW4gbXMgYmV0d2VlbiBGU0IgY2hhbmdlcyAqLworLy8jZGVmaW5lIE5GT1JDRTJfREVMQVkgMTAKKworLyogbmZvcmNlMl9jaGlwc2V0OgorICogRlNCIGlzIGNoYW5nZWQgdXNpbmcgdGhlIGNoaXBzZXQKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpuZm9yY2UyX2NoaXBzZXRfZGV2OworCisvKiBmaWQ6CisgKiBtdWx0aXBsaWVyICogMTAKKyAqLworc3RhdGljIGludCBmaWQgPSAwOworCisvKiBtaW5fZnNiLCBtYXhfZnNiOgorICogbWluaW11bSBhbmQgbWF4aW11bSBGU0IgKD0gRlNCIGF0IGJvb3QgdGltZSkgCisgKi8KK3N0YXRpYyBpbnQgbWluX2ZzYiA9IDA7CitzdGF0aWMgaW50IG1heF9mc2IgPSAwOworCitNT0RVTEVfQVVUSE9SKCJTZWJhc3RpYW4gV2l0dCA8c2Uud2l0dEBnbXgubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJuRm9yY2UyIEZTQiBjaGFuZ2luZyBjcHVmcmVxIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZmlkLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1pbl9mc2IsIGludCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0MoZmlkLCAiQ1BVIG11bHRpcGxpZXIgdG8gdXNlICgxMS41ID0gMTE1KSIpOworTU9EVUxFX1BBUk1fREVTQyhtaW5fZnNiLAorICAgICAgICAgICAgICAgICAiTWluaW11bSBGU0IgdG8gdXNlLCBpZiBub3QgZGVmaW5lZDogY3VycmVudCBGU0IgLSA1MCIpOworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImNwdWZyZXEtbmZvcmNlMiIsIG1zZykKKworLyoKKyAqIG5mb3JjZTJfY2FsY19mc2IgLSBjYWxjdWxhdGUgRlNCCisgKiBAcGxsOiBQTEwgdmFsdWUKKyAqIAorICogICBDYWxjdWxhdGVzIEZTQiBmcm9tIFBMTCB2YWx1ZQorICovCitzdGF0aWMgaW50IG5mb3JjZTJfY2FsY19mc2IoaW50IHBsbCkKK3sKKwl1bnNpZ25lZCBjaGFyIG11bCwgZGl2OworCisJbXVsID0gKHBsbCA+PiA4KSAmIDB4ZmY7CisJZGl2ID0gcGxsICYgMHhmZjsKKworCWlmIChkaXYgPiAwKQorCQlyZXR1cm4gTkZPUkNFMl9YVEFMICogbXVsIC8gZGl2OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBuZm9yY2UyX2NhbGNfcGxsIC0gY2FsY3VsYXRlIFBMTCB2YWx1ZQorICogQGZzYjogRlNCCisgKiAKKyAqICAgQ2FsY3VsYXRlIFBMTCB2YWx1ZSBmb3IgZ2l2ZW4gRlNCCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl9jYWxjX3BsbCh1bnNpZ25lZCBpbnQgZnNiKQoreworCXVuc2lnbmVkIGNoYXIgeG11bCwgeGRpdjsKKwl1bnNpZ25lZCBjaGFyIG11bCA9IDAsIGRpdiA9IDA7CisJaW50IHRyaWVkID0gMDsKKworCS8qIFRyeSB0byBjYWxjdWxhdGUgbXVsdGlwbGllciBhbmQgZGl2aWRlciB1cCB0byA0IHRpbWVzICovCisJd2hpbGUgKCgobXVsID09IDApIHx8IChkaXYgPT0gMCkpICYmICh0cmllZCA8PSAzKSkgeworCQlmb3IgKHhkaXYgPSAxOyB4ZGl2IDw9IDB4ODA7IHhkaXYrKykKKwkJCWZvciAoeG11bCA9IDE7IHhtdWwgPD0gMHhmZTsgeG11bCsrKQorCQkJCWlmIChuZm9yY2UyX2NhbGNfZnNiKE5GT1JDRTJfUExMKHhtdWwsIHhkaXYpKSA9PQorCQkJCSAgICBmc2IgKyB0cmllZCkgeworCQkJCQltdWwgPSB4bXVsOworCQkJCQlkaXYgPSB4ZGl2OworCQkJCX0KKwkJdHJpZWQrKzsKKwl9CisKKwlpZiAoKG11bCA9PSAwKSB8fCAoZGl2ID09IDApKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gTkZPUkNFMl9QTEwobXVsLCBkaXYpOworfQorCisvKgorICogbmZvcmNlMl93cml0ZV9wbGwgLSB3cml0ZSBQTEwgdmFsdWUgdG8gY2hpcHNldAorICogQHBsbDogUExMIHZhbHVlCisgKiAKKyAqICAgV3JpdGVzIG5ldyBGU0IgUExMIHZhbHVlIHRvIGNoaXBzZXQKKyAqLworc3RhdGljIHZvaWQgbmZvcmNlMl93cml0ZV9wbGwoaW50IHBsbCkKK3sKKwlpbnQgdGVtcDsKKworCS8qIFNldCB0aGUgcGxsIGFkZHIuIHRvIDB4MDAgKi8KKwl0ZW1wID0gMHgwMDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIE5GT1JDRTJfUExMQURSLCB0ZW1wKTsKKworCS8qIE5vdyB3cml0ZSB0aGUgdmFsdWUgaW4gYWxsIDY0IHJlZ2lzdGVycyAqLworCWZvciAodGVtcCA9IDA7IHRlbXAgPD0gMHgzZjsgdGVtcCsrKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmZvcmNlMl9jaGlwc2V0X2RldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORk9SQ0UyX1BMTFJFRywgcGxsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBuZm9yY2UyX2ZzYl9yZWFkIC0gUmVhZCBGU0IKKyAqCisgKiAgIFJlYWQgRlNCIGZyb20gY2hpcHNldAorICogICBJZiBib290ZnNiICE9IDAsIHJldHVybiBGU0IgYXQgYm9vdC10aW1lCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZvcmNlMl9mc2JfcmVhZChpbnQgYm9vdGZzYikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqbmZvcmNlMl9zdWI1OworCXUzMiBmc2IsIHRlbXAgPSAwOworCisJCisJLyogR2V0IGNoaXBzZXQgYm9vdCBGU0IgZnJvbSBzdWJkZXZpY2UgNSAoRlNCIGF0IGJvb3QtdGltZSkgKi8KKwluZm9yY2UyX3N1YjUgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX05WSURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMUVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkKKwlpZiAoIW5mb3JjZTJfc3ViNSkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmZvcmNlMl9zdWI1LCBORk9SQ0UyX0JPT1RGU0IsICZmc2IpOworCWZzYiAvPSAxMDAwMDAwOworCQorCS8qIENoZWNrIGlmIFBMTCByZWdpc3RlciBpcyBhbHJlYWR5IHNldCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4ICopJnRlbXApOworCQorCWlmKGJvb3Rmc2IgfHwgIXRlbXApCisJCXJldHVybiBmc2I7CisJCQorCS8qIFVzZSBQTEwgcmVnaXN0ZXIgRlNCIHZhbHVlICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZPUkNFMl9QTExSRUcsICZ0ZW1wKTsKKwlmc2IgPSBuZm9yY2UyX2NhbGNfZnNiKHRlbXApOworCisJcmV0dXJuIGZzYjsKK30KKworLyoKKyAqIG5mb3JjZTJfc2V0X2ZzYiAtIHNldCBuZXcgRlNCCisgKiBAZnNiOiBOZXcgRlNCCisgKiAKKyAqICAgU2V0cyBuZXcgRlNCCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl9zZXRfZnNiKHVuc2lnbmVkIGludCBmc2IpCit7CisJdTMyIHBsbCwgdGVtcCA9IDA7CisJdW5zaWduZWQgaW50IHRmc2I7CisJaW50IGRpZmY7CisKKwlpZiAoKGZzYiA+IG1heF9mc2IpIHx8IChmc2IgPCBORk9SQ0UyX01JTl9GU0IpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogRlNCICVkIGlzIG91dCBvZiByYW5nZSFcbiIsIGZzYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwl0ZnNiID0gbmZvcmNlMl9mc2JfcmVhZCgwKTsKKwlpZiAoIXRmc2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBFcnJvciB3aGlsZSByZWFkaW5nIHRoZSBGU0JcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCB3cml0ZT8gVGhlbiBzZXQgYWN0dWFsIHZhbHVlICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GT1JDRTJfUExMRU5BQkxFLCAodTggKikmdGVtcCk7CisJaWYgKCF0ZW1wKSB7CisJCXBsbCA9IG5mb3JjZTJfY2FsY19wbGwodGZzYik7CisKKwkJaWYgKHBsbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQluZm9yY2UyX3dyaXRlX3BsbChwbGwpOworCX0KKworCS8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgKi8KKwl0ZW1wID0gMHgwMTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgTkZPUkNFMl9QTExFTkFCTEUsICh1OCl0ZW1wKTsKKworCWRpZmYgPSB0ZnNiIC0gZnNiOworCisJaWYgKCFkaWZmKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGZzYiAhPSBmc2IpICYmICh0ZnNiIDw9IG1heF9mc2IpICYmICh0ZnNiID49IG1pbl9mc2IpKSB7CisJCWlmIChkaWZmIDwgMCkKKwkJCXRmc2IrKzsKKwkJZWxzZQorCQkJdGZzYi0tOworCisJCS8qIENhbGN1bGF0ZSB0aGUgUExMIHJlZy4gdmFsdWUgKi8KKwkJaWYgKChwbGwgPSBuZm9yY2UyX2NhbGNfcGxsKHRmc2IpKSA9PSAtMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkKKwkJbmZvcmNlMl93cml0ZV9wbGwocGxsKTsKKyNpZmRlZiBORk9SQ0UyX0RFTEFZCisJCW1kZWxheShORk9SQ0UyX0RFTEFZKTsKKyNlbmRpZgorCX0KKworCXRlbXAgPSAweDQwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTEFEUiwgKHU4KXRlbXApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmZvcmNlMl9nZXQgLSBnZXQgdGhlIENQVSBmcmVxdWVuY3kKKyAqIEBjcHU6IENQVSBudW1iZXIKKyAqIAorICogUmV0dXJucyB0aGUgQ1BVIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5mb3JjZTJfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG5mb3JjZTJfZnNiX3JlYWQoMCkgKiBmaWQgKiAxMDA7Cit9CisKKy8qKgorICogbmZvcmNlMl90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworLy8gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZzYjsKKworCWlmICgodGFyZ2V0X2ZyZXEgPiBwb2xpY3ktPm1heCkgfHwgKHRhcmdldF9mcmVxIDwgcG9saWN5LT5taW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRhcmdldF9mc2IgPSB0YXJnZXRfZnJlcSAvIChmaWQgKiAxMDApOworCisJZnJlcXMub2xkID0gbmZvcmNlMl9nZXQocG9saWN5LT5jcHUpOworCWZyZXFzLm5ldyA9IHRhcmdldF9mc2IgKiBmaWQgKiAxMDA7CisJZnJlcXMuY3B1ID0gMDsJCS8qIE9ubHkgb25lIENQVSBvbiBuRm9yY2UyIHBsYXR0Zm9ybXMgKi8KKworCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQorCQlyZXR1cm4gMDsKKworCWRwcmludGsoS0VSTl9JTkZPICJjcHVmcmVxOiBPbGQgQ1BVIGZyZXF1ZW5jeSAlZCBrSHosIG5ldyAlZCBrSHpcbiIsCisJICAgICAgIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBEaXNhYmxlIElSUXMgKi8KKwkvL2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChuZm9yY2UyX3NldF9mc2IodGFyZ2V0X2ZzYikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENoYW5naW5nIEZTQiB0byAlZCBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9mc2IpOworCWVsc2UKKwkJZHByaW50ayhLRVJOX0lORk8gImNwdWZyZXE6IENoYW5nZWQgRlNCIHN1Y2Nlc3NmdWxseSB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2ZzYik7CisKKwkvKiBFbmFibGUgSVJRcyAqLworCS8vbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZm9yY2UyX3ZlcmlmeSAtIHZlcmlmaWVzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGZzYl9wb2xfbWF4OworCisJZnNiX3BvbF9tYXggPSBwb2xpY3ktPm1heCAvIChmaWQgKiAxMDApOworCisJaWYgKHBvbGljeS0+bWluIDwgKGZzYl9wb2xfbWF4ICogZmlkICogMTAwKSkKKwkJcG9saWN5LT5tYXggPSAoZnNiX3BvbF9tYXggKyAxKSAqIGZpZCAqIDEwMDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5mb3JjZTJfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGZzYjsKKwl1bnNpZ25lZCBpbnQgcmZpZDsKKworCS8qIGNhcGFiaWxpdHkgY2hlY2sgKi8KKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgY3VycmVudCBGU0IgKi8KKwlmc2IgPSBuZm9yY2UyX2ZzYl9yZWFkKDApOworCisJaWYgKCFmc2IpCisJCXJldHVybiAtRUlPOworCisJLyogRklYOiBHZXQgRklEIGZyb20gQ1BVICovCisJaWYgKCFmaWQpIHsKKwkJaWYgKCFjcHVfa2h6KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImNwdWZyZXE6IGNwdV9raHogbm90IHNldCwgY2FuJ3QgY2FsY3VsYXRlIG11bHRpcGxpZXIhXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZmlkID0gY3B1X2toeiAvIChmc2IgKiAxMDApOworCQlyZmlkID0gZmlkICUgNTsKKworCQlpZiAocmZpZCkgeworCQkJaWYgKHJmaWQgPiAyKQorCQkJCWZpZCArPSA1IC0gcmZpZDsKKwkJCWVsc2UKKwkJCQlmaWQgLT0gcmZpZDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gImNwdWZyZXE6IEZTQiBjdXJyZW50bHkgYXQgJWkgTUh6LCBGSUQgJWQuJWRcbiIsIGZzYiwKKwkgICAgICAgZmlkIC8gMTAsIGZpZCAlIDEwKTsKKwkKKwkvKiBTZXQgbWF4aW11bSBGU0IgdG8gRlNCIGF0IGJvb3QgdGltZSAqLworCW1heF9mc2IgPSBuZm9yY2UyX2ZzYl9yZWFkKDEpOworCQorCWlmKCFtYXhfZnNiKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghbWluX2ZzYikKKwkJbWluX2ZzYiA9IG1heF9mc2IgLSBORk9SQ0UyX1NBRkVfRElTVEFOQ0U7CisKKwlpZiAobWluX2ZzYiA8IE5GT1JDRTJfTUlOX0ZTQikKKwkJbWluX2ZzYiA9IE5GT1JDRTJfTUlOX0ZTQjsKKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IG1pbl9mc2IgKiBmaWQgKiAxMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gbWF4X2ZzYiAqIGZpZCAqIDEwMDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gbmZvcmNlMl9nZXQocG9saWN5LT5jcHUpOworCXBvbGljeS0+bWluID0gcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxOworCXBvbGljeS0+bWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZm9yY2UyX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIG5mb3JjZTJfZHJpdmVyID0geworCS5uYW1lID0gIm5mb3JjZTIiLAorCS52ZXJpZnkgPSBuZm9yY2UyX3ZlcmlmeSwKKwkudGFyZ2V0ID0gbmZvcmNlMl90YXJnZXQsCisJLmdldCA9IG5mb3JjZTJfZ2V0LAorCS5pbml0ID0gbmZvcmNlMl9jcHVfaW5pdCwKKwkuZXhpdCA9IG5mb3JjZTJfY3B1X2V4aXQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCisvKioKKyAqIG5mb3JjZTJfZGV0ZWN0X2NoaXBzZXQgLSBkZXRlY3QgdGhlIFNvdXRoYnJpZGdlIHdoaWNoIGNvbnRhaW5zIEZTQiBQTEwgbG9naWMKKyAqCisgKiBEZXRlY3RzIG5Gb3JjZTIgQTIgYW5kIEMxIHN0ZXBwaW5nCisgKiAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZm9yY2UyX2RldGVjdF9jaGlwc2V0KHZvaWQpCit7CisJdTggcmV2aXNpb247CisKKwluZm9yY2UyX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9OVklESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCWlmIChuZm9yY2UyX2NoaXBzZXRfZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgUENJX1JFVklTSU9OX0lELCAmcmV2aXNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY3B1ZnJlcTogRGV0ZWN0ZWQgbkZvcmNlMiBjaGlwc2V0IHJldmlzaW9uICVYXG4iLAorCSAgICAgICByZXZpc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiY3B1ZnJlcTogRlNCIGNoYW5naW5nIGlzIG1heWJlIHVuc3RhYmxlIGFuZCBjYW4gbGVhZCB0byBjcmFzaGVzIGFuZCBkYXRhIGxvc3MuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG5mb3JjZTJfaW5pdCAtIGluaXRpYWxpemVzIHRoZSBuRm9yY2UyIENQVUZyZXEgZHJpdmVyCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIG5Gb3JjZTIgRlNCIHN1cHBvcnQuIFJldHVybnMgLUVOT0RFViBvbiB1bnN1cHBvcnRlZAorICogZGV2aWNlcywgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvIG9uCisgKiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBuZm9yY2UyX2luaXQodm9pZCkKK3sKKwkvKiBUT0RPOiBkbyB3ZSBuZWVkIHRvIGRldGVjdCB0aGUgcHJvY2Vzc29yPyAqLworCisJLyogZGV0ZWN0IGNoaXBzZXQgKi8KKwlpZiAobmZvcmNlMl9kZXRlY3RfY2hpcHNldCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogTm8gbkZvcmNlMiBjaGlwc2V0LlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbmZvcmNlMl9kcml2ZXIpOworfQorCisvKioKKyAqIG5mb3JjZTJfZXhpdCAtIHVucmVnaXN0ZXJzIGNwdWZyZXEgbW9kdWxlCisgKgorICogICBVbnJlZ2lzdGVycyBuRm9yY2UyIEZTQiBjaGFuZ2Ugc3VwcG9ydC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IG5mb3JjZTJfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5mb3JjZTJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobmZvcmNlMl9pbml0KTsKK21vZHVsZV9leGl0KG5mb3JjZTJfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdjYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogCWVsYW5mcmVxOiAJY3B1ZnJlcSBkcml2ZXIgZm9yIHRoZSBBTUQgRUxBTiBmYW1pbHkKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDIgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqCVBhcnRzIG9mIHRoaXMgY29kZSBhcmUgKGMpIFN2ZW4gR2VnZ3VzIDxzdmVuQGdlZ2d1cy5uZXQ+IAorICoKKyAqICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKgorICoJMjAwMi0wMi0xMzogLSBpbml0aWFsIHJldmlzaW9uIGZvciAyLjQuMTgtcHJlOSBieSBSb2JlcnQgU2Nod2ViZWwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBSRUdfQ1NDSVIgMHgyMiAJCS8qIENoaXAgU2V0dXAgYW5kIENvbnRyb2wgSW5kZXggUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgUkVHX0NTQ0RSIDB4MjMJCS8qIENoaXAgU2V0dXAgYW5kIENvbnRyb2wgRGF0YSAgUmVnaXN0ZXIgICAgKi8KKworLyogTW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIGludCBtYXhfZnJlcTsKKworc3RydWN0IHNfZWxhbl9tdWx0aXBsaWVyIHsKKwlpbnQgY2xvY2s7CQkvKiBmcmVxdWVuY3kgaW4ga0h6ICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IHZhbDQwaDsJCS8qIFBNVSBGb3JjZSBNb2RlIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdmFsODBoOwkJLyogQ1BVIENsb2NrIFNwZWVkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworfTsKKworLyoKKyAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBmcmVxdWVuY2llcyAKKyAqIGFyZSBsaXN0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGhlcmUhCisgKi8KK3N0cnVjdCBzX2VsYW5fbXVsdGlwbGllciBlbGFuX211bHRpcGxpZXJbXSA9IHsKKwl7MTAwMCwJMHgwMiwJMHgxOH0sCisJezIwMDAsCTB4MDIsCTB4MTB9LAorCXs0MDAwLAkweDAyLAkweDA4fSwKKwl7ODAwMCwJMHgwMCwJMHgwMH0sCisJezE2MDAwLAkweDAwLAkweDAyfSwKKwl7MzMwMDAsCTB4MDAsCTB4MDR9LAorCXs2NjAwMCwJMHgwMSwJMHgwNH0sCisJezk5MDAwLAkweDAxLAkweDA1fQorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBlbGFuZnJlcV90YWJsZVtdID0geworCXswLAkxMDAwfSwKKwl7MSwJMjAwMH0sCisJezIsCTQwMDB9LAorCXszLAk4MDAwfSwKKwl7NCwJMTYwMDB9LAorCXs1LAkzMzAwMH0sCisJezYsCTY2MDAwfSwKKwl7NywJOTkwMDB9LAorCXswLAlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisKKy8qKgorICoJZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3k6IGRldGVybWluZSBjdXJyZW50IGNwdSBzcGVlZAorICoKKyAqCUZpbmRzIG91dCBhdCB3aGljaCBmcmVxdWVuY3kgdGhlIENQVSBvZiB0aGUgRWxhbiBTT0MgcnVucworICoJYXQgdGhlIG1vbWVudC4gRnJlcXVlbmNpZXMgZnJvbSAxIHRvIDMzIE1IeiBhcmUgZ2VuZXJhdGVkIAorICoJdGhlIG5vcm1hbCB3YXksIDY2IGFuZCA5OSBNSHogYXJlIGNhbGxlZCAiSHlwZXJzcGVlZCBNb2RlIgorICoJYW5kIGhhdmUgdGhlIHJlc3Qgb2YgdGhlIGNoaXAgcnVubmluZyB3aXRoIDMzIE1Iei4gCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgY3B1KQoreworICAgICAgICB1OCBjbG9ja3NwZWVkX3JlZzsgICAgLyogQ2xvY2sgU3BlZWQgUmVnaXN0ZXIgKi8KKwkKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworICAgICAgICBvdXRiX3AoMHg4MCxSRUdfQ1NDSVIpOworICAgICAgICBjbG9ja3NwZWVkX3JlZyA9IGluYl9wKFJFR19DU0NEUik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisgICAgICAgIGlmICgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA9PSAweEUwKSB7IHJldHVybiAwOyB9CisKKyAgICAgICAgLyogQXJlIHdlIGluIENQVSBjbG9jayBtdWx0aXBsaWVkIG1vZGUgKDY2Lzk5IE1Ieik/ICovCisgICAgICAgIGlmICgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAgICAgaWYgKChjbG9ja3NwZWVkX3JlZyAmIDB4MDEpID09IDApIHsKKwkJCXJldHVybiA2NjAwMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiA5OTAwMDsgICAgICAgICAgICAgCisJCX0KKyAgICAgICAgfQorCisJLyogMzMgTUh6IGlzIG5vdCAzMiBNSHouLi4gKi8KKwlpZiAoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCk9PTB4QTApCisJCXJldHVybiAzMzAwMDsKKworICAgICAgICByZXR1cm4gKCgxPDwoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCkgPj4gNSkpICogMTAwMCk7Cit9CisKKworLyoqCisgKiAgICAgIGVsYW5mcmVxX3NldF9jcHVfZnJlcXVlbmN5OiBDaGFuZ2UgdGhlIENQVSBjb3JlIGZyZXF1ZW5jeQorICogCUBjcHU6IGNwdSBudW1iZXIKKyAqCUBmcmVxOiBmcmVxdWVuY3kgaW4ga0h6CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZnJlcXVlbmN5IHZhbHVlIGFuZCBjaGFuZ2VzIHRoZSBDUFUgZnJlcXVlbmN5IAorICoJYWNjb3JkaW5nIHRvIHRoaXMuIE5vdGUgdGhhdCB0aGUgZnJlcXVlbmN5IGhhcyB0byBiZSBjaGVja2VkIGJ5CisgKgllbGFuZnJlcV92YWxpZGF0ZXNwZWVkKCkgZm9yIGNvcnJlY3RuZXNzIQorICoJCisgKglUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuIAorICovCisKK3N0YXRpYyB2b2lkIGVsYW5mcmVxX3NldF9jcHVfc3RhdGUgKHVuc2lnbmVkIGludCBzdGF0ZSkgeworCisJc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgZnJlcXM7CisKKwlmcmVxcy5vbGQgPSBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSgwKTsKKwlmcmVxcy5uZXcgPSBlbGFuX211bHRpcGxpZXJbc3RhdGVdLmNsb2NrOworCWZyZXFzLmNwdSA9IDA7IC8qIGVsYW5mcmVxLmMgaXMgVVAgb25seSBkcml2ZXIgKi8KKwkKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZWxhbmZyZXE6IGF0dGVtcHRpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byAlaSBrSHpcbiIsZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS5jbG9jayk7CisKKworCS8qIAorCSAqIEFjY2VzcyB0byB0aGUgRWxhbidzIGludGVybmFsIHJlZ2lzdGVycyBpcyBpbmRleGVkIHZpYSAgICAKKwkgKiAweDIyOiBDaGlwIFNldHVwICYgQ29udHJvbCBSZWdpc3RlciBJbmRleCBSZWdpc3RlciAoQ1NDSSkgCisJICogMHgyMzogQ2hpcCBTZXR1cCAmIENvbnRyb2wgUmVnaXN0ZXIgRGF0YSAgUmVnaXN0ZXIgKENTQ0QpIAorCSAqCisJICovCisKKwkvKiAKKwkgKiAweDQwIGlzIHRoZSBQb3dlciBNYW5hZ2VtZW50IFVuaXQncyBGb3JjZSBNb2RlIFJlZ2lzdGVyLiAKKwkgKiBCaXQgNiBlbmFibGVzIEh5cGVyc3BlZWQgTW9kZSAoNjYvMTAwIE1IeiBjb3JlIGZyZXF1ZW5jeSkKKwkgKi8KKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJb3V0Yl9wKDB4NDAsUkVHX0NTQ0lSKTsgCS8qIERpc2FibGUgaHlwZXJzcGVlZCBtb2RlICAgICAgICAgICovCisJb3V0Yl9wKDB4MDAsUkVHX0NTQ0RSKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CQkvKiB3YWl0IHRpbGwgaW50ZXJuYWwgcGlwZWxpbmVzIGFuZCAqLworCXVkZWxheSgxMDAwKTsJCQkvKiBidWZmZXJzIGhhdmUgY2xlYW5lZCB1cCAgICAgICAgICAqLworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIG5vdywgc2V0IHRoZSBDUFUgY2xvY2sgc3BlZWQgcmVnaXN0ZXIgKDB4ODApICovCisJb3V0Yl9wKDB4ODAsUkVHX0NTQ0lSKTsKKwlvdXRiX3AoZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS52YWw4MGgsUkVHX0NTQ0RSKTsKKworCS8qIG5vdywgdGhlIGh5cGVyc3BlZWQgYml0IGluIFBNVSBGb3JjZSBNb2RlIFJlZ2lzdGVyICgweDQwKSAqLworCW91dGJfcCgweDQwLFJFR19DU0NJUik7CisJb3V0Yl9wKGVsYW5fbXVsdGlwbGllcltzdGF0ZV0udmFsNDBoLFJFR19DU0NEUik7CisJdWRlbGF5KDEwMDAwKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKK307CisKKworLyoqCisgKgllbGFuZnJlcV92YWxpZGF0ZXNwZWVkOiB0ZXN0IGlmIGZyZXF1ZW5jeSByYW5nZSBpcyB2YWxpZAorICogICAgICBAcG9saWN5OiB0aGUgcG9saWN5IHRvIHZhbGlkYXRlCisgKgorICoJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UgaW4ga0h6IGlzIHZhbGlkIAorICogICAgICBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLiAKKyAqLworCitzdGF0aWMgaW50IGVsYW5mcmVxX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZlbGFuZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZWxhbmZyZXFfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCAKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmZWxhbmZyZXFfdGFibGVbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbGFuZnJlcV9zZXRfY3B1X3N0YXRlKG5ld3N0YXRlKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglNb2R1bGUgaW5pdCBhbmQgZXhpdCBjb2RlCisgKi8KKworc3RhdGljIGludCBlbGFuZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwKKwkgICAgKGMtPng4NiAhPSA0KSB8fCAoYy0+eDg2X21vZGVsIT0xMCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogbWF4IGZyZXEgKi8KKwlpZiAoIW1heF9mcmVxKQorCQltYXhfZnJlcSA9IGVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5KDApOworCisJLyogdGFibGUgaW5pdCAqLworIAlmb3IgKGk9MDsgKGVsYW5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCQlpZiAoZWxhbmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID4gbWF4X2ZyZXEpCisJCQllbGFuZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJfQorCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koMCk7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgZWxhbmZyZXFfdGFibGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihlbGFuZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBlbGFuZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmbmRlZiBNT0RVTEUKKy8qKgorICogZWxhbmZyZXFfc2V0dXAgLSBlbGFuZnJlcSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIHBhcnNpbmcKKyAqCisgKiBlbGFuZnJlcSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLiAgVXNlOgorICogIGVsYW5mcmVxPTY2MDAwCisgKiB0byBzZXQgdGhlIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0byA2NiBNSHouIE5vdGUgdGhhdCBpbgorICogY2FzZSB5b3UgZG8gbm90IGdpdmUgdGhpcyBib290IHBhcmFtZXRlciwgdGhlIG1heGltdW0KKyAqIGZyZXF1ZW5jeSB3aWxsIGZhbGwgYmFjayB0byBfY3VycmVudF8gQ1BVIGZyZXF1ZW5jeSB3aGljaAorICogbWlnaHQgYmUgbG93ZXIuIElmIHlvdSBidWlsZCB0aGlzIGFzIGEgbW9kdWxlLCB1c2UgdGhlCisgKiBtYXhfZnJlcSBtb2R1bGUgcGFyYW1ldGVyIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVsYW5mcmVxX3NldHVwKGNoYXIgKnN0cikKK3sKKwltYXhfZnJlcSA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiWW91J3JlIHVzaW5nIHRoZSBkZXByZWNhdGVkIGVsYW5mcmVxIGNvbW1hbmQgbGluZSBvcHRpb24uIFVzZSBlbGFuZnJlcS5tYXhfZnJlcSBpbnN0ZWFkLCBwbGVhc2UhXG4iKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImVsYW5mcmVxPSIsIGVsYW5mcmVxX3NldHVwKTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBlbGFuZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgZWxhbmZyZXFfZHJpdmVyID0geworCS5nZXQJIAk9IGVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5LAorCS52ZXJpZnkgCT0gZWxhbmZyZXFfdmVyaWZ5LAorCS50YXJnZXQgCT0gZWxhbmZyZXFfdGFyZ2V0LAorCS5pbml0CQk9IGVsYW5mcmVxX2NwdV9pbml0LAorCS5leGl0CQk9IGVsYW5mcmVxX2NwdV9leGl0LAorCS5uYW1lCQk9ICJlbGFuZnJlcSIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IGVsYW5mcmVxX2F0dHIsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGVsYW5mcmVxX2luaXQodm9pZCkgCit7CQorCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJLyogVGVzdCBpZiB3ZSBoYXZlIHRoZSByaWdodCBoYXJkd2FyZSAqLworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwKKwkJKGMtPng4NiAhPSA0KSB8fCAoYy0+eDg2X21vZGVsIT0xMCkpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJlbGFuZnJlcTogZXJyb3I6IG5vIEVsYW4gcHJvY2Vzc29yIGZvdW5kIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZWxhbmZyZXFfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZWxhbmZyZXFfZXhpdCh2b2lkKSAKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZlbGFuZnJlcV9kcml2ZXIpOworfQorCisKK21vZHVsZV9wYXJhbSAobWF4X2ZyZXEsIGludCwgMDQ0NCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFN2ZW4gR2VnZ3VzIDxzdmVuQGdlZ2d1cy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImNwdWZyZXEgZHJpdmVyIGZvciBBTUQncyBFbGFuIENQVXMiKTsKKworbW9kdWxlX2luaXQoZWxhbmZyZXFfaW5pdCk7Cittb2R1bGVfZXhpdChlbGFuZnJlcV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQ5YWRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgKglDeXJpeCBNZWRpYUdYIGFuZCBOYXRTZW1pIEdlb2RlIFN1c3BlbmQgTW9kdWxhdGlvbgorICoJKEMpIDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4KKyAqCShDKSAyMDAyIEhpcm9zaGkgTWl1cmEgICA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAKKyAqCisgKiAgICAgIFRoZSBhdXRob3Iocykgb2YgdGhpcyBzb2Z0d2FyZSBzaGFsbCBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGRhbWFnZXMKKyAqICAgICAgb2YgYW55IG5hdHVyZSByZXN1bHRpbmcgZHVlIHRvIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcworICogICAgICBzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuCisgKgkKKyAqIFRoZW9yaXRpY2FsIG5vdGU6CisgKgorICoJKHNlZSBHZW9kZSh0bSkgQ1M1NTMwIG1hbnVhbCAocmV2LjQuMSkgcGFnZS41NikKKyAqCisgKglDUFUgZnJlcXVlbmN5IGNvbnRyb2wgb24gTmF0U2VtaSBHZW9kZSBHWDEvR1hMViBwcm9jZXNzb3IgYW5kIENTNTV4MAorICoJYXJlIGJhc2VkIG9uIFN1c3BlbmQgTW9kdXJhdGlvbi4KKyAqCisgKglTdXNwZW5kIE1vZHVsYXRpb24gd29ya3MgYnkgYXNzZXJ0aW5nIGFuZCBkZS1hc3NlcnRpbmcgdGhlIFNVU1AjIHBpbgorICoJdG8gQ1BVKEdYMS9HWExWKSBmb3IgY29uZmlndXJhYmxlIGR1cmF0aW9ucy4gV2hlbiBhc3NlcnRpbmcgU1VTUCMKKyAqCXRoZSBDUFUgZW50ZXJzIGFuIGlkbGUgc3RhdGUuIEdYMSBzdG9wcyBpdHMgY29yZSBjbG9jayB3aGVuIFNVU1AjIGlzIAorICoJYXNzZXJ0ZWQgdGhlbiBwb3dlciBjb25zdW1wdGlvbiBpcyByZWR1Y2VkLgorICoKKyAqCVN1c3BlbmQgTW9kdWxhdGlvbidzIE9GRi9PTiBkdXJhdGlvbiBhcmUgY29uZmlndXJhYmxlIAorICoJd2l0aCAnU3VzcGVuZCBNb2R1bGF0aW9uIE9GRiBDb3VudCBSZWdpc3RlcicKKyAqCWFuZCAnU3VzcGVuZCBNb2R1bGF0aW9uIE9OIENvdW50IFJlZ2lzdGVyJy4KKyAqCVRoZXNlIHJlZ2lzdGVycyBhcmUgOGJpdCBjb3VudGVycyB0aGF0IHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIAorICoJMzJ1cyBpbnRlcnZhbHMgd2hpY2ggdGhlIFNVU1AjIHBpbiBpcyBhc3NlcnRlZChPTikvZGUtYXNzZXJ0ZWQoT0ZGKQorICoJdG8gdGhlIHByb2Nlc3Nvci4KKyAqCisgKglUaGVzZSBjb3VudGVycyBkZWZpbmUgYSByYXRpbyB3aGljaCBpcyB0aGUgZWZmZWN0aXZlIGZyZXF1ZW5jeSAKKyAqIAlvZiBvcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KKyAqCisgKgkJCSAgICAgICBPRkYgQ291bnQKKyAqCUZfZWZmID0gRmd4ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgICAgICAgICAgICAgIE9GRiBDb3VudCArIE9OIENvdW50CisgKgorICoJMCA8PSBPbiBDb3VudCwgT2ZmIENvdW50IDw9IDI1NQorICoKKyAqCUZyb20gdGhlc2UgbGltaXRzLCB3ZSBjYW4gZ2V0IHJlZ2lzdGVyIHZhbHVlcyAKKyAqCisgKglvZmZfZHVyYXRpb24gKyBvbl9kdXJhdGlvbiA8PSBNQVhfRFVSQVRJT04KKyAqCW9uX2R1cmF0aW9uID0gb2ZmX2R1cmF0aW9uICogKHN0b2NrX2ZyZXEgLSBmcmVxKSAvIGZyZXEKKyAqCisgKiAgICAgIG9mZl9kdXJhdGlvbiAgPSAgKGZyZXEgKiBEVVJBVElPTikgLyBzdG9ja19mcmVxIAorICogICAgICBvbl9kdXJhdGlvbiA9IERVUkFUSU9OIC0gb2ZmX2R1cmF0aW9uIAorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENoYW5nZUxvZzoKKyAqICAJRGVjLiAxMiwgMjAwMwlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICogIAkJLSBmaXggb24vb2ZmIHJlZ2lzdGVyIG1pc3Rha2UKKyAqICAJCS0gZml4IGNwdV9raHogY2FsYyB3aGVuIGl0IHN0b3BzIGNwdSBtb2R1bGF0aW9uLgorICoKKyAqCURlYy4gMTEsIDIwMDIgCUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgkJLSByZXdyaXRlIGZvciBDeXJpeCBNZWRpYUdYIEN4NTUxMC81NTIwIGFuZCAKKyAqCQkgIE5hdFNlbWkgR2VvZGUgQ3M1NTMwKEEpLgorICoKKyAqCUp1bC4gPz8sIDIwMDIgIFp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+CisgKgkJLSBjczU1MzBfbW9kIHBhdGNoIGZvciAyLjQuMTktcmMxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVG9kbworICoJVGVzdCBvbiBtYWNoaW5lcyB3aXRoIDU1MTAsIDU1MzAsIDU1MzBBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlTdXNwZW5kIE1vZHVsYXRpb24gLSBEZWZpbml0aW9ucwkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKy8qIFBDSSBjb25maWcgcmVnaXN0ZXJzLCBhbGwgYXQgRjAgKi8KKyNkZWZpbmUgUENJX1BNRVIxICAgICAgICAgICAgICAweDgwICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUENJX1BNRVIyICAgICAgICAgICAgICAweDgxICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUENJX1BNRVIzICAgICAgICAgICAgICAweDgyICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUENJX0lSUVRDICAgICAgICAgICAgICAweDhjICAgIC8qIGlycSBzcGVlZHVwIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXI6dHlwaWNhbCAyIHRvIDRtcyAqLworI2RlZmluZSBQQ0lfVklEVEMgICAgICAgICAgICAgIDB4OGQgICAgLyogdmlkZW8gc3BlZWR1cCB0aW1lciBjb3VudGVyIHJlZ2lzdGVyOiB0eXBpY2FsIDUwIHRvIDEwMG1zICovCisjZGVmaW5lIFBDSV9NT0RPRkYgICAgICAgICAgICAgMHg5NCAgICAvKiBzdXNwZW5kIG1vZHVsYXRpb24gT0ZGIGNvdW50ZXIgcmVnaXN0ZXIsIDEgPSAzMnVzICovCisjZGVmaW5lIFBDSV9NT0RPTiAgICAgICAgICAgICAgMHg5NSAgICAvKiBzdXNwZW5kIG1vZHVsYXRpb24gT04gY291bnRlciByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfU1VTQ0ZHICAgICAgICAgICAgIDB4OTYgICAgLyogc3VzcGVuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKy8qIFBNRVIxIGJpdHMgKi8KKyNkZWZpbmUgR1BNICAgICAgICAgICAgICAgICAgICAoMTw8MCkgIC8qIGdsb2JhbCBwb3dlciBtYW5hZ2VtZW50ICovCisjZGVmaW5lIEdJVCAgICAgICAgICAgICAgICAgICAgKDE8PDEpICAvKiBnbG9iYWxseSBlbmFibGUgUE0gZGV2aWNlIGlkbGUgdGltZXJzICovCisjZGVmaW5lIEdUUiAgICAgICAgICAgICAgICAgICAgKDE8PDIpICAvKiBnbG9iYWxseSBlbmFibGUgSU8gdHJhcHMgKi8KKyNkZWZpbmUgSVJRX1NQRFVQICAgICAgICAgICAgICAoMTw8MykgIC8qIGRpc2FibGUgY2xvY2sgdGhyb3R0bGUgZHVyaW5nIGludGVycnVwdCBoYW5kbGluZyAqLworI2RlZmluZSBWSURfU1BEVVAgICAgICAgICAgICAgICgxPDw0KSAgLyogZGlzYWJsZSBjbG9jayB0aHJvdHRsZSBkdXJpbmcgdmdhIHZpZGVvIGhhbmRsaW5nICovCisKKy8qIFNVU0NGRyBiaXRzICovCisjZGVmaW5lIFNVU01PRCAgICAgICAgICAgICAgICAgKDE8PDApICAvKiBlbmFibGUvZGlzYWJsZSBzdXNwZW5kIG1vZHVsYXRpb24gKi8KKy8qIHRoZSBiZWxvd3Mgc3VwcG9ydCBvbmx5IHdpdGggY3M1NTMwIChhZnRlciByZXYuMS4yKS9jczU1MzBBICovIAorI2RlZmluZSBTTUlTUERVUCAgICAgICAgICAgICAgICgxPDwxKSAgLyogc2VsZWN0IGhvdyBTTUkgcmUtZW5hYmxlIHN1c3BlbmQgbW9kdWxhdGlvbjogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElSUVRDIHRpbWVyIG9yIHJlYWQgU01JIHNwZWVkdXAgZGlzYWJsZSByZWcuKEYxQkFSWzA4LTA5aF0pICovCisjZGVmaW5lIFNVU0NGRyAgICAgICAgICAgICAgICAgKDE8PDIpICAvKiBlbmFibGUgcG93ZXJpbmcgZG93biBhIEdYTFYgcHJvY2Vzc29yLiAiU3BlY2lhbCAzVm9sdCBTdXNwZW5kIiBtb2RlICovCisvKiB0aGUgYmVsb3dzIHN1cHBvcnQgb25seSB3aXRoIGNzNTUzMEEgKi8gCisjZGVmaW5lIFBXUlNWRV9JU0EgICAgICAgICAgICAgKDE8PDMpICAvKiBzdG9wIElTQSBjbG9jayAgKi8KKyNkZWZpbmUgUFdSU1ZFICAgICAgICAgICAgICAgICAoMTw8NCkgIC8qIGFjdGl2ZSBpZGxlICovCisKK3N0cnVjdCBneGZyZXFfcGFyYW1zIHsKKwl1OCBvbl9kdXJhdGlvbjsKKwl1OCBvZmZfZHVyYXRpb247CisJdTggcGNpX3N1c2NmZzsKKwl1OCBwY2lfcG1lcjE7CisJdTggcGNpX3BtZXIyOworCXU4IHBjaV9yZXY7CisJc3RydWN0IHBjaV9kZXYgKmNzNTV4MDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyAqZ3hfcGFyYW1zOworc3RhdGljIGludCBzdG9ja19mcmVxOworCisvKiBQQ0kgYnVzIGNsb2NrIC0gZGVmYXVsdHMgdG8gMzAuMDAwIGlmIGNwdV9raHogaXMgbm90IGF2YWlsYWJsZSAqLworc3RhdGljIGludCBwY2lfYnVzY2xrID0gMDsKK21vZHVsZV9wYXJhbSAocGNpX2J1c2NsaywgaW50LCAwNDQ0KTsKKworLyogbWF4aW11bSBkdXJhdGlvbiBmb3Igd2hpY2ggdGhlIGNwdSBtYXkgYmUgc3VzcGVuZGVkCisgKiAoMzJ1cyAqIE1BWF9EVVJBVElPTikuIElmIG5vIHBhcmFtZXRlciBpcyBnaXZlbiwgdGhpcyBkZWZhdWx0cworICogdG8gMjU1LiAKKyAqIE5vdGUgdGhhdCB0aGlzIGxlYWRzIHRvIGEgbWF4aW11bSBvZiA4IG1zKCEpIHdoZXJlIHRoZSBDUFUgY2xvY2sKKyAqIGlzIHN1c3BlbmRlZCAtLSBwcm9jZXNzaW5nIHBvd2VyIGlzIGp1c3QgMC4zOSUgb2Ygd2hhdCBpdCB1c2VkIHRvIGJlLAorICogdGhvdWdoLiA3ODEuMjUga0h6KCEpIGZvciBhIDIwMCBNSHogcHJvY2Vzc29yIC0tIHdvdy4gKi8KK3N0YXRpYyBpbnQgbWF4X2R1cmF0aW9uID0gMjU1OworbW9kdWxlX3BhcmFtIChtYXhfZHVyYXRpb24sIGludCwgMDQ0NCk7CisKKy8qIEZvciB0aGUgZGVmYXVsdCBwb2xpY3ksIHdlIHdhbnQgYXQgbGVhc3Qgc29tZSBwcm9jZXNzaW5nIHBvd2VyCisgKiAtIGxldCdzIHNheSA1JS4gKG1pbiA9IG1heGZyZXEgLyBQT0xJQ1lfTUlOX0RJVikKKyAqLworI2RlZmluZSBQT0xJQ1lfTUlOX0RJViAyMAorCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiZ3gtc3VzcG1vZCIsIG1zZykKKworLyoqCisgKiAgICAgIHdlIGNhbiBkZXRlY3QgYSBjb3JlIG11bHRpcGlsZXIgZnJvbSBkaXIwX2xzYiAKKyAqICAgICAgZnJvbSBHWDEgZGF0YXNoZWV0IHAuNTYsIAorICoJICAgTVVMVFszOjBdOgorICoJICAgMDAwMCA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDQgKHRlc3Qgb25seSkKKyAqCSAgIDAwMDEgPSBTWVNDTEsgbXVsdGlwbGllZCBieSAxMAorICoJICAgMDAxMCA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDQKKyAqCSAgIDAwMTEgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA2CisgKgkgICAwMTAwID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgOQorICoJICAgMDEwMSA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDUKKyAqCSAgIDAxMTAgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA3CisgKgkgICAwMTExID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgOAorICogICAgICAgICAgICAgIG9mIDMzLjNNSHoKKyAqKi8KK3N0YXRpYyBpbnQgZ3hfZnJlcV9tdWx0WzE2XSA9IHsKKwkJNCwgMTAsIDQsIDYsIDksIDUsIDcsIDgsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAlMb3cgTGV2ZWwgY2hpcHNldCBpbnRlcmZhY2UJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ3hfY2hpcHNldF90YmxbXSBfX2luaXRkYXRhID0geworICAgICAgICB7IFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9MRUdBQ1ksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyAwLCB9LAorfTsKKworLyoqCisgKiAgICAgZ3hfZGV0ZWN0X2NoaXBzZXQ6CisgKgorICoqLworc3RhdGljIF9faW5pdCBzdHJ1Y3QgcGNpX2RldiAqZ3hfZGV0ZWN0X2NoaXBzZXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZ3hfcGNpID0gTlVMTDsKKworCS8qIGNoZWNrIGlmIENQVSBpcyBhIE1lZGlhR1ggb3IgYSBHZW9kZS4gKi8KKyAgICAgICAgaWYgKChjdXJyZW50X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9OU0MpICYmIAorCSAgICAoY3VycmVudF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQ1lSSVgpKSB7CisJCWRwcmludGsoImVycm9yOiBubyBNZWRpYUdYL0dlb2RlIHByb2Nlc3NvciBmb3VuZCFcbiIpOworCQlyZXR1cm4gTlVMTDsJCQorCX0KKworCS8qIGRldGVjdCB3aGljaCBjb21wYW5pb24gY2hpcCBpcyB1c2VkICovCisJd2hpbGUgKChneF9wY2kgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBneF9wY2kpKSAhPSBOVUxMKSB7CisJCWlmICgocGNpX21hdGNoX2RldmljZSAoZ3hfY2hpcHNldF90YmwsIGd4X3BjaSkpICE9IE5VTEwpIHsKKwkJCXJldHVybiBneF9wY2k7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJlcnJvcjogbm8gc3VwcG9ydGVkIGNoaXBzZXQgZm91bmQhXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiAgICAgIGd4X2dldF9jcHVzcGVlZDoKKyAqCisgKiBGaW5kcyBvdXQgYXQgd2hpY2ggZWZmaWNpZW50IGZyZXF1ZW5jeSB0aGUgQ3lyaXggTWVkaWFHWC9OYXRTZW1pIEdlb2RlIENQVSBydW5zLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGd4X2dldF9jcHVzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmICgoZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnICYgU1VTTU9EKSA9PSAwKSAKKwkJcmV0dXJuIHN0b2NrX2ZyZXE7CisKKwlyZXR1cm4gKHN0b2NrX2ZyZXEgKiBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbikgCisJCS8gKGd4X3BhcmFtcy0+b25fZHVyYXRpb24gKyBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7Cit9CisKKy8qKgorICogICAgICBneF92YWxpZGF0ZV9zcGVlZDoKKyAqICAgICAgZGV0ZXJtaW5lIGN1cnJlbnQgY3B1IHNwZWVkCisgKiAgICAgICAKKyoqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGd4X3ZhbGlkYXRlX3NwZWVkKHVuc2lnbmVkIGludCBraHosIHU4ICpvbl9kdXJhdGlvbiwgdTggKm9mZl9kdXJhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCB0bXBfb24sIHRtcF9vZmY7CisJaW50IG9sZF90bXBfZnJlcSA9IHN0b2NrX2ZyZXE7CisJaW50IHRtcF9mcmVxOworCisJKm9mZl9kdXJhdGlvbj0xOworCSpvbl9kdXJhdGlvbj0wOworCisJZm9yIChpPW1heF9kdXJhdGlvbjsgaT4wOyBpLS0pIHsKKwkJdG1wX29mZiA9ICgoa2h6ICogaSkgLyBzdG9ja19mcmVxKSAmIDB4ZmY7IAorCQl0bXBfb24gPSBpIC0gdG1wX29mZjsKKwkJdG1wX2ZyZXEgPSAoc3RvY2tfZnJlcSAqIHRtcF9vZmYpIC8gaTsKKwkJLyogaWYgdGhpcyByZWxhdGlvbiBpcyBjbG9zZXIgdG8ga2h6LCB1c2UgdGhpcy4gSWYgaXQncyBlcXVhbCwKKwkJICogcHJlZmVyIGl0LCB0b28gLSBsb3dlciBsYXRlbmN5ICovCisJCWlmIChhYnModG1wX2ZyZXEgLSBraHopIDw9IGFicyhvbGRfdG1wX2ZyZXEgLSBraHopKSB7CisJCQkqb25fZHVyYXRpb24gPSB0bXBfb247CisJCQkqb2ZmX2R1cmF0aW9uID0gdG1wX29mZjsKKwkJCW9sZF90bXBfZnJlcSA9IHRtcF9mcmVxOworCQl9CisJfQorCisJcmV0dXJuIG9sZF90bXBfZnJlcTsKK30KKworCisvKioKKyAqIAlneF9zZXRfY3B1c3BlZWQ6CisgKgkJc2V0IGNwdSBzcGVlZCBpbiBraHouCisgKiovCisKK3N0YXRpYyB2b2lkIGd4X3NldF9jcHVzcGVlZCh1bnNpZ25lZCBpbnQga2h6KQoreworICAgICAgICB1OCBzdXNjZmcsIHBtZXIxOworCXVuc2lnbmVkIGludCBuZXdfa2h6OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisKKworCWZyZXFzLmNwdSA9IDA7CisJZnJlcXMub2xkID0gZ3hfZ2V0X2NwdXNwZWVkKDApOworCisJbmV3X2toeiA9IGd4X3ZhbGlkYXRlX3NwZWVkKGtoeiwgJmd4X3BhcmFtcy0+b25fZHVyYXRpb24sICZneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7CisKKwlmcmVxcy5uZXcgPSBuZXdfa2h6OworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobmV3X2toeiAhPSBzdG9ja19mcmVxKSB7ICAvKiBpZiBuZXcga2h6ID09IDEwMCUgb2YgQ1BVIHNwZWVkLCBpdCBpcyBzcGVjaWFsIGNhc2UgKi8KKwkJc3dpdGNoIChneF9wYXJhbXMtPmNzNTV4MC0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0xFR0FDWToKKwkJCXBtZXIxID0gZ3hfcGFyYW1zLT5wY2lfcG1lcjEgfCBJUlFfU1BEVVAgfCBWSURfU1BEVVA7CisJCQkvKiBGSVhNRTogbmVlZCB0byB0ZXN0IG90aGVyIHZhbHVlcyAtLSBad2FuZSxNaXVyYSAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfSVJRVEMsIDQpOyAvKiB0eXBpY2FsIDIgdG8gNG1zICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9WSURUQywgMTAwKTsvKiB0eXBpY2FsIDUwIHRvIDEwMG1zICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9QTUVSMSwgcG1lcjEpOworCisJCQlpZiAoZ3hfcGFyYW1zLT5wY2lfcmV2IDwgMHgxMCkgeyAgIC8qIENTNTUzMChyZXYgMS4yLCAxLjMpICovCisJCQkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnIHwgU1VTTU9EOworCQkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUzU1MzBBLEIuLiAqLworCQkJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZyB8IFNVU01PRCB8IFBXUlNWRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTA6CisJCQlzdXNjZmcgPSBneF9wYXJhbXMtPnBjaV9zdXNjZmcgfCBTVVNNT0Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWRwcmludGsoImZhdGFsOiB0cnkgdG8gc2V0IHVua25vd24gY2hpcHNldC5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnICYgfihTVVNNT0QpOworCQlneF9wYXJhbXMtPm9mZl9kdXJhdGlvbiA9IDA7CisJCWd4X3BhcmFtcy0+b25fZHVyYXRpb24gPSAwOworCQlkcHJpbnRrKCJzdXNwZW5kIG1vZHVsYXRpb24gZGlzYWJsZWQ6IGNwdSBydW5zIDEwMCBwZXJjZW50IHNwZWVkLlxuIik7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET0ZGLCBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET04sIGd4X3BhcmFtcy0+b25fZHVyYXRpb24pOworCisgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX1NVU0NGRywgc3VzY2ZnKTsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsICZzdXNjZmcpOworCisgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWd4X3BhcmFtcy0+cGNpX3N1c2NmZyA9IHN1c2NmZzsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisgICAgICAgIGRwcmludGsoInN1c3BlbmQgbW9kdWxhdGlvbiB3LyBkdXJhdGlvbiBvZiBPTjolZCB1cywgT0ZGOiVkIHVzXG4iLAorICAgICAgICAgICAgICAgIGd4X3BhcmFtcy0+b25fZHVyYXRpb24gKiAzMiwgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24gKiAzMik7CisJZHByaW50aygic3VzcGVuZCBtb2R1bGF0aW9uIHcvIGNsb2NrIHNwZWVkOiAlZCBrSHouXG4iLCBmcmVxcy5uZXcpOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEhpZ2ggbGV2ZWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWNwdWZyZXFfZ3hfdmVyaWZ5OiB0ZXN0IGlmIGZyZXF1ZW5jeSByYW5nZSBpcyB2YWxpZCAKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZSBpbiBrSHogaXMgdmFsaWQgCisgKiAgICAgIGZvciB0aGUgaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuIAorICovCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9neF92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IHRtcF9mcmVxID0gMDsKKwl1OCB0bXAxLCB0bXAyOworCisgICAgICAgIGlmICghc3RvY2tfZnJlcSB8fCAhcG9saWN5KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcG9saWN5LT5jcHUgPSAwOworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAoc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbiksIHN0b2NrX2ZyZXEpOworCisJLyogaXQgbmVlZHMgdG8gYmUgYXNzdXJlZCB0aGF0IGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgZnJlcXVlbmN5IGlzCisJICogd2l0aGluIHBvbGljeS0+bWluIGFuZCBwb2xpY3ktPm1heC4gSWYgaXQgaXMgbm90LCBwb2xpY3ktPm1heAorCSAqIG5lZWRzIHRvIGJlIGluY3JlYXNlZCB1bnRpbCBvbmUgZnJldXFlbmN5IGlzIHN1cHBvcnRlZC4KKwkgKiBwb2xpY3ktPm1pbiBtYXkgbm90IGJlIGRlY3JlYXNlZCwgdGhvdWdoLiBUaGlzIHdheSB3ZSBndWFyYW50ZWUgYSAKKwkgKiBzcGVjaWZpYyBwcm9jZXNzaW5nIGNhcGFjaXR5LgorCSAqLworCXRtcF9mcmVxID0gZ3hfdmFsaWRhdGVfc3BlZWQocG9saWN5LT5taW4sICZ0bXAxLCAmdG1wMik7CisJaWYgKHRtcF9mcmVxIDwgcG9saWN5LT5taW4pIAorCQl0bXBfZnJlcSArPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCXBvbGljeS0+bWluID0gdG1wX2ZyZXE7CisJaWYgKHBvbGljeS0+bWluID4gcG9saWN5LT5tYXgpIAorCQlwb2xpY3ktPm1heCA9IHRtcF9mcmVxOworCXRtcF9mcmVxID0gZ3hfdmFsaWRhdGVfc3BlZWQocG9saWN5LT5tYXgsICZ0bXAxLCAmdG1wMik7CisJaWYgKHRtcF9mcmVxID4gcG9saWN5LT5tYXgpCisJCXRtcF9mcmVxIC09IHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb247CisJcG9saWN5LT5tYXggPSB0bXBfZnJlcTsKKwlpZiAocG9saWN5LT5tYXggPCBwb2xpY3ktPm1pbikKKwkJcG9saWN5LT5tYXggPSBwb2xpY3ktPm1pbjsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgKHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb24pLCBzdG9ja19mcmVxKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgY3B1ZnJlcV9neF90YXJnZXQ6ICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3B1ZnJlcV9neF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXU4IHRtcDEsIHRtcDI7CisJdW5zaWduZWQgaW50IHRtcF9mcmVxOworCisgICAgICAgIGlmICghc3RvY2tfZnJlcSB8fCAhcG9saWN5KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcG9saWN5LT5jcHUgPSAwOworCisJdG1wX2ZyZXEgPSBneF92YWxpZGF0ZV9zcGVlZCh0YXJnZXRfZnJlcSwgJnRtcDEsICZ0bXAyKTsKKwl3aGlsZSAodG1wX2ZyZXEgPCBwb2xpY3ktPm1pbikgeworCQl0bXBfZnJlcSArPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCQl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHRtcF9mcmVxLCAmdG1wMSwgJnRtcDIpOworCX0KKwl3aGlsZSAodG1wX2ZyZXEgPiBwb2xpY3ktPm1heCkgeworCQl0bXBfZnJlcSAtPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCQl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHRtcF9mcmVxLCAmdG1wMSwgJnRtcDIpOworCX0KKworCWd4X3NldF9jcHVzcGVlZCh0bXBfZnJlcSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVmcmVxX2d4X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBtYXhmcmVxLCBjdXJmcmVxOworCisJaWYgKCFwb2xpY3kgfHwgcG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBkZXRlcm1pbmUgbWF4aW11bSBmcmVxdWVuY3kgKi8KKwlpZiAocGNpX2J1c2NsaykgeworCQltYXhmcmVxID0gcGNpX2J1c2NsayAqIGd4X2ZyZXFfbXVsdFtnZXRDeDg2KENYODZfRElSMSkgJiAweDBmXTsKKwl9IGVsc2UgaWYgKGNwdV9raHopIHsKKwkJbWF4ZnJlcSA9IGNwdV9raHo7CisJfSBlbHNlIHsKKwkJbWF4ZnJlcSA9IDMwMDAwICogZ3hfZnJlcV9tdWx0W2dldEN4ODYoQ1g4Nl9ESVIxKSAmIDB4MGZdOworCX0KKwlzdG9ja19mcmVxID0gbWF4ZnJlcTsKKwljdXJmcmVxID0gZ3hfZ2V0X2NwdXNwZWVkKDApOworCisJZHByaW50aygiY3B1IG1heCBmcmVxdWVuY3kgaXMgJWQuXG4iLCBtYXhmcmVxKTsKKwlkcHJpbnRrKCJjcHUgY3VycmVudCBmcmVxdWVuY3kgaXMgJWRrSHouXG4iLGN1cmZyZXEpOworCisJLyogc2V0dXAgYmFzaWMgc3RydWN0IGZvciBjcHVmcmVxIEFQSSAqLworCXBvbGljeS0+Y3B1ID0gMDsKKworCWlmIChtYXhfZHVyYXRpb24gPCBQT0xJQ1lfTUlOX0RJVikKKwkJcG9saWN5LT5taW4gPSBtYXhmcmVxIC8gbWF4X2R1cmF0aW9uOworCWVsc2UKKwkJcG9saWN5LT5taW4gPSBtYXhmcmVxIC8gUE9MSUNZX01JTl9ESVY7CisJcG9saWN5LT5tYXggPSBtYXhmcmVxOworCXBvbGljeS0+Y3VyID0gY3VyZnJlcTsKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IG1heGZyZXEgLyBtYXhfZHVyYXRpb247CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gbWF4ZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogY3B1ZnJlcV9neF9pbml0OgorICogICBNZWRpYUdYL0dlb2RlIEdYIGluaXRpYWxpemUgY3B1ZnJlcSBkcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBneF9zdXNwbW9kX2RyaXZlciA9IHsKKwkuZ2V0CQk9IGd4X2dldF9jcHVzcGVlZCwKKwkudmVyaWZ5CQk9IGNwdWZyZXFfZ3hfdmVyaWZ5LAorCS50YXJnZXQJCT0gY3B1ZnJlcV9neF90YXJnZXQsCisJLmluaXQJCT0gY3B1ZnJlcV9neF9jcHVfaW5pdCwKKwkubmFtZQkJPSAiZ3gtc3VzcG1vZCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9neF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyAqcGFyYW1zOworCXN0cnVjdCBwY2lfZGV2ICpneF9wY2k7CisJdTMyIGNsYXNzX3JldjsKKworCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KKwlpZiAoKGd4X3BjaSA9IGd4X2RldGVjdF9jaGlwc2V0KCkpID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNoZWNrIHdoZXRoZXIgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIHNhbmUgKi8KKwlpZiAobWF4X2R1cmF0aW9uID4gMHhmZikKKwkJbWF4X2R1cmF0aW9uID0gMHhmZjsKKworCWRwcmludGsoImdlb2RlIHN1c3BlbmQgbW9kdWxhdGlvbiBhdmFpbGFibGUuXG4iKTsKKworCXBhcmFtcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBneGZyZXFfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IGd4ZnJlcV9wYXJhbXMpKTsKKworCXBhcmFtcy0+Y3M1NXgwID0gZ3hfcGNpOworCWd4X3BhcmFtcyA9IHBhcmFtczsKKworCS8qIGtlZXAgY3M1NXgwIGNvbmZpZ3VyYXRpb25zICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsICYocGFyYW1zLT5wY2lfc3VzY2ZnKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9QTUVSMSwgJihwYXJhbXMtPnBjaV9wbWVyMSkpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfUE1FUjIsICYocGFyYW1zLT5wY2lfcG1lcjIpKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX01PRE9OLCAmKHBhcmFtcy0+b25fZHVyYXRpb24pKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX01PRE9GRiwgJihwYXJhbXMtPm9mZl9kdXJhdGlvbikpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGFyYW1zLT5jczU1eDAsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CisJcGFyYW1zLT5wY2lfcmV2ID0gY2xhc3NfcmV2ICYmIDB4ZmY7CisKKwlpZiAoKHJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZneF9zdXNwbW9kX2RyaXZlcikpKSB7IAorCQlrZnJlZShwYXJhbXMpOworCQlyZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciBlcnJvciEgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNwdWZyZXFfZ3hfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmd4X3N1c3Btb2RfZHJpdmVyKTsKKwlwY2lfZGV2X3B1dChneF9wYXJhbXMtPmNzNTV4MCk7CisJa2ZyZWUoZ3hfcGFyYW1zKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJDcHVmcmVxIGRyaXZlciBmb3IgQ3lyaXggTWVkaWFHWCBhbmQgTmF0U2VtaSBHZW9kZSIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQoY3B1ZnJlcV9neF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWZyZXFfZ3hfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBmOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC0wLDAgKzEsNjU4IEBACisvKgorICogIChDKSAyMDAxLTIwMDQgIERhdmUgSm9uZXMuIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqICAoQykgMjAwMiAgUGFkcmFpZyBCcmFkeS4gPHBhZHJhaWdAYW50ZWZhY3RvLmNvbT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICogIEJhc2VkIHVwb24gZGF0YXNoZWV0cyAmIHNhbXBsZSBDUFVzIGtpbmRseSBwcm92aWRlZCBieSBWSUEuCisgKgorICogIFZJQSBoYXZlIGN1cnJlbnRseSAzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBMb25naGF1bC4KKyAqICBWZXJzaW9uIDEgKExvbmdoYXVsKSB1c2VzIHRoZSBCQ1IyIE1TUiBhdCAweDExNDcuCisgKiAgIEl0IGlzIHByZXNlbnQgb25seSBpbiBTYW11ZWwgMSAoQzVBKSwgU2FtdWVsIDIgKEM1Qikgc3RlcHBpbmcgMC4KKyAqICBWZXJzaW9uIDIgb2YgbG9uZ2hhdWwgaXMgdGhlIHNhbWUgYXMgdjEsIGJ1dCBhZGRzIHZvbHRhZ2Ugc2NhbGluZy4KKyAqICAgUHJlc2VudCBpbiBTYW11ZWwgMiAoc3RlcHBpbmdzIDEtNyBvbmx5KSAoQzVCKSwgYW5kIEV6cmEgKEM1QykKKyAqICAgdm9sdGFnZSBzY2FsaW5nIHN1cHBvcnQgaGFzIGN1cnJlbnRseSBiZWVuIGRpc2FibGVkIGluIHRoaXMgZHJpdmVyCisgKiAgIHVudGlsIHdlIGhhdmUgY29kZSB0aGF0IGdldHMgaXQgcmlnaHQuCisgKiAgVmVyc2lvbiAzIG9mIGxvbmdoYXVsIGdvdCByZW5hbWVkIHRvIFBvd2Vyc2F2ZXIgYW5kIHJlZGVzaWduZWQKKyAqICAgdG8gdXNlIHRoZSBQT1dFUlNBVkVSIE1TUiBhdCAweDExMGEuCisgKiAgIEl0IGlzIHByZXNlbnQgaW4gRXpyYS1UIChDNU0pLCBOZWhlbWlhaCAoQzVYKSBhbmQgYWJvdmUuCisgKiAgIEl0J3MgcHJldHR5IG11Y2ggdGhlIHNhbWUgZmVhdHVyZSB3aXNlIHRvIGxvbmdoYXVsIHYyLCB0aG91Z2gKKyAqICAgdGhlcmUgaXMgcHJvdmlzaW9uIGZvciBzY2FsaW5nIEZTQiB0b28sIGJ1dCB0aGlzIGRvZXNuJ3Qgd29yaworICogICB0b28gd2VsbCBpbiBwcmFjdGljZSBzbyB3ZSBkb24ndCBldmVuIHRyeSB0byB1c2UgdGhpcy4KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJsb25naGF1bC5oIgorCisjZGVmaW5lIFBGWCAibG9uZ2hhdWw6ICIKKworI2RlZmluZSBUWVBFX0xPTkdIQVVMX1YxCTEKKyNkZWZpbmUgVFlQRV9MT05HSEFVTF9WMgkyCisjZGVmaW5lIFRZUEVfUE9XRVJTQVZFUgkJMworCisjZGVmaW5lCUNQVV9TQU1VRUwJMQorI2RlZmluZQlDUFVfU0FNVUVMMgkyCisjZGVmaW5lCUNQVV9FWlJBCTMKKyNkZWZpbmUJQ1BVX0VaUkFfVAk0CisjZGVmaW5lCUNQVV9ORUhFTUlBSAk1CisKK3N0YXRpYyBpbnQgY3B1X21vZGVsOworc3RhdGljIHVuc2lnbmVkIGludCBudW1zY2FsZXM9MTYsIG51bXZzY2FsZXM7CitzdGF0aWMgdW5zaWduZWQgaW50IGZzYjsKK3N0YXRpYyBpbnQgbWludmlkLCBtYXh2aWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IG1pbm11bHQsIG1heG11bHQ7CitzdGF0aWMgaW50IGNhbl9zY2FsZV92b2x0YWdlOworc3RhdGljIGludCB2cm1yZXY7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGRvbnRfc2NhbGVfdm9sdGFnZTsKKworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdoYXVsIiwgbXNnKQorCisKKyNkZWZpbmUgX19obHQoKSAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCI6IDogOiJtZW1vcnkiKQorCisvKiBDbG9jayByYXRpb3MgbXVsdGlwbGllZCBieSAxMCAqLworc3RhdGljIGludCBjbG9ja19yYXRpb1szMl07CitzdGF0aWMgaW50IGVibGNyX3RhYmxlWzMyXTsKK3N0YXRpYyBpbnQgdm9sdGFnZV90YWJsZVszMl07CitzdGF0aWMgdW5zaWduZWQgaW50IGhpZ2hlc3Rfc3BlZWQsIGxvd2VzdF9zcGVlZDsgLyoga0h6ICovCitzdGF0aWMgaW50IGxvbmdoYXVsX3ZlcnNpb247CitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpsb25naGF1bF90YWJsZTsKKworI2lmZGVmIENPTkZJR19DUFVfRlJFUV9ERUJVRworc3RhdGljIGNoYXIgc3BlZWRidWZmZXJbOF07CisKK3N0YXRpYyBjaGFyICpwcmludF9zcGVlZChpbnQgc3BlZWQpCit7CisJaWYgKHNwZWVkID4gMTAwMCkgeworCQlpZiAoc3BlZWQlMTAwMCA9PSAwKQorCQkJc3ByaW50ZiAoc3BlZWRidWZmZXIsICIlZEdIeiIsIHNwZWVkLzEwMDApOworCQllbHNlCisJCQlzcHJpbnRmIChzcGVlZGJ1ZmZlciwgIiVkLiVkR0h6Iiwgc3BlZWQvMTAwMCwgKHNwZWVkJTEwMDApLzEwMCk7CisJfSBlbHNlCisJCXNwcmludGYgKHNwZWVkYnVmZmVyLCAiJWRNSHoiLCBzcGVlZCk7CisKKwlyZXR1cm4gc3BlZWRidWZmZXI7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfc3BlZWQoaW50IG11bHQpCit7CisJaW50IGtoejsKKwlraHogPSAobXVsdC8xMCkqZnNiOworCWlmIChtdWx0JTEwKQorCQlraHogKz0gZnNiLzI7CisJa2h6ICo9IDEwMDA7CisJcmV0dXJuIGtoejsKK30KKworCitzdGF0aWMgaW50IGxvbmdoYXVsX2dldF9jcHVfbXVsdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaW52YWx1ZT0wLGxvLCBoaTsKKworCXJkbXNyIChNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbG8sIGhpKTsKKwlpbnZhbHVlID0gKGxvICYgKDE8PDIyfDE8PDIzfDE8PDI0fDE8PDI1KSkgPj4yMjsKKwlpZiAobG9uZ2hhdWxfdmVyc2lvbj09VFlQRV9MT05HSEFVTF9WMiB8fCBsb25naGF1bF92ZXJzaW9uPT1UWVBFX1BPV0VSU0FWRVIpIHsKKwkJaWYgKGxvICYgKDE8PDI3KSkKKwkJCWludmFsdWUrPTE2OworCX0KKwlyZXR1cm4gZWJsY3JfdGFibGVbaW52YWx1ZV07Cit9CisKKworc3RhdGljIHZvaWQgZG9fcG93ZXJzYXZlcih1bmlvbiBtc3JfbG9uZ2hhdWwgKmxvbmdoYXVsLAorCQkJdW5zaWduZWQgaW50IGNsb2NrX3JhdGlvX2luZGV4KQoreworCWludCB2ZXJzaW9uOworCisJc3dpdGNoIChjcHVfbW9kZWwpIHsKKwljYXNlIENQVV9FWlJBX1Q6CisJCXZlcnNpb24gPSAzOworCQlicmVhazsKKwljYXNlIENQVV9ORUhFTUlBSDoKKwkJdmVyc2lvbiA9IDB4ZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXJkbXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb25naGF1bC0+Yml0cy5Tb2Z0QnVzUmF0aW8gPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZjsKKwlsb25naGF1bC0+Yml0cy5Tb2Z0QnVzUmF0aW80ID0gKGNsb2NrX3JhdGlvX2luZGV4ICYgMHgxMCkgPj4gNDsKKwlsb25naGF1bC0+Yml0cy5FbmFibGVTb2Z0QnVzUmF0aW8gPSAxOworCWxvbmdoYXVsLT5iaXRzLlJldmlzaW9uS2V5ID0gMDsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJX19obHQoKTsKKworCXJkbXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb25naGF1bC0+Yml0cy5FbmFibGVTb2Z0QnVzUmF0aW8gPSAwOworCWxvbmdoYXVsLT5iaXRzLlJldmlzaW9uS2V5ID0gdmVyc2lvbjsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qKgorICogbG9uZ2hhdWxfc2V0X2NwdV9mcmVxdWVuY3koKQorICogQGNsb2NrX3JhdGlvX2luZGV4IDogYml0cGF0dGVybiBvZiB0aGUgbmV3IG11bHRpcGxpZXIuCisgKgorICogU2V0cyBhIG5ldyBjbG9jayByYXRpby4KKyAqLworCitzdGF0aWMgdm9pZCBsb25naGF1bF9zZXRzdGF0ZSh1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgpCit7CisJaW50IHNwZWVkLCBtdWx0OworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKKwl1bmlvbiBtc3JfYmNyMiBiY3IyOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgb2xkX3JhdGlvPS0xOworCisJaWYgKG9sZF9yYXRpbyA9PSBjbG9ja19yYXRpb19pbmRleCkKKwkJcmV0dXJuOworCW9sZF9yYXRpbyA9IGNsb2NrX3JhdGlvX2luZGV4OworCisJbXVsdCA9IGNsb2NrX3JhdGlvW2Nsb2NrX3JhdGlvX2luZGV4XTsKKwlpZiAobXVsdCA9PSAtMSkKKwkJcmV0dXJuOworCisJc3BlZWQgPSBjYWxjX3NwZWVkKG11bHQpOworCWlmICgoc3BlZWQgPiBoaWdoZXN0X3NwZWVkKSB8fCAoc3BlZWQgPCBsb3dlc3Rfc3BlZWQpKQorCQlyZXR1cm47CisKKwlmcmVxcy5vbGQgPSBjYWxjX3NwZWVkKGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpKTsKKwlmcmVxcy5uZXcgPSBzcGVlZDsKKwlmcmVxcy5jcHUgPSAwOyAvKiBsb25naGF1bC5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJZHByaW50ayAoIlNldHRpbmcgdG8gRlNCOiVkTUh6IE11bHQ6JWQuJWR4ICglcylcbiIsCisJCQlmc2IsIG11bHQvMTAsIG11bHQlMTAsIHByaW50X3NwZWVkKHNwZWVkLzEwMDApKTsKKworCXN3aXRjaCAobG9uZ2hhdWxfdmVyc2lvbikgeworCisJLyoKKwkgKiBMb25naGF1bCB2MS4gKFNhbXVlbFtDNUFdIGFuZCBTYW11ZWwyIHN0ZXBwaW5nIDBbQzVCXSkKKwkgKiBTb2Z0d2FyZSBjb250cm9sbGVkIG11bHRpcGxpZXJzIG9ubHkuCisJICoKKwkgKiAqTkIqIFVudGlsIHdlIGdldCB2b2x0YWdlIHNjYWxpbmcgd29ya2luZyB2MSAmIHYyIGFyZSB0aGUgc2FtZSBjb2RlLgorCSAqIExvbmdoYXVsIHYyIGFwcGVhcnMgaW4gU2FtdWVsMiBTdGVwcGluZ3MgMS0+NyBbQzViXSBhbmQgRXpyYSBbQzVDXQorCSAqLworCWNhc2UgVFlQRV9MT05HSEFVTF9WMToKKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CisJCXJkbXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCS8qIEVuYWJsZSBzb2Z0d2FyZSBjbG9jayBtdWx0aXBsaWVyICovCisJCWJjcjIuYml0cy5FU09GVEJGID0gMTsKKwkJYmNyMi5iaXRzLkNMT0NLTVVMID0gY2xvY2tfcmF0aW9faW5kZXg7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXdybXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQlfX2hsdCgpOworCisJCS8qIERpc2FibGUgc29mdHdhcmUgY2xvY2sgbXVsdGlwbGllciAqLworCQlyZG1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOworCQliY3IyLmJpdHMuRVNPRlRCRiA9IDA7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXdybXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIExvbmdoYXVsIHYzIChha2EgUG93ZXJzYXZlcikuIChFenJhLVQgW0M1TV0gJiBOZWhlbWlhaCBbQzVOXSkKKwkgKiBXZSBjYW4gc2NhbGUgdm9sdGFnZSB3aXRoIHRoaXMgdG9vLCBidXQgdGhhdCdzIGN1cnJlbnRseQorCSAqIGRpc2FibGVkIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBhIGRlY2VudCAnbWF0Y2ggZnJlcSB0byB2b2x0YWdlJworCSAqIGFsZ29yaXRobS4KKwkgKiBXaGVuIHdlIGFkZCB2b2x0YWdlIHNjYWxpbmcsIHdlIHdpbGwgYWxzbyBuZWVkIHRvIGRvIHRoZQorCSAqIHZvbHRhZ2UvZnJlcSBzZXR0aW5nIGluIG9yZGVyIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uCisJICogb2Ygc2NhbGluZyAobGlrZSB3ZSBkbyBpbiBwb3dlcm5vdy1rNy5jKQorCSAqIE5laGVtaWFoIGNhbiBkbyBGU0Igc2NhbGluZyB0b28sIGJ1dCB0aGlzIGhhcyBuZXZlciBiZWVuIHByb3ZlbgorCSAqIHRvIHdvcmsgaW4gcHJhY3RpY2UuCisJICovCisJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CisJCWRvX3Bvd2Vyc2F2ZXIoJmxvbmdoYXVsLCBjbG9ja19yYXRpb19pbmRleCk7CisJCWJyZWFrOworCX0KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworfQorCisvKgorICogQ2VudGF1ciBkZWNpZGVkIHRvIG1ha2UgbGlmZSBhIGxpdHRsZSBtb3JlIHRyaWNreS4KKyAqIE9ubHkgbG9uZ2hhdWwgdjEgaXMgYWxsb3dlZCB0byByZWFkIEVCTENSIEJTRUxbMDoxXS4KKyAqIFNhbXVlbDIgYW5kIGFib3ZlIGhhdmUgdG8gdHJ5IGFuZCBndWVzcyB3aGF0IHRoZSBGU0IgaXMuCisgKiBXZSBkbyB0aGlzIGJ5IGFzc3VtaW5nIHdlIGJvb3RlZCBhdCBtYXhpbXVtIG11bHRpcGxpZXIsIGFuZCBpbnRlcnBvbGF0ZQorICogYmV0d2VlbiB0aGF0IHZhbHVlIG11bHRpcGxpZWQgYnkgcG9zc2libGUgRlNCcyBhbmQgY3B1X21oeiB3aGljaAorICogd2FzIGNhbGN1bGF0ZWQgYXQgYm9vdCB0aW1lLiBSZWFsbHkgdWdseSwgYnV0IG5vIG90aGVyIHdheSB0byBkbyB0aGlzLgorICovCisKKyNkZWZpbmUgUk9VTkRJTkcJMHhmCisKK3N0YXRpYyBpbnQgX2d1ZXNzKGludCBndWVzcykKK3sKKwlpbnQgdGFyZ2V0OworCisJdGFyZ2V0ID0gKChtYXhtdWx0LzEwKSpndWVzcyk7CisJaWYgKG1heG11bHQlMTAgIT0gMCkKKwkJdGFyZ2V0ICs9IChndWVzcy8yKTsKKwl0YXJnZXQgKz0gUk9VTkRJTkcvMjsKKwl0YXJnZXQgJj0gflJPVU5ESU5HOworCXJldHVybiB0YXJnZXQ7Cit9CisKKworc3RhdGljIGludCBndWVzc19mc2Iodm9pZCkKK3sKKwlpbnQgc3BlZWQgPSAoY3B1X2toei8xMDAwKTsKKwlpbnQgaTsKKwlpbnQgc3BlZWRzWzNdID0geyA2NiwgMTAwLCAxMzMgfTsKKworCXNwZWVkICs9IFJPVU5ESU5HLzI7CisJc3BlZWQgJj0gflJPVU5ESU5HOworCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCWlmIChfZ3Vlc3Moc3BlZWRzW2ldKSA9PSBzcGVlZCkKKwkJCXJldHVybiBzcGVlZHNbaV07CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2dldF9yYW5nZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGludmFsdWU7CisJdW5zaWduZWQgaW50IG11bHRpcGxpZXJzWzMyXT0geworCQk1MCwzMCw0MCwxMDAsNTUsMzUsNDUsOTUsOTAsNzAsODAsNjAsMTIwLDc1LDg1LDY1LAorCQktMSwxMTAsMTIwLC0xLDEzNSwxMTUsMTI1LDEwNSwxMzAsMTUwLDE2MCwxNDAsLTEsMTU1LC0xLDE0NSB9OworCXVuc2lnbmVkIGludCBqLCBrID0gMDsKKwl1bmlvbiBtc3JfbG9uZ2hhdWwgbG9uZ2hhdWw7CisJdW5zaWduZWQgbG9uZyBsbywgaGk7CisJdW5zaWduZWQgaW50IGVibGNyX2ZzYl90YWJsZV92MVtdID0geyA2NiwgMTMzLCAxMDAsIC0xIH07CisJdW5zaWduZWQgaW50IGVibGNyX2ZzYl90YWJsZV92MltdID0geyAxMzMsIDEwMCwgLTEsIDY2IH07CisKKwlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKKwljYXNlIFRZUEVfTE9OR0hBVUxfVjE6CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgorCQkvKiBVZ2gsIExvbmdoYXVsIHYxIGRpZG4ndCBoYXZlIHRoZSBtaW4vbWF4IE1TUnMuCisJCSAgIEFzc3VtZSBtaW49My4weCAmIG1heCA9IHdoYXRldmVyIHdlIGJvb3RlZCBhdC4gKi8KKwkJbWlubXVsdCA9IDMwOworCQltYXhtdWx0ID0gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7CisJCXJkbXNyIChNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbG8sIGhpKTsKKwkJaW52YWx1ZSA9IChsbyAmICgxPDwxOHwxPDwxOSkpID4+MTg7CisJCWlmIChjcHVfbW9kZWw9PUNQVV9TQU1VRUwgfHwgY3B1X21vZGVsPT1DUFVfU0FNVUVMMikKKwkJCWZzYiA9IGVibGNyX2ZzYl90YWJsZV92MVtpbnZhbHVlXTsKKwkJZWxzZQorCQkJZnNiID0gZ3Vlc3NfZnNiKCk7CisJCWJyZWFrOworCisJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CisJCS8qIEV6cmEtVCAqLworCQlpZiAoY3B1X21vZGVsPT1DUFVfRVpSQV9UKSB7CisJCQlyZG1zcmwgKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisJCQlpbnZhbHVlID0gbG9uZ2hhdWwuYml0cy5NYXhNSHpCUjsKKwkJCWlmIChsb25naGF1bC5iaXRzLk1heE1IekJSNCkKKwkJCQlpbnZhbHVlICs9IDE2OworCQkJbWF4bXVsdD1tdWx0aXBsaWVyc1tpbnZhbHVlXTsKKworCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWluTUh6QlI7CisJCQlpZiAobG9uZ2hhdWwuYml0cy5NaW5NSHpCUjQgPT0gMSkKKwkJCQltaW5tdWx0ID0gMzA7CisJCQllbHNlCisJCQkJbWlubXVsdCA9IG11bHRpcGxpZXJzW2ludmFsdWVdOworCQkJZnNiID0gZWJsY3JfZnNiX3RhYmxlX3YyW2xvbmdoYXVsLmJpdHMuTWF4TUh6RlNCXTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTmVoZW1pYWggKi8KKwkJaWYgKGNwdV9tb2RlbD09Q1BVX05FSEVNSUFIKSB7CisJCQlyZG1zcmwgKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisKKwkJCS8qCisJCQkgKiBUT0RPOiBUaGlzIGNvZGUgd29ya3MsIGJ1dCByYWlzZXMgYSBsb3Qgb2YgcXVlc3Rpb25zLgorCQkJICogLSBTb21lIE5laGVtaWFoJ3Mgc2VlbSB0byBoYXZlIGJyb2tlbiBNaW4vTWF4TUh6QlIncy4KKwkJCSAqICAgV2UgZ2V0IGFyb3VuZCB0aGlzIGJ5IHVzaW5nIGEgaGFyZGNvZGVkIG11bHRpcGxpZXIgb2YgNC4weAorCQkJICogICBmb3IgdGhlIG1pbmltaW11bSBzcGVlZCwgYW5kIHRoZSBzcGVlZCB3ZSBib290ZWQgdXAgYXQgZm9yIHRoZSBtYXguCisJCQkgKiAgIFRoaXMgaXMgZG9uZSBpbiBsb25naGF1bF9nZXRfY3B1X211bHQoKSBieSByZWFkaW5nIHRoZSBFQkxDUiByZWdpc3Rlci4KKwkJCSAqIC0gQWNjb3JkaW5nIHRvIHNvbWUgVklBIGRvY3VtZW50YXRpb24gRUJMQ1IgaXMgb25seQorCQkJICogICBpbiBwcmUtTmVoZW1pYWggQzNzLiBIb3cgdGhpcyBzdGlsbCB3b3JrcyBpcyBhIG15c3RlcnkuCisJCQkgKiAgIFdlJ3JlIHBvc3NpYmx5IHVzaW5nIHNvbWV0aGluZyB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorCQkJICogICBCdXQgaXQgd29ya3MsIHNvIHdlIGRvbid0IGdydW1ibGUuCisJCQkgKi8KKwkJCW1pbm11bHQ9NDA7CisJCQltYXhtdWx0PWxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOworCisJCQkvKiBTdGFydGluZyB3aXRoIHRoZSAxLjJHSHogcGFydHMsIHRoZXJlcyBhIDIwME1IeiBidXMuICovCisJCQlpZiAoKGNwdV9raHovMTAwMCkgPiAxMjAwKQorCQkJCWZzYiA9IDIwMDsKKwkJCWVsc2UKKwkJCQlmc2IgPSBlYmxjcl9mc2JfdGFibGVfdjJbbG9uZ2hhdWwuYml0cy5NYXhNSHpGU0JdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkcHJpbnRrICgiTWluTXVsdDolZC4lZHggTWF4TXVsdDolZC4lZHhcbiIsCisJCSBtaW5tdWx0LzEwLCBtaW5tdWx0JTEwLCBtYXhtdWx0LzEwLCBtYXhtdWx0JTEwKTsKKworCWlmIChmc2IgPT0gLTEpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJJbnZhbGlkIChyZXNlcnZlZCkgRlNCIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhpZ2hlc3Rfc3BlZWQgPSBjYWxjX3NwZWVkKG1heG11bHQpOworCWxvd2VzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWlubXVsdCk7CisJZHByaW50ayAoIkZTQjolZE1IeiAgTG93ZXN0IHNwZWVkOiAlcyAgIEhpZ2hlc3Qgc3BlZWQ6JXNcbiIsIGZzYiwKKwkJIHByaW50X3NwZWVkKGxvd2VzdF9zcGVlZC8xMDAwKSwgCisJCSBwcmludF9zcGVlZChoaWdoZXN0X3NwZWVkLzEwMDApKTsKKworCWlmIChsb3dlc3Rfc3BlZWQgPT0gaGlnaGVzdF9zcGVlZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggImhpZ2hlc3RzcGVlZCA9PSBsb3dlc3QsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobG93ZXN0X3NwZWVkID4gaGlnaGVzdF9zcGVlZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIm5vbnNlbnNlISBsb3dlc3QgKCVkID4gJWQpICFcbiIsCisJCQlsb3dlc3Rfc3BlZWQsIGhpZ2hlc3Rfc3BlZWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb25naGF1bF90YWJsZSA9IGttYWxsb2MoKG51bXNjYWxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksIEdGUF9LRVJORUwpOworCWlmKCFsb25naGF1bF90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGo9MDsgaiA8IG51bXNjYWxlczsgaisrKSB7CisJCXVuc2lnbmVkIGludCByYXRpbzsKKwkJcmF0aW8gPSBjbG9ja19yYXRpb1tqXTsKKwkJaWYgKHJhdGlvID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChyYXRpbyA+IG1heG11bHQgfHwgcmF0aW8gPCBtaW5tdWx0KQorCQkJY29udGludWU7CisJCWxvbmdoYXVsX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IGNhbGNfc3BlZWQocmF0aW8pOworCQlsb25naGF1bF90YWJsZVtrXS5pbmRleAk9IGo7CisJCWsrKzsKKwl9CisKKwlsb25naGF1bF90YWJsZVtrXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlpZiAoIWspIHsKKwkJa2ZyZWUgKGxvbmdoYXVsX3RhYmxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IGxvbmdoYXVsX3NldHVwX3ZvbHRhZ2VzY2FsaW5nKHZvaWQpCit7CisJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCisJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJaWYgKCEobG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEICYgMSkpCisJCXJldHVybjsKKworCW1pbnZpZCA9IGxvbmdoYXVsLmJpdHMuTWluaW11bVZJRDsKKwltYXh2aWQgPSBsb25naGF1bC5iaXRzLk1heGltdW1WSUQ7CisJdnJtcmV2ID0gbG9uZ2hhdWwuYml0cy5WUk1SZXY7CisKKwlpZiAobWludmlkID09IDAgfHwgbWF4dmlkID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCb2d1cyB2YWx1ZXMgTWluOiVkLiUwM2QgTWF4OiVkLiUwM2QuICIKKwkJCQkJIlZvbHRhZ2Ugc2NhbGluZyBkaXNhYmxlZC5cbiIsCisJCQkJCW1pbnZpZC8xMDAwLCBtaW52aWQlMTAwMCwgbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtaW52aWQgPT0gbWF4dmlkKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQ2xhaW1zIHRvIHN1cHBvcnQgdm9sdGFnZSBzY2FsaW5nIGJ1dCBtaW4gJiBtYXggYXJlICIKKwkJCQkiYm90aCAlZC4lMDNkLiBWb2x0YWdlIHNjYWxpbmcgZGlzYWJsZWRcbiIsCisJCQkJbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh2cm1yZXY9PTApIHsKKwkJZHByaW50ayAoIlZSTSA4LjUgXG4iKTsKKwkJbWVtY3B5ICh2b2x0YWdlX3RhYmxlLCB2cm04NXNjYWxlcywgc2l6ZW9mKHZvbHRhZ2VfdGFibGUpKTsKKwkJbnVtdnNjYWxlcyA9ICh2b2x0YWdlX3RhYmxlW21heHZpZF0tdm9sdGFnZV90YWJsZVttaW52aWRdKS8yNTsKKwl9IGVsc2UgeworCQlkcHJpbnRrICgiTW9iaWxlIFZSTSBcbiIpOworCQltZW1jcHkgKHZvbHRhZ2VfdGFibGUsIG1vYmlsZXZybXNjYWxlcywgc2l6ZW9mKHZvbHRhZ2VfdGFibGUpKTsKKwkJbnVtdnNjYWxlcyA9ICh2b2x0YWdlX3RhYmxlW21heHZpZF0tdm9sdGFnZV90YWJsZVttaW52aWRdKS81OworCX0KKworCS8qIEN1cnJlbnQgdm9sdGFnZSBpc24ndCByZWFkYWJsZSBhdCBmaXJzdCwgc28gd2UgbmVlZCB0bworCSAgIHNldCBpdCB0byBhIGtub3duIHZhbHVlLiBUaGUgc3BlYyBzYXlzIHRvIHVzZSBtYXh2aWQgKi8KKwlsb25naGF1bC5iaXRzLlJldmlzaW9uS2V5ID0gbG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEOwkvKiBGSVhNRTogVGhpcyBpcyBiYWQuICovCisJbG9uZ2hhdWwuYml0cy5FbmFibGVTb2Z0VklEID0gMTsKKwlsb25naGF1bC5iaXRzLlNvZnRWSUQgPSBtYXh2aWQ7CisJd3Jtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJbWludmlkID0gdm9sdGFnZV90YWJsZVttaW52aWRdOworCW1heHZpZCA9IHZvbHRhZ2VfdGFibGVbbWF4dmlkXTsKKworCWRwcmludGsgKCJNaW4gVklEPSVkLiUwM2QgTWF4IFZJRD0lZC4lMDNkLCAlZCBwb3NzaWJsZSB2b2x0YWdlIHNjYWxlc1xuIiwKKwkJbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwLCBtaW52aWQvMTAwMCwgbWludmlkJTEwMDAsIG51bXZzY2FsZXMpOworCisJY2FuX3NjYWxlX3ZvbHRhZ2UgPSAxOworfQorCisKK3N0YXRpYyBpbnQgbG9uZ2hhdWxfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBsb25naGF1bF90YWJsZSk7Cit9CisKKworc3RhdGljIGludCBsb25naGF1bF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IHRhYmxlX2luZGV4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV3X2Nsb2NrX3JhdGlvID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBsb25naGF1bF90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmdGFibGVfaW5kZXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ld19jbG9ja19yYXRpbyA9IGxvbmdoYXVsX3RhYmxlW3RhYmxlX2luZGV4XS5pbmRleCAmIDB4RkY7CisKKwlsb25naGF1bF9zZXRzdGF0ZShuZXdfY2xvY2tfcmF0aW8pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBsb25naGF1bF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY3B1KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgbG9uZ2hhdWxfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJY2hhciAqY3B1bmFtZT1OVUxMOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCWNhc2UgNjoKKwkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDsKKwkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsJyBbQzVBXSI7CisJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOworCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBzYW11ZWwxX2Nsb2NrX3JhdGlvLCBzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOworCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwxX2VibGNyLCBzaXplb2Yoc2FtdWVsMV9lYmxjcikpOworCQlicmVhazsKKworCWNhc2UgNzoKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfTE9OR0hBVUxfVjE7CisJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKKwkJY2FzZSAwOgorCQkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDI7CisJCQljcHVuYW1lID0gIkMzICdTYW11ZWwgMicgW0M1Ql0iOworCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkIFNhbXVlbDEgcmF0aW9zLiAqLworCQkJbWVtY3B5IChjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywgc2l6ZW9mKHNhbXVlbDFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweSAoZWJsY3JfdGFibGUsIHNhbXVlbDJfZWJsY3IsIHNpemVvZihzYW11ZWwyX2VibGNyKSk7CisJCQlicmVhazsKKwkJY2FzZSAxIC4uLiAxNToKKwkJCWlmIChjLT54ODZfbWFzayA8IDgpIHsKKwkJCQljcHVfbW9kZWwgPSBDUFVfU0FNVUVMMjsKKwkJCQljcHVuYW1lID0gIkMzICdTYW11ZWwgMicgW0M1Ql0iOworCQkJfSBlbHNlIHsKKwkJCQljcHVfbW9kZWwgPSBDUFVfRVpSQTsKKwkJCQljcHVuYW1lID0gIkMzICdFenJhJyBbQzVDXSI7CisJCQl9CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBlenJhX2Nsb2NrX3JhdGlvLCBzaXplb2YoZXpyYV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgZXpyYV9lYmxjciwgc2l6ZW9mKGV6cmFfZWJsY3IpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSA4OgorCQljcHVfbW9kZWwgPSBDUFVfRVpSQV9UOworCQljcHVuYW1lID0gIkMzICdFenJhLVQnIFtDNU1dIjsKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfUE9XRVJTQVZFUjsKKwkJbnVtc2NhbGVzPTMyOworCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBlenJhdF9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmF0X2Nsb2NrX3JhdGlvKSk7CisJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmF0X2VibGNyLCBzaXplb2YoZXpyYXRfZWJsY3IpKTsKKwkJYnJlYWs7CisKKwljYXNlIDk6CisJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfUE9XRVJTQVZFUjsKKwkJbnVtc2NhbGVzPTMyOworCQlzd2l0Y2ggKGMtPng4Nl9tYXNrKSB7CisJCWNhc2UgMCAuLi4gMToKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEEnIFtDNU5dIjsKKwkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIG5laGVtaWFoX2FfY2xvY2tfcmF0aW8sIHNpemVvZihuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvKSk7CisJCQltZW1jcHkgKGVibGNyX3RhYmxlLCBuZWhlbWlhaF9hX2VibGNyLCBzaXplb2YobmVoZW1pYWhfYV9lYmxjcikpOworCQkJYnJlYWs7CisJCWNhc2UgMiAuLi4gNDoKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEInIFtDNU5dIjsKKwkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIG5laGVtaWFoX2JfY2xvY2tfcmF0aW8sIHNpemVvZihuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvKSk7CisJCQltZW1jcHkgKGVibGNyX3RhYmxlLCBuZWhlbWlhaF9iX2VibGNyLCBzaXplb2YobmVoZW1pYWhfYl9lYmxjcikpOworCQkJYnJlYWs7CisJCWNhc2UgNSAuLi4gMTU6CisJCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBDJyBbQzVOXSI7CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfY19jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfY19lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2NfZWJsY3IpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJY3B1bmFtZSA9ICJVbmtub3duIjsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CisJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgorCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKKwkJcHJpbnRrICgiTG9uZ2hhdWwgdiVkIHN1cHBvcnRlZC5cbiIsIGxvbmdoYXVsX3ZlcnNpb24pOworCQlicmVhazsKKwljYXNlIFRZUEVfUE9XRVJTQVZFUjoKKwkJcHJpbnRrICgiUG93ZXJzYXZlciBzdXBwb3J0ZWQuXG4iKTsKKwkJYnJlYWs7CisJfTsKKworCXJldCA9IGxvbmdoYXVsX2dldF9yYW5nZXMoKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfTE9OR0hBVUxfVjIgfHwgbG9uZ2hhdWxfdmVyc2lvbj09VFlQRV9QT1dFUlNBVkVSKSAmJgorCQkgKGRvbnRfc2NhbGVfdm9sdGFnZT09MCkpCisJCWxvbmdoYXVsX3NldHVwX3ZvbHRhZ2VzY2FsaW5nKCk7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBjYWxjX3NwZWVkKGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpKTsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBsb25naGF1bF90YWJsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGxvbmdoYXVsX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbG9uZ2hhdWxfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogbG9uZ2hhdWxfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBsb25naGF1bF9kcml2ZXIgPSB7CisJLnZlcmlmeQk9IGxvbmdoYXVsX3ZlcmlmeSwKKwkudGFyZ2V0CT0gbG9uZ2hhdWxfdGFyZ2V0LAorCS5nZXQJPSBsb25naGF1bF9nZXQsCisJLmluaXQJPSBsb25naGF1bF9jcHVfaW5pdCwKKwkuZXhpdAk9IF9fZGV2ZXhpdF9wKGxvbmdoYXVsX2NwdV9leGl0KSwKKwkubmFtZQk9ICJsb25naGF1bCIsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJPSBsb25naGF1bF9hdHRyLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIgfHwgYy0+eDg2ICE9IDYpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKKwljYXNlIDYgLi4uIDk6CisJCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbG9uZ2hhdWxfZHJpdmVyKTsKKwlkZWZhdWx0OgorCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlVua25vd24gVklBIENQVS4gQ29udGFjdCBkYXZlakBjb2RlbW9ua2V5Lm9yZy51a1xuIik7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGxvbmdoYXVsX2V4aXQodm9pZCkKK3sKKwlpbnQgaT0wOworCisJZm9yIChpPTA7IGkgPCBudW1zY2FsZXM7IGkrKykgeworCQlpZiAoY2xvY2tfcmF0aW9baV0gPT0gbWF4bXVsdCkgeworCQkJbG9uZ2hhdWxfc2V0c3RhdGUoaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmxvbmdoYXVsX2RyaXZlcik7CisJa2ZyZWUobG9uZ2hhdWxfdGFibGUpOworfQorCittb2R1bGVfcGFyYW0gKGRvbnRfc2NhbGVfdm9sdGFnZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG9udF9zY2FsZV92b2x0YWdlLCAiRG9uJ3Qgc2NhbGUgdm9sdGFnZSBvZiBwcm9jZXNzb3IiKTsKKworTU9EVUxFX0FVVEhPUiAoIkRhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTG9uZ2hhdWwgZHJpdmVyIGZvciBWSUEgQ3lyaXggcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KGxvbmdoYXVsX2luaXQpOworbW9kdWxlX2V4aXQobG9uZ2hhdWxfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5NWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogIGxvbmdoYXVsLmgKKyAqICAoQykgMjAwMyBEYXZlIEpvbmVzLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIFZJQS1zcGVjaWZpYyBpbmZvcm1hdGlvbgorICovCisKK3VuaW9uIG1zcl9iY3IyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBSZXNldmVkOjE5LAkvLyAxODowCisJCUVTT0ZUQkY6MSwJCS8vIDE5CisJCVJlc2VydmVkMjozLAkJLy8gMjI6MjAKKwkJQ0xPQ0tNVUw6NCwJCS8vIDI2OjIzCisJCVJlc2VydmVkMzo1OwkJLy8gMzE6MjcKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyB2YWw7Cit9OworCit1bmlvbiBtc3JfbG9uZ2hhdWwgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIFJldmlzaW9uSUQ6NCwJLy8gMzowCisJCVJldmlzaW9uS2V5OjQsCQkvLyA3OjQKKwkJRW5hYmxlU29mdEJ1c1JhdGlvOjEsCS8vIDgKKwkJRW5hYmxlU29mdFZJRDoxLAkvLyA5CisJCUVuYWJsZVNvZnRCU0VMOjEsCS8vIDEwCisJCVJlc2VydmVkOjMsCQkvLyAxMToxMworCQlTb2Z0QnVzUmF0aW80OjEsCS8vIDE0CisJCVZSTVJldjoxLAkJLy8gMTUKKwkJU29mdEJ1c1JhdGlvOjQsCQkvLyAxOToxNgorCQlTb2Z0VklEOjUsCQkvLyAyNDoyMAorCQlSZXNlcnZlZDI6MywJCS8vIDI3OjI1CisJCVNvZnRCU0VMOjIsCQkvLyAyOToyOAorCQlSZXNlcnZlZDM6MiwJCS8vIDMxOjMwCisJCU1heE1IekJSOjQsCQkvLyAzNTozMgorCQlNYXhpbXVtVklEOjUsCQkvLyA0MDozNgorCQlNYXhNSHpGU0I6MiwJCS8vIDQyOjQxCisJCU1heE1IekJSNDoxLAkJLy8gNDMKKwkJUmVzZXJ2ZWQ0OjQsCQkvLyA0Nzo0NAorCQlNaW5NSHpCUjo0LAkJLy8gNTE6NDgKKwkJTWluaW11bVZJRDo1LAkJLy8gNTY6NTIKKwkJTWluTUh6RlNCOjIsCQkvLyA1ODo1NworCQlNaW5NSHpCUjQ6MSwJCS8vIDU5CisJCVJlc2VydmVkNTo0OwkJLy8gNjM6NjAKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKK307CisKKy8qCisgKiBDbG9jayByYXRpbyB0YWJsZXMuIERpdi9Nb2QgYnkgMTAgdG8gZ2V0IHJhdGlvLgorICogVGhlIGVibGNyIG9uZXMgc3BlY2lmeSB0aGUgcmF0aW8gcmVhZCBmcm9tIHRoZSBDUFUuCisgKiBUaGUgY2xvY2tfcmF0aW8gb25lcyBzcGVjaWZ5IHdoYXQgdG8gd3JpdGUgdG8gdGhlIENQVS4KKyAqLworCisvKgorICogVklBIEMzIFNhbXVlbCAxICAmIFNhbXVlbCAyIChzdGVwcGluZyAwKQorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2FtdWVsMV9jbG9ja19yYXRpb1sxNl0gPSB7CisJLTEsIC8qIDAwMDAgLT4gUkVTRVJWRUQgKi8KKwkzMCwgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAvKiAwMDEwIC0+ICA0LjB4ICovCisJLTEsIC8qIDAwMTEgLT4gUkVTRVJWRUQgKi8KKwktMSwgLyogMDEwMCAtPiBSRVNFUlZFRCAqLworCTM1LCAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsIC8qIDAxMTAgLT4gIDQuNXggKi8KKwk1NSwgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAvKiAxMDAwIC0+ICA2LjB4ICovCisJNzAsIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAvKiAxMDExIC0+ICA1LjB4ICovCisJNjUsIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgLyogMTEwMSAtPiAgNy41eCAqLworCS0xLCAvKiAxMTEwIC0+IFJFU0VSVkVEICovCisJLTEsIC8qIDExMTEgLT4gUkVTRVJWRUQgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYW11ZWwxX2VibGNyWzE2XSA9IHsKKwk1MCwgLyogMDAwMCAtPiBSRVNFUlZFRCAqLworCTMwLCAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsIC8qIDAwMTAgLT4gIDQuMHggKi8KKwktMSwgLyogMDAxMSAtPiBSRVNFUlZFRCAqLworCTU1LCAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgLyogMDExMCAtPiAgNC41eCAqLworCS0xLCAvKiAwMTExIC0+IFJFU0VSVkVEICovCisJLTEsIC8qIDEwMDAgLT4gUkVTRVJWRUQgKi8KKwk3MCwgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsIC8qIDEwMTEgLT4gIDYuMHggKi8KKwktMSwgLyogMTEwMCAtPiBSRVNFUlZFRCAqLworCTc1LCAvKiAxMTAxIC0+ICA3LjV4ICovCisJLTEsIC8qIDExMTAgLT4gUkVTRVJWRUQgKi8KKwk2NSwgLyogMTExMSAtPiAgNi41eCAqLworfTsKKworLyoKKyAqIFZJQSBDMyBTYW11ZWwyIFN0ZXBwaW5nIDEtPjE1CisgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYW11ZWwyX2VibGNyWzE2XSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KKwkzNSwgIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgIC8qIDAxMTAgLT4gIDQuNXggKi8KKwkxMTAsIC8qIDAxMTEgLT4gMTEuMHggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwkxMzAsIC8qIDExMTAgLT4gMTMuMHggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KK307CisKKy8qCisgKiBWSUEgQzMgRXpyYQorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYV9jbG9ja19yYXRpb1sxNl0gPSB7CisJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCisJOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCisJNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNTAsICAvKiAxMDExIC0+ICA1LjB4ICovCisJNjUsICAvKiAxMTAwIC0+ICA2LjV4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYV9lYmxjclsxNl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCit9OworCisvKgorICogVklBIEMzIChFenJhLVQpIFtDNU1dLgorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYXRfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTMwLCAgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLworCTM1LCAgLyogMDEwMSAtPiAgMy41eCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAgMTIuMHggKi8KKworCS0xLCAgLyogMDAwMCAtPiBSRVNFUlZFRCAoMTAuMHgpICovCisJMTEwLCAvKiAwMDAxIC0+IDExLjB4ICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJLTEsICAvKiAwMDExIC0+IFJFU0VSVkVEICg5LjB4KSovCisJMTA1LCAvKiAwMTAwIC0+IDEwLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTM1LCAvKiAwMTExIC0+IDEzLjV4ICovCisJMTQwLCAvKiAxMDAwIC0+IDE0LjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTMwLCAvKiAxMDExIC0+IDEzLjB4ICovCisJMTQ1LCAvKiAxMTAwIC0+IDE0LjV4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwktMSwgIC8qIDExMTEgLT4gUkVTRVJWRUQgKDEyLjB4KSAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGV6cmF0X2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KKwkzNSwgIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgIC8qIDAxMTAgLT4gIDQuNXggKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKworCS0xLCAgLyogMDAwMCAtPiBSRVNFUlZFRCAoOS4weCkgKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwktMSwgIC8qIDAwMTEgLT4gUkVTRVJWRUQgKDEwLjB4KSovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJLTEsICAvKiAxMTAwIC0+IFJFU0VSVkVEICgxMi4weCkgKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSwgLyogMTExMSAtPiAxNC41eCAqLworfTsKKworLyoKKyAqIFZJQSBDMyBOZWhlbWlhaCAqLworIAorc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCS0xLCAgLyogMDAwMSAtPiBSRVNFUlZFRCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgIG5laGVtaWFoX2JfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgIG5laGVtaWFoX2NfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJNDUsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgbmVoZW1pYWhfYV9lYmxjclszMl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCisJLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTU1LCAgLyogMDEwMCAtPiAgNS41eCAqLworCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KKwktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCisJOTAsICAvKiAwMDAwIC0+ICA5LjB4ICovCisJLTEsICAvKiAwMDAxIC0+IFJFU0VSVkVEICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwkxNDUgLyogMTExMSAtPiAxNC41eCAqLworICAgLyogZW5kIG9mIHRhYmxlICAqLworfTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBuZWhlbWlhaF9iX2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKwk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KKwkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCisJICAgLyogZW5kIG9mIHRhYmxlICAqLworfTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBuZWhlbWlhaF9jX2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKwk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KKwkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCisJICAvKiBlbmQgb2YgdGFibGUgICovCit9OworCisvKiAKKyAqIFZvbHRhZ2Ugc2NhbGVzLiBEaXYvTW9kIGJ5IDEwMDAgdG8gZ2V0IGFjdHVhbCB2b2x0YWdlLgorICogV2hpY2ggc2NhbGUgdG8gdXNlIGRlcGVuZHMgb24gdGhlIFZSTSB0eXBlIGluIHVzZS4KKyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHZybTg1c2NhbGVzWzMyXSA9IHsKKwkxMjUwLCAxMjAwLCAxMTUwLCAxMTAwLCAxMDUwLCAxODAwLCAxNzUwLCAxNzAwLAorCTE2NTAsIDE2MDAsIDE1NTAsIDE1MDAsIDE0NTAsIDE0MDAsIDEzNTAsIDEzMDAsCisJMTI3NSwgMTIyNSwgMTE3NSwgMTEyNSwgMTA3NSwgMTgyNSwgMTc3NSwgMTcyNSwKKwkxNjc1LCAxNjI1LCAxNTc1LCAxNTI1LCAxNDc1LCAxNDI1LCAxMzc1LCAxMzI1LAorfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG1vYmlsZXZybXNjYWxlc1szMl0gPSB7CisJMjAwMCwgMTk1MCwgMTkwMCwgMTg1MCwgMTgwMCwgMTc1MCwgMTcwMCwgMTY1MCwKKwkxNjAwLCAxNTUwLCAxNTAwLCAxNDUwLCAxNTAwLCAxMzUwLCAxMzAwLCAtMSwKKwkxMjc1LCAxMjUwLCAxMjI1LCAxMjAwLCAxMTc1LCAxMTUwLCAxMTI1LCAxMTAwLAorCTEwNzUsIDEwNTAsIDEwMjUsIDEwMDAsIDk3NSwgOTUwLCA5MjUsIC0xLAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg2OGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiAoQykgMjAwMiAtIDIwMDMgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdydW4iLCBtc2cpCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIJbG9uZ3J1bl9kcml2ZXI7CisKKy8qKgorICogbG9uZ3J1bl97bG93LGhpZ2h9X2ZyZXEgaXMgbmVlZGVkIGZvciB0aGUgY29udmVyc2lvbiBvZiBjcHVmcmVxIGtIegorICogdmFsdWVzIGludG8gcGVyIGNlbnQgdmFsdWVzLiBJbiBUTVRBIG1pY3JvY29kZSwgdGhlIGZvbGxvd2luZyBpcyB2YWxpZDoKKyAqIHBlcmZvcm1hbmNlX3BjdGcgPSAoY3VycmVudF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBsb25ncnVuX2xvd19mcmVxLCBsb25ncnVuX2hpZ2hfZnJlcTsKKworCisvKioKKyAqIGxvbmdydW5fZ2V0X3BvbGljeSAtIGdldCB0aGUgY3VycmVudCBMb25nUnVuIHBvbGljeQorICogQHBvbGljeTogc3RydWN0IGNwdWZyZXFfcG9saWN5IHdoZXJlIGN1cnJlbnQgcG9saWN5IGlzIHdyaXR0ZW4gaW50bworICoKKyAqIFJlYWRzIHRoZSBjdXJyZW50IExvbmdSdW4gcG9saWN5IGJ5IGFjY2VzcyB0byBNU1JfVE1UQV9MT05HUlVOX0ZMQUdTCisgKiBhbmQgTVNSX1RNVEFfTE9OR1JVTl9DVFJMCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsb25ncnVuX2dldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOworCWRwcmludGsoImxvbmdydW4gZmxhZ3MgYXJlICV4IC0gJXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwlpZiAobXNyX2xvICYgMHgwMSkKKwkJcG9saWN5LT5wb2xpY3kgPSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRTsKKwllbHNlCisJCXBvbGljeS0+cG9saWN5ID0gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFOworCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisJZHByaW50aygibG9uZ3J1biBjdHJsIGlzICV4IC0gJXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwltc3JfbG8gJj0gMHgwMDAwMDA3RjsKKwltc3JfaGkgJj0gMHgwMDAwMDA3RjsKKworCWlmICggbG9uZ3J1bl9oaWdoX2ZyZXEgPD0gbG9uZ3J1bl9sb3dfZnJlcSApIHsKKwkJLyogQXNzdW1lIGRlZ2VuZXJhdGUgTG9uZ3J1biB0YWJsZSAqLworCQlwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gbG9uZ3J1bl9oaWdoX2ZyZXE7CisJfSBlbHNlIHsKKwkJcG9saWN5LT5taW4gPSBsb25ncnVuX2xvd19mcmVxICsgbXNyX2xvICoKKwkJCSgobG9uZ3J1bl9oaWdoX2ZyZXEgLSBsb25ncnVuX2xvd19mcmVxKSAvIDEwMCk7CisJCXBvbGljeS0+bWF4ID0gbG9uZ3J1bl9sb3dfZnJlcSArIG1zcl9oaSAqCisJCQkoKGxvbmdydW5faGlnaF9mcmVxIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLyAxMDApOworCX0KKwlwb2xpY3ktPmNwdSA9IDA7Cit9CisKKworLyoqCisgKiBsb25ncnVuX3NldF9wb2xpY3kgLSBzZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeSBvbiBMb25nUnVuLWNhcGFibGUgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbgorICogaGFzIHRvIGJlIGNhbGxlZCB3aXRoIGNwdWZyZXFfZHJpdmVyIGxvY2tlZC4KKyAqLworc3RhdGljIGludCBsb25ncnVuX3NldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCXUzMiBwY3RnX2xvLCBwY3RnX2hpOworCisJaWYgKCFwb2xpY3kpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxICkgeworCQkvKiBBc3N1bWUgZGVnZW5lcmF0ZSBMb25ncnVuIHRhYmxlICovCisJCXBjdGdfbG8gPSBwY3RnX2hpID0gMTAwOworCX0gZWxzZSB7CisJCXBjdGdfbG8gPSAocG9saWN5LT5taW4gLSBsb25ncnVuX2xvd19mcmVxKSAvCisJCQkoKGxvbmdydW5faGlnaF9mcmVxIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLyAxMDApOworCQlwY3RnX2hpID0gKHBvbGljeS0+bWF4IC0gbG9uZ3J1bl9sb3dfZnJlcSkgLworCQkJKChsb25ncnVuX2hpZ2hfZnJlcSAtIGxvbmdydW5fbG93X2ZyZXEpIC8gMTAwKTsKKwl9CisKKwlpZiAocGN0Z19oaSA+IDEwMCkKKwkJcGN0Z19oaSA9IDEwMDsKKwlpZiAocGN0Z19sbyA+IHBjdGdfaGkpCisJCXBjdGdfbG8gPSBwY3RnX2hpOworCisJLyogcGVyZm9ybWFuY2Ugb3IgZWNvbm9teSBtb2RlICovCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOworCW1zcl9sbyAmPSAweEZGRkZGRkZFOworCXN3aXRjaCAocG9saWN5LT5wb2xpY3kpIHsKKwljYXNlIENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFOgorCQltc3JfbG8gfD0gMHgwMDAwMDAwMTsKKwkJYnJlYWs7CisJY2FzZSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkU6CisJCWJyZWFrOworCX0KKwl3cm1zcihNU1JfVE1UQV9MT05HUlVOX0ZMQUdTLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkvKiBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnkgKi8KKwlyZG1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKKwltc3JfbG8gJj0gMHhGRkZGRkY4MDsKKwltc3JfaGkgJj0gMHhGRkZGRkY4MDsKKwltc3JfbG8gfD0gcGN0Z19sbzsKKwltc3JfaGkgfD0gcGN0Z19oaTsKKwl3cm1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbG9uZ3J1bl92ZXJpZnlfcG9saXkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogdGhlIHBvbGljeSB0byB2ZXJpZnkKKyAqCisgKiBWYWxpZGF0ZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCB3aXRoCisgKiBjcHVmcmVxX2RyaXZlciBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgbG9uZ3J1bl92ZXJpZnlfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmICghcG9saWN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvbGljeS0+Y3B1ID0gMDsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwKKwkJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLAorCQlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCisJaWYgKChwb2xpY3ktPnBvbGljeSAhPSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkUpICYmCisJICAgIChwb2xpY3ktPnBvbGljeSAhPSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9uZ3J1bl9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OworCisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisKKwljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlkcHJpbnRrKCJjcHVpZCBlYXggaXMgJXVcbiIsIGVheCk7CisKKwlyZXR1cm4gKGVheCAqIDEwMDApOworfQorCisvKioKKyAqIGxvbmdydW5fZGV0ZXJtaW5lX2ZyZXFzIC0gZGV0ZXJtaW5lcyB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IHBvc3NpYmxlIGNvcmUgZnJlcXVlbmN5CisgKiBAbG93X2ZyZXE6IGFuIGludCB0byBwdXQgdGhlIGxvd2VzdCBmcmVxdWVuY3kgaW50bworICogQGhpZ2hfZnJlcTogYW4gaW50IHRvIHB1dCB0aGUgaGlnaGVzdCBmcmVxdWVuY3kgaW50bworICoKKyAqIERldGVybWluZXMgdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBwb3NzaWJsZSBjb3JlIGZyZXF1ZW5jaWVzIG9uIHRoaXMgQ1BVLgorICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBwZXJmb3JtYW5jZSBwZXJjZW50YWdlIGFjY29yZGluZyB0bworICogVE1UQSBydWxlczoKKyAqIHBlcmZvcm1hbmNlX3BjdGcgPSAodGFyZ2V0X2ZyZXEgLSBsb3dfZnJlcSkvKGhpZ2hfZnJlcSAtIGxvd19mcmVxKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBsb25ncnVuX2RldGVybWluZV9mcmVxcyh1bnNpZ25lZCBpbnQgKmxvd19mcmVxLAorCQkJCQkJICAgdW5zaWduZWQgaW50ICpoaWdoX2ZyZXEpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCXUzMiBzYXZlX2xvLCBzYXZlX2hpOworCXUzMiBlYXgsIGVieCwgZWN4LCBlZHg7CisJdTMyIHRyeV9oaTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCWlmICghbG93X2ZyZXEgfHwgIWhpZ2hfZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9MUlRJKSkgeworCQkvKiBpZiB0aGUgTG9uZ1J1biBUYWJsZSBJbnRlcmZhY2UgaXMgcHJlc2VudCwgdGhlCisJCSAqIGRldGVjdGlvbiBpcyBhIGJpdCBlYXNpZXI6CisJCSAqIEZvciBtaW5pbXVtIGZyZXF1ZW5jeSwgcmVhZCBvdXQgdGhlIG1heGltdW0KKwkJICogbGV2ZWwgKG1zcl9oaSksIHdyaXRlIHRoYXQgaW50byAiY3VycmVudGx5CisJCSAqIHNlbGVjdGVkIGxldmVsIiwgYW5kIHJlYWQgb3V0IHRoZSBmcmVxdWVuY3kuCisJCSAqIEZvciBtYXhpbXVtIGZyZXF1ZW5jeSwgcmVhZCBvdXQgbGV2ZWwgemVyby4KKwkJICovCisJCS8qIG1pbmltdW0gKi8KKwkJcmRtc3IoTVNSX1RNVEFfTFJUSV9SRUFET1VULCBtc3JfbG8sIG1zcl9oaSk7CisJCXdybXNyKE1TUl9UTVRBX0xSVElfUkVBRE9VVCwgbXNyX2hpLCBtc3JfaGkpOworCQlyZG1zcihNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaLCBtc3JfbG8sIG1zcl9oaSk7CisJCSpsb3dfZnJlcSA9IG1zcl9sbyAqIDEwMDA7IC8qIHRvIGtIeiAqLworCisJCS8qIG1heGltdW0gKi8KKwkJd3Jtc3IoTVNSX1RNVEFfTFJUSV9SRUFET1VULCAwLCBtc3JfaGkpOworCQlyZG1zcihNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaLCBtc3JfbG8sIG1zcl9oaSk7CisJCSpoaWdoX2ZyZXEgPSBtc3JfbG8gKiAxMDAwOyAvKiB0byBrSHogKi8KKworCQlkcHJpbnRrKCJsb25ncnVuIHRhYmxlIGludGVyZmFjZSB0b2xkICV1IC0gJXUga0h6XG4iLCAqbG93X2ZyZXEsICpoaWdoX2ZyZXEpOworCisJCWlmICgqbG93X2ZyZXEgPiAqaGlnaF9mcmVxKQorCQkJKmxvd19mcmVxID0gKmhpZ2hfZnJlcTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2V0IHRoZSB1cHBlciBib3JkZXIgdG8gdGhlIHZhbHVlIGRldGVybWluZWQgZHVyaW5nIFRTQyBpbml0ICovCisJKmhpZ2hfZnJlcSA9IChjcHVfa2h6IC8gMTAwMCk7CisJKmhpZ2hfZnJlcSA9ICpoaWdoX2ZyZXEgKiAxMDAwOworCWRwcmludGsoImhpZ2ggZnJlcXVlbmN5IGlzICV1IGtIelxuIiwgKmhpZ2hfZnJlcSk7CisKKwkvKiBnZXQgY3VycmVudCBib3JkZXJzICovCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisJc2F2ZV9sbyA9IG1zcl9sbyAmIDB4MDAwMDAwN0Y7CisJc2F2ZV9oaSA9IG1zcl9oaSAmIDB4MDAwMDAwN0Y7CisKKwkvKiBpZiBjdXJyZW50IHBlcmZfcGN0ZyBpcyBsYXJnZXIgdGhhbiA5MCUsIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlCisJICogdXBwZXIgbGltaXQgdG8gbWFrZSB0aGUgY2FsY3VsYXRpb24gbW9yZSBhY2N1cmF0ZS4KKwkgKi8KKwljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkvKiB0cnkgZGVjcmVhc2luZyBpbiAxMCUgc3RlcHMsIHNvbWUgcHJvY2Vzc29ycyByZWFjdCBvbmx5CisJICogb24gc29tZSBiYXJyaWVyIHZhbHVlcyAqLworCWZvciAodHJ5X2hpID0gODA7IHRyeV9oaSA+IDAgJiYgZWN4ID4gOTA7IHRyeV9oaSAtPTEwKSB7CisJCS8qIHNldCB0byAwIHRvIHRyeV9oaSBwZXJmX3BjdGcgKi8KKwkJbXNyX2xvICY9IDB4RkZGRkZGODA7CisJCW1zcl9oaSAmPSAweEZGRkZGRjgwOworCQltc3JfbG8gfD0gMDsKKwkJbXNyX2hpIHw9IHRyeV9oaTsKKwkJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkJLyogcmVhZCBvdXQgY3VycmVudCBjb3JlIE1IeiBhbmQgY3VycmVudCBwZXJmX3BjdGcgKi8KKwkJY3B1aWQoMHg4MDg2MDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkJLyogcmVzdG9yZSB2YWx1ZXMgKi8KKwkJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBzYXZlX2xvLCBzYXZlX2hpKTsKKwl9CisJZHByaW50aygicGVyY2VudGFnZSBpcyAldSAlJSwgZnJlcSBpcyAldSBNSHpcbiIsIGVjeCwgZWF4KTsKKworCS8qIHBlcmZvcm1hbmNlX3BjdGcgPSAoY3VycmVudF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKKwkgKiBlcWFscworCSAqIGxvd19mcmVxICogKCAxIC0gcGVyZl9wY3RnKSA9IChjdXJfZnJlcSAtIGhpZ2hfZnJlcSAqIHBlcmZfcGN0ZykKKwkgKgorCSAqIGhpZ2hfZnJlcSAqIHBlcmZfcGN0ZyBpcyBzdG9yZWQgdGVtcG9hcmlseSBpbnRvICJlYngiLgorCSAqLworCWVieCA9ICgoKGNwdV9raHogLyAxMDAwKSAqIGVjeCkgLyAxMDApOyAvKiB0byBNSHogKi8KKworCWlmICgoZWN4ID4gOTUpIHx8IChlY3ggPT0gMCkgfHwgKGVheCA8IGVieCkpCisJCXJldHVybiAtRUlPOworCisJZWR4ID0gKGVheCAtIGVieCkgLyAoMTAwIC0gZWN4KTsKKwkqbG93X2ZyZXEgPSBlZHggKiAxMDAwOyAvKiBiYWNrIHRvIGtIeiAqLworCisJZHByaW50aygibG93IGZyZXF1ZW5jeSBpcyAldSBrSHpcbiIsICpsb3dfZnJlcSk7CisKKwlpZiAoKmxvd19mcmVxID4gKmhpZ2hfZnJlcSkKKwkJKmxvd19mcmVxID0gKmhpZ2hfZnJlcTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGxvbmdydW5fY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kgKi8KKwlyZXN1bHQgPSBsb25ncnVuX2RldGVybWluZV9mcmVxcygmbG9uZ3J1bl9sb3dfZnJlcSwgJmxvbmdydW5faGlnaF9mcmVxKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gbG9uZ3J1bl9sb3dfZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgPSBsb25ncnVuX2hpZ2hfZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCWxvbmdydW5fZ2V0X3BvbGljeShwb2xpY3kpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBsb25ncnVuX2RyaXZlciA9IHsKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9DT05TVF9MT09QUywKKwkudmVyaWZ5CQk9IGxvbmdydW5fdmVyaWZ5X3BvbGljeSwKKwkuc2V0cG9saWN5CT0gbG9uZ3J1bl9zZXRfcG9saWN5LAorCS5nZXQJCT0gbG9uZ3J1bl9nZXQsCisJLmluaXQJCT0gbG9uZ3J1bl9jcHVfaW5pdCwKKwkubmFtZQkJPSAibG9uZ3J1biIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworCisvKioKKyAqIGxvbmdydW5faW5pdCAtIGluaXRpYWxpemVzIHRoZSBUcmFuc21ldGEgQ3J1c29lIExvbmdSdW4gQ1BVRnJlcSBkcml2ZXIKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgTG9uZ1J1biBzdXBwb3J0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBsb25ncnVuX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfVFJBTlNNRVRBIHx8CisJICAgICFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0xPTkdSVU4pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbG9uZ3J1bl9kcml2ZXIpOworfQorCisKKy8qKgorICogbG9uZ3J1bl9leGl0IC0gdW5yZWdpc3RlcnMgTG9uZ1J1biBzdXBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBsb25ncnVuX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZsb25ncnVuX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIkRvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdSdW4gZHJpdmVyIGZvciBUcmFuc21ldGEgQ3J1c29lIGFuZCBFZmZpY2VvbiBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQobG9uZ3J1bl9pbml0KTsKK21vZHVsZV9leGl0KGxvbmdydW5fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2MjJkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqCVBlbnRpdW0gNC9YZW9uIENQVSBvbiBkZW1hbmQgY2xvY2sgbW9kdWxhdGlvbi9zcGVlZCBzY2FsaW5nCisgKgkoQykgMjAwMiAtIDIwMDMgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoJKEMpIDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4KKyAqCShDKSAyMDAyIEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoJKEMpIDIwMDIgVG9yYSBULiBFbmdzdGFkCisgKglBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoZSBhdXRob3Iocykgb2YgdGhpcyBzb2Z0d2FyZSBzaGFsbCBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGRhbWFnZXMKKyAqICAgICAgb2YgYW55IG5hdHVyZSByZXN1bHRpbmcgZHVlIHRvIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcworICogICAgICBzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuCisgKgkKKyAqCURhdGUJCUVycmF0YQkJCURlc2NyaXB0aW9uCisgKgkyMDAyMDUyNQlONDQsIE8xNwkxMi41JSBvciAyNSUgREMgY2F1c2VzIGxvY2t1cAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisjZGVmaW5lIFBGWAkicDQtY2xvY2ttb2Q6ICIKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAicDQtY2xvY2ttb2QiLCBtc2cpCisKKy8qCisgKiBEdXR5IEN5Y2xlICgzYml0cyksIG5vdGUgRENfRElTQUJMRSBpcyBub3Qgc3BlY2lmaWVkIGluCisgKiBpbnRlbCBkb2NzIGkganVzdCB1c2UgaXQgdG8gbWVhbiBkaXNhYmxlCisgKi8KK2VudW0geworCURDX1JFU1YsIERDX0RGTFQsIERDXzI1UFQsIERDXzM4UFQsIERDXzUwUFQsCisJRENfNjRQVCwgRENfNzVQVCwgRENfODhQVCwgRENfRElTQUJMRQorfTsKKworI2RlZmluZSBEQ19FTlRSSUVTCTgKKworCitzdGF0aWMgaW50IGhhc19ONDRfTzE3X2VycmF0YVtOUl9DUFVTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RvY2tfZnJlcTsKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcDRjbG9ja21vZF9kcml2ZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0KHVuc2lnbmVkIGludCBjcHUpOworCitzdGF0aWMgaW50IGNwdWZyZXFfcDRfc2V0ZGModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5ld3N0YXRlKQoreworCXUzMiBsLCBoOworCisJaWYgKCFjcHVfb25saW5lKGNwdSkgfHwgKG5ld3N0YXRlID4gRENfRElTQUJMRSkgfHwgKG5ld3N0YXRlID09IERDX1JFU1YpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJkbXNyKE1TUl9JQTMyX1RIRVJNX1NUQVRVUywgbCwgaCk7CisKKwlpZiAobCAmIDB4MDEpCisJCWRwcmludGsoIkNQVSMlZCBjdXJyZW50bHkgdGhlcm1hbCB0aHJvdHRsZWRcbiIsIGNwdSk7CisKKwlpZiAoaGFzX040NF9PMTdfZXJyYXRhW2NwdV0gJiYgKG5ld3N0YXRlID09IERDXzI1UFQgfHwgbmV3c3RhdGUgPT0gRENfREZMVCkpCisJCW5ld3N0YXRlID0gRENfMzhQVDsKKworCXJkbXNyKE1TUl9JQTMyX1RIRVJNX0NPTlRST0wsIGwsIGgpOworCWlmIChuZXdzdGF0ZSA9PSBEQ19ESVNBQkxFKSB7CisJCWRwcmludGsoIkNQVSMlZCBkaXNhYmxpbmcgbW9kdWxhdGlvblxuIiwgY3B1KTsKKwkJd3Jtc3IoTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgbCAmIH4oMTw8NCksIGgpOworCX0gZWxzZSB7CisJCWRwcmludGsoIkNQVSMlZCBzZXR0aW5nIGR1dHkgY3ljbGUgdG8gJWQlJVxuIiwKKwkJCWNwdSwgKCgxMjUgKiBuZXdzdGF0ZSkgLyAxMCkpOworCQkvKiBiaXRzIDYzIC0gNQk6IHJlc2VydmVkIAorCQkgKiBiaXQgIDQJOiBlbmFibGUvZGlzYWJsZQorCQkgKiBiaXRzIDMtMQk6IGR1dHkgY3ljbGUKKwkJICogYml0ICAwCTogcmVzZXJ2ZWQKKwkJICovCisJCWwgPSAobCAmIH4xNCk7CisJCWwgPSBsIHwgKDE8PDQpIHwgKChuZXdzdGF0ZSAmIDB4Nyk8PDEpOworCQl3cm1zcihNU1JfSUEzMl9USEVSTV9DT05UUk9MLCBsLCBoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHA0Y2xvY2ttb2RfdGFibGVbXSA9IHsKKwl7RENfUkVTViwgQ1BVRlJFUV9FTlRSWV9JTlZBTElEfSwKKwl7RENfREZMVCwgMH0sCisJe0RDXzI1UFQsIDB9LAorCXtEQ18zOFBULCAwfSwKKwl7RENfNTBQVCwgMH0sCisJe0RDXzY0UFQsIDB9LAorCXtEQ183NVBULCAwfSwKKwl7RENfODhQVCwgMH0sCisJe0RDX0RJU0FCTEUsIDB9LAorCXtEQ19SRVNWLCBDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCAgICBuZXdzdGF0ZSA9IERDX1JFU1Y7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKKwlpbnQgaTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmcDRjbG9ja21vZF90YWJsZVswXSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXFzLm9sZCA9IGNwdWZyZXFfcDRfZ2V0KHBvbGljeS0+Y3B1KTsKKwlmcmVxcy5uZXcgPSBzdG9ja19mcmVxICogcDRjbG9ja21vZF90YWJsZVtuZXdzdGF0ZV0uaW5kZXggLyA4OworCisJaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCisJCXJldHVybiAwOworCisJLyogbm90aWZpZXJzICovCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJfQorCisJLyogcnVuIG9uIGVhY2ggbG9naWNhbCBDUFUsIHNlZSBzZWN0aW9uIDEzLjE1LjMgb2YgSUEzMiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUKKwkgKiBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzIAorCSAqLworCWNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHBvbGljeS0+Y3B1cykgeworCQljcHVtYXNrX3QgdGhpc19jcHUgPSBjcHVtYXNrX29mX2NwdShpKTsKKworCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHRoaXNfY3B1KTsKKwkJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBpKTsKKworCQljcHVmcmVxX3A0X3NldGRjKGksIHA0Y2xvY2ttb2RfdGFibGVbbmV3c3RhdGVdLmluZGV4KTsKKwl9CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCisJLyogbm90aWZpZXJzICovCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZwNGNsb2NrbW9kX3RhYmxlWzBdKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKChjLT54ODYgPT0gMHgwNikgJiYgKGMtPng4Nl9tb2RlbCA9PSAweDA5KSkgeworCQkvKiBQZW50aXVtIE0gKEJhbmlhcykgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmc6IFBlbnRpdW0gTSBkZXRlY3RlZC4gIgorCQkgICAgICAgIlRoZSBzcGVlZHN0ZXBfY2VudHJpbm8gbW9kdWxlIG9mZmVycyB2b2x0YWdlIHNjYWxpbmciCisJCSAgICAgICAiIGluIGFkZGl0aW9uIG9mIGZyZXF1ZW5jeSBzY2FsaW5nLiBZb3Ugc2hvdWxkIHVzZSAiCisJCSAgICAgICAidGhhdCBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCBpZiBwb3NzaWJsZS5cbiIpOworCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCX0KKworCWlmICgoYy0+eDg2ID09IDB4MDYpICYmIChjLT54ODZfbW9kZWwgPT0gMHgwRCkpIHsKKwkJLyogUGVudGl1bSBNIChEb3RoYW4pICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXYXJuaW5nOiBQZW50aXVtIE0gZGV0ZWN0ZWQuICIKKwkJICAgICAgICJUaGUgc3BlZWRzdGVwX2NlbnRyaW5vIG1vZHVsZSBvZmZlcnMgdm9sdGFnZSBzY2FsaW5nIgorCQkgICAgICAgIiBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gWW91IHNob3VsZCB1c2UgIgorCQkgICAgICAgInRoYXQgaW5zdGVhZCBvZiBwNC1jbG9ja21vZCwgaWYgcG9zc2libGUuXG4iKTsKKwkJLyogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IHdoZXRoZXIKKwkJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLworCQlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOworCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCX0KKworCWlmIChjLT54ODYgIT0gMHhGKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIG9uIFAtNHMsIHRoZSBUU0MgcnVucyB3aXRoIGNvbnN0YW50IGZyZXF1ZW5jeSBpbmRlcGVuZGVudCB3aGV0aGVyCisJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLworCXA0Y2xvY2ttb2RfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CisKKwlpZiAoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKSA9PSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZzogUGVudGl1bSA0LU0gZGV0ZWN0ZWQuICIKKwkJICAgICAgICJUaGUgc3BlZWRzdGVwLWljaCBvciBhY3BpIGNwdWZyZXEgbW9kdWxlcyBvZmZlciAiCisJCSAgICAgICAidm9sdGFnZSBzY2FsaW5nIGluIGFkZGl0aW9uIG9mIGZyZXF1ZW5jeSBzY2FsaW5nLiAiCisJCSAgICAgICAiWW91IHNob3VsZCB1c2UgZWl0aGVyIG9uZSBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCAiCisJCSAgICAgICAiaWYgcG9zc2libGUuXG4iKTsKKwkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1A0TSk7CisJfQorCisJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1A0RCk7Cit9CisKKyAKKworc3RhdGljIGludCBjcHVmcmVxX3A0X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YVtwb2xpY3ktPmNwdV07CisJaW50IGNwdWlkID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlwb2xpY3ktPmNwdXMgPSBjcHVfc2libGluZ19tYXBbcG9saWN5LT5jcHVdOworI2VuZGlmCisKKwkvKiBFcnJhdGEgd29ya2Fyb3VuZCAqLworCWNwdWlkID0gKGMtPng4NiA8PCA4KSB8IChjLT54ODZfbW9kZWwgPDwgNCkgfCBjLT54ODZfbWFzazsKKwlzd2l0Y2ggKGNwdWlkKSB7CisJY2FzZSAweDBmMDc6CisJY2FzZSAweDBmMGE6CisJY2FzZSAweDBmMTE6CisJY2FzZSAweDBmMTI6CisJCWhhc19ONDRfTzE3X2VycmF0YVtwb2xpY3ktPmNwdV0gPSAxOworCQlkcHJpbnRrKCJoYXMgZXJyYXRhIC0tIGRpc2FibGluZyBsb3cgZnJlcXVlbmNpZXNcbiIpOworCX0KKwkKKwkvKiBnZXQgbWF4IGZyZXF1ZW5jeSAqLworCXN0b2NrX2ZyZXEgPSBjcHVmcmVxX3A0X2dldF9mcmVxdWVuY3koYyk7CisJaWYgKCFzdG9ja19mcmVxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHRhYmxlIGluaXQgKi8KKwlmb3IgKGk9MTsgKHA0Y2xvY2ttb2RfdGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKTsgaSsrKSB7CisJCWlmICgoaTwyKSAmJiAoaGFzX040NF9PMTdfZXJyYXRhW3BvbGljeS0+Y3B1XSkpCisJCQlwNGNsb2NrbW9kX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJZWxzZQorCQkJcDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgPSAoc3RvY2tfZnJlcSAqIGkpLzg7CisJfQorCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHA0Y2xvY2ttb2RfdGFibGUsIHBvbGljeS0+Y3B1KTsKKwkKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDAwOyAvKiBhc3N1bWVkICovCisJcG9saWN5LT5jdXIgPSBzdG9ja19mcmVxOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCAmcDRjbG9ja21vZF90YWJsZVswXSk7Cit9CisKKworc3RhdGljIGludCBjcHVmcmVxX3A0X2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsgICAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9wNF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCXUzMiBsLCBoOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlCVUdfT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSk7CisKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9DT05UUk9MLCBsLCBoKTsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1c19hbGxvd2VkKTsKKworCWlmIChsICYgMHgxMCkgeworCQlsID0gbCA+PiAxOworCQlsICY9IDB4NzsKKwl9IGVsc2UKKwkJbCA9IERDX0RJU0FCTEU7CisKKwlpZiAobCAhPSBEQ19ESVNBQkxFKQorCQlyZXR1cm4gKHN0b2NrX2ZyZXEgKiBsIC8gOCk7CisKKwlyZXR1cm4gc3RvY2tfZnJlcTsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHA0Y2xvY2ttb2RfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwNGNsb2NrbW9kX2RyaXZlciA9IHsKKwkudmVyaWZ5IAk9IGNwdWZyZXFfcDRfdmVyaWZ5LAorCS50YXJnZXQJCT0gY3B1ZnJlcV9wNF90YXJnZXQsCisJLmluaXQJCT0gY3B1ZnJlcV9wNF9jcHVfaW5pdCwKKwkuZXhpdAkJPSBjcHVmcmVxX3A0X2NwdV9leGl0LAorCS5nZXQJCT0gY3B1ZnJlcV9wNF9nZXQsCisJLm5hbWUJCT0gInA0LWNsb2NrbW9kIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gcDRjbG9ja21vZF9hdHRyLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3A0X2luaXQodm9pZCkKK3sJCisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJaW50IHJldDsKKworCS8qCisJICogVEhFUk1fQ09OVFJPTCBpcyBhcmNoaXRlY3R1cmFsIGZvciBJQTMyIG5vdywgc28gCisJICogd2UgY2FuIHJlbHkgb24gdGhlIGNhcGFiaWxpdHkgY2hlY2tzCisJICovCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXRlc3RfYml0KFg4Nl9GRUFUVVJFX0FDUEksIGMtPng4Nl9jYXBhYmlsaXR5KSB8fAorCQkhdGVzdF9iaXQoWDg2X0ZFQVRVUkVfQUNDLCBjLT54ODZfY2FwYWJpbGl0eSkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnA0Y2xvY2ttb2RfZHJpdmVyKTsKKwlpZiAoIXJldCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlA0L1hlb24oVE0pIENQVSBPbi1EZW1hbmQgQ2xvY2sgTW9kdWxhdGlvbiBhdmFpbGFibGVcbiIpOworCisJcmV0dXJuIChyZXQpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX3A0X2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZwNGNsb2NrbW9kX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIlp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJjcHVmcmVxIGRyaXZlciBmb3IgUGVudGl1bShUTSkgNC9YZW9uKFRNKSIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChjcHVmcmVxX3A0X2luaXQpOworbW9kdWxlX2V4aXQoY3B1ZnJlcV9wNF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJmOGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogIFRoaXMgZmlsZSB3YXMgYmFzZWQgdXBvbiBjb2RlIGluIFBvd2VydHdlYWsgTGludXggKGh0dHA6Ly9wb3dlcnR3ZWFrLnNmLm5ldCkKKyAqICAoQykgMjAwMC0yMDAzICBEYXZlIEpvbmVzLCBBcmphbiB2YW4gZGUgVmVuLCBKYW5uZSBQ5G5r5GzkLCBEb21pbmlrIEJyb2Rvd3NraS4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKyNkZWZpbmUgUE9XRVJOT1dfSU9QT1JUIDB4ZmZmMCAgICAgICAgIC8qIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXJlLCBhcyBsb25nCisJCQkJCSAgYXMgaXQgaXMgdW51c2VkICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICBidXNmcmVxOyAgIC8qIEZTQiwgaW4gMTAga0h6ICovCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgbWF4X211bHRpcGxpZXI7CisKKworLyogQ2xvY2sgcmF0aW8gbXVsdGlwbGllZCBieSAxMCAtIHNlZSB0YWJsZSAyNyBpbiBBTUQjMjM0NDYgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgY2xvY2tfcmF0aW9bXSA9IHsKKwl7NDUsICAvKiAwMDAgLT4gNC41eCAqLyAwfSwKKwl7NTAsICAvKiAwMDEgLT4gNS4weCAqLyAwfSwKKwl7NDAsICAvKiAwMTAgLT4gNC4weCAqLyAwfSwKKwl7NTUsICAvKiAwMTEgLT4gNS41eCAqLyAwfSwKKwl7MjAsICAvKiAxMDAgLT4gMi4weCAqLyAwfSwKKwl7MzAsICAvKiAxMDEgLT4gMy4weCAqLyAwfSwKKwl7NjAsICAvKiAxMTAgLT4gNi4weCAqLyAwfSwKKwl7MzUsICAvKiAxMTEgLT4gMy41eCAqLyAwfSwKKwl7MCwgQ1BVRlJFUV9UQUJMRV9FTkR9Cit9OworCisKKy8qKgorICogcG93ZXJub3dfazZfZ2V0X2NwdV9tdWx0aXBsaWVyIC0gcmV0dXJucyB0aGUgY3VycmVudCBGU0IgbXVsdGlwbGllcgorICoKKyAqICAgUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZSBmcmVxdWVuY3kgbXVsdGlwbGllci4gQ29yZSBjbG9jaworICogc3BlZWQgaXMgZnJlcXVlbmN5IG9mIHRoZSBGcm9udC1TaWRlIEJ1cyBtdWx0aXBsaWVkIHdpdGggdGhpcyB2YWx1ZS4KKyAqLworc3RhdGljIGludCBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIodm9pZCkKK3sKKwl1NjQgICAgICAgICAgICAgaW52YWx1ZSA9IDA7CisJdTMyICAgICAgICAgICAgIG1zcnZhbDsKKwkKKwltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDE7CisJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGVuYWJsZSB0aGUgUG93ZXJOb3cgcG9ydCAqLworCWludmFsdWU9aW5sKFBPV0VSTk9XX0lPUE9SVCArIDB4OCk7CisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgwOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBkaXNhYmxlIGl0IGFnYWluICovCisKKwlyZXR1cm4gY2xvY2tfcmF0aW9bKGludmFsdWUgPj4gNSkmN10uaW5kZXg7Cit9CisKKworLyoqCisgKiBwb3dlcm5vd19rNl9zZXRfc3RhdGUgLSBzZXQgdGhlIFBvd2VyTm93ISBtdWx0aXBsaWVyCisgKiBAYmVzdF9pOiBjbG9ja19yYXRpb1tiZXN0X2ldIGlzIHRoZSB0YXJnZXQgbXVsdGlwbGllcgorICoKKyAqICAgVHJpZXMgdG8gY2hhbmdlIHRoZSBQb3dlck5vdyEgbXVsdGlwbGllcgorICovCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rNl9zZXRfc3RhdGUgKHVuc2lnbmVkIGludCBiZXN0X2kpCit7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgb3V0dmFsdWU9MCwgaW52YWx1ZT0wOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG1zcnZhbDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBmcmVxczsKKworCWlmIChjbG9ja19yYXRpb1tiZXN0X2ldLmluZGV4ID4gbWF4X211bHRpcGxpZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBpbnZhbGlkIHRhcmdldCBmcmVxdWVuY3lcbiIpOworCQlyZXR1cm47CisJfQorCisJZnJlcXMub2xkID0gYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpOworCWZyZXFzLm5ldyA9IGJ1c2ZyZXEgKiBjbG9ja19yYXRpb1tiZXN0X2ldLmluZGV4OworCWZyZXFzLmNwdSA9IDA7IC8qIHBvd2Vybm93LWs2LmMgaXMgVVAgb25seSBkcml2ZXIgKi8KKwkKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogd2Ugbm93IG5lZWQgdG8gdHJhbnNmb3JtIGJlc3RfaSB0byB0aGUgQlZDIGZvcm1hdCwgc2VlIEFNRCMyMzQ0NiAqLworCisJb3V0dmFsdWUgPSAoMTw8MTIpIHwgKDE8PDEwKSB8ICgxPDw5KSB8IChiZXN0X2k8PDUpOworCisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KKwlpbnZhbHVlPWlubChQT1dFUk5PV19JT1BPUlQgKyAweDgpOworCWludmFsdWUgPSBpbnZhbHVlICYgMHhmOworCW91dHZhbHVlID0gb3V0dmFsdWUgfCBpbnZhbHVlOworCW91dGwob3V0dmFsdWUgLChQT1dFUk5PV19JT1BPUlQgKyAweDgpKTsKKwltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDA7CisJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGRpc2FibGUgaXQgYWdhaW4gKi8KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogcG93ZXJub3dfazZfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVZnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBQb2xpY3kgbXVzdCBiZSB3aXRoaW4gbG93ZXN0IGFuZCBoaWdoZXN0IHBvc3NpYmxlIENQVSBGcmVxdWVuY3ksCisgKiBhbmQgYXQgbGVhc3Qgb25lIHBvc3NpYmxlIHN0YXRlIG11c3QgYmUgd2l0aGluIG1pbiBhbmQgbWF4LgorICovCitzdGF0aWMgaW50IHBvd2Vybm93X2s2X3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgJmNsb2NrX3JhdGlvWzBdKTsKK30KKworCisvKioKKyAqIHBvd2Vybm93X2s2X3NldHBvbGljeSAtIHNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIHNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqLworc3RhdGljIGludCBwb3dlcm5vd19rNl90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmY2xvY2tfcmF0aW9bMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3dlcm5vd19rNl9zZXRfc3RhdGUobmV3c3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwb3dlcm5vd19rNl9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogZ2V0IGZyZXF1ZW5jaWVzICovCisJbWF4X211bHRpcGxpZXIgPSBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIoKTsKKwlidXNmcmVxID0gY3B1X2toeiAvIG1heF9tdWx0aXBsaWVyOworCisJLyogdGFibGUgaW5pdCAqLworIAlmb3IgKGk9MDsgKGNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCQlpZiAoY2xvY2tfcmF0aW9baV0uaW5kZXggPiBtYXhfbXVsdGlwbGllcikKKwkJCWNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJZWxzZQorCQkJY2xvY2tfcmF0aW9baV0uZnJlcXVlbmN5ID0gYnVzZnJlcSAqIGNsb2NrX3JhdGlvW2ldLmluZGV4OworCX0KKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmN1ciA9IGJ1c2ZyZXEgKiBtYXhfbXVsdGlwbGllcjsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBjbG9ja19yYXRpbyk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY2xvY2tfcmF0aW8sIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfazZfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpPTA7IGk8ODsgaSsrKSB7CisJCWlmIChpPT1tYXhfbXVsdGlwbGllcikKKwkJCXBvd2Vybm93X2s2X3NldF9zdGF0ZShpKTsKKwl9CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwb3dlcm5vd19rNl9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogcG93ZXJub3dfazZfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwb3dlcm5vd19rNl9kcml2ZXIgPSB7CisJLnZlcmlmeSAJPSBwb3dlcm5vd19rNl92ZXJpZnksCisJLnRhcmdldCAJPSBwb3dlcm5vd19rNl90YXJnZXQsCisJLmluaXQJCT0gcG93ZXJub3dfazZfY3B1X2luaXQsCisJLmV4aXQJCT0gcG93ZXJub3dfazZfY3B1X2V4aXQsCisJLmdldAkJPSBwb3dlcm5vd19rNl9nZXQsCisJLm5hbWUJCT0gInBvd2Vybm93LWs2IiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gcG93ZXJub3dfazZfYXR0ciwKK307CisKKworLyoqCisgKiBwb3dlcm5vd19rNl9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIGs2IFBvd2VyTm93ISBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIEs2IFBvd2VyTm93ISBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIGRldmljZXMsIC1FSU5WQUwgb3IgLUVOT01FTSBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvCisgKiBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19rNl9pbml0KHZvaWQpCit7CQorCXN0cnVjdCBjcHVpbmZvX3g4NiAgICAgICpjID0gY3B1X2RhdGE7CisKKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8IChjLT54ODYgIT0gNSkgfHwKKwkJKChjLT54ODZfbW9kZWwgIT0gMTIpICYmIChjLT54ODZfbW9kZWwgIT0gMTMpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFBPV0VSTk9XX0lPUE9SVCwgMTYsICJQb3dlck5vdyEiKSkgeworCQlwcmludGsoImNwdWZyZXE6IFBvd2VyTm93IElPUE9SVCByZWdpb24gYWxyZWFkeSB1c2VkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfazZfZHJpdmVyKSkgeworCQlyZWxlYXNlX3JlZ2lvbiAoUE9XRVJOT1dfSU9QT1JULCAxNik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogcG93ZXJub3dfazZfZXhpdCAtIHVucmVnaXN0ZXJzIEFNRCBLNi0yKy8zKyBQb3dlck5vdyEgc3VwcG9ydAorICoKKyAqICAgVW5yZWdpc3RlcnMgQU1EIEs2LTIrIC8gSzYtMysgUG93ZXJOb3chIHN1cHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBwb3dlcm5vd19rNl9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfazZfZHJpdmVyKTsKKwlyZWxlYXNlX3JlZ2lvbiAoUE9XRVJOT1dfSU9QT1JULCAxNik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIkFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPiwgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+LCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJQb3dlck5vdyEgZHJpdmVyIGZvciBBTUQgSzYtMisgLyBLNi0zKyBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQocG93ZXJub3dfazZfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm5vd19rNl9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNmNjUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC0wLDAgKzEsNjkwIEBACisvKgorICogIEFNRCBLNyBQb3dlcm5vdyBkcml2ZXIuCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+IG9uIGJlaGFsZiBvZiBTdVNFIExhYnMuCisgKiAgKEMpIDIwMDMtMjAwNCBEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKiAgQmFzZWQgdXBvbiBkYXRhc2hlZXRzICYgc2FtcGxlIENQVXMga2luZGx5IHByb3ZpZGVkIGJ5IEFNRC4KKyAqCisgKiBFcnJhdGEgNTogUHJvY2Vzc29yIG1heSBmYWlsIHRvIGV4ZWN1dGUgYSBGSUQvVklEIGNoYW5nZSBpbiBwcmVzZW5jZSBvZiBpbnRlcnJ1cHQuCisgKiAtIFdlIGNsaS9zdGkgb24gc3RlcHBpbmcgQTAgQ1BVcyBhcm91bmQgdGhlIEZJRC9WSUQgdHJhbnNpdGlvbi4KKyAqIEVycmF0YSAxNTogUHJvY2Vzc29ycyB3aXRoIGhhbGYgZnJlcXVlbmN5IG11bHRpcGxpZXJzIG1heSBoYW5nIHVwb24gd2FrZXVwIGZyb20gZGlzY29ubmVjdC4KKyAqIC0gV2UgZGlzYWJsZSBoYWxmIG11bHRpcGxpZXJzIGlmIEFDUEkgaXMgdXNlZCBvbiBBMCBzdGVwcGluZyBDUFVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJwb3dlcm5vdy1rNy5oIgorCisjZGVmaW5lIFBGWCAicG93ZXJub3c6ICIKKworCitzdHJ1Y3QgcHNiX3MgeworCXU4IHNpZ25hdHVyZVsxMF07CisJdTggdGFibGV2ZXJzaW9uOworCXU4IGZsYWdzOworCXUxNiBzZXR0bGluZ3RpbWU7CisJdTggcmVzZXJ2ZWQxOworCXU4IG51bXBzdDsKK307CisKK3N0cnVjdCBwc3RfcyB7CisJdTMyIGNwdWlkOworCXU4IGZzYnNwZWVkOworCXU4IG1heGZpZDsKKwl1OCBzdGFydHZpZDsKKwl1OCBudW1wc3RhdGVzOworfTsKKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQordW5pb24gcG93ZXJub3dfYWNwaV9jb250cm9sX3QgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgZmlkOjUsCisJCXZpZDo1LAorCQlzZ3RjOjIwLAorCQlyZXMxOjI7CisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgdmFsOworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFQlVHCisvKiBkaXZpZGUgYnkgMTAwMCB0byBnZXQgVkNvcmUgdm9sdGFnZSBpbiBWLiAqLworc3RhdGljIGludCBtb2JpbGVfdmlkX3RhYmxlWzMyXSA9IHsKKyAgICAyMDAwLCAxOTUwLCAxOTAwLCAxODUwLCAxODAwLCAxNzUwLCAxNzAwLCAxNjUwLAorICAgIDE2MDAsIDE1NTAsIDE1MDAsIDE0NTAsIDE0MDAsIDEzNTAsIDEzMDAsIDAsCisgICAgMTI3NSwgMTI1MCwgMTIyNSwgMTIwMCwgMTE3NSwgMTE1MCwgMTEyNSwgMTEwMCwKKyAgICAxMDc1LCAxMDUwLCAxMDI1LCAxMDAwLCA5NzUsIDk1MCwgOTI1LCAwLAorfTsKKyNlbmRpZgorCisvKiBkaXZpZGUgYnkgMTAgdG8gZ2V0IEZJRC4gKi8KK3N0YXRpYyBpbnQgZmlkX2NvZGVzWzMyXSA9IHsKKyAgICAxMTAsIDExNSwgMTIwLCAxMjUsIDUwLCA1NSwgNjAsIDY1LAorICAgIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMCwgMTA1LAorICAgIDMwLCAxOTAsIDQwLCAyMDAsIDEzMCwgMTM1LCAxNDAsIDIxMCwKKyAgICAxNTAsIDIyNSwgMTYwLCAxNjUsIDE3MCwgMTgwLCAtMSwgLTEsCit9OworCisvKiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGluIG9yZGVyIHRvIGZvcmNlIEFDUEkgaW5zdGVhZCBvZiBsZWdhY3kgbWV0aG9kIGZvcgorICogY29uZmlndXJhdGlvbiBwdXJwb3NlLgorICovCisKK3N0YXRpYyBpbnQgYWNwaV9mb3JjZTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGU7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX2J1czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX3ZpZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluaW11bV9zcGVlZD0tMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4aW11bV9zcGVlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtYmVyX3NjYWxlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnNiOworc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5Oworc3RhdGljIGNoYXIgaGF2ZV9hMDsKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJwb3dlcm5vdy1rNyIsIG1zZykKKworc3RhdGljIGludCBjaGVja19mc2IodW5zaWduZWQgaW50IGZzYnNwZWVkKQoreworCWludCBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgZiA9IGZzYiAvIDEwMDA7CisKKwlkZWx0YSA9IChmc2JzcGVlZCA+IGYpID8gZnNic3BlZWQgLSBmIDogZiAtIGZzYnNwZWVkOworCXJldHVybiAoZGVsdGEgPCA1KTsKK30KKworc3RhdGljIGludCBjaGVja19wb3dlcm5vdyh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCXVuc2lnbmVkIGludCBtYXhlaSwgZWF4LCBlYngsIGVjeCwgZWR4OworCisJaWYgKChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKSB8fCAoYy0+eDg2ICE9NikpIHsKKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUaGlzIG1vZHVsZSBvbmx5IHdvcmtzIHdpdGggQU1EIEs3IENQVXNcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCS8qIEdldCBtYXhpbXVtIGNhcGFiaWxpdGllcyAqLworCW1heGVpID0gY3B1aWRfZWF4ICgweDgwMDAwMDAwKTsKKwlpZiAobWF4ZWkgPCAweDgwMDAwMDA3KSB7CS8qIEFueSBwb3dlcm5vdyBpbmZvID8gKi8KKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJObyBwb3dlcm5vdyBjYXBhYmlsaXRpZXMgZGV0ZWN0ZWRcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCWlmICgoYy0+eDg2X21vZGVsID09IDYpICYmIChjLT54ODZfbWFzayA9PSAwKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIks3IDY2MFtBMF0gY29yZSBkZXRlY3RlZCwgZW5hYmxpbmcgZXJyYXRhIHdvcmthcm91bmRzXG4iKTsKKwkJaGF2ZV9hMCA9IDE7CisJfQorCisJY3B1aWQoMHg4MDAwMDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkvKiBDaGVjayB3ZSBjYW4gYWN0dWFsbHkgZG8gc29tZXRoaW5nIGJlZm9yZSB3ZSBzYXkgYW55dGhpbmcuKi8KKwlpZiAoIShlZHggJiAoMSA8PCAxIHwgMSA8PCAyKSkpCisJCXJldHVybiAwOworCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJQb3dlck5PVyEgVGVjaG5vbG9neSBwcmVzZW50LiBDYW4gc2NhbGU6ICIpOworCisJaWYgKGVkeCAmIDEgPDwgMSkgeworCQlwcmludGsgKCJmcmVxdWVuY3kiKTsKKwkJY2FuX3NjYWxlX2J1cz0xOworCX0KKworCWlmICgoZWR4ICYgKDEgPDwgMSB8IDEgPDwgMikpID09IDB4NikKKwkJcHJpbnRrICgiIGFuZCAiKTsKKworCWlmIChlZHggJiAxIDw8IDIpIHsKKwkJcHJpbnRrICgidm9sdGFnZSIpOworCQljYW5fc2NhbGVfdmlkPTE7CisJfQorCisJcHJpbnRrICgiLlxuIik7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBnZXRfcmFuZ2VzICh1bnNpZ25lZCBjaGFyICpwc3QpCit7CisJdW5zaWduZWQgaW50IGo7CisJdW5zaWduZWQgaW50IHNwZWVkOworCXU4IGZpZCwgdmlkOworCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChudW1iZXJfc2NhbGVzICsgMSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvd2Vybm93X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocG93ZXJub3dfdGFibGUsIDAsIChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChudW1iZXJfc2NhbGVzICsgMSkpKTsKKworCWZvciAoaj0wIDsgaiA8IG51bWJlcl9zY2FsZXM7IGorKykgeworCQlmaWQgPSAqcHN0Kys7CisKKwkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gKGZzYiAqIGZpZF9jb2Rlc1tmaWRdKSAvIDEwOworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCA9IGZpZDsgLyogbG93ZXIgOCBiaXRzICovCisKKwkJc3BlZWQgPSBwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3k7CisKKwkJaWYgKChmaWRfY29kZXNbZmlkXSAlIDEwKT09NSkgeworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorCQkJaWYgKGhhdmVfYTAgPT0gMSkKKwkJCQlwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisjZW5kaWYKKwkJfQorCisJCWlmIChzcGVlZCA8IG1pbmltdW1fc3BlZWQpCisJCQltaW5pbXVtX3NwZWVkID0gc3BlZWQ7CisJCWlmIChzcGVlZCA+IG1heGltdW1fc3BlZWQpCisJCQltYXhpbXVtX3NwZWVkID0gc3BlZWQ7CisKKwkJdmlkID0gKnBzdCsrOworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCB8PSAodmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKworCQlkcHJpbnRrICgiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKKwkJCSAiVklEOiAweCV4ICglZC4lMDNkVilcbiIsIGZpZCwgZmlkX2NvZGVzW2ZpZF0gLyAxMCwgCisJCQkgZmlkX2NvZGVzW2ZpZF0gJSAxMCwgc3BlZWQvMTAwMCwgdmlkLAkKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0lMTAwMCk7CisJfQorCXBvd2Vybm93X3RhYmxlW251bWJlcl9zY2FsZXNdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW251bWJlcl9zY2FsZXNdLmluZGV4ID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNoYW5nZV9GSUQoaW50IGZpZCkKK3sKKwl1bmlvbiBtc3JfZmlkdmlkY3RsIGZpZHZpZGN0bDsKKworCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwlpZiAoZmlkdmlkY3RsLmJpdHMuRklEICE9IGZpZCkgeworCQlmaWR2aWRjdGwuYml0cy5TR1RDID0gbGF0ZW5jeTsKKwkJZmlkdmlkY3RsLmJpdHMuRklEID0gZmlkOworCQlmaWR2aWRjdGwuYml0cy5WSURDID0gMDsKKwkJZmlkdmlkY3RsLmJpdHMuRklEQyA9IDE7CisJCXdybXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgY2hhbmdlX1ZJRChpbnQgdmlkKQoreworCXVuaW9uIG1zcl9maWR2aWRjdGwgZmlkdmlkY3RsOworCisJcmRtc3JsIChNU1JfSzdfRklEX1ZJRF9DVEwsIGZpZHZpZGN0bC52YWwpOworCWlmIChmaWR2aWRjdGwuYml0cy5WSUQgIT0gdmlkKSB7CisJCWZpZHZpZGN0bC5iaXRzLlNHVEMgPSBsYXRlbmN5OworCQlmaWR2aWRjdGwuYml0cy5WSUQgPSB2aWQ7CisJCWZpZHZpZGN0bC5iaXRzLkZJREMgPSAwOworCQlmaWR2aWRjdGwuYml0cy5WSURDID0gMTsKKwkJd3Jtc3JsIChNU1JfSzdfRklEX1ZJRF9DVEwsIGZpZHZpZGN0bC52YWwpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQgKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1OCBmaWQsIHZpZDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bmlvbiBtc3JfZmlkdmlkc3RhdHVzIGZpZHZpZHN0YXR1czsKKwlpbnQgY2ZpZDsKKworCS8qIGZpZCBhcmUgdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW5kZXggd2Ugc3RvcmVkIGludG8KKwkgKiB0aGUgY3B1ZnJlcSBmcmVxdWVuY3kgdGFibGUgaW4gcG93ZXJub3dfZGVjb2RlX2Jpb3MsCisJICogdmlkIGFyZSB0aGUgdXBwZXIgOCBiaXRzLgorCSAqLworCisJZmlkID0gcG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjsKKwl2aWQgPSAocG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjAwKSA+PiA4OworCisJZnJlcXMuY3B1ID0gMDsKKworCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKKwljZmlkID0gZmlkdmlkc3RhdHVzLmJpdHMuQ0ZJRDsKKwlmcmVxcy5vbGQgPSBmc2IgKiBmaWRfY29kZXNbY2ZpZF0gLyAxMDsKKworCWZyZXFzLm5ldyA9IHBvd2Vybm93X3RhYmxlW2luZGV4XS5mcmVxdWVuY3k7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogTm93IGRvIHRoZSBtYWdpYyBwb2tpbmcgaW50byB0aGUgTVNScy4gICovCisKKwlpZiAoaGF2ZV9hMCA9PSAxKQkvKiBBMCBlcnJhdGEgNSAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaWYgKGZyZXFzLm9sZCA+IGZyZXFzLm5ldykgeworCQkvKiBHb2luZyBkb3duLCBzbyBjaGFuZ2UgRklEIGZpcnN0ICovCisJCWNoYW5nZV9GSUQoZmlkKTsKKwkJY2hhbmdlX1ZJRCh2aWQpOworCX0gZWxzZSB7CisJCS8qIEdvaW5nIHVwLCBzbyBjaGFuZ2UgVklEIGZpcnN0ICovCisJCWNoYW5nZV9WSUQodmlkKTsKKwkJY2hhbmdlX0ZJRChmaWQpOworCX0KKworCisJaWYgKGhhdmVfYTAgPT0gMSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Cit9CisKKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorCitzdGF0aWMgc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICphY3BpX3Byb2Nlc3Nvcl9wZXJmOworCitzdGF0aWMgaW50IHBvd2Vybm93X2FjcGlfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXVuaW9uIHBvd2Vybm93X2FjcGlfY29udHJvbF90IHBjOworCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYgIT0gTlVMTCAmJiBwb3dlcm5vd190YWJsZSAhPSBOVUxMKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlhY3BpX3Byb2Nlc3Nvcl9wZXJmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKworCWlmICghYWNwaV9wcm9jZXNzb3JfcGVyZikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJbWVtc2V0KGFjcGlfcHJvY2Vzc29yX3BlcmYsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpKTsKKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKSkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVycjE7CisJfQorCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnIyOworCX0KKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnIyOworCX0KKworCW51bWJlcl9zY2FsZXMgPSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZV9jb3VudDsKKworCWlmIChudW1iZXJfc2NhbGVzIDwgMikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjI7CisJfQorCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChudW1iZXJfc2NhbGVzICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvd2Vybm93X3RhYmxlKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisKKwltZW1zZXQocG93ZXJub3dfdGFibGUsIDAsICgobnVtYmVyX3NjYWxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkpKTsKKworCXBjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbMF0uY29udHJvbDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX3NjYWxlczsgaSsrKSB7CisJCXU4IGZpZCwgdmlkOworCQl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwkJcGMudmFsID0gKHVuc2lnbmVkIGxvbmcpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5jb250cm9sOworCQlkcHJpbnRrICgiYWNwaTogIFAlZDogJWQgTUh6ICVkIG1XICVkIHVTIGNvbnRyb2wgJTA4eCBTR1RDICVkXG4iLAorCQkJIGksCisJCQkgKHUzMikgYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LAorCQkJICh1MzIpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5wb3dlciwKKwkJCSAodTMyKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5LAorCQkJICh1MzIpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5jb250cm9sLAorCQkJIHBjLmJpdHMuc2d0Yyk7CisKKwkJdmlkID0gcGMuYml0cy52aWQ7CisJCWZpZCA9IHBjLmJpdHMuZmlkOworCisJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZzYiAqIGZpZF9jb2Rlc1tmaWRdIC8gMTA7CisJCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4ID0gZmlkOyAvKiBsb3dlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggfD0gKHZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCisKKwkJc3BlZWQgPSBwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3k7CisKKwkJaWYgKChmaWRfY29kZXNbZmlkXSAlIDEwKT09NSkgeworCQkJaWYgKGhhdmVfYTAgPT0gMSkKKwkJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCX0KKworCQlkcHJpbnRrICgiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKKwkJCSAiVklEOiAweCV4ICglZC4lMDNkVilcbiIsIGZpZCwgZmlkX2NvZGVzW2ZpZF0gLyAxMCwgCisJCQkgZmlkX2NvZGVzW2ZpZF0gJSAxMCwgc3BlZWQvMTAwMCwgdmlkLAkKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0lMTAwMCk7CisKKwkJaWYgKGxhdGVuY3kgPCBwYy5iaXRzLnNndGMpCisJCQlsYXRlbmN5ID0gcGMuYml0cy5zZ3RjOworCisJCWlmIChzcGVlZCA8IG1pbmltdW1fc3BlZWQpCisJCQltaW5pbXVtX3NwZWVkID0gc3BlZWQ7CisJCWlmIChzcGVlZCA+IG1heGltdW1fc3BlZWQpCisJCQltYXhpbXVtX3NwZWVkID0gc3BlZWQ7CisJfQorCisJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSAwOworCisJLyogbm90aWZ5IEJJT1MgdGhhdCB3ZSBleGlzdCAqLworCWFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oVEhJU19NT0RVTEUpOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKTsKK2VycjE6CisJa2ZyZWUoYWNwaV9wcm9jZXNzb3JfcGVyZik7CitlcnIwOgorCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJBQ1BJIHBlcmZsaWIgY2FuIG5vdCBiZSB1c2VkIGluIHRoaXMgcGxhdGZvcm1cbiIpOworCWFjcGlfcHJvY2Vzc29yX3BlcmYgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisjZWxzZQorc3RhdGljIGludCBwb3dlcm5vd19hY3BpX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gc3VwcG9ydCBmb3IgQUNQSSBwcm9jZXNzb3IgZm91bmQuIgorCSAgICAgICAiICBQbGVhc2UgcmVjb21waWxlIHlvdXIga2VybmVsIHdpdGggQUNQSSBwcm9jZXNzb3JcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfZGVjb2RlX2Jpb3MgKGludCBtYXhmaWQsIGludCBzdGFydHZpZCkKK3sKKwlzdHJ1Y3QgcHNiX3MgKnBzYjsKKwlzdHJ1Y3QgcHN0X3MgKnBzdDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGludCBldHVwbGU7CisJdW5zaWduZWQgaW50IHJldDsKKworCWV0dXBsZSA9IGNwdWlkX2VheCgweDgwMDAwMDAxKTsKKworCWZvciAoaT0weEMwMDAwOyBpIDwgMHhmZmZmMCA7IGkrPTE2KSB7CisKKwkJcCA9IHBoeXNfdG9fdmlydChpKTsKKworCQlpZiAobWVtY21wKHAsICJBTURLN1BOT1chIiwgIDEwKSA9PSAwKXsKKwkJCWRwcmludGsgKCJGb3VuZCBQU0IgaGVhZGVyIGF0ICVwXG4iLCBwKTsKKwkJCXBzYiA9IChzdHJ1Y3QgcHNiX3MgKikgcDsKKwkJCWRwcmludGsgKCJUYWJsZSB2ZXJzaW9uOiAweCV4XG4iLCBwc2ItPnRhYmxldmVyc2lvbik7CisJCQlpZiAocHNiLT50YWJsZXZlcnNpb24gIT0gMHgxMikgeworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiU29ycnksIG9ubHkgdjEuMiB0YWJsZXMgc3VwcG9ydGVkIHJpZ2h0IG5vd1xuIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisKKwkJCWRwcmludGsgKCJGbGFnczogMHgleFxuIiwgcHNiLT5mbGFncyk7CisJCQlpZiAoKHBzYi0+ZmxhZ3MgJiAxKT09MCkgeworCQkJCWRwcmludGsgKCJNb2JpbGUgdm9sdGFnZSByZWd1bGF0b3JcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrICgiRGVza3RvcCB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CisJCQl9CisKKwkJCWxhdGVuY3kgPSBwc2ItPnNldHRsaW5ndGltZTsKKwkJCWlmIChsYXRlbmN5IDwgMTAwKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCSU9TIHNldCBzZXR0bGluZyB0aW1lIHRvICVkIG1pY3Jvc2Vjb25kcy4iCisJCQkJCQkiU2hvdWxkIGJlIGF0IGxlYXN0IDEwMC4gQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOworCQkJCWxhdGVuY3kgPSAxMDA7CisJCQl9CisJCQlkcHJpbnRrICgiU2V0dGxpbmcgVGltZTogJWQgbWljcm9zZWNvbmRzLlxuIiwgcHNiLT5zZXR0bGluZ3RpbWUpOworCQkJZHByaW50ayAoIkhhcyAlZCBQU1QgdGFibGVzLiAoT25seSBkdW1waW5nIG9uZXMgcmVsZXZhbnQgdG8gdGhpcyBDUFUpLlxuIiwgcHNiLT5udW1wc3QpOworCisJCQlwICs9IHNpemVvZiAoc3RydWN0IHBzYl9zKTsKKworCQkJcHN0ID0gKHN0cnVjdCBwc3RfcyAqKSBwOworCisJCQlmb3IgKGkgPSAwIDsgaSA8cHNiLT5udW1wc3Q7IGkrKykgeworCQkJCXBzdCA9IChzdHJ1Y3QgcHN0X3MgKikgcDsKKwkJCQludW1iZXJfc2NhbGVzID0gcHN0LT5udW1wc3RhdGVzOworCisJCQkJaWYgKChldHVwbGUgPT0gcHN0LT5jcHVpZCkgJiYgY2hlY2tfZnNiKHBzdC0+ZnNic3BlZWQpICYmCisJCQkJICAgIChtYXhmaWQ9PXBzdC0+bWF4ZmlkKSAmJiAoc3RhcnR2aWQ9PXBzdC0+c3RhcnR2aWQpKQorCQkJCXsKKwkJCQkJZHByaW50ayAoIlBTVDolZCAoQCVwKVxuIiwgaSwgcHN0KTsKKwkJCQkJZHByaW50ayAoIiBjcHVpZDogMHgleCAgZnNiOiAlZCAgbWF4RklEOiAweCV4ICBzdGFydHZpZDogMHgleFxuIiwgCisJCQkJCQkgcHN0LT5jcHVpZCwgcHN0LT5mc2JzcGVlZCwgcHN0LT5tYXhmaWQsIHBzdC0+c3RhcnR2aWQpOworCisJCQkJCXJldCA9IGdldF9yYW5nZXMgKChjaGFyICopIHBzdCArIHNpemVvZiAoc3RydWN0IHBzdF9zKSk7CisJCQkJCXJldHVybiByZXQ7CisKKwkJCQl9IGVsc2UgeworCQkJCQlwID0gKGNoYXIgKikgcHN0ICsgc2l6ZW9mIChzdHJ1Y3QgcHN0X3MpOworCQkJCQlmb3IgKGo9MCA7IGogPCBudW1iZXJfc2NhbGVzOyBqKyspCisJCQkJCQlwKz0yOworCQkJCX0KKwkJCX0KKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTm8gUFNUIHRhYmxlcyBtYXRjaCB0aGlzIGNwdWlkICgweCV4KVxuIiwgZXR1cGxlKTsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGhpcyBpcyBpbmRpY2F0aXZlIG9mIGEgYnJva2VuIEJJT1MuXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcCsrOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCBuZXdzdGF0ZTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBwb3dlcm5vd190YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoYW5nZV9zcGVlZChuZXdzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBvd2Vybm93X3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHBvd2Vybm93X3RhYmxlKTsKK30KKworLyoKKyAqIFdlIHVzZSB0aGUgZmFjdCB0aGF0IHRoZSBidXMgZnJlcXVlbmN5IGlzIHNvbWVob3cKKyAqIGEgbXVsdGlwbGUgb2YgMTAwMDAwLzMga2h6LCB0aGVuIHdlIGNvbXB1dGUgc2d0YyBhY2NvcmRpbmcKKyAqIHRvIHRoaXMgbXVsdGlwbGUuCisgKiBUaGF0IHdheSwgd2UgbWF0Y2ggbW9yZSBob3cgQU1EIHRoaW5rcyBhbGwgb2YgdGhhdCB3b3JrLgorICogV2Ugd2lsbCB0aGVuIGdldCB0aGUgc2FtZSBraW5kIG9mIGJlaGF2aW91ciBhbHJlYWR5IHRlc3RlZCB1bmRlcgorICogdGhlICJ3ZWxsLWtub3duIiBvdGhlciBPUy4KKyAqLworc3RhdGljIGludCBfX2luaXQgZml4dXBfc2d0Yyh2b2lkKQoreworCXVuc2lnbmVkIGludCBzZ3RjOworCXVuc2lnbmVkIGludCBtOworCisJbSA9IGZzYiAvIDMzMzM7CisJaWYgKChtICUgMTApID49IDUpCisJCW0gKz0gNTsKKworCW0gLz0gMTA7CisKKwlzZ3RjID0gMTAwICogbSAqIGxhdGVuY3k7CisJc2d0YyA9IHNndGMgLyAzOworCWlmIChzZ3RjID4gMHhmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiU0dUQyB0b28gbGFyZ2UgJWRcbiIsIHNndGMpOworCQlzZ3RjID0gMHhmZmZmZjsKKwl9CisJcmV0dXJuIHNndGM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3dfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5pb24gbXNyX2ZpZHZpZHN0YXR1cyBmaWR2aWRzdGF0dXM7CisJdW5zaWduZWQgaW50IGNmaWQ7CisKKwlpZiAoY3B1KQorCQlyZXR1cm4gMDsKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX1NUQVRVUywgZmlkdmlkc3RhdHVzLnZhbCk7CisJY2ZpZCA9IGZpZHZpZHN0YXR1cy5iaXRzLkNGSUQ7CisKKwlyZXR1cm4gKGZzYiAqIGZpZF9jb2Rlc1tjZmlkXSAvIDEwKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBhY2VyX2NwdWZyZXFfcHN0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGxhcHRvcCB3aXRoIGJyb2tlbiBQU1QgdGFibGVzIGluIEJJT1MgZGV0ZWN0ZWQuXG4iLCBkLT5pZGVudCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiWW91IG5lZWQgdG8gZG93bmdyYWRlIHRvIDNBMjEgKDA5LzA5LzIwMDIpLCBvciB0cnkgYSBuZXdlciBCSU9TIHRoYW4gM0E3MSAoMDEvMjAvMjAwMylcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNwdWZyZXEgc2NhbGluZyBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIEF0aGxvbiBsYXB0b3BzIGhhdmUgcmVhbGx5IGZ1Y2tlZCBQU1QgdGFibGVzLgorICogQSBCSU9TIHVwZGF0ZSBpcyBhbGwgdGhhdCBjYW4gc2F2ZSB0aGVtLgorICogTWVudGlvbiB0aGlzLCBhbmQgZGlzYWJsZSBjcHVmcmVxLgorICovCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBwb3dlcm5vd19kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGFjZXJfY3B1ZnJlcV9wc3QsCisJCS5pZGVudCA9ICJBY2VyIEFzcGlyZSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSW5zeWRlIFNvZnR3YXJlIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjNBNzEiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfY3B1X2luaXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuaW9uIG1zcl9maWR2aWRzdGF0dXMgZmlkdmlkc3RhdHVzOworCWludCByZXN1bHQ7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX1NUQVRVUywgZmlkdmlkc3RhdHVzLnZhbCk7CisKKwkvKiBBIEs3IHdpdGggcG93ZXJub3cgdGVjaG5vbG9neSBpcyBzZXQgdG8gbWF4IGZyZXF1ZW5jeSBieSBCSU9TICovCisJZnNiID0gKDEwICogY3B1X2toeikgLyBmaWRfY29kZXNbZmlkdmlkc3RhdHVzLmJpdHMuTUZJRF07CisJaWYgKCFmc2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImNhbiBub3QgZGV0ZXJtaW5lIGJ1cyBmcmVxdWVuY3lcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZHByaW50aygiRlNCOiAlM2QuJTAzZCBNSHpcbiIsIGZzYi8xMDAwLCBmc2IlMTAwMCk7CisKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShwb3dlcm5vd19kbWlfdGFibGUpIHx8IGFjcGlfZm9yY2UpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJQU0IvUFNUIGtub3duIHRvIGJlIGJyb2tlbi4gIFRyeWluZyBBQ1BJIGluc3RlYWRcbiIpOworCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBwb3dlcm5vd19kZWNvZGVfYmlvcyhmaWR2aWRzdGF0dXMuYml0cy5NRklELCBmaWR2aWRzdGF0dXMuYml0cy5TVklEKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgQUNQSSBwZXJmbGliXG4iKTsKKwkJCW1heGltdW1fc3BlZWQgPSAwOworCQkJbWluaW11bV9zcGVlZCA9IC0xOworCQkJbGF0ZW5jeSA9IDA7CisJCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkFDUEkgYW5kIGxlZ2FjeSBtZXRob2RzIGZhaWxlZFxuIik7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJTZWUgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9jcHVmcmVxL3Bvd2Vybm93LWs3LnNodG1sXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNHVEMgdXNlIHRoZSBidXMgY2xvY2sgYXMgdGltZXIgKi8KKwkJCWxhdGVuY3kgPSBmaXh1cF9zZ3RjKCk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU0dUQzogJWRcbiIsIGxhdGVuY3kpOworCQl9CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTWluaW11bSBzcGVlZCAlZCBNSHouIE1heGltdW0gc3BlZWQgJWQgTUh6LlxuIiwKKwkJCQltaW5pbXVtX3NwZWVkLzEwMDAsIG1heGltdW1fc3BlZWQvMTAwMCk7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IGNwdWZyZXFfc2NhbGUoMjAwMDAwMFVMLCBmc2IsIGxhdGVuY3kpOworCisJcG9saWN5LT5jdXIgPSBwb3dlcm5vd19nZXQoMCk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihwb3dlcm5vd190YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBwb3dlcm5vd190YWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJub3dfY3B1X2V4aXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KSB7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LN19BQ1BJCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYpIHsKKwkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKTsKKwkJa2ZyZWUoYWNwaV9wcm9jZXNzb3JfcGVyZik7CisJfQorI2VuZGlmCisKKwlpZiAocG93ZXJub3dfdGFibGUpCisJCWtmcmVlKHBvd2Vybm93X3RhYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogcG93ZXJub3dfdGFibGVfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwb3dlcm5vd19kcml2ZXIgPSB7CisJLnZlcmlmeQk9IHBvd2Vybm93X3ZlcmlmeSwKKwkudGFyZ2V0CT0gcG93ZXJub3dfdGFyZ2V0LAorCS5nZXQJPSBwb3dlcm5vd19nZXQsCisJLmluaXQJPSBwb3dlcm5vd19jcHVfaW5pdCwKKwkuZXhpdAk9IHBvd2Vybm93X2NwdV9leGl0LAorCS5uYW1lCT0gInBvd2Vybm93LWs3IiwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuYXR0cgk9IHBvd2Vybm93X3RhYmxlX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19pbml0ICh2b2lkKQoreworCWlmIChjaGVja19wb3dlcm5vdygpPT0wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93X2V4aXQgKHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKGFjcGlfZm9yY2UsICBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhY3BpX2ZvcmNlLCAiRm9yY2UgQUNQSSB0byBiZSB1c2VkLiIpOworCitNT0RVTEVfQVVUSE9SICgiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJQb3dlcm5vdyBkcml2ZXIgZm9yIEFNRCBLNyBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChwb3dlcm5vd19pbml0KTsKK21vZHVsZV9leGl0KHBvd2Vybm93X2V4aXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhNjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogICRJZDogcG93ZXJub3ctazcuaCx2IDEuMiAyMDAzLzAyLzEwIDE4OjI2OjAxIGRhdmVqIEV4cCAkCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBBTUQtc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKi8KKwordW5pb24gbXNyX2ZpZHZpZGN0bCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgRklEOjUsCQkJLy8gNDowCisJCXJlc2VydmVkMTozLAkvLyA3OjUKKwkJVklEOjUsCQkJLy8gMTI6OAorCQlyZXNlcnZlZDI6MywJLy8gMTU6MTMKKwkJRklEQzoxLAkJCS8vIDE2CisJCVZJREM6MSwJCQkvLyAxNworCQlyZXNlcnZlZDM6MiwJLy8gMTk6MTgKKwkJRklEQ0hHUkFUSU86MSwJLy8gMjAKKwkJcmVzZXJ2ZWQ0OjExLAkvLyAzMS0yMQorCQlTR1RDOjIwLAkJLy8gMzI6NTEKKwkJcmVzZXJ2ZWQ1OjEyOwkvLyA2Mzo1MgorCX0gYml0czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworfTsKKwordW5pb24gbXNyX2ZpZHZpZHN0YXR1cyB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgQ0ZJRDo1LAkJCS8vIDQ6MAorCQlyZXNlcnZlZDE6MywJLy8gNzo1CisJCVNGSUQ6NSwJCQkvLyAxMjo4CisJCXJlc2VydmVkMjozLAkvLyAxNToxMworCQlNRklEOjUsCQkJLy8gMjA6MTYKKwkJcmVzZXJ2ZWQzOjExLAkvLyAzMToyMQorCQlDVklEOjUsCQkJLy8gMzY6MzIKKwkJcmVzZXJ2ZWQ0OjMsCS8vIDM5OjM3CisJCVNWSUQ6NSwJCQkvLyA0NDo0MAorCQlyZXNlcnZlZDU6MywJLy8gNDc6NDUKKwkJTVZJRDo1LAkJCS8vIDUyOjQ4CisJCXJlc2VydmVkNjoxMTsJLy8gNjM6NTMKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZmY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiAgIChjKSAyMDAzLCAyMDA0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqICBZb3VyIHVzZSBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiAgR05VIGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgdmVyc2lvbiAyLiBTZWUgIkNPUFlJTkciIG9yCisgKiAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCisgKgorICogIFN1cHBvcnQgOiBwYXVsLmRldnJpZW5kdEBhbWQuY29tCisgKgorICogIEJhc2VkIG9uIHRoZSBwb3dlcm5vdy1rNy5jIG1vZHVsZSB3cml0dGVuIGJ5IERhdmUgSm9uZXMuCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+IG9uIGJlaGFsZiBvZiBTdVNFIExhYnMKKyAqICAoQykgMjAwNCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKiAgKEMpIDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqICBCYXNlZCB1cG9uIGRhdGFzaGVldHMgJiBzYW1wbGUgQ1BVcyBraW5kbHkgcHJvdmlkZWQgYnkgQU1ELgorICoKKyAqICBWYWx1YWJsZSBpbnB1dCBncmF0ZWZ1bGx5IHJlY2VpdmVkIGZyb20gRGF2ZSBKb25lcywgUGF2ZWwgTWFjaGVrLAorICogIERvbWluaWsgQnJvZG93c2tpLCBhbmQgb3RoZXJzLgorICogIFByb2Nlc3NvciBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIENoYXB0ZXIgOSAoUG93ZXIgYW5kIFRoZXJtYWwgTWFuYWdlbWVudCkKKyAqICBvZiB0aGUgIkJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSBmb3IgdGhlIEFNRCBBdGhsb24gNjQgYW5kIEFNRAorICogIE9wdGVyb24gUHJvY2Vzc29ycyIgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHd3dy5hbWQuY29tCisgKgorICogIFRhYmxlcyBmb3Igc3BlY2lmaWMgQ1BVcyBjYW4gYmUgaW5mcmVycmVkIGZyb20KKyAqCWh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9hc3NldHMvY29udGVudF90eXBlL3doaXRlX3BhcGVyc19hbmRfdGVjaF9kb2NzLzMwNDMwLnBkZgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSQorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgUEZYICJwb3dlcm5vdy1rODogIgorI2RlZmluZSBCRlggUEZYICJCSU9TIGVycm9yOiAiCisjZGVmaW5lIFZFUlNJT04gInZlcnNpb24gMS4wMC4wOWUiCisjaW5jbHVkZSAicG93ZXJub3ctazguaCIKKworLyogc2VyaWFsaXplIGZyZXEgY2hhbmdlcyAgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGZpZHZpZF9zZW0pOworCitzdGF0aWMgc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKnBvd2Vybm93X2RhdGFbTlJfQ1BVU107CisKKy8qIFJldHVybiBhIGZyZXF1ZW5jeSBpbiBNSHosIGdpdmVuIGFuIGlucHV0IGZpZCAqLworc3RhdGljIHUzMiBmaW5kX2ZyZXFfZnJvbV9maWQodTMyIGZpZCkKK3sKKwlyZXR1cm4gODAwICsgKGZpZCAqIDEwMCk7Cit9CisKKy8qIFJldHVybiBhIGZyZXF1ZW5jeSBpbiBLSHosIGdpdmVuIGFuIGlucHV0IGZpZCAqLworc3RhdGljIHUzMiBmaW5kX2toel9mcmVxX2Zyb21fZmlkKHUzMiBmaWQpCit7CisJcmV0dXJuIDEwMDAgKiBmaW5kX2ZyZXFfZnJvbV9maWQoZmlkKTsKK30KKworLyogUmV0dXJuIGEgdm9sdGFnZSBpbiBtaWxpVm9sdHMsIGdpdmVuIGFuIGlucHV0IHZpZCAqLworc3RhdGljIHUzMiBmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiB2aWQpCit7CisJcmV0dXJuIDE1NTAtdmlkKjI1OworfQorCisvKiBSZXR1cm4gdGhlIHZjbyBmaWQgZm9yIGFuIGlucHV0IGZpZAorICoKKyAqIEVhY2ggImxvdyIgZmlkIGhhcyBjb3JyZXNwb25kaW5nICJoaWdoIiBmaWQsIGFuZCB5b3UgY2FuIGdldCB0byAibG93IiBmaWRzCisgKiBvbmx5IGZyb20gY29ycmVzcG9uZGluZyBoaWdoIGZpZHMuIFRoaXMgcmV0dXJucyAiaGlnaCIgZmlkIGNvcnJlc3BvbmRpbmcgdG8KKyAqICJsb3ciIG9uZS4KKyAqLworc3RhdGljIHUzMiBjb252ZXJ0X2ZpZF90b192Y29fZmlkKHUzMiBmaWQpCit7CisJaWYgKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pIHsKKwkJcmV0dXJuIDggKyAoMiAqIGZpZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZpZDsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiB0aGUgcGVuZGluZyBiaXQgaXMgc2V0LiBVbmxlc3Mgd2UganVzdCBpbnN0cnVjdGVkIHRoZSBwcm9jZXNzb3IKKyAqIHRvIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUsIHNlZWluZyB0aGlzIGJpdCBzZXQgaXMgcmVhbGx5IGJhZCBuZXdzLgorICovCitzdGF0aWMgaW50IHBlbmRpbmdfYml0X3N0dWNrKHZvaWQpCit7CisJdTMyIGxvLCBoaTsKKworCXJkbXNyKE1TUl9GSURWSURfU1RBVFVTLCBsbywgaGkpOworCXJldHVybiBsbyAmIE1TUl9TX0xPX0NIQU5HRV9QRU5ESU5HID8gMSA6IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGdsb2JhbCBjdXJyZW50IGZpZCAvIHZpZCB2YWx1ZXMgZnJvbSB0aGUgc3RhdHVzIG1zci4KKyAqIFJldHVybnMgMSBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwl1MzIgbG8sIGhpOworCXUzMiBpID0gMDsKKworCWxvID0gTVNSX1NfTE9fQ0hBTkdFX1BFTkRJTkc7CisJd2hpbGUgKGxvICYgTVNSX1NfTE9fQ0hBTkdFX1BFTkRJTkcpIHsKKwkJaWYgKGkrKyA+IDB4MTAwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGV0ZWN0ZWQgY2hhbmdlIHBlbmRpbmcgc3R1Y2tcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmRtc3IoTVNSX0ZJRFZJRF9TVEFUVVMsIGxvLCBoaSk7CisJfQorCisJZGF0YS0+Y3VycnZpZCA9IGhpICYgTVNSX1NfSElfQ1VSUkVOVF9WSUQ7CisJZGF0YS0+Y3VycmZpZCA9IGxvICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIGlzb2Nocm9ub3VzIHJlbGllZiB0aW1lICovCitzdGF0aWMgdm9pZCBjb3VudF9vZmZfaXJ0KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCXVkZWxheSgoMSA8PCBkYXRhLT5pcnQpICogMTApOworCXJldHVybjsKK30KKworLyogdGhlIHZvbHRhZ2Ugc3RhYmFsaXphdGlvbiB0aW1lICovCitzdGF0aWMgdm9pZCBjb3VudF9vZmZfdnN0KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCXVkZWxheShkYXRhLT52c3RhYmxlICogVlNUX1VOSVRTXzIwVVMpOworCXJldHVybjsKK30KKworLyogbmVlZCB0byBpbml0IHRoZSBjb250cm9sIG1zciB0byBhIHNhZmUgdmFsdWUgKGZvciBlYWNoIGNwdSkgKi8KK3N0YXRpYyB2b2lkIGZpZHZpZF9tc3JfaW5pdCh2b2lkKQoreworCXUzMiBsbywgaGk7CisJdTggZmlkLCB2aWQ7CisKKwlyZG1zcihNU1JfRklEVklEX1NUQVRVUywgbG8sIGhpKTsKKwl2aWQgPSBoaSAmIE1TUl9TX0hJX0NVUlJFTlRfVklEOworCWZpZCA9IGxvICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CisJbG8gPSBmaWQgfCAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCk7CisJaGkgPSBNU1JfQ19ISV9TVFBfR05UX0JFTklHTjsKKwlkcHJpbnRrKCJjcHUlZCwgaW5pdCBsbyAweCV4LCBoaSAweCV4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxvLCBoaSk7CisJd3Jtc3IoTVNSX0ZJRFZJRF9DVEwsIGxvLCBoaSk7Cit9CisKKworLyogd3JpdGUgdGhlIG5ldyBmaWQgdmFsdWUgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29udHJvbCBmaWVsZHMgdG8gdGhlIG1zciAqLworc3RhdGljIGludCB3cml0ZV9uZXdfZmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgZmlkKQoreworCXUzMiBsbzsKKwl1MzIgc2F2ZXZpZCA9IGRhdGEtPmN1cnJ2aWQ7CisKKwlpZiAoKGZpZCAmIElOVkFMSURfRklEX01BU0spIHx8IChkYXRhLT5jdXJydmlkICYgSU5WQUxJRF9WSURfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW50ZXJuYWwgZXJyb3IgLSBvdmVyZmxvdyBvbiBmaWQgd3JpdGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlsbyA9IGZpZCB8IChkYXRhLT5jdXJydmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCkgfCBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CisKKwlkcHJpbnRrKCJ3cml0aW5nIGZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAorCQlmaWQsIGxvLCBkYXRhLT5wbGxsb2NrICogUExMX0xPQ0tfQ09OVkVSU0lPTik7CisKKwl3cm1zcihNU1JfRklEVklEX0NUTCwgbG8sIGRhdGEtPnBsbGxvY2sgKiBQTExfTE9DS19DT05WRVJTSU9OKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwljb3VudF9vZmZfaXJ0KGRhdGEpOworCisJaWYgKHNhdmV2aWQgIT0gZGF0YS0+Y3VycnZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2aWQgY2hhbmdlIG9uIGZpZCB0cmFucywgb2xkIDB4JXgsIG5ldyAweCV4XG4iLAorCQkgICAgICAgc2F2ZXZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChmaWQgIT0gZGF0YS0+Y3VycmZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmaWQgdHJhbnMgZmFpbGVkLCBmaWQgMHgleCwgY3VyciAweCV4XG4iLCBmaWQsCisJCSAgICAgICAgZGF0YS0+Y3VycmZpZCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXcml0ZSBhIG5ldyB2aWQgdG8gdGhlIGhhcmR3YXJlICovCitzdGF0aWMgaW50IHdyaXRlX25ld192aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiB2aWQpCit7CisJdTMyIGxvOworCXUzMiBzYXZlZmlkID0gZGF0YS0+Y3VycmZpZDsKKworCWlmICgoZGF0YS0+Y3VycmZpZCAmIElOVkFMSURfRklEX01BU0spIHx8ICh2aWQgJiBJTlZBTElEX1ZJRF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnRlcm5hbCBlcnJvciAtIG92ZXJmbG93IG9uIHZpZCB3cml0ZVxuIik7CisJCXJldHVybiAxOworCX0KKworCWxvID0gZGF0YS0+Y3VycmZpZCB8ICh2aWQgPDwgTVNSX0NfTE9fVklEX1NISUZUKSB8IE1TUl9DX0xPX0lOSVRfRklEX1ZJRDsKKworCWRwcmludGsoIndyaXRpbmcgdmlkIDB4JXgsIGxvIDB4JXgsIGhpIDB4JXhcbiIsCisJCXZpZCwgbG8sIFNUT1BfR1JBTlRfNU5TKTsKKworCXdybXNyKE1TUl9GSURWSURfQ1RMLCBsbywgU1RPUF9HUkFOVF81TlMpOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmlkIGNoYW5nZWQgb24gdmlkIHRyYW5zLCBvbGQgMHgleCBuZXcgMHgleFxuIiwKKwkJICAgICAgIHNhdmVmaWQsIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmlkIHRyYW5zIGZhaWxlZCwgdmlkIDB4JXgsIGN1cnIgMHgleFxuIiwgdmlkLAorCQkJCWRhdGEtPmN1cnJ2aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlZHVjZSB0aGUgdmlkIGJ5IHRoZSBtYXggb2Ygc3RlcCBvciByZXF2aWQuCisgKiBEZWNyZWFzaW5nIHZpZCBjb2RlcyByZXByZXNlbnQgaW5jcmVhc2luZyB2b2x0YWdlczoKKyAqIHZpZCBvZiAwIGlzIDEuNTUwViwgdmlkIG9mIDB4MWUgaXMgMC44MDBWLCB2aWQgb2YgMHgxZiBpcyBvZmYuCisgKi8KK3N0YXRpYyBpbnQgZGVjcmVhc2VfdmlkX2NvZGVfYnlfc3RlcChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCwgdTMyIHN0ZXApCit7CisJaWYgKChkYXRhLT5jdXJydmlkIC0gcmVxdmlkKSA+IHN0ZXApCisJCXJlcXZpZCA9IGRhdGEtPmN1cnJ2aWQgLSBzdGVwOworCisJaWYgKHdyaXRlX25ld192aWQoZGF0YSwgcmVxdmlkKSkKKwkJcmV0dXJuIDE7CisKKwljb3VudF9vZmZfdnN0KGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYW5nZSB0aGUgZmlkIGFuZCB2aWQsIGJ5IHRoZSAzIHBoYXNlcy4gKi8KK3N0YXRpYyBpbnQgdHJhbnNpdGlvbl9maWRfdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkLCB1MzIgcmVxdmlkKQoreworCWlmIChjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oZGF0YSwgcmVxdmlkKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY29yZV9mcmVxdWVuY3lfdHJhbnNpdGlvbihkYXRhLCByZXFmaWQpKQorCQlyZXR1cm4gMTsKKworCWlmIChjb3JlX3ZvbHRhZ2VfcG9zdF90cmFuc2l0aW9uKGRhdGEsIHJlcXZpZCkpCisJCXJldHVybiAxOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmICgocmVxZmlkICE9IGRhdGEtPmN1cnJmaWQpIHx8IChyZXF2aWQgIT0gZGF0YS0+Y3VycnZpZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIChjcHUlZCk6IHJlcSAweCV4IDB4JXgsIGN1cnIgMHgleCAweCV4XG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQlyZXFmaWQsIHJlcXZpZCwgZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWRwcmludGsoInRyYW5zaXRpb25lZCAoY3B1JWQpOiBuZXcgZmlkIDB4JXgsIHZpZCAweCV4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBoYXNlIDEgLSBjb3JlIHZvbHRhZ2UgdHJhbnNpdGlvbiAuLi4gc2V0dXAgdm9sdGFnZSAqLworc3RhdGljIGludCBjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpCit7CisJdTMyIHJ2b3N0ZXBzID0gZGF0YS0+cnZvOworCXUzMiBzYXZlZmlkID0gZGF0YS0+Y3VycmZpZDsKKworCWRwcmludGsoInBoMSAoY3B1JWQpOiBzdGFydCwgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsIHJlcXZpZCAweCV4LCBydm8gMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkLCByZXF2aWQsIGRhdGEtPnJ2byk7CisKKwl3aGlsZSAoZGF0YS0+Y3VycnZpZCA+IHJlcXZpZCkgeworCQlkcHJpbnRrKCJwaDE6IGN1cnIgMHgleCwgcmVxIHZpZCAweCV4XG4iLAorCQkJZGF0YS0+Y3VycnZpZCwgcmVxdmlkKTsKKwkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgcmVxdmlkLCBkYXRhLT52aWRtdnMpKQorCQkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKChydm9zdGVwcyA+IDApICAmJiAoKGRhdGEtPnJ2byArIGRhdGEtPmN1cnJ2aWQpID4gcmVxdmlkKSkgeworCQlpZiAoZGF0YS0+Y3VycnZpZCA9PSAwKSB7CisJCQlydm9zdGVwcyA9IDA7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKCJwaDE6IGNoYW5naW5nIHZpZCBmb3IgcnZvLCByZXEgMHgleFxuIiwKKwkJCQlkYXRhLT5jdXJydmlkIC0gMSk7CisJCQlpZiAoZGVjcmVhc2VfdmlkX2NvZGVfYnlfc3RlcChkYXRhLCBkYXRhLT5jdXJydmlkIC0gMSwgMSkpCisJCQkJcmV0dXJuIDE7CisJCQlydm9zdGVwcy0tOworCQl9CisJfQorCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgxIGVyciwgY3VycmZpZCBjaGFuZ2VkIDB4JXhcbiIsIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJwaDEgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXJldHVybiAwOworfQorCisvKiBQaGFzZSAyIC0gY29yZSBmcmVxdWVuY3kgdHJhbnNpdGlvbiAqLworc3RhdGljIGludCBjb3JlX2ZyZXF1ZW5jeV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkKQoreworCXUzMiB2Y29yZXFmaWQsIHZjb2N1cnJmaWQsIHZjb2ZpZGRpZmYsIHNhdmV2aWQgPSBkYXRhLT5jdXJydmlkOworCisJaWYgKChyZXFmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSAmJiAoZGF0YS0+Y3VycmZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInBoMjogaWxsZWdhbCBsby1sbyB0cmFuc2l0aW9uIDB4JXggMHgleFxuIiwKKwkJCXJlcWZpZCwgZGF0YS0+Y3VycmZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5jdXJyZmlkID09IHJlcWZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwaDIgbnVsbCBmaWQgdHJhbnNpdGlvbiAweCV4XG4iLCBkYXRhLT5jdXJyZmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHByaW50aygicGgyIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgcmVxZmlkIDB4JXhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCwgcmVxZmlkKTsKKworCXZjb3JlcWZpZCA9IGNvbnZlcnRfZmlkX3RvX3Zjb19maWQocmVxZmlkKTsKKwl2Y29jdXJyZmlkID0gY29udmVydF9maWRfdG9fdmNvX2ZpZChkYXRhLT5jdXJyZmlkKTsKKwl2Y29maWRkaWZmID0gdmNvY3VycmZpZCA+IHZjb3JlcWZpZCA/IHZjb2N1cnJmaWQgLSB2Y29yZXFmaWQKKwkgICAgOiB2Y29yZXFmaWQgLSB2Y29jdXJyZmlkOworCisJd2hpbGUgKHZjb2ZpZGRpZmYgPiAyKSB7CisJCWlmIChyZXFmaWQgPiBkYXRhLT5jdXJyZmlkKSB7CisJCQlpZiAoZGF0YS0+Y3VycmZpZCA+IExPX0ZJRF9UQUJMRV9UT1ApIHsKKwkJCQlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLCBkYXRhLT5jdXJyZmlkICsgMikpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAod3JpdGVfbmV3X2ZpZAorCQkJCSAgICAoZGF0YSwgMiArIGNvbnZlcnRfZmlkX3RvX3Zjb19maWQoZGF0YS0+Y3VycmZpZCkpKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh3cml0ZV9uZXdfZmlkKGRhdGEsIGRhdGEtPmN1cnJmaWQgLSAyKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCisJCXZjb2N1cnJmaWQgPSBjb252ZXJ0X2ZpZF90b192Y29fZmlkKGRhdGEtPmN1cnJmaWQpOworCQl2Y29maWRkaWZmID0gdmNvY3VycmZpZCA+IHZjb3JlcWZpZCA/IHZjb2N1cnJmaWQgLSB2Y29yZXFmaWQKKwkJICAgIDogdmNvcmVxZmlkIC0gdmNvY3VycmZpZDsKKwl9CisKKwlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLCByZXFmaWQpKQorCQlyZXR1cm4gMTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZGF0YS0+Y3VycmZpZCAhPSByZXFmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJInBoMjogbWlzbWF0Y2gsIGZhaWxlZCBmaWQgdHJhbnNpdGlvbiwgY3VyciAweCV4LCByZXEgMHgleFxuIiwKKwkJCWRhdGEtPmN1cnJmaWQsIHJlcWZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChzYXZldmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyOiB2aWQgY2hhbmdlZCwgc2F2ZSAweCV4LCBjdXJyIDB4JXhcbiIsCisJCQlzYXZldmlkLCBkYXRhLT5jdXJydmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZHByaW50aygicGgyIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUGhhc2UgMyAtIGNvcmUgdm9sdGFnZSB0cmFuc2l0aW9uIGZsb3cgLi4uIGp1bXAgdG8gdGhlIGZpbmFsIHZpZC4gKi8KK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCkKK3sKKwl1MzIgc2F2ZWZpZCA9IGRhdGEtPmN1cnJmaWQ7CisJdTMyIHNhdmVyZXF2aWQgPSByZXF2aWQ7CisKKwlkcHJpbnRrKCJwaDMgKGNwdSVkKTogc3RhcnRpbmcsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksCisJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJaWYgKHJlcXZpZCAhPSBkYXRhLT5jdXJydmlkKSB7CisJCWlmICh3cml0ZV9uZXdfdmlkKGRhdGEsIHJlcXZpZCkpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgInBoMzogYmFkIGZpZCBjaGFuZ2UsIHNhdmUgMHgleCwgY3VyciAweCV4XG4iLAorCQkJICAgICAgIHNhdmVmaWQsIGRhdGEtPmN1cnJmaWQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoZGF0YS0+Y3VycnZpZCAhPSByZXF2aWQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSAgICAgICAicGgzOiBmYWlsZWQgdmlkIHRyYW5zaXRpb25cbiwgcmVxIDB4JXgsIGN1cnIgMHgleCIsCisJCQkgICAgICAgcmVxdmlkLCBkYXRhLT5jdXJydmlkKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlcmVxdmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJZHByaW50aygicGgzIGZhaWxlZCwgY3VycnZpZCAweCV4XG4iLCBkYXRhLT5jdXJydmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNhdmVmaWQgIT0gZGF0YS0+Y3VycmZpZCkgeworCQlkcHJpbnRrKCJwaDMgZmFpbGVkLCBjdXJyZmlkIGNoYW5nZWQgMHgleFxuIiwKKwkJCWRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJwaDMgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3N1cHBvcnRlZF9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVtYXNrX3Qgb2xkbWFzayA9IENQVV9NQVNLX0FMTDsKKwl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OworCXVuc2lnbmVkIGludCByYyA9IDA7CisKKwlvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJc2NoZWR1bGUoKTsKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiAibGltaXRpbmcgdG8gY3B1ICV1IGZhaWxlZFxuIiwgY3B1KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkKKwkJZ290byBvdXQ7CisKKwllYXggPSBjcHVpZF9lYXgoQ1BVSURfUFJPQ0VTU09SX1NJR05BVFVSRSk7CisJaWYgKCgoZWF4ICYgQ1BVSURfVVNFX1hGQU1fWE1PRCkgIT0gQ1BVSURfVVNFX1hGQU1fWE1PRCkgfHwKKwkgICAgKChlYXggJiBDUFVJRF9YRkFNKSAhPSBDUFVJRF9YRkFNX0s4KSB8fAorCSAgICAoKGVheCAmIENQVUlEX1hNT0QpID4gQ1BVSURfWE1PRF9SRVZfRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlByb2Nlc3NvciBjcHVpZCAleCBub3Qgc3VwcG9ydGVkXG4iLCBlYXgpOworCQlnb3RvIG91dDsKKwl9CisKKwllYXggPSBjcHVpZF9lYXgoQ1BVSURfR0VUX01BWF9DQVBBQklMSVRJRVMpOworCWlmIChlYXggPCBDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiTm8gZnJlcXVlbmN5IGNoYW5nZSBjYXBhYmlsaXRpZXMgZGV0ZWN0ZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwljcHVpZChDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlpZiAoKGVkeCAmIFBfU1RBVEVfVFJBTlNJVElPTl9DQVBBQkxFKSAhPSBQX1NUQVRFX1RSQU5TSVRJT05fQ0FQQUJMRSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXIgc3RhdGUgdHJhbnNpdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gMTsKKworb3V0OgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJc2NoZWR1bGUoKTsKKwlyZXR1cm4gcmM7CisKK30KKworc3RhdGljIGludCBjaGVja19wc3RfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHN0cnVjdCBwc3RfcyAqcHN0LCB1OCBtYXh2aWQpCit7CisJdW5zaWduZWQgaW50IGo7CisJdTggbGFzdGZpZCA9IDB4ZmY7CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykgeworCQlpZiAocHN0W2pdLnZpZCA+IExFQVNUX1ZJRCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmlkICVkIGludmFsaWQgOiAweCV4XG4iLCBqLCBwc3Rbal0udmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChwc3Rbal0udmlkIDwgZGF0YS0+cnZvKSB7CS8qIHZpZCArIHJ2byA+PSAwICovCisJCQlwcmludGsoS0VSTl9FUlIgQkZYICIwIHZpZCBleGNlZWRlZCB3aXRoIHBzdGF0ZSAlZFxuIiwgaik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAocHN0W2pdLnZpZCA8IG1heHZpZCArIGRhdGEtPnJ2bykgewkvKiB2aWQgKyBydm8gPj0gbWF4dmlkICovCisJCQlwcmludGsoS0VSTl9FUlIgQkZYICJtYXh2aWQgZXhjZWVkZWQgd2l0aCBwc3RhdGUgJWRcbiIsIGopOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChwc3Rbal0uZmlkID4gTUFYX0ZJRCkKKwkJICAgIHx8IChwc3Rbal0uZmlkICYgMSkKKwkJICAgIHx8IChqICYmIChwc3Rbal0uZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpKSB7CisJCQkvKiBPbmx5IGZpcnN0IGZpZCBpcyBhbGxvd2VkIHRvIGJlIGluICJsb3ciIHJhbmdlICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0d28gbG93IGZpZHMgLSAlZCA6IDB4JXhcbiIsIGosIHBzdFtqXS5maWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHBzdFtqXS5maWQgPCBsYXN0ZmlkKQorCQkJbGFzdGZpZCA9IHBzdFtqXS5maWQ7CisJfQorCWlmIChsYXN0ZmlkICYgMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsYXN0ZmlkIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxhc3RmaWQgPiBMT19GSURfVEFCTEVfVE9QKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAgImZpcnN0IGZpZCBub3QgZnJvbSBsbyBmcmVxIHRhYmxlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9iYXNpY3Moc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJaW50IGo7CisJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKKwkJaWYgKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBmaWQgMHgleCAoJWQgTUh6KSwgdmlkIDB4JXggKCVkIG1WKVxuIiwgaiwKKwkJCQlkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5pbmRleCAmIDB4ZmYsCisJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5LzEwMDAsCisJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggPj4gOCwKKwkJCQlmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQoZGF0YSwgZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggPj4gOCkpOworCX0KKwlpZiAoZGF0YS0+YmF0cHMpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJPbmx5ICVkIHBzdGF0ZXMgb24gYmF0dGVyeVxuIiwgZGF0YS0+YmF0cHMpOworfQorCitzdGF0aWMgaW50IGZpbGxfcG93ZXJub3dfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHN0cnVjdCBwc3RfcyAqcHN0LCB1OCBtYXh2aWQpCit7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZTsKKwl1bnNpZ25lZCBpbnQgajsKKworCWlmIChkYXRhLT5iYXRwcykgeyAgICAvKiB1c2UgQUNQSSBzdXBwb3J0IHRvIGdldCBmdWxsIHNwZWVkIG9uIG1haW5zIHBvd2VyICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJPbmx5ICVkIHBzdGF0ZXMgdXNhYmxlICh1c2UgQUNQSSBkcml2ZXIgZm9yIGZ1bGwgcmFuZ2VcbiIsIGRhdGEtPmJhdHBzKTsKKwkJZGF0YS0+bnVtcHMgPSBkYXRhLT5iYXRwczsKKwl9CisKKwlmb3IgKCBqPTE7IGo8ZGF0YS0+bnVtcHM7IGorKyApIHsKKwkJaWYgKHBzdFtqLTFdLmZpZCA+PSBwc3Rbal0uZmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJQU1Qgb3V0IG9mIHNlcXVlbmNlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGRhdGEtPm51bXBzIDwgMikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBwIHN0YXRlcyB0byB0cmFuc2l0aW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNoZWNrX3BzdF90YWJsZShkYXRhLCBwc3QsIG1heHZpZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKQorCQkqIChkYXRhLT5udW1wcyArIDEpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3dlcm5vd190YWJsZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwb3dlcm5vd190YWJsZSBtZW1vcnkgYWxsb2MgZmFpbHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaiA9IDA7IGogPCBkYXRhLT5udW1wczsgaisrKSB7CisJCXBvd2Vybm93X3RhYmxlW2pdLmluZGV4ID0gcHN0W2pdLmZpZDsgLyogbG93ZXIgOCBiaXRzICovCisJCXBvd2Vybm93X3RhYmxlW2pdLmluZGV4IHw9IChwc3Rbal0udmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChwc3Rbal0uZmlkKTsKKwl9CisJcG93ZXJub3dfdGFibGVbZGF0YS0+bnVtcHNdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW2RhdGEtPm51bXBzXS5pbmRleCA9IDA7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpIHsKKwkJa2ZyZWUocG93ZXJub3dfdGFibGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkcHJpbnRrKCJjZmlkIDB4JXgsIGN2aWQgMHgleFxuIiwgZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisJZGF0YS0+cG93ZXJub3dfdGFibGUgPSBwb3dlcm5vd190YWJsZTsKKwlwcmludF9iYXNpY3MoZGF0YSk7CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykKKwkJaWYgKChwc3Rbal0uZmlkPT1kYXRhLT5jdXJyZmlkKSAmJiAocHN0W2pdLnZpZD09ZGF0YS0+Y3VycnZpZCkpCisJCQlyZXR1cm4gMDsKKworCWRwcmludGsoImN1cnJmaWQvdmlkIGRvIG5vdCBtYXRjaCBQU1QsIGlnbm9yaW5nXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmluZCBhbmQgdmFsaWRhdGUgdGhlIFBTQi9QU1QgdGFibGUgaW4gQklPUy4gKi8KK3N0YXRpYyBpbnQgZmluZF9wc2JfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHBzYl9zICpwc2I7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIG12czsKKwl1OCBtYXh2aWQ7CisJdTMyIGNwc3QgPSAwOworCXUzMiB0aGlzY3B1aWQ7CisKKwlmb3IgKGkgPSAweGMwMDAwOyBpIDwgMHhmZmZmMDsgaSArPSAweDEwKSB7CisJCS8qIFNjYW4gQklPUyBsb29raW5nIGZvciB0aGUgc2lnbmF0dXJlLiAqLworCQkvKiBJdCBjYW4gbm90IGJlIGF0IGZmZmYwIC0gaXQgaXMgdG9vIGJpZy4gKi8KKworCQlwc2IgPSBwaHlzX3RvX3ZpcnQoaSk7CisJCWlmIChtZW1jbXAocHNiLCBQU0JfSURfU1RSSU5HLCBQU0JfSURfU1RSSU5HX0xFTikgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWRwcmludGsoImZvdW5kIFBTQiBoZWFkZXIgYXQgMHglcFxuIiwgcHNiKTsKKworCQlkcHJpbnRrKCJ0YWJsZSB2ZXJzOiAweCV4XG4iLCBwc2ItPnRhYmxldmVyc2lvbik7CisJCWlmIChwc2ItPnRhYmxldmVyc2lvbiAhPSBQU0JfVkVSU0lPTl8xXzQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gQkZYICJQU0IgdGFibGUgaXMgbm90IHYxLjRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlkcHJpbnRrKCJmbGFnczogMHgleFxuIiwgcHNiLT5mbGFnczEpOworCQlpZiAocHNiLT5mbGFnczEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBCRlggInVua25vd24gZmxhZ3NcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlkYXRhLT52c3RhYmxlID0gcHNiLT52c3RhYmxlOworCQlkcHJpbnRrKCJ2b2x0YWdlIHN0YWJpbGl6YXRpb24gdGltZTogJWQoKjIwdXMpXG4iLCBkYXRhLT52c3RhYmxlKTsKKworCQlkcHJpbnRrKCJmbGFnczI6IDB4JXhcbiIsIHBzYi0+ZmxhZ3MyKTsKKwkJZGF0YS0+cnZvID0gcHNiLT5mbGFnczIgJiAzOworCQlkYXRhLT5pcnQgPSAoKHBzYi0+ZmxhZ3MyKSA+PiAyKSAmIDM7CisJCW12cyA9ICgocHNiLT5mbGFnczIpID4+IDQpICYgMzsKKwkJZGF0YS0+dmlkbXZzID0gMSA8PCBtdnM7CisJCWRhdGEtPmJhdHBzID0gKChwc2ItPmZsYWdzMikgPj4gNikgJiAzOworCisJCWRwcmludGsoInJhbXAgdm9sdGFnZSBvZmZzZXQ6ICVkXG4iLCBkYXRhLT5ydm8pOworCQlkcHJpbnRrKCJpc29jaHJvbm91cyByZWxpZWYgdGltZTogJWRcbiIsIGRhdGEtPmlydCk7CisJCWRwcmludGsoIm1heGltdW0gdm9sdGFnZSBzdGVwOiAlZCAtIDB4JXhcbiIsIG12cywgZGF0YS0+dmlkbXZzKTsKKworCQlkcHJpbnRrKCJudW1wc3Q6IDB4JXhcbiIsIHBzYi0+bnVtX3RhYmxlcyk7CisJCWNwc3QgPSBwc2ItPm51bV90YWJsZXM7CisJCWlmICgocHNiLT5jcHVpZCA9PSAweDAwMDAwZmMwKSB8fCAocHNiLT5jcHVpZCA9PSAweDAwMDAwZmUwKSApeworCQkJdGhpc2NwdWlkID0gY3B1aWRfZWF4KENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUpOworCQkJaWYgKCh0aGlzY3B1aWQgPT0gMHgwMDAwMGZjMCkgfHwgKHRoaXNjcHVpZCA9PSAweDAwMDAwZmUwKSApIHsKKwkJCQljcHN0ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoY3BzdCAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgQkZYICJudW1wc3QgbXVzdCBiZSAxXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZGF0YS0+cGxsbG9jayA9IHBzYi0+cGxsbG9ja3RpbWU7CisJCWRwcmludGsoInBsbGxvY2t0aW1lOiAweCV4ICh1bml0cyAxdXMpXG4iLCBwc2ItPnBsbGxvY2t0aW1lKTsKKwkJZHByaW50aygibWF4ZmlkOiAweCV4XG4iLCBwc2ItPm1heGZpZCk7CisJCWRwcmludGsoIm1heHZpZDogMHgleFxuIiwgcHNiLT5tYXh2aWQpOworCQltYXh2aWQgPSBwc2ItPm1heHZpZDsKKworCQlkYXRhLT5udW1wcyA9IHBzYi0+bnVtcHM7CisJCWRwcmludGsoIm51bXBzdGF0ZXM6IDB4JXhcbiIsIGRhdGEtPm51bXBzKTsKKwkJcmV0dXJuIGZpbGxfcG93ZXJub3dfdGFibGUoZGF0YSwgKHN0cnVjdCBwc3RfcyAqKShwc2IrMSksIG1heHZpZCk7CisJfQorCS8qCisJICogSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIGNvbXBsYWluIHRvIEJJT1MgbWFudWZhY3R1cmVyLiBJZgorCSAqIGhlIHRlbGxzIHlvdSAid2UgZG8gbm90IHN1cHBvcnQgTGludXgiIG9yIHNvbWUgc2ltaWxhcgorCSAqIG5vbnNlbnNlLCByZW1lbWJlciB0aGF0IFdpbmRvd3MgMjAwMCB1c2VzIHRoZSBzYW1lIGxlZ2FjeQorCSAqIG1lY2hhbmlzbSB0aGF0IHRoZSBvbGQgTGludXggUFNCIGRyaXZlciB1c2VzLiBUZWxsIHRoZW0gaXQKKwkgKiBpcyBicm9rZW4gd2l0aCBXaW5kb3dzIDIwMDAuCisJICoKKwkgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBBTUQgZG9jdW1lbnRhdGlvbiBpcyBjaGFwdGVyIDkgaW4gdGhlCisJICogQklPUyBhbmQgS2VybmVsIERldmVsb3BlcidzIEd1aWRlLCB3aGljaCBpcyBhdmFpbGFibGUgb24KKwkgKiB3d3cuYW1kLmNvbQorCSAqLworCXByaW50ayhLRVJOX0VSUiBQRlggIkJJT1MgZXJyb3IgLSBubyBQU0JcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LOF9BQ1BJCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlpZiAoIWRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCkKKwkJcmV0dXJuOworCisJZGF0YS0+aXJ0ID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gSVJUX1NISUZUKSAmIElSVF9NQVNLOworCWRhdGEtPnJ2byA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IFJWT19TSElGVCkgJiBSVk9fTUFTSzsKKwlkYXRhLT5wbGxsb2NrID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gUExMX0xfU0hJRlQpICYgUExMX0xfTUFTSzsKKwlkYXRhLT52aWRtdnMgPSAxIDw8ICgoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBNVlNfU0hJRlQpICYgTVZTX01BU0spOworCWRhdGEtPnZzdGFibGUgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBWU1RfU0hJRlQpICYgVlNUX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJub3dfazhfY3B1X2luaXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY250bG9mcmVxID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBvd2Vybm93X3RhYmxlOworCisJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGRhdGEtPmNwdSkpIHsKKwkJZHByaW50aygicmVnaXN0ZXIgcGVyZm9ybWFuY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogdmVyaWZ5IHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQUNQSSBzdHJ1Y3R1cmVzICovCisJaWYgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA8PSAxKSB7CisJCWRwcmludGsoIk5vIEFDUEkgUC1TdGF0ZXNcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKChkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgfHwKKwkJKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7CisJCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKKwkJCWRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkLAorCQkJZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBmaWxsIGluIGRhdGEtPnBvd2Vybm93X3RhYmxlICovCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKQorCQkqIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgKyAxKSksIEdGUF9LRVJORUwpOworCWlmICghcG93ZXJub3dfdGFibGUpIHsKKwkJZHByaW50aygicG93ZXJub3dfdGFibGUgbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCXUzMiBmaWQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvbnRyb2wgJiBGSURfTUFTSzsKKwkJdTMyIHZpZCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvbnRyb2wgPj4gVklEX1NISUZUKSAmIFZJRF9NQVNLOworCisJCWRwcmludGsoIiAgICVkIDogZmlkIDB4JXgsIHZpZCAweCV4XG4iLCBpLCBmaWQsIHZpZCk7CisKKwkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSBmaWQ7IC8qIGxvd2VyIDggYml0cyAqLworCQlwb3dlcm5vd190YWJsZVtpXS5pbmRleCB8PSAodmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChmaWQpOworCisJCS8qIHZlcmlmeSBmcmVxdWVuY3kgaXMgT0sgKi8KKwkJaWYgKChwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPiAoTUFYX0ZSRVEgKiAxMDAwKSkgfHwKKwkJCShwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPCAoTUlOX0ZSRVEgKiAxMDAwKSkpIHsKKwkJCWRwcmludGsoImludmFsaWQgZnJlcSAldSBrSHosIGlnbm9yaW5nXG4iLCBwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kpOworCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB2ZXJpZnkgdm9sdGFnZSBpcyBPSyAtIEJJT1NzIGFyZSB1c2luZyAib2ZmIiB0byBpbmRpY2F0ZSBpbnZhbGlkICovCisJCWlmICh2aWQgPT0gMHgxZikgeworCQkJZHByaW50aygiaW52YWxpZCB2aWQgJXUsIGlnbm9yaW5nXG4iLCB2aWQpOworCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJY29udGludWU7CisJCX0KKworIAkJaWYgKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pIHsKKyAJCQlpZiAoY250bG9mcmVxKSB7CisgCQkJCS8qIGlmIGJvdGggZW50cmllcyBhcmUgdGhlIHNhbWUsIGlnbm9yZSB0aGlzCisgCQkJCSAqIG9uZS4uLiAKKyAJCQkJICovCisgCQkJCWlmICgocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uZnJlcXVlbmN5KSB8fAorIAkJCQkgICAgKHBvd2Vybm93X3RhYmxlW2ldLmluZGV4ICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uaW5kZXgpKSB7CisgCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJUb28gbWFueSBsbyBmcmVxIHRhYmxlIGVudHJpZXNcbiIpOworIAkJCQkJZ290byBlcnJfb3V0X21lbTsKKyAJCQkJfQorCQkJCQorIAkJCQlkcHJpbnRrKCJkb3VibGUgbG93IGZyZXF1ZW5jeSB0YWJsZSBlbnRyeSwgaWdub3JpbmcgaXQuXG4iKTsKKyAJCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworIAkJCQljb250aW51ZTsKKyAJCQl9IGVsc2UKKyAJCQkJY250bG9mcmVxID0gaTsKKwkJfQorCisJCWlmIChwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgIT0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImludmFsaWQgZnJlcSBlbnRyaWVzICV1IGtIeiB2cy4gJXUga0h6XG4iLAorCQkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSwKKwkJCQkodW5zaWduZWQgaW50KSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDApKTsKKwkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcG93ZXJub3dfdGFibGVbZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50XS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlwb3dlcm5vd190YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnRdLmluZGV4ID0gMDsKKwlkYXRhLT5wb3dlcm5vd190YWJsZSA9IHBvd2Vybm93X3RhYmxlOworCisJLyogZmlsbCBpbiBkYXRhICovCisJZGF0YS0+bnVtcHMgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7CisJcHJpbnRfYmFzaWNzKGRhdGEpOworCXBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhkYXRhLCAwKTsKKworCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KKwlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKFRISVNfTU9EVUxFKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X21lbToKKwlrZnJlZShwb3dlcm5vd190YWJsZSk7CisKK2Vycl9vdXQ6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBkYXRhLT5jcHUpOworCisJLyogZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IGluZm9ybXMgdXMgYXQgLT5leGl0KCkgd2hldGhlciBBQ1BJIHdhcyB1c2VkICovCisJZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50ID0gMDsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCWlmIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQpCisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgZGF0YS0+Y3B1KTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgcG93ZXJub3dfazhfY3B1X2luaXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkgeyByZXR1cm4gLUVOT0RFVjsgfQorc3RhdGljIHZvaWQgcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkgeyByZXR1cm47IH0KK3N0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KSB7IHJldHVybjsgfQorI2VuZGlmIC8qIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSSAqLworCisvKiBUYWtlIGEgZnJlcXVlbmN5LCBhbmQgaXNzdWUgdGhlIGZpZC92aWQgdHJhbnNpdGlvbiBjb21tYW5kICovCitzdGF0aWMgaW50IHRyYW5zaXRpb25fZnJlcXVlbmN5KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdTMyIGZpZDsKKwl1MzIgdmlkOworCWludCByZXM7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisKKwlkcHJpbnRrKCJjcHUgJWQgdHJhbnNpdGlvbiB0byBpbmRleCAldVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbmRleCk7CisKKwkvKiBmaWQgYXJlIHRoZSBsb3dlciA4IGJpdHMgb2YgdGhlIGluZGV4IHdlIHN0b3JlZCBpbnRvCisJICogdGhlIGNwdWZyZXEgZnJlcXVlbmN5IHRhYmxlIGluIGZpbmRfcHNiX3RhYmxlLCB2aWQgYXJlIAorCSAqIHRoZSB1cHBlciA4IGJpdHMuCisJICovCisKKwlmaWQgPSBkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGOworCXZpZCA9IChkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGMDApID4+IDg7CisKKwlkcHJpbnRrKCJ0YWJsZSBtYXRjaGVkIGZpZCAweCV4LCBnaXZpbmcgdmlkIDB4JXhcbiIsIGZpZCwgdmlkKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGRhdGEtPmN1cnJ2aWQgPT0gdmlkKSAmJiAoZGF0YS0+Y3VycmZpZCA9PSBmaWQpKSB7CisJCWRwcmludGsoInRhcmdldCBtYXRjaGVzIGN1cnJlbnQgdmFsdWVzIChmaWQgMHgleCwgdmlkIDB4JXgpXG4iLAorCQkJZmlkLCB2aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pICYmIChkYXRhLT5jdXJyZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpIHsKKwkJcHJpbnRrKCJpZ25vcmluZyBpbGxlZ2FsIGNoYW5nZSBpbiBsbyBmcmVxIHRhYmxlLSV4IHRvIDB4JXhcbiIsCisJCSAgICAgICBkYXRhLT5jdXJyZmlkLCBmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJjcHUgJWQsIGNoYW5naW5nIHRvIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBmaWQsIHZpZCk7CisKKwlmcmVxcy5jcHUgPSBkYXRhLT5jcHU7CisKKwlmcmVxcy5vbGQgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCWZyZXFzLm5ldyA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZmlkKTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJZG93bigmZmlkdmlkX3NlbSk7CisJcmVzID0gdHJhbnNpdGlvbl9maWRfdmlkKGRhdGEsIGZpZCwgdmlkKTsKKwl1cCgmZmlkdmlkX3NlbSk7CisKKwlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIHJlczsKK30KKworLyogRHJpdmVyIGVudHJ5IHBvaW50IHRvIHN3aXRjaCB0byB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSAqLworc3RhdGljIGludCBwb3dlcm5vd2s4X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCwgdW5zaWduZWQgdGFyZ2ZyZXEsIHVuc2lnbmVkIHJlbGF0aW9uKQoreworCWNwdW1hc2tfdCBvbGRtYXNrID0gQ1BVX01BU0tfQUxMOworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtwb2wtPmNwdV07CisJdTMyIGNoZWNrZmlkID0gZGF0YS0+Y3VycmZpZDsKKwl1MzIgY2hlY2t2aWQgPSBkYXRhLT5jdXJydmlkOworCXVuc2lnbmVkIGludCBuZXdzdGF0ZTsKKwlpbnQgcmV0ID0gLUVJTzsKKworCS8qIG9ubHkgcnVuIG9uIHNwZWNpZmljIENQVSBmcm9tIGhlcmUgb24gKi8KKwlvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUocG9sLT5jcHUpKTsKKwlzY2hlZHVsZSgpOworCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBwb2wtPmNwdSkgeworCQlwcmludGsoS0VSTl9FUlIgImxpbWl0aW5nIHRvIGNwdSAldSBmYWlsZWRcbiIsIHBvbC0+Y3B1KTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChwZW5kaW5nX2JpdF9zdHVjaygpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxpbmcgdGFyZywgY2hhbmdlIHBlbmRpbmcgYml0IHNldFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkcHJpbnRrKCJ0YXJnOiBjcHUgJWQsICVkIGtIeiwgbWluICVkLCBtYXggJWQsIHJlbGF0aW9uICVkXG4iLAorCQlwb2wtPmNwdSwgdGFyZ2ZyZXEsIHBvbC0+bWluLCBwb2wtPm1heCwgcmVsYXRpb24pOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkcHJpbnRrKCJ0YXJnOiBjdXJyIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlpZiAoKGNoZWNrdmlkICE9IGRhdGEtPmN1cnJ2aWQpIHx8IChjaGVja2ZpZCAhPSBkYXRhLT5jdXJyZmlkKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiZXJyb3IgLSBvdXQgb2Ygc3luYywgZmlkIDB4JXggMHgleCwgdmlkIDB4JXggMHgleFxuIiwKKwkJICAgICAgIGNoZWNrZmlkLCBkYXRhLT5jdXJyZmlkLCBjaGVja3ZpZCwgZGF0YS0+Y3VycnZpZCk7CisJfQorCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2wsIGRhdGEtPnBvd2Vybm93X3RhYmxlLCB0YXJnZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCWdvdG8gZXJyX291dDsKKworCXBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhkYXRhLCBuZXdzdGF0ZSk7CisKKwlpZiAodHJhbnNpdGlvbl9mcmVxdWVuY3koZGF0YSwgbmV3c3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRyYW5zaXRpb24gZnJlcXVlbmN5IGZhaWxlZFxuIik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJcmV0ID0gMDsKKworZXJyX291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCXNjaGVkdWxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBEcml2ZXIgZW50cnkgcG9pbnQgdG8gdmVyaWZ5IHRoZSBwb2xpY3kgYW5kIHJhbmdlIG9mIGZyZXF1ZW5jaWVzICovCitzdGF0aWMgaW50IHBvd2Vybm93azhfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sKQoreworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtwb2wtPmNwdV07CisKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbCwgZGF0YS0+cG93ZXJub3dfdGFibGUpOworfQorCisvKiBwZXIgQ1BVIGluaXQgZW50cnkgcG9pbnQgdG8gdGhlIGRyaXZlciAqLworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3drOF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCkKK3sKKwlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YTsKKwljcHVtYXNrX3Qgb2xkbWFzayA9IENQVV9NQVNLX0FMTDsKKwlpbnQgcmM7CisKKwlpZiAoIWNoZWNrX3N1cHBvcnRlZF9jcHUocG9sLT5jcHUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2MgcG93ZXJub3dfazhfZGF0YSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRhdGEsMCxzaXplb2Yoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEpKTsKKworCWRhdGEtPmNwdSA9IHBvbC0+Y3B1OworCisJaWYgKHBvd2Vybm93X2s4X2NwdV9pbml0X2FjcGkoZGF0YSkpIHsKKwkJLyoKKwkJICogVXNlIHRoZSBQU0IgQklPUyBzdHJ1Y3R1cmUuIFRoaXMgaXMgb25seSBhdmFpbGFiZSBvbgorCQkgKiBhbiBVUCB2ZXJzaW9uLCBhbmQgaXMgZGVwcmVjYXRlZCBieSBBTUQuCisJCSAqLworCisJCWlmICgobnVtX29ubGluZV9jcHVzKCkgIT0gMSkgfHwgKG51bV9wb3NzaWJsZV9jcHVzKCkgIT0gMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJNUCBzeXN0ZW1zIG5vdCBzdXBwb3J0ZWQgYnkgUFNCIEJJT1Mgc3RydWN0dXJlXG4iKTsKKwkJCWtmcmVlKGRhdGEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKHBvbC0+Y3B1ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImluaXQgbm90IGNwdSAwXG4iKTsKKwkJCWtmcmVlKGRhdGEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcmMgPSBmaW5kX3BzYl90YWJsZShkYXRhKTsKKwkJaWYgKHJjKSB7CisJCQlrZnJlZShkYXRhKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogb25seSBydW4gb24gc3BlY2lmaWMgQ1BVIGZyb20gaGVyZSBvbiAqLworCW9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShwb2wtPmNwdSkpOworCXNjaGVkdWxlKCk7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IHBvbC0+Y3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiAibGltaXRpbmcgdG8gY3B1ICV1IGZhaWxlZFxuIiwgcG9sLT5jcHUpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKHBlbmRpbmdfYml0X3N0dWNrKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGluZyBpbml0LCBjaGFuZ2UgcGVuZGluZyBiaXQgc2V0XG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJZ290byBlcnJfb3V0OworCisJZmlkdmlkX21zcl9pbml0KCk7CisKKwkvKiBydW4gb24gYW55IENQVSBhZ2FpbiAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJc2NoZWR1bGUoKTsKKworCXBvbC0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisKKwkvKiBUYWtlIGEgY3J1ZGUgZ3Vlc3MgaGVyZS4gCisJICogVGhhdCBndWVzcyB3YXMgaW4gbWljcm9zZWNvbmRzLCBzbyBtdWx0aXBseSB3aXRoIDEwMDAgKi8KKwlwb2wtPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gKCgoZGF0YS0+cnZvICsgOCkgKiBkYXRhLT52c3RhYmxlICogVlNUX1VOSVRTXzIwVVMpCisJICAgICsgKDMgKiAoMSA8PCBkYXRhLT5pcnQpICogMTApKSAqIDEwMDA7CisKKwlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJZHByaW50aygicG9saWN5IGN1cnJlbnQgZnJlcXVlbmN5ICVkIGtIelxuIiwgcG9sLT5jdXIpOworCisJLyogbWluL21heCB0aGUgY3B1IGlzIGNhcGFibGUgb2YgKi8KKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2wsIGRhdGEtPnBvd2Vybm93X3RhYmxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIHBvd2Vybm93X3RhYmxlXG4iKTsKKwkJcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShkYXRhKTsKKwkJa2ZyZWUoZGF0YS0+cG93ZXJub3dfdGFibGUpOworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+cG93ZXJub3dfdGFibGUsIHBvbC0+Y3B1KTsKKworCXByaW50aygiY3B1X2luaXQgZG9uZSwgY3VycmVudCBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCisJICAgICAgIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJcG93ZXJub3dfZGF0YVtwb2wtPmNwdV0gPSBkYXRhOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKKwlzY2hlZHVsZSgpOworCXBvd2Vybm93X2s4X2NwdV9leGl0X2FjcGkoZGF0YSk7CisKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcG93ZXJub3drOF9jcHVfZXhpdCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wpCit7CisJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEgPSBwb3dlcm5vd19kYXRhW3BvbC0+Y3B1XTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKGRhdGEpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9sLT5jcHUpOworCisJa2ZyZWUoZGF0YS0+cG93ZXJub3dfdGFibGUpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3drOF9nZXQgKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEgPSBwb3dlcm5vd19kYXRhW2NwdV07CisJY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJdW5zaWduZWQgaW50IGtoeiA9IDA7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxpbWl0aW5nIHRvIENQVSAlZCBmYWlsZWQgaW4gcG93ZXJub3drOF9nZXRcbiIsIGNwdSk7CisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJCXJldHVybiAwOworCX0KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJZ290byBvdXQ7CisKKwlraHogPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCisgb3V0OgorCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCisJcmV0dXJuIGtoejsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHBvd2Vybm93X2s4X2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgY3B1ZnJlcV9hbWQ2NF9kcml2ZXIgPSB7CisJLnZlcmlmeSA9IHBvd2Vybm93azhfdmVyaWZ5LAorCS50YXJnZXQgPSBwb3dlcm5vd2s4X3RhcmdldCwKKwkuaW5pdCA9IHBvd2Vybm93azhfY3B1X2luaXQsCisJLmV4aXQgPSBfX2RldmV4aXRfcChwb3dlcm5vd2s4X2NwdV9leGl0KSwKKwkuZ2V0ID0gcG93ZXJub3drOF9nZXQsCisJLm5hbWUgPSAicG93ZXJub3ctazgiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5hdHRyID0gcG93ZXJub3dfazhfYXR0ciwKK307CisKKy8qIGRyaXZlciBlbnRyeSBwb2ludCBmb3IgaW5pdCAqLworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3drOF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIHN1cHBvcnRlZF9jcHVzID0gMDsKKworCWZvciAoaT0wOyBpPE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9vbmxpbmUoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrX3N1cHBvcnRlZF9jcHUoaSkpCisJCQlzdXBwb3J0ZWRfY3B1cysrOworCX0KKworCWlmIChzdXBwb3J0ZWRfY3B1cyA9PSBudW1fb25saW5lX2NwdXMoKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgJWQgQU1EIEF0aGxvbiA2NCAvIE9wdGVyb24gcHJvY2Vzc29ycyAoIiBWRVJTSU9OICIpXG4iLAorCQkJc3VwcG9ydGVkX2NwdXMpOworCQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmNwdWZyZXFfYW1kNjRfZHJpdmVyKTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogZHJpdmVyIGVudHJ5IHBvaW50IGZvciB0ZXJtICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcG93ZXJub3drOF9leGl0KHZvaWQpCit7CisJZHByaW50aygiZXhpdFxuIik7CisKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZjcHVmcmVxX2FtZDY0X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlBhdWwgRGV2cmllbmR0IDxwYXVsLmRldnJpZW5kdEBhbWQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUQgQXRobG9uIDY0IGFuZCBPcHRlcm9uIHByb2Nlc3NvciBmcmVxdWVuY3kgZHJpdmVyLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitsYXRlX2luaXRjYWxsKHBvd2Vybm93azhfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm5vd2s4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgKGMpIDIwMDMsIDIwMDQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogIFlvdXIgdXNlIG9mIHRoaXMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqICBHTlUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSB2ZXJzaW9uIDIuIFNlZSAiQ09QWUlORyIgb3IKKyAqICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKKyAqLworCitzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSB7CisJdW5zaWduZWQgaW50IGNwdTsKKworCXUzMiBudW1wczsgIC8qIG51bWJlciBvZiBwLXN0YXRlcyAqLworCXUzMiBiYXRwczsgIC8qIG51bWJlciBvZiBwLXN0YXRlcyBzdXBwb3J0ZWQgb24gYmF0dGVyeSAqLworCisJLyogdGhlc2UgdmFsdWVzIGFyZSBjb25zdGFudCB3aGVuIHRoZSBQU0IgaXMgdXNlZCB0byBkZXRlcm1pbmUKKwkgKiB2aWQvZmlkIHBhaXJpbmdzLCBidXQgYXJlIG1vZGlmaWVkIGR1cmluZyB0aGUgLT50YXJnZXQoKSBjYWxsCisJICogd2hlbiBBQ1BJIGlzIHVzZWQgKi8KKwl1MzIgcnZvOyAgICAgLyogcmFtcCB2b2x0YWdlIG9mZnNldCAqLworCXUzMiBpcnQ7ICAgICAvKiBpc29jaHJvbm91cyByZWxpZWYgdGltZSAqLworCXUzMiB2aWRtdnM7ICAvKiB1c2FibGUgdmFsdWUgY2FsY3VsYXRlZCBmcm9tIG12cyAqLworCXUzMiB2c3RhYmxlOyAvKiB2b2x0YWdlIHN0YWJpbGl6YXRpb24gdGltZSwgdW5pdHMgMjAgdXMgKi8KKwl1MzIgcGxsbG9jazsgLyogcGxsIGxvY2sgdGltZSwgdW5pdHMgMSB1cyAqLworCisJLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBmaWQgLyB2aWQgKi8KKwl1MzIgY3VycnZpZCwgY3VycmZpZDsKKworCS8qIHRoZSBwb3dlcm5vd190YWJsZSBpbmNsdWRlcyBhbGwgZnJlcXVlbmN5IGFuZCB2aWQvZmlkIHBhaXJpbmdzOgorCSAqIGZpZCBhcmUgdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW5kZXgsIHZpZCBhcmUgdGhlIHVwcGVyIDggYml0cy4KKwkgKiBmcmVxdWVuY3kgaXMgaW4ga0h6ICovCisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICAqcG93ZXJub3dfdGFibGU7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkKKwkvKiB0aGUgYWNwaSB0YWJsZSBuZWVkcyB0byBiZSBrZXB0LiBpdCdzIG9ubHkgYXZhaWxhYmxlIGlmIEFDUEkgd2FzCisJICogdXNlZCB0byBkZXRlcm1pbmUgdmFsaWQgZnJlcXVlbmN5L3ZpZC9maWQgc3RhdGVzICovCisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIGFjcGlfZGF0YTsKKyNlbmRpZgorfTsKKworCisvKiBwcm9jZXNzb3IncyBjcHVpZCBpbnN0cnVjdGlvbiBzdXBwb3J0ICovCisjZGVmaW5lIENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUJMQkvKiBmdW5jdGlvbiAxICovCisjZGVmaW5lIENQVUlEX1hGQU0JCQkweDBmZjAwMDAwCS8qIGV4dGVuZGVkIGZhbWlseSAqLworI2RlZmluZSBDUFVJRF9YRkFNX0s4CQkJMAorI2RlZmluZSBDUFVJRF9YTU9ECQkJMHgwMDBmMDAwMAkvKiBleHRlbmRlZCBtb2RlbCAqLworI2RlZmluZSBDUFVJRF9YTU9EX1JFVl9FCQkweDAwMDIwMDAwCisjZGVmaW5lIENQVUlEX1VTRV9YRkFNX1hNT0QJCTB4MDAwMDBmMDAKKyNkZWZpbmUgQ1BVSURfR0VUX01BWF9DQVBBQklMSVRJRVMJMHg4MDAwMDAwMAorI2RlZmluZSBDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTCTB4ODAwMDAwMDcKKyNkZWZpbmUgUF9TVEFURV9UUkFOU0lUSU9OX0NBUEFCTEUJNgorCisvKiBNb2RlbCBTcGVjaWZpYyBSZWdpc3RlcnMgZm9yIHAtc3RhdGUgdHJhbnNpdGlvbnMuIE1TUnMgYXJlIDY0LWJpdC4gRm9yICAgICAqLworLyogd3JpdGVzICh3cm1zciAtIG9wY29kZSAwZiAzMCksIHRoZSByZWdpc3RlciBudW1iZXIgaXMgcGxhY2VkIGluIGVjeCwgYW5kICAgKi8KKy8qIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBwbGFjZWQgaW4gZWR4OmVheC4gRm9yIHJlYWRzIChyZG1zciAtIG9wY29kZSAwZiAzMiksICovCisvKiB0aGUgcmVnaXN0ZXIgbnVtYmVyIGlzIHBsYWNlZCBpbiBlY3gsIGFuZCB0aGUgZGF0YSBpcyByZXR1cm5lZCBpbiBlZHg6ZWF4LiAqLworCisjZGVmaW5lIE1TUl9GSURWSURfQ1RMICAgICAgMHhjMDAxMDA0MQorI2RlZmluZSBNU1JfRklEVklEX1NUQVRVUyAgIDB4YzAwMTAwNDIKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIExvdyBDb250cm9sIE1TUiA6ICovCisjZGVmaW5lIE1TUl9DX0xPX0lOSVRfRklEX1ZJRCAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBNU1JfQ19MT19ORVdfVklEICAgICAgICAgIDB4MDAwMDFmMDAKKyNkZWZpbmUgTVNSX0NfTE9fTkVXX0ZJRCAgICAgICAgICAweDAwMDAwMDJmCisjZGVmaW5lIE1TUl9DX0xPX1ZJRF9TSElGVCAgICAgICAgOAorCisvKiBGaWVsZCBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIEZJRCBWSUQgSGlnaCBDb250cm9sIE1TUiA6ICovCisjZGVmaW5lIE1TUl9DX0hJX1NUUF9HTlRfVE8gICAgICAgMHgwMDBmZmZmZgorCisvKiBGaWVsZCBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIEZJRCBWSUQgTG93IFN0YXR1cyBNU1IgOiAqLworI2RlZmluZSBNU1JfU19MT19DSEFOR0VfUEVORElORyAgIDB4ODAwMDAwMDAJLyogY2xlYXJlZCB3aGVuIGNvbXBsZXRlZCAqLworI2RlZmluZSBNU1JfU19MT19NQVhfUkFNUF9WSUQgICAgIDB4MWYwMDAwMDAKKyNkZWZpbmUgTVNSX1NfTE9fTUFYX0ZJRCAgICAgICAgICAweDAwM2YwMDAwCisjZGVmaW5lIE1TUl9TX0xPX1NUQVJUX0ZJRCAgICAgICAgMHgwMDAwM2YwMAorI2RlZmluZSBNU1JfU19MT19DVVJSRU5UX0ZJRCAgICAgIDB4MDAwMDAwM2YKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIEhpZ2ggU3RhdHVzIE1TUiA6ICovCisjZGVmaW5lIE1TUl9TX0hJX01BWF9XT1JLSU5HX1ZJRCAgMHgwMDFmMDAwMAorI2RlZmluZSBNU1JfU19ISV9TVEFSVF9WSUQgICAgICAgIDB4MDAwMDFmMDAKKyNkZWZpbmUgTVNSX1NfSElfQ1VSUkVOVF9WSUQgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIE1TUl9DX0hJX1NUUF9HTlRfQkVOSUdOICAgMHgwMDAwMDAwMQorCisvKgorICogVGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmcmVxdWVuY2llcyBoYXZlIHRvIGZvbGxvdzoKKyAqIC0gb25seSAxIGVudHJ5IGluIHRoZSBsb3cgZmlkIHRhYmxlICggPD0xLjRHSHogKQorICogLSBsb3dlc3QgZW50cnkgaW4gdGhlIGhpZ2ggZmlkIHRhYmxlIG11c3QgYmUgPj0gMiAqIHRoZSBlbnRyeSBpbiB0aGUKKyAqICAgbG93IGZpZCB0YWJsZQorICogLSBsb3dlc3QgZW50cnkgaW4gdGhlIGhpZ2ggZmlkIHRhYmxlIG11c3QgYmUgYSA8PSAyMDBNSHogKyAyICogdGhlIGVudHJ5CisgKiAgIGluIHRoZSBsb3cgZmlkIHRhYmxlCisgKiAtIHRoZSBwYXJ0cyBjYW4gb25seSBzdGVwIGF0IDIwMCBNSHogaW50ZXJ2YWxzLCBzbyAxLjkgR0h6IGlzIG5ldmVyIHZhbGlkCisgKiAtIGxvd2VzdCBmcmVxdWVuY3kgbXVzdCBiZSA+PSBpbnRlcnByb2Nlc3NvciBoeXBlcnRyYW5zcG9ydCBsaW5rIHNwZWVkCisgKiAgIChvbmx5IGFwcGxpZXMgdG8gTVAgc3lzdGVtcyBvYnZpb3VzbHkpCisgKi8KKworLyogZmlkcyAoZnJlcXVlbmN5IGlkZW50aWZpZXJzKSBhcmUgYXJyYW5nZWQgaW4gMiB0YWJsZXMgLSBsbyBhbmQgaGkgKi8KKyNkZWZpbmUgTE9fRklEX1RBQkxFX1RPUCAgICAgNgkvKiBmaWQgdmFsdWVzIG1hcmtpbmcgdGhlIGJvdW5kYXJ5ICAgICovCisjZGVmaW5lIEhJX0ZJRF9UQUJMRV9CT1RUT00gIDgJLyogYmV0d2VlbiB0aGUgbG93IGFuZCBoaWdoIHRhYmxlcyAgICAqLworCisjZGVmaW5lIExPX1ZDT0ZSRVFfVEFCTEVfVE9QICAgIDE0MDAJLyogY29ycmVzcG9uZGluZyB2Y28gZnJlcXVlbmN5IHZhbHVlcyAqLworI2RlZmluZSBISV9WQ09GUkVRX1RBQkxFX0JPVFRPTSAxNjAwCisKKyNkZWZpbmUgTUlOX0ZSRVFfUkVTT0xVVElPTiAgMjAwIC8qIGZpZHMganVtcCBieSAyIG1hdGNoaW5nIGZyZXEganVtcHMgYnkgMjAwICovCisKKyNkZWZpbmUgTUFYX0ZJRCAweDJhCS8qIFNwZWMgb25seSBnaXZlcyBGSUQgdmFsdWVzIGFzIGZhciBhcyA1IEdIeiAqLworI2RlZmluZSBMRUFTVF9WSUQgMHgxZQkvKiBMb3dlc3QgKG51bWVyaWNhbGx5IGhpZ2hlc3QpIHVzZWZ1bCB2aWQgdmFsdWUgKi8KKworI2RlZmluZSBNSU5fRlJFUSA4MDAJLyogTWluIGFuZCBtYXggZnJlcXMsIHBlciBzcGVjICovCisjZGVmaW5lIE1BWF9GUkVRIDUwMDAKKworI2RlZmluZSBJTlZBTElEX0ZJRF9NQVNLIDB4ZmZmZmZmYzEgIC8qIG5vdCBhIHZhbGlkIGZpZCBpZiB0aGVzZSBiaXRzIGFyZSBzZXQgKi8KKyNkZWZpbmUgSU5WQUxJRF9WSURfTUFTSyAweGZmZmZmZmUwICAvKiBub3QgYSB2YWxpZCB2aWQgaWYgdGhlc2UgYml0cyBhcmUgc2V0ICovCisKKyNkZWZpbmUgU1RPUF9HUkFOVF81TlMgMSAvKiBtaW4gcG9zcyBtZW1vcnkgYWNjZXNzIGxhdGVuY3kgZm9yIHZvbHRhZ2UgY2hhbmdlICovCisKKyNkZWZpbmUgUExMX0xPQ0tfQ09OVkVSU0lPTiAoMTAwMC81KSAvKiBtcyB0byBucywgdGhlbiBkaXZpZGUgYnkgY2xvY2sgcGVyaW9kICovCisKKyNkZWZpbmUgTUFYSU1VTV9WSURfU1RFUFMgMSAgLyogQ3VycmVudCBjcHVzIG9ubHkgYWxsb3cgYSBzaW5nbGUgc3RlcCBvZiAyNW1WICovCisjZGVmaW5lIFZTVF9VTklUU18yMFVTIDIwICAgLyogVm9sdGFnZSBTdGFiYWxpemF0aW9uIFRpbWUgaXMgaW4gdW5pdHMgb2YgMjB1cyAqLworCisvKgorICogTW9zdCB2YWx1ZXMgb2YgaW50ZXJlc3QgYXJlIGVub2NvZGVkIGluIGEgc2luZ2xlIGZpZWxkIG9mIHRoZSBfUFNTCisgKiBlbnRyaWVzOiB0aGUgImNvbnRyb2wiIHZhbHVlLgorICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIElSVF9TSElGVCAgICAgIDMwCisjZGVmaW5lIFJWT19TSElGVCAgICAgIDI4CisjZGVmaW5lIFBMTF9MX1NISUZUICAgIDIwCisjZGVmaW5lIE1WU19TSElGVCAgICAgIDE4CisjZGVmaW5lIFZTVF9TSElGVCAgICAgIDExCisjZGVmaW5lIFZJRF9TSElGVCAgICAgICA2CisjZGVmaW5lIElSVF9NQVNLICAgICAgICAzCisjZGVmaW5lIFJWT19NQVNLICAgICAgICAzCisjZGVmaW5lIFBMTF9MX01BU0sgICAweDdmCisjZGVmaW5lIE1WU19NQVNLICAgICAgICAzCisjZGVmaW5lIFZTVF9NQVNLICAgICAweDdmCisjZGVmaW5lIFZJRF9NQVNLICAgICAweDFmCisjZGVmaW5lIEZJRF9NQVNLICAgICAweDNmCisKKworLyoKKyAqIFZlcnNpb24gMS40IG9mIHRoZSBQU0IgdGFibGUuIFRoaXMgdGFibGUgaXMgY29uc3RydWN0ZWQgYnkgQklPUyBhbmQgaXMKKyAqIHRvIHRlbGwgdGhlIE9TJ3MgcG93ZXIgbWFuYWdlbWVudCBkcml2ZXIgd2hpY2ggVklEcyBhbmQgRklEcyBhcmUKKyAqIHN1cHBvcnRlZCBieSB0aGlzIHBhcnRpY3VsYXIgcHJvY2Vzc29yLgorICogSWYgdGhlIGRhdGEgaW4gdGhlIFBTQiAvIFBTVCBpcyB3cm9uZywgdGhlbiB0aGlzIGRyaXZlciB3aWxsIHByb2dyYW0gdGhlCisgKiB3cm9uZyB2YWx1ZXMgaW50byBoYXJkd2FyZSwgd2hpY2ggaXMgdmVyeSBsaWtlbHkgdG8gbGVhZCB0byBhIGNyYXNoLgorICovCisKKyNkZWZpbmUgUFNCX0lEX1NUUklORyAgICAgICJBTURLN1BOT1chIgorI2RlZmluZSBQU0JfSURfU1RSSU5HX0xFTiAgMTAKKworI2RlZmluZSBQU0JfVkVSU0lPTl8xXzQgIDB4MTQKKworc3RydWN0IHBzYl9zIHsKKwl1OCBzaWduYXR1cmVbMTBdOworCXU4IHRhYmxldmVyc2lvbjsKKwl1OCBmbGFnczE7CisJdTE2IHZzdGFibGU7CisJdTggZmxhZ3MyOworCXU4IG51bV90YWJsZXM7CisJdTMyIGNwdWlkOworCXU4IHBsbGxvY2t0aW1lOworCXU4IG1heGZpZDsKKwl1OCBtYXh2aWQ7CisJdTggbnVtcHM7Cit9OworCisvKiBQYWlycyBvZiBmaWQvdmlkIHZhbHVlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHZlcnNpb24gMS40IFBTQiB0YWJsZS4gKi8KK3N0cnVjdCBwc3RfcyB7CisJdTggZmlkOworCXU4IHZpZDsKK307CisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAicG93ZXJub3ctazgiLCBtc2cpCisKK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3ByZV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxdmlkKTsKK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCk7CitzdGF0aWMgaW50IGNvcmVfZnJlcXVlbmN5X3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXFmaWQpOworCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q1NjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIGNwdWZyZXEgZHJpdmVyIGZvciBFbmhhbmNlZCBTcGVlZFN0ZXAsIGFzIGZvdW5kIGluIEludGVsJ3MgUGVudGl1bQorICogTSAocGFydCBvZiB0aGUgQ2VudHJpbm8gY2hpcHNldCkuCisgKgorICogRGVzcGl0ZSB0aGUgIlNwZWVkU3RlcCIgaW4gdGhlIG5hbWUsIHRoaXMgaXMgYWxtb3N0IGVudGlyZWx5IHVubGlrZQorICogdHJhZGl0aW9uYWwgU3BlZWRTdGVwLgorICoKKyAqIE1vZGVsbGVkIG9uIHNwZWVkc3RlcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqCisgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICoKKyAqIFRoaXMgZHJpdmVyIG1hbmlwdWxhdGVzIHRoZSBQRVJGX0NUTCBNU1IsIHdoaWNoIGlzIG9ubHkgc29tZXdoYXQKKyAqIGRvY3VtZW50ZWQuICBXaGlsZSBpdCBzZWVtcyB0byB3b3JrIG9uIG15IGxhcHRvcCwgaXQgaGFzIG5vdCBiZWVuCisgKiB0ZXN0ZWQgYW55d2hlcmUgZWxzZSwgYW5kIGl0IG1heSBub3Qgd29yayBmb3IgeW91LCBkbyBzdHJhbmdlCisgKiB0aGluZ3Mgb3Igc2ltcGx5IGNyYXNoLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWVzdC1jb21tb24uaCIKKworI2RlZmluZSBQRlgJCSJzcGVlZHN0ZXAtY2VudHJpbm86ICIKKyNkZWZpbmUgTUFJTlRBSU5FUgkiSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QGdvb3Aub3JnPiIKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJzcGVlZHN0ZXAtY2VudHJpbm8iLCBtc2cpCisKKworc3RydWN0IGNwdV9pZAoreworCV9fdTgJeDg2OyAgICAgICAgICAgIC8qIENQVSBmYW1pbHkgKi8KKwlfX3U4CXg4Nl9tb2RlbDsJLyogbW9kZWwgKi8KKwlfX3U4CXg4Nl9tYXNrOwkvKiBzdGVwcGluZyAqLworfTsKKworZW51bSB7CisJQ1BVX0JBTklBUywKKwlDUFVfRE9USEFOX0ExLAorCUNQVV9ET1RIQU5fQTIsCisJQ1BVX0RPVEhBTl9CMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2lkIGNwdV9pZHNbXSA9IHsKKwlbQ1BVX0JBTklBU10JPSB7IDYsICA5LCA1IH0sCisJW0NQVV9ET1RIQU5fQTFdCT0geyA2LCAxMywgMSB9LAorCVtDUFVfRE9USEFOX0EyXQk9IHsgNiwgMTMsIDIgfSwKKwlbQ1BVX0RPVEhBTl9CMF0JPSB7IDYsIDEzLCA2IH0sCit9OworI2RlZmluZSBOX0lEUwkoc2l6ZW9mKGNwdV9pZHMpL3NpemVvZihjcHVfaWRzWzBdKSkKKworc3RydWN0IGNwdV9tb2RlbAoreworCWNvbnN0IHN0cnVjdCBjcHVfaWQgKmNwdV9pZDsKKwljb25zdCBjaGFyCSptb2RlbF9uYW1lOworCXVuc2lnbmVkCW1heF9mcmVxOyAvKiBtYXggY2xvY2sgaW4ga0h6ICovCisKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKm9wX3BvaW50czsgLyogY2xvY2svdm9sdGFnZSBwYWlycyAqLworfTsKK3N0YXRpYyBpbnQgY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGNvbnN0IHN0cnVjdCBjcHVfaWQgKngpOworCisvKiBPcGVyYXRpbmcgcG9pbnRzIGZvciBjdXJyZW50IENQVSAqLworc3RhdGljIHN0cnVjdCBjcHVfbW9kZWwgKmNlbnRyaW5vX21vZGVsW05SX0NQVVNdOworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfaWQgKmNlbnRyaW5vX2NwdVtOUl9DUFVTXTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjZW50cmlub19kcml2ZXI7CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19UQUJMRQorCisvKiBDb21wdXRlcyB0aGUgY29ycmVjdCBmb3JtIGZvciBJQTMyX1BFUkZfQ1RMIE1TUiBmb3IgYSBwYXJ0aWN1bGFyCisgICBmcmVxdWVuY3kvdm9sdGFnZSBvcGVyYXRpbmcgcG9pbnQ7IGZyZXF1ZW5jeSBpbiBNSHosIHZvbHRzIGluIG1WLgorICAgVGhpcyBpcyBzdG9yZWQgYXMgImluZGV4IiBpbiB0aGUgc3RydWN0dXJlLiAqLworI2RlZmluZSBPUChtaHosIG12KQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuZnJlcXVlbmN5ID0gKG1oeikgKiAxMDAwLAkJCQlcCisJCS5pbmRleCA9ICgoKG1oeikvMTAwKSA8PCA4KSB8ICgobXYgLSA3MDApIC8gMTYpCQlcCisJfQorCisvKgorICogVGhlc2Ugdm9sdGFnZSB0YWJsZXMgd2VyZSBkZXJpdmVkIGZyb20gdGhlIEludGVsIFBlbnRpdW0gTQorICogZGF0YXNoZWV0LCBkb2N1bWVudCAyNTI2MTIwMi5wZGYsIFRhYmxlIDUuICBJIGhhdmUgdmVyaWZpZWQgdGhleQorICogYXJlIGNvbnNpc3RlbnQgd2l0aCBteSBJQk0gVGhpbmtQYWQgWDMxLCB3aGljaCBoYXMgYSAxLjNHSHogUGVudGl1bQorICogTS4KKyAqLworCisvKiBVbHRyYSBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDkwME1IeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfOTAwW10gPQoreworCU9QKDYwMCwgIDg0NCksCisJT1AoODAwLCAgOTg4KSwKKwlPUCg5MDAsIDEwMDQpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIFVsdHJhIExvdyBWb2x0YWdlIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMTAwME1IeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTAwMFtdID0KK3sKKwlPUCg2MDAsICAgODQ0KSwKKwlPUCg4MDAsICAgOTcyKSwKKwlPUCg5MDAsICAgOTg4KSwKKwlPUCgxMDAwLCAxMDA0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuMTBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzExMDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTAyMCksCisJT1AoIDkwMCwgMTEwMCksCisJT1AoMTAwMCwgMTE2NCksCisJT1AoMTEwMCwgMTE4MCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworCisvKiBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuMjBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzEyMDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTAwNCksCisJT1AoIDkwMCwgMTAyMCksCisJT1AoMTAwMCwgMTEwMCksCisJT1AoMTEwMCwgMTE2NCksCisJT1AoMTIwMCwgMTE4MCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjMwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xMzAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEyNjApLAorCU9QKDEwMDAsIDEyOTIpLAorCU9QKDEyMDAsIDEzNTYpLAorCU9QKDEzMDAsIDEzODgpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS40MEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTQwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMTgwKSwKKwlPUCgxMDAwLCAxMzA4KSwKKwlPUCgxMjAwLCAxNDM2KSwKKwlPUCgxNDAwLCAxNDg0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuNTBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzE1MDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTExNiksCisJT1AoMTAwMCwgMTIyOCksCisJT1AoMTIwMCwgMTM1NiksCisJT1AoMTQwMCwgMTQ1MiksCisJT1AoMTUwMCwgMTQ4NCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjYwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xNjAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEwMzYpLAorCU9QKDEwMDAsIDExNjQpLAorCU9QKDEyMDAsIDEyNzYpLAorCU9QKDE0MDAsIDE0MjApLAorCU9QKDE2MDAsIDE0ODQpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS43MEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTcwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMDA0KSwKKwlPUCgxMDAwLCAxMTE2KSwKKwlPUCgxMjAwLCAxMjI4KSwKKwlPUCgxNDAwLCAxMzA4KSwKKwlPUCgxNzAwLCAxNDg0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworI3VuZGVmIE9QCisKKyNkZWZpbmUgX0JBTklBUyhjcHVpZCwgbWF4LCBuYW1lKQlcCit7CS5jcHVfaWQJCT0gY3B1aWQsCVwKKwkubW9kZWxfbmFtZQk9ICJJbnRlbChSKSBQZW50aXVtKFIpIE0gcHJvY2Vzc29yICIgbmFtZSAiTUh6IiwgXAorCS5tYXhfZnJlcQk9IChtYXgpKjEwMDAsCVwKKwkub3BfcG9pbnRzCT0gYmFuaWFzXyMjbWF4LAlcCit9CisjZGVmaW5lIEJBTklBUyhtYXgpCV9CQU5JQVMoJmNwdV9pZHNbQ1BVX0JBTklBU10sIG1heCwgI21heCkKKworLyogQ1BVIG1vZGVscywgdGhlaXIgb3BlcmF0aW5nIGZyZXF1ZW5jeSByYW5nZSwgYW5kIGZyZXEvdm9sdGFnZQorICAgb3BlcmF0aW5nIHBvaW50cyAqLworc3RhdGljIHN0cnVjdCBjcHVfbW9kZWwgbW9kZWxzW10gPQoreworCV9CQU5JQVMoJmNwdV9pZHNbQ1BVX0JBTklBU10sIDkwMCwgIiA5MDAiKSwKKwlCQU5JQVMoMTAwMCksCisJQkFOSUFTKDExMDApLAorCUJBTklBUygxMjAwKSwKKwlCQU5JQVMoMTMwMCksCisJQkFOSUFTKDE0MDApLAorCUJBTklBUygxNTAwKSwKKwlCQU5JQVMoMTYwMCksCisJQkFOSUFTKDE3MDApLAorCisJLyogTlVMTCBtb2RlbF9uYW1lIGlzIGEgd2lsZGNhcmQgKi8KKwl7ICZjcHVfaWRzW0NQVV9ET1RIQU5fQTFdLCBOVUxMLCAwLCBOVUxMIH0sCisJeyAmY3B1X2lkc1tDUFVfRE9USEFOX0EyXSwgTlVMTCwgMCwgTlVMTCB9LAorCXsgJmNwdV9pZHNbQ1BVX0RPVEhBTl9CMF0sIE5VTEwsIDAsIE5VTEwgfSwKKworCXsgTlVMTCwgfQorfTsKKyN1bmRlZiBfQkFOSUFTCisjdW5kZWYgQkFOSUFTCisKK3N0YXRpYyBpbnQgY2VudHJpbm9fY3B1X2luaXRfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjcHUgPSAmY3B1X2RhdGFbcG9saWN5LT5jcHVdOworCXN0cnVjdCBjcHVfbW9kZWwgKm1vZGVsOworCisJZm9yKG1vZGVsID0gbW9kZWxzOyBtb2RlbC0+Y3B1X2lkICE9IE5VTEw7IG1vZGVsKyspCisJCWlmIChjZW50cmlub192ZXJpZnlfY3B1X2lkKGNwdSwgbW9kZWwtPmNwdV9pZCkgJiYKKwkJICAgIChtb2RlbC0+bW9kZWxfbmFtZSA9PSBOVUxMIHx8CisJCSAgICAgc3RyY21wKGNwdS0+eDg2X21vZGVsX2lkLCBtb2RlbC0+bW9kZWxfbmFtZSkgPT0gMCkpCisJCQlicmVhazsKKworCWlmIChtb2RlbC0+Y3B1X2lkID09IE5VTEwpIHsKKwkJLyogTm8gbWF0Y2ggYXQgYWxsICovCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIjogIgorCQkgICAgICAgInNlbmQgL3Byb2MvY3B1aW5mbyB0byAiIE1BSU5UQUlORVIgIlxuIiwKKwkJICAgICAgIGNwdS0+eDg2X21vZGVsX2lkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKG1vZGVsLT5vcF9wb2ludHMgPT0gTlVMTCkgeworCQkvKiBNYXRjaGVkIGEgbm9uLW1hdGNoICovCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gdGFibGUgc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIjogXG4iLAorCQkgICAgICAgY3B1LT54ODZfbW9kZWxfaWQpOworI2lmbmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAidHJ5IGNvbXBpbGluZyB3aXRoIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkgZW5hYmxlZFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdID0gbW9kZWw7CisKKwlkcHJpbnRrKCJmb3VuZCBcIiVzXCI6IG1heCBmcmVxdWVuY3k6ICVka0h6XG4iLAorCSAgICAgICBtb2RlbC0+bW9kZWxfbmFtZSwgbW9kZWwtPm1heF9mcmVxKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY2VudHJpbm9fY3B1X2luaXRfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpIHsgcmV0dXJuIC1FTk9ERVY7IH0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19UQUJMRSAqLworCitzdGF0aWMgaW50IGNlbnRyaW5vX3ZlcmlmeV9jcHVfaWQoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjLCBjb25zdCBzdHJ1Y3QgY3B1X2lkICp4KQoreworCWlmICgoYy0+eDg2ID09IHgtPng4NikgJiYKKwkgICAgKGMtPng4Nl9tb2RlbCA9PSB4LT54ODZfbW9kZWwpICYmCisJICAgIChjLT54ODZfbWFzayA9PSB4LT54ODZfbWFzaykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBUbyBiZSBjYWxsZWQgb25seSBhZnRlciBjZW50cmlub19tb2RlbCBpcyBpbml0aWFsaXplZCAqLworc3RhdGljIHVuc2lnbmVkIGV4dHJhY3RfY2xvY2sodW5zaWduZWQgbXNyLCB1bnNpZ25lZCBpbnQgY3B1LCBpbnQgZmFpbHNhZmUpCit7CisJaW50IGk7CisKKwkvKgorCSAqIEV4dHJhY3QgY2xvY2sgaW4ga0h6IGZyb20gUEVSRl9DVEwgdmFsdWUKKwkgKiBmb3IgY2VudHJpbm8sIGFzIHNvbWUgRFNEVHMgYXJlIGJ1Z2d5LgorCSAqIElkZWFsbHksIHRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIGFjcGlfZGF0YSBzdHJ1Y3R1cmUuCisJICovCisJaWYgKChjZW50cmlub19jcHVbY3B1XSA9PSAmY3B1X2lkc1tDUFVfQkFOSUFTXSkgfHwKKwkgICAgKGNlbnRyaW5vX2NwdVtjcHVdID09ICZjcHVfaWRzW0NQVV9ET1RIQU5fQTFdKSB8fAorCSAgICAoY2VudHJpbm9fY3B1W2NwdV0gPT0gJmNwdV9pZHNbQ1BVX0RPVEhBTl9CMF0pKSB7CisJCW1zciA9IChtc3IgPj4gOCkgJiAweGZmOworCQlyZXR1cm4gbXNyICogMTAwMDAwOworCX0KKworCWlmICgoIWNlbnRyaW5vX21vZGVsW2NwdV0pIHx8ICghY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKSkKKwkJcmV0dXJuIDA7CisKKwltc3IgJj0gMHhmZmZmOworCWZvciAoaT0wO2NlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgeworCQlpZiAobXNyID09IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5pbmRleCkKKwkJCXJldHVybiBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5OworCX0KKwlpZiAoZmFpbHNhZmUpCisJCXJldHVybiBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaS0xXS5mcmVxdWVuY3k7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IENQVSBmcmVxdWVuY3kgaW4ga0h6ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9jdXJfZnJlcSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGwsIGg7CisJdW5zaWduZWQgY2xvY2tfZnJlcTsKKwljcHVtYXNrX3Qgc2F2ZWRfbWFzazsKKworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkKKwkJcmV0dXJuIDA7CisKKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbCwgaCk7CisJY2xvY2tfZnJlcSA9IGV4dHJhY3RfY2xvY2sobCwgY3B1LCAwKTsKKworCWlmICh1bmxpa2VseShjbG9ja19mcmVxID09IDApKSB7CisJCS8qCisJCSAqIE9uIHNvbWUgQ1BVcywgd2UgY2FuIHNlZSB0cmFuc2llbnQgTVNSIHZhbHVlcyAod2hpY2ggYXJlCisJCSAqIG5vdCBwcmVzZW50IGluIF9QU1MpLCB3aGlsZSBDUFUgaXMgZG9pbmcgc29tZSBhdXRvbWF0aWMKKwkJICogUC1zdGF0ZSB0cmFuc2l0aW9uIChsaWtlIFRNMikuIEdldCB0aGUgbGFzdCBmcmVxIHNldCAKKwkJICogaW4gUEVSRl9DVEwuCisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9QRVJGX0NUTCwgbCwgaCk7CisJCWNsb2NrX2ZyZXEgPSBleHRyYWN0X2Nsb2NrKGwsIGNwdSwgMSk7CisJfQorCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwlyZXR1cm4gY2xvY2tfZnJlcTsKK30KKworCisjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCitzdGF0aWMgc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIHA7CisKKy8qCisgKiBjZW50cmlub19jcHVfaW5pdF9hY3BpIC0gcmVnaXN0ZXIgd2l0aCBBQ1BJIFAtU3RhdGVzIGxpYnJhcnkKKyAqCisgKiBSZWdpc3RlciB3aXRoIHRoZSBBQ1BJIFAtU3RhdGVzIGxpYnJhcnkgKHBhcnQgb2YgZHJpdmVycy9hY3BpL3Byb2Nlc3Nvci5jKQorICogaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGNvcnJlY3QgZnJlcXVlbmN5IGFuZCB2b2x0YWdlIHBhaXJpbmdzIGJ5IHJlYWRpbmcKKyAqIHRoZSBfUFNTIG9mIHRoZSBBQ1BJIERTRFQgb3IgU1NEVCB0YWJsZXMuCisgKi8KK3N0YXRpYyBpbnQgY2VudHJpbm9fY3B1X2luaXRfYWNwaShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bmlvbiBhY3BpX29iamVjdAkJYXJnMCA9IHtBQ1BJX1RZUEVfQlVGRkVSfTsKKwl1MzIJCQkJYXJnMF9idWZbM107CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJCWFyZ19saXN0ID0gezEsICZhcmcwfTsKKwl1bnNpZ25lZCBsb25nCQkJY3VyX2ZyZXE7CisJaW50CQkJCXJlc3VsdCA9IDAsIGk7CisJdW5zaWduZWQgaW50CQkJY3B1ID0gcG9saWN5LT5jcHU7CisKKwkvKiBfUERDIHNldHRpbmdzICovCisJYXJnMC5idWZmZXIubGVuZ3RoID0gMTI7CisJYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKKwlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWFyZzBfYnVmWzFdID0gMTsKKwlhcmcwX2J1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCB8IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX01TUjsKKworCXAucGRjID0gJmFyZ19saXN0OworCisJLyogcmVnaXN0ZXIgd2l0aCBBQ1BJIGNvcmUgKi8KKwlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSkpIHsKKwkJZHByaW50ayhLRVJOX0lORk8gUEZYICJvYnRhaW5pbmcgQUNQSSBkYXRhIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHZlcmlmeSB0aGUgYWNwaV9kYXRhICovCisJaWYgKHAuc3RhdGVfY291bnQgPD0gMSkgeworCQlkcHJpbnRrKCJObyBQLVN0YXRlc1xuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCWlmICgocC5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB8fAorCSAgICAocC5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7CisJCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKKwkJCXAuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCwgcC5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwlmb3IgKGk9MDsgaTxwLnN0YXRlX2NvdW50OyBpKyspIHsKKwkJaWYgKHAuc3RhdGVzW2ldLmNvbnRyb2wgIT0gcC5zdGF0ZXNbaV0uc3RhdHVzKSB7CisJCQlkcHJpbnRrKCJEaWZmZXJlbnQgY29udHJvbCAoJXgpIGFuZCBzdGF0dXMgdmFsdWVzICgleClcbiIsCisJCQkJcC5zdGF0ZXNbaV0uY29udHJvbCwgcC5zdGF0ZXNbaV0uc3RhdHVzKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl91bnJlZzsKKwkJfQorCisJCWlmICghcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kpIHsKKwkJCWRwcmludGsoIlplcm8gY29yZSBmcmVxdWVuY3kgZm9yIHN0YXRlICV1XG4iLCBpKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl91bnJlZzsKKwkJfQorCisJCWlmIChwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA+IHAuc3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5KSB7CisJCQlkcHJpbnRrKCJQJXUgaGFzIGxhcmdlciBmcmVxdWVuY3kgKCV1KSB0aGFuIFAwICgldSksIHNraXBwaW5nXG4iLCBpLAorCQkJCXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LCBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSk7CisJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCWNlbnRyaW5vX21vZGVsW2NwdV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1X21vZGVsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZW50cmlub19tb2RlbFtjcHVdKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnOworCX0KKwltZW1zZXQoY2VudHJpbm9fbW9kZWxbY3B1XSwgMCwgc2l6ZW9mKHN0cnVjdCBjcHVfbW9kZWwpKTsKKworCWNlbnRyaW5vX21vZGVsW2NwdV0tPm1vZGVsX25hbWU9TlVMTDsKKwljZW50cmlub19tb2RlbFtjcHVdLT5tYXhfZnJlcSA9IHAuc3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqCisJCQkJCSAgICAgKHAuc3RhdGVfY291bnQgKyAxKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9rZnJlZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPHAuc3RhdGVfY291bnQ7IGkrKykgeworCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXggPSBwLnN0YXRlc1tpXS5jb250cm9sOworCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5ID0gcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQlkcHJpbnRrKCJhZGRpbmcgc3RhdGUgJWkgd2l0aCBmcmVxdWVuY3kgJXUgYW5kIGNvbnRyb2wgdmFsdWUgJTA0eFxuIiwgCisJCQlpLCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5LCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgpOworCX0KKwljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbcC5zdGF0ZV9jb3VudF0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisKKwljdXJfZnJlcSA9IGdldF9jdXJfZnJlcShjcHUpOworCisJZm9yIChpPTA7IGk8cC5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICghcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kpIHsKKwkJCWRwcmludGsoInNraXBwaW5nIHN0YXRlICV1XG4iLCBpKTsKKwkJCWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYgKGV4dHJhY3RfY2xvY2soY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4LCBjcHUsIDApICE9CisJCSAgICAoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSkpIHsKKwkJCWRwcmludGsoIkludmFsaWQgZW5jb2RlZCBmcmVxdWVuY3kgKCV1IHZzLiAldSlcbiIsCisJCQkJZXh0cmFjdF9jbG9jayhjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgsIGNwdSwgMCksCisJCQkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfa2ZyZWVfYWxsOworCQl9CisKKwkJaWYgKGN1cl9mcmVxID09IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kpCisJCQlwLnN0YXRlID0gaTsKKwl9CisKKwkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCisJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisKKwlyZXR1cm4gMDsKKworIGVycl9rZnJlZV9hbGw6CisJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKTsKKyBlcnJfa2ZyZWU6CisJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XSk7CisgZXJyX3VucmVnOgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSk7CisJZHByaW50ayhLRVJOX0lORk8gUEZYICJpbnZhbGlkIEFDUEkgZGF0YVxuIik7CisJcmV0dXJuIChyZXN1bHQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNlbnRyaW5vX2NwdV9pbml0X2FjcGkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpIHsgcmV0dXJuIC1FTk9ERVY7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhW3BvbGljeS0+Y3B1XTsKKwl1bnNpZ25lZCBmcmVxOworCXVuc2lnbmVkIGwsIGg7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIE9ubHkgSW50ZWwgbWFrZXMgRW5oYW5jZWQgU3BlZWRzdGVwLWNhcGFibGUgQ1BVcyAqLworCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IE5fSURTOyBpKyspCisJCWlmIChjZW50cmlub192ZXJpZnlfY3B1X2lkKGNwdSwgJmNwdV9pZHNbaV0pKQorCQkJYnJlYWs7CisKKwlpZiAoaSAhPSBOX0lEUykKKwkJY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSA9ICZjcHVfaWRzW2ldOworCisJaWYgKGlzX2NvbnN0X2xvb3BzX2NwdShwb2xpY3ktPmNwdSkpIHsKKwkJY2VudHJpbm9fZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CisJfQorCisJaWYgKGNlbnRyaW5vX2NwdV9pbml0X2FjcGkocG9saWN5KSkgeworCQlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmICghY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSkgeworCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCB1bnN1cHBvcnRlZCBDUFUgd2l0aCAiCisJCQkiRW5oYW5jZWQgU3BlZWRTdGVwOiBzZW5kIC9wcm9jL2NwdWluZm8gdG8gIgorCQkJTUFJTlRBSU5FUiAiXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJaWYgKGNlbnRyaW5vX2NwdV9pbml0X3RhYmxlKHBvbGljeSkpIHsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogQ2hlY2sgdG8gc2VlIGlmIEVuaGFuY2VkIFNwZWVkU3RlcCBpcyBlbmFibGVkLCBhbmQgdHJ5IHRvCisJICAgZW5hYmxlIGl0IGlmIG5vdC4gKi8KKwlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisKKwlpZiAoIShsICYgKDE8PDE2KSkpIHsKKwkJbCB8PSAoMTw8MTYpOworCQlkcHJpbnRrKCJ0cnlpbmcgdG8gZW5hYmxlIEVuaGFuY2VkIFNwZWVkU3RlcCAoJXgpXG4iLCBsKTsKKwkJd3Jtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCisJCS8qIGNoZWNrIHRvIHNlZSBpZiBpdCBzdHVjayAqLworCQlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisJCWlmICghKGwgJiAoMTw8MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNvdWxkbid0IGVuYWJsZSBFbmhhbmNlZCBTcGVlZFN0ZXBcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlmcmVxID0gZ2V0X2N1cl9mcmVxKHBvbGljeS0+Y3B1KTsKKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwOyAvKiAxMHVTIHRyYW5zaXRpb24gbGF0ZW5jeSAqLworCXBvbGljeS0+Y3VyID0gZnJlcTsKKworCWRwcmludGsoImNlbnRyaW5vX2NwdV9pbml0OiBjdXI9JWRrSHpcbiIsIHBvbGljeS0+Y3VyKTsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBjZW50cmlub19tb2RlbFtwb2xpY3ktPmNwdV0tPm9wX3BvaW50cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIChyZXQpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdLT5vcF9wb2ludHMsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKworCWlmICghY2VudHJpbm9fbW9kZWxbY3B1XSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihjcHUpOworCisjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCWlmICghY2VudHJpbm9fbW9kZWxbY3B1XS0+bW9kZWxfbmFtZSkgeworCQlkcHJpbnRrKCJ1bnJlZ2lzdGVyaW5nIGFuZCBmcmVlaW5nIEFDUEkgZGF0YVxuIik7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSk7CisJCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cyk7CisJCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0pOworCX0KKyNlbmRpZgorCisJY2VudHJpbm9fbW9kZWxbY3B1XSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjZW50cmlub192ZXJpZnkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICoKKyAqIExpbWl0IG11c3QgYmUgd2l0aGluIHRoaXMgbW9kZWwncyBmcmVxdWVuY3kgcmFuZ2UgYXQgbGVhc3Qgb25lCisgKiBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgY2VudHJpbm9fdmVyaWZ5IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdLT5vcF9wb2ludHMpOworfQorCisvKioKKyAqIGNlbnRyaW5vX3NldHBvbGljeSAtIHNldCBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICogQHRhcmdldF9mcmVxOiB0aGUgdGFyZ2V0IGZyZXF1ZW5jeQorICogQHJlbGF0aW9uOiBob3cgdGhhdCBmcmVxdWVuY3kgcmVsYXRlcyB0byBhY2hpZXZlZCBmcmVxdWVuY3kgKENQVUZSRVFfUkVMQVRJT05fTCBvciBDUFVGUkVRX1JFTEFUSU9OX0gpCisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS4KKyAqLworc3RhdGljIGludCBjZW50cmlub190YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKwl1bnNpZ25lZCBpbnQJbXNyLCBvbGRtc3IsIGgsIGNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzCWZyZXFzOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwlpbnQJCQlyZXR2YWw7CisKKwlpZiAoY2VudHJpbm9fbW9kZWxbY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogU3VwcG9ydCBmb3IgU01QIHN5c3RlbXMuCisJICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHRoZSBDUFUgdGhhdCB3YW50cyB0byBjaGFuZ2UgZnJlcXVlbmN5CisJICovCisJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHBvbGljeS0+Y3B1cyk7CisJaWYgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBwb2xpY3ktPmNwdXMpKSB7CisJCWRwcmludGsoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOworCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cywgdGFyZ2V0X2ZyZXEsCisJCQkJCSAgIHJlbGF0aW9uLCAmbmV3c3RhdGUpKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJbXNyID0gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW25ld3N0YXRlXS5pbmRleDsKKwlyZG1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKworCWlmIChtc3IgPT0gKG9sZG1zciAmIDB4ZmZmZikpIHsKKwkJcmV0dmFsID0gMDsKKwkJZHByaW50aygibm8gY2hhbmdlIG5lZWRlZCAtIG1zciB3YXMgYW5kIG5lZWRzIHRvIGJlICV4XG4iLCBvbGRtc3IpOworCQlnb3RvIG1pZ3JhdGVfZW5kOworCX0KKworCWZyZXFzLmNwdSA9IGNwdTsKKwlmcmVxcy5vbGQgPSBleHRyYWN0X2Nsb2NrKG9sZG1zciwgY3B1LCAwKTsKKwlmcmVxcy5uZXcgPSBleHRyYWN0X2Nsb2NrKG1zciwgY3B1LCAwKTsKKworCWRwcmludGsoInRhcmdldD0lZGtIeiBvbGQ9JWQgbmV3PSVkIG1zcj0lMDR4XG4iLAorCQl0YXJnZXRfZnJlcSwgZnJlcXMub2xkLCBmcmVxcy5uZXcsIG1zcik7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogYWxsIGJ1dCAxNiBMU0IgYXJlICJyZXNlcnZlZCIsIHNvIHRyZWF0IHRoZW0gd2l0aAorCSAgIGNhcmUgKi8KKwlvbGRtc3IgJj0gfjB4ZmZmZjsKKwltc3IgJj0gMHhmZmZmOworCW9sZG1zciB8PSBtc3I7CisKKwl3cm1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dmFsID0gMDsKK21pZ3JhdGVfZW5kOgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogY2VudHJpbm9fYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjZW50cmlub19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImNlbnRyaW5vIiwgLyogc2hvdWxkIGJlIHNwZWVkc3RlcC1jZW50cmlubywKKwkJCQkJIGJ1dCB0aGVyZSdzIGEgMTYgY2hhciBsaW1pdCAqLworCS5pbml0CQk9IGNlbnRyaW5vX2NwdV9pbml0LAorCS5leGl0CQk9IGNlbnRyaW5vX2NwdV9leGl0LAorCS52ZXJpZnkJCT0gY2VudHJpbm9fdmVyaWZ5LAorCS50YXJnZXQJCT0gY2VudHJpbm9fdGFyZ2V0LAorCS5nZXQJCT0gZ2V0X2N1cl9mcmVxLAorCS5hdHRyICAgICAgICAgICA9IGNlbnRyaW5vX2F0dHIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworCisvKioKKyAqIGNlbnRyaW5vX2luaXQgLSBpbml0aWFsaXplcyB0aGUgRW5oYW5jZWQgU3BlZWRTdGVwIENQVUZyZXEgZHJpdmVyCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIEVuaGFuY2VkIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24KKyAqIHVuc3VwcG9ydGVkIGRldmljZXMsIC1FTk9FTlQgaWYgdGhlcmUncyBubyB2b2x0YWdlIHRhYmxlIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIENQVSBtb2RlbCwgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sCisgKiBhbmQgemVybyBvbiBzdWNjZXNzLgorICoKKyAqIFRoaXMgaXMgcXVpdGUgcGlja3kuICBOb3Qgb25seSBkb2VzIHRoZSBDUFUgaGF2ZSB0byBhZHZlcnRpc2UgdGhlCisgKiAiZXN0IiBmbGFnIGluIHRoZSBjcHVpZCBjYXBhYmlsaXR5IGZsYWdzLCB3ZSBsb29rIGZvciBhIHNwZWNpZmljCisgKiBDUFUgbW9kZWwgYW5kIHN0ZXBwaW5nLCBhbmQgd2UgbmVlZCB0byBoYXZlIHRoZSBleGFjdCBtb2RlbCBuYW1lIGluCisgKiBvdXIgdm9sdGFnZSB0YWJsZXMuICBUaGF0IGlzLCBiZSBwYXJhbm9pZCBhYm91dCBub3QgcmVsZWFzaW5nCisgKiBzb21lb25lJ3MgdmFsdWFibGUgbWFnaWMgc21va2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNlbnRyaW5vX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmNwdSA9IGNwdV9kYXRhOworCisJaWYgKCFjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmNlbnRyaW5vX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjZW50cmlub19leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmY2VudHJpbm9fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkVuaGFuY2VkIFNwZWVkU3RlcCBkcml2ZXIgZm9yIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChjZW50cmlub19pbml0KTsKK21vZHVsZV9leGl0KGNlbnRyaW5vX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTk5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1lc3QtY29tbW9uLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFJvdXRpbmVzIGNvbW1vbiBmb3IgZHJpdmVycyBoYW5kbGluZyBFbmhhbmNlZCBTcGVlZHN0ZXAgVGVjaG5vbG9neQorICogIENvcHlyaWdodCAoQykgMjAwNCBWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyIC0tIHNlZQorICogIENPUFlJTkcgZm9yIGRldGFpbHMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaXNfY29uc3RfbG9vcHNfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWluZm9feDg2IAkqYyA9IGNwdV9kYXRhICsgY3B1OworCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IG9mIGNwdSBmcmVxCisJICogd2hlbiB3ZSB1c2UgRVNUCisJICovCisJaWYgKGMtPng4NiA9PSAweGYpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZDE4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogKEMpIDIwMDEgIERhdmUgSm9uZXMsIEFyamFuIHZhbiBkZSB2ZW4uCisgKiAoQykgMjAwMiAtIDIwMDMgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICogIEJhc2VkIHVwb24gcmV2ZXJzZSBlbmdpbmVlcmVkIGluZm9ybWF0aW9uLCBhbmQgb24gSW50ZWwgZG9jdW1lbnRhdGlvbgorICogIGZvciBjaGlwc2V0cyBJQ0gyLU0gYW5kIElDSDMtTS4KKyAqCisgKiAgTWFueSB0aGFua3MgdG8gRHVjcm90IEJydW5vIGZvciBmaW5kaW5nIGFuZCBmaXhpbmcgdGhlIGxhc3QKKyAqICAibWlzc2luZyBsaW5rIiBmb3IgSUNIMi1NL0lDSDMtTSBzdXBwb3J0LCBhbmQgdG8gVGhvbWFzIFdpbmtsZXIKKyAqICBmb3IgZXh0ZW5zaXZlIHRlc3RpbmcuCisgKgorICogIEJJRyBGQVQgRElTQ0xBSU1FUjogV29yayBpbiBwcm9ncmVzcyBjb2RlLiBQb3NzaWJseSAqZGFuZ2Vyb3VzKgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICBTUEVFRFNURVAgLSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisKKy8qIHNwZWVkc3RlcF9jaGlwc2V0OgorICogICBJdCBpcyBuZWNlc3NhcnkgdG8ga25vdyB3aGljaCBjaGlwc2V0IGlzIHVzZWQuIEFzIGFjY2Vzc2VzIHRvCisgKiB0aGlzIGRldmljZSBvY2N1ciBhdCB2YXJpb3VzIHBsYWNlcyBpbiB0aGlzIG1vZHVsZSwgd2UgbmVlZCBhCisgKiBzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBwb2ludGluZyB0byB0aGF0IGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzcGVlZHN0ZXBfY2hpcHNldF9kZXY7CisKKworLyogc3BlZWRzdGVwX3Byb2Nlc3NvcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9wcm9jZXNzb3IgPSAwOworCisKKy8qCisgKiAgIFRoZXJlIGFyZSBvbmx5IHR3byBmcmVxdWVuY3kgc3RhdGVzIGZvciBlYWNoIHByb2Nlc3Nvci4gVmFsdWVzCisgKiBhcmUgaW4ga0h6IGZvciB0aGUgdGltZSBiZWluZy4KKyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzcGVlZHN0ZXBfZnJlcXNbXSA9IHsKKwl7U1BFRURTVEVQX0hJR0gsCTB9LAorCXtTUEVFRFNURVBfTE9XLAkJMH0sCisJezAsCQkJQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNwZWVkc3RlcC1pY2giLCBtc2cpCisKKworLyoqCisgKiBzcGVlZHN0ZXBfc2V0X3N0YXRlIC0gc2V0IHRoZSBTcGVlZFN0ZXAgc3RhdGUKKyAqIEBzdGF0ZTogbmV3IHByb2Nlc3NvciBmcmVxdWVuY3kgc3RhdGUgKFNQRUVEU1RFUF9MT1cgb3IgU1BFRURTVEVQX0hJR0gpCisgKgorICogICBUcmllcyB0byBjaGFuZ2UgdGhlIFNwZWVkU3RlcCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgc3BlZWRzdGVwX3NldF9zdGF0ZSAodW5zaWduZWQgaW50IHN0YXRlKQoreworCXUzMiBwbWJhc2U7CisJdTggcG0yX2JsazsKKwl1OCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFzcGVlZHN0ZXBfY2hpcHNldF9kZXYgfHwgKHN0YXRlID4gMHgxKSkKKwkJcmV0dXJuOworCisJLyogZ2V0IFBNQkFTRSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzcGVlZHN0ZXBfY2hpcHNldF9kZXYsIDB4NDAsICZwbWJhc2UpOworCWlmICghKHBtYmFzZSAmIDB4MDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3BlZWRzdGVwLWljaDogY291bGQgbm90IGZpbmQgc3BlZWRzdGVwIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBtYmFzZSAmPSAweEZGRkZGRkZFOworCWlmICghcG1iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3BlZWRzdGVwLWljaDogY291bGQgbm90IGZpbmQgc3BlZWRzdGVwIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERpc2FibGUgSVJRcyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHJlYWQgc3RhdGUgKi8KKwl2YWx1ZSA9IGluYihwbWJhc2UgKyAweDUwKTsKKworCWRwcmludGsoInJlYWQgYXQgcG1iYXNlIDB4JXggKyAweDUwIHJldHVybmVkIDB4JXhcbiIsIHBtYmFzZSwgdmFsdWUpOworCisJLyogd3JpdGUgbmV3IHN0YXRlICovCisJdmFsdWUgJj0gMHhGRTsKKwl2YWx1ZSB8PSBzdGF0ZTsKKworCWRwcmludGsoIndyaXRpbmcgMHgleCB0byBwbWJhc2UgMHgleCArIDB4NTBcbiIsIHZhbHVlLCBwbWJhc2UpOworCisJLyogRGlzYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCisJcG0yX2JsayA9IGluYihwbWJhc2UgKyAweDIwKTsKKwlwbTJfYmxrIHw9IDB4MDE7CisJb3V0YihwbTJfYmxrLCAocG1iYXNlICsgMHgyMCkpOworCisJLyogQWN0dWFsIHRyYW5zaXRpb24gKi8KKwlvdXRiKHZhbHVlLCAocG1iYXNlICsgMHg1MCkpOworCisJLyogUmVzdG9yZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCisJcG0yX2JsayAmPSAweGZlOworCW91dGIocG0yX2JsaywgKHBtYmFzZSArIDB4MjApKTsKKworCS8qIGNoZWNrIGlmIHRyYW5zaXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwl2YWx1ZSA9IGluYihwbWJhc2UgKyAweDUwKTsKKworCS8qIEVuYWJsZSBJUlFzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJZHByaW50aygicmVhZCBhdCBwbWJhc2UgMHgleCArIDB4NTAgcmV0dXJuZWQgMHgleFxuIiwgcG1iYXNlLCB2YWx1ZSk7CisKKwlpZiAoc3RhdGUgPT0gKHZhbHVlICYgMHgxKSkgeworCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZFxuIiwgKHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKSAvIDEwMDApKTsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fRVJSICJjcHVmcmVxOiBjaGFuZ2UgZmFpbGVkIC0gSS9PIGVycm9yXG4iKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfYWN0aXZhdGUgLSBhY3RpdmF0ZSBTcGVlZFN0ZXAgY29udHJvbCBpbiB0aGUgY2hpcHNldAorICoKKyAqICAgVHJpZXMgdG8gYWN0aXZhdGUgdGhlIFNwZWVkU3RlcCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzLgorICogUmV0dXJucyAtRUlOVkFMIG9uIGFuIHVuc3VwcG9ydGVkIGNoaXBzZXQsIGFuZCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2FjdGl2YXRlICh2b2lkKQoreworCXUxNiB2YWx1ZSA9IDA7CisKKwlpZiAoIXNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChzcGVlZHN0ZXBfY2hpcHNldF9kZXYsIDB4MDBBMCwgJnZhbHVlKTsKKwlpZiAoISh2YWx1ZSAmIDB4MDgpKSB7CisJCXZhbHVlIHw9IDB4MDg7CisJCWRwcmludGsoImFjdGl2YXRpbmcgU3BlZWRTdGVwIChUTSkgcmVnaXN0ZXJzXG4iKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwZWVkc3RlcF9jaGlwc2V0X2RldiwgMHgwMEEwLCB2YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQgLSBkZXRlY3QgdGhlIFNvdXRoYnJpZGdlIHdoaWNoIGNvbnRhaW5zIFNwZWVkU3RlcCBsb2dpYworICoKKyAqICAgRGV0ZWN0cyBJQ0gyLU0sIElDSDMtTSBhbmQgSUNINC1NIHNvIGZhci4gVGhlIHBjaV9kZXYgcG9pbnRzIHRvCisgKiB0aGUgTFBDIGJyaWRnZSAvIFBNIG1vZHVsZSB3aGljaCBjb250YWlucyBhbGwgcG93ZXItbWFuYWdlbWVudAorICogZnVuY3Rpb25zLiBSZXR1cm5zIHRoZSBTUEVFRFNURVBfQ0hJUFNFVF8tbnVtYmVyIGZvciB0aGUgZGV0ZWN0ZWQKKyAqIGNoaXBzZXQsIG9yIHplcm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQgKHZvaWQpCit7CisJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMiwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgTlVMTCk7CisJaWYgKHNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIDQ7IC8qIDQtTSAqLworCisJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMiwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgTlVMTCk7CisJaWYgKHNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIDM7IC8qIDMtTSAqLworCisKKwlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEwLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKwlpZiAoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KSB7CisJCS8qIHNwZWVkc3RlcC5jIGNhdXNlcyBsb2NrdXBzIG9uIERlbGwgSW5zcGlyb25zIDgwMDAgYW5kCisJCSAqIDgxMDAgd2hpY2ggdXNlIGEgcHJldHR5IG9sZCByZXZpc2lvbiBvZiB0aGUgODI4MTUKKwkJICogaG9zdCBicmlnZS4gQWJvcnQgb24gdGhlc2Ugc3lzdGVtcy4KKwkJICovCisJCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqaG9zdGJyaWRnZTsKKwkJdTggcmV2ID0gMDsKKworCQlob3N0YnJpZGdlICA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X01DLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKworCQlpZiAoIWhvc3RicmlkZ2UpCisJCQlyZXR1cm4gMjsgLyogMi1NICovCisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaG9zdGJyaWRnZSwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKKwkJaWYgKHJldiA8IDUpIHsKKwkJCWRwcmludGsoImhvc3RicmlkZ2UgZG9lcyBub3Qgc3VwcG9ydCBzcGVlZHN0ZXBcbiIpOworCQkJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gTlVMTDsKKwkJCXBjaV9kZXZfcHV0KGhvc3RicmlkZ2UpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwY2lfZGV2X3B1dChob3N0YnJpZGdlKTsKKwkJcmV0dXJuIDI7IC8qIDItTSAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9zcGVlZHN0ZXBfZ2V0KGNwdW1hc2tfdCBjcHVzKQoreworCXVuc2lnbmVkIGludCBzcGVlZDsKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1cyk7CisJc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koc3BlZWRzdGVwX3Byb2Nlc3Nvcik7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCWRwcmludGsoImRldGVjdGVkICV1IGtIeiBhcyBjdXJyZW50IGZyZXF1ZW5jeVxuIiwgc3BlZWQpOworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIF9zcGVlZHN0ZXBfZ2V0KGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworfQorCisvKioKKyAqIHNwZWVkc3RlcF90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKKwlpbnQgaTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcXMub2xkID0gX3NwZWVkc3RlcF9nZXQocG9saWN5LT5jcHVzKTsKKwlmcmVxcy5uZXcgPSBzcGVlZHN0ZXBfZnJlcXNbbmV3c3RhdGVdLmZyZXF1ZW5jeTsKKwlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKKworCWRwcmludGsoInRyYW5zaXRpbmcgZnJvbSAldSB0byAldSBrSHpcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCS8qIG5vIHRyYW5zaXRpb24gbmVjZXNzYXJ5ICovCisJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCisJCXJldHVybiAwOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJfQorCisJLyogc3dpdGNoIHRvIHBoeXNpY2FsIENQVSB3aGVyZSBzdGF0ZSBpcyB0byBiZSBjaGFuZ2VkICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBwb2xpY3ktPmNwdXMpOworCisJc3BlZWRzdGVwX3NldF9zdGF0ZShuZXdzdGF0ZSk7CisKKwkvKiBhbGxvdyB0byBiZSBydW4gb24gYWxsIENQVXMgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBwb2xpY3ktPmNwdXMpIHsKKwkJZnJlcXMuY3B1ID0gaTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiBzcGVlZHN0ZXBfbG93X2ZyZXEgYW5kIHNwZWVkc3RlcF9oaWdoX2ZyZXEsIHdpdGgKKyAqIGF0IGxlYXN0IG9uZSBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0pOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBzcGVlZDsKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCisJLyogb25seSBydW4gb24gQ1BVIHRvIGJlIHNldCwgb3Igb24gaXRzIHNpYmxpbmcgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJcG9saWN5LT5jcHVzID0gY3B1X3NpYmxpbmdfbWFwW3BvbGljeS0+Y3B1XTsKKyNlbmRpZgorCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgcG9saWN5LT5jcHVzKTsKKworCS8qIGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5ICovCisJcmVzdWx0ID0gc3BlZWRzdGVwX2dldF9mcmVxcyhzcGVlZHN0ZXBfcHJvY2Vzc29yLAorCQkJCSAgICAgJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCisJCQkJICAgICAmc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9ISUdIXS5mcmVxdWVuY3ksCisJCQkJICAgICAmc3BlZWRzdGVwX3NldF9zdGF0ZSk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBnZXQgY3VycmVudCBzcGVlZCBzZXR0aW5nICovCisJc3BlZWQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOworCWlmICghc3BlZWQpCisJCXJldHVybiAtRUlPOworCisJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsCisJCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KSA/ICJsb3ciIDogImhpZ2giLAorCQkoc3BlZWQgLyAxMDAwKSk7CisKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBzcGVlZDsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzcGVlZHN0ZXBfZnJlcXMpOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzcGVlZHN0ZXBfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHNwZWVkc3RlcF9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgc3BlZWRzdGVwX2RyaXZlciA9IHsKKwkubmFtZQk9ICJzcGVlZHN0ZXAtaWNoIiwKKwkudmVyaWZ5CT0gc3BlZWRzdGVwX3ZlcmlmeSwKKwkudGFyZ2V0CT0gc3BlZWRzdGVwX3RhcmdldCwKKwkuaW5pdAk9IHNwZWVkc3RlcF9jcHVfaW5pdCwKKwkuZXhpdAk9IHNwZWVkc3RlcF9jcHVfZXhpdCwKKwkuZ2V0CT0gc3BlZWRzdGVwX2dldCwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuYXR0cgk9IHNwZWVkc3RlcF9hdHRyLAorfTsKKworCisvKioKKyAqIHNwZWVkc3RlcF9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIGRldmljZXMsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybyBvbgorICogc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3BlZWRzdGVwX2luaXQodm9pZCkKK3sKKwkvKiBkZXRlY3QgcHJvY2Vzc29yICovCisJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCk7CisJaWYgKCFzcGVlZHN0ZXBfcHJvY2Vzc29yKSB7CisJCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgY2FwYWJsZSBwcm9jZXNzb3Igbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZGV0ZWN0IGNoaXBzZXQgKi8KKwlpZiAoIXNwZWVkc3RlcF9kZXRlY3RfY2hpcHNldCgpKSB7CisJCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgZm9yIHRoaXMgY2hpcHNldCBub3QgKHlldCkgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGFjdGl2YXRlIHNwZWVkc3RlcCBzdXBwb3J0ICovCisJaWYgKHNwZWVkc3RlcF9hY3RpdmF0ZSgpKSB7CisJCXBjaV9kZXZfcHV0KHNwZWVkc3RlcF9jaGlwc2V0X2Rldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmc3BlZWRzdGVwX2RyaXZlcik7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfZXhpdCAtIHVucmVnaXN0ZXJzIFNwZWVkU3RlcCBzdXBwb3J0CisgKgorICogICBVbnJlZ2lzdGVycyBTcGVlZFN0ZXAgc3VwcG9ydC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNwZWVkc3RlcF9leGl0KHZvaWQpCit7CisJcGNpX2Rldl9wdXQoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KTsKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SICgiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+LCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJbnRlbCBtb2JpbGUgcHJvY2Vzc29ycyBvbiBjaGlwc2V0cyB3aXRoIElDSC1NIHNvdXRoYnJpZGdlcy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KHNwZWVkc3RlcF9pbml0KTsKK21vZHVsZV9leGl0KHNwZWVkc3RlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhNDMwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogKEMpIDIwMDIgLSAyMDAzIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBMaWJyYXJ5IGZvciBjb21tb24gZnVuY3Rpb25zIGZvciBJbnRlbCBTcGVlZFN0ZXAgdi4xIGFuZCB2LjIgc3VwcG9ydAorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNwZWVkc3RlcC1saWIiLCBtc2cpCisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9SRUxBWEVEX0NBUF9DSEVDSworc3RhdGljIGludCByZWxheGVkX2NoZWNrID0gMDsKKyNlbHNlCisjZGVmaW5lIHJlbGF4ZWRfY2hlY2sgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgIEdFVCBQUk9DRVNTT1IgQ09SRSBTUEVFRCBJTiBLSFogICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVudGl1bTNfZ2V0X2ZyZXF1ZW5jeSAodW5zaWduZWQgaW50IHByb2Nlc3NvcikKK3sKKyAgICAgICAgLyogU2VlIHRhYmxlIDE0IG9mIHAzX2RzLnBkZiBhbmQgdGFibGUgMjIgb2YgMjk4MzQwMDMucGRmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHJhdGlvOwkvKiBGcmVxdWVuY3kgTXVsdGlwbGllciAoeDEwKSAqLworCQl1OCBiaXRtYXA7CSAgICAgICAgLyogcG93ZXIgb24gY29uZmlndXJhdGlvbiBiaXRzCisJCQkJCSAgIFsyNywgMjU6MjJdIChpbiBNU1IgMHgyYSkgKi8KKwl9IG1zcl9kZWNvZGVfbXVsdCBbXSA9IHsKKwkJeyAzMCwgMHgwMSB9LAorCQl7IDM1LCAweDA1IH0sCisJCXsgNDAsIDB4MDIgfSwKKwkJeyA0NSwgMHgwNiB9LAorCQl7IDUwLCAweDAwIH0sCisJCXsgNTUsIDB4MDQgfSwKKwkJeyA2MCwgMHgwYiB9LAorCQl7IDY1LCAweDBmIH0sCisJCXsgNzAsIDB4MDkgfSwKKwkJeyA3NSwgMHgwZCB9LAorCQl7IDgwLCAweDBhIH0sCisJCXsgODUsIDB4MjYgfSwKKwkJeyA5MCwgMHgyMCB9LAorCQl7IDEwMCwgMHgyYiB9LAorCQl7IDAsIDB4ZmYgfSAgICAgLyogZXJyb3Igb3IgdW5rbm93biB2YWx1ZSAqLworCX07CisKKwkvKiBQSUlJKC1NKSBGU0Igc2V0dGluZ3M6IHNlZSB0YWJsZSBiMS1iIG9mIDI0NTQ3MjA2LnBkZiAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsgICAgIC8qIEZyb250IFNpZGUgQnVzIHNwZWVkIGluIE1IeiAqLworCQl1OCBiaXRtYXA7ICAgICAgICAgICAgICAvKiBwb3dlciBvbiBjb25maWd1cmF0aW9uIGJpdHMgWzE4OiAxOV0KKwkJCQkJICAgKGluIE1TUiAweDJhKSAqLworCX0gbXNyX2RlY29kZV9mc2IgW10gPSB7CisJCXsgIDY2LCAweDAgfSwKKwkJeyAxMDAsIDB4MiB9LAorCQl7IDEzMywgMHgxIH0sCisJCXsgICAwLCAweGZmfQorCX07CisKKwl1MzIgICAgIG1zcl9sbywgbXNyX3RtcDsKKwlpbnQgICAgIGkgPSAwLCBqID0gMDsKKworCS8qIHJlYWQgTVNSIDB4MmEgLSB3ZSBvbmx5IG5lZWQgdGhlIGxvdyAzMiBiaXRzICovCisJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX3RtcCk7CisJZHByaW50aygiUDMgLSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl90bXApOworCW1zcl90bXAgPSBtc3JfbG87CisKKwkvKiBkZWNvZGUgdGhlIEZTQiAqLworCW1zcl90bXAgJj0gMHgwMGMwMDAwOworCW1zcl90bXAgPj49IDE4OworCXdoaWxlIChtc3JfdG1wICE9IG1zcl9kZWNvZGVfZnNiW2ldLmJpdG1hcCkgeworCQlpZiAobXNyX2RlY29kZV9mc2JbaV0uYml0bWFwID09IDB4ZmYpCisJCQlyZXR1cm4gMDsKKwkJaSsrOworCX0KKworCS8qIGRlY29kZSB0aGUgbXVsdGlwbGllciAqLworCWlmIChwcm9jZXNzb3IgPT0gU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0NfRUFSTFkpIHsKKwkJZHByaW50aygid29ya2Fyb3VuZCBmb3IgZWFybHkgUElJSXNcbiIpOworCQltc3JfbG8gJj0gMHgwM2MwMDAwMDsKKwl9IGVsc2UKKwkJbXNyX2xvICY9IDB4MGJjMDAwMDA7CisJbXNyX2xvID4+PSAyMjsKKwl3aGlsZSAobXNyX2xvICE9IG1zcl9kZWNvZGVfbXVsdFtqXS5iaXRtYXApIHsKKwkJaWYgKG1zcl9kZWNvZGVfbXVsdFtqXS5iaXRtYXAgPT0gMHhmZikKKwkJCXJldHVybiAwOworCQlqKys7CisJfQorCisJZHByaW50aygic3BlZWQgaXMgJXVcbiIsIChtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMCkpOworCisJcmV0dXJuIChtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KHZvaWQpCit7CisJdTMyICAgICBtc3JfbG8sIG1zcl90bXA7CisKKwlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfdG1wKTsKKwlkcHJpbnRrKCJQTSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisKKwkvKiBzZWUgdGFibGUgQi0yIG9mIDI0NTQ3MjEyLnBkZiAqLworCWlmIChtc3JfbG8gJiAweDAwMDQwMDAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzcGVlZHN0ZXAtbGliOiBQTSAtIGludmFsaWQgRlNCOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisJCXJldHVybiAwOworCX0KKworCW1zcl90bXAgPSAobXNyX2xvID4+IDIyKSAmIDB4MWY7CisJZHByaW50aygiYml0cyAyMi0yNiBhcmUgMHgleCwgc3BlZWQgaXMgJXVcbiIsIG1zcl90bXAsIChtc3JfdG1wICogMTAwICogMTAwMCkpOworCisJcmV0dXJuIChtc3JfdG1wICogMTAwICogMTAwMCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtNF9nZXRfZnJlcXVlbmN5KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisJdTMyIG1zcl9sbywgbXNyX2hpLCBtdWx0OworCXVuc2lnbmVkIGludCBmc2IgPSAwOworCisJcmRtc3IoMHgyYywgbXNyX2xvLCBtc3JfaGkpOworCisJZHByaW50aygiUDQgLSBNU1JfRUJDX0ZSRVFVRU5DWV9JRDogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkvKiBkZWNvZGUgdGhlIEZTQjogc2VlIElBLTMyIEludGVsIChDKSBBcmNoaXRlY3R1cmUgU29mdHdhcmUgCisJICogRGV2ZWxvcGVyJ3MgTWFudWFsLCBWb2x1bWUgMzogU3lzdGVtIFByZ3JhbW1pbmcgR3VpZGUsCisJICogcmV2aXNpb24gIzEyIGluIFRhYmxlIEItMTogTVNScyBpbiB0aGUgUGVudGl1bSA0IGFuZAorCSAqIEludGVsIFhlb24gUHJvY2Vzc29ycywgb24gcGFnZSBCLTQgYW5kIEItNS4KKwkgKi8KKwlpZiAoYy0+eDg2X21vZGVsIDwgMikKKwkJZnNiID0gMTAwICogMTAwMDsKKwllbHNlIHsKKwkJdTggZnNiX2NvZGUgPSAobXNyX2xvID4+IDE2KSAmIDB4NzsKKwkJc3dpdGNoIChmc2JfY29kZSkgeworCQljYXNlIDA6CisJCQlmc2IgPSAxMDAgKiAxMDAwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWZzYiA9IDEzMzMzICogMTA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZnNiID0gMjAwICogMTAwMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmc2IpCisJCXByaW50ayhLRVJOX0RFQlVHICJzcGVlZHN0ZXAtbGliOiBjb3VsZG4ndCBkZXRlY3QgRlNCIHNwZWVkLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CisKKwkvKiBNdWx0aXBsaWVyLiAqLworCWlmIChjLT54ODZfbW9kZWwgPCAyKQorCQltdWx0ID0gbXNyX2xvID4+IDI3OworCWVsc2UKKwkJbXVsdCA9IG1zcl9sbyA+PiAyNDsKKworCWRwcmludGsoIlA0IC0gRlNCICV1IGtIejsgTXVsdGlwbGllciAldTsgU3BlZWQgJXUga0h6XG4iLCBmc2IsIG11bHQsIChmc2IgKiBtdWx0KSk7CisKKwlyZXR1cm4gKGZzYiAqIG11bHQpOworfQorCisgCit1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCit7CisJc3dpdGNoIChwcm9jZXNzb3IpIHsKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUE06CisJCXJldHVybiBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KCk7CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RDoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOgorCQlyZXR1cm4gcGVudGl1bTRfZ2V0X2ZyZXF1ZW5jeSgpOworCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX1Q6CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZOgorCQlyZXR1cm4gcGVudGl1bTNfZ2V0X2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX07CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICBERVRFQ1QgU1BFRURTVEVQLUNBUEFCTEUgUFJPQ0VTU09SICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvciAodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKwl1MzIJCQllYngsIG1zcl9sbywgbXNyX2hpOworCisJZHByaW50aygieDg2OiAleCwgbW9kZWw6ICV4XG4iLCBjLT54ODYsIGMtPng4Nl9tb2RlbCk7CisKKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkgfHwgCisJICAgICgoYy0+eDg2ICE9IDYpICYmIChjLT54ODYgIT0gMHhGKSkpCisJCXJldHVybiAwOworCisJaWYgKGMtPng4NiA9PSAweEYpIHsKKwkJLyogSW50ZWwgTW9iaWxlIFBlbnRpdW0gNC1NCisJCSAqIG9yIEludGVsIE1vYmlsZSBQZW50aXVtIDQgd2l0aCA1MzMgTUh6IEZTQiAqLworCQlpZiAoYy0+eDg2X21vZGVsICE9IDIpCisJCQlyZXR1cm4gMDsKKworCQllYnggPSBjcHVpZF9lYngoMHgwMDAwMDAwMSk7CisJCWVieCAmPSAweDAwMDAwMEZGOworCisJCWRwcmludGsoImVieCB2YWx1ZSBpcyAleCwgeDg2X21hc2sgaXMgJXhcbiIsIGVieCwgYy0+eDg2X21hc2spOworCisJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKKwkJY2FzZSA0OiAKKwkJCS8qCisJCQkgKiBCLXN0ZXBwaW5nIFtNLVA0LU1dIAorCQkJICogc2FtcGxlIGhhcyBlYnggPSAweDBmLCBwcm9kdWN0aW9uIGhhcyAweDBlLgorCQkJICovCisJCQlpZiAoKGVieCA9PSAweDBlKSB8fCAoZWJ4ID09IDB4MGYpKQorCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TTsKKwkJCWJyZWFrOworCQljYXNlIDc6IAorCQkJLyoKKwkJCSAqIEMtc3RlcHBpbmcgW00tUDQtTV0KKwkJCSAqIG5lZWRzIHRvIGhhdmUgZWJ4PTB4MGUsIGVsc2UgaXQncyBhIGNlbGVyb246CisJCQkgKiBjZi4gMjUxMzA5MTcucGRmIC8gcGFnZSA3LCBmb290bm90ZSA1IGV2ZW4KKwkJCSAqIHRob3VnaCAyNTA3MjEyMC5wZGYgLyBwYWdlIDcgZG9lc24ndCBzYXkKKwkJCSAqIHNhbXBsZXMgYXJlIG9ubHkgb2YgQi1zdGVwcGluZy4uLgorCQkJICovCisJCQlpZiAoZWJ4ID09IDB4MGUpCisJCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCS8qCisJCQkgKiBELXN0ZXBwaW5nIFtNLVA0LU0gb3IgTS1QNC81MzNdCisJCQkgKgorCQkJICogdGhpcyBpcyB0b3RhbGx5IHN0cmFuZ2U6IENQVUlEIDB4MEYyOSBpcworCQkJICogdXNlZCBieSBNLVA0LU0sIE0tUDQvNTMzIGFuZCghKSBDZWxlcm9uIENQVXMuCisJCQkgKiBUaGUgbGF0dGVyIG5lZWQgdG8gYmUgc29ydGVkIG91dCBhcyB0aGV5IGRvbid0CisJCQkgKiBzdXBwb3J0IHNwZWVkc3RlcC4KKwkJCSAqIENlbGVyb25zIHdpdGggQ1BVSUQgMHgwRjI5IG1heSBoYXZlIGVpdGhlcgorCQkJICogZWJ4PTB4OCBvciAweGYgLS0gMjUxMzA5MTcucGRmIGRvZXNuJ3Qgc2F5IGFueXRoaW5nCisJCQkgKiBzcGVjaWZpYy4KKwkJCSAqIE0tUDQtTXMgbWF5IGhhdmUgZWl0aGVyIGVieD0weGUgb3IgMHhmIFtzZWUgYWJvdmVdCisJCQkgKiBNLVA0LzUzMyBoYXZlIGVpdGhlciBlYng9MHhlIG9yIDB4Zi4gWzI1MzE3NjA3LnBkZl0KKwkJCSAqIGFsc28sIE0tUDRNIEhUcyBoYXZlIGVieD0weDgsIHRvbworCQkJICogRm9yIG5vdywgdGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgbW9kZWxfaWQgc3RyaW5nCisJCQkgKi8KKwkJICAgICAgICBpZiAoKGVieCA9PSAweDBlKSB8fCAoc3Ryc3RyKGMtPng4Nl9tb2RlbF9pZCwiTW9iaWxlIEludGVsKFIpIFBlbnRpdW0oUikgNCIpICE9IE5VTEwpKSAKKwkJCQlyZXR1cm4gU1BFRURTVEVQX1BST0NFU1NPUl9QNE07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CisJY2FzZSAweDBCOiAvKiBJbnRlbCBQSUlJIFtUdWFsYXRpbl0gKi8KKwkJLyogY3B1aWRfZWJ4KDEpIGlzIDB4MDQgZm9yIGRlc2t0b3AgUElJSSwgCisJCSAgICAgICAgICAgICAgICAgICAweDA2IGZvciBtb2JpbGUgUElJSS1NICovCisJCWVieCA9IGNwdWlkX2VieCgweDAwMDAwMDAxKTsKKwkJZHByaW50aygiZWJ4IGlzICV4XG4iLCBlYngpOworCisJCWVieCAmPSAweDAwMDAwMEZGOworCisJCWlmIChlYnggIT0gMHgwNikKKwkJCXJldHVybiAwOworCisJCS8qIFNvIGZhciBhbGwgUElJSS1NIHByb2Nlc3NvcnMgc3VwcG9ydCBTcGVlZFN0ZXAuIFNlZQorCQkgKiBJbnRlbCdzIDI0NTQwNjQwLnBkZiBvZiBKdW5lIDIwMDMgCisJCSAqLworCisJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVDsKKworCWNhc2UgMHgwODogLyogSW50ZWwgUElJSSBbQ29wcGVybWluZV0gKi8KKworCQkvKiBhbGwgbW9iaWxlIFBJSUkgQ29wcGVybWluZXMgaGF2ZSBGU0IgMTAwIE1IegorCQkgKiA9PT4gc29ydCBvdXQgYSBmZXcgZGVza3RvcCBQSUlJcy4gKi8KKwkJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX2hpKTsKKwkJZHByaW50aygiQ29wcGVybWluZTogTVNSX0lBMzJfRUJMX0NSX1BPV0VST04gaXMgMHgleCwgMHgleFxuIiwgbXNyX2xvLCBtc3JfaGkpOworCQltc3JfbG8gJj0gMHgwMGMwMDAwOworCQlpZiAobXNyX2xvICE9IDB4MDA4MDAwMCkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBtb2JpbGUgdmVyc2lvbiwKKwkJICogcGxhdGZvcm0gSUQgaGFzIGJpdCA1MCBzZXQKKwkJICogaXQgaGFzIFNwZWVkU3RlcCB0ZWNobm9sb2d5IGlmIGVpdGhlcgorCQkgKiBiaXQgNTYgb3IgNTcgaXMgc2V0CisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9QTEFURk9STV9JRCwgbXNyX2xvLCBtc3JfaGkpOworCQlkcHJpbnRrKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9QTEFURk9STSBJRCBpcyAweCV4LCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisJCWlmICgobXNyX2hpICYgKDE8PDE4KSkgJiYgKHJlbGF4ZWRfY2hlY2sgPyAxIDogKG1zcl9oaSAmICgzPDwyNCkpKSkgeworCQkJaWYgKGMtPng4Nl9tYXNrID09IDB4MDEpIHsKKwkJCQlkcHJpbnRrKCJlYXJseSBQSUlJIHZlcnNpb25cbiIpOworCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzsKKwkJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgREVURUNUIFNQRUVEU1RFUCBTUEVFRFMgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHVuc2lnbmVkIGludCBwcm9jZXNzb3IsCisJCQkJICB1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKKwkJCQkgIHVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKKwkJCQkgIHZvaWQgKCpzZXRfc3RhdGUpICh1bnNpZ25lZCBpbnQgc3RhdGUpKQoreworCXVuc2lnbmVkIGludCBwcmV2X3NwZWVkOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKCFwcm9jZXNzb3IpIHx8ICghbG93X3NwZWVkKSB8fCAoIWhpZ2hfc3BlZWQpIHx8ICghc2V0X3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGJvdGggc3BlZWRzXG4iKTsKKworCS8qIGdldCBjdXJyZW50IHNwZWVkICovCisJcHJldl9zcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCWlmICghcHJldl9zcGVlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlkcHJpbnRrKCJwcmV2aW91cyBzZXBlZCBpcyAldVxuIiwgcHJldl9zcGVlZCk7CisJCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogc3dpdGNoIHRvIGxvdyBzdGF0ZSAqLworCXNldF9zdGF0ZShTUEVFRFNURVBfTE9XKTsKKwkqbG93X3NwZWVkID0gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHByb2Nlc3Nvcik7CisJaWYgKCEqbG93X3NwZWVkKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoImxvdyBzZXBlZCBpcyAldVxuIiwgKmxvd19zcGVlZCk7CisKKwkvKiBzd2l0Y2ggdG8gaGlnaCBzdGF0ZSAqLworCXNldF9zdGF0ZShTUEVFRFNURVBfSElHSCk7CisJKmhpZ2hfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kocHJvY2Vzc29yKTsKKwlpZiAoISpoaWdoX3NwZWVkKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoImhpZ2ggc2VwZWQgaXMgJXVcbiIsICpoaWdoX3NwZWVkKTsKKworCWlmICgqbG93X3NwZWVkID09ICpoaWdoX3NwZWVkKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN3aXRjaCB0byBwcmV2aW91cyBzdGF0ZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCpoaWdoX3NwZWVkICE9IHByZXZfc3BlZWQpCisJCXNldF9zdGF0ZShTUEVFRFNURVBfTE9XKTsKKworIG91dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIChyZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BlZWRzdGVwX2dldF9mcmVxcyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9SRUxBWEVEX0NBUF9DSEVDSworbW9kdWxlX3BhcmFtKHJlbGF4ZWRfY2hlY2ssIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlbGF4ZWRfY2hlY2ssICJEb24ndCBkbyBhbGwgY2hlY2tzIGZvciBzcGVlZHN0ZXAgY2FwYWJpbGl0eS4iKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SICgiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTGlicmFyeSBmb3IgSW50ZWwgU3BlZWRTdGVwIDEgb3IgMiBjcHVmcmVxIGRyaXZlcnMuIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFhMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIChDKSAyMDAyIC0gMjAwMyBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgTGlicmFyeSBmb3IgY29tbW9uIGZ1bmN0aW9ucyBmb3IgSW50ZWwgU3BlZWRTdGVwIHYuMSBhbmQgdi4yIHN1cHBvcnQKKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworCisKKy8qIHByb2Nlc3NvcnMgKi8KKworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWQkweDAwMDAwMDAxICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KKyNkZWZpbmUgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0MJCTB4MDAwMDAwMDIgIC8qIENvcHBlcm1pbmUgY29yZSAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVCAJCTB4MDAwMDAwMDMgIC8qIFR1YWxhdGluIGNvcmUgKi8KKyNkZWZpbmUgU1BFRURTVEVQX1BST0NFU1NPUl9QNE0JCQkweDAwMDAwMDA0ICAvKiBQNC1NICAqLworCisvKiB0aGUgZm9sbG93aW5nIHByb2Nlc3NvcnMgYXJlIG5vdCBzcGVlZHN0ZXAtY2FwYWJsZSBhbmQgYXJlIG5vdCBhdXRvLWRldGVjdGVkCisgKiBpbiBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpLiBIb3dldmVyLCB0aGVpciBzcGVlZCBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmcKKyAqIHRoZSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koKSBjYWxsLiAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BNCQkJMHhGRkZGRkYwMyAgLyogUGVudGl1bSBNICAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RAkJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCisKKy8qIHNwZWVkc3RlcCBzdGF0ZXMgLS0gb25seSB0d28gb2YgdGhlbSAqLworCisjZGVmaW5lIFNQRUVEU1RFUF9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTUEVFRFNURVBfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworCisvKiBkZXRlY3QgYSBzcGVlZHN0ZXAtY2FwYWJsZSBwcm9jZXNzb3IgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IgKHZvaWQpOworCisvKiBkZXRlY3QgdGhlIGN1cnJlbnQgc3BlZWQgKGluIGtoeikgb2YgdGhlIHByb2Nlc3NvciAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3Nvcik7CisKKworLyogZGV0ZWN0IHRoZSBsb3cgYW5kIGhpZ2ggc3BlZWRzIG9mIHRoZSBwcm9jZXNzb3IuIFRoZSBjYWxsYmFjayAKKyAqIHNldF9zdGF0ZSIncyBmaXJzdCBhcmd1bWVudCBpcyBlaXRoZXIgU1BFRURTVEVQX0hJR0ggb3IgCisgKiBTUEVFRFNURVBfTE9XOyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHplcm8gc28gdGhhdCBubyAKKyAqIGNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24gY2FsbHMgYXJlIGluaXRpYXRlZC4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHVuc2lnbmVkIGludCBwcm9jZXNzb3IsCisJICB1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKKwkgIHVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKKwkgIHZvaWQgKCpzZXRfc3RhdGUpICh1bnNpZ25lZCBpbnQgc3RhdGUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0NDBiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogSW50ZWwgU3BlZWRTdGVwIFNNSSBkcml2ZXIuCisgKgorICogKEMpIDIwMDMgIEhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFNQRUVEU1RFUCAtIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lzdC5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisvKiBzcGVlZHN0ZXAgc3lzdGVtIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHBvcnQvY29tbWFuZC4KKyAqCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBnb3QgZnJvbSBJU1QtU01JIEJJT1MgY2FsbC4KKyAqIElmIHVzZXIgZ2l2ZXMgaXQsIHRoZXNlIGFyZSB1c2VkLgorICogCisgKi8KK3N0YXRpYyBpbnQJCXNtaV9wb3J0CT0gMDsKK3N0YXRpYyBpbnQJCXNtaV9jbWQJCT0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJc21pX3NpZwkJPSAwOworCisvKiBpbmZvIGFib3V0IHRoZSBwcm9jZXNzb3IgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CisKKy8qIAorICogICBUaGVyZSBhcmUgb25seSB0d28gZnJlcXVlbmN5IHN0YXRlcyBmb3IgZWFjaCBwcm9jZXNzb3IuIFZhbHVlcworICogYXJlIGluIGtIeiBmb3IgdGhlIHRpbWUgYmVpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc3BlZWRzdGVwX2ZyZXFzW10gPSB7CisJe1NQRUVEU1RFUF9ISUdILCAJMH0sCisJe1NQRUVEU1RFUF9MT1csCQkwfSwKKwl7MCwJCQlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisjZGVmaW5lIEdFVF9TUEVFRFNURVBfT1dORVIgMAorI2RlZmluZSBHRVRfU1BFRURTVEVQX1NUQVRFIDEKKyNkZWZpbmUgU0VUX1NQRUVEU1RFUF9TVEFURSAyCisjZGVmaW5lIEdFVF9TUEVFRFNURVBfRlJFUVMgNAorCisvKiBob3cgb2Z0ZW4gc2hhbGwgdGhlIFNNSSBjYWxsIGJlIHRyaWVkIGlmIGl0IGZhaWxlZCwgZS5nLiBiZWNhdXNlCisgKiBvZiBETUEgYWN0aXZpdHkgZ29pbmcgb24/ICovCisjZGVmaW5lIFNNSV9UUklFUyA1CisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLXNtaSIsIG1zZykKKworLyoqCisgKiBzcGVlZHN0ZXBfc21pX293bmVyc2hpcAorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwICh2b2lkKQoreworCXUzMiBjb21tYW5kLCByZXN1bHQsIG1hZ2ljOworCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfT1dORVI7CisJdW5zaWduZWQgY2hhciBtYWdpY19kYXRhW10gPSAiQ29weXJpZ2h0IChjKSAxOTk5IEludGVsIENvcnBvcmF0aW9uIjsKKworCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKKwltYWdpYyA9IHZpcnRfdG9fcGh5cyhtYWdpY19kYXRhKTsKKworCWRwcmludGsoInRyeWluZyB0byBvYnRhaW4gb3duZXJzaGlwIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBjb21tYW5kLCBzbWlfcG9ydCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJOiAiPUQiIChyZXN1bHQpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoMCksICJkIiAoc21pX3BvcnQpLCAiRCIgKDApLCAiUyIgKG1hZ2ljKQorCSk7CisKKwlkcHJpbnRrKCJyZXN1bHQgaXMgJXhcbiIsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzIC0gZ2V0IFNwZWVkU3RlcCBwcmVmZXJyZWQgJiBjdXJyZW50IGZyZXEuCisgKiBAbG93OiB0aGUgbG93IGZyZXF1ZW5jeSB2YWx1ZSBpcyBwbGFjZWQgaGVyZQorICogQGhpZ2g6IHRoZSBoaWdoIGZyZXF1ZW5jeSB2YWx1ZSBpcyBwbGFjZWQgaGVyZQorICoKKyAqIE9ubHkgYXZhaWxhYmxlIG9uIGxhdGVyIFNwZWVkU3RlcC1lbmFibGVkIHN5c3RlbXMsIHJldHVybnMgZmFsc2UgcmVzdWx0cyBvcgorICogZXZlbiBoYW5ncyBbY2YuIGJ1Z21lLm9zZGwub3JnICMgMTQyMl0gb24gZWFybGllciBzeXN0ZW1zLiBFbXBpcmljYWwgdGVzdGluZworICogc2hvd3MgdGhhdCB0aGUgbGF0dGVyIG9jY3VycyBpZiAhKGlzdF9pbmZvLmV2ZW50ICYgMHhGRkZGKS4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfc21pX2dldF9mcmVxcyAodW5zaWduZWQgaW50ICpsb3csIHVuc2lnbmVkIGludCAqaGlnaCkKK3sKKwl1MzIgY29tbWFuZCwgcmVzdWx0ID0gMCwgZWRpLCBoaWdoX21oeiwgbG93X21oejsKKwl1MzIgc3RhdGU9MDsKKwl1MzIgZnVuY3Rpb24gPSBHRVRfU1BFRURTVEVQX0ZSRVFTOworCisJaWYgKCEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpKSB7CisJCWRwcmludGsoImJ1ZyAjMTQyMiAtLSBjYW4ndCByZWFkIGZyZXFzIGZyb20gQklPU1xuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29tbWFuZCA9IChzbWlfc2lnICYgMHhmZmZmZmYwMCkgfCAoc21pX2NtZCAmIDB4ZmYpOworCisJZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBmcmVxdWVuY2llcyB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJDAsICUlZWRpXG4iCisJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCisJCTogIj1hIiAocmVzdWx0KSwgIj1iIiAoaGlnaF9taHopLCAiPWMiIChsb3dfbWh6KSwgIj1kIiAoc3RhdGUpLCAiPUQiIChlZGkpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoc3RhdGUpLCAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKQorCSk7CisKKwlkcHJpbnRrKCJyZXN1bHQgJXgsIGxvd19mcmVxICV1LCBoaWdoX2ZyZXEgJXVcbiIsIHJlc3VsdCwgbG93X21oeiwgaGlnaF9taHopOworCisJLyogYWJvcnQgaWYgcmVzdWx0cyBhcmUgb2J2aW91c2x5IGluY29ycmVjdC4uLiAqLworCWlmICgoaGlnaF9taHogKyBsb3dfbWh6KSA8IDYwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqaGlnaCA9IGhpZ2hfbWh6ICogMTAwMDsKKwkqbG93ICA9IGxvd19taHogICogMTAwMDsKKworCXJldHVybiByZXN1bHQ7Cit9IAorCisvKioKKyAqIHNwZWVkc3RlcF9nZXRfc3RhdGUgLSBzZXQgdGhlIFNwZWVkU3RlcCBzdGF0ZQorICogQHN0YXRlOiBwcm9jZXNzb3IgZnJlcXVlbmN5IHN0YXRlIChTUEVFRFNURVBfTE9XIG9yIFNQRUVEU1RFUF9ISUdIKQorICoKKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfZ2V0X3N0YXRlICh2b2lkKQoreworCXUzMiBmdW5jdGlvbj1HRVRfU1BFRURTVEVQX1NUQVRFOworCXUzMiByZXN1bHQsIHN0YXRlLCBlZGksIGNvbW1hbmQ7CisKKwljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgc2V0dGluZyB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJDAsICUlZWRpXG4iCisJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCisJCTogIj1hIiAocmVzdWx0KSwgIj1iIiAoc3RhdGUpLCAiPUQiIChlZGkpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoMCksICJkIiAoc21pX3BvcnQpLCAiUyIgKDApCisJKTsKKworCWRwcmludGsoInN0YXRlIGlzICV4LCByZXN1bHQgaXMgJXhcbiIsIHN0YXRlLCByZXN1bHQpOworCisJcmV0dXJuIChzdGF0ZSAmIDEpOworfQorCisKKy8qKgorICogc3BlZWRzdGVwX3NldF9zdGF0ZSAtIHNldCB0aGUgU3BlZWRTdGVwIHN0YXRlCisgKiBAc3RhdGU6IG5ldyBwcm9jZXNzb3IgZnJlcXVlbmN5IHN0YXRlIChTUEVFRFNURVBfTE9XIG9yIFNQRUVEU1RFUF9ISUdIKQorICoKKyAqLworc3RhdGljIHZvaWQgc3BlZWRzdGVwX3NldF9zdGF0ZSAodW5zaWduZWQgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwLCBjb21tYW5kLCBuZXdfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb249U0VUX1NQRUVEU1RFUF9TVEFURTsKKwl1bnNpZ25lZCBpbnQgcmV0cnkgPSAwOworCisJaWYgKHN0YXRlID4gMHgxKQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlIElSUXMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byBzdGF0ZSAldSB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgc3RhdGUsIGNvbW1hbmQsIHNtaV9wb3J0KTsKKworCWRvIHsKKwkJaWYgKHJldHJ5KSB7CisJCQlkcHJpbnRrKCJyZXRyeSAldSwgcHJldmlvdXMgcmVzdWx0ICV1LCB3YWl0aW5nLi4uXG4iLCByZXRyeSwgcmVzdWx0KTsKKwkJCW1kZWxheShyZXRyeSAqIDUwKTsKKwkJfQorCQlyZXRyeSsrOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZsICQwLCAlJWVkaVxuIgorCQkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJCTogIj1iIiAobmV3X3N0YXRlKSwgIj1EIiAocmVzdWx0KQorCQkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiIChzdGF0ZSksICJkIiAoc21pX3BvcnQpLCAiUyIgKDApCisJCQkpOworCX0gd2hpbGUgKChuZXdfc3RhdGUgIT0gc3RhdGUpICYmIChyZXRyeSA8PSBTTUlfVFJJRVMpKTsKKworCS8qIGVuYWJsZSBJUlFzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKG5ld19zdGF0ZSA9PSBzdGF0ZSkgeworCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZCBhZnRlciAldSB0cmllcyB3aXRoIHJlc3VsdCAldVxuIiwgKHNwZWVkc3RlcF9mcmVxc1tuZXdfc3RhdGVdLmZyZXF1ZW5jeSAvIDEwMDApLCByZXRyeSwgcmVzdWx0KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IGNoYW5nZSBmYWlsZWQgd2l0aCBuZXdfc3RhdGUgJXUgYW5kIHJlc3VsdCAldVxuIiwgbmV3X3N0YXRlLCByZXN1bHQpOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogbmV3IGZyZXEKKyAqIEByZWxhdGlvbjogCisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS9mcmVxLgorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IG5ld3N0YXRlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcXMub2xkID0gc3BlZWRzdGVwX2ZyZXFzW3NwZWVkc3RlcF9nZXRfc3RhdGUoKV0uZnJlcXVlbmN5OworCWZyZXFzLm5ldyA9IHNwZWVkc3RlcF9mcmVxc1tuZXdzdGF0ZV0uZnJlcXVlbmN5OworCWZyZXFzLmNwdSA9IDA7IC8qIHNwZWVkc3RlcC5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisKKwlpZiAoZnJlcXMub2xkID09IGZyZXFzLm5ldykKKwkJcmV0dXJuIDA7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCXNwZWVkc3RlcF9zZXRfc3RhdGUobmV3c3RhdGUpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiBzcGVlZHN0ZXBfbG93X2ZyZXEgYW5kIHNwZWVkc3RlcF9oaWdoX2ZyZXEsIHdpdGgKKyAqIGF0IGxlYXN0IG9uZSBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0pOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IHNwZWVkLHN0YXRlOworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlc3VsdCA9IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwKCk7CisJaWYgKHJlc3VsdCkgeworCQlkcHJpbnRrKCJmYWlscyBpbiBhcXVpcmluZyBvd25lcnNoaXAgb2YgYSBTTUkgaW50ZXJmYWNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5ICovCisJcmVzdWx0ID0gc3BlZWRzdGVwX3NtaV9nZXRfZnJlcXMoJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCisJCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfSElHSF0uZnJlcXVlbmN5KTsKKwlpZiAocmVzdWx0KSB7CisJCS8qIGZhbGwgYmFjayB0byBzcGVlZHN0ZXBfbGliLmMgZGVjdGlvbiBtZWNoYW5pc206IHRyeSBib3RoIHN0YXRlcyBvdXQgKi8KKwkJZHByaW50aygiY291bGQgbm90IGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmNpZXMgYnkgU01JIGNhbGwuXG4iKTsKKwkJcmVzdWx0ID0gc3BlZWRzdGVwX2dldF9mcmVxcyhzcGVlZHN0ZXBfcHJvY2Vzc29yLAorCQkJCSZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5LAorCQkJCSZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0hJR0hdLmZyZXF1ZW5jeSwKKwkJCQkmc3BlZWRzdGVwX3NldF9zdGF0ZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJZHByaW50aygiY291bGQgbm90IGRldGVjdCB0d28gZGlmZmVyZW50IHNwZWVkcyAtLSBhYm9ydGluZy5cbiIpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBlbHNlCisJCQlkcHJpbnRrKCJ3b3JrYXJvdW5kIHdvcmtlZC5cbiIpOworCX0KKworCS8qIGdldCBjdXJyZW50IHNwZWVkIHNldHRpbmcgKi8KKwlzdGF0ZSA9IHNwZWVkc3RlcF9nZXRfc3RhdGUoKTsKKwlzcGVlZCA9IHNwZWVkc3RlcF9mcmVxc1tzdGF0ZV0uZnJlcXVlbmN5OworCisJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsIAorCQkoc3BlZWQgPT0gc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSkgPyAibG93IiA6ICJoaWdoIiwKKwkJKHNwZWVkIC8gMTAwMCkpOworCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gc3BlZWQ7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgc3BlZWRzdGVwX2ZyZXFzKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKyAgICAgICAgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoc3BlZWRzdGVwX2ZyZXFzLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGVlZHN0ZXBfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY3B1KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3Jlc3VtZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpbnQgcmVzdWx0ID0gc3BlZWRzdGVwX3NtaV9vd25lcnNoaXAoKTsKKworCWlmIChyZXN1bHQpCisJCWRwcmludGsoImZhaWxzIGluIHJlLWFxdWlyaW5nIG93bmVyc2hpcCBvZiBhIFNNSSBpbnRlcmZhY2UuXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBzcGVlZHN0ZXBfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBzcGVlZHN0ZXBfZHJpdmVyID0geworCS5uYW1lCQk9ICJzcGVlZHN0ZXAtc21pIiwKKwkudmVyaWZ5IAk9IHNwZWVkc3RlcF92ZXJpZnksCisJLnRhcmdldCAJPSBzcGVlZHN0ZXBfdGFyZ2V0LAorCS5pbml0CQk9IHNwZWVkc3RlcF9jcHVfaW5pdCwKKwkuZXhpdAkJPSBzcGVlZHN0ZXBfY3B1X2V4aXQsCisJLmdldAkJPSBzcGVlZHN0ZXBfZ2V0LAorCS5yZXN1bWUJCT0gc3BlZWRzdGVwX3Jlc3VtZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gc3BlZWRzdGVwX2F0dHIsCit9OworCisvKioKKyAqIHNwZWVkc3RlcF9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIEJJT1MsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybyBvbgorICogc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3BlZWRzdGVwX2luaXQodm9pZCkKK3sKKwlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKTsKKworCXN3aXRjaCAoc3BlZWRzdGVwX3Byb2Nlc3NvcikgeworCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX1Q6CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gMDsKKwl9CisKKwlpZiAoIXNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKKwkJZHByaW50ayAoIk5vIHN1cHBvcnRlZCBJbnRlbCBDUFUgZGV0ZWN0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZHByaW50aygic2lnbmF0dXJlOjB4JS44bHgsIGNvbW1hbmQ6MHglLjhseCwgZXZlbnQ6MHglLjhseCwgcGVyZl9sZXZlbDoweCUuOGx4LlxuIiwgCisJCWlzdF9pbmZvLnNpZ25hdHVyZSwgaXN0X2luZm8uY29tbWFuZCwgaXN0X2luZm8uZXZlbnQsIGlzdF9pbmZvLnBlcmZfbGV2ZWwpOworCisKKwkvKiBFcnJvciBpZiBubyBJU1QtU01JIEJJT1Mgb3Igbm8gUEFSTSAKKwkJIHNpZz0gJ0lTR0UnIGFrYSAnSW50ZWwgU3BlZWRzdGVwIEdhdGUgRScgKi8KKwlpZiAoKGlzdF9pbmZvLnNpZ25hdHVyZSAhPSAgMHg0NzUzNDk0MykgJiYgKCAKKwkgICAgKHNtaV9wb3J0ID09IDApIHx8IChzbWlfY21kID09IDApKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc21pX3NpZyA9PSAxKQorCQlzbWlfc2lnID0gMHg0NzUzNDk0MzsKKwllbHNlCisJCXNtaV9zaWcgPSBpc3RfaW5mby5zaWduYXR1cmU7CisKKwkvKiBzZXR1cCBzbWlfcG9ydCBmcm9tIE1PRExVTEVfUEFSTSBvciBCSU9TICovCisJaWYgKChzbWlfcG9ydCA+IDB4ZmYpIHx8IChzbWlfcG9ydCA8IDApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc21pX3BvcnQgPT0gMCkgeworCQlzbWlfcG9ydCA9IGlzdF9pbmZvLmNvbW1hbmQgJiAweGZmOworCX0KKworCWlmICgoc21pX2NtZCA+IDB4ZmYpIHx8IChzbWlfY21kIDwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzbWlfY21kID09IDApIHsKKwkJc21pX2NtZCA9IChpc3RfaW5mby5jb21tYW5kID4+IDE2KSAmIDB4ZmY7CisJfQorCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF9leGl0IC0gdW5yZWdpc3RlcnMgU3BlZWRTdGVwIHN1cHBvcnQKKyAqCisgKiAgIFVucmVnaXN0ZXJzIFNwZWVkU3RlcCBzdXBwb3J0LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BlZWRzdGVwX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKHNtaV9wb3J0LCAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzbWlfY21kLCAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oc21pX3NpZywgIHVpbnQsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHNtaV9wb3J0LCAiT3ZlcnJpZGUgdGhlIEJJT1MtZ2l2ZW4gSVNUIHBvcnQgd2l0aCB0aGlzIHZhbHVlIC0tIEludGVsJ3MgZGVmYXVsdCBzZXR0aW5nIGlzIDB4YjIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc21pX2NtZCwgIk92ZXJyaWRlIHRoZSBCSU9TLWdpdmVuIElTVCBjb21tYW5kIHdpdGggdGhpcyB2YWx1ZSAtLSBJbnRlbCdzIGRlZmF1bHQgc2V0dGluZyBpcyAweDgyIik7CitNT0RVTEVfUEFSTV9ERVNDKHNtaV9zaWcsICJTZXQgdG8gMSB0byBmYWtlIHRoZSBJU1Qgc2lnbmF0dXJlIHdoZW4gdXNpbmcgdGhlIFNNSSBpbnRlcmZhY2UuIik7CisKK01PRFVMRV9BVVRIT1IgKCJIaXJvc2hpIE1pdXJhIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJU1QgYXBwbGV0IFNNSSBpbnRlcmZhY2UuIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOworCittb2R1bGVfaW5pdChzcGVlZHN0ZXBfaW5pdCk7Cittb2R1bGVfZXhpdChzcGVlZHN0ZXBfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRiMDExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwpAQCAtMCwwICsxLDQzOSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKworLyoKKyAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBkb19jeXJpeF9kZXZpZCh1bnNpZ25lZCBjaGFyICpkaXIwLCB1bnNpZ25lZCBjaGFyICpkaXIxKQoreworCXVuc2lnbmVkIGNoYXIgY2NyMiwgY2NyMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIHdlIHRlc3QgZm9yIERFVklEIGJ5IGNoZWNraW5nIHdoZXRoZXIgQ0NSMyBpcyB3cml0YWJsZSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzIF4gMHg4MCk7CisJZ2V0Q3g4NigweGMwKTsgICAvKiBkdW1teSB0byBjaGFuZ2UgYnVzICovCisKKwlpZiAoZ2V0Q3g4NihDWDg2X0NDUjMpID09IGNjcjMpIHsgICAgICAgLyogbm8gREVWSUQgcmVncy4gKi8KKwkJY2NyMiA9IGdldEN4ODYoQ1g4Nl9DQ1IyKTsKKwkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIgXiAweDA0KTsKKwkJZ2V0Q3g4NigweGMwKTsgIC8qIGR1bW15ICovCisKKwkJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IyKSA9PSBjY3IyKSAvKiBvbGQgQ3g0ODZTTEMvRExDICovCisJCQkqZGlyMCA9IDB4ZmQ7CisJCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3g0ODZTIEEgc3RlcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIpOworCQkJKmRpcjAgPSAweGZlOworCQl9CisJfQorCWVsc2UgeworCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAvKiByZXN0b3JlIENDUjMgKi8KKworCQkvKiByZWFkIERJUjAgYW5kIERJUjEgQ1BVIHJlZ2lzdGVycyAqLworCQkqZGlyMCA9IGdldEN4ODYoQ1g4Nl9ESVIwKTsKKwkJKmRpcjEgPSBnZXRDeDg2KENYODZfRElSMSk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEN4ODZfZGlyMF9tc2IgaXMgYSBIQUNLIG5lZWRlZCBieSBjaGVja19jeDY4Nl9jcHVpZC9zbG9wIGluIGJ1Z3MuaCBpbgorICogb3JkZXIgdG8gaWRlbnRpZnkgdGhlIEN5cml4IENQVSBtb2RlbCBhZnRlciB3ZSdyZSBvdXQgb2Ygc2V0dXAuYworICoKKyAqIEFjdHVhbGx5IHNpbmNlIGJ1Z3MuaCBkb2Vzbid0IGV2ZW4gcmVmZXJlbmNlIHRoaXMgcGVyaGFwcyBzb21lb25lIHNob3VsZAorICogZml4IHRoZSBkb2N1bWVudGF0aW9uID8/PworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBDeDg2X2RpcjBfbXNiIF9faW5pdGRhdGEgPSAwOworCitzdGF0aWMgY2hhciBDeDg2X21vZGVsW11bOV0gX19pbml0ZGF0YSA9IHsKKwkiQ3g0ODYiLCAiQ3g0ODYiLCAiNXg4NiAiLCAiNng4NiIsICJNZWRpYUdYICIsICI2eDg2TVggIiwKKwkiTSBJSSAiLCAiVW5rbm93biIKK307CitzdGF0aWMgY2hhciBDeDQ4Nl9uYW1lW11bNV0gX19pbml0ZGF0YSA9IHsKKwkiU0xDIiwgIkRMQyIsICJTTEMyIiwgIkRMQzIiLCAiU1J4IiwgIkRSeCIsCisJIlNSeDIiLCAiRFJ4MiIKK307CitzdGF0aWMgY2hhciBDeDQ4NlNfbmFtZVtdWzRdIF9faW5pdGRhdGEgPSB7CisJIlMiLCAiUzIiLCAiU2UiLCAiUzJlIgorfTsKK3N0YXRpYyBjaGFyIEN4NDg2RF9uYW1lW11bNF0gX19pbml0ZGF0YSA9IHsKKwkiRFgiLCAiRFgyIiwgIj8iLCAiPyIsICI/IiwgIkRYNCIKK307CitzdGF0aWMgY2hhciBDeDg2X2NiW10gX19pbml0ZGF0YSA9ICI/LjV4IENvcmUvQnVzIENsb2NrIjsKK3N0YXRpYyBjaGFyIGN5cml4X21vZGVsX211bHQxW10gX19pbml0ZGF0YSA9ICIxMj8/NDMiOworc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDJbXSBfX2luaXRkYXRhID0gIjEyMjMzNDQ1IjsKKworLyoKKyAqIFJlc2V0IHRoZSBzbG93LWxvb3AgKFNMT1ApIGJpdCBvbiB0aGUgNjg2KEwpIHdoaWNoIGlzIHNldCBieSBzb21lIG9sZAorICogQklPU2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggRE9TIGdhbWVzLiAgVGhpcyBtYWtlcyB0aGUgdWRlbGF5IGxvb3AKKyAqIHdvcmsgY29ycmVjdGx5LCBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisgKgorICogRklYTUU6IG91ciBuZXdlciB1ZGVsYXkgdXNlcyB0aGUgdHNjLiBXZSBkb24ndCBuZWVkIHRvIGZyb2Igd2l0aCBTTE9QCisgKi8KKworZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpIF9faW5pdDsKKworc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2N4Njg2X3Nsb3Aoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKEN4ODZfZGlyMF9tc2IgPT0gMykgeworCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjU7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCisJCWNjcjUgPSBnZXRDeDg2KENYODZfQ0NSNSk7CisJCWlmIChjY3I1ICYgMikKKwkJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3I1ICYgMHhmZCk7ICAvKiByZXNldCBTTE9QICovCisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWlmIChjY3I1ICYgMikgeyAvKiBwb3NzaWJsZSB3cm9uZyBjYWxpYnJhdGlvbiBkb25lICovCisJCQlwcmludGsoS0VSTl9JTkZPICJSZWNhbGlicmF0aW5nIGRlbGF5IGxvb3Agd2l0aCBTTE9QIGJpdCByZXNldFxuIik7CisJCQljYWxpYnJhdGVfZGVsYXkoKTsKKwkJCWMtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2N4ODZfcmVvcmRlcih2b2lkKQoreworCXU4IGNjcjM7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5IGFjY2VzcyByZW9yZGVyIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTqAgKi8KKworCS8qIExvYWQvU3RvcmUgU2VyaWFsaXplIHRvIG1lbSBhY2Nlc3MgZGlzYWJsZSAoPXJlb3JkZXIgaXQpoCAqLworCXNldEN4ODYoQ1g4Nl9QQ1IwLCBnZXRDeDg2KENYODZfUENSMCkgJiB+MHg4MCk7CisJLyogc2V0IGxvYWQvc3RvcmUgc2VyaWFsaXplIGZyb20gMUdCIHRvIDRHQiAqLworCWNjcjMgfD0gMHhlMDsKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9tZW13Yih2b2lkKQoreworCXUzMiBjcjA7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5LVdyaXRlLWJhY2sgbW9kZSBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CisKKwkvKiBDQ1IyIGJpdCAyOiB1bmxvY2sgTlcgYml0ICovCisJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSAmIH4weDA0KTsKKwkvKiBzZXQgJ05vdCBXcml0ZS10aHJvdWdoJyAqLworCWNyMCA9IDB4MjAwMDAwMDA7CisJX19hc21fXygibW92bCAlJWNyMCwlJWVheFxuXHQiCisJCSJvcmwgJTAsJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwlJWNyMFxuIgorCQk6IDogInIiIChjcjApCisJCToiYXgiKTsKKwkvKiBDQ1IyIGJpdCAyOiBsb2NrIE5XIGJpdCBhbmQgc2V0IFdUMSAqLworCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgfCAweDE0ICk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9pbmModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNjcjM7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgSW5jcmVtZW50b3Igb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOworCisJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU6gICovCisJLyogUENSMSAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCisJLyogSW5jcmVtZW50b3Igb24sIHdoYXRldmVyIHRoYXQgaXMgKi8KKwlzZXRDeDg2KENYODZfUENSMSwgZ2V0Q3g4NihDWDg2X1BDUjEpIHwgMHgwMik7CisJLyogUENSMCAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCisJLyogSW5jcmVtZW50b3IgTWFyZ2luIDEwICovCisJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSB8IDB4MDQpOyAKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CS8qIGRpc2FibGUgTUFQRU4gKi8KK30KKworLyoKKyAqCUNvbmZpZ3VyZSBsYXRlciBNZWRpYUdYIGFuZC9vciBHZW9kZSBwcm9jZXNzb3IuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGdlb2RlX2NvbmZpZ3VyZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggY2NyMywgY2NyNDsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBTdXNwZW5kIG9uIGhhbHQgcG93ZXIgc2F2aW5nIGFuZCBlbmFibGUgI1NVU1AgcGluICovCisJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4ODgpOworCisJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOwkvKiBFbmFibGUgKi8KKwkKKwljY3I0ID0gZ2V0Q3g4NihDWDg2X0NDUjQpOworCWNjcjQgfD0gMHgzODsJCS8qIEZQVSBmYXN0LCBEVEUgY2FjaGUsIE1lbSBieXBhc3MgKi8KKwkKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CisJCisJc2V0X2N4ODZfbWVtd2IoKTsKKwlzZXRfY3g4Nl9yZW9yZGVyKCk7CQorCXNldF9jeDg2X2luYygpOworCQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN5cml4XzU1eDBbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjApIH0sCisJeyB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgY2hhciBkaXIwLCBkaXIwX21zbiwgZGlyMF9sc24sIGRpcjEgPSAwOworCWNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKKwljb25zdCBjaGFyICpwID0gTlVMTDsKKworCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CisJICAgM0ROb3cgaXMgSURkIGJ5IGJpdCAzMSBpbiBleHRlbmRlZCBDUFVJRCAoMSozMiszMSkgYW55d2F5ICovCisJY2xlYXJfYml0KDAqMzIrMzEsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCS8qIEN5cml4IHVzZWQgYml0IDI0IGluIGV4dGVuZGVkIChBTUQpIENQVUlEIGZvciBDeXJpeCBNTVggZXh0ZW5zaW9ucyAqLworCWlmICggdGVzdF9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpICkgeworCQljbGVhcl9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYTU1YLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQorCisJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKKworCWNoZWNrX2N4Njg2X3Nsb3AoYyk7CisKKwlDeDg2X2RpcjBfbXNiID0gZGlyMF9tc24gPSBkaXIwID4+IDQ7IC8qIGlkZW50aWZpZXMgQ1BVICJmYW1pbHkiICAgKi8KKwlkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KKworCS8qIGNvbW1vbiBjYXNlIHN0ZXAgbnVtYmVyL3JldiAtLSBleGNlcHRpb25zIGhhbmRsZWQgYmVsb3cgKi8KKwljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CisJYy0+eDg2X21hc2sgPSBkaXIxICYgMHhmOworCisJLyogTm93IGNvb2s7IHRoZSBvcmlnaW5hbCByZWNpcGUgaXMgYnkgQ2hhbm5pbmcgQ29ybiwgZnJvbSBDeXJpeC4KKwkgKiBXZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZWFjaCBnZW5lcmF0aW9uOiB3ZSB3b3JrIG91dAorCSAqIHRoZSBtb2RlbCwgbXVsdGlwbGllciBhbmQgc3RlcHBpbmcuICBCbGFjayBtYWdpYyBpbmNsdWRlZCwKKwkgKiB0byBtYWtlIHRoZSBzaWxpY29uIHN0ZXAvcmV2IG51bWJlcnMgbWF0Y2ggdGhlIHByaW50ZWQgb25lcy4KKwkgKi8KKwkgCisJc3dpdGNoIChkaXIwX21zbikgeworCQl1bnNpZ25lZCBjaGFyIHRtcDsKKworCWNhc2UgMDogLyogQ3g0ODZTTEMvRExDL1NSeC9EUnggKi8KKwkJcCA9IEN4NDg2X25hbWVbZGlyMF9sc24gJiA3XTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8qIEN4NDg2Uy9EWC9EWDIvRFg0ICovCisJCXAgPSAoZGlyMF9sc24gJiA4KSA/IEN4NDg2RF9uYW1lW2RpcjBfbHNuICYgNV0KKwkJCTogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKKwkJYnJlYWs7CisKKwljYXNlIDI6IC8qIDV4ODYgKi8KKwkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CisJCXAgPSBDeDg2X2NiKzI7CisJCWJyZWFrOworCisJY2FzZSAzOiAvKiA2eDg2LzZ4ODZMICovCisJCUN4ODZfY2JbMV0gPSAnICc7CisJCUN4ODZfY2JbMl0gPSBjeXJpeF9tb2RlbF9tdWx0MVtkaXIwX2xzbiAmIDVdOworCQlpZiAoZGlyMSA+IDB4MjEpIHsgLyogNjg2TCAqLworCQkJQ3g4Nl9jYlswXSA9ICdMJzsKKwkJCXAgPSBDeDg2X2NiOworCQkJKGMtPng4Nl9tb2RlbCkrKzsKKwkJfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLworCQkJcCA9IEN4ODZfY2IrMTsKKwkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCS8qIDZ4ODYncyBjb250YWluIHRoaXMgYnVnICovCisJCWMtPmNvbWFfYnVnID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6IC8qIE1lZGlhR1gvR1htIG9yIEdlb2RlIEdYTS9HWExWL0dYMSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJLyogSXQgaXNuJ3QgcmVhbGx5IGEgUENJIHF1aXJrIGRpcmVjdGx5LCBidXQgdGhlIGN1cmUgaXMgdGhlCisJCSAgIHNhbWUuIFRoZSBNZWRpYUdYIGhhcyBkZWVwIG1hZ2ljIFNNTSBzdHVmZiB0aGF0IGhhbmRsZXMgdGhlCisJCSAgIFNCIGVtdWxhdGlvbi4gSXQgdGhvd3MgYXdheSB0aGUgZmlmbyBvbiBkaXNhYmxlX2RtYSgpIHdoaWNoCisJCSAgIGlzIHdyb25nIGFuZCBydWlucyB0aGUgYXVkaW8uIAorCisJCSAgIEJ1ZzI6IFZTQTEgaGFzIGEgd3JhcCBidWcgc28gdGhhdCB1c2luZyBtYXhpbXVtIHNpemVkIERNQSAKKwkJICAgY2F1c2VzIGJhZCB0aGluZ3MuIEFjY29yZGluZyB0byBOYXRTZW1pIFZTQTIgaGFzIGFub3RoZXIKKwkJICAgYnVnIHRvIGRvIHdpdGggJ2hsdCcuIEkndmUgbm90IHNlZW4gYW55IGJvYXJkcyB1c2luZyBWU0EyCisJCSAgIGFuZCBYIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IGl0IGVpdGhlciBzbyB3aG8gY2FyZXMgOCkuCisJCSAgIFZTQTEgd2Ugd29yayBhcm91bmQgaG93ZXZlci4KKwkJKi8KKworCQlwcmludGsoS0VSTl9JTkZPICJXb3JraW5nIGFyb3VuZCBDeXJpeCBNZWRpYUdYIHZpcnR1YWwgRE1BIGJ1Z3MuXG4iKTsKKwkJaXNhX2RtYV9icmlkZ2VfYnVnZ3kgPSAyOworI2VuZGlmCQkKKwkJYy0+eDg2X2NhY2hlX3NpemU9MTY7CS8qIFllcCAxNksgaW50ZWdyYXRlZCBjYWNoZSB0aGF0cyBpdCAqLworIAorCQkvKgorCQkgKiAgVGhlIDU1MTAvNTUyMCBjb21wYW5pb24gY2hpcHMgaGF2ZSBhIGZ1bmt5IFBJVC4KKwkJICovICAKKwkJaWYgKHBjaV9kZXZfcHJlc2VudChjeXJpeF81NXgwKSkKKwkJCXBpdF9sYXRjaF9idWdneSA9IDE7CisKKwkJLyogR1htIHN1cHBvcnRzIGV4dGVuZGVkIGNwdWlkIGxldmVscyAnYWxhJyBBTUQgKi8KKwkJaWYgKGMtPmNwdWlkX2xldmVsID09IDIpIHsKKwkJCS8qIEVuYWJsZSBjeE1NWCBleHRlbnNpb25zIChHWDEgRGF0YXNoZWV0IDU0KSAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKKwkJCQorCQkJLyogR1hsdi9HWG0vR1gxICovCisJCQlpZigoZGlyMSA+PSAweDUwICYmIGRpcjEgPD0gMHg1NCkgfHwgZGlyMSA+PSAweDYzKQorCQkJCWdlb2RlX2NvbmZpZ3VyZSgpOworCQkJZ2V0X21vZGVsX25hbWUoYyk7ICAvKiBnZXQgQ1BVIG1hcmtldGluZyBuYW1lICovCisJCQlyZXR1cm47CisJCX0KKwkJZWxzZSB7ICAvKiBNZWRpYUdYICovCisJCQlDeDg2X2NiWzJdID0gKGRpcjBfbHNuICYgMSkgPyAnMycgOiAnNCc7CisJCQlwID0gQ3g4Nl9jYisyOworCQkJYy0+eDg2X21vZGVsID0gKGRpcjEgJiAweDIwKSA/IDEgOiAyOworCQl9CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgNTogLyogNng4Nk1YL00gSUkgKi8KKwkJaWYgKGRpcjEgPiA3KQorCQl7CisJCQlkaXIwX21zbisrOyAgLyogTSBJSSAqLworCQkJLyogRW5hYmxlIE1NWCBleHRlbnNpb25zIChBcHAgbm90ZSAxMDgpICovCisJCQlzZXRDeDg2KENYODZfQ0NSNywgZ2V0Q3g4NihDWDg2X0NDUjcpfDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJYy0+Y29tYV9idWcgPSAxOyAgICAgIC8qIDZ4ODZNWCwgaXQgaGFzIHRoZSBidWcuICovCisJCX0KKwkJdG1wID0gKCEoZGlyMF9sc24gJiA3KSB8fCBkaXIwX2xzbiAmIDEpID8gMiA6IDA7CisJCUN4ODZfY2JbdG1wXSA9IGN5cml4X21vZGVsX211bHQyW2RpcjBfbHNuICYgN107CisJCXAgPSBDeDg2X2NiK3RtcDsKKyAgICAgICAgCWlmICgoKGRpcjEgJiAweDBmKSA+IDQpIHx8ICgoZGlyMSAmIDB4ZjApID09IDB4MjApKQorCQkJKGMtPng4Nl9tb2RlbCkrKzsKKwkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCWJyZWFrOworCisJY2FzZSAweGY6ICAvKiBDeXJpeCA0ODYgd2l0aG91dCBERVZJRCByZWdpc3RlcnMgKi8KKwkJc3dpdGNoIChkaXIwX2xzbikgeworCQljYXNlIDB4ZDogIC8qIGVpdGhlciBhIDQ4NlNMQyBvciBETEMgdy9vIERFVklEICovCisJCQlkaXIwX21zbiA9IDA7CisJCQlwID0gQ3g0ODZfbmFtZVsoYy0+aGFyZF9tYXRoKSA/IDEgOiAwXTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhlOiAgLyogYSA0ODZTIEEgc3RlcCAqLworCQkJZGlyMF9tc24gPSAwOworCQkJcCA9IEN4NDg2U19uYW1lWzBdOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAgLyogdW5rbm93biAoc2hvdWxkbid0IGhhcHBlbiwgd2Uga25vdyBldmVyeW9uZSA7LSkgKi8KKwkJZGlyMF9tc24gPSA3OworCQlicmVhazsKKwl9CisJc3RyY3B5KGJ1ZiwgQ3g4Nl9tb2RlbFtkaXIwX21zbiAmIDddKTsKKwlpZiAocCkgc3RyY2F0KGJ1ZiwgcCk7CisJcmV0dXJuOworfQorCisvKgorICogQ3lyaXggQ1BVcyB3aXRob3V0IGNwdWlkIG9yIHdpdGggY3B1aWQgbm90IHlldCBlbmFibGVkIGNhbiBiZSBkZXRlY3RlZAorICogYnkgdGhlIGZhY3QgdGhhdCB0aGV5IHByZXNlcnZlIHRoZSBmbGFncyBhY3Jvc3MgdGhlIGRpdmlzaW9uIG9mIDUvMi4KKyAqIFBJSSBhbmQgUFBybyBleGhpYml0IHRoaXMgYmVoYXZpb3IgdG9vLCBidXQgdGhleSBoYXZlIGNwdWlkIGF2YWlsYWJsZS4KKyAqLworIAorLyoKKyAqIFBlcmZvcm0gdGhlIEN5cml4IDUvMiB0ZXN0LiBBIEN5cml4IHdvbid0IGNoYW5nZQorICogdGhlIGZsYWdzLCB3aGlsZSBvdGhlciA0ODYgY2hpcHMgd2lsbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9jeXJpeF81MmRpdih2b2lkKQoreworCXVuc2lnbmVkIGludCB0ZXN0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJICAgICAic2FoZlxuXHQiCQkvKiBjbGVhciBmbGFncyAoJWVheCA9IDB4MDAwNSkgKi8KKwkgICAgICJkaXYgJWIyXG5cdCIJLyogZGl2aWRlIDUgYnkgMiAqLworCSAgICAgImxhaGYiCQkvKiBzdG9yZSBmbGFncyBpbnRvICVhaCAqLworCSAgICAgOiAiPWEiICh0ZXN0KQorCSAgICAgOiAiMCIgKDUpLCAicSIgKDIpCisJICAgICA6ICJjYyIpOworCisJLyogQUggaXMgMHgwMiBvbiBDeXJpeCBhZnRlciB0aGUgZGl2aWRlLi4gKi8KKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpICh0ZXN0ID4+IDgpID09IDB4MDI7Cit9CisKK3N0YXRpYyB2b2lkIGN5cml4X2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJLyogRGV0ZWN0IEN5cml4IHdpdGggZGlzYWJsZWQgQ1BVSUQgKi8KKwlpZiAoIGMtPng4NiA9PSA0ICYmIHRlc3RfY3lyaXhfNTJkaXYoKSApIHsKKwkJdW5zaWduZWQgY2hhciBkaXIwLCBkaXIxOworCQkKKwkJc3RyY3B5KGMtPng4Nl92ZW5kb3JfaWQsICJDeXJpeEluc3RlYWQiKTsKKwkgICAgICAgIGMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX0NZUklYOworCSAgICAgICAgCisJICAgICAgICAvKiBBY3R1YWxseSBlbmFibGUgY3B1aWQgb24gdGhlIG9sZGVyIGN5cml4ICovCisJICAgIAorCSAgICAJLyogUmV0cmlldmUgQ1BVIHJldmlzaW9ucyAqLworCSAgICAJCisJCWRvX2N5cml4X2RldmlkKCZkaXIwLCAmZGlyMSk7CisKKwkJZGlyMD4+PTQ7CQkKKwkJCisJCS8qIENoZWNrIGl0IGlzIGFuIGFmZmVjdGVkIG1vZGVsICovCisJCQorICAgCSAgICAgICAgaWYgKGRpcjAgPT0gNSB8fCBkaXIwID09IDMpCisgICAJICAgICAgICB7CisJCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgQ1BVSUQgb24gQ3lyaXggcHJvY2Vzc29yLlxuIik7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOICAqLworCQkJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKKwkJCXNldEN4ODYoQ1g4Nl9DQ1I0LCBjY3I0IHwgMHg4MCk7ICAgICAgICAgIC8qIGVuYWJsZSBjcHVpZCAgKi8KKwkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJfQorCX0KKwlnZW5lcmljX2lkZW50aWZ5KGMpOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY3lyaXhfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJDeXJpeCIsCisJLmNfaWRlbnQgCT0geyAiQ3lyaXhJbnN0ZWFkIiB9LAorCS5jX2luaXQJCT0gaW5pdF9jeXJpeCwKKwkuY19pZGVudGlmeQk9IGN5cml4X2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBjeXJpeF9pbml0X2NwdSh2b2lkKQoreworCWNwdV9kZXZzW1g4Nl9WRU5ET1JfQ1lSSVhdID0gJmN5cml4X2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChjeXJpeF9pbml0X2NwdSk7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJOU0MiLAorCS5jX2lkZW50IAk9IHsgIkdlb2RlIGJ5IE5TQyIgfSwKKwkuY19pbml0CQk9IGluaXRfY3lyaXgsCisJLmNfaWRlbnRpZnkJPSBnZW5lcmljX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBuc2NfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX05TQ10gPSAmbnNjX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChuc2NfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkODQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTAsMCArMSwyNDggQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNlbmRpZgorCitleHRlcm4gaW50IHRyYXBfaW5pdF9mMDBmX2J1Zyh2b2lkKTsKKworI2lmZGVmIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkKKy8qCisgKiBBbGlnbm1lbnQgYXQgd2hpY2ggbW92c2wgaXMgcHJlZmVycmVkIGZvciBidWxrIG1lbW9yeSBjb3BpZXMuCisgKi8KK3N0cnVjdCBtb3ZzbF9tYXNrIG1vdnNsX21hc2s7CisjZW5kaWYKKwordm9pZCBfX2luaXQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuOworCS8qIE5ldGJ1cnN0IHJlcG9ydHMgNjQgYnl0ZXMgY2xmbHVzaCBzaXplLCBidXQgZG9lcyBJTyBpbiAxMjggYnl0ZXMgKi8KKwlpZiAoYy0+eDg2ID09IDE1ICYmIGMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPT0gNjQpCisJCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSAxMjg7Cit9CisKKy8qCisgKglFYXJseSBwcm9iZSBzdXBwb3J0IGxvZ2ljIGZvciBwcHJvIG1lbW9yeSBlcnJhdHVtICM1MAorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGJlZm9yZSB3ZSBkbyBjcHUgaWRlbnQgd29yaworICovCisgCitpbnQgX19pbml0IHBwcm9fd2l0aF9yYW1fYnVnKHZvaWQpCit7CisJLyogVXNlcyBkYXRhIGZyb20gZWFybHlfY3B1X2RldGVjdCBub3cgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPT0gNiAmJgorCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSAxICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21hc2sgPCA4KSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBlbnRpdW0gUHJvIHdpdGggRXJyYXRhIzUwIGRldGVjdGVkLiBUYWtpbmcgZXZhc2l2ZSBhY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCQorCisvKgorICogUDQgWGVvbiBlcnJhdGEgMDM3IHdvcmthcm91bmQuCisgKiBIYXJkd2FyZSBwcmVmZXRjaGVyIG1heSBjYXVzZSBzdGFsZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IEludGVsX2VycmF0YV93b3JrYXJvdW5kcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgbG9uZyBsbywgaGk7CisKKwlpZiAoKGMtPng4NiA9PSAxNSkgJiYgKGMtPng4Nl9tb2RlbCA9PSAxKSAmJiAoYy0+eDg2X21hc2sgPT0gMSkpIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsbywgaGkpOworCQlpZiAoKGxvICYgKDE8PDkpKSA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBDMCBzdGVwcGluZyBQNCBYZW9uIGRldGVjdGVkLlxuIik7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBEaXNhYmxpbmcgaGFyZHdhcmUgcHJlZmV0Y2hpbmcgKEVycmF0YSAwMzcpXG4iKTsKKwkJCWxvIHw9ICgxPDw5KTsJLyogRGlzYWJsZSBodyBwcmVmZXRjaGluZyAqLworCQkJd3Jtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsbywgaGkpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgbDIgPSAwOworCWNoYXIgKnAgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRworCS8qCisJICogQWxsIGN1cnJlbnQgbW9kZWxzIG9mIFBlbnRpdW0gYW5kIFBlbnRpdW0gd2l0aCBNTVggdGVjaG5vbG9neSBDUFVzCisJICogaGF2ZSB0aGUgRjAgMEYgYnVnLCB3aGljaCBsZXRzIG5vbnByaXZpbGVnZWQgdXNlcnMgbG9jayB1cCB0aGUgc3lzdGVtLgorCSAqIE5vdGUgdGhhdCB0aGUgd29ya2Fyb3VuZCBvbmx5IHNob3VsZCBiZSBpbml0aWFsaXplZCBvbmNlLi4uCisJICovCisJYy0+ZjAwZl9idWcgPSAwOworCWlmICggYy0+eDg2ID09IDUgKSB7CisJCXN0YXRpYyBpbnQgZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgPSAwOworCisJCWMtPmYwMGZfYnVnID0gMTsKKwkJaWYgKCAhZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgKSB7CisJCQl0cmFwX2luaXRfZjAwZl9idWcoKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiSW50ZWwgUGVudGl1bSB3aXRoIEYwIDBGIGJ1ZyAtIHdvcmthcm91bmQgZW5hYmxlZC5cbiIpOworCQkJZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgPSAxOworCQl9CisJfQorI2VuZGlmCisKKwlzZWxlY3RfaWRsZV9yb3V0aW5lKGMpOworCWwyID0gaW5pdF9pbnRlbF9jYWNoZWluZm8oYyk7CisKKwkvKiBTRVAgQ1BVSUQgYnVnOiBQZW50aXVtIFBybyByZXBvcnRzIFNFUCBidXQgZG9lc24ndCBoYXZlIGl0IHVudGlsIG1vZGVsIDMgbWFzayAzICovCisJaWYgKChjLT54ODY8PDggfCBjLT54ODZfbW9kZWw8PDQgfCBjLT54ODZfbWFzaykgPCAweDYzMykKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1NFUCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJLyogTmFtZXMgZm9yIHRoZSBQZW50aXVtIElJL0NlbGVyb24gcHJvY2Vzc29ycyAKKwkgICBkZXRlY3RhYmxlIG9ubHkgYnkgYWxzbyBjaGVja2luZyB0aGUgY2FjaGUgc2l6ZS4KKwkgICBEaXhvbiBpcyBOT1QgYSBDZWxlcm9uLiAqLworCWlmIChjLT54ODYgPT0gNikgeworCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCQljYXNlIDU6CisJCQlpZiAoYy0+eDg2X21hc2sgPT0gMCkgeworCQkJCWlmIChsMiA9PSAwKQorCQkJCQlwID0gIkNlbGVyb24gKENvdmluZ3RvbikiOworCQkJCWVsc2UgaWYgKGwyID09IDI1NikKKwkJCQkJcCA9ICJNb2JpbGUgUGVudGl1bSBJSSAoRGl4b24pIjsKKwkJCX0KKwkJCWJyZWFrOworCQkJCisJCWNhc2UgNjoKKwkJCWlmIChsMiA9PSAxMjgpCisJCQkJcCA9ICJDZWxlcm9uIChNZW5kb2Npbm8pIjsKKwkJCWVsc2UgaWYgKGMtPng4Nl9tYXNrID09IDAgfHwgYy0+eDg2X21hc2sgPT0gNSkKKwkJCQlwID0gIkNlbGVyb24tQSI7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDg6CisJCQlpZiAobDIgPT0gMTI4KQorCQkJCXAgPSAiQ2VsZXJvbiAoQ29wcGVybWluZSkiOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIHAgKQorCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCBwKTsKKwkKKwlkZXRlY3RfaHQoYyk7CisKKwkvKiBXb3JrIGFyb3VuZCBlcnJhdGEgKi8KKwlJbnRlbF9lcnJhdGFfd29ya2Fyb3VuZHMoYyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisJLyoKKwkgKiBTZXQgdXAgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgZm9yIG1vdnNsIGJ1bGsgbWVtb3J5IG1vdmVzCisJICovCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDQ6CQkvKiA0ODY6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNToJCS8qIE9sZCBQZW50aWE6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNjoJCS8qIFBJSS9QSUlJIG9ubHkgbGlrZSBtb3ZzbCB3aXRoIDgtYnl0ZSBhbGlnbm1lbnQgKi8KKwkJbW92c2xfbWFzay5tYXNrID0gNzsKKwkJYnJlYWs7CisJY2FzZSAxNToJLyogUDQgaXMgT0sgZG93biB0byA4LWJ5dGUgYWxpZ25tZW50ICovCisJCW1vdnNsX21hc2subWFzayA9IDc7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJaWYgKGMtPng4NiA9PSAxNSkgCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUDQsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwlpZiAoYy0+eDg2ID09IDYpIAorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1AzLCBjLT54ODZfY2FwYWJpbGl0eSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIEludGVsIFBJSUkgVHVhbGF0aW4uIFRoaXMgY29tZXMgaW4gdHdvIGZsYXZvdXJzLgorCSAqIE9uZSBoYXMgMjU2a2Igb2YgY2FjaGUsIHRoZSBvdGhlciA1MTIuIFdlIGhhdmUgbm8gd2F5CisJICogdG8gZGV0ZXJtaW5lIHdoaWNoLCBzbyB3ZSB1c2UgYSBib290dGltZSBvdmVycmlkZQorCSAqIGZvciB0aGUgNTEya2IgbW9kZWwsIGFuZCBhc3N1bWUgMjU2IG90aGVyd2lzZS4KKwkgKi8KKwlpZiAoKGMtPng4NiA9PSA2KSAmJiAoYy0+eDg2X21vZGVsID09IDExKSAmJiAoc2l6ZSA9PSAwKSkKKwkJc2l6ZSA9IDI1NjsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IGludGVsX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiSW50ZWwiLAorCS5jX2lkZW50IAk9IHsgIkdlbnVpbmVJbnRlbCIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSA0LCAubW9kZWxfbmFtZXMgPSAKKwkJICB7IAorCQkJICBbMF0gPSAiNDg2IERYLTI1LzMzIiwgCisJCQkgIFsxXSA9ICI0ODYgRFgtNTAiLCAKKwkJCSAgWzJdID0gIjQ4NiBTWCIsIAorCQkJICBbM10gPSAiNDg2IERYLzIiLCAKKwkJCSAgWzRdID0gIjQ4NiBTTCIsIAorCQkJICBbNV0gPSAiNDg2IFNYLzIiLCAKKwkJCSAgWzddID0gIjQ4NiBEWC8yLVdCIiwgCisJCQkgIFs4XSA9ICI0ODYgRFgvNCIsIAorCQkJICBbOV0gPSAiNDg2IERYLzQtV0IiCisJCSAgfQorCQl9LAorCQl7IC52ZW5kb3IgPSBYODZfVkVORE9SX0lOVEVMLCAuZmFtaWx5ID0gNSwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMF0gPSAiUGVudGl1bSA2MC82NiBBLXN0ZXAiLCAKKwkJCSAgWzFdID0gIlBlbnRpdW0gNjAvNjYiLCAKKwkJCSAgWzJdID0gIlBlbnRpdW0gNzUgLSAyMDAiLAorCQkJICBbM10gPSAiT3ZlckRyaXZlIFBPRFA1VjgzIiwgCisJCQkgIFs0XSA9ICJQZW50aXVtIE1NWCIsCisJCQkgIFs3XSA9ICJNb2JpbGUgUGVudGl1bSA3NSAtIDIwMCIsIAorCQkJICBbOF0gPSAiTW9iaWxlIFBlbnRpdW0gTU1YIgorCQkgIH0KKwkJfSwKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9JTlRFTCwgLmZhbWlseSA9IDYsIC5tb2RlbF9uYW1lcyA9CisJCSAgeyAKKwkJCSAgWzBdID0gIlBlbnRpdW0gUHJvIEEtc3RlcCIsCisJCQkgIFsxXSA9ICJQZW50aXVtIFBybyIsIAorCQkJICBbM10gPSAiUGVudGl1bSBJSSAoS2xhbWF0aCkiLCAKKwkJCSAgWzRdID0gIlBlbnRpdW0gSUkgKERlc2NodXRlcykiLCAKKwkJCSAgWzVdID0gIlBlbnRpdW0gSUkgKERlc2NodXRlcykiLCAKKwkJCSAgWzZdID0gIk1vYmlsZSBQZW50aXVtIElJIiwKKwkJCSAgWzddID0gIlBlbnRpdW0gSUlJIChLYXRtYWkpIiwgCisJCQkgIFs4XSA9ICJQZW50aXVtIElJSSAoQ29wcGVybWluZSkiLCAKKwkJCSAgWzEwXSA9ICJQZW50aXVtIElJSSAoQ2FzY2FkZXMpIiwKKwkJCSAgWzExXSA9ICJQZW50aXVtIElJSSAoVHVhbGF0aW4pIiwKKwkJICB9CisJCX0sCisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSAxNSwgLm1vZGVsX25hbWVzID0KKwkJICB7CisJCQkgIFswXSA9ICJQZW50aXVtIDQgKFVua25vd24pIiwKKwkJCSAgWzFdID0gIlBlbnRpdW0gNCAoV2lsbGFtZXR0ZSkiLAorCQkJICBbMl0gPSAiUGVudGl1bSA0IChOb3J0aHdvb2QpIiwKKwkJCSAgWzRdID0gIlBlbnRpdW0gNCAoRm9zdGVyKSIsCisJCQkgIFs1XSA9ICJQZW50aXVtIDQgKEZvc3RlcikiLAorCQkgIH0KKwkJfSwKKwl9LAorCS5jX2luaXQJCT0gaW5pdF9pbnRlbCwKKwkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCisJLmNfc2l6ZV9jYWNoZQk9IGludGVsX3NpemVfY2FjaGUsCit9OworCitfX2luaXQgaW50IGludGVsX2NwdV9pbml0KHZvaWQpCit7CisJY3B1X2RldnNbWDg2X1ZFTkRPUl9JTlRFTF0gPSAmaW50ZWxfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy8gYXJjaF9pbml0Y2FsbChpbnRlbF9jcHVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogICAgICBSb3V0aW5lcyB0byBpbmRlbnRpZnkgY2FjaGVzIG9uIEludGVsIENQVS4KKyAqCisgKiAgICAgIENoYW5nZXM6CisgKiAgICAgIFZlbmthdGVzaCBQYWxsaXBhZGkJOiBBZGRpbmcgY2FjaGUgaWRlbnRpZmljYXRpb24gdGhyb3VnaCBjcHVpZCg0KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjZGVmaW5lIExWTF8xX0lOU1QJMQorI2RlZmluZSBMVkxfMV9EQVRBCTIKKyNkZWZpbmUgTFZMXzIJCTMKKyNkZWZpbmUgTFZMXzMJCTQKKyNkZWZpbmUgTFZMX1RSQUNFCTUKKworc3RydWN0IF9jYWNoZV90YWJsZQoreworCXVuc2lnbmVkIGNoYXIgZGVzY3JpcHRvcjsKKwljaGFyIGNhY2hlX3R5cGU7CisJc2hvcnQgc2l6ZTsKK307CisKKy8qIGFsbCB0aGUgY2FjaGUgZGVzY3JpcHRvciB0eXBlcyB3ZSBjYXJlIGFib3V0IChubyBUTEIgb3IgdHJhY2UgY2FjaGUgZW50cmllcykgKi8KK3N0YXRpYyBzdHJ1Y3QgX2NhY2hlX3RhYmxlIGNhY2hlX3RhYmxlW10gX19pbml0ZGF0YSA9Cit7CisJeyAweDA2LCBMVkxfMV9JTlNULCA4IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MDgsIExWTF8xX0lOU1QsIDE2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MGEsIExWTF8xX0RBVEEsIDggfSwJLyogMiB3YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgwYywgTFZMXzFfREFUQSwgMTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgyMiwgTFZMXzMsICAgICAgNTEyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDIzLCBMVkxfMywgICAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDI1LCBMVkxfMywgICAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDI5LCBMVkxfMywgICAgICA0MDk2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDJjLCBMVkxfMV9EQVRBLCAzMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDMwLCBMVkxfMV9JTlNULCAzMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDM5LCBMVkxfMiwgICAgICAxMjggfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4M2IsIExWTF8yLCAgICAgIDEyOCB9LAkvKiAyLXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgzYywgTFZMXzIsICAgICAgMjU2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDQxLCBMVkxfMiwgICAgICAxMjggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg0MiwgTFZMXzIsICAgICAgMjU2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDMsIExWTF8yLCAgICAgIDUxMiB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDQ0LCBMVkxfMiwgICAgICAxMDI0IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDUsIExWTF8yLCAgICAgIDIwNDggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg2MCwgTFZMXzFfREFUQSwgMTYgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NjYsIExWTF8xX0RBVEEsIDggfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NjcsIExWTF8xX0RBVEEsIDE2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDY4LCBMVkxfMV9EQVRBLCAzMiB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3MCwgTFZMX1RSQUNFLCAgMTIgfSwJLyogOC13YXkgc2V0IGFzc29jICovCisJeyAweDcxLCBMVkxfVFJBQ0UsICAxNiB9LAkvKiA4LXdheSBzZXQgYXNzb2MgKi8KKwl7IDB4NzIsIExWTF9UUkFDRSwgIDMyIH0sCS8qIDgtd2F5IHNldCBhc3NvYyAqLworCXsgMHg3OCwgTFZMXzIsICAgIDEwMjQgfSwJLyogNC13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3OSwgTFZMXzIsICAgICAxMjggfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2EsIExWTF8yLCAgICAgMjU2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDdiLCBMVkxfMiwgICAgIDUxMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3YywgTFZMXzIsICAgIDEwMjQgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2QsIExWTF8yLCAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2YsIExWTF8yLCAgICAgNTEyIH0sCS8qIDItd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODIsIExWTF8yLCAgICAgMjU2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODMsIExWTF8yLCAgICAgNTEyIH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODQsIExWTF8yLCAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODUsIExWTF8yLCAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODYsIExWTF8yLCAgICAgNTEyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODcsIExWTF8yLCAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MDAsIDAsIDB9Cit9OworCisKK2VudW0gX2NhY2hlX3R5cGUKK3sKKwlDQUNIRV9UWVBFX05VTEwJPSAwLAorCUNBQ0hFX1RZUEVfREFUQSA9IDEsCisJQ0FDSEVfVFlQRV9JTlNUID0gMiwKKwlDQUNIRV9UWVBFX1VOSUZJRUQgPSAzCit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IHsKKwlzdHJ1Y3QgeworCQllbnVtIF9jYWNoZV90eXBlCXR5cGU6NTsKKwkJdW5zaWduZWQgaW50CQlsZXZlbDozOworCQl1bnNpZ25lZCBpbnQJCWlzX3NlbGZfaW5pdGlhbGl6aW5nOjE7CisJCXVuc2lnbmVkIGludAkJaXNfZnVsbHlfYXNzb2NpYXRpdmU6MTsKKwkJdW5zaWduZWQgaW50CQlyZXNlcnZlZDo0OworCQl1bnNpZ25lZCBpbnQJCW51bV90aHJlYWRzX3NoYXJpbmc6MTI7CisJCXVuc2lnbmVkIGludAkJbnVtX2NvcmVzX29uX2RpZTo2OworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJCWNvaGVyZW5jeV9saW5lX3NpemU6MTI7CisJCXVuc2lnbmVkIGludAkJcGh5c2ljYWxfbGluZV9wYXJ0aXRpb246MTA7CisJCXVuc2lnbmVkIGludAkJd2F5c19vZl9hc3NvY2lhdGl2aXR5OjEwOworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJCW51bWJlcl9vZl9zZXRzOjMyOworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCitzdHJ1Y3QgX2NwdWlkNF9pbmZvIHsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IGVheDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IGVieDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IGVjeDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY3B1bWFza190IHNoYXJlZF9jcHVfbWFwOworfTsKKworI2RlZmluZSBNQVhfQ0FDSEVfTEVBVkVTCQk0CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19kZXZpbml0ZGF0YQludW1fY2FjaGVfbGVhdmVzOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHVpZDRfY2FjaGVfbG9va3VwKGludCBpbmRleCwgc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmKQoreworCXVuc2lnbmVkIGludAkJZWF4LCBlYngsIGVjeCwgZWR4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXgJY2FjaGVfZWF4OworCisJY3B1aWRfY291bnQoNCwgaW5kZXgsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCWNhY2hlX2VheC5mdWxsID0gZWF4OworCWlmIChjYWNoZV9lYXguc3BsaXQudHlwZSA9PSBDQUNIRV9UWVBFX05VTEwpCisJCXJldHVybiAtMTsKKworCXRoaXNfbGVhZi0+ZWF4LmZ1bGwgPSBlYXg7CisJdGhpc19sZWFmLT5lYnguZnVsbCA9IGVieDsKKwl0aGlzX2xlYWYtPmVjeC5mdWxsID0gZWN4OworCXRoaXNfbGVhZi0+c2l6ZSA9ICh0aGlzX2xlYWYtPmVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cyArIDEpICoKKwkJKHRoaXNfbGVhZi0+ZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgKyAxKSAqCisJCSh0aGlzX2xlYWYtPmVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiArIDEpICoKKwkJKHRoaXNfbGVhZi0+ZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSArIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBmaW5kX251bV9jYWNoZV9sZWF2ZXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQJCWVheCwgZWJ4LCBlY3gsIGVkeDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4CWNhY2hlX2VheDsKKwlpbnQgCQkJaTsKKwlpbnQgCQkJcmV0dmFsOworCisJcmV0dmFsID0gTUFYX0NBQ0hFX0xFQVZFUzsKKwkvKiBEbyBjcHVpZCg0KSBsb29wIHRvIGZpbmQgb3V0IG51bV9jYWNoZV9sZWF2ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NBQ0hFX0xFQVZFUzsgaSsrKSB7CisJCWNwdWlkX2NvdW50KDQsIGksICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCQljYWNoZV9lYXguZnVsbCA9IGVheDsKKwkJaWYgKGNhY2hlX2VheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkgeworCQkJcmV0dmFsID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBfX2luaXQgaW5pdF9pbnRlbF9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCB0cmFjZSA9IDAsIGwxaSA9IDAsIGwxZCA9IDAsIGwyID0gMCwgbDMgPSAwOyAvKiBDYWNoZSBzaXplcyAqLworCXVuc2lnbmVkIGludCBuZXdfbDFkID0gMCwgbmV3X2wxaSA9IDA7IC8qIENhY2hlIHNpemVzIGZyb20gY3B1aWQoNCkgKi8KKwl1bnNpZ25lZCBpbnQgbmV3X2wyID0gMCwgbmV3X2wzID0gMCwgaTsgLyogQ2FjaGUgc2l6ZXMgZnJvbSBjcHVpZCg0KSAqLworCisJaWYgKGMtPmNwdWlkX2xldmVsID4gNCkgeworCQlzdGF0aWMgaW50IGlzX2luaXRpYWxpemVkOworCisJCWlmIChpc19pbml0aWFsaXplZCA9PSAwKSB7CisJCQkvKiBJbml0IG51bV9jYWNoZV9sZWF2ZXMgZnJvbSBib290IENQVSAqLworCQkJbnVtX2NhY2hlX2xlYXZlcyA9IGZpbmRfbnVtX2NhY2hlX2xlYXZlcygpOworCQkJaXNfaW5pdGlhbGl6ZWQrKzsKKwkJfQorCisJCS8qCisJCSAqIFdoZW5ldmVyIHBvc3NpYmxlIHVzZSBjcHVpZCg0KSwgZGV0ZXJtaW5pc3RpYyBjYWNoZQorCQkgKiBwYXJhbWV0ZXJzIGNwdWlkIGxlYWYgdG8gZmluZCB0aGUgY2FjaGUgZGV0YWlscworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykgeworCQkJc3RydWN0IF9jcHVpZDRfaW5mbyB0aGlzX2xlYWY7CisKKwkJCWludCByZXR2YWw7CisKKwkJCXJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXAoaSwgJnRoaXNfbGVhZik7CisJCQlpZiAocmV0dmFsID49IDApIHsKKwkJCQlzd2l0Y2godGhpc19sZWFmLmVheC5zcGxpdC5sZXZlbCkgeworCQkJCSAgICBjYXNlIDE6CisJCQkJCWlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0KKwkJCQkJCQlDQUNIRV9UWVBFX0RBVEEpCisJCQkJCQluZXdfbDFkID0gdGhpc19sZWFmLnNpemUvMTAyNDsKKwkJCQkJZWxzZSBpZiAodGhpc19sZWFmLmVheC5zcGxpdC50eXBlID09CisJCQkJCQkJQ0FDSEVfVFlQRV9JTlNUKQorCQkJCQkJbmV3X2wxaSA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDI6CisJCQkJCW5ld19sMiA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDM6CisJCQkJCW5ld19sMyA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGMtPmNwdWlkX2xldmVsID4gMSkgeworCQkvKiBzdXBwb3J0cyBlYXg9MiAgY2FsbCAqLworCQlpbnQgaSwgaiwgbjsKKwkJaW50IHJlZ3NbNF07CisJCXVuc2lnbmVkIGNoYXIgKmRwID0gKHVuc2lnbmVkIGNoYXIgKilyZWdzOworCisJCS8qIE51bWJlciBvZiB0aW1lcyB0byBpdGVyYXRlICovCisJCW4gPSBjcHVpZF9lYXgoMikgJiAweEZGOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG4gOyBpKysgKSB7CisJCQljcHVpZCgyLCAmcmVnc1swXSwgJnJlZ3NbMV0sICZyZWdzWzJdLCAmcmVnc1szXSk7CisKKwkJCS8qIElmIGJpdCAzMSBpcyBzZXQsIHRoaXMgaXMgYW4gdW5rbm93biBmb3JtYXQgKi8KKwkJCWZvciAoIGogPSAwIDsgaiA8IDMgOyBqKysgKSB7CisJCQkJaWYgKCByZWdzW2pdIDwgMCApIHJlZ3Nbal0gPSAwOworCQkJfQorCisJCQkvKiBCeXRlIDAgaXMgbGV2ZWwgY291bnQsIG5vdCBhIGRlc2NyaXB0b3IgKi8KKwkJCWZvciAoIGogPSAxIDsgaiA8IDE2IDsgaisrICkgeworCQkJCXVuc2lnbmVkIGNoYXIgZGVzID0gZHBbal07CisJCQkJdW5zaWduZWQgY2hhciBrID0gMDsKKworCQkJCS8qIGxvb2sgdXAgdGhpcyBkZXNjcmlwdG9yIGluIHRoZSB0YWJsZSAqLworCQkJCXdoaWxlIChjYWNoZV90YWJsZVtrXS5kZXNjcmlwdG9yICE9IDApCisJCQkJeworCQkJCQlpZiAoY2FjaGVfdGFibGVba10uZGVzY3JpcHRvciA9PSBkZXMpIHsKKwkJCQkJCXN3aXRjaCAoY2FjaGVfdGFibGVba10uY2FjaGVfdHlwZSkgeworCQkJCQkJY2FzZSBMVkxfMV9JTlNUOgorCQkJCQkJCWwxaSArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMV9EQVRBOgorCQkJCQkJCWwxZCArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMjoKKwkJCQkJCQlsMiArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMzoKKwkJCQkJCQlsMyArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfVFJBQ0U6CisJCQkJCQkJdHJhY2UgKz0gY2FjaGVfdGFibGVba10uc2l6ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlrKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG5ld19sMWQpCisJCQlsMWQgPSBuZXdfbDFkOworCisJCWlmIChuZXdfbDFpKQorCQkJbDFpID0gbmV3X2wxaTsKKworCQlpZiAobmV3X2wyKQorCQkJbDIgPSBuZXdfbDI7CisKKwkJaWYgKG5ld19sMykKKwkJCWwzID0gbmV3X2wzOworCisJCWlmICggdHJhY2UgKQorCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogVHJhY2UgY2FjaGU6ICVkSyB1b3BzIiwgdHJhY2UpOworCQllbHNlIGlmICggbDFpICkKKwkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IEwxIEkgY2FjaGU6ICVkSyIsIGwxaSk7CisJCWlmICggbDFkICkKKwkJCXByaW50aygiLCBMMSBEIGNhY2hlOiAlZEtcbiIsIGwxZCk7CisJCWVsc2UKKwkJCXByaW50aygiXG4iKTsKKwkJaWYgKCBsMiApCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwyIGNhY2hlOiAlZEtcbiIsIGwyKTsKKwkJaWYgKCBsMyApCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwzIGNhY2hlOiAlZEtcbiIsIGwzKTsKKworCQkvKgorCQkgKiBUaGlzIGFzc3VtZXMgdGhlIEwzIGNhY2hlIGlzIHNoYXJlZDsgaXQgdHlwaWNhbGx5IGxpdmVzIGluCisJCSAqIHRoZSBub3J0aGJyaWRnZS4gIFRoZSBMMSBjYWNoZXMgYXJlIGluY2x1ZGVkIGJ5IHRoZSBMMgorCQkgKiBjYWNoZSwgYW5kIHNvIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgZm9yIHRoZSBwdXJwb3NlIG9mCisJCSAqIFNNUCBzd2l0Y2hpbmcgd2VpZ2h0cy4KKwkJICovCisJCWMtPng4Nl9jYWNoZV9zaXplID0gbDIgPyBsMiA6IChsMWkrbDFkKTsKKwl9CisKKwlyZXR1cm4gbDI7Cit9CisKKy8qIHBvaW50ZXIgdG8gX2NwdWlkNF9pbmZvIGFycmF5IChmb3IgZWFjaCBjYWNoZSBsZWFmKSAqLworc3RhdGljIHN0cnVjdCBfY3B1aWQ0X2luZm8gKmNwdWlkNF9pbmZvW05SX0NQVVNdOworI2RlZmluZSBDUFVJRDRfSU5GT19JRFgoeCx5KSAgICAoJigoY3B1aWQ0X2luZm9beF0pW3ldKSkKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjYWNoZV9zaGFyZWRfY3B1X21hcF9zZXR1cCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IF9jcHVpZDRfaW5mbwkqdGhpc19sZWFmOworCXVuc2lnbmVkIGxvbmcgbnVtX3RocmVhZHNfc2hhcmluZzsKKworCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGluZGV4KTsKKwludW1fdGhyZWFkc19zaGFyaW5nID0gMSArIHRoaXNfbGVhZi0+ZWF4LnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmc7CisKKwlpZiAobnVtX3RocmVhZHNfc2hhcmluZyA9PSAxKQorCQljcHVfc2V0KGNwdSwgdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCWVsc2UgaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gc21wX251bV9zaWJsaW5ncykKKwkJdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCA9IGNwdV9zaWJsaW5nX21hcFtjcHVdOworI2VuZGlmCisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJOdW1iZXIgb2YgQ1BVcyBzaGFyaW5nIGNhY2hlIGRpZG4ndCBtYXRjaCAiCisJCQkJImFueSBrbm93biBzZXQgb2YgQ1BVc1xuIik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGNhY2hlX3NoYXJlZF9jcHVfbWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmcmVlX2NhY2hlX2F0dHJpYnV0ZXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlrZnJlZShjcHVpZDRfaW5mb1tjcHVdKTsKKwljcHVpZDRfaW5mb1tjcHVdID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZGV0ZWN0X2NhY2hlX2F0dHJpYnV0ZXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgX2NwdWlkNF9pbmZvCSp0aGlzX2xlYWY7CisJdW5zaWduZWQgbG9uZyAJCWo7CisJaW50IAkJCXJldHZhbDsKKworCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJY3B1aWQ0X2luZm9bY3B1XSA9IGttYWxsb2MoCisJICAgIHNpemVvZihzdHJ1Y3QgX2NwdWlkNF9pbmZvKSAqIG51bV9jYWNoZV9sZWF2ZXMsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjcHVpZDRfaW5mb1tjcHVdID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoY3B1aWQ0X2luZm9bY3B1XSwgMCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBfY3B1aWQ0X2luZm8pICogbnVtX2NhY2hlX2xlYXZlcyk7CisKKwkvKiBEbyBjcHVpZCBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgKi8KKwlmb3IgKGogPSAwOyBqIDwgbnVtX2NhY2hlX2xlYXZlczsgaisrKSB7CisJCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGopOworCQlyZXR2YWwgPSBjcHVpZDRfY2FjaGVfbG9va3VwKGosIHRoaXNfbGVhZik7CisJCWlmICh1bmxpa2VseShyZXR2YWwgPCAwKSkKKwkJCWdvdG8gZXJyX291dDsKKwkJY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAoY3B1LCBqKTsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJZnJlZV9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCitleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBjcHVfc3lzZGV2X2NsYXNzOyAvKiBmcm9tIGRyaXZlcnMvYmFzZS9jcHUuYyAqLworCisvKiBwb2ludGVyIHRvIGtvYmplY3QgZm9yIGNwdVgvY2FjaGUgKi8KK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIGNhY2hlX2tvYmplY3RbTlJfQ1BVU107CisKK3N0cnVjdCBfaW5kZXhfa29iamVjdCB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXVuc2lnbmVkIHNob3J0IGluZGV4OworfTsKKworLyogcG9pbnRlciB0byBhcnJheSBvZiBrb2JqZWN0cyBmb3IgY3B1WC9jYWNoZS9pbmRleFkgKi8KK3N0YXRpYyBzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKmluZGV4X2tvYmplY3RbTlJfQ1BVU107CisjZGVmaW5lIElOREVYX0tPQkpFQ1RfUFRSKHgseSkgICAgKCYoKGluZGV4X2tvYmplY3RbeF0pW3ldKSkKKworI2RlZmluZSBzaG93X29uZV9wbHVzKGZpbGVfbmFtZSwgb2JqZWN0LCB2YWwpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWxlX25hbWUJCQkJCQlcCisJCQkoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpdGhpc19sZWFmLT5vYmplY3QgKyB2YWwpOyBcCit9CisKK3Nob3dfb25lX3BsdXMobGV2ZWwsIGVheC5zcGxpdC5sZXZlbCwgMCk7CitzaG93X29uZV9wbHVzKGNvaGVyZW5jeV9saW5lX3NpemUsIGVieC5zcGxpdC5jb2hlcmVuY3lfbGluZV9zaXplLCAxKTsKK3Nob3dfb25lX3BsdXMocGh5c2ljYWxfbGluZV9wYXJ0aXRpb24sIGVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgMSk7CitzaG93X29uZV9wbHVzKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSwgMSk7CitzaG93X29uZV9wbHVzKG51bWJlcl9vZl9zZXRzLCBlY3guc3BsaXQubnVtYmVyX29mX3NldHMsIDEpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3NpemUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+c2l6ZSAvIDEwMjQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3NoYXJlZF9jcHVfbWFwKHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiwgY2hhciAqYnVmKQoreworCWNoYXIgbWFza19zdHJbTlJfQ1BVU107CisJY3B1bWFza19zY25wcmludGYobWFza19zdHIsIE5SX0NQVVMsIHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBtYXNrX3N0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikgeworCXN3aXRjaCh0aGlzX2xlYWYtPmVheC5zcGxpdC50eXBlKSB7CisJICAgIGNhc2UgQ0FDSEVfVFlQRV9EQVRBOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEYXRhXG4iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ0FDSEVfVFlQRV9JTlNUOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJJbnN0cnVjdGlvblxuIik7CisJCWJyZWFrOworCSAgICBjYXNlIENBQ0hFX1RZUEVfVU5JRklFRDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiVW5pZmllZFxuIik7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJVbmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgX2NhY2hlX2F0dHIgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIFwKK3N0YXRpYyBzdHJ1Y3QgX2NhY2hlX2F0dHIgX25hbWUgPSBcCisJX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUsIE5VTEwpCisKK2RlZmluZV9vbmVfcm8obGV2ZWwpOworZGVmaW5lX29uZV9ybyh0eXBlKTsKK2RlZmluZV9vbmVfcm8oY29oZXJlbmN5X2xpbmVfc2l6ZSk7CitkZWZpbmVfb25lX3JvKHBoeXNpY2FsX2xpbmVfcGFydGl0aW9uKTsKK2RlZmluZV9vbmVfcm8od2F5c19vZl9hc3NvY2lhdGl2aXR5KTsKK2RlZmluZV9vbmVfcm8obnVtYmVyX29mX3NldHMpOworZGVmaW5lX29uZV9ybyhzaXplKTsKK2RlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9tYXApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRlZmF1bHRfYXR0cnNbXSA9IHsKKwkmdHlwZS5hdHRyLAorCSZsZXZlbC5hdHRyLAorCSZjb2hlcmVuY3lfbGluZV9zaXplLmF0dHIsCisJJnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uLmF0dHIsCisJJndheXNfb2ZfYXNzb2NpYXRpdml0eS5hdHRyLAorCSZudW1iZXJfb2Zfc2V0cy5hdHRyLAorCSZzaXplLmF0dHIsCisJJnNoYXJlZF9jcHVfbWFwLmF0dHIsCisJTlVMTAorfTsKKworI2RlZmluZSB0b19vYmplY3QoaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBfaW5kZXhfa29iamVjdCwga29iaikKKyNkZWZpbmUgdG9fYXR0cihhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IF9jYWNoZV9hdHRyLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBzaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCit7CisJc3RydWN0IF9jYWNoZV9hdHRyICpmYXR0ciA9IHRvX2F0dHIoYXR0cik7CisJc3RydWN0IF9pbmRleF9rb2JqZWN0ICp0aGlzX2xlYWYgPSB0b19vYmplY3Qoa29iaik7CisJc3NpemVfdCByZXQ7CisKKwlyZXQgPSBmYXR0ci0+c2hvdyA/CisJCWZhdHRyLT5zaG93KENQVUlENF9JTkZPX0lEWCh0aGlzX2xlYWYtPmNwdSwgdGhpc19sZWFmLT5pbmRleCksCisJCQlidWYpIDoKKwkgICAgICAgCTA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwKKwkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHN5c2ZzX29wcyA9IHsKKwkuc2hvdyAgID0gc2hvdywKKwkuc3RvcmUgID0gc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9jYWNoZSA9IHsKKwkuc3lzZnNfb3BzCT0gJnN5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IGRlZmF1bHRfYXR0cnMsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9wZXJjcHVfZW50cnkgPSB7CisJLnN5c2ZzX29wcwk9ICZzeXNmc19vcHMsCit9OworCitzdGF0aWMgdm9pZCBjcHVpZDRfY2FjaGVfc3lzZnNfZXhpdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWtmcmVlKGNhY2hlX2tvYmplY3RbY3B1XSk7CisJa2ZyZWUoaW5kZXhfa29iamVjdFtjcHVdKTsKKwljYWNoZV9rb2JqZWN0W2NwdV0gPSBOVUxMOworCWluZGV4X2tvYmplY3RbY3B1XSA9IE5VTEw7CisJZnJlZV9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkNF9jYWNoZV9zeXNmc19pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisKKwlpZiAobnVtX2NhY2hlX2xlYXZlcyA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWRldGVjdF9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7CisJaWYgKGNwdWlkNF9pbmZvW2NwdV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiBBbGxvY2F0ZSBhbGwgcmVxdWlyZWQgbWVtb3J5ICovCisJY2FjaGVfa29iamVjdFtjcHVdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtvYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoY2FjaGVfa29iamVjdFtjcHVdID09IE5VTEwpKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KGNhY2hlX2tvYmplY3RbY3B1XSwgMCwgc2l6ZW9mKHN0cnVjdCBrb2JqZWN0KSk7CisKKwlpbmRleF9rb2JqZWN0W2NwdV0gPSBrbWFsbG9jKAorCSAgICBzaXplb2Yoc3RydWN0IF9pbmRleF9rb2JqZWN0ICkgKiBudW1fY2FjaGVfbGVhdmVzLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoaW5kZXhfa29iamVjdFtjcHVdID09IE5VTEwpKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KGluZGV4X2tvYmplY3RbY3B1XSwgMCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBfaW5kZXhfa29iamVjdCkgKiBudW1fY2FjaGVfbGVhdmVzKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIEFkZC9SZW1vdmUgY2FjaGUgaW50ZXJmYWNlIGZvciBDUFUgZGV2aWNlICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjYWNoZV9hZGRfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisJdW5zaWduZWQgbG9uZyBpLCBqOworCXN0cnVjdCBfaW5kZXhfa29iamVjdCAqdGhpc19vYmplY3Q7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSBjcHVpZDRfY2FjaGVfc3lzZnNfaW5pdChjcHUpOworCWlmICh1bmxpa2VseShyZXR2YWwgPCAwKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhY2hlX2tvYmplY3RbY3B1XS0+cGFyZW50ID0gJnN5c19kZXYtPmtvYmo7CisJa29iamVjdF9zZXRfbmFtZShjYWNoZV9rb2JqZWN0W2NwdV0sICIlcyIsICJjYWNoZSIpOworCWNhY2hlX2tvYmplY3RbY3B1XS0+a3R5cGUgPSAma3R5cGVfcGVyY3B1X2VudHJ5OworCXJldHZhbCA9IGtvYmplY3RfcmVnaXN0ZXIoY2FjaGVfa29iamVjdFtjcHVdKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspIHsKKwkJdGhpc19vYmplY3QgPSBJTkRFWF9LT0JKRUNUX1BUUihjcHUsaSk7CisJCXRoaXNfb2JqZWN0LT5jcHUgPSBjcHU7CisJCXRoaXNfb2JqZWN0LT5pbmRleCA9IGk7CisJCXRoaXNfb2JqZWN0LT5rb2JqLnBhcmVudCA9IGNhY2hlX2tvYmplY3RbY3B1XTsKKwkJa29iamVjdF9zZXRfbmFtZSgmKHRoaXNfb2JqZWN0LT5rb2JqKSwgImluZGV4JTFsdSIsIGkpOworCQl0aGlzX29iamVjdC0+a29iai5rdHlwZSA9ICZrdHlwZV9jYWNoZTsKKwkJcmV0dmFsID0ga29iamVjdF9yZWdpc3RlcigmKHRoaXNfb2JqZWN0LT5rb2JqKSk7CisJCWlmICh1bmxpa2VseShyZXR2YWwpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJa29iamVjdF91bnJlZ2lzdGVyKAorCQkJCQkmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSxqKS0+a29iaikpOworCQkJfQorCQkJa29iamVjdF91bnJlZ2lzdGVyKGNhY2hlX2tvYmplY3RbY3B1XSk7CisJCQljcHVpZDRfY2FjaGVfc3lzZnNfZXhpdChjcHUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY2FjaGVfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHN5c19kZXYtPmlkOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspCisJCWtvYmplY3RfdW5yZWdpc3RlcigmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSxpKS0+a29iaikpOworCWtvYmplY3RfdW5yZWdpc3RlcihjYWNoZV9rb2JqZWN0W2NwdV0pOworCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBjYWNoZV9zeXNkZXZfZHJpdmVyID0geworCS5hZGQgPSBjYWNoZV9hZGRfZGV2LAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChjYWNoZV9yZW1vdmVfZGV2KSwKK307CisKKy8qIFJlZ2lzdGVyL1VucmVnaXN0ZXIgdGhlIGNwdV9jYWNoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGNhY2hlX3JlZ2lzdGVyX2RyaXZlcih2b2lkKQoreworCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsJmNhY2hlX3N5c2Rldl9kcml2ZXIpOworfQorCitkZXZpY2VfaW5pdGNhbGwoY2FjaGVfcmVnaXN0ZXJfZHJpdmVyKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkJPQltY2UubyBrNy5vIHA0Lm8gcDUubyBwNi5vIHdpbmNoaXAubworb2JqLSQoQ09ORklHX1g4Nl9NQ0VfTk9ORkFUQUwpCSs9CW5vbi1mYXRhbC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjUyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svazcuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQXRobG9uL0hhbW1lciBzcGVjaWZpYyBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBSZXBvcnRpbmcKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBDaGVjayBIYW5kbGVyIEZvciBBTUQgQXRobG9uL0R1cm9uICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBrN19tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWludCByZWNvdmVyPTE7CisJdTMyIGFsb3csIGFoaWdoLCBoaWdoLCBsb3c7CisJdTMyIG1jZ3N0bCwgbWNnc3RoOworCWludCBpOworCisJcmRtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsIG1jZ3N0bCwgbWNnc3RoKTsKKwlpZiAobWNnc3RsICYgKDE8PDApKQkvKiBSZWNvdmVyYWJsZSA/ICovCisJCXJlY292ZXI9MDsKKworCXByaW50ayAoS0VSTl9FTUVSRyAiQ1BVICVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogJTA4eCUwOHhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgbWNnc3RoLCBtY2dzdGwpOworCisJZm9yIChpPTE7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMraSo0LGxvdywgaGlnaCk7CisJCWlmIChoaWdoJigxPDwzMSkpIHsKKwkJCWlmIChoaWdoICYgKDE8PDI5KSkKKwkJCQlyZWNvdmVyIHw9IDE7CisJCQlpZiAoaGlnaCAmICgxPDwyNSkpCisJCQkJcmVjb3ZlciB8PSAyOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJCYW5rICVkOiAlMDh4JTA4eCIsIGksIGhpZ2gsIGxvdyk7CisJCQloaWdoICY9IH4oMTw8MzEpOworCQkJaWYgKGhpZ2ggJiAoMTw8MjcpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9NSVNDK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIlslMDh4JTA4eF0iLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlpZiAoaGlnaCAmICgxPDwyNikpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX0FERFIraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiIGF0ICUwOHglMDh4IiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJcHJpbnRrICgiXG4iKTsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQsIDBVTCwgMFVMKTsKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9CisKKwlpZiAocmVjb3ZlciYyKQorCQlwYW5pYyAoIkNQVSBjb250ZXh0IGNvcnJ1cHQiKTsKKwlpZiAocmVjb3ZlciYxKQorCQlwYW5pYyAoIlVuYWJsZSB0byBjb250aW51ZSIpOworCXByaW50ayAoS0VSTl9FTUVSRyAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCW1jZ3N0bCAmPSB+KDE8PDIpOworCXdybXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLG1jZ3N0bCwgbWNnc3RoKTsKK30KKworCisvKiBBTUQgSzcgbWFjaGluZSBjaGVjayBpcyBJbnRlbCBsaWtlICovCit2b2lkIF9faW5pdCBhbWRfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCWludCBpOworCisJbWFjaGluZV9jaGVja192ZWN0b3IgPSBrN19tYWNoaW5lX2NoZWNrOworCXdtYigpOworCisJcHJpbnRrIChLRVJOX0lORk8gIkludGVsIG1hY2hpbmUgY2hlY2sgYXJjaGl0ZWN0dXJlIHN1cHBvcnRlZC5cbiIpOworCXJkbXNyIChNU1JfSUEzMl9NQ0dfQ0FQLCBsLCBoKTsKKwlpZiAobCAmICgxPDw4KSkJLyogQ29udHJvbCByZWdpc3RlciBwcmVzZW50ID8gKi8KKwkJd3Jtc3IgKE1TUl9JQTMyX01DR19DVEwsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCW5yX21jZV9iYW5rcyA9IGwgJiAweGZmOworCisJLyogQ2xlYXIgc3RhdHVzIGZvciBNQyBpbmRleCAwIHNlcGFyYXRlbHksIHdlIGRvbid0IHRvdWNoIENUTCwKKwkgKiBhcyBzb21lIEF0aGxvbnMgY2F1c2Ugc3B1cmlvdXMgTUNFcyB3aGVuIGl0cyBlbmFibGVkLiAqLworCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTLCAweDAsIDB4MCk7CisJZm9yIChpPTE7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9DVEwrNCppLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMrNCppLCAweDAsIDB4MCk7CisJfQorCisJc2V0X2luX2NyNCAoWDg2X0NSNF9NQ0UpOworCXByaW50ayAoS0VSTl9JTkZPICJJbnRlbCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMlZC5cbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2ZDFhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogbWNlLmMgLSB4ODYgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoYykgMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCitpbnQgbWNlX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAwOworaW50IG5yX21jZV9iYW5rczsKKworRVhQT1JUX1NZTUJPTF9HUEwobnJfbWNlX2JhbmtzKTsJLyogbm9uLWZhdGFsLm8gKi8KKworLyogSGFuZGxlIHVuY29uZmlndXJlZCBpbnQxOCAoc2hvdWxkIG5ldmVyIGhhcHBlbikgKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIHVuZXhwZWN0ZWRfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sJCisJcHJpbnRrKEtFUk5fRVJSICJDUFUjJWQ6IFVuZXhwZWN0ZWQgaW50MTggKE1hY2hpbmUgQ2hlY2spLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworLyogQ2FsbCB0aGUgaW5zdGFsbGVkIG1hY2hpbmUgY2hlY2sgaGFuZGxlciBmb3IgdGhpcyBDUFUgc2V0dXAuICovCit2b2lkIGZhc3RjYWxsICgqbWFjaGluZV9jaGVja192ZWN0b3IpKHN0cnVjdCBwdF9yZWdzICosIGxvbmcgZXJyb3JfY29kZSkgPSB1bmV4cGVjdGVkX21hY2hpbmVfY2hlY2s7CisKKy8qIFRoaXMgaGFzIHRvIGJlIHJ1biBmb3IgZWFjaCBwcm9jZXNzb3IgKi8KK3ZvaWQgX19pbml0IG1jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlpZiAobWNlX2Rpc2FibGVkPT0xKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGMtPng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWlmIChjLT54ODY9PTYgfHwgYy0+eDg2PT0xNSkKKwkJCQlhbWRfbWNoZWNrX2luaXQoYyk7CisJCQlicmVhazsKKworCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlpZiAoYy0+eDg2PT01KQorCQkJCWludGVsX3A1X21jaGVja19pbml0KGMpOworCQkJaWYgKGMtPng4Nj09NikKKwkJCQlpbnRlbF9wNl9tY2hlY2tfaW5pdChjKTsKKwkJCWlmIChjLT54ODY9PTE1KQorCQkJCWludGVsX3A0X21jaGVja19pbml0KGMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYODZfVkVORE9SX0NFTlRBVVI6CisJCQlpZiAoYy0+eDg2PT01KQorCQkJCXdpbmNoaXBfbWNoZWNrX2luaXQoYyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfZGlzYWJsZShjaGFyICpzdHIpCit7CisJbWNlX2Rpc2FibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWNoZWNrX2VuYWJsZShjaGFyICpzdHIpCit7CisJbWNlX2Rpc2FibGVkID0gLTE7CisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoIm5vbWNlIiwgbWNoZWNrX2Rpc2FibGUpOworX19zZXR1cCgibWNlIiwgbWNoZWNrX2VuYWJsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyNDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuaApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit2b2lkIGFtZF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNV9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNl9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCB3aW5jaGlwX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKKy8qIENhbGwgdGhlIGluc3RhbGxlZCBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgZm9yIHRoaXMgQ1BVIHNldHVwLiAqLworZXh0ZXJuIGZhc3RjYWxsIHZvaWQgKCptYWNoaW5lX2NoZWNrX3ZlY3Rvcikoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyBlcnJvcl9jb2RlKTsKKworZXh0ZXJuIGludCBtY2VfZGlzYWJsZWQgX19pbml0ZGF0YTsKK2V4dGVybiBpbnQgbnJfbWNlX2JhbmtzOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbm9uLWZhdGFsLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbm9uLWZhdGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2NGRkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9ub24tZmF0YWwuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogTm9uIEZhdGFsIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBEYXZlIEpvbmVzLiA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGNoZWNrIGZvciBub24tZmF0YWwgTUNFcyBldmVyeSAxNXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCitzdGF0aWMgaW50IGZpcnN0YmFuazsKKworI2RlZmluZSBNQ0VfUkFURQkxNSpIWgkvKiB0aW1lciByYXRlIGlzIDE1cyAqLworCitzdGF0aWMgdm9pZCBtY2VfY2hlY2tyZWdzICh2b2lkICppbmZvKQoreworCXUzMiBsb3csIGhpZ2g7CisJaW50IGk7CisKKwlmb3IgKGk9Zmlyc3RiYW5rOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXJkbXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCwgbG93LCBoaWdoKTsKKworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk1DRTogVGhlIGhhcmR3YXJlIHJlcG9ydHMgYSBub24gIgorCQkJCSJmYXRhbCwgY29ycmVjdGFibGUgaW5jaWRlbnQgb2NjdXJyZWQgb24gIgorCQkJCSJDUFUgJWQuXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQmFuayAlZDogJTA4eCUwOHhcbiIsIGksIGhpZ2gsIGxvdyk7CisKKwkJCS8qIFNjcnViIHRoZSBlcnJvciBzbyB3ZSBkb24ndCBwaWNrIGl0IHVwIGluIE1DRV9SQVRFIHNlY29uZHMgdGltZS4gKi8KKwkJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCwgMFVMLCAwVUwpOworCisJCQkvKiBTZXJpYWxpemUgKi8KKwkJCXdtYigpOworCQkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBtY2Vfd29ya19mbih2b2lkICpkYXRhKTsKK3N0YXRpYyBERUNMQVJFX1dPUksobWNlX3dvcmssIG1jZV93b3JrX2ZuLCBOVUxMKTsKKworc3RhdGljIHZvaWQgbWNlX3dvcmtfZm4odm9pZCAqZGF0YSkKK3sgCisJb25fZWFjaF9jcHUobWNlX2NoZWNrcmVncywgTlVMTCwgMSwgMSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtY2Vfd29yaywgTUNFX1JBVEUpOworfSAKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ub25mYXRhbF9tY2VfY2hlY2tlcih2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJLyogQ2hlY2sgZm9yIE1DRSBzdXBwb3J0ICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DRSkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIFBQcm8gc3R5bGUgTUNBICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DQSkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogU29tZSBBdGhsb25zIG1pc2JlaGF2ZSB3aGVuIHdlIGZyb2IgYmFuayAwICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgorCQlib290X2NwdV9kYXRhLng4NiA9PSA2KQorCQkJZmlyc3RiYW5rID0gMTsKKwllbHNlCisJCQlmaXJzdGJhbmsgPSAwOworCisJLyoKKwkgKiBDaGVjayBmb3Igbm9uLWZhdGFsIGVycm9ycyBldmVyeSBNQ0VfUkFURSBzCisJICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtY2Vfd29yaywgTUNFX1JBVEUpOworCXByaW50ayhLRVJOX0lORk8gIk1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIHBvbGxpbmcgdGltZXIgc3RhcnRlZC5cbiIpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoaW5pdF9ub25mYXRhbF9tY2VfY2hlY2tlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxNmNlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogUDQgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogYXMgc3VwcG9ydGVkIGJ5IHRoZSBQNC9YZW9uIGZhbWlseSAqLworc3RydWN0IGludGVsX21jZV9leHRlbmRlZF9tc3JzIHsKKwl1MzIgZWF4OworCXUzMiBlYng7CisJdTMyIGVjeDsKKwl1MzIgZWR4OworCXUzMiBlc2k7CisJdTMyIGVkaTsKKwl1MzIgZWJwOworCXUzMiBlc3A7CisJdTMyIGVmbGFnczsKKwl1MzIgZWlwOworCS8qIHUzMiAqcmVzZXJ2ZWRbXTsgKi8KK307CisKK3N0YXRpYyBpbnQgbWNlX251bV9leHRlbmRlZF9tc3JzID0gMDsKKworCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCitzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX3RoZXJtYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQorewkKKwlwcmludGsoS0VSTl9FUlIgIkNQVSVkOiBVbmV4cGVjdGVkIExWVCBUTVIgaW50ZXJydXB0IVxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworfQorCisvKiBQNC9YZW9uIFRoZXJtYWwgdHJhbnNpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgaW50ZWxfdGhlcm1hbF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIGwsIGg7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0W05SX0NQVVNdOworCisJYWNrX0FQSUNfaXJxKCk7CisKKwlpZiAodGltZV9hZnRlcihuZXh0W2NwdV0sIGppZmZpZXMpKQorCQlyZXR1cm47CisKKwluZXh0W2NwdV0gPSBqaWZmaWVzICsgSFoqNTsKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9TVEFUVVMsIGwsIGgpOworCWlmIChsICYgMHgxKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJDUFUlZDogVGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkXG4iLCBjcHUpOworCQlwcmludGsoS0VSTl9FTUVSRyAiQ1BVJWQ6IFJ1bm5pbmcgaW4gbW9kdWxhdGVkIGNsb2NrIG1vZGVcbiIsCisJCQkJY3B1KTsKKwkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNQVSVkOiBUZW1wZXJhdHVyZS9zcGVlZCBub3JtYWxcbiIsIGNwdSk7CisJfQorfQorCisvKiBUaGVybWFsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGlzIENQVSBzZXR1cCAqLworc3RhdGljIHZvaWQgKCp2ZW5kb3JfdGhlcm1hbF9pbnRlcnJ1cHQpKHN0cnVjdCBwdF9yZWdzICpyZWdzKSA9IHVuZXhwZWN0ZWRfdGhlcm1hbF9pbnRlcnJ1cHQ7CisKK2Zhc3RjYWxsIHZvaWQgc21wX3RoZXJtYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlycV9lbnRlcigpOworCXZlbmRvcl90aGVybWFsX2ludGVycnVwdChyZWdzKTsKKwlpcnFfZXhpdCgpOworfQorCisvKiBQNC9YZW9uIFRoZXJtYWwgcmVndWxhdGlvbiBkZXRlY3QgYW5kIGluaXQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpbnRlbF9pbml0X3RoZXJtYWwoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBUaGVybWFsIG1vbml0b3JpbmcgKi8KKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQUNQSSkpCisJCXJldHVybjsJLyogLUVOT0RFViAqLworCisJLyogQ2xvY2sgbW9kdWxhdGlvbiAqLworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ0MpKQorCQlyZXR1cm47CS8qIC1FTk9ERVYgKi8KKworCS8qIGZpcnN0IGNoZWNrIGlmIGl0cyBlbmFibGVkIGFscmVhZHksIGluIHdoaWNoIGNhc2UgdGhlcmUgbWlnaHQKKwkgKiBiZSBzb21lIFNNTSBnb28gd2hpY2ggaGFuZGxlcyBpdCwgc28gd2UgY2FuJ3QgZXZlbiBwdXQgYSBoYW5kbGVyCisJICogc2luY2UgaXQgbWlnaHQgYmUgZGVsaXZlcmVkIHZpYSBTTUkgYWxyZWFkeSAtendhbmVtLgorCSAqLworCXJkbXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisJaCA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworCWlmICgobCAmICgxPDwzKSkgJiYgKGggJiBBUElDX0RNX1NNSSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNQVSVkOiBUaGVybWFsIG1vbml0b3JpbmcgaGFuZGxlZCBieSBTTUlcbiIsCisJCQkJY3B1KTsKKwkJcmV0dXJuOyAvKiAtRUJVU1kgKi8KKwl9CisKKwkvKiBjaGVjayB3aGV0aGVyIGEgdmVjdG9yIGFscmVhZHkgZXhpc3RzLCB0ZW1wb3JhcmlseSBtYXNrZWQ/ICovCQorCWlmIChoICYgQVBJQ19WRUNUT1JfTUFTSykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1BVJWQ6IFRoZXJtYWwgTFZUIHZlY3RvciAoJSN4KSBhbHJlYWR5ICIKKwkJCQkiaW5zdGFsbGVkXG4iLAorCQkJY3B1LCAoaCAmIEFQSUNfVkVDVE9SX01BU0spKTsKKwkJcmV0dXJuOyAvKiAtRUJVU1kgKi8KKwl9CisKKwkvKiBUaGUgdGVtcGVyYXR1cmUgdHJhbnNpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciBzZXR1cCAqLworCWggPSBUSEVSTUFMX0FQSUNfVkVDVE9SOwkJLyogb3VyIGRlbGl2ZXJ5IHZlY3RvciAqLworCWggfD0gKEFQSUNfRE1fRklYRUQgfCBBUElDX0xWVF9NQVNLRUQpOwkvKiB3ZSdsbCBtYXNrIHRpbGwgd2UncmUgcmVhZHkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFRITVIsIGgpOworCisJcmRtc3IgKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwgbCwgaCk7CisJd3Jtc3IgKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwgbCB8IDB4MDMgLCBoKTsKKworCS8qIG9rIHdlJ3JlIGdvb2QgdG8gZ28uLi4gKi8KKwl2ZW5kb3JfdGhlcm1hbF9pbnRlcnJ1cHQgPSBpbnRlbF90aGVybWFsX2ludGVycnVwdDsKKwkKKwlyZG1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCXdybXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCB8ICgxPDwzKSwgaCk7CisJCisJbCA9IGFwaWNfcmVhZCAoQVBJQ19MVlRUSE1SKTsKKwlhcGljX3dyaXRlX2Fyb3VuZCAoQVBJQ19MVlRUSE1SLCBsICYgfkFQSUNfTFZUX01BU0tFRCk7CisJcHJpbnRrIChLRVJOX0lORk8gIkNQVSVkOiBUaGVybWFsIG1vbml0b3JpbmcgZW5hYmxlZFxuIiwgY3B1KTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMICovCisKKworLyogUDQvWGVvbiBFeHRlbmRlZCBNQ0UgTVNSIHJldHJpZXZhbCwgcmV0dXJuIDAgaWYgdW5zdXBwb3J0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGludGVsX2dldF9leHRlbmRlZF9tc3JzKHN0cnVjdCBpbnRlbF9tY2VfZXh0ZW5kZWRfbXNycyAqcikKK3sKKwl1MzIgaDsKKworCWlmIChtY2VfbnVtX2V4dGVuZGVkX21zcnMgPT0gMCkKKwkJZ290byBkb25lOworCisJcmRtc3IgKE1TUl9JQTMyX01DR19FQVgsIHItPmVheCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQlgsIHItPmVieCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQ1gsIHItPmVjeCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FRFgsIHItPmVkeCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FU0ksIHItPmVzaSwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FREksIHItPmVkaSwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQlAsIHItPmVicCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FU1AsIHItPmVzcCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FRkxBR1MsIHItPmVmbGFncywgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FSVAsIHItPmVpcCwgaCk7CisKKwkvKiBjYW4gd2UgcmVseSBvbiBrbWFsbG9jIHRvIGRvIGEgZHluYW1pYworCSAqIGFsbG9jYXRpb24gZm9yIHRoZSByZXNlcnZlZCByZWdpc3RlcnM/CisJICovCitkb25lOgorCXJldHVybiBtY2VfbnVtX2V4dGVuZGVkX21zcnM7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIGludGVsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IHJlY292ZXI9MTsKKwl1MzIgYWxvdywgYWhpZ2gsIGhpZ2gsIGxvdzsKKwl1MzIgbWNnc3RsLCBtY2dzdGg7CisJaW50IGk7CisJc3RydWN0IGludGVsX21jZV9leHRlbmRlZF9tc3JzIGRiZzsKKworCXJkbXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLCBtY2dzdGwsIG1jZ3N0aCk7CisJaWYgKG1jZ3N0bCAmICgxPDwwKSkJLyogUmVjb3ZlcmFibGUgPyAqLworCQlyZWNvdmVyPTA7CisKKwlwcmludGsgKEtFUk5fRU1FUkcgIkNQVSAlZDogTWFjaGluZSBDaGVjayBFeGNlcHRpb246ICUwOHglMDh4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1jZ3N0aCwgbWNnc3RsKTsKKworCWlmIChpbnRlbF9nZXRfZXh0ZW5kZWRfbXNycygmZGJnKSkgeworCQlwcmludGsgKEtFUk5fREVCVUcgIkNQVSAlZDogRUlQOiAlMDh4IEVGTEFHUzogJTA4eFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZGJnLmVpcCwgZGJnLmVmbGFncyk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiXHRlYXg6ICUwOHggZWJ4OiAlMDh4IGVjeDogJTA4eCBlZHg6ICUwOHhcbiIsCisJCQlkYmcuZWF4LCBkYmcuZWJ4LCBkYmcuZWN4LCBkYmcuZWR4KTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJcdGVzaTogJTA4eCBlZGk6ICUwOHggZWJwOiAlMDh4IGVzcDogJTA4eFxuIiwKKwkJCWRiZy5lc2ksIGRiZy5lZGksIGRiZy5lYnAsIGRiZy5lc3ApOworCX0KKworCWZvciAoaT0wOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXJkbXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCxsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCWlmIChoaWdoICYgKDE8PDI5KSkKKwkJCQlyZWNvdmVyIHw9IDE7CisJCQlpZiAoaGlnaCAmICgxPDwyNSkpCisJCQkJcmVjb3ZlciB8PSAyOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJCYW5rICVkOiAlMDh4JTA4eCIsIGksIGhpZ2gsIGxvdyk7CisJCQloaWdoICY9IH4oMTw8MzEpOworCQkJaWYgKGhpZ2ggJiAoMTw8MjcpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9NSVNDK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIlslMDh4JTA4eF0iLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlpZiAoaGlnaCAmICgxPDwyNikpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX0FERFIraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiIGF0ICUwOHglMDh4IiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJcHJpbnRrICgiXG4iKTsKKwkJfQorCX0KKworCWlmIChyZWNvdmVyICYgMikKKwkJcGFuaWMgKCJDUFUgY29udGV4dCBjb3JydXB0Iik7CisJaWYgKHJlY292ZXIgJiAxKQorCQlwYW5pYyAoIlVuYWJsZSB0byBjb250aW51ZSIpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKwkvKiAKKwkgKiBEbyBub3QgY2xlYXIgdGhlIE1TUl9JQTMyX01DaV9TVEFUVVMgaWYgdGhlIGVycm9yIGlzIG5vdCAKKwkgKiByZWNvdmVyYWJsZS9jb250aW51YWJsZS5UaGlzIHdpbGwgYWxsb3cgQklPUyB0byBsb29rIGF0IHRoZSBNU1JzCisJICogZm9yIGVycm9ycyBpZiB0aGUgT1MgY291bGQgbm90IGxvZyB0aGUgZXJyb3IuCisJICovCisJZm9yIChpPTA7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJdTMyIG1zcjsKKwkJbXNyID0gTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQ7CisJCXJkbXNyIChtc3IsIGxvdywgaGlnaCk7CisJCWlmIChoaWdoJigxPDwzMSkpIHsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zcihtc3IsIDBVTCwgMFVMKTsKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9CisJbWNnc3RsICY9IH4oMTw8Mik7CisJd3Jtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsbWNnc3RsLCBtY2dzdGgpOworfQorCisKK3ZvaWQgX19pbml0IGludGVsX3A0X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKwlpbnQgaTsKKwkKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IGludGVsX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDgpKQkvKiBDb250cm9sIHJlZ2lzdGVyIHByZXNlbnQgPyAqLworCQl3cm1zciAoTVNSX0lBMzJfTUNHX0NUTCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJbnJfbWNlX2JhbmtzID0gbCAmIDB4ZmY7CisKKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl3cm1zciAoTVNSX0lBMzJfTUMwX0NUTCs0KmksIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCQl3cm1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUys0KmksIDB4MCwgMHgwKTsKKwl9CisKKwlzZXRfaW5fY3I0IChYODZfQ1I0X01DRSk7CisJcHJpbnRrIChLRVJOX0lORk8gIkludGVsIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQgb24gQ1BVIyVkLlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIENoZWNrIGZvciBQNC9YZW9uIGV4dGVuZGVkIE1DRSBNU1JzICovCisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDkpKQl7LyogTUNHX0VYVF9QICovCisJCW1jZV9udW1fZXh0ZW5kZWRfbXNycyA9IChsID4+IDE2KSAmIDB4ZmY7CisJCXByaW50ayAoS0VSTl9JTkZPICJDUFUlZDogSW50ZWwgUDQvWGVvbiBFeHRlbmRlZCBNQ0UgTVNScyAoJWQpIgorCQkJCSIgYXZhaWxhYmxlXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtY2VfbnVtX2V4dGVuZGVkX21zcnMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJCS8qIENoZWNrIGZvciBQNC9YZW9uIFRoZXJtYWwgbW9uaXRvciAqLworCQlpbnRlbF9pbml0X3RoZXJtYWwoYyk7CisjZW5kaWYKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWExYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDUuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogUDUgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBjaGVjayBoYW5kbGVyIGZvciBQZW50aXVtIGNsYXNzIEludGVsICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBwZW50aXVtX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJdTMyIGxvYWRkciwgaGksIGxvdHlwZTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19BRERSLCBsb2FkZHIsIGhpKTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19UWVBFLCBsb3R5cGUsIGhpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiQ1BVIyVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogIDB4JThYICh0eXBlIDB4JThYKS5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbG9hZGRyLCBsb3R5cGUpOworCWlmKGxvdHlwZSYoMTw8NSkpCisJCXByaW50ayhLRVJOX0VNRVJHICJDUFUjJWQ6IFBvc3NpYmxlIHRoZXJtYWwgZmFpbHVyZSAoQ1BVIG9uIGZpcmUgPykuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGZvciBwcm9jZXNzb3JzIHdpdGggSW50ZWwgc3R5bGUgTUNFICovCit2b2lkIF9faW5pdCBpbnRlbF9wNV9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJCisJLypDaGVjayBmb3IgTUNFIHN1cHBvcnQgKi8KKwlpZiggIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNFKSApCisJCXJldHVybjsJCisKKwkvKiBEZWZhdWx0IFA1IHRvIG9mZiBhcyBpdHMgb2Z0ZW4gbWlzY29ubmVjdGVkICovCisJaWYobWNlX2Rpc2FibGVkICE9IC0xKQorCQlyZXR1cm47CisJbWFjaGluZV9jaGVja192ZWN0b3IgPSBwZW50aXVtX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwkvKiBSZWFkIHJlZ2lzdGVycyBiZWZvcmUgZW5hYmxpbmcgKi8KKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19BRERSLCBsLCBoKTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19UWVBFLCBsLCBoKTsKKwlwcmludGsoS0VSTl9JTkZPICJJbnRlbCBvbGQgc3R5bGUgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisKKyAJLyogRW5hYmxlIE1DRSAqLworCXNldF9pbl9jcjQoWDg2X0NSNF9NQ0UpOworCXByaW50ayhLRVJOX0lORk8gIkludGVsIG9sZCBzdHlsZSBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMlZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIFA2IHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKKy8qIE1hY2hpbmUgQ2hlY2sgSGFuZGxlciBGb3IgUElJL1BJSUkgKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIGludGVsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IHJlY292ZXI9MTsKKwl1MzIgYWxvdywgYWhpZ2gsIGhpZ2gsIGxvdzsKKwl1MzIgbWNnc3RsLCBtY2dzdGg7CisJaW50IGk7CisKKwlyZG1zciAoTVNSX0lBMzJfTUNHX1NUQVRVUywgbWNnc3RsLCBtY2dzdGgpOworCWlmIChtY2dzdGwgJiAoMTw8MCkpCS8qIFJlY292ZXJhYmxlID8gKi8KKwkJcmVjb3Zlcj0wOworCisJcHJpbnRrIChLRVJOX0VNRVJHICJDUFUgJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAlMDh4JTA4eFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtY2dzdGgsIG1jZ3N0bCk7CisKKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQlyZG1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQsbG93LCBoaWdoKTsKKwkJaWYgKGhpZ2ggJiAoMTw8MzEpKSB7CisJCQlpZiAoaGlnaCAmICgxPDwyOSkpCisJCQkJcmVjb3ZlciB8PSAxOworCQkJaWYgKGhpZ2ggJiAoMTw8MjUpKQorCQkJCXJlY292ZXIgfD0gMjsKKwkJCXByaW50ayAoS0VSTl9FTUVSRyAiQmFuayAlZDogJTA4eCUwOHgiLCBpLCBoaWdoLCBsb3cpOworCQkJaGlnaCAmPSB+KDE8PDMxKTsKKwkJCWlmIChoaWdoICYgKDE8PDI3KSkgeworCQkJCXJkbXNyIChNU1JfSUEzMl9NQzBfTUlTQytpKjQsIGFsb3csIGFoaWdoKTsKKwkJCQlwcmludGsgKCJbJTA4eCUwOHhdIiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJaWYgKGhpZ2ggJiAoMTw8MjYpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9BRERSK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIiBhdCAlMDh4JTA4eCIsIGFoaWdoLCBhbG93KTsKKwkJCX0KKwkJCXByaW50ayAoIlxuIik7CisJCX0KKwl9CisKKwlpZiAocmVjb3ZlciAmIDIpCisJCXBhbmljICgiQ1BVIGNvbnRleHQgY29ycnVwdCIpOworCWlmIChyZWNvdmVyICYgMSkKKwkJcGFuaWMgKCJVbmFibGUgdG8gY29udGludWUiKTsKKworCXByaW50ayAoS0VSTl9FTUVSRyAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCS8qIAorCSAqIERvIG5vdCBjbGVhciB0aGUgTVNSX0lBMzJfTUNpX1NUQVRVUyBpZiB0aGUgZXJyb3IgaXMgbm90IAorCSAqIHJlY292ZXJhYmxlL2NvbnRpbnVhYmxlLlRoaXMgd2lsbCBhbGxvdyBCSU9TIHRvIGxvb2sgYXQgdGhlIE1TUnMKKwkgKiBmb3IgZXJyb3JzIGlmIHRoZSBPUyBjb3VsZCBub3QgbG9nIHRoZSBlcnJvci4KKwkgKi8KKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbXNyOworCQltc3IgPSBNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNDsKKwkJcmRtc3IgKG1zcixsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zciAobXNyLCAwVUwsIDBVTCk7CisJCQkvKiBTZXJpYWxpemUgKi8KKwkJCXdtYigpOworCQkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCQl9CisJfQorCW1jZ3N0bCAmPSB+KDE8PDIpOworCXdybXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLG1jZ3N0bCwgbWNnc3RoKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGZvciBwcm9jZXNzb3JzIHdpdGggSW50ZWwgc3R5bGUgTUNFICovCit2b2lkIF9faW5pdCBpbnRlbF9wNl9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJaW50IGk7CisJCisJLyogQ2hlY2sgZm9yIE1DRSBzdXBwb3J0ICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DRSkpCisJCXJldHVybjsKKworCS8qIENoZWNrIGZvciBQUHJvIHN0eWxlIE1DQSAqLworIAlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNBKSkKKwkJcmV0dXJuOworCisJLyogT2sgbWFjaGluZSBjaGVjayBpcyBhdmFpbGFibGUgKi8KKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IGludGVsX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDgpKQkvKiBDb250cm9sIHJlZ2lzdGVyIHByZXNlbnQgPyAqLworCQl3cm1zcihNU1JfSUEzMl9NQ0dfQ1RMLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwlucl9tY2VfYmFua3MgPSBsICYgMHhmZjsKKworCS8qIERvbid0IGVuYWJsZSBiYW5rIDAgb24gaW50ZWwgUDYgY29yZXMsIGl0IGdvZXMgYmFuZyBxdWlja2x5LiAqLworCWZvciAoaT0xOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfQ1RMKzQqaSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTKzQqaSwgMHgwLCAweDApOworCX0KKworCXNldF9pbl9jcjQgKFg4Nl9DUjRfTUNFKTsKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZW5hYmxlZCBvbiBDUFUjJWQuXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzZmE3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIElEVCBXaW5jaGlwIHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKKy8qIE1hY2hpbmUgY2hlY2sgaGFuZGxlciBmb3IgV2luQ2hpcCBDNiAqLworc3RhdGljIGZhc3RjYWxsIHZvaWQgd2luY2hpcF9tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXByaW50ayhLRVJOX0VNRVJHICJDUFUwOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbi5cbiIpOworCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIG9uIHRoZSBXaW5jaGlwIEM2IHNlcmllcyAqLwordm9pZCBfX2luaXQgd2luY2hpcF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGxvLCBoaTsKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IHdpbmNoaXBfbWFjaGluZV9jaGVjazsKKwl3bWIoKTsKKwlyZG1zcihNU1JfSURUX0ZDUjEsIGxvLCBoaSk7CisJbG98PSAoMTw8Mik7CS8qIEVuYWJsZSBFSUVSUklOVCAoaW50IDE4IE1DRSkgKi8KKwlsbyY9IH4oMTw8NCk7CS8qIEVuYWJsZSBNQ0UgKi8KKwl3cm1zcihNU1JfSURUX0ZDUjEsIGxvLCBoaSk7CisJc2V0X2luX2NyNChYODZfQ1I0X01DRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiV2luY2hpcCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMwLlxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjViNzAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai15CQk6PSBtYWluLm8gaWYubyBnZW5lcmljLm8gc3RhdGUubworb2JqLXkJCSs9IGFtZC5vCitvYmoteQkJKz0gY3lyaXgubworb2JqLXkJCSs9IGNlbnRhdXIubworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFlMDRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYwpAQCAtMCwwICsxLDEyMSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibXRyci5oIgorCitzdGF0aWMgdm9pZAorYW1kX2dldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7CisKKwlyZG1zcihNU1JfSzZfVVdDQ1IsIGxvdywgaGlnaCk7CisJLyogIFVwcGVyIGR3b3JkIGlzIHJlZ2lvbiAxLCBsb3dlciBpcyByZWdpb24gMCAgKi8KKwlpZiAocmVnID09IDEpCisJCWxvdyA9IGhpZ2g7CisJLyogIFRoZSBiYXNlIG1hc2tzIG9mZiBvbiB0aGUgcmlnaHQgYWxpZ25tZW50ICAqLworCSpiYXNlID0gKGxvdyAmIDB4RkZGRTAwMDApID4+IFBBR0VfU0hJRlQ7CisJKnR5cGUgPSAwOworCWlmIChsb3cgJiAxKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFOworCWlmIChsb3cgJiAyKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CisJaWYgKCEobG93ICYgMykpIHsKKwkJKnNpemUgPSAwOworCQlyZXR1cm47CisJfQorCS8qCisJICogIFRoaXMgbmVlZHMgYSBsaXR0bGUgZXhwbGFpbmluZy4gVGhlIHNpemUgaXMgc3RvcmVkIGFzIGFuCisJICogIGludmVydGVkIG1hc2sgb2YgYml0cyBvZiAxMjhLIGdyYW51bGFyaXR5IDE1IGJpdHMgbG9uZyBvZmZzZXQKKwkgKiAgMiBiaXRzCisJICoKKwkgKiAgU28gdG8gZ2V0IGEgc2l6ZSB3ZSBkbyBpbnZlcnQgdGhlIG1hc2sgYW5kIGFkZCAxIHRvIHRoZSBsb3dlc3QKKwkgKiAgbWFzayBiaXQgKDQgYXMgaXRzIDIgYml0cyBpbikuIFRoaXMgZ2l2ZXMgdXMgYSBzaXplIHdlIHRoZW4gc2hpZnQKKwkgKiAgdG8gdHVybiBpbnRvIDEyOEsgYmxvY2tzCisJICoKKwkgKiAgZWcgICAgICAgICAgICAgIDExMSAxMTExIDExMTEgMTEwMCAgICAgIGlzIDUxMksKKwkgKgorCSAqICBpbnZlcnQgICAgICAgICAgMDAwIDAwMDAgMDAwMCAwMDExCisJICogICsxICAgICAgICAgICAgICAwMDAgMDAwMCAwMDAwIDAxMDAKKwkgKiAgKjEyOEsgICAuLi4KKwkgKi8KKwlsb3cgPSAofmxvdykgJiAweDFGRkZDOworCSpzaXplID0gKGxvdyArIDQpIDw8ICgxNSAtIFBBR0VfU0hJRlQpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYW1kX3NldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQorLyogIFtTVU1NQVJZXSBTZXQgdmFyaWFibGUgTVRSUiByZWdpc3RlciBvbiB0aGUgbG9jYWwgQ1BVLgorICAgIDxyZWc+IFRoZSByZWdpc3RlciB0byBzZXQuCisgICAgPGJhc2U+IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbi4KKyAgICA8c2l6ZT4gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbi4gSWYgdGhpcyBpcyAwIHRoZSByZWdpb24gaXMgZGlzYWJsZWQuCisgICAgPHR5cGU+IFRoZSB0eXBlIG9mIHRoZSByZWdpb24uCisgICAgPGRvX3NhZmU+IElmIFRSVUUsIGRvIHRoZSBjaGFuZ2Ugc2FmZWx5LiBJZiBGQUxTRSwgc2FmZXR5IG1lYXN1cmVzIHNob3VsZAorICAgIGJlIGRvbmUgZXh0ZXJuYWxseS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdTMyIHJlZ3NbMl07CisKKwkvKgorCSAqICBMb3cgaXMgTVRSUjAgLCBIaWdoIE1UUlIgMQorCSAqLworCXJkbXNyKE1TUl9LNl9VV0NDUiwgcmVnc1swXSwgcmVnc1sxXSk7CisJLyoKKwkgKiAgQmxhbmsgdG8gZGlzYWJsZQorCSAqLworCWlmIChzaXplID09IDApCisJCXJlZ3NbcmVnXSA9IDA7CisJZWxzZQorCQkvKiBTZXQgdGhlIHJlZ2lzdGVyIHRvIHRoZSBiYXNlLCB0aGUgdHlwZSAob2ZmIGJ5IG9uZSkgYW5kIGFuCisJCSAgIGludmVydGVkIGJpdG1hc2sgb2YgdGhlIHNpemUgVGhlIHNpemUgaXMgdGhlIG9ubHkgb2RkCisJCSAgIGJpdC4gV2UgYXJlIGZlZCBzYXkgNTEySyBXZSBpbnZlcnQgdGhpcyBhbmQgd2UgZ2V0IDExMSAxMTExCisJCSAgIDExMTEgMTAxMSBidXQgaWYgeW91IHN1YnRyYWN0IG9uZSBhbmQgaW52ZXJ0IHlvdSBnZXQgdGhlICAgCisJCSAgIGRlc2lyZWQgMTExIDExMTEgMTExMSAxMTAwIG1hc2sKKworCQkgICBCdXQgfih4IC0gMSkgPT0gfnggKyAxID09IC14LiBUd28ncyBjb21wbGVtZW50IHJvY2tzISAgKi8KKwkJcmVnc1tyZWddID0gKC1zaXplID4+ICgxNSAtIFBBR0VfU0hJRlQpICYgMHgwMDAxRkZGQykKKwkJICAgIHwgKGJhc2UgPDwgUEFHRV9TSElGVCkgfCAodHlwZSArIDEpOworCisJLyoKKwkgKiAgVGhlIHdyaXRlYmFjayBydWxlIGlzIHF1aXRlIHNwZWNpZmljLiBTZWUgdGhlIG1hbnVhbC4gSXRzCisJICogIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cywgd3JpdGUgYmFjayB0aGUgY2FjaGUsIHNldCB0aGUgbXRycgorCSAqLworCXdiaW52ZCgpOworCXdybXNyKE1TUl9LNl9VV0NDUiwgcmVnc1swXSwgcmVnc1sxXSk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3ZhbGlkYXRlX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwkvKiBBcHBseSB0aGUgSzYgYmxvY2sgYWxpZ25tZW50IGFuZCBzaXplIHJ1bGVzCisJICAgSW4gb3JkZXIKKwkgICBvIFVuY2FjaGVkIG9yIGdhdGhlcmluZyBvbmx5CisJICAgbyAxMjhLIG9yIGJpZ2dlciBibG9jaworCSAgIG8gUG93ZXIgb2YgMiBibG9jaworCSAgIG8gYmFzZSBzdWl0YWJseSBhbGlnbmVkIHRvIHRoZSBwb3dlcgorCSovCisJaWYgKHR5cGUgPiBNVFJSX1RZUEVfV1JDT01CIHx8IHNpemUgPCAoMSA8PCAoMTcgLSBQQUdFX1NISUZUKSkKKwkgICAgfHwgKHNpemUgJiB+KHNpemUgLSAxKSkgLSBzaXplIHx8IChiYXNlICYgKHNpemUgLSAxKSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG10cnJfb3BzIGFtZF9tdHJyX29wcyA9IHsKKwkudmVuZG9yICAgICAgICAgICAgPSBYODZfVkVORE9SX0FNRCwKKwkuc2V0ICAgICAgICAgICAgICAgPSBhbWRfc2V0X210cnIsCisJLmdldCAgICAgICAgICAgICAgID0gYW1kX2dldF9tdHJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uLAorCS52YWxpZGF0ZV9hZGRfcGFnZSA9IGFtZF92YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBwb3NpdGl2ZV9oYXZlX3dyY29tYiwKK307CisKK2ludCBfX2luaXQgYW1kX2luaXRfbXRycih2b2lkKQoreworCXNldF9tdHJyX29wcygmYW1kX210cnJfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworLy9hcmNoX2luaXRjYWxsKGFtZF9tdHJyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jZW50YXVyLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NlbnRhdXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jZW50YXVyLmMKQEAgLTAsMCArMSwyMjMgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaGlnaDsKKwl1bnNpZ25lZCBsb25nIGxvdzsKK30gY2VudGF1cl9tY3JbOF07CisKK3N0YXRpYyB1OCBjZW50YXVyX21jcl9yZXNlcnZlZDsKK3N0YXRpYyB1OCBjZW50YXVyX21jcl90eXBlOwkvKiAwIGZvciB3aW5jaGlwLCAxIGZvciB3aW5jaGlwMiAqLworCisvKgorICoJUmVwb3J0IGJvb3QgdGltZSBNQ1Igc2V0dXBzIAorICovCisKK3N0YXRpYyBpbnQKK2NlbnRhdXJfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQorLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpLCBtYXg7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgaW50IGxzaXplOworCisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmIChjZW50YXVyX21jcl9yZXNlcnZlZCAmICgxIDw8IGkpKQorCQkJY29udGludWU7CisJCW10cnJfaWYtPmdldChpLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwkJaWYgKGxzaXplID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3ZvaWQKK210cnJfY2VudGF1cl9yZXBvcnRfbWNyKGludCBtY3IsIHUzMiBsbywgdTMyIGhpKQoreworCWNlbnRhdXJfbWNyW21jcl0ubG93ID0gbG87CisJY2VudGF1cl9tY3JbbWNyXS5oaWdoID0gaGk7Cit9CisKK3N0YXRpYyB2b2lkCitjZW50YXVyX2dldF9tY3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkJdW5zaWduZWQgaW50ICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQoreworCSpiYXNlID0gY2VudGF1cl9tY3JbcmVnXS5oaWdoID4+IFBBR0VfU0hJRlQ7CisJKnNpemUgPSAtKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMHhmZmZmZjAwMCkgPj4gUEFHRV9TSElGVDsKKwkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CS8qICBJZiBpdCBpcyB0aGVyZSwgaXQgaXMgd3JpdGUtY29tYmluaW5nICAqLworCWlmIChjZW50YXVyX21jcl90eXBlID09IDEgJiYgKChjZW50YXVyX21jcltyZWddLmxvdyAmIDMxKSAmIDIpKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFOworCWlmIChjZW50YXVyX21jcl90eXBlID09IDEgJiYgKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMzEpID09IDI1KQorCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkJBQ0s7CisJaWYgKGNlbnRhdXJfbWNyX3R5cGUgPT0gMCAmJiAoY2VudGF1cl9tY3JbcmVnXS5sb3cgJiAzMSkgPT0gMzEpCisJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKworfQorCitzdGF0aWMgdm9pZCBjZW50YXVyX3NldF9tY3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCS8qICBEaXNhYmxlICAqLworCQloaWdoID0gbG93ID0gMDsKKwl9IGVsc2UgeworCQloaWdoID0gYmFzZSA8PCBQQUdFX1NISUZUOworCQlpZiAoY2VudGF1cl9tY3JfdHlwZSA9PSAwKQorCQkJbG93ID0gLXNpemUgPDwgUEFHRV9TSElGVCB8IDB4MWY7CS8qIG9ubHkgc3VwcG9ydCB3cml0ZS1jb21iaW5pbmcuLi4gKi8KKwkJZWxzZSB7CisJCQlpZiAodHlwZSA9PSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkKKwkJCQlsb3cgPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHgwMjsJLyogTkMgKi8KKwkJCWVsc2UKKwkJCQlsb3cgPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHgwOTsJLyogV1dPLFdDICovCisJCX0KKwl9CisJY2VudGF1cl9tY3JbcmVnXS5oaWdoID0gaGlnaDsKKwljZW50YXVyX21jcltyZWddLmxvdyA9IGxvdzsKKwl3cm1zcihNU1JfSURUX01DUjAgKyByZWcsIGxvdywgaGlnaCk7Cit9CisKKyNpZiAwCisvKgorICoJSW5pdGlhbGlzZSB0aGUgbGF0ZXIgKHNhbmVyKSBXaW5jaGlwIE1DUiB2YXJpYW50LiBJbiB0aGlzIHZlcnNpb24KKyAqCXRoZSBCSU9TIGNhbiBwYXNzIHVzIHRoZSByZWdpc3RlcnMgaXQgaGFzIHVzZWQgKGJ1dCBub3QgdGhlaXIgdmFsdWVzKQorICoJYW5kIHRoZSBjb250cm9sIHJlZ2lzdGVyIGlzIHJlYWQvd3JpdGUKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQKK2NlbnRhdXJfbWNyMV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKwl1MzIgbG8sIGhpOworCisJLyogVW5mb3J0dW5hdGVseSwgTUNSJ3MgYXJlIHJlYWQtb25seSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvCisJICogZmluZCBvdXQgd2hhdCB0aGUgYmlvcyBtaWdodCBoYXZlIGRvbmUuCisJICovCisKKwlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCWlmICgoKGxvID4+IDE3KSAmIDcpID09IDEpIHsJLyogVHlwZSAxIFdpbmNoaXAyIE1DUiAqLworCQlsbyAmPSB+MHgxQzA7CS8qIGNsZWFyIGtleSAqLworCQlsbyB8PSAweDA0MDsJLyogc2V0IGtleSB0byAxICovCisJCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CS8qIHVubG9jayBNQ1IgKi8KKwl9CisKKwljZW50YXVyX21jcl90eXBlID0gMTsKKworCS8qCisJICogIENsZWFyIGFueSB1bmNvbmZpZ3VyZWQgTUNSJ3MuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCWlmIChjZW50YXVyX21jcltpXS5oaWdoID09IDAgJiYgY2VudGF1cl9tY3JbaV0ubG93ID09IDApIHsKKwkJCWlmICghKGxvICYgKDEgPDwgKDkgKyBpKSkpKQorCQkJCXdybXNyKE1TUl9JRFRfTUNSMCArIGksIDAsIDApOworCQkJZWxzZQorCQkJCS8qCisJCQkJICogICAgICBJZiB0aGUgQklPUyBzZXQgdXAgYW4gTUNSIHdlIGNhbm5vdCBzZWUgaXQKKwkJCQkgKiAgICAgIGJ1dCB3ZSBkb24ndCB3aXNoIHRvIG9ibGl0ZXJhdGUgaXQKKwkJCQkgKi8KKwkJCQljZW50YXVyX21jcl9yZXNlcnZlZCB8PSAoMSA8PCBpKTsKKwkJfQorCX0KKwkvKiAgCisJICogIFRocm93IHRoZSBtYWluIHdyaXRlLWNvbWJpbmluZyBzd2l0Y2guLi4gCisJICogIEhvd2V2ZXIgaWYgT09TVE9SRSBpcyBlbmFibGVkIHRoZW4gcGVvcGxlIGhhdmUgYWxyZWFkeSBkb25lIGZhcgorCSAqICBjbGV2ZXJlciB0aGluZ3MgYW5kIHdlIHNob3VsZCBiZWhhdmUuIAorCSAqLworCisJbG8gfD0gMTU7CQkvKiBXcml0ZSBjb21iaW5lIGVuYWJsZXMgKi8KKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworfQorCisvKgorICoJSW5pdGlhbGlzZSB0aGUgb3JpZ2luYWwgd2luY2hpcCB3aXRoIHJlYWQgb25seSBNQ1IgcmVnaXN0ZXJzCisgKglubyB1c2VkIGJpdG1hc2sgZm9yIHRoZSBCSU9TIHRvIHBhc3Mgb24gYW5kIHdyaXRlIG9ubHkgY29udHJvbAorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorY2VudGF1cl9tY3IwX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogVW5mb3J0dW5hdGVseSwgTUNSJ3MgYXJlIHJlYWQtb25seSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvCisJICogZmluZCBvdXQgd2hhdCB0aGUgYmlvcyBtaWdodCBoYXZlIGRvbmUuCisJICovCisKKwkvKiBDbGVhciBhbnkgdW5jb25maWd1cmVkIE1DUidzLgorCSAqIFRoaXMgd2F5IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGNlbnRhdXJfbWNyIGFycmF5IGNvbnRhaW5zIHRoZSBhY3R1YWwKKwkgKiB2YWx1ZXMuIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBhbnkgQklPUyB0d2Vha3MgYXJlIHRodXMgdW5kb25lLgorCSAqCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQlpZiAoY2VudGF1cl9tY3JbaV0uaGlnaCA9PSAwICYmIGNlbnRhdXJfbWNyW2ldLmxvdyA9PSAwKQorCQkJd3Jtc3IoTVNSX0lEVF9NQ1IwICsgaSwgMCwgMCk7CisJfQorCisJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgMHgwMUYwMDAxRiwgMCk7CS8qIFdyaXRlIG9ubHkgKi8KK30KKworLyoKKyAqCUluaXRpYWxpc2UgV2luY2hpcCBzZXJpZXMgTUNSIHJlZ2lzdGVycworICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorY2VudGF1cl9tY3JfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzZXRfbXRycl9jb250ZXh0IGN0eHQ7CisKKwlzZXRfbXRycl9wcmVwYXJlX3NhdmUoJmN0eHQpOworCXNldF9tdHJyX2NhY2hlX2Rpc2FibGUoJmN0eHQpOworCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDQpCisJCWNlbnRhdXJfbWNyMF9pbml0KCk7CisJZWxzZSBpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPT0gOCB8fCBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSA5KQorCQljZW50YXVyX21jcjFfaW5pdCgpOworCisJc2V0X210cnJfZG9uZSgmY3R4dCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjZW50YXVyX3ZhbGlkYXRlX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCS8qCisJICogIEZJWE1FOiBXaW5jaGlwMiBzdXBwb3J0cyB1bmNhY2hlZAorCSAqLworCWlmICh0eXBlICE9IE1UUlJfVFlQRV9XUkNPTUIgJiYgCisJICAgIChjZW50YXVyX21jcl90eXBlID09IDAgfHwgdHlwZSAhPSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIm10cnI6IG9ubHkgd3JpdGUtY29tYmluaW5nJXMgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgY2VudGF1cl9tY3JfdHlwZSA/ICIgYW5kIHVuY2FjaGVhYmxlIGFyZSIKKwkJICAgICAgIDogIiBpcyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRycl9vcHMgY2VudGF1cl9tdHJyX29wcyA9IHsKKwkudmVuZG9yICAgICAgICAgICAgPSBYODZfVkVORE9SX0NFTlRBVVIsCisvLwkuaW5pdCAgICAgICAgICAgICAgPSBjZW50YXVyX21jcl9pbml0LAorCS5zZXQgICAgICAgICAgICAgICA9IGNlbnRhdXJfc2V0X21jciwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBjZW50YXVyX2dldF9tY3IsCisJLmdldF9mcmVlX3JlZ2lvbiAgID0gY2VudGF1cl9nZXRfZnJlZV9yZWdpb24sCisJLnZhbGlkYXRlX2FkZF9wYWdlID0gY2VudGF1cl92YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBwb3NpdGl2ZV9oYXZlX3dyY29tYiwKK307CisKK2ludCBfX2luaXQgY2VudGF1cl9pbml0X210cnIodm9pZCkKK3sKKwlzZXRfbXRycl9vcHMoJmNlbnRhdXJfbXRycl9vcHMpOworCXJldHVybiAwOworfQorCisvL2FyY2hfaW5pdGNhbGwoY2VudGF1cl9pbml0X210cnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NoYW5nZWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjEzNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cKQEAgLTAsMCArMSwyMjkgQEAKKyAgICBDaGFuZ2VMb2cKKworICAgIFByZWhpc3RvcnkgTWFydGluIFRpc2NoaOR1c2VyIDxtYXJ0aW5AaWtjYmFya2EuZnprLmRlPgorCSAgICAgICBJbml0aWFsIHJlZ2lzdGVyLXNldHRpbmcgY29kZSAoZnJvbSBwcm9mb3JtLTEuMCkuCisgICAgMTk5NzEyMTYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE9yaWdpbmFsIHZlcnNpb24gZm9yIC9wcm9jL210cnIgaW50ZXJmYWNlLCBTTVAtc2FmZS4KKyAgdjEuMAorICAgIDE5OTcxMjE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBCdWcgZml4IGZvciBpb2N0bHMoKSdzLgorCSAgICAgICBBZGRlZCBzYW1wbGUgY29kZSBpbiBEb2N1bWVudGF0aW9uL210cnIudHh0CisgIHYxLjEKKyAgICAxOTk3MTIxOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRGlzYWxsb3cgb3ZlcmxhcHBpbmcgcmVnaW9ucy4KKyAgICAxOTk3MTIxOSAgIEplbnMgTWF1cmVyIDxqbWF1cmVyQG1lbnVldHQucmhlaW4tbWFpbi5kZT4KKyAgICAgICAgICAgICAgIFJlZ2lzdGVyLXNldHRpbmcgZml4dXBzLgorICB2MS4yCisgICAgMTk5NzEyMjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS43NS4KKyAgdjEuMworICAgIDE5OTcxMjI5ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+CisgICAgICAgICAgICAgICBSZWdpc3Rlci1zZXR0aW5nIGZpeHVwcyBhbmQgY29uZm9ybWl0eSB3aXRoIEludGVsIGNvbnZlbnRpb25zLgorICAgIDE5OTcxMjI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDb3NtZXRpYyBjaGFuZ2VzIGFuZCB3cm90ZSB0aGlzIENoYW5nZUxvZyA7LSkKKyAgICAxOTk4MDEwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjc4LgorICB2MS40CisgICAgMTk5ODAxMTkgICBEYXZpZCBXcmFnZyA8ZHB3QGRvYy5pYy5hYy51az4KKyAgICAgICAgICAgICAgIEluY2x1ZGVkIHBhc3NpdmUtcmVsZWFzZSBlbmFibGUgY29kZSAoZWxzZXdoZXJlIGluIFBDSSBzZXR1cCkuCisgIHYxLjUKKyAgICAxOTk4MDEzMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgUmVwbGFjZWQgZ2xvYmFsIGtlcm5lbCBsb2NrIHdpdGggcHJpdmF0ZSBzcGlubG9jay4KKyAgdjEuNgorICAgIDE5OTgwMjAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCB3YWl0IGZvciBvdGhlciBDUFVzIHRvIGNvbXBsZXRlIGNoYW5nZXMuCisgIHYxLjcKKyAgICAxOTk4MDIwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQnVnIGZpeCBpbiBkZWZpbml0aW9uIG9mIDxzZXRfbXRycj4gZm9yIFVQLgorICB2MS44CisgICAgMTk5ODAzMTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS45MC4KKyAgICAxOTk4MDMyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgTW92ZSBTTVAgQklPUyBmaXh1cCBiZWZvcmUgc2Vjb25kYXJ5IENQVXMgY2FsbCA8Y2FsaWJyYXRlX2RlbGF5PgorICB2MS45CisgICAgMTk5ODAzMjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIHRlc3QgZm9yIG92ZXJsYXBwaW5nIHJlZ2lvbnM6IGNvbmZ1c2VkIGJ5IGFkamFjZW50IHJlZ2lvbnMKKyAgICAxOTk4MDMyNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQWRkZWQgd2JpbnZkIGluIDxzZXRfbXRycl9wcmVwYXJlPi4KKyAgICAxOTk4MDQwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQnVnIGZpeCBmb3Igbm9uLVNNUCBjb21waWxhdGlvbi4KKyAgICAxOTk4MDQxOCAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgorICAgICAgICAgICAgICAgRml4ZWQtTVRSUiBzeW5jaHJvbmlzYXRpb24gZm9yIFNNUCBhbmQgdXNlIGF0b21pYyBvcGVyYXRpb25zCisJICAgICAgIGluc3RlYWQgb2Ygc3BpbmxvY2tzLgorICAgIDE5OTgwNDE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERpZmZlcmVudGlhdGUgZGlmZmVyZW50IE1UUlIgcmVnaXN0ZXIgY2xhc3NlcyBmb3IgQklPUyBmaXh1cC4KKyAgdjEuMTAKKyAgICAxOTk4MDQxOSAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgorCSAgICAgICBCdWcgZml4IGluIHZhcmlhYmxlIE1UUlIgc3luY2hyb25pc2F0aW9uLgorICB2MS4xMQorICAgIDE5OTgwNDE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS45Ny4KKyAgdjEuMTIKKyAgICAxOTk4MDQyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTYWZlciBzeW5jaHJvbmlzYXRpb24gYWNyb3NzIENQVXMgd2hlbiBjaGFuZ2luZyBNVFJScy4KKyAgdjEuMTMKKyAgICAxOTk4MDQyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBCdWdmaXggZm9yIFNNUCBzeXN0ZW1zIHdpdGhvdXQgTVRSUiBzdXBwb3J0LgorICB2MS4xNAorICAgIDE5OTgwNDI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFRyYXAgY2FsbHMgdG8gPG10cnJfYWRkPiBhbmQgPG10cnJfZGVsPiBvbiBub24tTVRSUiBtYWNoaW5lcy4KKyAgdjEuMTUKKyAgICAxOTk4MDQyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVc2UgYXRvbWljIGJpdG9wcyBmb3Igc2V0dGluZyBTTVAgY2hhbmdlIG1hc2suCisgIHYxLjE2CisgICAgMTk5ODA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBzcHVyaW91cyBkaWFnbm9zdGljIG1lc3NhZ2UuCisgIHYxLjE3CisgICAgMTk5ODA0MjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTW92ZWQgcmVnaXN0ZXItc2V0dGluZyBtYWNyb3MgaW50byB0aGlzIGZpbGUuCisJICAgICAgIE1vdmVkIHNldHVwIGNvZGUgZnJvbSBpbml0L21haW4uYyB0byBpMzg2LXNwZWNpZmljIGFyZWFzLgorICB2MS4xOAorICAgIDE5OTgwNTAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE1vdmVkIE1UUlIgZGV0ZWN0aW9uIG91dHNpZGUgY29uZGl0aW9uYWxzIGluIDxtdHJyX2luaXQ+LgorICB2MS4xOQorICAgIDE5OTgwNTAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnQ6IG1lbnRpb24gUGVudGl1bSBJSSBhbmQgQUdQLgorICB2MS4yMAorICAgIDE5OTgwNTIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgbWFuaXB1bGF0ZSBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgb24gbG9jYWwgQ1BVLgorCSAgICAgICBBbGxvdyBlbmNsb3NlZCB1bmNhY2hhYmxlIHJlZ2lvbnMuCisgIHYxLjIxCisgICAgMTk5ODA2MTEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWx3YXlzIGRlZmluZSA8bWFpbl9sb2NrPi4KKyAgdjEuMjIKKyAgICAxOTk4MDkwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIG1vZHVsZSBzdXBwb3J0IGluIG9yZGVyIHRvIHRpZHkgdXAgY29kZS4KKwkgICAgICAgQWRkZWQgc2FuaXR5IGNoZWNrIGZvciA8bXRycl9hZGQ+LzxtdHJyX2RlbD4gYmVmb3JlIDxtdHJyX2luaXQ+LgorCSAgICAgICBDcmVhdGVkIGFkZGl0aW9uIHF1ZXVlIGZvciBwcmlvciB0byBTTVAgY29tbWVuY2UuCisgIHYxLjIzCisgICAgMTk5ODA5MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUG9ydGVkIHBhdGNoIHRvIGtlcm5lbCAyLjEuMTIwLXByZTMuCisgIHYxLjI0CisgICAgMTk5ODA5MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBzYW5pdHkgY2hlY2tzIGFuZCBhZGRpdGlvbiBxdWV1ZTogTGludXMgcHJlZmVycyBhbiBPT1BTLgorICB2MS4yNQorICAgIDE5OTgxMDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGhhcm1sZXNzIGNvbXBpbGVyIHdhcm5pbmcgaW4gaW5jbHVkZS9hc20taTM4Ni9tdHJyLmgKKwkgICAgICAgRml4ZWQgdmVyc2lvbiBudW1iZXJpbmcgYW5kIGhpc3RvcnkgZm9yIHYxLjIzIC0+IHYxLjI0LgorICB2MS4yNgorICAgIDE5OTkwMTE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIGRldmZzIHN1cHBvcnQuCisgIHYxLjI3CisgICAgMTk5OTAxMjMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCBsb2NraW5nIHRvIHNwaW4gd2l0aCByZXNjaGVkdWxlLgorCSAgICAgICBNYWRlIHVzZSBvZiBuZXcgPHNtcF9jYWxsX2Z1bmN0aW9uPi4KKyAgdjEuMjgKKyAgICAxOTk5MDIwMSAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorCSAgICAgICBFeHRlbmRlZCB0aGUgZHJpdmVyIHRvIGJlIGFibGUgdG8gdXNlIEN5cml4IHN0eWxlIEFSUnMuCisgICAgMTk5OTAyMDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVzdHJ1Y3R1cmVkIEN5cml4IHN1cHBvcnQuCisgIHYxLjI5CisgICAgMTk5OTAyMDQgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKwkgICAgICAgUmVmaW5lZCBBUlIgc3VwcG9ydDogZW5hYmxlIE1BUEVOIGluIHNldF9tdHJyX3ByZXBhcmUoKQorCSAgICAgICBhbmQgZGlzYWJsZSBNQVBFTiBpbiBzZXRfbXRycl9kb25lKCkuCisgICAgMTk5OTAyMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWlub3IgY2xlYW51cHMuCisgIHYxLjMwCisgICAgMTk5OTAyMDggICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFByb3RlY3QgcGxhaW4gNng4NnMgKGFuZCBvdGhlciBwcm9jZXNzb3JzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICBQYWdlIEdsb2JhbCBFbmFibGUgZmVhdHVyZSkgYWdhaW5zdCBhY2Nlc3NpbmcgQ1I0IGluCisgICAgICAgICAgICAgICBzZXRfbXRycl9wcmVwYXJlKCkgYW5kIHNldF9tdHJyX2RvbmUoKS4KKyAgICAxOTk5MDIxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBUdXJuZWQgPHNldF9tdHJyX3VwPiBhbmQgPGdldF9tdHJyPiBpbnRvIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB2MS4zMQorICAgIDE5OTkwMjEyICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBNYWpvciByZXdyaXRlIG9mIGN5cml4X2Fycl9pbml0KCk6IGRvIG5vdCB0b3VjaCBBUlJzLAorICAgICAgICAgICAgICAgbGVhdmUgdGhlbSBhcyB0aGUgQklPUyBoYXZlIHNldCB0aGVtIHVwLgorICAgICAgICAgICAgICAgRW5hYmxlIHVzYWdlIG9mIGFsbCA4IEFSUnMuCisgICAgICAgICAgICAgICBBdm9pZCBtdWx0aXBsaWNhdGlvbnMgYnkgMyBldmVyeXdoZXJlIGFuZCBvdGhlcgorICAgICAgICAgICAgICAgY29kZSBjbGVhbiB1cHMvc3BlZWQgdXBzLgorICAgIDE5OTkwMjEzICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBTZXQgdXAgb3RoZXIgQ3lyaXggcHJvY2Vzc29ycyBpZGVudGljYWwgdG8gdGhlIGJvb3QgY3B1LgorICAgICAgICAgICAgICAgU2luY2UgQ3lyaXggZG9uJ3Qgc3VwcG9ydCBJbnRlbCBBUElDLCB0aGlzIGlzIGwnYXJ0IHBvdXIgbCdhcnQuCisgICAgICAgICAgICAgICBXZWlnaCBBUlJzIGJ5IHNpemU6CisgICAgICAgICAgICAgICBJZiBzaXplIDw9IDMyTSBpcyBnaXZlbiwgc2V0IHVwIEFSUiMgd2Ugd2VyZSBnaXZlbi4KKyAgICAgICAgICAgICAgIElmIHNpemUgPiAgMzJNIGlzIGdpdmVuLCBzZXQgdXAgQVJSNyBvbmx5IGlmIGl0IGlzIGZyZWUsCisgICAgICAgICAgICAgICBmYWlsIG90aGVyd2lzZS4KKyAgICAxOTk5MDIxNCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgQWxzbyBjaGVjayBmb3Igc2l6ZSA+PSAyNTZLIGlmIHdlIGFyZSB0byBzZXQgdXAgQVJSNywKKyAgICAgICAgICAgICAgIG10cnJfYWRkKCkgcmV0dXJucyB0aGUgdmFsdWUgaXQgZ2V0cyBmcm9tIHNldF9tdHJyKCkKKyAgICAxOTk5MDIxOCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgUmVtb3ZlIEN5cml4ICJjb21hIGJ1ZyIgd29ya2Fyb3VuZCBmcm9tIGhlcmUuCisgICAgICAgICAgICAgICBNb3ZlZCB0byBsaW51eC9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYW5kCisgICAgICAgICAgICAgICBsaW51eC9pbmNsdWRlL2FzbS1pMzg2L2J1Z3MuaAorICAgIDE5OTkwMjI4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIE1UUlJJT0NfS0lMTF9FTlRSWSBpb2N0bCgyKQorCSAgICAgICBUcmFwIGZvciBjb3VudGVyIHVuZGVyZmxvdyBpbiA8bXRycl9maWxlX2RlbD4uCisJICAgICAgIFRyYXAgZm9yIDQgTWlCIGFsaWduZWQgcmVnaW9ucyBmb3IgUFBybywgc3RlcHBpbmcgPD0gNy4KKyAgICAxOTk5MDMwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxnZXRfZnJlZV9yZWdpb24+IGhvb2suCisgICAgMTk5OTAzMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVGVtcG9yYXJpbHkgZGlzYWJsZSBBTUQgc3VwcG9ydCBub3cgTVRSUiBjYXBhYmlsaXR5IGZsYWcgaXMgc2V0LgorICB2MS4zMgorICAgIDE5OTkwMzA4ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisJICAgICAgIEFkanVzdCBteSBjaGFuZ2VzICgxOTk5MDIxMi0xOTk5MDIxOCkgdG8gUmljaGFyZCBHb29jaCdzCisJICAgICAgIGxhdGVzdCBjaGFuZ2VzLiAoMTk5OTAyMjgtMTk5OTAzMDUpCisgIHYxLjMzCisgICAgMTk5OTAzMDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgdHlwbyBpbiA8cHJpbnRrPiBtZXNzYWdlLgorICAgIDE5OTkwMzEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgSzYtSUkvSUlJIGJhc2VkIG9uIEFsYW4gQ294J3MgPGFsYW5AcmVkaGF0LmNvbT4gcGF0Y2hlcy4KKyAgdjEuMzQKKyAgICAxOTk5MDUxMSAgIEJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPgorCSAgICAgICBTdXBwb3J0IENlbnRhdXIgQzYgTUNSJ3MuCisgICAgMTk5OTA1MTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWlub3IgY2xlYW51cHMuCisgIHYxLjM1CisgICAgMTk5OTA3MDcgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIENoZWNrIHdoZXRoZXIgQVJSMyBpcyBwcm90ZWN0ZWQgaW4gY3lyaXhfZ2V0X2ZyZWVfcmVnaW9uKCkKKyAgICAgICAgICAgICAgIGFuZCBtdHJyX2RlbCgpLiBUaGUgY29kZSB3b24ndCBhdHRlbXB0IHRvIGRlbGV0ZSBvciBjaGFuZ2UgaXQKKyAgICAgICAgICAgICAgIGZyb20gbm93IG9uIGlmIHRoZSBCSU9TIHByb3RlY3RlZCBBUlIzLiBJdCBzaWxlbnRseSBza2lwcyBBUlIzCisgICAgICAgICAgICAgICBpbiBjeXJpeF9nZXRfZnJlZV9yZWdpb24oKSBvciByZXR1cm5zIHdpdGggYW4gZXJyb3IgY29kZSBmcm9tCisgICAgICAgICAgICAgICBtdHJyX2RlbCgpLgorICAgIDE5OTkwNzExICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBSZXNldCBzb21lIGJpdHMgaW4gdGhlIENDUnMgaW4gY3lyaXhfYXJyX2luaXQoKSB0byBkaXNhYmxlIFNNTQorICAgICAgICAgICAgICAgaWYgQVJSMyBpc24ndCBwcm90ZWN0ZWQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaWYgU01NIGlzIGFjdGl2ZQorICAgICAgICAgICAgICAgYW5kIEFSUjMgaXNuJ3QgcHJvdGVjdGVkIHRoZW4gZGVsZXRpbmcgYW5kIHNldHRpbmcgQVJSMyBhZ2FpbgorICAgICAgICAgICAgICAgbWF5IGxvY2sgdXAgdGhlIHByb2Nlc3Nvci4gV2l0aCBTTU0gZW50aXJlbHkgZGlzYWJsZWQsIGl0IGRvZXMKKyAgICAgICAgICAgICAgIG5vdCBoYXBwZW4uCisgICAgMTk5OTA4MTIgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFJlYXJyYW5nZSBzd2l0Y2goKSBzdGF0ZW1lbnRzIHNvIHRoZSBkcml2ZXIgYWNjb21vZGF0ZXMgdG8KKyAgICAgICAgICAgICAgIHRoZSBmYWN0IHRoYXQgdGhlIEFNRCBBdGhsb24gaGFuZGxlcyBpdHMgTVRSUnMgdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgICBhcyBJbnRlbCBkb2VzLgorICAgIDE5OTkwODE0ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisJICAgICAgIERvdWJsZSBjaGVjayBmb3IgSW50ZWwgaW4gbXRycl9hZGQoKSdzIGJpZyBzd2l0Y2goKSBiZWNhdXNlCisJICAgICAgIHRoYXQgcmV2aXNpb24gY2hlY2sgaXMgb25seSB2YWxpZCBmb3IgSW50ZWwgQ1BVcy4KKyAgICAxOTk5MDgxOSAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgICAgICAgICAgICAgICBUZXN0ZWQgWm9sdGFuJ3MgY2hhbmdlcyBvbiBhIHByZSBwcm9kdWN0aW9uIEF0aGxvbiAtIDEwMCUKKyAgICAgICAgICAgICAgIHN1Y2Nlc3MuCisgICAgMTk5OTEwMDggICBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZHNAY29sb3JmdWxsaWZlLmNvbT4KKyAgICAJICAgICAgIHJlcGxhY2VkIHNwaW5fbG9ja19yZXNjaGVkdWxlKCkgd2l0aCBhIG5vcm1hbCBzZW1hcGhvcmUuCisgIHYxLjM2CisgICAgMjAwMDAyMjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENvbXBpbGUgZml4IGlmIHByb2NmcyBhbmQgZGV2ZnMgbm90IGVuYWJsZWQuCisJICAgICAgIEZvcm1hdHRpbmcgY2hhbmdlcy4KKyAgdjEuMzcKKyAgICAyMDAwMTEwOSAgIEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorCSAgICAgICBVc2UgdGhlIG5ldyBjZW50cmFsaXplZCBDUFUgZmVhdHVyZSBkZXRlY3RzLgorCisgIHYxLjM4CisgICAgMjAwMTAzMDkgICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPgorCSAgICAgICBBZGQgc3VwcG9ydCBmb3IgQ3lyaXggSUlJLgorCisgIHYxLjM5CisgICAgMjAwMTAzMTIgICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPgorICAgICAgICAgICAgICAgVWdoLCBJIGJyb2tlIEFNRCBzdXBwb3J0LgorCSAgICAgICBSZXdvcmtlZCBmaXggYnkgVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIDx0cm9lbHNAdGh1bGUubm8+CisKKyAgdjEuNDAKKyAgICAyMDAxMDMyNyAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+CisJICAgICAgIEFkYXB0ZWQgQ3lyaXggSUlJIHN1cHBvcnQgdG8gaW5jbHVkZSBWSUEgQzMuCisKKyAgdjIuMAorICAgIDIwMDIwMzA2ICAgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4KKyAgICAgICAgICAgICAgIFNwbGl0IG10cnIuYyAtPiBtdHJyLyouYworICAgICAgICAgICAgICAgQ29udmVydGVkIHRvIExpbnV4IEtlcm5lbCBDb2RpbmcgU3R5bGUKKyAgICAgICAgICAgICAgIEZpeGVkIHNldmVyYWwgbWlub3Igbml0cyBpbiBmb3JtCisgICAgICAgICAgICAgICBNb3ZlZCBzb21lIFNNUC1vbmx5IGZ1bmN0aW9ucyBvdXQsIHNvIHRoZXkgY2FuIGJlIHVzZWQKKyAgICAgICAgICAgICAgICBmb3IgcG93ZXIgbWFuYWdlbWVudCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgICAgVE9ETzogRml4IHVzZXIgaW50ZXJmYWNlIGNydWZ0LgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jeXJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzM2IwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2N5cml4LmMKQEAgLTAsMCArMSwzNjQgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK2ludCBhcnIzX3Byb3RlY3RlZDsKKworc3RhdGljIHZvaWQKK2N5cml4X2dldF9hcnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGFyciwgY2NyMywgcmNyLCBzaGlmdDsKKworCWFyciA9IENYODZfQVJSX0JBU0UgKyAocmVnIDw8IDEpICsgcmVnOwkvKiBhdm9pZCBtdWx0aXBsaWNhdGlvbiBieSAzICovCisKKwkvKiBTYXZlIGZsYWdzIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7CS8qIGVuYWJsZSBNQVBFTiAqLworCSgodW5zaWduZWQgY2hhciAqKSBiYXNlKVszXSA9IGdldEN4ODYoYXJyKTsKKwkoKHVuc2lnbmVkIGNoYXIgKikgYmFzZSlbMl0gPSBnZXRDeDg2KGFyciArIDEpOworCSgodW5zaWduZWQgY2hhciAqKSBiYXNlKVsxXSA9IGdldEN4ODYoYXJyICsgMik7CisJcmNyID0gZ2V0Q3g4NihDWDg2X1JDUl9CQVNFICsgcmVnKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CS8qIGRpc2FibGUgTUFQRU4gKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGlmIGl0IHdhcyBlbmFibGVkIHByZXZpb3VzbHkgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc2hpZnQgPSAoKHVuc2lnbmVkIGNoYXIgKikgYmFzZSlbMV0gJiAweDBmOworCSpiYXNlID4+PSBQQUdFX1NISUZUOworCisJLyogUG93ZXIgb2YgdHdvLCBhdCBsZWFzdCA0SyBvbiBBUlIwLUFSUjYsIDI1Nksgb24gQVJSNworCSAqIE5vdGU6IHNoaWZ0PT0weGYgbWVhbnMgNEcsIHRoaXMgaXMgdW5zdXBwb3J0ZWQuCisJICovCisJaWYgKHNoaWZ0KQorCQkqc2l6ZSA9IChyZWcgPCA3ID8gMHgxVUwgOiAweDQwVUwpIDw8IChzaGlmdCAtIDEpOworCWVsc2UKKwkJKnNpemUgPSAwOworCisJLyogQml0IDAgaXMgQ2FjaGUgRW5hYmxlIG9uIEFSUjcsIENhY2hlIERpc2FibGUgb24gQVJSMC1BUlI2ICovCisJaWYgKHJlZyA8IDcpIHsKKwkJc3dpdGNoIChyY3IpIHsKKwkJY2FzZSAxOgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfVU5DQUNIQUJMRTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkJBQ0s7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JDT01COworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCWRlZmF1bHQ6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUlRIUk9VR0g7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocmNyKSB7CisJCWNhc2UgMDoKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1VOQ0FDSEFCTEU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JDT01COworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKwkJCWJyZWFrOworCQljYXNlIDI1OgorCQlkZWZhdWx0OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JUSFJPVUdIOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2N5cml4X2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKKy8qICBbU1VNTUFSWV0gR2V0IGEgZnJlZSBBUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpOworCW10cnJfdHlwZSBsdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlOworCXVuc2lnbmVkIGludCAgbHNpemU7CisKKwkvKiBJZiB3ZSBhcmUgdG8gc2V0IHVwIGEgcmVnaW9uID4zMk0gdGhlbiBsb29rIGF0IEFSUjcgaW1tZWRpYXRlbHkgKi8KKwlpZiAoc2l6ZSA+IDB4MjAwMCkgeworCQljeXJpeF9nZXRfYXJyKDcsICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAobHNpemUgPT0gMCkKKwkJCXJldHVybiA3OworCQkvKiAgRWxzZSB0cnkgQVJSMC1BUlI2IGZpcnN0ICAqLworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWN5cml4X2dldF9hcnIoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCQlpZiAoKGkgPT0gMykgJiYgYXJyM19wcm90ZWN0ZWQpCisJCQkJY29udGludWU7CisJCQlpZiAobHNpemUgPT0gMCkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCQkvKiBBUlIwLUFSUjYgaXNuJ3QgZnJlZSwgdHJ5IEFSUjcgYnV0IGl0cyBzaXplIG11c3QgYmUgYXQgbGVhc3QgMjU2SyAqLworCQljeXJpeF9nZXRfYXJyKGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAoKGxzaXplID09IDApICYmIChzaXplID49IDB4NDApKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgdTMyIGNyNCA9IDA7CitzdGF0aWMgdTMyIGNjcjM7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfc2V0KHZvaWQpCit7CisJdTMyIGNyMDsKKworCS8qICBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykgICovCisJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJY3I0ID0gcmVhZF9jcjQoKTsKKwkJd3JpdGVfY3I0KGNyNCAmICh1bnNpZ25lZCBjaGFyKSB+KDEgPDwgNykpOworCX0KKworCS8qICBEaXNhYmxlIGFuZCBmbHVzaCBjYWNoZXMuIE5vdGUgdGhhdCB3YmludmQgZmx1c2hlcyB0aGUgVExCcyBhcworCSAgICBhIHNpZGUtZWZmZWN0ICAqLworCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOworCXdiaW52ZCgpOworCXdyaXRlX2NyMChjcjApOworCXdiaW52ZCgpOworCisJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3ZXJlIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCisJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3ZXJlIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOworCit9CisKK3N0YXRpYyB2b2lkIHBvc3Rfc2V0KHZvaWQpCit7CisJLyogIEZsdXNoIGNhY2hlcyBhbmQgVExCcyAgKi8KKwl3YmludmQoKTsKKworCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2FzIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CisJCQorCS8qICBFbmFibGUgY2FjaGVzICAqLworCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkvKiAgUmVzdG9yZSB2YWx1ZSBvZiBDUjQgICovCisJaWYgKCBjcHVfaGFzX3BnZSApCisJCXdyaXRlX2NyNChjcjQpOworfQorCitzdGF0aWMgdm9pZCBjeXJpeF9zZXRfYXJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFyciwgYXJyX3R5cGUsIGFycl9zaXplOworCisJYXJyID0gQ1g4Nl9BUlJfQkFTRSArIChyZWcgPDwgMSkgKyByZWc7CS8qIGF2b2lkIG11bHRpcGxpY2F0aW9uIGJ5IDMgKi8KKworCS8qIGNvdW50IGRvd24gZnJvbSAzMk0gKEFSUjAtQVJSNikgb3IgZnJvbSAyRyAoQVJSNykgKi8KKwlpZiAocmVnID49IDcpCisJCXNpemUgPj49IDY7CisKKwlzaXplICY9IDB4N2ZmZjsJCS8qIG1ha2Ugc3VyZSBhcnJfc2l6ZSA8PSAxNCAqLworCWZvciAoYXJyX3NpemUgPSAwOyBzaXplOyBhcnJfc2l6ZSsrLCBzaXplID4+PSAxKSA7CisKKwlpZiAocmVnIDwgNykgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNVFJSX1RZUEVfVU5DQUNIQUJMRToKKwkJCWFycl90eXBlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUkNPTUI6CisJCQlhcnJfdHlwZSA9IDk7CisJCQlicmVhazsKKwkJY2FzZSBNVFJSX1RZUEVfV1JUSFJPVUdIOgorCQkJYXJyX3R5cGUgPSAyNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJyX3R5cGUgPSA4OworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNVFJSX1RZUEVfVU5DQUNIQUJMRToKKwkJCWFycl90eXBlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUkNPTUI6CisJCQlhcnJfdHlwZSA9IDg7CisJCQlicmVhazsKKwkJY2FzZSBNVFJSX1RZUEVfV1JUSFJPVUdIOgorCQkJYXJyX3R5cGUgPSAyNTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJyX3R5cGUgPSA5OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcmVwYXJlX3NldCgpOworCisJYmFzZSA8PD0gUEFHRV9TSElGVDsKKwlzZXRDeDg2KGFyciwgKCh1bnNpZ25lZCBjaGFyICopICZiYXNlKVszXSk7CisJc2V0Q3g4NihhcnIgKyAxLCAoKHVuc2lnbmVkIGNoYXIgKikgJmJhc2UpWzJdKTsKKwlzZXRDeDg2KGFyciArIDIsICgoKHVuc2lnbmVkIGNoYXIgKikgJmJhc2UpWzFdKSB8IGFycl9zaXplKTsKKwlzZXRDeDg2KENYODZfUkNSX0JBU0UgKyByZWcsIGFycl90eXBlKTsKKworCXBvc3Rfc2V0KCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgaW50IHNpemU7CisJbXRycl90eXBlIHR5cGU7Cit9IGFycl9zdGF0ZV90OworCitzdGF0aWMgYXJyX3N0YXRlX3QgYXJyX3N0YXRlWzhdIF9faW5pdGRhdGEgPSB7CisJezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9LAorCXswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2NyX3N0YXRlWzddIF9faW5pdGRhdGEgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIHZvaWQgY3lyaXhfc2V0X2FsbCh2b2lkKQoreworCWludCBpOworCisJcHJlcGFyZV9zZXQoKTsKKworCS8qIHRoZSBDQ1JzIGFyZSBub3QgY29udGlndW91cyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXNldEN4ODYoQ1g4Nl9DQ1IwICsgaSwgY2NyX3N0YXRlW2ldKTsKKwlmb3IgKDsgaSA8IDc7IGkrKykKKwkJc2V0Q3g4NihDWDg2X0NDUjQgKyBpLCBjY3Jfc3RhdGVbaV0pOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWN5cml4X3NldF9hcnIoaSwgYXJyX3N0YXRlW2ldLmJhc2UsIAorCQkJICAgICAgYXJyX3N0YXRlW2ldLnNpemUsIGFycl9zdGF0ZVtpXS50eXBlKTsKKworCXBvc3Rfc2V0KCk7Cit9CisKKyNpZiAwCisvKgorICogT24gQ3lyaXggNng4NihNWCkgYW5kIE0gSUkgdGhlIEFSUjMgaXMgc3BlY2lhbDogaXQgaGFzIGNvbm5lY3Rpb24KKyAqIHdpdGggdGhlIFNNTSAoU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSkgbW9kZS4gU28gd2UgbmVlZCB0aGUgZm9sbG93aW5nOgorICogQ2hlY2sgd2hldGhlciBTTUlfTE9DSyAoQ0NSMyBiaXQgMCkgaXMgc2V0CisgKiAgIGlmIGl0IGlzIHNldCwgd3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2U6IEFSUjMgY2Fubm90IGJlIGNoYW5nZWQhCisgKiAgICAgKGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVudGlsIHRoZSBuZXh0IHByb2Nlc3NvciByZXNldCkKKyAqICAgaWYgaXQgaXMgcmVzZXQsIHRoZW4gd2UgY2FuIGNoYW5nZSBpdCwgc2V0IGFsbCB0aGUgbmVlZGVkIGJpdHM6CisgKiAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgcmFuZ2UgKENDUjEgYml0IDcgcmVzZXQpCisgKiAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoQ0NSMSBiaXQgMiByZXNldCkKKyAqICAgLSBkaXNhYmxlIFNNTSBtb2RlIChDQ1IxIGJpdCAxIHJlc2V0KQorICogICAtIGRpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzIChDQ1I2IGJpdCAxIHJlc2V0KQorICogICAtIChtYXliZSkgZGlzYWJsZSBBUlIzCisgKiBKdXN0IHRvIGJlIHN1cmUsIHdlIGVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAoQ0NSNSBiaXQgNSBzZXQpCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorY3lyaXhfYXJyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCBjdHh0OworCXVuc2lnbmVkIGNoYXIgY2NyWzddOworCWludCBjY3JjWzddID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBpOworI2VuZGlmCisKKwkvKiBmbHVzaCBjYWNoZSBhbmQgZW5hYmxlIE1BUEVOICovCisJc2V0X210cnJfcHJlcGFyZV9zYXZlKCZjdHh0KTsKKwlzZXRfbXRycl9jYWNoZV9kaXNhYmxlKCZjdHh0KTsKKworCS8qIFNhdmUgYWxsIENDUnMgbG9jYWxseSAqLworCWNjclswXSA9IGdldEN4ODYoQ1g4Nl9DQ1IwKTsKKwljY3JbMV0gPSBnZXRDeDg2KENYODZfQ0NSMSk7CisJY2NyWzJdID0gZ2V0Q3g4NihDWDg2X0NDUjIpOworCWNjclszXSA9IGN0eHQuY2NyMzsKKwljY3JbNF0gPSBnZXRDeDg2KENYODZfQ0NSNCk7CisJY2NyWzVdID0gZ2V0Q3g4NihDWDg2X0NDUjUpOworCWNjcls2XSA9IGdldEN4ODYoQ1g4Nl9DQ1I2KTsKKworCWlmIChjY3JbM10gJiAxKSB7CisJCWNjcmNbM10gPSAxOworCQlhcnIzX3Byb3RlY3RlZCA9IDE7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBTTU0gbW9kZSAoYml0IDEpLCBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoYml0IDIpIGFuZAorCQkgKiBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgKGJpdCA3KS4KKwkJICovCisJCWlmIChjY3JbMV0gJiAweDgwKSB7CisJCQljY3JbMV0gJj0gMHg3ZjsKKwkJCWNjcmNbMV0gfD0gMHg4MDsKKwkJfQorCQlpZiAoY2NyWzFdICYgMHgwNCkgeworCQkJY2NyWzFdICY9IDB4ZmI7CisJCQljY3JjWzFdIHw9IDB4MDQ7CisJCX0KKwkJaWYgKGNjclsxXSAmIDB4MDIpIHsKKwkJCWNjclsxXSAmPSAweGZkOworCQkJY2NyY1sxXSB8PSAweDAyOworCQl9CisJCWFycjNfcHJvdGVjdGVkID0gMDsKKwkJaWYgKGNjcls2XSAmIDB4MDIpIHsKKwkJCWNjcls2XSAmPSAweGZkOworCQkJY2NyY1s2XSA9IDE7CS8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzICovCisJCQlzZXRDeDg2KENYODZfQ0NSNiwgY2NyWzZdKTsKKwkJfQorCQkvKiBEaXNhYmxlIEFSUjMuIFRoaXMgaXMgc2FmZSBub3cgdGhhdCB3ZSBkaXNhYmxlZCBTTU0uICovCisJCS8qIGN5cml4X3NldF9hcnJfdXAgKDMsIDAsIDAsIDAsIEZBTFNFKTsgKi8KKwl9CisJLyogSWYgd2UgY2hhbmdlZCBDQ1IxIGluIG1lbW9yeSwgY2hhbmdlIGl0IGluIHRoZSBwcm9jZXNzb3IsIHRvby4gKi8KKwlpZiAoY2NyY1sxXSkKKwkJc2V0Q3g4NihDWDg2X0NDUjEsIGNjclsxXSk7CisKKwkvKiBFbmFibGUgQVJSIHVzYWdlIGJ5IHRoZSBwcm9jZXNzb3IgKi8KKwlpZiAoIShjY3JbNV0gJiAweDIwKSkgeworCQljY3JbNV0gfD0gMHgyMDsKKwkJY2NyY1s1XSA9IDE7CisJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3JbNV0pOworCX0KKyNpZmRlZiBDT05GSUdfU01QCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJY2NyX3N0YXRlW2ldID0gY2NyW2ldOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWN5cml4X2dldF9hcnIoaSwKKwkJCSAgICAgICZhcnJfc3RhdGVbaV0uYmFzZSwgJmFycl9zdGF0ZVtpXS5zaXplLAorCQkJICAgICAgJmFycl9zdGF0ZVtpXS50eXBlKTsKKyNlbmRpZgorCisJc2V0X210cnJfZG9uZSgmY3R4dCk7CS8qIGZsdXNoIGNhY2hlIGFuZCBkaXNhYmxlIE1BUEVOICovCisKKwlpZiAoY2NyY1s1XSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogQVJSIHVzYWdlIHdhcyBub3QgZW5hYmxlZCwgZW5hYmxlZCBtYW51YWxseVxuIik7CisJaWYgKGNjcmNbM10pCisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IEFSUjMgY2Fubm90IGJlIGNoYW5nZWRcbiIpOworLyoKKyAgICBpZiAoIGNjcmNbMV0gJiAweDgwKSBwcmludGsgKCJtdHJyOiBTTU0gbWVtb3J5IGFjY2VzcyB0aHJvdWdoIEFSUjMgZGlzYWJsZWRcbiIpOworICAgIGlmICggY2NyY1sxXSAmIDB4MDQpIHByaW50ayAoIm10cnI6IFNNTSBtZW1vcnkgYWNjZXNzIGRpc2FibGVkXG4iKTsKKyAgICBpZiAoIGNjcmNbMV0gJiAweDAyKSBwcmludGsgKCJtdHJyOiBTTU0gbW9kZSBkaXNhYmxlZFxuIik7CisqLworCWlmIChjY3JjWzZdKQorCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBBUlIzIHdhcyB3cml0ZSBwcm90ZWN0ZWQsIHVucHJvdGVjdGVkXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG10cnJfb3BzIGN5cml4X210cnJfb3BzID0geworCS52ZW5kb3IgICAgICAgICAgICA9IFg4Nl9WRU5ET1JfQ1lSSVgsCisvLwkuaW5pdCAgICAgICAgICAgICAgPSBjeXJpeF9hcnJfaW5pdCwKKwkuc2V0X2FsbAkgICA9IGN5cml4X3NldF9hbGwsCisJLnNldCAgICAgICAgICAgICAgID0gY3lyaXhfc2V0X2FyciwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBjeXJpeF9nZXRfYXJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGN5cml4X2dldF9mcmVlX3JlZ2lvbiwKKwkudmFsaWRhdGVfYWRkX3BhZ2UgPSBnZW5lcmljX3ZhbGlkYXRlX2FkZF9wYWdlLAorCS5oYXZlX3dyY29tYiAgICAgICA9IHBvc2l0aXZlX2hhdmVfd3Jjb21iLAorfTsKKworaW50IF9faW5pdCBjeXJpeF9pbml0X210cnIodm9pZCkKK3sKKwlzZXRfbXRycl9vcHMoJmN5cml4X210cnJfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworLy9hcmNoX2luaXRjYWxsKGN5cml4X2luaXRfbXRycik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Y2NlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMCwwICsxLDQxNyBAQAorLyogVGhpcyBvbmx5IGhhbmRsZXMgMzJiaXQgTVRSUiBvbiAzMmJpdCBob3N0cy4gVGhpcyBpcyBzdHJpY3RseSB3cm9uZworICAgYmVjYXVzZSBNVFJScyBjYW4gc3BhbiB1cHRvIDQwIGJpdHMgKDM2Yml0cyBvbiBtb3N0IG1vZGVybiB4ODYpICovIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK3N0cnVjdCBtdHJyX3N0YXRlIHsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZhcl9yYW5nZXM7CisJbXRycl90eXBlIGZpeGVkX3Jhbmdlc1tOVU1fRklYRURfUkFOR0VTXTsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CisJbXRycl90eXBlIGRlZl90eXBlOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21wX2NoYW5nZXNfbWFzazsKK3N0YXRpYyBzdHJ1Y3QgbXRycl9zdGF0ZSBtdHJyX3N0YXRlID0ge307CisKKy8qICBHZXQgdGhlIE1TUiBwYWlyIHJlbGF0aW5nIHRvIGEgdmFyIHJhbmdlICAqLworc3RhdGljIHZvaWQgX19pbml0CitnZXRfbXRycl92YXJfcmFuZ2UodW5zaWduZWQgaW50IGluZGV4LCBzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyKQoreworCXJkbXNyKE1UUlJwaHlzQmFzZV9NU1IoaW5kZXgpLCB2ci0+YmFzZV9sbywgdnItPmJhc2VfaGkpOworCXJkbXNyKE1UUlJwaHlzTWFza19NU1IoaW5kZXgpLCB2ci0+bWFza19sbywgdnItPm1hc2tfaGkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2dldF9maXhlZF9yYW5nZXMobXRycl90eXBlICogZnJzKQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgZnJzOworCWludCBpOworCisJcmRtc3IoTVRSUmZpeDY0S18wMDAwMF9NU1IsIHBbMF0sIHBbMV0pOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJcmRtc3IoTVRSUmZpeDE2S184MDAwMF9NU1IgKyBpLCBwWzIgKyBpICogMl0sIHBbMyArIGkgKiAyXSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmRtc3IoTVRSUmZpeDRLX0MwMDAwX01TUiArIGksIHBbNiArIGkgKiAyXSwgcFs3ICsgaSAqIDJdKTsKK30KKworLyogIEdyYWIgYWxsIG9mIHRoZSBNVFJSIHN0YXRlIGZvciB0aGlzIENQVSBpbnRvICpzdGF0ZSAgKi8KK3ZvaWQgX19pbml0IGdldF9tdHJyX3N0YXRlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cnM7CisJdW5zaWduZWQgbG8sIGR1bW15OworCisJaWYgKCFtdHJyX3N0YXRlLnZhcl9yYW5nZXMpIHsKKwkJbXRycl9zdGF0ZS52YXJfcmFuZ2VzID0ga21hbGxvYyhudW1fdmFyX3JhbmdlcyAqIHNpemVvZiAoc3RydWN0IG10cnJfdmFyX3JhbmdlKSwgCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFtdHJyX3N0YXRlLnZhcl9yYW5nZXMpCisJCQlyZXR1cm47CisJfSAKKwl2cnMgPSBtdHJyX3N0YXRlLnZhcl9yYW5nZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykKKwkJZ2V0X210cnJfdmFyX3JhbmdlKGksICZ2cnNbaV0pOworCWdldF9maXhlZF9yYW5nZXMobXRycl9zdGF0ZS5maXhlZF9yYW5nZXMpOworCisJcmRtc3IoTVRSUmRlZlR5cGVfTVNSLCBsbywgZHVtbXkpOworCW10cnJfc3RhdGUuZGVmX3R5cGUgPSAobG8gJiAweGZmKTsKKwltdHJyX3N0YXRlLmVuYWJsZWQgPSAobG8gJiAweGMwMCkgPj4gMTA7Cit9CisKKy8qICBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJ1Y3QgbXRycl9zdGF0ZSAgKi8KK3ZvaWQgX19pbml0IGZpbmFsaXplX210cnJfc3RhdGUodm9pZCkKK3sKKwlpZiAobXRycl9zdGF0ZS52YXJfcmFuZ2VzKQorCQlrZnJlZShtdHJyX3N0YXRlLnZhcl9yYW5nZXMpOworCW10cnJfc3RhdGUudmFyX3JhbmdlcyA9IE5VTEw7Cit9CisKKy8qICBTb21lIEJJT1MncyBhcmUgZnVja2VkIGFuZCBkb24ndCBzZXQgYWxsIE1UUlJzIHRoZSBzYW1lISAgKi8KK3ZvaWQgX19pbml0IG10cnJfc3RhdGVfd2Fybih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IHNtcF9jaGFuZ2VzX21hc2s7CisKKwlpZiAoIW1hc2spCisJCXJldHVybjsKKwlpZiAobWFzayAmIE1UUlJfQ0hBTkdFX01BU0tfRklYRUQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHlvdXIgQ1BVcyBoYWQgaW5jb25zaXN0ZW50IGZpeGVkIE1UUlIgc2V0dGluZ3NcbiIpOworCWlmIChtYXNrICYgTVRSUl9DSEFOR0VfTUFTS19WQVJJQUJMRSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogeW91ciBDUFVzIGhhZCBpbmNvbnNpc3RlbnQgdmFyaWFibGUgTVRSUiBzZXR0aW5nc1xuIik7CisJaWYgKG1hc2sgJiBNVFJSX0NIQU5HRV9NQVNLX0RFRlRZUEUpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHlvdXIgQ1BVcyBoYWQgaW5jb25zaXN0ZW50IE1UUlJkZWZUeXBlIHNldHRpbmdzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBwcm9iYWJseSB5b3VyIEJJT1MgZG9lcyBub3Qgc2V0dXAgYWxsIENQVXMuXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBjb3JyZWN0ZWQgY29uZmlndXJhdGlvbi5cbiIpOworfQorCisvKiBEb2Vzbid0IGF0dGVtcHQgdG8gcGFzcyBhbiBlcnJvciBvdXQgdG8gTVRSUiB1c2VycworICAgYmVjYXVzZSBpdCdzIHF1aXRlIGNvbXBsaWNhdGVkIGluIHNvbWUgY2FzZXMgYW5kIHByb2JhYmx5IG5vdAorICAgd29ydGggaXQgYmVjYXVzZSB0aGUgYmVzdCBlcnJvciBoYW5kbGluZyBpcyB0byBpZ25vcmUgaXQuICovCit2b2lkIG10cnJfd3Jtc3IodW5zaWduZWQgbXNyLCB1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworCWlmICh3cm1zcl9zYWZlKG1zciwgYSwgYikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJNVFJSOiBDUFUgJXU6IFdyaXRpbmcgTVNSICV4IHRvICV4OiV4IGZhaWxlZFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgbXNyLCBhLCBiKTsKK30KKworaW50IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQorLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpLCBtYXg7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgbHNpemU7CisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKwkJbXRycl9pZi0+Z2V0KGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAobHNpemUgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLUVOT1NQQzsKK30KKwordm9pZCBnZW5lcmljX2dldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFza19sbywgbWFza19oaSwgYmFzZV9sbywgYmFzZV9oaTsKKworCXJkbXNyKE1UUlJwaHlzTWFza19NU1IocmVnKSwgbWFza19sbywgbWFza19oaSk7CisJaWYgKChtYXNrX2xvICYgMHg4MDApID09IDApIHsKKwkJLyogIEludmFsaWQgKGkuZS4gZnJlZSkgcmFuZ2UgICovCisJCSpiYXNlID0gMDsKKwkJKnNpemUgPSAwOworCQkqdHlwZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlyZG1zcihNVFJScGh5c0Jhc2VfTVNSKHJlZyksIGJhc2VfbG8sIGJhc2VfaGkpOworCisJLyogV29yayBvdXQgdGhlIHNoaWZ0ZWQgYWRkcmVzcyBtYXNrLiAqLworCW1hc2tfbG8gPSBzaXplX29yX21hc2sgfCBtYXNrX2hpIDw8ICgzMiAtIFBBR0VfU0hJRlQpCisJICAgIHwgbWFza19sbyA+PiBQQUdFX1NISUZUOworCisJLyogVGhpcyB3b3JrcyBjb3JyZWN0bHkgaWYgc2l6ZSBpcyBhIHBvd2VyIG9mIHR3bywgaS5lLiBhCisJICAgY29udGlndW91cyByYW5nZS4gKi8KKwkqc2l6ZSA9IC1tYXNrX2xvOworCSpiYXNlID0gYmFzZV9oaSA8PCAoMzIgLSBQQUdFX1NISUZUKSB8IGJhc2VfbG8gPj4gUEFHRV9TSElGVDsKKwkqdHlwZSA9IGJhc2VfbG8gJiAweGZmOworfQorCitzdGF0aWMgaW50IHNldF9maXhlZF9yYW5nZXMobXRycl90eXBlICogZnJzKQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgZnJzOworCWludCBjaGFuZ2VkID0gRkFMU0U7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxvLCBoaTsKKworCXJkbXNyKE1UUlJmaXg2NEtfMDAwMDBfTVNSLCBsbywgaGkpOworCWlmIChwWzBdICE9IGxvIHx8IHBbMV0gIT0gaGkpIHsKKwkJbXRycl93cm1zcihNVFJSZml4NjRLXzAwMDAwX01TUiwgcFswXSwgcFsxXSk7CisJCWNoYW5nZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcmRtc3IoTVRSUmZpeDE2S184MDAwMF9NU1IgKyBpLCBsbywgaGkpOworCQlpZiAocFsyICsgaSAqIDJdICE9IGxvIHx8IHBbMyArIGkgKiAyXSAhPSBoaSkgeworCQkJbXRycl93cm1zcihNVFJSZml4MTZLXzgwMDAwX01TUiArIGksIHBbMiArIGkgKiAyXSwKKwkJCSAgICAgIHBbMyArIGkgKiAyXSk7CisJCQljaGFuZ2VkID0gVFJVRTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcmRtc3IoTVRSUmZpeDRLX0MwMDAwX01TUiArIGksIGxvLCBoaSk7CisJCWlmIChwWzYgKyBpICogMl0gIT0gbG8gfHwgcFs3ICsgaSAqIDJdICE9IGhpKSB7CisJCQltdHJyX3dybXNyKE1UUlJmaXg0S19DMDAwMF9NU1IgKyBpLCBwWzYgKyBpICogMl0sCisJCQkgICAgICBwWzcgKyBpICogMl0pOworCQkJY2hhbmdlZCA9IFRSVUU7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qICBTZXQgdGhlIE1TUiBwYWlyIHJlbGF0aW5nIHRvIGEgdmFyIHJhbmdlLiBSZXR1cm5zIFRSVUUgaWYKKyAgICBjaGFuZ2VzIGFyZSBtYWRlICAqLworc3RhdGljIGludCBzZXRfbXRycl92YXJfcmFuZ2VzKHVuc2lnbmVkIGludCBpbmRleCwgc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cikKK3sKKwl1bnNpZ25lZCBpbnQgbG8sIGhpOworCWludCBjaGFuZ2VkID0gRkFMU0U7CisKKwlyZG1zcihNVFJScGh5c0Jhc2VfTVNSKGluZGV4KSwgbG8sIGhpKTsKKwlpZiAoKHZyLT5iYXNlX2xvICYgMHhmZmZmZjBmZlVMKSAhPSAobG8gJiAweGZmZmZmMGZmVUwpCisJICAgIHx8ICh2ci0+YmFzZV9oaSAmIDB4ZlVMKSAhPSAoaGkgJiAweGZVTCkpIHsKKwkJbXRycl93cm1zcihNVFJScGh5c0Jhc2VfTVNSKGluZGV4KSwgdnItPmJhc2VfbG8sIHZyLT5iYXNlX2hpKTsKKwkJY2hhbmdlZCA9IFRSVUU7CisJfQorCisJcmRtc3IoTVRSUnBoeXNNYXNrX01TUihpbmRleCksIGxvLCBoaSk7CisKKwlpZiAoKHZyLT5tYXNrX2xvICYgMHhmZmZmZjgwMFVMKSAhPSAobG8gJiAweGZmZmZmODAwVUwpCisJICAgIHx8ICh2ci0+bWFza19oaSAmIDB4ZlVMKSAhPSAoaGkgJiAweGZVTCkpIHsKKwkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKGluZGV4KSwgdnItPm1hc2tfbG8sIHZyLT5tYXNrX2hpKTsKKwkJY2hhbmdlZCA9IFRSVUU7CisJfQorCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfbXRycl9zdGF0ZSh1MzIgZGVmdHlwZV9sbywgdTMyIGRlZnR5cGVfaGkpCisvKiAgW1NVTU1BUlldIFNldCB0aGUgTVRSUiBzdGF0ZSBmb3IgdGhpcyBDUFUuCisgICAgPHN0YXRlPiBUaGUgTVRSUiBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWFkLgorICAgIDxjdHh0PiBTb21lIHJlbGV2YW50IENQVSBjb250ZXh0LgorICAgIFtOT1RFXSBUaGUgQ1BVIG11c3QgYWxyZWFkeSBiZSBpbiBhIHNhZmUgc3RhdGUgZm9yIE1UUlIgY2hhbmdlcy4KKyAgICBbUkVUVVJOU10gMCBpZiBubyBjaGFuZ2VzIG1hZGUsIGVsc2UgYSBtYXNrIGluZGljYXRpb24gd2hhdCB3YXMgY2hhbmdlZC4KKyovCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBjaGFuZ2VfbWFzayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykKKwkJaWYgKHNldF9tdHJyX3Zhcl9yYW5nZXMoaSwgJm10cnJfc3RhdGUudmFyX3Jhbmdlc1tpXSkpCisJCQljaGFuZ2VfbWFzayB8PSBNVFJSX0NIQU5HRV9NQVNLX1ZBUklBQkxFOworCisJaWYgKHNldF9maXhlZF9yYW5nZXMobXRycl9zdGF0ZS5maXhlZF9yYW5nZXMpKQorCQljaGFuZ2VfbWFzayB8PSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEOworCisJLyogIFNldF9tdHJyX3Jlc3RvcmUgcmVzdG9yZXMgdGhlIG9sZCB2YWx1ZSBvZiBNVFJSZGVmVHlwZSwKKwkgICBzbyB0byBzZXQgaXQgd2UgZmlkZGxlIHdpdGggdGhlIHNhdmVkIHZhbHVlICAqLworCWlmICgoZGVmdHlwZV9sbyAmIDB4ZmYpICE9IG10cnJfc3RhdGUuZGVmX3R5cGUKKwkgICAgfHwgKChkZWZ0eXBlX2xvICYgMHhjMDApID4+IDEwKSAhPSBtdHJyX3N0YXRlLmVuYWJsZWQpIHsKKwkJZGVmdHlwZV9sbyB8PSAobXRycl9zdGF0ZS5kZWZfdHlwZSB8IG10cnJfc3RhdGUuZW5hYmxlZCA8PCAxMCk7CisJCWNoYW5nZV9tYXNrIHw9IE1UUlJfQ0hBTkdFX01BU0tfREVGVFlQRTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlX21hc2s7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3I0ID0gMDsKK3N0YXRpYyB1MzIgZGVmdHlwZV9sbywgZGVmdHlwZV9oaTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2F0b21pY2l0eV9sb2NrKTsKKworLyoKKyAqIFNpbmNlIHdlIGFyZSBkaXNhYmxpbmcgdGhlIGNhY2hlIGRvbid0IGFsbG93IGFueSBpbnRlcnJ1cHRzIC0gdGhleQorICogd291bGQgcnVuIGV4dHJlbWVseSBzbG93IGFuZCB3b3VsZCBvbmx5IGluY3JlYXNlIHRoZSBwYWluLiAgVGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCBsb2NhbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgYXJlIHJlZW5hYmxlZCBhZnRlciBwb3N0X3NldCgpCisgKiBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworc3RhdGljIHZvaWQgcHJlcGFyZV9zZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMDsKKworCS8qICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgaWRlYWwsIHNpbmNlIHRoZSBjYWNoZSBpcyBvbmx5IGZsdXNoZWQvZGlzYWJsZWQKKwkgICBmb3IgdGhpcyBDUFUgd2hpbGUgdGhlIE1UUlJzIGFyZSBjaGFuZ2VkLCBidXQgY2hhbmdpbmcgdGhpcyByZXF1aXJlcworCSAgIG1vcmUgaW52YXNpdmUgY2hhbmdlcyB0byB0aGUgd2F5IHRoZSBrZXJuZWwgYm9vdHMgICovCisKKwlzcGluX2xvY2soJnNldF9hdG9taWNpdHlfbG9jayk7CisKKwkvKiAgRW50ZXIgdGhlIG5vLWZpbGwgKENEPTEsIE5XPTApIGNhY2hlIG1vZGUgYW5kIGZsdXNoIGNhY2hlcy4gKi8KKwljcjAgPSByZWFkX2NyMCgpIHwgMHg0MDAwMDAwMDsJLyogc2V0IENEIGZsYWcgKi8KKwl3cml0ZV9jcjAoY3IwKTsKKwl3YmludmQoKTsKKworCS8qICBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykgICovCisJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJY3I0ID0gcmVhZF9jcjQoKTsKKwkJd3JpdGVfY3I0KGNyNCAmIH5YODZfQ1I0X1BHRSk7CisJfQorCisJLyogRmx1c2ggYWxsIFRMQnMgdmlhIGEgbW92ICVjcjMsICVyZWc7IG1vdiAlcmVnLCAlY3IzICovCisJX19mbHVzaF90bGIoKTsKKworCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KKwlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOworCisJLyogIERpc2FibGUgTVRSUnMsIGFuZCBzZXQgdGhlIGRlZmF1bHQgdHlwZSB0byB1bmNhY2hlZCAgKi8KKwltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbyAmIDB4ZjMwMFVMLCBkZWZ0eXBlX2hpKTsKK30KKworc3RhdGljIHZvaWQgcG9zdF9zZXQodm9pZCkKK3sKKwkvKiAgRmx1c2ggVExCcyAobm8gbmVlZCB0byBmbHVzaCBjYWNoZXMgLSB0aGV5IGFyZSBkaXNhYmxlZCkgICovCisJX19mbHVzaF90bGIoKTsKKworCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KKwltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CisJCQorCS8qICBFbmFibGUgY2FjaGVzICAqLworCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkvKiAgUmVzdG9yZSB2YWx1ZSBvZiBDUjQgICovCisJaWYgKCBjcHVfaGFzX3BnZSApCisJCXdyaXRlX2NyNChjcjQpOworCXNwaW5fdW5sb2NrKCZzZXRfYXRvbWljaXR5X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3NldF9hbGwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2ssIGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcHJlcGFyZV9zZXQoKTsKKworCS8qIEFjdHVhbGx5IHNldCB0aGUgc3RhdGUgKi8KKwltYXNrID0gc2V0X210cnJfc3RhdGUoZGVmdHlwZV9sbyxkZWZ0eXBlX2hpKTsKKworCXBvc3Rfc2V0KCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogIFVzZSB0aGUgYXRvbWljIGJpdG9wcyB0byB1cGRhdGUgdGhlIGdsb2JhbCBtYXNrICAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemVvZiBtYXNrICogODsgKytjb3VudCkgeworCQlpZiAobWFzayAmIDB4MDEpCisJCQlzZXRfYml0KGNvdW50LCAmc21wX2NoYW5nZXNfbWFzayk7CisJCW1hc2sgPj49IDE7CisJfQorCQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3NldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKKy8qICBbU1VNTUFSWV0gU2V0IHZhcmlhYmxlIE1UUlIgcmVnaXN0ZXIgb24gdGhlIGxvY2FsIENQVS4KKyAgICA8cmVnPiBUaGUgcmVnaXN0ZXIgdG8gc2V0LgorICAgIDxiYXNlPiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCisgICAgPHNpemU+IFRoZSBzaXplIG9mIHRoZSByZWdpb24uIElmIHRoaXMgaXMgMCB0aGUgcmVnaW9uIGlzIGRpc2FibGVkLgorICAgIDx0eXBlPiBUaGUgdHlwZSBvZiB0aGUgcmVnaW9uLgorICAgIDxkb19zYWZlPiBJZiBUUlVFLCBkbyB0aGUgY2hhbmdlIHNhZmVseS4gSWYgRkFMU0UsIHNhZmV0eSBtZWFzdXJlcyBzaG91bGQKKyAgICBiZSBkb25lIGV4dGVybmFsbHkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcHJlcGFyZV9zZXQoKTsKKworCWlmIChzaXplID09IDApIHsKKwkJLyogVGhlIGludmFsaWQgYml0IGlzIGtlcHQgaW4gdGhlIG1hc2ssIHNvIHdlIHNpbXBseSBjbGVhciB0aGUKKwkJICAgcmVsZXZhbnQgbWFzayByZWdpc3RlciB0byBkaXNhYmxlIGEgcmFuZ2UuICovCisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCAwLCAwKTsKKwl9IGVsc2UgeworCQltdHJyX3dybXNyKE1UUlJwaHlzQmFzZV9NU1IocmVnKSwgYmFzZSA8PCBQQUdFX1NISUZUIHwgdHlwZSwKKwkJICAgICAgKGJhc2UgJiBzaXplX2FuZF9tYXNrKSA+PiAoMzIgLSBQQUdFX1NISUZUKSk7CisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHg4MDAsCisJCSAgICAgICgtc2l6ZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKKwl9CisKKwlwb3N0X3NldCgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50IGdlbmVyaWNfdmFsaWRhdGVfYWRkX3BhZ2UodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgbGJhc2UsIGxhc3Q7CisKKwkvKiAgRm9yIEludGVsIFBQcm8gc3RlcHBpbmcgPD0gNywgbXVzdCBiZSA0IE1pQiBhbGlnbmVkIAorCSAgICBhbmQgbm90IHRvdWNoIDB4NzAwMDAwMDAtPjB4NzAwM0ZGRkYgKi8KKwlpZiAoaXNfY3B1KElOVEVMKSAmJiBib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDEgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODZfbWFzayA8PSA3KSB7CisJCWlmIChiYXNlICYgKCgxIDw8ICgyMiAtIFBBR0VfU0hJRlQpKSAtIDEpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBiYXNlKDB4JWx4MDAwKSBpcyBub3QgNCBNaUIgYWxpZ25lZFxuIiwgYmFzZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoIShiYXNlICsgc2l6ZSA8IDB4NzAwMDAwMDAgfHwgYmFzZSA+IDB4NzAwM0ZGRkYpICYmCisJCSAgICAodHlwZSA9PSBNVFJSX1RZUEVfV1JDT01CCisJCSAgICAgfHwgdHlwZSA9PSBNVFJSX1RZUEVfV1JCQUNLKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogd3JpdGFibGUgbXRyciBiZXR3ZWVuIDB4NzAwMDAwMDAgYW5kIDB4NzAwM0ZGRkYgbWF5IGhhbmcgdGhlIENQVS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoYmFzZSArIHNpemUgPCAweDEwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBjYW5ub3Qgc2V0IHJlZ2lvbiBiZWxvdyAxIE1pQiAoMHglbHgwMDAsMHglbHgwMDApXG4iLAorCQkgICAgICAgYmFzZSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiAgQ2hlY2sgdXBwZXIgYml0cyBvZiBiYXNlIGFuZCBsYXN0IGFyZSBlcXVhbCBhbmQgbG93ZXIgYml0cyBhcmUgMAorCSAgICBmb3IgYmFzZSBhbmQgMSBmb3IgbGFzdCAgKi8KKwlsYXN0ID0gYmFzZSArIHNpemUgLSAxOworCWZvciAobGJhc2UgPSBiYXNlOyAhKGxiYXNlICYgMSkgJiYgKGxhc3QgJiAxKTsKKwkgICAgIGxiYXNlID0gbGJhc2UgPj4gMSwgbGFzdCA9IGxhc3QgPj4gMSkgOworCWlmIChsYmFzZSAhPSBsYXN0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IGJhc2UoMHglbHgwMDApIGlzIG5vdCBhbGlnbmVkIG9uIGEgc2l6ZSgweCVseDAwMCkgYm91bmRhcnlcbiIsCisJCSAgICAgICBiYXNlLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2VuZXJpY19oYXZlX3dyY29tYih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnLCBkdW1teTsKKwlyZG1zcihNVFJSY2FwX01TUiwgY29uZmlnLCBkdW1teSk7CisJcmV0dXJuIChjb25maWcgJiAoMSA8PCAxMCkpOworfQorCitpbnQgcG9zaXRpdmVfaGF2ZV93cmNvbWIodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworLyogZ2VuZXJpYyBzdHJ1Y3R1cmUuLi4KKyAqLworc3RydWN0IG10cnJfb3BzIGdlbmVyaWNfbXRycl9vcHMgPSB7CisJLnVzZV9pbnRlbF9pZiAgICAgID0gMSwKKwkuc2V0X2FsbAkgICA9IGdlbmVyaWNfc2V0X2FsbCwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBnZW5lcmljX2dldF9tdHJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uLAorCS5zZXQgICAgICAgICAgICAgICA9IGdlbmVyaWNfc2V0X210cnIsCisJLnZhbGlkYXRlX2FkZF9wYWdlID0gZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBnZW5lcmljX2hhdmVfd3Jjb21iLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIzZTBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jCkBAIC0wLDAgKzEsMzc0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBMSU5FX1NJWkUgODAKKworI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisvKiBSRUQtUEVOOiB0aGlzIGlzIGFjY2Vzc2VkIHdpdGhvdXQgYW55IGxvY2tpbmcgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgKnVzYWdlX3RhYmxlOworCisKKyNkZWZpbmUgRklMRV9GQ09VTlQoZikgKCgoc3RydWN0IHNlcV9maWxlICopKChmKS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGUpCisKK3N0YXRpYyBjaGFyICptdHJyX3N0cmluZ3NbTVRSUl9OVU1fVFlQRVNdID0KK3sKKyAgICAidW5jYWNoYWJsZSIsICAgICAgICAgICAgICAgLyogMCAqLworICAgICJ3cml0ZS1jb21iaW5pbmciLCAgICAgICAgICAvKiAxICovCisgICAgIj8iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKyAgICAiPyIsICAgICAgICAgICAgICAgICAgICAgICAgLyogMyAqLworICAgICJ3cml0ZS10aHJvdWdoIiwgICAgICAgICAgICAvKiA0ICovCisgICAgIndyaXRlLXByb3RlY3QiLCAgICAgICAgICAgIC8qIDUgKi8KKyAgICAid3JpdGUtYmFjayIsICAgICAgICAgICAgICAgLyogNiAqLworfTsKKworY2hhciAqbXRycl9hdHRyaWJfdG9fc3RyKGludCB4KQoreworCXJldHVybiAoeCA8PSA2KSA/IG10cnJfc3RyaW5nc1t4XSA6ICI/IjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBpbnQKK210cnJfZmlsZV9hZGQodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJICAgICAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHBhZ2UpCit7CisJaW50IHJlZywgbWF4OworCXVuc2lnbmVkIGludCAqZmNvdW50ID0gRklMRV9GQ09VTlQoZmlsZSk7IAorCisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJaWYgKGZjb3VudCA9PSBOVUxMKSB7CisJCWZjb3VudCA9IGttYWxsb2MobWF4ICogc2l6ZW9mICpmY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIWZjb3VudCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoZmNvdW50LCAwLCBtYXggKiBzaXplb2YgKmZjb3VudCk7CisJCUZJTEVfRkNPVU5UKGZpbGUpID0gZmNvdW50OworCX0KKwlpZiAoIXBhZ2UpIHsKKwkJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYmFzZSA+Pj0gUEFHRV9TSElGVDsKKwkJc2l6ZSA+Pj0gUEFHRV9TSElGVDsKKwl9CisJcmVnID0gbXRycl9hZGRfcGFnZShiYXNlLCBzaXplLCB0eXBlLCAxKTsKKwlpZiAocmVnID49IDApCisJCSsrZmNvdW50W3JlZ107CisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludAorbXRycl9maWxlX2RlbCh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHBhZ2UpCit7CisJaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgKmZjb3VudCA9IEZJTEVfRkNPVU5UKGZpbGUpOworCisJaWYgKCFwYWdlKSB7CisJCWlmICgoYmFzZSAmIChQQUdFX1NJWkUgLSAxKSkgfHwgKHNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJhc2UgPj49IFBBR0VfU0hJRlQ7CisJCXNpemUgPj49IFBBR0VfU0hJRlQ7CisJfQorCXJlZyA9IG10cnJfZGVsX3BhZ2UoLTEsIGJhc2UsIHNpemUpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCWlmIChmY291bnQgPT0gTlVMTCkKKwkJcmV0dXJuIHJlZzsKKwlpZiAoZmNvdW50W3JlZ10gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwktLWZjb3VudFtyZWddOworCXJldHVybiByZWc7Cit9CisKKy8qIFJFRC1QRU46IHNlcV9maWxlIGNhbiBzZWVrIG5vdy4gdGhpcyBpcyBpZ25vcmVkLiAqLworc3RhdGljIHNzaXplX3QKK210cnJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqIHBwb3MpCisvKiAgRm9ybWF0IG9mIGNvbnRyb2wgbGluZToKKyAgICAiYmFzZT0lTHggc2l6ZT0lTHggdHlwZT0lcyIgICAgIE9SOgorICAgICJkaXNhYmxlPSVkIgorKi8KK3sKKwlpbnQgaSwgZXJyOworCXVuc2lnbmVkIGxvbmcgcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlLCBzaXplOworCWNoYXIgKnB0cjsKKwljaGFyIGxpbmVbTElORV9TSVpFXTsKKwlzaXplX3QgbGluZWxlbjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KGxpbmUsIDAsIExJTkVfU0laRSk7CisJaWYgKGxlbiA+IExJTkVfU0laRSkKKwkJbGVuID0gTElORV9TSVpFOworCWlmIChjb3B5X2Zyb21fdXNlcihsaW5lLCBidWYsIGxlbiAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsaW5lbGVuID0gc3RybGVuKGxpbmUpOworCXB0ciA9IGxpbmUgKyBsaW5lbGVuIC0gMTsKKwlpZiAobGluZWxlbiAmJiAqcHRyID09ICdcbicpCisJCSpwdHIgPSAnXDAnOworCWlmICghc3RybmNtcChsaW5lLCAiZGlzYWJsZT0iLCA4KSkgeworCQlyZWcgPSBzaW1wbGVfc3RydG91bChsaW5lICsgOCwgJnB0ciwgMCk7CisJCWVyciA9IG10cnJfZGVsX3BhZ2UocmVnLCAwLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gbGVuOworCX0KKwlpZiAoc3RybmNtcChsaW5lLCAiYmFzZT0iLCA1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYmFzZSA9IHNpbXBsZV9zdHJ0b3VsbChsaW5lICsgNSwgJnB0ciwgMCk7CisJZm9yICg7IGlzc3BhY2UoKnB0cik7ICsrcHRyKSA7CisJaWYgKHN0cm5jbXAocHRyLCAic2l6ZT0iLCA1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbChwdHIgKyA1LCAmcHRyLCAwKTsKKwlpZiAoKGJhc2UgJiAweGZmZikgfHwgKHNpemUgJiAweGZmZikpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoOyBpc3NwYWNlKCpwdHIpOyArK3B0cikgOworCWlmIChzdHJuY21wKHB0ciwgInR5cGU9IiwgNSkpCisJCXJldHVybiAtRUlOVkFMOworCXB0ciArPSA1OworCWZvciAoOyBpc3NwYWNlKCpwdHIpOyArK3B0cikgOworCWZvciAoaSA9IDA7IGkgPCBNVFJSX05VTV9UWVBFUzsgKytpKSB7CisJCWlmIChzdHJjbXAocHRyLCBtdHJyX3N0cmluZ3NbaV0pKQorCQkJY29udGludWU7CisJCWJhc2UgPj49IFBBR0VfU0hJRlQ7CisJCXNpemUgPj49IFBBR0VfU0hJRlQ7CisJCWVyciA9CisJCSAgICBtdHJyX2FkZF9wYWdlKCh1bnNpZ25lZCBsb25nKSBiYXNlLCAodW5zaWduZWQgbG9uZykgc2l6ZSwgaSwKKwkJCQkgIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXJldHVybiBsZW47CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CittdHJyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgX19hcmcpCit7CisJaW50IGVycjsKKwltdHJyX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgbXRycl9zZW50cnkgc2VudHJ5OworCXN0cnVjdCBtdHJyX2dlbnRyeSBnZW50cnk7CisJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKSBfX2FyZzsKKworCXN3aXRjaCAoY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBNVFJSSU9DX0FERF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0KKwkJICAgIG10cnJfZmlsZV9hZGQoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBzZW50cnkudHlwZSwgMSwKKwkJCQkgIGZpbGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19TRVRfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfYWRkKHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSwgc2VudHJ5LnR5cGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19ERUxfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfZmlsZV9kZWwoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBmaWxlLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfS0lMTF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9kZWwoLTEsIHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX0dFVF9FTlRSWToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnZW50cnksIGFyZywgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGdlbnRyeS5yZWdudW0gPj0gbnVtX3Zhcl9yYW5nZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbXRycl9pZi0+Z2V0KGdlbnRyeS5yZWdudW0sICZnZW50cnkuYmFzZSwgJmdlbnRyeS5zaXplLCAmdHlwZSk7CisKKwkJLyogSGlkZSBlbnRyaWVzIHRoYXQgZ28gYWJvdmUgNEdCICovCisJCWlmIChnZW50cnkuYmFzZSArIGdlbnRyeS5zaXplID4gMHgxMDAwMDAKKwkJICAgIHx8IGdlbnRyeS5zaXplID09IDB4MTAwMDAwKQorCQkJZ2VudHJ5LmJhc2UgPSBnZW50cnkuc2l6ZSA9IGdlbnRyeS50eXBlID0gMDsKKwkJZWxzZSB7CisJCQlnZW50cnkuYmFzZSA8PD0gUEFHRV9TSElGVDsKKwkJCWdlbnRyeS5zaXplIDw8PSBQQUdFX1NISUZUOworCQkJZ2VudHJ5LnR5cGUgPSB0eXBlOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZnZW50cnksIHNpemVvZiBnZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19BRERfUEFHRV9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0KKwkJICAgIG10cnJfZmlsZV9hZGQoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBzZW50cnkudHlwZSwgMSwKKwkJCQkgIGZpbGUsIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19TRVRfUEFHRV9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9hZGRfcGFnZShzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIHNlbnRyeS50eXBlLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfREVMX1BBR0VfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfZmlsZV9kZWwoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBmaWxlLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfS0lMTF9QQUdFX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBtdHJyX2RlbF9wYWdlKC0xLCBzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19HRVRfUEFHRV9FTlRSWToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnZW50cnksIGFyZywgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGdlbnRyeS5yZWdudW0gPj0gbnVtX3Zhcl9yYW5nZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbXRycl9pZi0+Z2V0KGdlbnRyeS5yZWdudW0sICZnZW50cnkuYmFzZSwgJmdlbnRyeS5zaXplLCAmdHlwZSk7CisJCWdlbnRyeS50eXBlID0gdHlwZTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmdlbnRyeSwgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittdHJyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgaSwgbWF4OworCXVuc2lnbmVkIGludCAqZmNvdW50ID0gRklMRV9GQ09VTlQoZmlsZSk7CisKKwlpZiAoZmNvdW50ICE9IE5VTEwpIHsKKwkJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQkJd2hpbGUgKGZjb3VudFtpXSA+IDApIHsKKwkJCQltdHJyX2RlbChpLCAwLCAwKTsKKwkJCQktLWZjb3VudFtpXTsKKwkJCX0KKwkJfQorCQlrZnJlZShmY291bnQpOworCQlGSUxFX0ZDT1VOVChmaWxlKSA9IE5VTEw7CisJfQorCXJldHVybiBzaW5nbGVfcmVsZWFzZShpbm8sIGZpbGUpOworfQorCitzdGF0aWMgaW50IG10cnJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CisKK3N0YXRpYyBpbnQgbXRycl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbXRycl9pZikgCisJCXJldHVybiAtRUlPOworCWlmICghbXRycl9pZi0+Z2V0KSAKKwkJcmV0dXJuIC1FTlhJTzsgCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG10cnJfc2VxX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtdHJyX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBtdHJyX29wZW4sIAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLndyaXRlICAgPSBtdHJyX3dyaXRlLAorCS5pb2N0bCAgID0gbXRycl9pb2N0bCwKKwkucmVsZWFzZSA9IG10cnJfY2xvc2UsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfcm9vdF9tdHJyOworCisKK3N0YXRpYyBpbnQgbXRycl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCWNoYXIgZmFjdG9yOworCWludCBpLCBtYXgsIGxlbjsKKwltdHJyX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlsZW4gPSAwOworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQltdHJyX2lmLT5nZXQoaSwgJmJhc2UsICZzaXplLCAmdHlwZSk7CisJCWlmIChzaXplID09IDApCisJCQl1c2FnZV90YWJsZVtpXSA9IDA7CisJCWVsc2UgeworCQkJaWYgKHNpemUgPCAoMHgxMDAwMDAgPj4gUEFHRV9TSElGVCkpIHsKKwkJCQkvKiBsZXNzIHRoYW4gMU1CICovCisJCQkJZmFjdG9yID0gJ0snOworCQkJCXNpemUgPDw9IFBBR0VfU0hJRlQgLSAxMDsKKwkJCX0gZWxzZSB7CisJCQkJZmFjdG9yID0gJ00nOworCQkJCXNpemUgPj49IDIwIC0gUEFHRV9TSElGVDsKKwkJCX0KKwkJCS8qIFJFRC1QRU46IGJhc2UgY2FuIGJlID4gMzJiaXQgKi8gCisJCQlsZW4gKz0gc2VxX3ByaW50ZihzZXEsIAorCQkJCSAgICJyZWclMDJpOiBiYXNlPTB4JTA1bHgwMDAgKCU0bGlNQiksIHNpemU9JTRpJWNCOiAlcywgY291bnQ9JWRcbiIsCisJCQkgICAgIGksIGJhc2UsIGJhc2UgPj4gKDIwIC0gUEFHRV9TSElGVCksIHNpemUsIGZhY3RvciwKKwkJCSAgICAgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpLCB1c2FnZV90YWJsZVtpXSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG10cnJfaWZfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJaWYgKCghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NVFJSKSkgJiYKKwkgICAgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0s2X01UUlIpKSAmJgorCSAgICAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSKSkgJiYKKwkgICAgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSKSkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJvY19yb290X210cnIgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgibXRyciIsIFNfSVdVU1IgfCBTX0lSVUdPLCAmcHJvY19yb290KTsKKwlpZiAocHJvY19yb290X210cnIpIHsKKwkJcHJvY19yb290X210cnItPm93bmVyID0gVEhJU19NT0RVTEU7CisJCXByb2Nfcm9vdF9tdHJyLT5wcm9jX2ZvcHMgPSAmbXRycl9mb3BzOworCX0KKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChtdHJyX2lmX2luaXQpOworI2VuZGlmCQkJLyogIENPTkZJR19QUk9DX0ZTICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY3YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qICBHZW5lcmljIE1UUlIgKE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyKSBkcml2ZXIuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCAgUmljaGFyZCBHb29jaAorICAgIENvcHlyaWdodCAoYykgMjAwMgkgICAgIFBhdHJpY2sgTW9jaGVsCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIFNvdXJjZTogIlBlbnRpdW0gUHJvIEZhbWlseSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorICAgIE9wZXJhdGluZyBTeXN0ZW0gV3JpdGVyJ3MgR3VpZGUiIChJbnRlbCBkb2N1bWVudCBudW1iZXIgMjQyNjkyKSwKKyAgICBzZWN0aW9uIDExLjExLjcKKworICAgIFRoaXMgd2FzIGNsZWFuZWQgYW5kIG1hZGUgcmVhZGFibGUgYnkgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4gCisgICAgb24gNi03IE1hcmNoIDIwMDIuIAorICAgIFNvdXJjZTogSW50ZWwgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcnMgTWFudWFsLCBWb2x1bWUgMzogCisgICAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlOyBTZWN0aW9uIDkuMTEuICgxOTk3IGVkaXRpb24gLSBQUHJvKS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgIm10cnIuaCIKKworI2RlZmluZSBNVFJSX1ZFUlNJT04gICAgICAgICAgICAiMi4wICgyMDAyMDUxOSkiCisKK3UzMiBudW1fdmFyX3JhbmdlcyA9IDA7CisKK3Vuc2lnbmVkIGludCAqdXNhZ2VfdGFibGU7CitzdGF0aWMgREVDTEFSRV9NVVRFWChtYWluX2xvY2spOworCit1MzIgc2l6ZV9vcl9tYXNrLCBzaXplX2FuZF9tYXNrOworCitzdGF0aWMgc3RydWN0IG10cnJfb3BzICogbXRycl9vcHNbWDg2X1ZFTkRPUl9OVU1dID0ge307CisKK3N0cnVjdCBtdHJyX29wcyAqIG10cnJfaWYgPSBOVUxMOworCitzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSk7CisKK2V4dGVybiBpbnQgYXJyM19wcm90ZWN0ZWQ7CisKK3ZvaWQgc2V0X210cnJfb3BzKHN0cnVjdCBtdHJyX29wcyAqIG9wcykKK3sKKwlpZiAob3BzLT52ZW5kb3IgJiYgb3BzLT52ZW5kb3IgPCBYODZfVkVORE9SX05VTSkKKwkJbXRycl9vcHNbb3BzLT52ZW5kb3JdID0gb3BzOworfQorCisvKiAgUmV0dXJucyBub24temVybyBpZiB3ZSBoYXZlIHRoZSB3cml0ZS1jb21iaW5pbmcgbWVtb3J5IHR5cGUgICovCitzdGF0aWMgaW50IGhhdmVfd3Jjb21iKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwkKKwlpZiAoKGRldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgsIE5VTEwpKSAhPSBOVUxMKSB7CisJCS8qIFNlcnZlcldvcmtzIExFIGNoaXBzZXRzIGhhdmUgcHJvYmxlbXMgd2l0aCB3cml0ZS1jb21iaW5pbmcgCisJCSAgIERvbid0IGFsbG93IGl0IGFuZCBsZWF2ZSByb29tIGZvciBvdGhlciBjaGlwc2V0cyB0byBiZSB0YWdnZWQgKi8KKwkJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MgJiYKKwkJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfTEUpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IFNlcnZlcndvcmtzIExFIGRldGVjdGVkLiBXcml0ZS1jb21iaW5pbmcgZGlzYWJsZWQuXG4iKTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBJbnRlbCA0NTBOWCBlcnJhdGEgIyAyMy4gTm9uIGFzY2VuZGluZyBjYWNobGluZSBldmljdGlvbnMgdG8KKwkJICAgd3JpdGUgY29tYmluaW5nIG1lbW9yeSBtYXkgcmVzdWx0aW5nIGluIGRhdGEgY29ycnVwdGlvbiAqLworCQlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJgorCQkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBJbnRlbCA0NTBOWCBNTUMgZGV0ZWN0ZWQuIFdyaXRlLWNvbWJpbmluZyBkaXNhYmxlZC5cbiIpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQkJCisJcmV0dXJuIChtdHJyX2lmLT5oYXZlX3dyY29tYiA/IG10cnJfaWYtPmhhdmVfd3Jjb21iKCkgOiAwKTsKK30KKworLyogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlIE1UUlJzICAqLworc3RhdGljIHZvaWQgX19pbml0IHNldF9udW1fdmFyX3Jhbmdlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnID0gMCwgZHVtbXk7CisKKwlpZiAodXNlX2ludGVsKCkpIHsKKwkJcmRtc3IoTVRSUmNhcF9NU1IsIGNvbmZpZywgZHVtbXkpOworCX0gZWxzZSBpZiAoaXNfY3B1KEFNRCkpCisJCWNvbmZpZyA9IDI7CisJZWxzZSBpZiAoaXNfY3B1KENZUklYKSB8fCBpc19jcHUoQ0VOVEFVUikpCisJCWNvbmZpZyA9IDg7CisJbnVtX3Zhcl9yYW5nZXMgPSBjb25maWcgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF90YWJsZSh2b2lkKQoreworCWludCBpLCBtYXg7CisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlpZiAoKHVzYWdlX3RhYmxlID0ga21hbGxvYyhtYXggKiBzaXplb2YgKnVzYWdlX3RhYmxlLCBHRlBfS0VSTkVMKSkKKwkgICAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm10cnI6IGNvdWxkIG5vdCBhbGxvY2F0ZVxuIik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQl1c2FnZV90YWJsZVtpXSA9IDE7Cit9CisKK3N0cnVjdCBzZXRfbXRycl9kYXRhIHsKKwlhdG9taWNfdAljb3VudDsKKwlhdG9taWNfdAlnYXRlOworCXVuc2lnbmVkIGxvbmcJc21wX2Jhc2U7CisJdW5zaWduZWQgbG9uZwlzbXBfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJc21wX3JlZzsKKwltdHJyX3R5cGUJc21wX3R5cGU7Cit9OworCisjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgdm9pZCBpcGlfaGFuZGxlcih2b2lkICppbmZvKQorLyogIFtTVU1NQVJZXSBTeW5jaHJvbmlzYXRpb24gaGFuZGxlci4gRXhlY3V0ZWQgYnkgIm90aGVyIiBDUFVzLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlzdHJ1Y3Qgc2V0X210cnJfZGF0YSAqZGF0YSA9IGluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKKwl3aGlsZSghYXRvbWljX3JlYWQoJmRhdGEtPmdhdGUpKQorCQljcHVfcmVsYXgoKTsKKworCS8qICBUaGUgbWFzdGVyIGhhcyBjbGVhcmVkIG1lIHRvIGV4ZWN1dGUgICovCisJaWYgKGRhdGEtPnNtcF9yZWcgIT0gfjBVKSAKKwkJbXRycl9pZi0+c2V0KGRhdGEtPnNtcF9yZWcsIGRhdGEtPnNtcF9iYXNlLCAKKwkJCSAgICAgZGF0YS0+c21wX3NpemUsIGRhdGEtPnNtcF90eXBlKTsKKwllbHNlCisJCW10cnJfaWYtPnNldF9hbGwoKTsKKworCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKKwl3aGlsZShhdG9taWNfcmVhZCgmZGF0YS0+Z2F0ZSkpCisJCWNwdV9yZWxheCgpOworCisJYXRvbWljX2RlYygmZGF0YS0+Y291bnQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VuZGlmCisKKy8qKgorICogc2V0X210cnIgLSB1cGRhdGUgbXRycnMgb24gYWxsIHByb2Nlc3NvcnMKKyAqIEByZWc6CW10cnIgaW4gcXVlc3Rpb24KKyAqIEBiYXNlOgltdHJyIGJhc2UKKyAqIEBzaXplOgltdHJyIHNpemUKKyAqIEB0eXBlOgltdHJyIHR5cGUKKyAqCisgKiBUaGlzIGlzIGtpbmRhIHRyaWNreSwgYnV0IGZvcnR1bmF0ZWx5LCBJbnRlbCBzcGVsbGVkIGl0IG91dCBmb3IgdXMgY2xlYW5seToKKyAqIAorICogMS4gU2VuZCBJUEkgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAqIDIuIERpc2FibGUgSW50ZXJydXB0cworICogMy4gV2FpdCBmb3IgYWxsIHByb2NzIHRvIGRvIHNvIAorICogNC4gRW50ZXIgbm8tZmlsbCBjYWNoZSBtb2RlCisgKiA1LiBGbHVzaCBjYWNoZXMKKyAqIDYuIENsZWFyIFBHRSBiaXQKKyAqIDcuIEZsdXNoIGFsbCBUTEJzCisgKiA4LiBEaXNhYmxlIGFsbCByYW5nZSByZWdpc3RlcnMKKyAqIDkuIFVwZGF0ZSB0aGUgTVRSUnMKKyAqIDEwLiBFbmFibGUgYWxsIHJhbmdlIHJlZ2lzdGVycworICogMTEuIEZsdXNoIGFsbCBUTEJzIGFuZCBjYWNoZXMgYWdhaW4KKyAqIDEyLiBFbnRlciBub3JtYWwgY2FjaGUgbW9kZSBhbmQgcmVlbmFibGUgY2FjaGluZworICogMTMuIFNldCBQR0UgCisgKiAxNC4gV2FpdCBmb3IgYnVkZGllcyB0byBjYXRjaCB1cAorICogMTUuIEVuYWJsZSBpbnRlcnJ1cHRzLgorICogCisgKiBXaGF0IGRvZXMgdGhhdCBtZWFuIGZvciB1cz8gV2VsbCwgZmlyc3Qgd2Ugc2V0IGRhdGEuY291bnQgdG8gdGhlIG51bWJlcgorICogb2YgQ1BVcy4gQXMgZWFjaCBDUFUgZGlzYWJsZXMgaW50ZXJydXB0cywgaXQnbGwgZGVjcmVtZW50IGl0IG9uY2UuIFdlIHdhaXQKKyAqIHVudGlsIGl0IGhpdHMgMCBhbmQgcHJvY2VlZC4gV2Ugc2V0IHRoZSBkYXRhLmdhdGUgZmxhZyBhbmQgcmVzZXQgZGF0YS5jb3VudC4KKyAqIE1lYW53aGlsZSwgdGhleSBhcmUgd2FpdGluZyBmb3IgdGhhdCBmbGFnIHRvIGJlIHNldC4gT25jZSBpdCdzIHNldCwgZWFjaCAKKyAqIENQVSBnb2VzIHRocm91Z2ggdGhlIHRyYW5zaXRpb24gb2YgdXBkYXRpbmcgTVRSUnMuIFRoZSBDUFUgdmVuZG9ycyBtYXkgZWFjaCBkbyBpdCAKKyAqIGRpZmZlcmVudGx5LCBzbyB3ZSBjYWxsIG10cnJfaWYtPnNldCgpIGNhbGxiYWNrIGFuZCBsZXQgdGhlbSB0YWtlIGNhcmUgb2YgaXQuCisgKiBXaGVuIHRoZXkncmUgZG9uZSwgdGhleSBhZ2FpbiBkZWNyZW1lbnQgZGF0YS0+Y291bnQgYW5kIHdhaXQgZm9yIGRhdGEuZ2F0ZSB0byAKKyAqIGJlIHJlc2V0LiAKKyAqIFdoZW4gd2UgZmluaXNoLCB3ZSB3YWl0IGZvciBkYXRhLmNvdW50IHRvIGhpdCAwIGFuZCB0b2dnbGUgdGhlIGRhdGEuZ2F0ZSBmbGFnLgorICogRXZlcnlvbmUgdGhlbiBlbmFibGVzIGludGVycnVwdHMgYW5kIHdlIGFsbCBjb250aW51ZSBvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIG1lY2hhbmlzbSBpcyB0aGUgc2FtZSBmb3IgVVAgc3lzdGVtcywgdG9vOyBhbGwgdGhlIFNNUCBzdHVmZgorICogYmVjb21lcyBub3BzLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgc2V0X210cnJfZGF0YSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYXRhLnNtcF9yZWcgPSByZWc7CisJZGF0YS5zbXBfYmFzZSA9IGJhc2U7CisJZGF0YS5zbXBfc2l6ZSA9IHNpemU7CisJZGF0YS5zbXBfdHlwZSA9IHR5cGU7CisJYXRvbWljX3NldCgmZGF0YS5jb3VudCwgbnVtX2Jvb3RpbmdfY3B1cygpIC0gMSk7CisJYXRvbWljX3NldCgmZGF0YS5nYXRlLDApOworCisJLyogIFN0YXJ0IHRoZSBiYWxsIHJvbGxpbmcgb24gb3RoZXIgQ1BVcyAgKi8KKwlpZiAoc21wX2NhbGxfZnVuY3Rpb24oaXBpX2hhbmRsZXIsICZkYXRhLCAxLCAwKSAhPSAwKQorCQlwYW5pYygibXRycjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIG90aGVyIENQVXNcbiIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJd2hpbGUoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIG9rLCByZXNldCBjb3VudCBhbmQgdG9nZ2xlIGdhdGUgKi8KKwlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKKwlhdG9taWNfc2V0KCZkYXRhLmdhdGUsMSk7CisKKwkvKiBkbyBvdXIgTVRSUiBidXNpbmVzcyAqLworCisJLyogSEFDSyEKKwkgKiBXZSB1c2UgdGhpcyBzYW1lIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG10cnJzIG9uIGJvb3QuCisJICogVGhlIHN0YXRlIG9mIHRoZSBib290IGNwdSdzIG10cnJzIGhhcyBiZWVuIHNhdmVkLCBhbmQgd2Ugd2FudAorCSAqIHRvIHJlcGxpY2F0ZSBhY3Jvc3MgYWxsIHRoZSBBUHMuIAorCSAqIElmIHdlJ3JlIGRvaW5nIHRoYXQgQHJlZyBpcyBzZXQgdG8gc29tZXRoaW5nIHNwZWNpYWwuLi4KKwkgKi8KKwlpZiAocmVnICE9IH4wVSkgCisJCW10cnJfaWYtPnNldChyZWcsYmFzZSxzaXplLHR5cGUpOworCisJLyogd2FpdCBmb3IgdGhlIG90aGVycyAqLworCXdoaWxlKGF0b21pY19yZWFkKCZkYXRhLmNvdW50KSkKKwkJY3B1X3JlbGF4KCk7CisKKwlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKKwlhdG9taWNfc2V0KCZkYXRhLmdhdGUsMCk7CisKKwkvKgorCSAqIFdhaXQgaGVyZSBmb3IgZXZlcnlvbmUgdG8gaGF2ZSBzZWVuIHRoZSBnYXRlIGNoYW5nZQorCSAqIFNvIHdlJ3JlIHRoZSBsYXN0IG9uZXMgdG8gdG91Y2ggJ2RhdGEnCisJICovCisJd2hpbGUoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQorCQljcHVfcmVsYXgoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKgltdHJyX2FkZF9wYWdlIC0gQWRkIGEgbWVtb3J5IHR5cGUgcmVnaW9uCisgKglAYmFzZTogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKKyAqCUBzaXplOiBQaHlzaWNhbCBzaXplIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKKyAqCUB0eXBlOiBUeXBlIG9mIE1UUlIgZGVzaXJlZAorICoJQGluY3JlbWVudDogSWYgdGhpcyBpcyB0cnVlIGRvIHVzYWdlIGNvdW50aW5nIG9uIHRoZSByZWdpb24KKyAqCisgKglNZW1vcnkgdHlwZSByZWdpb24gcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIGNhY2hpbmcgb24gbmV3ZXIgSW50ZWwgYW5kCisgKglub24gSW50ZWwgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZHJpdmVycyB0byByZXF1ZXN0IGFuCisgKglNVFJSIGlzIGFkZGVkLiBUaGUgZGV0YWlscyBhbmQgaGFyZHdhcmUgc3BlY2lmaWNzIG9mIGVhY2ggcHJvY2Vzc29yJ3MKKyAqCWltcGxlbWVudGF0aW9uIGFyZSBoaWRkZW4gZnJvbSB0aGUgY2FsbGVyLCBidXQgbmV2ZXJ0aGVsZXNzIHRoZSAKKyAqCWNhbGxlciBzaG91bGQgZXhwZWN0IHRvIG5lZWQgdG8gcHJvdmlkZSBhIHBvd2VyIG9mIHR3byBzaXplIG9uIGFuCisgKgllcXVpdmFsZW50IHBvd2VyIG9mIHR3byBib3VuZGFyeS4KKyAqCisgKglJZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBhZGRlZCBlaXRoZXIgYmVjYXVzZSBhbGwgcmVnaW9ucyBhcmUgaW4gdXNlCisgKglvciB0aGUgQ1BVIGNhbm5vdCBzdXBwb3J0IGl0IGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MKKyAqCXRoZSByZWdpc3RlciBudW1iZXIgZm9yIHRoaXMgZW50cnkgaXMgcmV0dXJuZWQsIGJ1dCBzaG91bGQgYmUgdHJlYXRlZAorICoJYXMgYSBjb29raWUgb25seS4KKyAqCisgKglPbiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUgdGhlIGNoYW5nZXMgYXJlIG1hZGUgdG8gYWxsIHByb2Nlc3NvcnMuCisgKglUaGlzIGlzIHJlcXVpcmVkIG9uIHg4NiBieSB0aGUgSW50ZWwgcHJvY2Vzc29ycy4KKyAqCisgKglUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZQorICoKKyAqCSVNVFJSX1RZUEVfVU5DQUNIQUJMRQktCU5vIGNhY2hpbmcKKyAqCisgKgklTVRSUl9UWVBFX1dSQkFDSwktCVdyaXRlIGRhdGEgYmFjayBpbiBidXJzdHMgd2hlbmV2ZXIKKyAqCisgKgklTVRSUl9UWVBFX1dSQ09NQgktCVdyaXRlIGRhdGEgYmFjayBzb29uIGJ1dCBhbGxvdyBidXJzdHMKKyAqCisgKgklTVRSUl9UWVBFX1dSVEhST1VHSAktCUNhY2hlIHJlYWRzIGJ1dCBub3Qgd3JpdGVzCisgKgorICoJQlVHUzogTmVlZHMgYSBxdWlldCBmbGFnIGZvciB0aGUgY2FzZXMgd2hlcmUgZHJpdmVycyBkbyBub3QgbWluZAorICoJZmFpbHVyZXMgYW5kIGRvIG5vdCB3aXNoIHN5c3RlbSBsb2cgbWVzc2FnZXMgdG8gYmUgc2VudC4KKyAqLworCitpbnQgbXRycl9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgCisJCSAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50KQoreworCWludCBpOworCW10cnJfdHlwZSBsdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlOworCXVuc2lnbmVkIGludCBsc2l6ZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW10cnJfaWYpCisJCXJldHVybiAtRU5YSU87CisJCQorCWlmICgoZXJyb3IgPSBtdHJyX2lmLT52YWxpZGF0ZV9hZGRfcGFnZShiYXNlLHNpemUsdHlwZSkpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAodHlwZSA+PSBNVFJSX05VTV9UWVBFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiB0eXBlOiAldSBpbnZhbGlkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogIElmIHRoZSB0eXBlIGlzIFdDLCBjaGVjayB0aGF0IHRoaXMgcHJvY2Vzc29yIHN1cHBvcnRzIGl0ICAqLworCWlmICgodHlwZSA9PSBNVFJSX1RZUEVfV1JDT01CKSAmJiAhaGF2ZV93cmNvbWIoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAibXRycjogeW91ciBwcm9jZXNzb3IgZG9lc24ndCBzdXBwb3J0IHdyaXRlLWNvbWJpbmluZ1xuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWlmIChiYXNlICYgc2l6ZV9vcl9tYXNrIHx8IHNpemUgJiBzaXplX29yX21hc2spIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogYmFzZSBvciBzaXplIGV4Y2VlZHMgdGhlIE1UUlIgd2lkdGhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IC1FSU5WQUw7CisKKwkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLworCWRvd24oJm1haW5fbG9jayk7CisJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyArK2kpIHsKKwkJbXRycl9pZi0+Z2V0KGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAoYmFzZSA+PSBsYmFzZSArIGxzaXplKQorCQkJY29udGludWU7CisJCWlmICgoYmFzZSA8IGxiYXNlKSAmJiAoYmFzZSArIHNpemUgPD0gbGJhc2UpKQorCQkJY29udGludWU7CisJCS8qICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlcmUgaXMgc29tZSBraW5kIG9mIG92ZXJsYXAvZW5jbG9zdXJlICAqLworCQlpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2UgKyBzaXplID4gbGJhc2UgKyBsc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAibXRycjogMHglbHgwMDAsMHglbHgwMDAgb3ZlcmxhcHMgZXhpc3RpbmciCisJCQkgICAgICAgIiAweCVseDAwMCwweCV4MDAwXG4iLCBiYXNlLCBzaXplLCBsYmFzZSwKKwkJCSAgICAgICBsc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiAgTmV3IHJlZ2lvbiBpcyBlbmNsb3NlZCBieSBhbiBleGlzdGluZyByZWdpb24gICovCisJCWlmIChsdHlwZSAhPSB0eXBlKSB7CisJCQlpZiAodHlwZSA9PSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJtdHJyOiB0eXBlIG1pc21hdGNoIGZvciAlbHgwMDAsJWx4MDAwIG9sZDogJXMgbmV3OiAlc1xuIiwKKwkJCSAgICAgYmFzZSwgc2l6ZSwgbXRycl9hdHRyaWJfdG9fc3RyKGx0eXBlKSwKKwkJCSAgICAgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpbmNyZW1lbnQpCisJCQkrK3VzYWdlX3RhYmxlW2ldOworCQllcnJvciA9IGk7CisJCWdvdG8gb3V0OworCX0KKwkvKiAgU2VhcmNoIGZvciBhbiBlbXB0eSBNVFJSICAqLworCWkgPSBtdHJyX2lmLT5nZXRfZnJlZV9yZWdpb24oYmFzZSwgc2l6ZSk7CisJaWYgKGkgPj0gMCkgeworCQlzZXRfbXRycihpLCBiYXNlLCBzaXplLCB0eXBlKTsKKwkJdXNhZ2VfdGFibGVbaV0gPSAxOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBubyBtb3JlIE1UUlJzIGF2YWlsYWJsZVxuIik7CisJZXJyb3IgPSBpOworIG91dDoKKwl1cCgmbWFpbl9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJbXRycl9hZGQgLSBBZGQgYSBtZW1vcnkgdHlwZSByZWdpb24KKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgcmVnaW9uCisgKglAc2l6ZTogUGh5c2ljYWwgc2l6ZSBvZiByZWdpb24KKyAqCUB0eXBlOiBUeXBlIG9mIE1UUlIgZGVzaXJlZAorICoJQGluY3JlbWVudDogSWYgdGhpcyBpcyB0cnVlIGRvIHVzYWdlIGNvdW50aW5nIG9uIHRoZSByZWdpb24KKyAqCisgKglNZW1vcnkgdHlwZSByZWdpb24gcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIGNhY2hpbmcgb24gbmV3ZXIgSW50ZWwgYW5kCisgKglub24gSW50ZWwgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZHJpdmVycyB0byByZXF1ZXN0IGFuCisgKglNVFJSIGlzIGFkZGVkLiBUaGUgZGV0YWlscyBhbmQgaGFyZHdhcmUgc3BlY2lmaWNzIG9mIGVhY2ggcHJvY2Vzc29yJ3MKKyAqCWltcGxlbWVudGF0aW9uIGFyZSBoaWRkZW4gZnJvbSB0aGUgY2FsbGVyLCBidXQgbmV2ZXJ0aGVsZXNzIHRoZSAKKyAqCWNhbGxlciBzaG91bGQgZXhwZWN0IHRvIG5lZWQgdG8gcHJvdmlkZSBhIHBvd2VyIG9mIHR3byBzaXplIG9uIGFuCisgKgllcXVpdmFsZW50IHBvd2VyIG9mIHR3byBib3VuZGFyeS4KKyAqCisgKglJZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBhZGRlZCBlaXRoZXIgYmVjYXVzZSBhbGwgcmVnaW9ucyBhcmUgaW4gdXNlCisgKglvciB0aGUgQ1BVIGNhbm5vdCBzdXBwb3J0IGl0IGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MKKyAqCXRoZSByZWdpc3RlciBudW1iZXIgZm9yIHRoaXMgZW50cnkgaXMgcmV0dXJuZWQsIGJ1dCBzaG91bGQgYmUgdHJlYXRlZAorICoJYXMgYSBjb29raWUgb25seS4KKyAqCisgKglPbiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUgdGhlIGNoYW5nZXMgYXJlIG1hZGUgdG8gYWxsIHByb2Nlc3NvcnMuCisgKglUaGlzIGlzIHJlcXVpcmVkIG9uIHg4NiBieSB0aGUgSW50ZWwgcHJvY2Vzc29ycy4KKyAqCisgKglUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZQorICoKKyAqCSVNVFJSX1RZUEVfVU5DQUNIQUJMRQktCU5vIGNhY2hpbmcKKyAqCisgKgklTVRSUl9UWVBFX1dSQkFDSwktCVdyaXRlIGRhdGEgYmFjayBpbiBidXJzdHMgd2hlbmV2ZXIKKyAqCisgKgklTVRSUl9UWVBFX1dSQ09NQgktCVdyaXRlIGRhdGEgYmFjayBzb29uIGJ1dCBhbGxvdyBidXJzdHMKKyAqCisgKgklTVRSUl9UWVBFX1dSVEhST1VHSAktCUNhY2hlIHJlYWRzIGJ1dCBub3Qgd3JpdGVzCisgKgorICoJQlVHUzogTmVlZHMgYSBxdWlldCBmbGFnIGZvciB0aGUgY2FzZXMgd2hlcmUgZHJpdmVycyBkbyBub3QgbWluZAorICoJZmFpbHVyZXMgYW5kIGRvIG5vdCB3aXNoIHN5c3RlbSBsb2cgbWVzc2FnZXMgdG8gYmUgc2VudC4KKyAqLworCitpbnQKK210cnJfYWRkKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkgY2hhciBpbmNyZW1lbnQpCit7CisJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogc2l6ZSBhbmQgYmFzZSBtdXN0IGJlIG11bHRpcGxlcyBvZiA0IGtpQlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJtdHJyOiBzaXplOiAweCVseCAgYmFzZTogMHglbHhcbiIsIHNpemUsIGJhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG10cnJfYWRkX3BhZ2UoYmFzZSA+PiBQQUdFX1NISUZULCBzaXplID4+IFBBR0VfU0hJRlQsIHR5cGUsCisJCQkgICAgIGluY3JlbWVudCk7Cit9CisKKy8qKgorICoJbXRycl9kZWxfcGFnZSAtIGRlbGV0ZSBhIG1lbW9yeSB0eXBlIHJlZ2lvbgorICoJQHJlZzogUmVnaXN0ZXIgcmV0dXJuZWQgYnkgbXRycl9hZGQKKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MKKyAqCUBzaXplOiBTaXplIG9mIHJlZ2lvbgorICoKKyAqCUlmIHJlZ2lzdGVyIGlzIHN1cHBsaWVkIHRoZW4gYmFzZSBhbmQgc2l6ZSBhcmUgaWdub3JlZC4gVGhpcyBpcworICoJaG93IGRyaXZlcnMgc2hvdWxkIGNhbGwgaXQuCisgKgorICoJUmVsZWFzZXMgYW4gTVRSUiByZWdpb24uIElmIHRoZSB1c2FnZSBjb3VudCBkcm9wcyB0byB6ZXJvIHRoZSAKKyAqCXJlZ2lzdGVyIGlzIGZyZWVkIGFuZCB0aGUgcmVnaW9uIHJldHVybnMgdG8gZGVmYXVsdCBzdGF0ZS4KKyAqCU9uIHN1Y2Nlc3MgdGhlIHJlZ2lzdGVyIGlzIHJldHVybmVkLCBvbiBmYWlsdXJlIGEgbmVnYXRpdmUgZXJyb3IKKyAqCWNvZGUuCisgKi8KKworaW50IG10cnJfZGVsX3BhZ2UoaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGksIG1heDsKKwltdHJyX3R5cGUgbHR5cGU7CisJdW5zaWduZWQgbG9uZyBsYmFzZTsKKwl1bnNpZ25lZCBpbnQgbHNpemU7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmICghbXRycl9pZikKKwkJcmV0dXJuIC1FTlhJTzsKKworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWRvd24oJm1haW5fbG9jayk7CisJaWYgKHJlZyA8IDApIHsKKwkJLyogIFNlYXJjaCBmb3IgZXhpc3RpbmcgTVRSUiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCQlpZiAobGJhc2UgPT0gYmFzZSAmJiBsc2l6ZSA9PSBzaXplKSB7CisJCQkJcmVnID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmVnIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm10cnI6IG5vIE1UUlIgZm9yICVseDAwMCwlbHgwMDAgZm91bmRcbiIsIGJhc2UsCisJCQkgICAgICAgc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAocmVnID49IG1heCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiByZWdpc3RlcjogJWQgdG9vIGJpZ1xuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpc19jcHUoQ1lSSVgpICYmICF1c2VfaW50ZWwoKSkgeworCQlpZiAoKHJlZyA9PSAzKSAmJiBhcnIzX3Byb3RlY3RlZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogQVJSMyBjYW5ub3QgYmUgY2hhbmdlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwltdHJyX2lmLT5nZXQocmVnLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwlpZiAobHNpemUgPCAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IE1UUlIgJWQgbm90IHVzZWRcbiIsIHJlZyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodXNhZ2VfdGFibGVbcmVnXSA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogcmVnOiAlZCBoYXMgY291bnQ9MFxuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgtLXVzYWdlX3RhYmxlW3JlZ10gPCAxKQorCQlzZXRfbXRycihyZWcsIDAsIDAsIDApOworCWVycm9yID0gcmVnOworIG91dDoKKwl1cCgmbWFpbl9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisvKioKKyAqCW10cnJfZGVsIC0gZGVsZXRlIGEgbWVtb3J5IHR5cGUgcmVnaW9uCisgKglAcmVnOiBSZWdpc3RlciByZXR1cm5lZCBieSBtdHJyX2FkZAorICoJQGJhc2U6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcworICoJQHNpemU6IFNpemUgb2YgcmVnaW9uCisgKgorICoJSWYgcmVnaXN0ZXIgaXMgc3VwcGxpZWQgdGhlbiBiYXNlIGFuZCBzaXplIGFyZSBpZ25vcmVkLiBUaGlzIGlzCisgKglob3cgZHJpdmVycyBzaG91bGQgY2FsbCBpdC4KKyAqCisgKglSZWxlYXNlcyBhbiBNVFJSIHJlZ2lvbi4gSWYgdGhlIHVzYWdlIGNvdW50IGRyb3BzIHRvIHplcm8gdGhlIAorICoJcmVnaXN0ZXIgaXMgZnJlZWQgYW5kIHRoZSByZWdpb24gcmV0dXJucyB0byBkZWZhdWx0IHN0YXRlLgorICoJT24gc3VjY2VzcyB0aGUgcmVnaXN0ZXIgaXMgcmV0dXJuZWQsIG9uIGZhaWx1cmUgYSBuZWdhdGl2ZSBlcnJvcgorICoJY29kZS4KKyAqLworCitpbnQKK210cnJfZGVsKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmICgoYmFzZSAmIChQQUdFX1NJWkUgLSAxKSkgfHwgKHNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IHNpemUgYW5kIGJhc2UgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNCBraUJcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAibXRycjogc2l6ZTogMHglbHggIGJhc2U6IDB4JWx4XG4iLCBzaXplLCBiYXNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBtdHJyX2RlbF9wYWdlKHJlZywgYmFzZSA+PiBQQUdFX1NISUZULCBzaXplID4+IFBBR0VfU0hJRlQpOworfQorCitFWFBPUlRfU1lNQk9MKG10cnJfYWRkKTsKK0VYUE9SVF9TWU1CT0wobXRycl9kZWwpOworCisvKiBIQUNLIEFMRVJUIQorICogVGhlc2Ugc2hvdWxkIGJlIGNhbGxlZCBpbXBsaWNpdGx5LCBidXQgd2UgY2FuJ3QgeWV0IHVudGlsIGFsbCB0aGUgaW5pdGNhbGwKKyAqIHN0dWZmIGlzIGRvbmUuLi4KKyAqLworZXh0ZXJuIHZvaWQgYW1kX2luaXRfbXRycih2b2lkKTsKK2V4dGVybiB2b2lkIGN5cml4X2luaXRfbXRycih2b2lkKTsKK2V4dGVybiB2b2lkIGNlbnRhdXJfaW5pdF9tdHJyKHZvaWQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pZnModm9pZCkKK3sKKwlhbWRfaW5pdF9tdHJyKCk7CisJY3lyaXhfaW5pdF9tdHJyKCk7CisJY2VudGF1cl9pbml0X210cnIoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfb3RoZXJfY3B1cyh2b2lkKQoreworCWlmICh1c2VfaW50ZWwoKSkKKwkJZ2V0X210cnJfc3RhdGUoKTsKKworCS8qIGJyaW5nIHVwIHRoZSBvdGhlciBwcm9jZXNzb3JzICovCisJc2V0X210cnIofjBVLDAsMCwwKTsKKworCWlmICh1c2VfaW50ZWwoKSkgeworCQlmaW5hbGl6ZV9tdHJyX3N0YXRlKCk7CisJCW10cnJfc3RhdGVfd2FybigpOworCX0KK30KKworCitzdHJ1Y3QgbXRycl92YWx1ZSB7CisJbXRycl90eXBlCWx0eXBlOworCXVuc2lnbmVkIGxvbmcJbGJhc2U7CisJdW5zaWduZWQgaW50CWxzaXplOworfTsKKworc3RhdGljIHN0cnVjdCBtdHJyX3ZhbHVlICogbXRycl9zdGF0ZTsKKworc3RhdGljIGludCBtdHJyX3NhdmUoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYsIHUzMiBzdGF0ZSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IG51bV92YXJfcmFuZ2VzICogc2l6ZW9mKHN0cnVjdCBtdHJyX3ZhbHVlKTsKKworCW10cnJfc3RhdGUgPSBrbWFsbG9jKHNpemUsR0ZQX0FUT01JQyk7CisJaWYgKG10cnJfc3RhdGUpCisJCW1lbXNldChtdHJyX3N0YXRlLDAsc2l6ZSk7CisJZWxzZQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKSB7CisJCW10cnJfaWYtPmdldChpLAorCQkJICAgICAmbXRycl9zdGF0ZVtpXS5sYmFzZSwKKwkJCSAgICAgJm10cnJfc3RhdGVbaV0ubHNpemUsCisJCQkgICAgICZtdHJyX3N0YXRlW2ldLmx0eXBlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRycl9yZXN0b3JlKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyBpKyspIHsKKwkJaWYgKG10cnJfc3RhdGVbaV0ubHNpemUpIAorCQkJc2V0X210cnIoaSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sYmFzZSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sc2l6ZSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sdHlwZSk7CisJfQorCWtmcmVlKG10cnJfc3RhdGUpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIG10cnJfc3lzZGV2X2RyaXZlciA9IHsKKwkuc3VzcGVuZAk9IG10cnJfc2F2ZSwKKwkucmVzdW1lCQk9IG10cnJfcmVzdG9yZSwKK307CisKKworLyoqCisgKiBtdHJyX2luaXQgLSBpbml0aWFsaXplIG10cnJzIG9uIHRoZSBib290IENQVQorICoKKyAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGVhcmx5OyBiZWZvcmUgYW55IG9mIHRoZSBvdGhlciBDUFVzIGFyZSAKKyAqIGluaXRpYWxpemVkIChpLmUuIGJlZm9yZSBzbXBfaW5pdCgpKS4KKyAqIAorICovCitzdGF0aWMgaW50IF9faW5pdCBtdHJyX2luaXQodm9pZCkKK3sKKwlpbml0X2lmcygpOworCisJaWYgKGNwdV9oYXNfbXRycikgeworCQltdHJyX2lmID0gJmdlbmVyaWNfbXRycl9vcHM7CisJCXNpemVfb3JfbWFzayA9IDB4ZmYwMDAwMDA7CS8qIDM2IGJpdHMgKi8KKwkJc2l6ZV9hbmRfbWFzayA9IDB4MDBmMDAwMDA7CisJCQkKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCS8qIFRoZSBvcmlnaW5hbCBBdGhsb24gZG9jcyBzYWlkIHRoYXQKKwkJCSAgIHRvdGFsIGFkZHJlc3NhYmxlIG1lbW9yeSBpcyA0NCBiaXRzIHdpZGUuCisJCQkgICBJdCB3YXMgbm90IHJlYWxseSBjbGVhciB3aGV0aGVyIGl0cyBNVFJScworCQkJICAgZm9sbG93IHRoaXMgb3Igbm90LiAoUmVhZDogNDQgb3IgMzYgYml0cykuCisJCQkgICBIb3dldmVyLCAieDg2LTY0X292ZXJ2aWV3LnBkZiIgZXhwbGljaXRseQorCQkJICAgc3RhdGVzIHRoYXQgInByZXZpb3VzIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0CisJCQkgICAzNiBiaXQgTVRSUnMiIGFuZCBhbHNvIHByb3ZpZGVzIGEgd2F5IHRvCisJCQkgICBxdWVyeSB0aGUgd2lkdGggKGluIGJpdHMpIG9mIHRoZSBwaHlzaWNhbAorCQkJICAgYWRkcmVzc2FibGUgbWVtb3J5IG9uIHRoZSBIYW1tZXIgZmFtaWx5LgorCQkJICovCisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUKKwkJCSAgICAmJiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDgpKSB7CisJCQkJdTMyIHBoeXNfYWRkcjsKKwkJCQlwaHlzX2FkZHIgPSBjcHVpZF9lYXgoMHg4MDAwMDAwOCkgJiAweGZmOworCQkJCXNpemVfb3JfbWFzayA9CisJCQkJICAgIH4oKDEgPDwgKHBoeXNfYWRkciAtIFBBR0VfU0hJRlQpKSAtIDEpOworCQkJCXNpemVfYW5kX21hc2sgPSB+c2l6ZV9vcl9tYXNrICYgMHhmZmYwMDAwMDsKKwkJCX0KKwkJCS8qIEF0aGxvbiBNVFJScyB1c2UgYW4gSW50ZWwtY29tcGF0aWJsZSBpbnRlcmZhY2UgZm9yIAorCQkJICogZ2V0dGluZyBhbmQgc2V0dGluZyAqLworCQkJYnJlYWs7CisJCWNhc2UgWDg2X1ZFTkRPUl9DRU5UQVVSOgorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDYpIHsKKwkJCQkvKiBWSUEgQ3lyaXggZmFtaWx5IGhhdmUgSW50ZWwgc3R5bGUgTVRSUnMsIGJ1dCBkb24ndCBzdXBwb3J0IFBBRSAqLworCQkJCXNpemVfb3JfbWFzayA9IDB4ZmZmMDAwMDA7CS8qIDMyIGJpdHMgKi8KKwkJCQlzaXplX2FuZF9tYXNrID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWlmIChjcHVfaGFzX2s2X210cnIpIHsKKwkJCQkvKiBQcmUtQXRobG9uIChLNikgQU1EIENQVSBNVFJScyAqLworCQkJCW10cnJfaWYgPSBtdHJyX29wc1tYODZfVkVORE9SX0FNRF07CisJCQkJc2l6ZV9vcl9tYXNrID0gMHhmZmYwMDAwMDsJLyogMzIgYml0cyAqLworCQkJCXNpemVfYW5kX21hc2sgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgWDg2X1ZFTkRPUl9DRU5UQVVSOgorCQkJaWYgKGNwdV9oYXNfY2VudGF1cl9tY3IpIHsKKwkJCQltdHJyX2lmID0gbXRycl9vcHNbWDg2X1ZFTkRPUl9DRU5UQVVSXTsKKwkJCQlzaXplX29yX21hc2sgPSAweGZmZjAwMDAwOwkvKiAzMiBiaXRzICovCisJCQkJc2l6ZV9hbmRfbWFzayA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0NZUklYOgorCQkJaWYgKGNwdV9oYXNfY3lyaXhfYXJyKSB7CisJCQkJbXRycl9pZiA9IG10cnJfb3BzW1g4Nl9WRU5ET1JfQ1lSSVhdOworCQkJCXNpemVfb3JfbWFzayA9IDB4ZmZmMDAwMDA7CS8qIDMyIGJpdHMgKi8KKwkJCQlzaXplX2FuZF9tYXNrID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogdiVzXG4iLE1UUlJfVkVSU0lPTik7CisKKwlpZiAobXRycl9pZikgeworCQlzZXRfbnVtX3Zhcl9yYW5nZXMoKTsKKwkJaW5pdF90YWJsZSgpOworCQlpbml0X290aGVyX2NwdXMoKTsKKworCQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywKKwkJCQkJICAgICAgJm10cnJfc3lzZGV2X2RyaXZlcik7CisJfQorCXJldHVybiAtRU5YSU87Cit9CisKK3N1YnN5c19pbml0Y2FsbChtdHJyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEzNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIGxvY2FsIG10cnIgZGVmaW5lcy4KKyAqLworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBNVFJSY2FwX01TUiAgICAgMHgwZmUKKyNkZWZpbmUgTVRSUmRlZlR5cGVfTVNSIDB4MmZmCisKKyNkZWZpbmUgTVRSUnBoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVRSUnBoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKyNkZWZpbmUgTlVNX0ZJWEVEX1JBTkdFUyA4OAorI2RlZmluZSBNVFJSZml4NjRLXzAwMDAwX01TUiAweDI1MAorI2RlZmluZSBNVFJSZml4MTZLXzgwMDAwX01TUiAweDI1OAorI2RlZmluZSBNVFJSZml4MTZLX0EwMDAwX01TUiAweDI1OQorI2RlZmluZSBNVFJSZml4NEtfQzAwMDBfTVNSIDB4MjY4CisjZGVmaW5lIE1UUlJmaXg0S19DODAwMF9NU1IgMHgyNjkKKyNkZWZpbmUgTVRSUmZpeDRLX0QwMDAwX01TUiAweDI2YQorI2RlZmluZSBNVFJSZml4NEtfRDgwMDBfTVNSIDB4MjZiCisjZGVmaW5lIE1UUlJmaXg0S19FMDAwMF9NU1IgMHgyNmMKKyNkZWZpbmUgTVRSUmZpeDRLX0U4MDAwX01TUiAweDI2ZAorI2RlZmluZSBNVFJSZml4NEtfRjAwMDBfTVNSIDB4MjZlCisjZGVmaW5lIE1UUlJmaXg0S19GODAwMF9NU1IgMHgyNmYKKworI2RlZmluZSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEICAgICAweDAxCisjZGVmaW5lIE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEUgIDB4MDIKKyNkZWZpbmUgTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFICAgMHgwNAorCisvKiBJbiB0aGUgSW50ZWwgcHJvY2Vzc29yJ3MgTVRSUiBpbnRlcmZhY2UsIHRoZSBNVFJSIHR5cGUgaXMgYWx3YXlzIGhlbGQgaW4KKyAgIGFuIDggYml0IGZpZWxkOiAqLwordHlwZWRlZiB1OCBtdHJyX3R5cGU7CisKK3N0cnVjdCBtdHJyX29wcyB7CisJdTMyCXZlbmRvcjsKKwl1MzIJdXNlX2ludGVsX2lmOworLy8Jdm9pZAkoKmluaXQpKHZvaWQpOworCXZvaWQJKCpzZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpOworCXZvaWQJKCpzZXRfYWxsKSh2b2lkKTsKKworCXZvaWQJKCpnZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpOworCWludAkoKmdldF9mcmVlX3JlZ2lvbikgKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworCWludAkoKnZhbGlkYXRlX2FkZF9wYWdlKSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKwlpbnQJKCpoYXZlX3dyY29tYikodm9pZCk7Cit9OworCitleHRlcm4gaW50IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKworZXh0ZXJuIHN0cnVjdCBtdHJyX29wcyBnZW5lcmljX210cnJfb3BzOworCitleHRlcm4gaW50IHBvc2l0aXZlX2hhdmVfd3Jjb21iKHZvaWQpOworCisvKiBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHJvdXRpbmVzICovCitzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRlZnR5cGVfbG87CisJdW5zaWduZWQgbG9uZyBkZWZ0eXBlX2hpOworCXVuc2lnbmVkIGxvbmcgY3I0dmFsOworCXVuc2lnbmVkIGxvbmcgY2NyMzsKK307CisKK3N0cnVjdCBtdHJyX3Zhcl9yYW5nZSB7CisJdW5zaWduZWQgbG9uZyBiYXNlX2xvOworCXVuc2lnbmVkIGxvbmcgYmFzZV9oaTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfbG87CisJdW5zaWduZWQgbG9uZyBtYXNrX2hpOworfTsKKwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KTsKK3ZvaWQgc2V0X210cnJfY2FjaGVfZGlzYWJsZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7Cit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7CisKK3ZvaWQgZ2V0X210cnJfc3RhdGUodm9pZCk7CisKK2V4dGVybiB2b2lkIHNldF9tdHJyX29wcyhzdHJ1Y3QgbXRycl9vcHMgKiBvcHMpOworCitleHRlcm4gdTMyIHNpemVfb3JfbWFzaywgc2l6ZV9hbmRfbWFzazsKK2V4dGVybiBzdHJ1Y3QgbXRycl9vcHMgKiBtdHJyX2lmOworCisjZGVmaW5lIGlzX2NwdSh2bmQpCShtdHJyX2lmICYmIG10cnJfaWYtPnZlbmRvciA9PSBYODZfVkVORE9SXyMjdm5kKQorI2RlZmluZSB1c2VfaW50ZWwoKQkobXRycl9pZiAmJiBtdHJyX2lmLT51c2VfaW50ZWxfaWYgPT0gMSkKKworZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fdmFyX3JhbmdlczsKKwordm9pZCBmaW5hbGl6ZV9tdHJyX3N0YXRlKHZvaWQpOwordm9pZCBtdHJyX3N0YXRlX3dhcm4odm9pZCk7CitjaGFyICptdHJyX2F0dHJpYl90b19zdHIoaW50IHgpOwordm9pZCBtdHJyX3dybXNyKHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyZWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisKKy8qICBQdXQgdGhlIHByb2Nlc3NvciBpbnRvIGEgc3RhdGUgd2hlcmUgTVRSUnMgY2FuIGJlIHNhZmVseSBzZXQgICovCit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCkKK3sKKwl1bnNpZ25lZCBpbnQgY3IwOworCisJLyogIERpc2FibGUgaW50ZXJydXB0cyBsb2NhbGx5ICAqLworCWxvY2FsX2lycV9zYXZlKGN0eHQtPmZsYWdzKTsKKworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KSAgKi8KKwkJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJCWN0eHQtPmNyNHZhbCA9IHJlYWRfY3I0KCk7CisJCQl3cml0ZV9jcjQoY3R4dC0+Y3I0dmFsICYgKHVuc2lnbmVkIGNoYXIpIH4oMSA8PCA3KSk7CisJCX0KKworCQkvKiAgRGlzYWJsZSBhbmQgZmx1c2ggY2FjaGVzLiBOb3RlIHRoYXQgd2JpbnZkIGZsdXNoZXMgdGhlIFRMQnMgYXMKKwkJICAgIGEgc2lkZS1lZmZlY3QgICovCisJCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOworCQl3YmludmQoKTsKKwkJd3JpdGVfY3IwKGNyMCk7CisJCXdiaW52ZCgpOworCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KKwkJCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCWVsc2UKKwkJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCQljdHh0LT5jY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCX0KK30KKwordm9pZCBzZXRfbXRycl9jYWNoZV9kaXNhYmxlKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSkgCisJCS8qICBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgICovCisJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCisJCSAgICAgIGN0eHQtPmRlZnR5cGVfaGkpOworCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkpCisJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY3R4dC0+Y2NyMyAmIDB4MGYpIHwgMHgxMCk7Cit9CisKKy8qICBSZXN0b3JlIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgYSBzZXRfbXRycl9wcmVwYXJlICAqLwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIEZsdXNoIGNhY2hlcyBhbmQgVExCcyAgKi8KKwkJd2JpbnZkKCk7CisKKwkJLyogIFJlc3RvcmUgTVRSUmRlZlR5cGUgICovCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KKwkJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvLCBjdHh0LT5kZWZ0eXBlX2hpKTsKKwkJZWxzZQorCQkJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3YXMgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIGN0eHQtPmNjcjMpOworCQkKKwkJLyogIEVuYWJsZSBjYWNoZXMgICovCisJCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkJLyogIFJlc3RvcmUgdmFsdWUgb2YgQ1I0ICAqLworCQlpZiAoIGNwdV9oYXNfcGdlICkKKwkJCXdyaXRlX2NyNChjdHh0LT5jcjR2YWwpOworCX0KKwkvKiAgUmUtZW5hYmxlIGludGVycnVwdHMgbG9jYWxseSAoaWYgZW5hYmxlZCBwcmV2aW91c2x5KSAgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShjdHh0LT5mbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbmV4Z2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4OThhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qCisgKglEZXRlY3QgYSBOZXhHZW4gQ1BVIHJ1bm5pbmcgd2l0aG91dCBCSU9TIGh5cGVyY29kZSBuZXcgZW5vdWdoCisgKgl0byBoYXZlIENQVUlELiAoVGhhbmtzIHRvIEhlcmJlcnQgT3BwbWFubikKKyAqLworIAorc3RhdGljIGludCBfX2luaXQgZGVlcF9tYWdpY19uZXhnZW5fcHJvYmUodm9pZCkKK3sKKwlpbnQgcmV0OworCQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgltb3Z3CSQweDU1NTUsICUlYXhcbiIKKwkJIgl4b3J3CSUlZHgsJSVkeFxuIgorCQkiCW1vdncJJDIsICUlY3hcbiIKKwkJIglkaXZ3CSUlY3hcbiIKKwkJIgltb3ZsCSQwLCAlJWVheFxuIgorCQkiCWpuegkxZlxuIgorCQkiCW1vdmwJJDEsICUlZWF4XG4iCisJCSIxOlxuIiAKKwkJOiAiPWEiIChyZXQpIDogOiAiY3giLCAiZHgiICk7CisJcmV0dXJuICByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X25leGdlbihzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCWMtPng4Nl9jYWNoZV9zaXplID0gMjU2OyAvKiBBIGZldyBoYWQgMSBNQi4uLiAqLworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbmV4Z2VuX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJLyogRGV0ZWN0IE5leEdlbiB3aXRoIG9sZCBoeXBlcmNvZGUgKi8KKwlpZiAoIGRlZXBfbWFnaWNfbmV4Z2VuX3Byb2JlKCkgKSB7CisJCXN0cmNweShjLT54ODZfdmVuZG9yX2lkLCAiTmV4R2VuRHJpdmVuIik7CisJfQorCWdlbmVyaWNfaWRlbnRpZnkoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuZXhnZW5fY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJOZXhnZW4iLAorCS5jX2lkZW50CT0geyAiTmV4R2VuRHJpdmVuIiB9LAorCS5jX21vZGVscyA9IHsKKwkJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfTkVYR0VOLAorCQkJICAuZmFtaWx5ID0gNSwKKwkJCSAgLm1vZGVsX25hbWVzID0geyBbMV0gPSAiTng1ODYiIH0KKwkJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfbmV4Z2VuLAorCS5jX2lkZW50aWZ5CT0gbmV4Z2VuX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBuZXhnZW5faW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX05FWEdFTl0gPSAmbmV4Z2VuX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChuZXhnZW5faW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisvKgorICoJR2V0IENQVSBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IHRoZSBwcm9jZnMuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwkvKiAKKwkgKiBUaGVzZSBmbGFnIGJpdHMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gPGFzbS9jcHVmZWF0dXJlLmg+LgorCSAqIE5VTEwgbWVhbnMgdGhpcyBiaXQgaXMgdW5kZWZpbmVkIG9yIHJlc2VydmVkOyBlaXRoZXIgd2F5IGl0IGRvZXNuJ3QKKwkgKiBoYXZlIG1lYW5pbmcgYXMgZmFyIGFzIExpbnV4IGlzIGNvbmNlcm5lZC4gIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudAorCSAqIHRvIHJlYWxpemUgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0YWJsZSBhbmQgQ1BVSUQgLS0gaWYKKwkgKiBhcHBsaWNhdGlvbnMgd2FudCB0byBnZXQgdGhlIHJhdyBDUFVJRCBkYXRhLCB0aGV5IHNob3VsZCBhY2Nlc3MKKwkgKiAvZGV2L2NwdS88Y3B1X25yPi9jcHVpZCBpbnN0ZWFkLgorCSAqLworCXN0YXRpYyBjaGFyICp4ODZfY2FwX2ZsYWdzW10gPSB7CisJCS8qIEludGVsLWRlZmluZWQgKi8KKwkgICAgICAgICJmcHUiLCAidm1lIiwgImRlIiwgInBzZSIsICJ0c2MiLCAibXNyIiwgInBhZSIsICJtY2UiLAorCSAgICAgICAgImN4OCIsICJhcGljIiwgTlVMTCwgInNlcCIsICJtdHJyIiwgInBnZSIsICJtY2EiLCAiY21vdiIsCisJICAgICAgICAicGF0IiwgInBzZTM2IiwgInBuIiwgImNsZmx1c2giLCBOVUxMLCAiZHRzIiwgImFjcGkiLCAibW14IiwKKwkgICAgICAgICJmeHNyIiwgInNzZSIsICJzc2UyIiwgInNzIiwgImh0IiwgInRtIiwgImlhNjQiLCAicGJlIiwKKworCQkvKiBBTUQtZGVmaW5lZCAqLworCQkicG5pIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInN5c2NhbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCAibXAiLCAibngiLCBOVUxMLCAibW14ZXh0IiwgTlVMTCwKKwkJTlVMTCwgImZ4c3Jfb3B0IiwgTlVMTCwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKKworCQkvKiBUcmFuc21ldGEtZGVmaW5lZCAqLworCQkicmVjb3ZlcnkiLCAibG9uZ3J1biIsIE5VTEwsICJscnRpIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBPdGhlciAoTGludXgtZGVmaW5lZCkgKi8KKwkJImN4bW14IiwgIms2X210cnIiLCAiY3lyaXhfYXJyIiwgImNlbnRhdXJfbWNyIiwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBJbnRlbC1kZWZpbmVkICgjMikgKi8KKwkJInBuaSIsIE5VTEwsIE5VTEwsICJtb25pdG9yIiwgImRzX2NwbCIsIE5VTEwsIE5VTEwsICJlc3QiLAorCQkidG0yIiwgTlVMTCwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCisJCS8qIFZJQS9DeXJpeC9DZW50YXVyLWRlZmluZWQgKi8KKwkJTlVMTCwgTlVMTCwgInJuZyIsICJybmdfZW4iLCBOVUxMLCBOVUxMLCAiYWNlIiwgImFjZV9lbiIsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisKKwkJLyogQU1ELWRlZmluZWQgKCMyKSAqLworCQkibGFoZl9sbSIsICJjbXBfbGVnYWN5IiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwl9OworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IHY7CisJaW50IGksIG4gPSBjIC0gY3B1X2RhdGE7CisJaW50IGZwdV9leGNlcHRpb247CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKCFjcHVfb25saW5lKG4pKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIgorCQkidmVuZG9yX2lkXHQ6ICVzXG4iCisJCSJjcHUgZmFtaWx5XHQ6ICVkXG4iCisJCSJtb2RlbFx0XHQ6ICVkXG4iCisJCSJtb2RlbCBuYW1lXHQ6ICVzXG4iLAorCQluLAorCQljLT54ODZfdmVuZG9yX2lkWzBdID8gYy0+eDg2X3ZlbmRvcl9pZCA6ICJ1bmtub3duIiwKKwkJYy0+eDg2LAorCQljLT54ODZfbW9kZWwsCisJCWMtPng4Nl9tb2RlbF9pZFswXSA/IGMtPng4Nl9tb2RlbF9pZCA6ICJ1bmtub3duIik7CisKKwlpZiAoYy0+eDg2X21hc2sgfHwgYy0+Y3B1aWRfbGV2ZWwgPj0gMCkKKwkJc2VxX3ByaW50ZihtLCAic3RlcHBpbmdcdDogJWRcbiIsIGMtPng4Nl9tYXNrKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgInN0ZXBwaW5nXHQ6IHVua25vd25cbiIpOworCisJaWYgKCBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RTQykgKSB7CisJCXNlcV9wcmludGYobSwgImNwdSBNSHpcdFx0OiAlbHUuJTAzbHVcbiIsCisJCQljcHVfa2h6IC8gMTAwMCwgKGNwdV9raHogJSAxMDAwKSk7CisJfQorCisJLyogQ2FjaGUgc2l6ZSAqLworCWlmIChjLT54ODZfY2FjaGVfc2l6ZSA+PSAwKQorCQlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCXG4iLCBjLT54ODZfY2FjaGVfc2l6ZSk7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXNlcV9wcmludGYobSwgInBoeXNpY2FsIGlkXHQ6ICVkXG4iLCBwaHlzX3Byb2NfaWRbbl0pOworCXNlcV9wcmludGYobSwgInNpYmxpbmdzXHQ6ICVkXG4iLCBjLT54ODZfbnVtX2NvcmVzICogc21wX251bV9zaWJsaW5ncyk7CisjZW5kaWYKKwkKKwkvKiBXZSB1c2UgZXhjZXB0aW9uIDE2IGlmIHdlIGhhdmUgaGFyZHdhcmUgbWF0aCBhbmQgd2UndmUgZWl0aGVyIHNlZW4gaXQgb3IgdGhlIENQVSBjbGFpbXMgaXQgaXMgaW50ZXJuYWwgKi8KKwlmcHVfZXhjZXB0aW9uID0gYy0+aGFyZF9tYXRoICYmIChpZ25vcmVfZnB1X2lycSB8fCBjcHVfaGFzX2ZwdSk7CisJc2VxX3ByaW50ZihtLCAiZmRpdl9idWdcdDogJXNcbiIKKwkJCSJobHRfYnVnXHRcdDogJXNcbiIKKwkJCSJmMDBmX2J1Z1x0OiAlc1xuIgorCQkJImNvbWFfYnVnXHQ6ICVzXG4iCisJCQkiZnB1XHRcdDogJXNcbiIKKwkJCSJmcHVfZXhjZXB0aW9uXHQ6ICVzXG4iCisJCQkiY3B1aWQgbGV2ZWxcdDogJWRcbiIKKwkJCSJ3cFx0XHQ6ICVzXG4iCisJCQkiZmxhZ3NcdFx0OiIsCisJCSAgICAgYy0+ZmRpdl9idWcgPyAieWVzIiA6ICJubyIsCisJCSAgICAgYy0+aGx0X3dvcmtzX29rID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgIGMtPmYwMGZfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNvbWFfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmhhcmRfbWF0aCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICBmcHVfZXhjZXB0aW9uID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNwdWlkX2xldmVsLAorCQkgICAgIGMtPndwX3dvcmtzX29rID8gInllcyIgOiAibm8iKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IDMyKk5DQVBJTlRTIDsgaSsrICkKKwkJaWYgKCB0ZXN0X2JpdChpLCBjLT54ODZfY2FwYWJpbGl0eSkgJiYKKwkJICAgICB4ODZfY2FwX2ZsYWdzW2ldICE9IE5VTEwgKQorCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgeDg2X2NhcF9mbGFnc1tpXSk7CisKKwlzZXFfcHJpbnRmKG0sICJcbmJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuXG4iLAorCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKKwkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/IGNwdV9kYXRhICsgKnBvcyA6IE5VTEw7Cit9CitzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBjX3N0YXJ0KG0sIHBvcyk7Cit9CitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworfQorc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CisJLnN0YXJ0CT0gY19zdGFydCwKKwkubmV4dAk9IGNfbmV4dCwKKwkuc3RvcAk9IGNfc3RvcCwKKwkuc2hvdwk9IHNob3dfY3B1aW5mbywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMjQyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Jpc2UuYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9yaXNlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlwcmludGsoIkNQVTogUmlzZSBpRHJhZ29uIik7CisJaWYgKGMtPng4Nl9tb2RlbCA+IDIpCisJCXByaW50aygiIElJIik7CisJcHJpbnRrKCJcbiIpOworCisJLyogVW5oaWRlIHBvc3NpYmx5IGhpZGRlbiBjYXBhYmlsaXR5IGZsYWdzCisJICAgVGhlIG1wNiBpRHJhZ29uIGZhbWlseSBkb24ndCBoYXZlIE1TUnMuCisJICAgV2Ugc3dpdGNoIG9uIGV4dHJhIGZlYXR1cmVzIHdpdGggdGhpcyBjcHVpZCB3ZWlyZG5lc3M6ICovCisJX19hc21fXyAoCisJCSJtb3ZsICQweDYzNjM0NTJhLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzEyMDZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDJhMzIzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJtb3ZsICQweDYzNjM0NTIzLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzE1ZjZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDIzMzMzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiIDogOiA6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiCisJKTsKKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgcmlzZV9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIlJpc2UiLAorCS5jX2lkZW50CT0geyAiUmlzZVJpc2VSaXNlIiB9LAorCS5jX21vZGVscyA9IHsKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9SSVNFLCAuZmFtaWx5ID0gNSwgLm1vZGVsX25hbWVzID0gCisJCSAgeyAKKwkJCSAgWzBdID0gImlEcmFnb24iLCAKKwkJCSAgWzJdID0gImlEcmFnb24iLCAKKwkJCSAgWzhdID0gImlEcmFnb24gSUkiLCAKKwkJCSAgWzldID0gImlEcmFnb24gSUkiCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X3Jpc2UsCit9OworCitpbnQgX19pbml0IHJpc2VfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1JJU0VdID0gJnJpc2VfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKHJpc2VfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdlNWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMKQEAgLTAsMCArMSwxMDcgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJjcHUuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfdHJhbnNtZXRhKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgY2FwX21hc2ssIHVrLCBtYXgsIGR1bW15OworCXVuc2lnbmVkIGludCBjbXNfcmV2MSwgY21zX3JldjI7CisJdW5zaWduZWQgaW50IGNwdV9yZXYsIGNwdV9mcmVxLCBjcHVfZmxhZ3MsIG5ld19jcHVfcmV2OworCWNoYXIgY3B1X2luZm9bNjVdOworCisJZ2V0X21vZGVsX25hbWUoYyk7CS8qIFNhbWUgYXMgQU1EL0N5cml4ICovCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisKKwkvKiBQcmludCBDTVMgYW5kIENQVSByZXZpc2lvbiAqLworCW1heCA9IGNwdWlkX2VheCgweDgwODYwMDAwKTsKKwljcHVfcmV2ID0gMDsKKwlpZiAoIG1heCA+PSAweDgwODYwMDAxICkgeworCQljcHVpZCgweDgwODYwMDAxLCAmZHVtbXksICZjcHVfcmV2LCAmY3B1X2ZyZXEsICZjcHVfZmxhZ3MpOyAKKwkJaWYgKGNwdV9yZXYgIT0gMHgwMjAwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBQcm9jZXNzb3IgcmV2aXNpb24gJXUuJXUuJXUuJXUsICV1IE1IelxuIiwKKwkJCQkoY3B1X3JldiA+PiAyNCkgJiAweGZmLAorCQkJCShjcHVfcmV2ID4+IDE2KSAmIDB4ZmYsCisJCQkJKGNwdV9yZXYgPj4gOCkgJiAweGZmLAorCQkJCWNwdV9yZXYgJiAweGZmLAorCQkJCWNwdV9mcmVxKTsKKwkJfQorCX0KKwlpZiAoIG1heCA+PSAweDgwODYwMDAyICkgeworCQljcHVpZCgweDgwODYwMDAyLCAmbmV3X2NwdV9yZXYsICZjbXNfcmV2MSwgJmNtc19yZXYyLCAmZHVtbXkpOworCQlpZiAoY3B1X3JldiA9PSAweDAyMDAwMDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IFByb2Nlc3NvciByZXZpc2lvbiAlMDhYLCAldSBNSHpcbiIsCisJCQkJbmV3X2NwdV9yZXYsIGNwdV9mcmVxKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IENvZGUgTW9ycGhpbmcgU29mdHdhcmUgcmV2aXNpb24gJXUuJXUuJXUtJXUtJXVcbiIsCisJCSAgICAgICAoY21zX3JldjEgPj4gMjQpICYgMHhmZiwKKwkJICAgICAgIChjbXNfcmV2MSA+PiAxNikgJiAweGZmLAorCQkgICAgICAgKGNtc19yZXYxID4+IDgpICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYxICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYyKTsKKwl9CisJaWYgKCBtYXggPj0gMHg4MDg2MDAwNiApIHsKKwkJY3B1aWQoMHg4MDg2MDAwMywKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzRdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s4XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTJdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNCwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTZdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1syMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzI0XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMjhdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMzJdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1szNl0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzQwXSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDRdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNiwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDhdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s1Ml0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzU2XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNjBdKTsKKwkJY3B1X2luZm9bNjRdID0gJ1wwJzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiAlc1xuIiwgY3B1X2luZm8pOworCX0KKworCS8qIFVuaGlkZSBwb3NzaWJseSBoaWRkZW4gY2FwYWJpbGl0eSBmbGFncyAqLworCXJkbXNyKDB4ODA4NjAwMDQsIGNhcF9tYXNrLCB1ayk7CisJd3Jtc3IoMHg4MDg2MDAwNCwgfjAsIHVrKTsKKwljLT54ODZfY2FwYWJpbGl0eVswXSA9IGNwdWlkX2VkeCgweDAwMDAwMDAxKTsKKwl3cm1zcigweDgwODYwMDA0LCBjYXBfbWFzaywgdWspOworCQorCS8qIElmIHdlIGNhbiBydW4gaTY4NiB1c2VyLXNwYWNlIGNvZGUsIGNhbGwgdXMgYW4gaTY4NiAqLworI2RlZmluZSBVU0VSNjg2IChYODZfRkVBVFVSRV9UU0N8WDg2X0ZFQVRVUkVfQ1g4fFg4Nl9GRUFUVVJFX0NNT1YpCisgICAgICAgIGlmICggYy0+eDg2ID09IDUgJiYgKGMtPng4Nl9jYXBhYmlsaXR5WzBdICYgVVNFUjY4NikgPT0gVVNFUjY4NiApCisJCWMtPng4NiA9IDY7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zbWV0YV9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCXUzMiB4bHZsOworCWdlbmVyaWNfaWRlbnRpZnkoYyk7CisKKwkvKiBUcmFuc21ldGEtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDg2MDAwMSAqLworCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDg2MDAwMCk7CisJaWYgKCAoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDAgKSB7CisJCWlmICggIHhsdmwgPj0gMHg4MDg2MDAwMSApCisJCQljLT54ODZfY2FwYWJpbGl0eVsyXSA9IGNwdWlkX2VkeCgweDgwODYwMDAxKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB0cmFuc21ldGFfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJUcmFuc21ldGEiLAorCS5jX2lkZW50CT0geyAiR2VudWluZVRNeDg2IiwgIlRyYW5zbWV0YUNQVSIgfSwKKwkuY19pbml0CQk9IGluaXRfdHJhbnNtZXRhLAorCS5jX2lkZW50aWZ5CT0gdHJhbnNtZXRhX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCB0cmFuc21ldGFfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1RSQU5TTUVUQV0gPSAmdHJhbnNtZXRhX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh0cmFuc21ldGFfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmY2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiY3B1LmgiCisKKy8qIFVNQyBjaGlwcyBhcHBlYXIgdG8gYmUgb25seSBlaXRoZXIgMzg2IG9yIDQ4Niwgc28gbm8gc3BlY2lhbCBpbml0IHRha2VzIHBsYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF91bWMoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgdW1jX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiVU1DIiwKKwkuY19pZGVudCAJPSB7ICJVTUMgVU1DIFVNQyIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfVU1DLCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMV0gPSAiVTVEIiwgCisJCQkgIFsyXSA9ICJVNVMiLCAKKwkJICB9CisJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfdW1jLAorfTsKKworaW50IF9faW5pdCB1bWNfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1VNQ10gPSAmdW1jX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh1bWNfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdWlkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDAwIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UgTUEgMDIxMzksCisgKiAgIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqICAgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNwdWlkLmMKKyAqCisgKiB4ODYgQ1BVSUQgYWNjZXNzIGRldmljZQorICoKKyAqIFRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkIGJ5IGxzZWVrKCkgdG8gdGhlIGFwcHJvcHJpYXRlIENQVUlEIGxldmVsCisgKiBhbmQgdGhlbiByZWFkIGluIGNodW5rcyBvZiAxNiBieXRlcy4gIEEgbGFyZ2VyIHNpemUgbWVhbnMgbXVsdGlwbGUKKyAqIHJlYWRzIG9mIGNvbnNlY3V0aXZlIGxldmVscy4KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIC9kZXYvY3B1LyVkL2NwdWlkIHdoZXJlICVkIGlzIHRoZSBtaW5vciBudW1iZXIsIGFuZCBvbgorICogYW4gU01QIGJveCB3aWxsIGRpcmVjdCB0aGUgYWNjZXNzIHRvIENQVSAlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpjcHVpZF9jbGFzczsKKworI2lmZGVmIENPTkZJR19TTVAKKworc3RydWN0IGNwdWlkX2NvbW1hbmQgeworCWludCBjcHU7CisJdTMyIHJlZzsKKwl1MzIgKmRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBjcHVpZF9zbXBfY3B1aWQodm9pZCAqY21kX2Jsb2NrKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kICpjbWQgPSAoc3RydWN0IGNwdWlkX2NvbW1hbmQgKiljbWRfYmxvY2s7CisKKwlpZiAoY21kLT5jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQljcHVpZChjbWQtPnJlZywgJmNtZC0+ZGF0YVswXSwgJmNtZC0+ZGF0YVsxXSwgJmNtZC0+ZGF0YVsyXSwKKwkJICAgICAgJmNtZC0+ZGF0YVszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kIGNtZDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworCX0gZWxzZSB7CisJCWNtZC5jcHUgPSBjcHU7CisJCWNtZC5yZWcgPSByZWc7CisJCWNtZC5kYXRhID0gZGF0YTsKKworCQlzbXBfY2FsbF9mdW5jdGlvbihjcHVpZF9zbXBfY3B1aWQsICZjbWQsIDEsIDEpOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorI2Vsc2UJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworfQorCisjZW5kaWYJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBsb2ZmX3QgY3B1aWRfc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlyZXQgPSBmaWxlLT5mX3BvczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjcHVpZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJY2hhciBfX3VzZXIgKnRtcCA9IGJ1ZjsKKwl1MzIgZGF0YVs0XTsKKwlzaXplX3QgcnY7CisJdTMyIHJlZyA9ICpwcG9zOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJaWYgKGNvdW50ICUgMTYpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KKworCWZvciAocnYgPSAwOyBjb3VudDsgY291bnQgLT0gMTYpIHsKKwkJZG9fY3B1aWQoY3B1LCByZWcsIGRhdGEpOworCQlpZiAoY29weV90b191c2VyKHRtcCwgJmRhdGEsIDE2KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0bXAgKz0gMTY7CisJCSpwcG9zID0gcmVnKys7CisJfQorCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBjcHVpZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICYoY3B1X2RhdGEpW2NwdV07CisKKwlpZiAoY3B1ID49IE5SX0NQVVMgfHwgIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIC1FTlhJTzsJLyogTm8gc3VjaCBDUFUgKi8KKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPCAwKQorCQlyZXR1cm4gLUVJTzsJLyogQ1BVSUQgbm90IHN1cHBvcnRlZCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcHVpZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBjcHVpZF9zZWVrLAorCS5yZWFkID0gY3B1aWRfcmVhZCwKKwkub3BlbiA9IGNwdWlkX29wZW4sCit9OworCitzdGF0aWMgaW50IGNwdWlkX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGludCBpKSAKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisKKwljbGFzc19lcnIgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGkpLCBOVUxMLCAiY3B1JWQiLGkpOworCWlmIChJU19FUlIoY2xhc3NfZXJyKSkKKwkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gY3B1aWRfY2xhc3NfY3B1X2NhbGxiYWNrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1aWRfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWkgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIsICZjcHVpZF9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWlkOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBjcHVpZFxuIiwKKwkJICAgICAgIENQVUlEX01BSk9SKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJY3B1aWRfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiY3B1aWQiKTsKKwlpZiAoSVNfRVJSKGNwdWlkX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNwdWlkX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJZXJyID0gY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaSk7CisJCWlmIChlcnIgIT0gMCkgCisJCQlnb3RvIG91dF9jbGFzczsKKwl9CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NsYXNzOgorCWkgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDUFVJRF9NQUpPUiwgaSkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjcHVpZF9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KENQVUlEX01BSk9SLCAiY3B1L2NwdWlkIik7CQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVpZF9leGl0KHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGNwdWlkX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIpOworCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChjcHVpZF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWlkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieDg2IGdlbmVyaWMgQ1BVSUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkN2UyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYwpAQCAtMCwwICsxLDQ4NyBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisKK3N0cnVjdCBkbWlfaGVhZGVyCit7CisJdTgJdHlwZTsKKwl1OAlsZW5ndGg7CisJdTE2CWhhbmRsZTsKK307CisKKyN1bmRlZiBETUlfREVCVUcKKworI2lmZGVmIERNSV9ERUJVRworI2RlZmluZSBkbWlfcHJpbnRrKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkbWlfcHJpbnRrKHgpCisjZW5kaWYKKworc3RhdGljIGNoYXIgKiBfX2luaXQgZG1pX3N0cmluZyhzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCit7CisJdTggKmJwPSh1OCAqKWRtOworCWJwKz1kbS0+bGVuZ3RoOworCWlmKCFzKQorCQlyZXR1cm4gIiI7CisJcy0tOworCXdoaWxlKHM+MCAmJiAqYnApCisJeworCQlicCs9c3RybGVuKGJwKTsKKwkJYnArKzsKKwkJcy0tOworCX0KKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKglXZSBoYXZlIHRvIGJlIGNhdXRpb3VzIGhlcmUuIFdlIGhhdmUgc2VlbiBCSU9TZXMgd2l0aCBETUkgcG9pbnRlcnMKKyAqCXBvaW50aW5nIHRvIGNvbXBsZXRlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBleGFtcGxlCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSwgdm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCit7CisJdTggKmJ1ZjsKKwlzdHJ1Y3QgZG1pX2hlYWRlciAqZG07CisJdTggKmRhdGE7CisJaW50IGk9MDsKKwkJCisJYnVmID0gYnRfaW9yZW1hcChiYXNlLCBsZW4pOworCWlmKGJ1Zj09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IGJ1ZjsKKworCS8qCisgCSAqCVN0b3Agd2hlbiB3ZSBzZWUgYWxsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCisgCSAqCU9SIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUgKGFsc28gaGFwcGVucykKKyAJICovCisgCisJd2hpbGUoaTxudW0gJiYgZGF0YS1idWYrc2l6ZW9mKHN0cnVjdCBkbWlfaGVhZGVyKTw9bGVuKQorCXsKKwkJZG09KHN0cnVjdCBkbWlfaGVhZGVyICopZGF0YTsKKwkJLyoKKwkJICogIFdlIHdhbnQgdG8ga25vdyB0aGUgdG90YWwgbGVuZ3RoIChmb3JtYXRlZCBhcmVhIGFuZCBzdHJpbmdzKQorCQkgKiAgYmVmb3JlIGRlY29kaW5nIHRvIG1ha2Ugc3VyZSB3ZSB3b24ndCBydW4gb2ZmIHRoZSB0YWJsZSBpbgorCQkgKiAgZG1pX2RlY29kZSBvciBkbWlfc3RyaW5nCisJCSAqLworCQlkYXRhKz1kbS0+bGVuZ3RoOworCQl3aGlsZShkYXRhLWJ1ZjxsZW4tMSAmJiAoZGF0YVswXSB8fCBkYXRhWzFdKSkKKwkJCWRhdGErKzsKKwkJaWYoZGF0YS1idWY8bGVuLTEpCisJCQlkZWNvZGUoZG0pOworCQlkYXRhKz0yOworCQlpKys7CisJfQorCWJ0X2lvdW5tYXAoYnVmLCBsZW4pOworCXJldHVybiAwOworfQorCisKK2lubGluZSBzdGF0aWMgaW50IF9faW5pdCBkbWlfY2hlY2tzdW0odTggKmJ1ZikKK3sKKwl1OCBzdW09MDsKKwlpbnQgYTsKKwkKKwlmb3IoYT0wOyBhPDE1OyBhKyspCisJCXN1bSs9YnVmW2FdOworCXJldHVybiAoc3VtPT0wKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZG1pX2l0ZXJhdGUodm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCit7CisJdTggYnVmWzE1XTsKKwljaGFyIF9faW9tZW0gKnAsICpxOworCisJLyoKKwkgKiBubyBpb3VubWFwKCkgZm9yIHRoYXQgaW9yZW1hcCgpOyBpdCB3b3VsZCBiZSBhIG5vLW9wLCBidXQgaXQncworCSAqIHNvIGVhcmx5IGluIHNldHVwIHRoYXQgc3Vja2VyIGdldHMgY29uZnVzZWQgaW50byBkb2luZyB3aGF0CisJICogaXQgc2hvdWxkbid0IGlmIHdlIGFjdHVhbGx5IGNhbGwgaXQuCisJICovCisJcCA9IGlvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWZvciAocSA9IHA7IHEgPCBwICsgMHgxMDAwMDsgcSArPSAxNikgeworCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMTUpOworCQlpZihtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCAmJiBkbWlfY2hlY2tzdW0oYnVmKSkKKwkJeworCQkJdTE2IG51bT1idWZbMTNdPDw4fGJ1ZlsxMl07CisJCQl1MTYgbGVuPWJ1Zls3XTw8OHxidWZbNl07CisJCQl1MzIgYmFzZT1idWZbMTFdPDwyNHxidWZbMTBdPDwxNnxidWZbOV08PDh8YnVmWzhdOworCisJCQkvKgorCQkJICogRE1JIHZlcnNpb24gMC4wIG1lYW5zIHRoYXQgdGhlIHJlYWwgdmVyc2lvbiBpcyB0YWtlbiBmcm9tCisJCQkgKiB0aGUgU01CSU9TIHZlcnNpb24sIHdoaWNoIHdlIGRvbid0IGtub3cgYXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJaWYoYnVmWzE0XSE9MCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJETUkgJWQuJWQgcHJlc2VudC5cbiIsCisJCQkJCWJ1ZlsxNF0+PjQsIGJ1ZlsxNF0mMHgwRik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHByZXNlbnQuXG4iKTsKKwkJCWRtaV9wcmludGsoKEtFUk5fSU5GTyAiJWQgc3RydWN0dXJlcyBvY2N1cHlpbmcgJWQgYnl0ZXMuXG4iLAorCQkJCW51bSwgbGVuKSk7CisJCQlkbWlfcHJpbnRrKChLRVJOX0lORk8gIkRNSSB0YWJsZSBhdCAweCUwOFguXG4iLAorCQkJCWJhc2UpKTsKKwkJCWlmKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkZWNvZGUpPT0wKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGNoYXIgKmRtaV9pZGVudFtETUlfU1RSSU5HX01BWF07CisKKy8qCisgKglTYXZlIGEgRE1JIHN0cmluZworICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX3NhdmVfaWRlbnQoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCBpbnQgc2xvdCwgaW50IHN0cmluZykKK3sKKwljaGFyICpkID0gKGNoYXIqKWRtOworCWNoYXIgKnAgPSBkbWlfc3RyaW5nKGRtLCBkW3N0cmluZ10pOworCWlmKHA9PU5VTEwgfHwgKnAgPT0gMCkKKwkJcmV0dXJuOworCWlmIChkbWlfaWRlbnRbc2xvdF0pCisJCXJldHVybjsKKwlkbWlfaWRlbnRbc2xvdF0gPSBhbGxvY19ib290bWVtKHN0cmxlbihwKSsxKTsKKwlpZihkbWlfaWRlbnRbc2xvdF0pCisJCXN0cmNweShkbWlfaWRlbnRbc2xvdF0sIHApOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pZGVudDogb3V0IG9mIG1lbW9yeS5cbiIpOworfQorCisvKgorICogVWdseSBjb21wYXRpYmlsaXR5IGNyYXAuCisgKi8KKyNkZWZpbmUgZG1pX2JsYWNrbGlzdAlkbWlfc3lzdGVtX2lkCisjZGVmaW5lIE5PX01BVENICXsgRE1JX05PTkUsIE5VTEx9CisjZGVmaW5lIE1BVENICQlETUlfTUFUQ0gKKworLyoKKyAqIFRvc2hpYmEga2V5Ym9hcmQgbGlrZXMgdG8gcmVwZWF0IGtleXMgd2hlbiB0aGV5IGFyZSBub3QgcmVwZWF0ZWQuCisgKi8KKworc3RhdGljIF9faW5pdCBpbnQgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9zaGliYSB3aXRoIGJyb2tlbiBrZXlib2FyZCBkZXRlY3RlZC4gSWYgeW91ciBrZXlib2FyZCBzb21ldGltZXMgZ2VuZXJhdGVzIDMga2V5cHJlc3NlcyBpbnN0ZWFkIG9mIG9uZSwgc2VlIGh0dHA6Ly9kYXZ5ZC51Y2MuYXNuLmF1L3Byb2plY3RzL3Rvc2hpYmEvUkVBRE1FXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKK3N0YXRpYyBfX2luaXQgaW50IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMyhzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkKK3sKKwkvKiBTZWUgYWNwaV93YWtldXAuUyAqLworCWV4dGVybiBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7CisJYWNwaV92aWRlb19mbGFncyB8PSAyOworCXJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmZGVmCUNPTkZJR19BQ1BJX0JPT1QKK2V4dGVybiBpbnQgYWNwaV9mb3JjZTsKKworc3RhdGljIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgZG1pX2Rpc2FibGVfYWNwaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7IAorCWlmICghYWNwaV9mb3JjZSkgeyAKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsZC0+aWRlbnQpOyAKKwkJZGlzYWJsZV9hY3BpKCk7CisJfSBlbHNlIHsgCisJCXByaW50ayhLRVJOX05PVElDRSAKKwkJICAgICAgICJXYXJuaW5nOiBETUkgYmxhY2tsaXN0IHNheXMgYnJva2VuLCBidXQgYWNwaSBmb3JjZWRcbiIpOyAKKwl9CisJcmV0dXJuIDA7Cit9IAorCisvKgorICogTGltaXQgQUNQSSB0byBDUFUgZW51bWVyYXRpb24gZm9yIEhUCisgKi8KK3N0YXRpYyBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGZvcmNlX2FjcGlfaHQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoreyAKKwlpZiAoIWFjcGlfZm9yY2UpIHsgCisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPWh0XG4iLCBkLT5pZGVudCk7IAorCQlkaXNhYmxlX2FjcGkoKTsKKwkJYWNwaV9odCA9IDE7IAorCX0gZWxzZSB7IAorCQlwcmludGsoS0VSTl9OT1RJQ0UgCisJCSAgICAgICAiV2FybmluZzogYWNwaT1mb3JjZSBvdmVycnVsZXMgRE1JIGJsYWNrbGlzdDogYWNwaT1odFxuIik7IAorCX0KKwlyZXR1cm4gMDsKK30gCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19BQ1BJX1BDSQorc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX2lycShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7CisJaWYgKCFhY3BpX2ZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPW5vaXJxXG4iLAorCQkgICAgICAgZC0+aWRlbnQpOyAJCisJCWFjcGlfbm9pcnFfc2V0KCk7CisJfQorCXJldHVybiAwOworfQorc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX3BjaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7CisJaWYgKCFhY3BpX2ZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBwY2k9bm9hY3BpXG4iLAorCQkgICAgICAgZC0+aWRlbnQpOyAJCisJCWFjcGlfZGlzYWJsZV9wY2koKTsKKwl9CisJcmV0dXJuIDA7Cit9ICAKKyNlbmRpZgorCisvKgorICoJUHJvY2VzcyB0aGUgRE1JIGJsYWNrbGlzdHMKKyAqLworIAorCisvKgorICoJVGhpcyB3aWxsIGJlIGV4cGFuZGVkIG92ZXIgdGltZSB0byBmb3JjZSB0aGluZ3MgbGlrZSB0aGUgQVBNIAorICoJaW50ZXJydXB0IG1hc2sgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBsYXB0b3AKKyAqLworIAorc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9ibGFja2xpc3QgZG1pX2JsYWNrbGlzdFtdPXsKKworCXsgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBLZXlib2FyZCBnZW5lcmF0ZXMgc3B1cmlvdXMgcmVwZWF0cyAqLworCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENILCBOT19NQVRDSAorCQkJfSB9LAorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJeyByZXNldF92aWRlb21vZGVfYWZ0ZXJfczMsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBSZXNldCB2aWRlbyBtb2RlIGFmdGVyIHJldHVybmluZyBmcm9tIEFDUEkgUzMgc2xlZXAgKi8KKwkJCU1BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCwgTk9fTUFUQ0gKKwkJCX0gfSwKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX0FDUElfQk9PVAorCS8qCisJICogSWYgeW91ciBzeXN0ZW0gaXMgYmxhY2tsaXN0ZWQgaGVyZSwgYnV0IHlvdSBmaW5kIHRoYXQgYWNwaT1mb3JjZQorCSAqIHdvcmtzIGZvciB5b3UsIHBsZWFzZSBjb250YWN0IGFjcGktZGV2ZWxAc291cmNlZm9yZ2UubmV0CisJICovCisKKwkvKgorCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIGRpc2FibGVkCisJICovCisKKwl7IGRtaV9kaXNhYmxlX2FjcGksICJJQk0gVGhpbmtwYWQiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MjlIMUciKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCS8qCisJICoJQm94ZXMgdGhhdCBuZWVkIGFjcGk9aHQgCisJICovCisKKwl7IGZvcmNlX2FjcGlfaHQsICJGU0MgUHJpbWVyZ3kgVDg1MCIsIHsKKwkJCU1BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUFJJTUVSR1kgVDg1MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiREVMTCBHWDI0MCIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIk9wdGlQbGV4IEdYMjQwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJDb21wYXEgV29ya3N0YXRpb24gVzgwMDAiLCB7CisJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAorCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIldvcmtzdGF0aW9uIFc4MDAwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFA0QjI2NiIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFAyQi1EUyIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDJCLURTIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIENVUi1ETFMiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIkNVUi1ETFMiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIkFCSVQgaTQ0MEJYLVc4Mzk3NyIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIDxodHRwOi8vd3d3LmFiaXQuY29tPiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJJQk0gQmxhZGVjZW50ZXIiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIklCTSBlU2VydmVyIEJsYWRlQ2VudGVyIEhTMjAiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIklCTSBlU2VydmVyIHhTZXJpZXMgMzYwIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJlU2VydmVyIHhTZXJpZXMgMzYwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJJQk0gZXNlcnZlciB4U2VyaWVzIDMzMCIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDQ0MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisjZW5kaWYJLy8gQ09ORklHX0FDUElfQk9PVAorCisjaWZkZWYJQ09ORklHX0FDUElfUENJCisJLyoKKwkgKglCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgZGlzYWJsZWQKKwkgKi8KKworCXsgZGlzYWJsZV9hY3BpX2lycSwgIkFTVVMgQTdWIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjxBN1Y+IiksCisJCQkvKiBuZXdlciBCSU9TLCBSZXZpc2lvbiAxMDExLCBkb2VzIHdvcmsgKi8KKwkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAorCQkJTk9fTUFUQ0ggfX0sCisKKwkvKgorCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gZGlzYWJsZWQKKwkgKi8KKwl7IGRpc2FibGVfYWNwaV9wY2ksICJBU1VTIFBSLURMUyIsIHsJLyogX0JCTiAwIGJ1ZyAqLworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQUi1ETFMiKSwKKwkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIFBSLURMUyBBQ1BJIEJJT1MgUmV2aXNpb24gMTAxMCIpLAorCQkJTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKSB9fSwKKworIAl7IGRpc2FibGVfYWNwaV9wY2ksICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsIHsKKyAJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKyAJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzNjAiKSwKKyAJCQlOT19NQVRDSCwgTk9fTUFUQ0gKKyAJCQl9IH0sCisKKyNlbmRpZgorCisJeyBOVUxMLCB9Cit9OworCisvKgorICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUworICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCisgKglvdXQgb2YgaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisjaWZkZWYgRE1JX0RFQlVHCisJdTggKmRhdGEgPSAodTggKilkbTsKKyNlbmRpZgorCQorCXN3aXRjaChkbS0+dHlwZSkKKwl7CisJCWNhc2UgIDA6CisJCQlkbWlfcHJpbnRrKCgiQklPUyBWZW5kb3I6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVORE9SLCA0KTsKKwkJCWRtaV9wcmludGsoKCJCSU9TIFZlcnNpb246ICVzXG4iLCAKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOworCQkJZG1pX3ByaW50aygoIkJJT1MgUmVsZWFzZTogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs4XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19EQVRFLCA4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkbWlfcHJpbnRrKCgiU3lzdGVtIFZlbmRvcjogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfU1lTX1ZFTkRPUiwgNCk7CisJCQlkbWlfcHJpbnRrKCgiUHJvZHVjdCBOYW1lOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX05BTUUsIDUpOworCQkJZG1pX3ByaW50aygoIlZlcnNpb246ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgNik7CisJCQlkbWlfcHJpbnRrKCgiU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs3XSkpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVuZG9yOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzRdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOworCQkJZG1pX3ByaW50aygoIkJvYXJkIE5hbWU6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOworCQkJZG1pX3ByaW50aygoIkJvYXJkIFZlcnNpb246ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX1ZFUlNJT04sIDYpOworCQkJYnJlYWs7CisJfQorfQorCit2b2lkIF9faW5pdCBkbWlfc2Nhbl9tYWNoaW5lKHZvaWQpCit7CisJaW50IGVyciA9IGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpOworCWlmKGVyciA9PSAwKQorIAkJZG1pX2NoZWNrX3N5c3RlbShkbWlfYmxhY2tsaXN0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudC5cbiIpOworfQorCisKKy8qKgorICoJZG1pX2NoZWNrX3N5c3RlbSAtIGNoZWNrIHN5c3RlbSBETUkgZGF0YQorICoJQGxpc3Q6IGFycmF5IG9mIGRtaV9zeXN0ZW1faWQgc3RydWN0dXJlcyB0byBtYXRjaCBhZ2FpbnN0CisgKgorICoJV2FsayB0aGUgYmxhY2tsaXN0IHRhYmxlIHJ1bm5pbmcgbWF0Y2hpbmcgZnVuY3Rpb25zIHVudGlsIHNvbWVvbmUKKyAqCXJldHVybnMgbm9uIHplcm8gb3Igd2UgaGl0IHRoZSBlbmQuIENhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IKKyAqCWVhY2ggc3VjY2Vzc2Z1bGwgbWF0Y2guIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzLgorICovCitpbnQgZG1pX2NoZWNrX3N5c3RlbShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbGlzdCkKK3sKKwlpbnQgaSwgY291bnQgPSAwOworCXN0cnVjdCBkbWlfc3lzdGVtX2lkICpkID0gbGlzdDsKKworCXdoaWxlIChkLT5pZGVudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkLT5tYXRjaGVzKTsgaSsrKSB7CisJCQlpbnQgcyA9IGQtPm1hdGNoZXNbaV0uc2xvdDsKKwkJCWlmIChzID09IERNSV9OT05FKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRtaV9pZGVudFtzXSAmJiBzdHJzdHIoZG1pX2lkZW50W3NdLCBkLT5tYXRjaGVzW2ldLnN1YnN0cikpCisJCQkJY29udGludWU7CisJCQkvKiBObyBtYXRjaCAqLworCQkJZ290byBmYWlsOworCQl9CisJCWlmIChkLT5jYWxsYmFjayAmJiBkLT5jYWxsYmFjayhkKSkKKwkJCWJyZWFrOworCQljb3VudCsrOworZmFpbDoJCWQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG1pX2NoZWNrX3N5c3RlbSk7CisKKy8qKgorICoJZG1pX2dldF9zeXN0ZW1faW5mbyAtIHJldHVybiBETUkgZGF0YSB2YWx1ZQorICoJQGZpZWxkOiBkYXRhIGluZGV4IChzZWUgZW51bSBkbWlfZmlsZWQpCisgKgorICoJUmV0dXJucyBvbmUgRE1JIGRhdGEgdmFsdWUsIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KKyAqCWNvbXBsZXggRE1JIGRhdGEgY2hlY2tzLgorICovCitjaGFyICogZG1pX2dldF9zeXN0ZW1faW5mbyhpbnQgZmllbGQpCit7CisJcmV0dXJuIGRtaV9pZGVudFtmaWVsZF07Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODlhZjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9kb3VibGVmYXVsdC5jCkBAIC0wLDAgKzEsNjUgQEAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNkZWZpbmUgRE9VQkxFRkFVTFRfU1RBQ0tTSVpFICgxMDI0KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZG91YmxlZmF1bHRfc3RhY2tbRE9VQkxFRkFVTFRfU1RBQ0tTSVpFXTsKKyNkZWZpbmUgU1RBQ0tfU1RBUlQgKHVuc2lnbmVkIGxvbmcpKGRvdWJsZWZhdWx0X3N0YWNrK0RPVUJMRUZBVUxUX1NUQUNLU0laRSkKKworI2RlZmluZSBwdHJfb2soeCkgKCh4KSA+IFBBR0VfT0ZGU0VUICYmICh4KSA8IFBBR0VfT0ZGU0VUICsgMHgxMDAwMDAwKQorCitzdGF0aWMgdm9pZCBkb3VibGVmYXVsdF9mbih2b2lkKQoreworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgZ2R0X2Rlc2MgPSB7MCwgMH07CisJdW5zaWduZWQgbG9uZyBnZHQsIHRzczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzZ2R0ICUwIjogIj1tIiAoZ2R0X2Rlc2MpOiA6Im1lbW9yeSIpOworCWdkdCA9IGdkdF9kZXNjLmFkZHJlc3M7CisKKwlwcmludGsoImRvdWJsZSBmYXVsdCwgZ2R0IGF0ICUwOGx4IFslZCBieXRlc11cbiIsIGdkdCwgZ2R0X2Rlc2Muc2l6ZSk7CisKKwlpZiAocHRyX29rKGdkdCkpIHsKKwkJZ2R0ICs9IEdEVF9FTlRSWV9UU1MgPDwgMzsKKwkJdHNzID0gKih1MTYgKikoZ2R0KzIpOworCQl0c3MgKz0gKih1OCAqKShnZHQrNCkgPDwgMTY7CisJCXRzcyArPSAqKHU4ICopKGdkdCs3KSA8PCAyNDsKKwkJcHJpbnRrKCJkb3VibGUgZmF1bHQsIHRzcyBhdCAlMDhseFxuIiwgdHNzKTsKKworCQlpZiAocHRyX29rKHRzcykpIHsKKwkJCXN0cnVjdCB0c3Nfc3RydWN0ICp0ID0gKHN0cnVjdCB0c3Nfc3RydWN0ICopdHNzOworCisJCQlwcmludGsoImVpcCA9ICUwOGx4LCBlc3AgPSAlMDhseFxuIiwgdC0+ZWlwLCB0LT5lc3ApOworCisJCQlwcmludGsoImVheCA9ICUwOGx4LCBlYnggPSAlMDhseCwgZWN4ID0gJTA4bHgsIGVkeCA9ICUwOGx4XG4iLAorCQkJCXQtPmVheCwgdC0+ZWJ4LCB0LT5lY3gsIHQtPmVkeCk7CisJCQlwcmludGsoImVzaSA9ICUwOGx4LCBlZGkgPSAlMDhseFxuIiwKKwkJCQl0LT5lc2ksIHQtPmVkaSk7CisJCX0KKwl9CisKKwlmb3IgKDs7KSAvKiBub3RoaW5nICovOworfQorCitzdHJ1Y3QgdHNzX3N0cnVjdCBkb3VibGVmYXVsdF90c3MgX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKKwkuZXNwMAkJPSBTVEFDS19TVEFSVCwKKwkuc3MwCQk9IF9fS0VSTkVMX0RTLAorCS5sZHQJCT0gMCwKKwkuaW9fYml0bWFwX2Jhc2UJPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVQsCisKKwkuZWlwCQk9ICh1bnNpZ25lZCBsb25nKSBkb3VibGVmYXVsdF9mbiwKKwkuZWZsYWdzCQk9IFg4Nl9FRkxBR1NfU0YgfCAweDIsCS8qIDB4MiBiaXQgaXMgYWx3YXlzIHNldCAqLworCS5lc3AJCT0gU1RBQ0tfU1RBUlQsCisJLmVzCQk9IF9fVVNFUl9EUywKKwkuY3MJCT0gX19LRVJORUxfQ1MsCisJLnNzCQk9IF9fS0VSTkVMX0RTLAorCS5kcwkJPSBfX1VTRVJfRFMsCisKKwkuX19jcjMJCT0gX19wYShzd2FwcGVyX3BnX2RpcikKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2Vhcmx5X3ByaW50ay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY4MTJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMCwwICsxLDIgQEAKKworI2luY2x1ZGUgIi4uLy4uL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VmaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVlMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqIEV4dGVuc2libGUgRmlybXdhcmUgSW50ZXJmYWNlCisgKgorICogQmFzZWQgb24gRXh0ZW5zaWJsZSBGaXJtd2FyZSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBWQSBMaW51eCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV2FsdCBEcnVtbW9uZCA8ZHJ1bW1vbmRAdmFsaW51eC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBIZXdsZXR0LVBhY2thcmQgQ28uCisgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKglTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogQWxsIEVGSSBSdW50aW1lIFNlcnZpY2VzIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0IGFzIEVGSSBvbmx5CisgKiBzdXBwb3J0cyBwaHlzaWNhbCBtb2RlIGFkZHJlc3Npbmcgb24gU29mdFNEVi4gVGhpcyBpcyB0byBiZSBmaXhlZAorICogaW4gYSBmdXR1cmUgdmVyc2lvbi4gIC0tZHJ1bW1vbmQgMTk5OS0wNy0yMAorICoKKyAqIEltcGxlbWVudGVkIEVGSSBydW50aW1lIHNlcnZpY2VzIGFuZCB2aXJ0dWFsIG1vZGUgY2FsbHMuICAtLWRhdmlkbQorICoKKyAqIEdvdXRoYW0gUmFvOiA8Z291dGhhbS5yYW9AaW50ZWwuY29tPgorICoJU2tpcCBub24tV0IgbWVtb3J5IGFuZCBpZ25vcmUgZW1wdHkgbWVtb3J5IHJhbmdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNkZWZpbmUgRUZJX0RFQlVHCTAKKyNkZWZpbmUgUEZYIAkJIkVGSTogIgorCitleHRlcm4gZWZpX3N0YXR1c190IGFzbWxpbmthZ2UgZWZpX2NhbGxfcGh5cyh2b2lkICosIC4uLik7CisKK3N0cnVjdCBlZmkgZWZpOworRVhQT1JUX1NZTUJPTChlZmkpOworc3RhdGljIHN0cnVjdCBlZmkgZWZpX3BoeXMgX19pbml0ZGF0YTsKK3N0cnVjdCBlZmlfbWVtb3J5X21hcCBtZW1tYXAgX19pbml0ZGF0YTsKKworLyoKKyAqIFdlIHJlcXVpcmUgYW4gZWFybHkgYm9vdF9pb3JlbWFwIG1hcHBpbmcgbWVjaGFuaXNtIGluaXRpYWxseQorICovCitleHRlcm4gdm9pZCAqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqIFRvIG1ha2UgRUZJIGNhbGwgRUZJIHJ1bnRpbWUgc2VydmljZSBpbiBwaHlzaWNhbCBhZGRyZXNzaW5nIG1vZGUgd2UgbmVlZAorICogcHJlbG9nL2VwaWxvZyBiZWZvcmUvYWZ0ZXIgdGhlIGludm9jYXRpb24gdG8gZGlzYWJsZSBpbnRlcnJ1cHQsIHRvCisgKiBjbGFpbSBFRkkgcnVudGltZSBzZXJ2aWNlIGhhbmRsZXIgZXhjbHVzaXZlbHkgYW5kIHRvIGR1cGxpY2F0ZSBhIG1lbW9yeSBpbgorICogbG93IG1lbW9yeSBzcGFjZSBzYXkgMCAtIDNHLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVmaV9ydF9lZmxhZ3M7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVmaV9ydF9sb2NrKTsKK3N0YXRpYyBwZ2RfdCBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzJdOworCitzdGF0aWMgdm9pZCBlZmlfY2FsbF9waHlzX3ByZWxvZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3I0OworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCXNwaW5fbG9jaygmZWZpX3J0X2xvY2spOworCWxvY2FsX2lycV9zYXZlKGVmaV9ydF9lZmxhZ3MpOworCisJLyoKKwkgKiBJZiBJIGRvbid0IGhhdmUgUFNFLCBJIHNob3VsZCBqdXN0IGR1cGxpY2F0ZSB0d28gZW50cmllcyBpbiBwYWdlCisJICogZGlyZWN0b3J5LiBJZiBJIGhhdmUgUFNFLCBJIGp1c3QgbmVlZCB0byBkdXBsaWNhdGUgb25lIGVudHJ5IGluCisJICogcGFnZSBkaXJlY3RvcnkuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVjcjQsICUwIjoiPXIiKGNyNCkpOworCisJaWYgKGNyNCAmIFg4Nl9DUjRfUFNFKSB7CisJCWVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkOworCQlzd2FwcGVyX3BnX2RpclswXS5wZ2QgPQorCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KFBBR0VfT0ZGU0VUKV0ucGdkOworCX0gZWxzZSB7CisJCWVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkOworCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzFdLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMHg0MDAwMDApXS5wZ2Q7CisJCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleChQQUdFX09GRlNFVCldLnBnZDsKKwkJdGVtcCA9IFBBR0VfT0ZGU0VUICsgMHg0MDAwMDA7CisJCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgweDQwMDAwMCldLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgodGVtcCldLnBnZDsKKwl9CisKKwkvKgorCSAqIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBpcyByZXN0b3JlZC4KKwkgKi8KKwlsb2NhbF9mbHVzaF90bGIoKTsKKworCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9IF9fcGEoY3B1X2dkdF9kZXNjclswXS5hZGRyZXNzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGdkdCAlMCI6Ij1tIgorCQkJICAgICgqKHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKikgX19wYSgmY3B1X2dkdF9kZXNjclswXSkpKTsKK30KKworc3RhdGljIHZvaWQgZWZpX2NhbGxfcGh5c19lcGlsb2codm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyNDsKKworCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9CisJCSh1bnNpZ25lZCBsb25nKSBfX3ZhKGNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxnZHQgJTAiOiI9bSIoY3B1X2dkdF9kZXNjcikpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlY3I0LCAlMCI6Ij1yIihjcjQpKTsKKworCWlmIChjcjQgJiBYODZfQ1I0X1BTRSkgeworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CisJCSAgICBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZDsKKwl9IGVsc2UgeworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CisJCSAgICBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZDsKKwkJc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDB4NDAwMDAwKV0ucGdkID0KKwkJICAgIGVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMV0ucGdkOworCX0KKworCS8qCisJICogQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGlzIHJlc3RvcmVkLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYigpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZWZpX3J0X2VmbGFncyk7CisJc3Bpbl91bmxvY2soJmVmaV9ydF9sb2NrKTsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorcGh5c19lZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAodW5zaWduZWQgbG9uZyBtZW1vcnlfbWFwX3NpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAorCQkJCSB1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAorCQkJCSBlZmlfbWVtb3J5X2Rlc2NfdCAqdmlydHVhbF9tYXApCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCWVmaV9jYWxsX3BoeXNfcHJlbG9nKCk7CisJc3RhdHVzID0gZWZpX2NhbGxfcGh5cyhlZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwkJCQkgICAgIG1lbW9yeV9tYXBfc2l6ZSwgZGVzY3JpcHRvcl9zaXplLAorCQkJCSAgICAgZGVzY3JpcHRvcl92ZXJzaW9uLCB2aXJ0dWFsX21hcCk7CisJZWZpX2NhbGxfcGh5c19lcGlsb2coKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitwaHlzX2VmaV9nZXRfdGltZShlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwllZmlfY2FsbF9waHlzX3ByZWxvZygpOworCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMoZWZpX3BoeXMuZ2V0X3RpbWUsIHRtLCB0Yyk7CisJZWZpX2NhbGxfcGh5c19lcGlsb2coKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbmxpbmUgaW50IGVmaV9zZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlczsKKwllZmlfc3RhdHVzX3QgCXN0YXR1czsKKwllZmlfdGltZV90IAllZnQ7CisJZWZpX3RpbWVfY2FwX3QgCWNhcDsKKworCXNwaW5fbG9jaygmZWZpX3J0X2xvY2spOworCXN0YXR1cyA9IGVmaS5nZXRfdGltZSgmZWZ0LCAmY2FwKTsKKwlzcGluX3VubG9jaygmZWZpX3J0X2xvY2spOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXBhbmljKCJPb29wcywgZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lIVxuIik7CisJcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwOworCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKKworCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBlZnQubWludXRlKSArIDE1KS8zMCkgJiAxKQorCQlyZWFsX21pbnV0ZXMgKz0gMzA7CisJcmVhbF9taW51dGVzICU9IDYwOworCisJZWZ0Lm1pbnV0ZSA9IHJlYWxfbWludXRlczsKKwllZnQuc2Vjb25kID0gcmVhbF9zZWNvbmRzOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGsoIk9vb3BzOiBlZml0aW1lOiBjYW4ndCByZWFkIHRpbWUhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIGtlcm5lbCBpbml0IGFuZCBiZWZvcmUgcnVudGltZQorICogc2VydmljZXMgaGF2ZSBiZWVuIHJlbWFwcGVkLCB0aGVyZWZvcmUsIHdlJ2xsIG5lZWQgdG8gY2FsbCBpbiBwaHlzaWNhbAorICogbW9kZS4gIE5vdGUsIHRoaXMgY2FsbCBpc24ndCB1c2VkIGxhdGVyLCBzbyBtYXJrIGl0IF9faW5pdC4KKyAqLworaW5saW5lIHVuc2lnbmVkIGxvbmcgX19pbml0IGVmaV9nZXRfdGltZSh2b2lkKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfdCBlZnQ7CisJZWZpX3RpbWVfY2FwX3QgY2FwOworCisJc3RhdHVzID0gcGh5c19lZmlfZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcHJpbnRrKCJPb3BzOiBlZml0aW1lOiBjYW4ndCByZWFkIHRpbWUgc3RhdHVzOiAweCVseFxuIixzdGF0dXMpOworCisJcmV0dXJuIG1rdGltZShlZnQueWVhciwgZWZ0Lm1vbnRoLCBlZnQuZGF5LCBlZnQuaG91ciwKKwkJCWVmdC5taW51dGUsIGVmdC5zZWNvbmQpOworfQorCitpbnQgaXNfYXZhaWxhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqIG1kKQoreworCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dCKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG1kLT50eXBlKSB7CisJCWNhc2UgRUZJX0xPQURFUl9DT0RFOgorCQljYXNlIEVGSV9MT0FERVJfREFUQToKKwkJY2FzZSBFRklfQk9PVF9TRVJWSUNFU19DT0RFOgorCQljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CisJCWNhc2UgRUZJX0NPTlZFTlRJT05BTF9NRU1PUlk6CisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAgYWdhaW4gYWZ0ZXIgcGFnaW5nX2luaXQoKS4KKyAqLwordm9pZCBfX2luaXQgZWZpX21hcF9tZW1tYXAodm9pZCkKK3sKKwltZW1tYXAubWFwID0gTlVMTDsKKworCW1lbW1hcC5tYXAgPSAoZWZpX21lbW9yeV9kZXNjX3QgKikKKwkJYnRfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgbWVtbWFwLnBoeXNfbWFwLAorCQkJKG1lbW1hcC5ucl9tYXAgKiBzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpKSk7CisKKwlpZiAobWVtbWFwLm1hcCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVtYXAgdGhlIEVGSSBtZW1tYXAhXG4iKTsKK30KKworI2lmIEVGSV9ERUJVRworc3RhdGljIHZvaWQgX19pbml0IHByaW50X2VmaV9tZW1tYXAodm9pZCkKK3sKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCW1kID0gJm1lbW1hcC5tYXBbaV07CisJCXByaW50ayhLRVJOX0lORk8gIm1lbSUwMnU6IHR5cGU9JXUsIGF0dHI9MHglbGx4LCAiCisJCQkicmFuZ2U9WzB4JTAxNmxseC0weCUwMTZsbHgpICglbGx1TUIpXG4iLAorCQkJaSwgbWQtPnR5cGUsIG1kLT5hdHRyaWJ1dGUsIG1kLT5waHlzX2FkZHIsCisJCQltZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpLAorCQkJKG1kLT5udW1fcGFnZXMgPj4gKDIwIC0gRUZJX1BBR0VfU0hJRlQpKSk7CisJfQorfQorI2VuZGlmICAvKiAgRUZJX0RFQlVHICAqLworCisvKgorICogV2Fsa3MgdGhlIEVGSSBtZW1vcnkgbWFwIGFuZCBjYWxscyBDQUxMQkFDSyBvbmNlIGZvciBlYWNoIEVGSQorICogbWVtb3J5IGRlc2NyaXB0b3IgdGhhdCBoYXMgbWVtb3J5IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBrZXJuZWwgdXNlLgorICovCit2b2lkIGVmaV9tZW1tYXBfd2FsayhlZmlfZnJlZW1lbV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICphcmcpCit7CisJaW50IHByZXZfdmFsaWQgPSAwOworCXN0cnVjdCByYW5nZSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXVuc2lnbmVkIGxvbmcgZW5kOworCX0gcHJldiwgY3VycjsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCisJCWlmICgobWQtPm51bV9wYWdlcyA9PSAwKSB8fCAoIWlzX2F2YWlsYWJsZV9tZW1vcnkobWQpKSkKKwkJCWNvbnRpbnVlOworCisJCWN1cnIuc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQljdXJyLmVuZCA9IGN1cnIuc3RhcnQgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisKKwkJaWYgKCFwcmV2X3ZhbGlkKSB7CisJCQlwcmV2ID0gY3VycjsKKwkJCXByZXZfdmFsaWQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGN1cnIuc3RhcnQgPCBwcmV2LnN0YXJ0KQorCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbm9yZGVyZWQgbWVtb3J5IG1hcFxuIik7CisJCQlpZiAocHJldi5lbmQgPT0gY3Vyci5zdGFydCkKKwkJCQlwcmV2LmVuZCA9IGN1cnIuZW5kOworCQkJZWxzZSB7CisJCQkJc3RhcnQgPQorCQkJCSAgICAodW5zaWduZWQgbG9uZykgKFBBR0VfQUxJR04ocHJldi5zdGFydCkpOworCQkJCWVuZCA9ICh1bnNpZ25lZCBsb25nKSAocHJldi5lbmQgJiBQQUdFX01BU0spOworCQkJCWlmICgoZW5kID4gc3RhcnQpCisJCQkJICAgICYmICgqY2FsbGJhY2spIChzdGFydCwgZW5kLCBhcmcpIDwgMCkKKwkJCQkJcmV0dXJuOworCQkJCXByZXYgPSBjdXJyOworCQkJfQorCQl9CisJfQorCWlmIChwcmV2X3ZhbGlkKSB7CisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIFBBR0VfQUxJR04ocHJldi5zdGFydCk7CisJCWVuZCA9ICh1bnNpZ25lZCBsb25nKSAocHJldi5lbmQgJiBQQUdFX01BU0spOworCQlpZiAoZW5kID4gc3RhcnQpCisJCQkoKmNhbGxiYWNrKSAoc3RhcnQsIGVuZCwgYXJnKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGVmaV9pbml0KHZvaWQpCit7CisJZWZpX2NvbmZpZ190YWJsZV90ICpjb25maWdfdGFibGVzOworCWVmaV9ydW50aW1lX3NlcnZpY2VzX3QgKnJ1bnRpbWU7CisJZWZpX2NoYXIxNl90ICpjMTY7CisJY2hhciB2ZW5kb3JbMTAwXSA9ICJ1bmtub3duIjsKKwl1bnNpZ25lZCBsb25nIG51bV9jb25maWdfdGFibGVzOworCWludCBpID0gMDsKKworCW1lbXNldCgmZWZpLCAwLCBzaXplb2YoZWZpKSApOworCW1lbXNldCgmZWZpX3BoeXMsIDAsIHNpemVvZihlZmlfcGh5cykpOworCisJZWZpX3BoeXMuc3lzdGFiID0gRUZJX1NZU1RBQjsKKwltZW1tYXAucGh5c19tYXAgPSBFRklfTUVNTUFQOworCW1lbW1hcC5ucl9tYXAgPSBFRklfTUVNTUFQX1NJWkUvRUZJX01FTURFU0NfU0laRTsKKwltZW1tYXAuZGVzY192ZXJzaW9uID0gRUZJX01FTURFU0NfVkVSU0lPTjsKKworCWVmaS5zeXN0YWIgPSAoZWZpX3N5c3RlbV90YWJsZV90ICopCisJCWJvb3RfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgZWZpX3BoeXMuc3lzdGFiLAorCQkJc2l6ZW9mKGVmaV9zeXN0ZW1fdGFibGVfdCkpOworCS8qCisJICogVmVyaWZ5IHRoZSBFRkkgVGFibGUKKwkgKi8KKwlpZiAoZWZpLnN5c3RhYiA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJXb2FoISBDb3VsZG4ndCBtYXAgdGhlIEVGSSBzeXN0ZW0gdGFibGUuXG4iKTsKKwlpZiAoZWZpLnN5c3RhYi0+aGRyLnNpZ25hdHVyZSAhPSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiV29haCEgRUZJIHN5c3RlbSB0YWJsZSBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKKwlpZiAoKGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiBeIEVGSV9TWVNURU1fVEFCTEVfUkVWSVNJT04pID4+IDE2ICE9IDApCisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJXYXJuaW5nOiBFRkkgc3lzdGVtIHRhYmxlIG1ham9yIHZlcnNpb24gbWlzbWF0Y2g6ICIKKwkJICAgICAgICJnb3QgJWQuJTAyZCwgZXhwZWN0ZWQgJWQuJTAyZFxuIiwKKwkJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiA+PiAxNiwKKwkJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiAmIDB4ZmZmZiwKKwkJICAgICAgIEVGSV9TWVNURU1fVEFCTEVfUkVWSVNJT04gPj4gMTYsCisJCSAgICAgICBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OICYgMHhmZmZmKTsKKwkvKgorCSAqIEdyYWIgc29tZSBkZXRhaWxzIGZyb20gdGhlIHN5c3RlbSB0YWJsZQorCSAqLworCW51bV9jb25maWdfdGFibGVzID0gZWZpLnN5c3RhYi0+bnJfdGFibGVzOworCWNvbmZpZ190YWJsZXMgPSAoZWZpX2NvbmZpZ190YWJsZV90ICopZWZpLnN5c3RhYi0+dGFibGVzOworCXJ1bnRpbWUgPSBlZmkuc3lzdGFiLT5ydW50aW1lOworCisJLyoKKwkgKiBTaG93IHdoYXQgd2Uga25vdyBmb3IgcG9zdGVyaXR5CisJICovCisJYzE2ID0gKGVmaV9jaGFyMTZfdCAqKSBib290X2lvcmVtYXAoZWZpLnN5c3RhYi0+ZndfdmVuZG9yLCAyKTsKKwlpZiAoYzE2KSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodmVuZG9yKSAmJiAqYzE2OyArK2kpCisJCQl2ZW5kb3JbaV0gPSAqYzE2Kys7CisJCXZlbmRvcltpXSA9ICdcMCc7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBtYXAgdGhlIGZpcm13YXJlIHZlbmRvciFcbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkVGSSB2JXUuJS4wMnUgYnkgJXMgXG4iLAorCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gPj4gMTYsCisJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiAmIDB4ZmZmZiwgdmVuZG9yKTsKKworCS8qCisJICogTGV0J3Mgc2VlIHdoYXQgY29uZmlnIHRhYmxlcyB0aGUgZmlybXdhcmUgcGFzc2VkIHRvIHVzLgorCSAqLworCWNvbmZpZ190YWJsZXMgPSAoZWZpX2NvbmZpZ190YWJsZV90ICopCisJCQkJYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBjb25maWdfdGFibGVzLAorCQkJICAgICAgICBudW1fY29uZmlnX3RhYmxlcyAqIHNpemVvZihlZmlfY29uZmlnX3RhYmxlX3QpKTsKKworCWlmIChjb25maWdfdGFibGVzID09IE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBtYXAgRUZJIENvbmZpZ3VyYXRpb24gVGFibGUhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnX3RhYmxlczsgaSsrKSB7CisJCWlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIE1QU19UQUJMRV9HVUlEKSA9PSAwKSB7CisJCQllZmkubXBzID0gKHZvaWQgKiljb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIE1QUz0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBBQ1BJXzIwX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5hY3BpMjAgPSBfX3ZhKGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEFDUEkgMi4wPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9IGVsc2UKKwkJICAgIGlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIEFDUElfVEFCTEVfR1VJRCkgPT0gMCkgeworCQkJZWZpLmFjcGkgPSBfX3ZhKGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEFDUEk9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgU01CSU9TX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5zbWJpb3MgPSAodm9pZCAqKSBjb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIFNNQklPUz0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBIQ0RQX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5oY2RwID0gKHZvaWQgKiljb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEhDRFA9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgVUdBX0lPX1BST1RPQ09MX0dVSUQpID09IDApIHsKKwkJCWVmaS51Z2EgPSAodm9pZCAqKWNvbmZpZ190YWJsZXNbaV0udGFibGU7CisJCQlwcmludGsoS0VSTl9JTkZPICIgVUdBPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9CisJfQorCXByaW50aygiXG4iKTsKKworCS8qCisJICogQ2hlY2sgb3V0IHRoZSBydW50aW1lIHNlcnZpY2VzIHRhYmxlLiBXZSBuZWVkIHRvIG1hcAorCSAqIHRoZSBydW50aW1lIHNlcnZpY2VzIHRhYmxlIHNvIHRoYXQgd2UgY2FuIGdyYWIgdGhlIHBoeXNpY2FsCisJICogYWRkcmVzcyBvZiBzZXZlcmFsIG9mIHRoZSBFRkkgcnVudGltZSBmdW5jdGlvbnMsIG5lZWRlZCB0bworCSAqIHNldCB0aGUgZmlybXdhcmUgaW50byB2aXJ0dWFsIG1vZGUuCisJICovCisKKwlydW50aW1lID0gKGVmaV9ydW50aW1lX3NlcnZpY2VzX3QgKikgYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJcnVudGltZSwKKwkJCQkgICAgICAJCXNpemVvZihlZmlfcnVudGltZV9zZXJ2aWNlc190KSk7CisJaWYgKHJ1bnRpbWUgIT0gTlVMTCkgeworCQkvKgorCSAJICogV2Ugd2lsbCBvbmx5IG5lZWQgKmVhcmx5KiBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZworCQkgKiB0d28gRUZJIHJ1bnRpbWUgc2VydmljZXMgYmVmb3JlIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwCisJCSAqIGlzIGludm9rZWQuCisgCSAJICovCisJCWVmaV9waHlzLmdldF90aW1lID0gKGVmaV9nZXRfdGltZV90ICopIHJ1bnRpbWUtPmdldF90aW1lOworCQllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9CisJCQkoZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKikKKwkJCQlydW50aW1lLT5zZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG1hcCB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIVxuIik7CisKKwkvKiBNYXAgdGhlIEVGSSBtZW1vcnkgbWFwIGZvciB1c2UgdW50aWwgcGFnaW5nX2luaXQoKSAqLworCisJbWVtbWFwLm1hcCA9IChlZmlfbWVtb3J5X2Rlc2NfdCAqKQorCQlib290X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIEVGSV9NRU1NQVAsIEVGSV9NRU1NQVBfU0laRSk7CisKKwlpZiAobWVtbWFwLm1hcCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgbWFwIHRoZSBFRkkgbWVtb3J5IG1hcCFcbiIpOworCisJaWYgKEVGSV9NRU1ERVNDX1NJWkUgIT0gc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZyEgS2VybmVsLWRlZmluZWQgbWVtZGVzYyBkb2Vzbid0ICIKKwkJCSAgICJtYXRjaCB0aGUgb25lIGZyb20gRUZJIVxuIik7CisJfQorI2lmIEVGSV9ERUJVRworCXByaW50X2VmaV9tZW1tYXAoKTsKKyNlbmRpZgorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHN3aXRjaCB0aGUgRUZJIHJ1bnRpbWUgc2VydmljZXMgdG8gdmlydHVhbCBtb2RlLgorICogRXNzZW50aWFsbHksIGxvb2sgdGhyb3VnaCB0aGUgRUZJIG1lbW1hcCBhbmQgbWFwIGV2ZXJ5IHJlZ2lvbiB0aGF0CisgKiBoYXMgdGhlIHJ1bnRpbWUgYXR0cmlidXRlIGJpdCBzZXQgaW4gaXRzIG1lbW9yeSBkZXNjcmlwdG9yIGFuZCB1cGRhdGUKKyAqIHRoYXQgbWVtb3J5IGRlc2NyaXB0b3Igd2l0aCB0aGUgdmlydHVhbCBhZGRyZXNzIG9idGFpbmVkIGZyb20gaW9yZW1hcCgpLgorICogVGhpcyBlbmFibGVzIHRoZSBydW50aW1lIHNlcnZpY2VzIHRvIGJlIGNhbGxlZCB3aXRob3V0IGhhdmluZyB0bworICogdGh1bmsgYmFjayBpbnRvIHBoeXNpY2FsIG1vZGUgZm9yIGV2ZXJ5IGludm9jYXRpb24uCisgKi8KKwordm9pZCBfX2luaXQgZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWludCBpOworCisJZWZpLnN5c3RhYiA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCW1kID0gJm1lbW1hcC5tYXBbaV07CisKKwkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpIHsKKwkJCW1kLT52aXJ0X2FkZHIgPQorCQkJCSh1bnNpZ25lZCBsb25nKWlvcmVtYXAobWQtPnBoeXNfYWRkciwKKwkJCQkJbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisJCQlpZiAoISh1bnNpZ25lZCBsb25nKW1kLT52aXJ0X2FkZHIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpb3JlbWFwIG9mIDB4JWxYIGZhaWxlZFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkcik7CisJCQl9CisKKwkJCWlmICgoKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkciA8PQorCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWIpICYmCisJCQkJKCh1bnNpZ25lZCBsb25nKWVmaV9waHlzLnN5c3RhYiA8CisJCQkJCW1kLT5waHlzX2FkZHIgKworCQkJCQkoKHVuc2lnbmVkIGxvbmcpbWQtPm51bV9wYWdlcyA8PAorCQkJCQkJRUZJX1BBR0VfU0hJRlQpKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQkJCWFkZHIgPSBtZC0+dmlydF9hZGRyIC0gbWQtPnBoeXNfYWRkciArCisJCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWI7CisJCQkJZWZpLnN5c3RhYiA9IChlZmlfc3lzdGVtX3RhYmxlX3QgKilhZGRyOworCQkJfQorCQl9CisJfQorCisJaWYgKCFlZmkuc3lzdGFiKQorCQlCVUcoKTsKKworCXN0YXR1cyA9IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAorCQkJc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSAqIG1lbW1hcC5ucl9tYXAsCisJCQlzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpLAorCQkJbWVtbWFwLmRlc2NfdmVyc2lvbiwKKwkJICAgICAgIAltZW1tYXAucGh5c19tYXApOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGsgKEtFUk5fQUxFUlQgIllvdSBhcmUgc2NyZXdlZCEgIgorCQkJIlVuYWJsZSB0byBzd2l0Y2ggRUZJIGludG8gdmlydHVhbCBtb2RlICIKKwkJCSIoc3RhdHVzPSVseClcbiIsIHN0YXR1cyk7CisJCXBhbmljKCJFRkkgY2FsbCB0byBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpIGZhaWxlZCEiKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IEVGSSBpcyBpbiB2aXJ0dWFsIG1vZGUsIHVwZGF0ZSB0aGUgZnVuY3Rpb24KKwkgKiBwb2ludGVycyBpbiB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIHRvIHRoZSBuZXcgdmlydHVhbCBhZGRyZXNzZXMuCisJICovCisKKwllZmkuZ2V0X3RpbWUgPSAoZWZpX2dldF90aW1lX3QgKikgZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X3RpbWU7CisJZWZpLnNldF90aW1lID0gKGVmaV9zZXRfdGltZV90ICopIGVmaS5zeXN0YWItPnJ1bnRpbWUtPnNldF90aW1lOworCWVmaS5nZXRfd2FrZXVwX3RpbWUgPSAoZWZpX2dldF93YWtldXBfdGltZV90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPmdldF93YWtldXBfdGltZTsKKwllZmkuc2V0X3dha2V1cF90aW1lID0gKGVmaV9zZXRfd2FrZXVwX3RpbWVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5zZXRfd2FrZXVwX3RpbWU7CisJZWZpLmdldF92YXJpYWJsZSA9IChlZmlfZ2V0X3ZhcmlhYmxlX3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF92YXJpYWJsZSA9IChlZmlfZ2V0X25leHRfdmFyaWFibGVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5nZXRfbmV4dF92YXJpYWJsZTsKKwllZmkuc2V0X3ZhcmlhYmxlID0gKGVmaV9zZXRfdmFyaWFibGVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5zZXRfdmFyaWFibGU7CisJZWZpLmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCA9IChlZmlfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50X3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X25leHRfaGlnaF9tb25vX2NvdW50OworCWVmaS5yZXNldF9zeXN0ZW0gPSAoZWZpX3Jlc2V0X3N5c3RlbV90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPnJlc2V0X3N5c3RlbTsKK30KKwordm9pZCBfX2luaXQKK2VmaV9pbml0aWFsaXplX2lvbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKmNvZGVfcmVzb3VyY2UsCisJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpkYXRhX3Jlc291cmNlKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKworCQlpZiAoKG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpID4KKwkJICAgIDB4MTAwMDAwMDAwVUxMKQorCQkJY29udGludWU7CisJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJc3dpdGNoIChtZC0+dHlwZSkgeworCQljYXNlIEVGSV9SRVNFUlZFRF9UWVBFOgorCQkJcmVzLT5uYW1lID0gIlJlc2VydmVkIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfTE9BREVSX0NPREU6CisJCQlyZXMtPm5hbWUgPSAiTG9hZGVyIENvZGUiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0xPQURFUl9EQVRBOgorCQkJcmVzLT5uYW1lID0gIkxvYWRlciBEYXRhIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CisJCQlyZXMtPm5hbWUgPSAiQm9vdFNlcnZpY2VzIERhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0JPT1RfU0VSVklDRVNfQ09ERToKKwkJCXJlcy0+bmFtZSA9ICJCb290U2VydmljZXMgQ29kZSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfUlVOVElNRV9TRVJWSUNFU19DT0RFOgorCQkJcmVzLT5uYW1lID0gIlJ1bnRpbWUgU2VydmljZSBDb2RlIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9SVU5USU1FX1NFUlZJQ0VTX0RBVEE6CisJCQlyZXMtPm5hbWUgPSAiUnVudGltZSBTZXJ2aWNlIERhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0NPTlZFTlRJT05BTF9NRU1PUlk6CisJCQlyZXMtPm5hbWUgPSAiQ29udmVudGlvbmFsIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfVU5VU0FCTEVfTUVNT1JZOgorCQkJcmVzLT5uYW1lID0gIlVudXNhYmxlIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfQUNQSV9SRUNMQUlNX01FTU9SWToKKwkJCXJlcy0+bmFtZSA9ICJBQ1BJIFJlY2xhaW0iOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0FDUElfTUVNT1JZX05WUzoKKwkJCXJlcy0+bmFtZSA9ICJBQ1BJIE5WUyI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfTUVNT1JZX01BUFBFRF9JTzoKKwkJCXJlcy0+bmFtZSA9ICJNZW1vcnkgTWFwcGVkIElPIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9NRU1PUllfTUFQUEVEX0lPX1BPUlRfU1BBQ0U6CisJCQlyZXMtPm5hbWUgPSAiTWVtb3J5IE1hcHBlZCBJTyBQb3J0IFNwYWNlIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzLT5uYW1lID0gIlJlc2VydmVkIjsKKwkJCWJyZWFrOworCQl9CisJCXJlcy0+c3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyAoKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMSk7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpIDwgMCkKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byBhbGxvY2F0ZSByZXMgJXMgOiAweCVseC0weCVseFxuIiwKKwkJCQlyZXMtPm5hbWUsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwkJLyoKKwkJICogV2UgZG9uJ3Qga25vdyB3aGljaCByZWdpb24gY29udGFpbnMga2VybmVsIGRhdGEgc28gd2UgdHJ5CisJCSAqIGl0IHJlcGVhdGVkbHkgYW5kIGxldCB0aGUgcmVzb3VyY2UgbWFuYWdlciB0ZXN0IGl0LgorCQkgKi8KKwkJaWYgKG1kLT50eXBlID09IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSB7CisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7CisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgZGF0YV9yZXNvdXJjZSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gb2J0YWluIG1lbW9yeSB0eXBlcyBhbmQgYXR0cmlidXRlcworICovCisKK3UzMiBlZmlfbWVtX3R5cGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCit7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCQlpZiAoKG1kLT5waHlzX2FkZHIgPD0gcGh5c19hZGRyKSAmJiAocGh5c19hZGRyIDwKKwkJCShtZC0+cGh5c19hZGRyICsgKG1kLT4gbnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgKSkKKwkJCXJldHVybiBtZC0+dHlwZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3U2NCBlZmlfbWVtX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCit7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCQlpZiAoKG1kLT5waHlzX2FkZHIgPD0gcGh5c19hZGRyKSAmJiAocGh5c19hZGRyIDwKKwkJCShtZC0+cGh5c19hZGRyICsgKG1kLT4gbnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgKSkKKwkJCXJldHVybiBtZC0+YXR0cmlidXRlOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZWZpX3N0dWIuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpX3N0dWIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMwMzEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmlfc3R1Yi5TCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogRUZJIGNhbGwgc3R1YiBmb3IgSUEzMi4KKyAqCisgKiBUaGlzIHN0dWIgYWxsb3dzIHVzIHRvIG1ha2UgRUZJIGNhbGxzIGluIHBoeXNpY2FsIG1vZGUgd2l0aCBpbnRlcnJ1cHRzCisgKiB0dXJuZWQgb2ZmLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKgorICogZWZpX2NhbGxfcGh5cyh2b2lkICosIC4uLikgaXMgYSBmdW5jdGlvbiB3aXRoIHZhcmlhYmxlIHBhcmFtZXRlcnMuCisgKiBBbGwgdGhlIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBhc3N1cmUgdGhhdCBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIDQtYnl0ZXMuCisgKi8KKworLyoKKyAqIEluIGdjYyBjYWxsaW5nIGNvbnZlbnRpb24sIEVCWCwgRVNQLCBFQlAsIEVTSSBhbmQgRURJIGFyZSBhbGwgY2FsbGVlIHNhdmUuCisgKiBTbyB3ZSdkIGJldHRlciBzYXZlIGFsbCBvZiB0aGVtIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmdW5jdGlvbiBhbmQgcmVzdG9yZQorICogYXQgdGhlIGVuZCBubyBtYXR0ZXIgaG93IG1hbnkgd2UgdXNlLCBiZWNhdXNlIHdlIGNhbiBub3QgYXNzdXJlIEVGSSBydW50aW1lCisgKiBzZXJ2aWNlIGZ1bmN0aW9ucyB3aWxsIGNvbXBseSB3aXRoIGdjYyBjYWxsaW5nIGNvbnZlbnRpb24sIHRvby4KKyAqLworCisudGV4dAorRU5UUlkoZWZpX2NhbGxfcGh5cykKKwkvKgorCSAqIDAuIFRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gTGludXgga2VybmVsLiBTbyBDUyBoYXMgYmVlbgorCSAqIHNldCB0byAweDAwMTAsIERTIGFuZCBTUyBoYXZlIGJlZW4gc2V0IHRvIDB4MDAxOC4gSW4gRUZJLCBJIGZvdW5kCisJICogdGhlIHZhbHVlcyBvZiB0aGVzZSByZWdpc3RlcnMgYXJlIHRoZSBzYW1lLiBBbmQsIHRoZSBjb3JyZXNwb25kaW5nCisJICogR0RUIGVudHJpZXMgYXJlIGlkZW50aWNhbC4gU28gSSB3aWxsIGRvIG5vdGhpbmcgYWJvdXQgc2VnbWVudCByZWcKKwkgKiBhbmQgR0RULCBidXQgY2hhbmdlIEdEVCBiYXNlIHJlZ2lzdGVyIGluIHByZWxvZyBhbmQgZXBpbG9nLgorCSAqLworCisJLyoKKwkgKiAxLiBOb3cgSSBhbSBydW5uaW5nIHdpdGggRUlQID0gPHBoeXNpY2FsIGFkZHJlc3M+ICsgUEFHRV9PRkZTRVQuCisJICogQnV0IHRvIG1ha2UgaXQgc21vb3RobHkgc3dpdGNoIGZyb20gdmlydHVhbCBtb2RlIHRvIGZsYXQgbW9kZS4KKwkgKiBUaGUgbWFwcGluZyBvZiBsb3dlciB2aXJ0dWFsIG1lbW9yeSBoYXMgYmVlbiBjcmVhdGVkIGluIHByZWxvZyBhbmQKKwkgKiBlcGlsb2cuCisJICovCisJbW92bAkkMWYsICVlZHgKKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZWR4CisJam1wCSolZWR4CisxOgorCisJLyoKKwkgKiAyLiBOb3cgb24gdGhlIHRvcCBvZiBzdGFjayBpcyB0aGUgcmV0dXJuCisJICogYWRkcmVzcyBpbiB0aGUgY2FsbGVyIG9mIGVmaV9jYWxsX3BoeXMoKSwgdGhlbiBwYXJhbWV0ZXIgMSwKKwkgKiBwYXJhbWV0ZXIgMiwgLi4uLCBwYXJhbSBuLiBUbyBtYWtlIHRoaW5ncyBlYXN5LCB3ZSBzYXZlIHRoZSByZXR1cm4KKwkgKiBhZGRyZXNzIG9mIGVmaV9jYWxsX3BoeXMgaW4gYSBnbG9iYWwgdmFyaWFibGUuCisJICovCisJcG9wbAklZWR4CisJbW92bAklZWR4LCBzYXZlZF9yZXR1cm5fYWRkcgorCS8qIGdldCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIEVDWCovCisJcG9wbAklZWN4CisJbW92bAklZWN4LCBlZmlfcnRfZnVuY3Rpb25fcHRyCisJbW92bAkkMmYsICVlZHgKKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZWR4CisJcHVzaGwJJWVkeAorCisJLyoKKwkgKiAzLiBDbGVhciBQRyBiaXQgaW4gJUNSMC4KKwkgKi8KKwltb3ZsCSVjcjAsICVlZHgKKwlhbmRsCSQweDdmZmZmZmZmLCAlZWR4CisJbW92bAklZWR4LCAlY3IwCisJam1wCTFmCisxOgorCisJLyoKKwkgKiA0LiBBZGp1c3Qgc3RhY2sgcG9pbnRlci4KKwkgKi8KKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZXNwCisKKwkvKgorCSAqIDUuIENhbGwgdGhlIHBoeXNpY2FsIGZ1bmN0aW9uLgorCSAqLworCWptcAkqJWVjeAorCisyOgorCS8qCisJICogNi4gQWZ0ZXIgRUZJIHJ1bnRpbWUgc2VydmljZSByZXR1cm5zLCBjb250cm9sIHdpbGwgcmV0dXJuIHRvCisJICogZm9sbG93aW5nIGluc3RydWN0aW9uLiBXZSdkIGJldHRlciByZWFkanVzdCBzdGFjayBwb2ludGVyIGZpcnN0LgorCSAqLworCWFkZGwJJF9fUEFHRV9PRkZTRVQsICVlc3AKKworCS8qCisJICogNy4gUmVzdG9yZSBQRyBiaXQKKwkgKi8KKwltb3ZsCSVjcjAsICVlZHgKKwlvcmwJJDB4ODAwMDAwMDAsICVlZHgKKwltb3ZsCSVlZHgsICVjcjAKKwlqbXAJMWYKKzE6CisJLyoKKwkgKiA4LiBOb3cgcmVzdG9yZSB0aGUgdmlydHVhbCBtb2RlIGZyb20gZmxhdCBtb2RlIGJ5CisJICogYWRkaW5nIEVJUCB3aXRoIFBBR0VfT0ZGU0VULgorCSAqLworCW1vdmwJJDFmLCAlZWR4CisJam1wCSolZWR4CisxOgorCisJLyoKKwkgKiA5LiBCYWxhbmNlIHRoZSBzdGFjay4gQW5kIGJlY2F1c2UgRUFYIGNvbnRhaW4gdGhlIHJldHVybiB2YWx1ZSwKKwkgKiB3ZSdkIGJldHRlciBub3QgY2xvYmJlciBpdC4KKwkgKi8KKwlsZWFsCWVmaV9ydF9mdW5jdGlvbl9wdHIsICVlZHgKKwltb3ZsCSglZWR4KSwgJWVjeAorCXB1c2hsCSVlY3gKKworCS8qCisJICogMTAuIFB1c2ggdGhlIHNhdmVkIHJldHVybiBhZGRyZXNzIG9udG8gdGhlIHN0YWNrIGFuZCByZXR1cm4uCisJICovCisJbGVhbAlzYXZlZF9yZXR1cm5fYWRkciwgJWVkeAorCW1vdmwJKCVlZHgpLCAlZWN4CisJcHVzaGwJJWVjeAorCXJldAorLnByZXZpb3VzCisKKy5kYXRhCitzYXZlZF9yZXR1cm5fYWRkcjoKKwkubG9uZyAwCitlZmlfcnRfZnVuY3Rpb25fcHRyOgorCS5sb25nIDAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ1ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCkBAIC0wLDAgKzEsOTUwIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9lbnRyeS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogZW50cnkuUyBjb250YWlucyB0aGUgc3lzdGVtLWNhbGwgYW5kIGZhdWx0IGxvdy1sZXZlbCBoYW5kbGluZyByb3V0aW5lcy4KKyAqIFRoaXMgYWxzbyBjb250YWlucyB0aGUgdGltZXItaW50ZXJydXB0IGhhbmRsZXIsIGFzIHdlbGwgYXMgYWxsIGludGVycnVwdHMKKyAqIGFuZCBmYXVsdHMgdGhhdCBjYW4gcmVzdWx0IGluIGEgdGFzay1zd2l0Y2guCisgKgorICogTk9URTogVGhpcyBjb2RlIGhhbmRsZXMgc2lnbmFsLXJlY29nbml0aW9uLCB3aGljaCBoYXBwZW5zIGV2ZXJ5IHRpbWUKKyAqIGFmdGVyIGEgdGltZXItaW50ZXJydXB0IGFuZCBhZnRlciBlYWNoIHN5c3RlbSBjYWxsLgorICoKKyAqIEkgY2hhbmdlZCBhbGwgdGhlIC5hbGlnbidzIHRvIDQgKDE2IGJ5dGUgYWxpZ25tZW50KSwgYXMgdGhhdCdzIGZhc3RlcgorICogb24gYSA0ODYuCisgKgorICogU3RhY2sgbGF5b3V0IGluICdyZXRfZnJvbV9zeXN0ZW1fY2FsbCc6CisgKiAJcHRyYWNlIG5lZWRzIHRvIGhhdmUgYWxsIHJlZ3Mgb24gdGhlIHN0YWNrLgorICoJaWYgdGhlIG9yZGVyIGhlcmUgaXMgY2hhbmdlZCwgaXQgbmVlZHMgdG8gYmUKKyAqCXVwZGF0ZWQgaW4gZm9yay5jOmNvcHlfcHJvY2Vzcywgc2lnbmFsLmM6ZG9fc2lnbmFsLAorICoJcHRyYWNlLmMgYW5kIHB0cmFjZS5oCisgKgorICoJIDAoJWVzcCkgLSAlZWJ4CisgKgkgNCglZXNwKSAtICVlY3gKKyAqCSA4KCVlc3ApIC0gJWVkeAorICogICAgICAgQyglZXNwKSAtICVlc2kKKyAqCTEwKCVlc3ApIC0gJWVkaQorICoJMTQoJWVzcCkgLSAlZWJwCisgKgkxOCglZXNwKSAtICVlYXgKKyAqCTFDKCVlc3ApIC0gJWRzCisgKgkyMCglZXNwKSAtICVlcworICoJMjQoJWVzcCkgLSBvcmlnX2VheAorICoJMjgoJWVzcCkgLSAlZWlwCisgKgkyQyglZXNwKSAtICVjcworICoJMzAoJWVzcCkgLSAlZWZsYWdzCisgKgkzNCglZXNwKSAtICVvbGRlc3AKKyAqCTM4KCVlc3ApIC0gJW9sZHNzCisgKgorICogImN1cnJlbnQiIGlzIGluIHJlZ2lzdGVyICVlYnggZHVyaW5nIGFueSBzbG93IGVudHJpZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSAiaXJxX3ZlY3RvcnMuaCIKKworI2RlZmluZSBucl9zeXNjYWxscyAoKHN5c2NhbGxfdGFibGVfc2l6ZSkvNCkKKworRUJYCQk9IDB4MDAKK0VDWAkJPSAweDA0CitFRFgJCT0gMHgwOAorRVNJCQk9IDB4MEMKK0VESQkJPSAweDEwCitFQlAJCT0gMHgxNAorRUFYCQk9IDB4MTgKK0RTCQk9IDB4MUMKK0VTCQk9IDB4MjAKK09SSUdfRUFYCT0gMHgyNAorRUlQCQk9IDB4MjgKK0NTCQk9IDB4MkMKK0VGTEFHUwkJPSAweDMwCitPTERFU1AJCT0gMHgzNAorT0xEU1MJCT0gMHgzOAorCitDRl9NQVNLCQk9IDB4MDAwMDAwMDEKK1RGX01BU0sJCT0gMHgwMDAwMDEwMAorSUZfTUFTSwkJPSAweDAwMDAwMjAwCitERl9NQVNLCQk9IDB4MDAwMDA0MDAgCitOVF9NQVNLCQk9IDB4MDAwMDQwMDAKK1ZNX01BU0sJCT0gMHgwMDAyMDAwMAorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNkZWZpbmUgcHJlZW1wdF9zdG9wCQljbGkKKyNlbHNlCisjZGVmaW5lIHByZWVtcHRfc3RvcAorI2RlZmluZSByZXN1bWVfa2VybmVsCQlyZXN0b3JlX25vY2hlY2sKKyNlbmRpZgorCisjZGVmaW5lIFNBVkVfQUxMIFwKKwljbGQ7IFwKKwlwdXNobCAlZXM7IFwKKwlwdXNobCAlZHM7IFwKKwlwdXNobCAlZWF4OyBcCisJcHVzaGwgJWVicDsgXAorCXB1c2hsICVlZGk7IFwKKwlwdXNobCAlZXNpOyBcCisJcHVzaGwgJWVkeDsgXAorCXB1c2hsICVlY3g7IFwKKwlwdXNobCAlZWJ4OyBcCisJbW92bCAkKF9fVVNFUl9EUyksICVlZHg7IFwKKwltb3ZsICVlZHgsICVkczsgXAorCW1vdmwgJWVkeCwgJWVzOworCisjZGVmaW5lIFJFU1RPUkVfSU5UX1JFR1MgXAorCXBvcGwgJWVieDsJXAorCXBvcGwgJWVjeDsJXAorCXBvcGwgJWVkeDsJXAorCXBvcGwgJWVzaTsJXAorCXBvcGwgJWVkaTsJXAorCXBvcGwgJWVicDsJXAorCXBvcGwgJWVheAorCisjZGVmaW5lIFJFU1RPUkVfUkVHUwlcCisJUkVTVE9SRV9JTlRfUkVHUzsgXAorMToJcG9wbCAlZHM7CVwKKzI6CXBvcGwgJWVzOwlcCisuc2VjdGlvbiAuZml4dXAsImF4IjsJXAorMzoJbW92bCAkMCwoJWVzcCk7CVwKKwlqbXAgMWI7CQlcCis0Ogltb3ZsICQwLCglZXNwKTsJXAorCWptcCAyYjsJCVwKKy5wcmV2aW91czsJCVwKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiO1wKKwkuYWxpZ24gNDsJXAorCS5sb25nIDFiLDNiOwlcCisJLmxvbmcgMmIsNGI7CVwKKy5wcmV2aW91cworCisKK0VOVFJZKHJldF9mcm9tX2ZvcmspCisJcHVzaGwgJWVheAorCWNhbGwgc2NoZWR1bGVfdGFpbAorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCXBvcGwgJWVheAorCWptcCBzeXNjYWxsX2V4aXQKKworLyoKKyAqIFJldHVybiB0byB1c2VyIG1vZGUgaXMgbm90IGFzIGNvbXBsZXggYXMgYWxsIHRoaXMgbG9va3MsCisgKiBidXQgd2Ugd2FudCB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHN5c3RlbSBjYWxsIHJldHVybiB0bworICogZ28gYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB3aGljaCBpcyB3aHkgc29tZSBvZiB0aGlzIGlzCisgKiBsZXNzIGNsZWFyIHRoYW4gaXQgb3RoZXJ3aXNlIHNob3VsZCBiZS4KKyAqLworCisJIyB1c2Vyc3BhY2UgcmVzdW1wdGlvbiBzdHViIGJ5cGFzc2luZyBzeXNjYWxsIGV4aXQgdHJhY2luZworCUFMSUdOCityZXRfZnJvbV9leGNlcHRpb246CisJcHJlZW1wdF9zdG9wCityZXRfZnJvbV9pbnRyOgorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCW1vdmwgRUZMQUdTKCVlc3ApLCAlZWF4CQkjIG1peCBFRkxBR1MgYW5kIENTCisJbW92YiBDUyglZXNwKSwgJWFsCisJdGVzdGwgJChWTV9NQVNLIHwgMyksICVlYXgKKwlqeiByZXN1bWVfa2VybmVsCitFTlRSWShyZXN1bWVfdXNlcnNwYWNlKQorIAljbGkJCQkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKKwkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCisJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKKwltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CisJYW5kbCAkX1RJRl9XT1JLX01BU0ssICVlY3gJIyBpcyB0aGVyZSBhbnkgd29yayB0byBiZSBkb25lIG9uCisJCQkJCSMgaW50L2V4Y2VwdGlvbiByZXR1cm4/CisJam5lIHdvcmtfcGVuZGluZworCWptcCByZXN0b3JlX2FsbAorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKK0VOVFJZKHJlc3VtZV9rZXJuZWwpCisJY2xpCisJY21wbCAkMCxUSV9wcmVlbXB0X2NvdW50KCVlYnApCSMgbm9uLXplcm8gcHJlZW1wdF9jb3VudCA/CisJam56IHJlc3RvcmVfbm9jaGVjaworbmVlZF9yZXNjaGVkOgorCW1vdmwgVElfZmxhZ3MoJWVicCksICVlY3gJIyBuZWVkX3Jlc2NoZWQgc2V0ID8KKwl0ZXN0YiAkX1RJRl9ORUVEX1JFU0NIRUQsICVjbAorCWp6IHJlc3RvcmVfYWxsCisJdGVzdGwgJElGX01BU0ssRUZMQUdTKCVlc3ApICAgICAjIGludGVycnVwdHMgb2ZmIChleGNlcHRpb24gcGF0aCkgPworCWp6IHJlc3RvcmVfYWxsCisJY2FsbCBwcmVlbXB0X3NjaGVkdWxlX2lycQorCWptcCBuZWVkX3Jlc2NoZWQKKyNlbmRpZgorCisvKiBTWVNFTlRFUl9SRVRVUk4gcG9pbnRzIHRvIGFmdGVyIHRoZSAic3lzZW50ZXIiIGluc3RydWN0aW9uIGluCisgICB0aGUgdnN5c2NhbGwgcGFnZS4gIFNlZSB2c3lzY2FsbC1zeXNlbnRyeS5TLCB3aGljaCBkZWZpbmVzIHRoZSBzeW1ib2wuICAqLworCisJIyBzeXNlbnRlciBjYWxsIGhhbmRsZXIgc3R1YgorRU5UUlkoc3lzZW50ZXJfZW50cnkpCisJbW92bCBUU1Nfc3lzZW50ZXJfZXNwMCglZXNwKSwlZXNwCitzeXNlbnRlcl9wYXN0X2VzcDoKKwlzdGkKKwlwdXNobCAkKF9fVVNFUl9EUykKKwlwdXNobCAlZWJwCisJcHVzaGZsCisJcHVzaGwgJChfX1VTRVJfQ1MpCisJcHVzaGwgJFNZU0VOVEVSX1JFVFVSTgorCisvKgorICogTG9hZCB0aGUgcG90ZW50aWFsIHNpeHRoIGFyZ3VtZW50IGZyb20gdXNlciBzdGFjay4KKyAqIENhcmVmdWwgYWJvdXQgc2VjdXJpdHkuCisgKi8KKwljbXBsICRfX1BBR0VfT0ZGU0VULTMsJWVicAorCWphZSBzeXNjYWxsX2ZhdWx0CisxOgltb3ZsICglZWJwKSwlZWJwCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiA0CisJLmxvbmcgMWIsc3lzY2FsbF9mYXVsdAorLnByZXZpb3VzCisKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKworCS8qIE5vdGUsIF9USUZfU0VDQ09NUCBpcyBiaXQgbnVtYmVyIDgsIGFuZCBzbyBpdCBuZWVkcyB0ZXN0dyBhbmQgbm90IHRlc3RiICovCisJdGVzdHcgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksVElfZmxhZ3MoJWVicCkKKwlqbnogc3lzY2FsbF90cmFjZV9lbnRyeQorCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKKwlqYWUgc3lzY2FsbF9iYWRzeXMKKwljYWxsICpzeXNfY2FsbF90YWJsZSgsJWVheCw0KQorCW1vdmwgJWVheCxFQVgoJWVzcCkKKwljbGkKKwltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CisJdGVzdHcgJF9USUZfQUxMV09SS19NQVNLLCAlY3gKKwlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKy8qIGlmIHNvbWV0aGluZyBtb2RpZmllcyByZWdpc3RlcnMgaXQgbXVzdCBhbHNvIGRpc2FibGUgc3lzZXhpdCAqLworCW1vdmwgRUlQKCVlc3ApLCAlZWR4CisJbW92bCBPTERFU1AoJWVzcCksICVlY3gKKwl4b3JsICVlYnAsJWVicAorCXN0aQorCXN5c2V4aXQKKworCisJIyBzeXN0ZW0gY2FsbCBoYW5kbGVyIHN0dWIKK0VOVFJZKHN5c3RlbV9jYWxsKQorCXB1c2hsICVlYXgJCQkjIHNhdmUgb3JpZ19lYXgKKwlTQVZFX0FMTAorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCQkJCQkjIHN5c3RlbSBjYWxsIHRyYWNpbmcgaW4gb3BlcmF0aW9uCisJLyogTm90ZSwgX1RJRl9TRUNDT01QIGlzIGJpdCBudW1iZXIgOCwgYW5kIHNvIGl0IG5lZWRzIHRlc3R3IGFuZCBub3QgdGVzdGIgKi8KKwl0ZXN0dyAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TRUNDT01QKSxUSV9mbGFncyglZWJwKQorCWpueiBzeXNjYWxsX3RyYWNlX2VudHJ5CisJY21wbCAkKG5yX3N5c2NhbGxzKSwgJWVheAorCWphZSBzeXNjYWxsX2JhZHN5cworc3lzY2FsbF9jYWxsOgorCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlZWF4LDQpCisJbW92bCAlZWF4LEVBWCglZXNwKQkJIyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlCitzeXNjYWxsX2V4aXQ6CisJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZworCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCXRlc3R3ICRfVElGX0FMTFdPUktfTUFTSywgJWN4CSMgY3VycmVudC0+d29yaworCWpuZSBzeXNjYWxsX2V4aXRfd29yaworCityZXN0b3JlX2FsbDoKKwltb3ZsIEVGTEFHUyglZXNwKSwgJWVheAkJIyBtaXggRUZMQUdTLCBTUyBhbmQgQ1MKKwltb3ZiIE9MRFNTKCVlc3ApLCAlYWgKKwltb3ZiIENTKCVlc3ApLCAlYWwKKwlhbmRsICQoVk1fTUFTSyB8ICg0IDw8IDgpIHwgMyksICVlYXgKKwljbXBsICQoKDQgPDwgOCkgfCAzKSwgJWVheAorCWplIGxkdF9zcwkJCSMgcmV0dXJuaW5nIHRvIHVzZXItc3BhY2Ugd2l0aCBMRFQgU1MKK3Jlc3RvcmVfbm9jaGVjazoKKwlSRVNUT1JFX1JFR1MKKwlhZGRsICQ0LCAlZXNwCisxOglpcmV0Cisuc2VjdGlvbiAuZml4dXAsImF4IgoraXJldF9leGM6CisJc3RpCisJbW92bCAkX19VU0VSX0RTLCAlZWR4CisJbW92bCAlZWR4LCAlZHMKKwltb3ZsICVlZHgsICVlcworCW1vdmwgJDExLCVlYXgKKwljYWxsIGRvX2V4aXQKKy5wcmV2aW91cworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLGlyZXRfZXhjCisucHJldmlvdXMKKworbGR0X3NzOgorCWxhcmwgT0xEU1MoJWVzcCksICVlYXgKKwlqbnogcmVzdG9yZV9ub2NoZWNrCisJdGVzdGwgJDB4MDA0MDAwMDAsICVlYXgJCSMgcmV0dXJuaW5nIHRvIDMyYml0IHN0YWNrPworCWpueiByZXN0b3JlX25vY2hlY2sJCSMgYWxscmlnaHQsIG5vcm1hbCByZXR1cm4KKwkvKiBJZiByZXR1cm5pbmcgdG8gdXNlcnNwYWNlIHdpdGggMTZiaXQgc3RhY2ssCisJICogdHJ5IHRvIGZpeCB0aGUgaGlnaGVyIHdvcmQgb2YgRVNQLCBhcyB0aGUgQ1BVCisJICogd29uJ3QgcmVzdG9yZSBpdC4KKwkgKiBUaGlzIGlzIGFuICJvZmZpY2lhbCIgYnVnIG9mIGFsbCB0aGUgeDg2LWNvbXBhdGlibGUKKwkgKiBDUFVzLCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIHRvIG1ha2UKKwkgKiBkb3NlbXUgYW5kIHdpbmUgaGFwcHkuICovCisJc3VibCAkOCwgJWVzcAkJIyByZXNlcnZlIHNwYWNlIGZvciBzd2l0Y2gxNiBwb2ludGVyCisJY2xpCisJbW92bCAlZXNwLCAlZWF4CisJLyogU2V0IHVwIHRoZSAxNmJpdCBzdGFjayBmcmFtZSB3aXRoIHN3aXRjaDMyIHBvaW50ZXIgb24gdG9wLAorCSAqIGFuZCBhIHN3aXRjaDE2IHBvaW50ZXIgb24gdG9wIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworCWNhbGwgc2V0dXBfeDg2X2JvZ3VzX3N0YWNrCisJUkVTVE9SRV9SRUdTCisJbHNzIDIwKzQoJWVzcCksICVlc3AJIyBzd2l0Y2ggdG8gMTZiaXQgc3RhY2sKKzE6CWlyZXQKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDQKKwkubG9uZyAxYixpcmV0X2V4YworLnByZXZpb3VzCisKKwkjIHBlcmZvcm0gd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW1tZWRpYXRlbHkgYmVmb3JlIHJlc3VtcHRpb24KKwlBTElHTgord29ya19wZW5kaW5nOgorCXRlc3RiICRfVElGX05FRURfUkVTQ0hFRCwgJWNsCisJanogd29ya19ub3RpZnlzaWcKK3dvcmtfcmVzY2hlZDoKKwljYWxsIHNjaGVkdWxlCisJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZworCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCWFuZGwgJF9USUZfV09SS19NQVNLLCAlZWN4CSMgaXMgdGhlcmUgYW55IHdvcmsgdG8gYmUgZG9uZSBvdGhlcgorCQkJCQkjIHRoYW4gc3lzY2FsbCB0cmFjaW5nPworCWp6IHJlc3RvcmVfYWxsCisJdGVzdGIgJF9USUZfTkVFRF9SRVNDSEVELCAlY2wKKwlqbnogd29ya19yZXNjaGVkCisKK3dvcmtfbm90aWZ5c2lnOgkJCQkjIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbHMgYW5kCisJCQkJCSMgbm90aWZ5LXJlc3VtZSByZXF1ZXN0cworCXRlc3RsICRWTV9NQVNLLCBFRkxBR1MoJWVzcCkKKwltb3ZsICVlc3AsICVlYXgKKwlqbmUgd29ya19ub3RpZnlzaWdfdjg2CQkjIHJldHVybmluZyB0byBrZXJuZWwtc3BhY2Ugb3IKKwkJCQkJIyB2bTg2LXNwYWNlCisJeG9ybCAlZWR4LCAlZWR4CisJY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJam1wIHJlc3RvcmVfYWxsCisKKwlBTElHTgord29ya19ub3RpZnlzaWdfdjg2OgorCXB1c2hsICVlY3gJCQkjIHNhdmUgdGlfZmxhZ3MgZm9yIGRvX25vdGlmeV9yZXN1bWUKKwljYWxsIHNhdmVfdjg2X3N0YXRlCQkjICVlYXggY29udGFpbnMgcHRfcmVncyBwb2ludGVyCisJcG9wbCAlZWN4CisJbW92bCAlZWF4LCAlZXNwCisJeG9ybCAlZWR4LCAlZWR4CisJY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJam1wIHJlc3RvcmVfYWxsCisKKwkjIHBlcmZvcm0gc3lzY2FsbCBleGl0IHRyYWNpbmcKKwlBTElHTgorc3lzY2FsbF90cmFjZV9lbnRyeToKKwltb3ZsICQtRU5PU1lTLEVBWCglZXNwKQorCW1vdmwgJWVzcCwgJWVheAorCXhvcmwgJWVkeCwlZWR4CisJY2FsbCBkb19zeXNjYWxsX3RyYWNlCisJbW92bCBPUklHX0VBWCglZXNwKSwgJWVheAorCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKKwlqbmFlIHN5c2NhbGxfY2FsbAorCWptcCBzeXNjYWxsX2V4aXQKKworCSMgcGVyZm9ybSBzeXNjYWxsIGV4aXQgdHJhY2luZworCUFMSUdOCitzeXNjYWxsX2V4aXRfd29yazoKKwl0ZXN0YiAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSU5HTEVTVEVQKSwgJWNsCisJanogd29ya19wZW5kaW5nCisJc3RpCQkJCSMgY291bGQgbGV0IGRvX3N5c2NhbGxfdHJhY2UoKSBjYWxsCisJCQkJCSMgc2NoZWR1bGUoKSBpbnN0ZWFkCisJbW92bCAlZXNwLCAlZWF4CisJbW92bCAkMSwgJWVkeAorCWNhbGwgZG9fc3lzY2FsbF90cmFjZQorCWptcCByZXN1bWVfdXNlcnNwYWNlCisKKwlBTElHTgorc3lzY2FsbF9mYXVsdDoKKwlwdXNobCAlZWF4CQkJIyBzYXZlIG9yaWdfZWF4CisJU0FWRV9BTEwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKwltb3ZsICQtRUZBVUxULEVBWCglZXNwKQorCWptcCByZXN1bWVfdXNlcnNwYWNlCisKKwlBTElHTgorc3lzY2FsbF9iYWRzeXM6CisJbW92bCAkLUVOT1NZUyxFQVgoJWVzcCkKKwlqbXAgcmVzdW1lX3VzZXJzcGFjZQorCisjZGVmaW5lIEZJWFVQX0VTUEZJWF9TVEFDSyBcCisJbW92bCAlZXNwLCAlZWF4OyBcCisJLyogc3dpdGNoIHRvIDMyYml0IHN0YWNrIHVzaW5nIHRoZSBwb2ludGVyIG9uIHRvcCBvZiAxNmJpdCBzdGFjayAqLyBcCisJbHNzICVzczpDUFVfMTZCSVRfU1RBQ0tfU0laRS04LCAlZXNwOyBcCisJLyogY29weSBkYXRhIGZyb20gMTZiaXQgc3RhY2sgdG8gMzJiaXQgc3RhY2sgKi8gXAorCWNhbGwgZml4dXBfeDg2X2JvZ3VzX3N0YWNrOyBcCisJLyogcHV0IEVTUCB0byB0aGUgcHJvcGVyIGxvY2F0aW9uICovIFwKKwltb3ZsICVlYXgsICVlc3A7CisjZGVmaW5lIFVOV0lORF9FU1BGSVhfU1RBQ0sgXAorCXB1c2hsICVlYXg7IFwKKwltb3ZsICVzcywgJWVheDsgXAorCS8qIHNlZSBpZiBvbiAxNmJpdCBzdGFjayAqLyBcCisJY21wdyAkX19FU1BGSVhfU1MsICVheDsgXAorCWpuZSAyOGY7IFwKKwltb3ZsICRfX0tFUk5FTF9EUywgJWVkeDsgXAorCW1vdmwgJWVkeCwgJWRzOyBcCisJbW92bCAlZWR4LCAlZXM7IFwKKwkvKiBzd2l0Y2ggdG8gMzJiaXQgc3RhY2sgKi8gXAorCUZJWFVQX0VTUEZJWF9TVEFDSyBcCisyODoJcG9wbCAlZWF4OworCisvKgorICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIGFuZCBwb2ludGVyIHRhYmxlIHdpdGgKKyAqIHNvbWUgYXNzZW1ibGVyIG1hZ2ljLgorICovCisuZGF0YQorRU5UUlkoaW50ZXJydXB0KQorLnRleHQKKwordmVjdG9yPTAKK0VOVFJZKGlycV9lbnRyaWVzX3N0YXJ0KQorLnJlcHQgTlJfSVJRUworCUFMSUdOCisxOglwdXNobCAkdmVjdG9yLTI1NgorCWptcCBjb21tb25faW50ZXJydXB0CisuZGF0YQorCS5sb25nIDFiCisudGV4dAordmVjdG9yPXZlY3RvcisxCisuZW5kcgorCisJQUxJR04KK2NvbW1vbl9pbnRlcnJ1cHQ6CisJU0FWRV9BTEwKKwltb3ZsICVlc3AsJWVheAorCWNhbGwgZG9fSVJRCisJam1wIHJldF9mcm9tX2ludHIKKworI2RlZmluZSBCVUlMRF9JTlRFUlJVUFQobmFtZSwgbnIpCVwKK0VOVFJZKG5hbWUpCQkJCVwKKwlwdXNobCAkbnItMjU2OwkJCVwKKwlTQVZFX0FMTAkJCVwKKwltb3ZsICVlc3AsJWVheDsJCQlcCisJY2FsbCBzbXBfLyoqL25hbWU7CQlcCisJam1wIHJldF9mcm9tX2ludHI7CisKKy8qIFRoZSBpbmNsdWRlIGlzIHdoZXJlIGFsbCBvZiB0aGUgU01QIGV0Yy4gaW50ZXJydXB0cyBjb21lIGZyb20gKi8KKyNpbmNsdWRlICJlbnRyeV9hcmNoLmgiCisKK0VOVFJZKGRpdmlkZV9lcnJvcikKKwlwdXNobCAkMAkJCSMgbm8gZXJyb3IgY29kZQorCXB1c2hsICRkb19kaXZpZGVfZXJyb3IKKwlBTElHTgorZXJyb3JfY29kZToKKwlwdXNobCAlZHMKKwlwdXNobCAlZWF4CisJeG9ybCAlZWF4LCAlZWF4CisJcHVzaGwgJWVicAorCXB1c2hsICVlZGkKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVkeAorCWRlY2wgJWVheAkJCSMgZWF4ID0gLTEKKwlwdXNobCAlZWN4CisJcHVzaGwgJWVieAorCWNsZAorCXB1c2hsICVlcworCVVOV0lORF9FU1BGSVhfU1RBQ0sKKwlwb3BsICVlY3gKKwltb3ZsIEVTKCVlc3ApLCAlZWRpCQkjIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcworCW1vdmwgT1JJR19FQVgoJWVzcCksICVlZHgJIyBnZXQgdGhlIGVycm9yIGNvZGUKKwltb3ZsICVlYXgsIE9SSUdfRUFYKCVlc3ApCisJbW92bCAlZWN4LCBFUyglZXNwKQorCW1vdmwgJChfX1VTRVJfRFMpLCAlZWN4CisJbW92bCAlZWN4LCAlZHMKKwltb3ZsICVlY3gsICVlcworCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIColZWRpCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCitFTlRSWShjb3Byb2Nlc3Nvcl9lcnJvcikKKwlwdXNobCAkMAorCXB1c2hsICRkb19jb3Byb2Nlc3Nvcl9lcnJvcgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHNpbWRfY29wcm9jZXNzb3JfZXJyb3IpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGRldmljZV9ub3RfYXZhaWxhYmxlKQorCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAorCVNBVkVfQUxMCisJbW92bCAlY3IwLCAlZWF4CisJdGVzdGwgJDB4NCwgJWVheAkJIyBFTSAobWF0aCBlbXVsYXRpb24gYml0KQorCWpuZSBkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlCisJcHJlZW1wdF9zdG9wCisJY2FsbCBtYXRoX3N0YXRlX3Jlc3RvcmUKKwlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCitkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlOgorCXB1c2hsICQwCQkJIyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgT1JJR19FSVAKKwljYWxsIG1hdGhfZW11bGF0ZQorCWFkZGwgJDQsICVlc3AKKwlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisKKy8qCisgKiBEZWJ1ZyB0cmFwcyBhbmQgTk1JIGNhbiBoYXBwZW4gYXQgdGhlIG9uZSBTWVNFTlRFUiBpbnN0cnVjdGlvbgorICogdGhhdCBzZXRzIHVwIHRoZSByZWFsIGtlcm5lbCBzdGFjay4gQ2hlY2sgaGVyZSwgc2luY2Ugd2UgY2FuJ3QKKyAqIGFsbG93IHRoZSB3cm9uZyBzdGFjayB0byBiZSB1c2VkLgorICoKKyAqICJUU1Nfc3lzZW50ZXJfZXNwMCsxMiIgaXMgYmVjYXVzZSB0aGUgTk1JL2RlYnVnIGhhbmRsZXIgd2lsbCBoYXZlCisgKiBhbHJlYWR5IHB1c2hlZCAzIHdvcmRzIGlmIGl0IGhpdHMgb24gdGhlIHN5c2VudGVyIGluc3RydWN0aW9uOgorICogZWZsYWdzLCBjcyBhbmQgZWlwLgorICoKKyAqIFdlIGp1c3QgbG9hZCB0aGUgcmlnaHQgc3RhY2ssIGFuZCBwdXNoIHRoZSB0aHJlZSAoa25vd24pIHZhbHVlcworICogYnkgaGFuZCBvbnRvIHRoZSBuZXcgc3RhY2sgLSB3aGlsZSB1cGRhdGluZyB0aGUgcmV0dXJuIGVpcCBwYXN0CisgKiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB3b3VsZCBoYXZlIGRvbmUgaXQgZm9yIHN5c2VudGVyLgorICovCisjZGVmaW5lIEZJWF9TVEFDSyhvZmZzZXQsIG9rLCBsYWJlbCkJCVwKKwljbXB3ICRfX0tFUk5FTF9DUyw0KCVlc3ApOwkJXAorCWpuZSBvazsJCQkJCVwKK2xhYmVsOgkJCQkJCVwKKwltb3ZsIFRTU19zeXNlbnRlcl9lc3AwK29mZnNldCglZXNwKSwlZXNwOwlcCisJcHVzaGZsOwkJCQkJXAorCXB1c2hsICRfX0tFUk5FTF9DUzsJCQlcCisJcHVzaGwgJHN5c2VudGVyX3Bhc3RfZXNwCisKK0VOVFJZKGRlYnVnKQorCWNtcGwgJHN5c2VudGVyX2VudHJ5LCglZXNwKQorCWpuZSBkZWJ1Z19zdGFja19jb3JyZWN0CisJRklYX1NUQUNLKDEyLCBkZWJ1Z19zdGFja19jb3JyZWN0LCBkZWJ1Z19lc3BfZml4X2luc24pCitkZWJ1Z19zdGFja19jb3JyZWN0OgorCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAorCVNBVkVfQUxMCisJeG9ybCAlZWR4LCVlZHgJCQkjIGVycm9yIGNvZGUgMAorCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIGRvX2RlYnVnCisJdGVzdGwgJWVheCwlZWF4CisJam56IHJlc3RvcmVfYWxsCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCisvKgorICogTk1JIGlzIGRvdWJseSBuYXN0eS4gSXQgY2FuIGhhcHBlbiBfd2hpbGVfIHdlJ3JlIGhhbmRsaW5nCisgKiBhIGRlYnVnIGZhdWx0LCBhbmQgdGhlIGRlYnVnIGZhdWx0IGhhc24ndCB5ZXQgYmVlbiBhYmxlIHRvCisgKiBjbGVhciB1cCB0aGUgc3RhY2suIFNvIHdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgd2UgZ290ICBhbgorICogTk1JIG9uIHRoZSBzeXNlbnRlciBlbnRyeSBwYXRoLCBidXQgYWZ0ZXIgdGhhdCB3ZSBuZWVkIHRvCisgKiBjaGVjayB3aGV0aGVyIHdlIGdvdCBhbiBOTUkgb24gdGhlIGRlYnVnIHBhdGggd2hlcmUgdGhlIGRlYnVnCisgKiBmYXVsdCBoYXBwZW5lZCBvbiB0aGUgc3lzZW50ZXIgcGF0aC4KKyAqLworRU5UUlkobm1pKQorCXB1c2hsICVlYXgKKwltb3ZsICVzcywgJWVheAorCWNtcHcgJF9fRVNQRklYX1NTLCAlYXgKKwlwb3BsICVlYXgKKwlqZSBubWlfMTZiaXRfc3RhY2sKKwljbXBsICRzeXNlbnRlcl9lbnRyeSwoJWVzcCkKKwlqZSBubWlfc3RhY2tfZml4dXAKKwlwdXNobCAlZWF4CisJbW92bCAlZXNwLCVlYXgKKwkvKiBEbyBub3QgYWNjZXNzIG1lbW9yeSBhYm92ZSB0aGUgZW5kIG9mIG91ciBzdGFjayBwYWdlLAorCSAqIGl0IG1pZ2h0IG5vdCBleGlzdC4KKwkgKi8KKwlhbmRsICQoVEhSRUFEX1NJWkUtMSksJWVheAorCWNtcGwgJChUSFJFQURfU0laRS0yMCksJWVheAorCXBvcGwgJWVheAorCWphZSBubWlfc3RhY2tfY29ycmVjdAorCWNtcGwgJHN5c2VudGVyX2VudHJ5LDEyKCVlc3ApCisJamUgbm1pX2RlYnVnX3N0YWNrX2NoZWNrCitubWlfc3RhY2tfY29ycmVjdDoKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKKwltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIGRvX25taQorCWptcCByZXN0b3JlX2FsbAorCitubWlfc3RhY2tfZml4dXA6CisJRklYX1NUQUNLKDEyLG5taV9zdGFja19jb3JyZWN0LCAxKQorCWptcCBubWlfc3RhY2tfY29ycmVjdAorbm1pX2RlYnVnX3N0YWNrX2NoZWNrOgorCWNtcHcgJF9fS0VSTkVMX0NTLDE2KCVlc3ApCisJam5lIG5taV9zdGFja19jb3JyZWN0CisJY21wbCAkZGVidWcgLSAxLCglZXNwKQorCWpsZSBubWlfc3RhY2tfY29ycmVjdAorCWNtcGwgJGRlYnVnX2VzcF9maXhfaW5zbiwoJWVzcCkKKwlqbGUgbm1pX2RlYnVnX3N0YWNrX2ZpeHVwCitubWlfZGVidWdfc3RhY2tfZml4dXA6CisJRklYX1NUQUNLKDI0LG5taV9zdGFja19jb3JyZWN0LCAxKQorCWptcCBubWlfc3RhY2tfY29ycmVjdAorCitubWlfMTZiaXRfc3RhY2s6CisJLyogY3JlYXRlIHRoZSBwb2ludGVyIHRvIGxzcyBiYWNrICovCisJcHVzaGwgJXNzCisJcHVzaGwgJWVzcAorCW1vdnp3bCAlc3AsICVlc3AKKwlhZGR3ICQ0LCAoJWVzcCkKKwkvKiBjb3B5IHRoZSBpcmV0IGZyYW1lIG9mIDEyIGJ5dGVzICovCisJLnJlcHQgMworCXB1c2hsIDE2KCVlc3ApCisJLmVuZHIKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwlGSVhVUF9FU1BGSVhfU1RBQ0sJCSMgJWVheCA9PSAlZXNwCisJeG9ybCAlZWR4LCVlZHgJCQkjIHplcm8gZXJyb3IgY29kZQorCWNhbGwgZG9fbm1pCisJUkVTVE9SRV9SRUdTCisJbHNzIDEyKzQoJWVzcCksICVlc3AJCSMgYmFjayB0byAxNmJpdCBzdGFjaworMToJaXJldAorLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLGlyZXRfZXhjCisucHJldmlvdXMKKworRU5UUlkoaW50MykKKwlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKKwlTQVZFX0FMTAorCXhvcmwgJWVkeCwlZWR4CQkjIHplcm8gZXJyb3IgY29kZQorCW1vdmwgJWVzcCwlZWF4CQkjIHB0X3JlZ3MgcG9pbnRlcgorCWNhbGwgZG9faW50MworCXRlc3RsICVlYXgsJWVheAorCWpueiByZXN0b3JlX2FsbAorCWptcCByZXRfZnJvbV9leGNlcHRpb24KKworRU5UUlkob3ZlcmZsb3cpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fb3ZlcmZsb3cKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShib3VuZHMpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fYm91bmRzCisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoaW52YWxpZF9vcCkKKwlwdXNobCAkMAorCXB1c2hsICRkb19pbnZhbGlkX29wCisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKQorCXB1c2hsICQwCisJcHVzaGwgJGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGludmFsaWRfVFNTKQorCXB1c2hsICRkb19pbnZhbGlkX1RTUworCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHNlZ21lbnRfbm90X3ByZXNlbnQpCisJcHVzaGwgJGRvX3NlZ21lbnRfbm90X3ByZXNlbnQKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShzdGFja19zZWdtZW50KQorCXB1c2hsICRkb19zdGFja19zZWdtZW50CisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQorCXB1c2hsICRkb19nZW5lcmFsX3Byb3RlY3Rpb24KKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShhbGlnbm1lbnRfY2hlY2spCisJcHVzaGwgJGRvX2FsaWdubWVudF9jaGVjaworCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHBhZ2VfZmF1bHQpCisJcHVzaGwgJGRvX3BhZ2VfZmF1bHQKKwlqbXAgZXJyb3JfY29kZQorCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKK0VOVFJZKG1hY2hpbmVfY2hlY2spCisJcHVzaGwgJDAKKwlwdXNobCBtYWNoaW5lX2NoZWNrX3ZlY3RvcgorCWptcCBlcnJvcl9jb2RlCisjZW5kaWYKKworRU5UUlkoc3B1cmlvdXNfaW50ZXJydXB0X2J1ZykKKwlwdXNobCAkMAorCXB1c2hsICRkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnCisJam1wIGVycm9yX2NvZGUKKworLmRhdGEKK0VOVFJZKHN5c19jYWxsX3RhYmxlKQorCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwJLyogMCAtIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwsIHVzZWQgZm9yIHJlc3RhcnRpbmcgKi8KKwkubG9uZyBzeXNfZXhpdAorCS5sb25nIHN5c19mb3JrCisJLmxvbmcgc3lzX3JlYWQKKwkubG9uZyBzeXNfd3JpdGUKKwkubG9uZyBzeXNfb3BlbgkJLyogNSAqLworCS5sb25nIHN5c19jbG9zZQorCS5sb25nIHN5c193YWl0cGlkCisJLmxvbmcgc3lzX2NyZWF0CisJLmxvbmcgc3lzX2xpbmsKKwkubG9uZyBzeXNfdW5saW5rCS8qIDEwICovCisJLmxvbmcgc3lzX2V4ZWN2ZQorCS5sb25nIHN5c19jaGRpcgorCS5sb25nIHN5c190aW1lCisJLmxvbmcgc3lzX21rbm9kCisJLmxvbmcgc3lzX2NobW9kCQkvKiAxNSAqLworCS5sb25nIHN5c19sY2hvd24xNgorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zdGF0CisJLmxvbmcgc3lzX2xzZWVrCisJLmxvbmcgc3lzX2dldHBpZAkvKiAyMCAqLworCS5sb25nIHN5c19tb3VudAorCS5sb25nIHN5c19vbGR1bW91bnQKKwkubG9uZyBzeXNfc2V0dWlkMTYKKwkubG9uZyBzeXNfZ2V0dWlkMTYKKwkubG9uZyBzeXNfc3RpbWUJCS8qIDI1ICovCisJLmxvbmcgc3lzX3B0cmFjZQorCS5sb25nIHN5c19hbGFybQorCS5sb25nIHN5c19mc3RhdAorCS5sb25nIHN5c19wYXVzZQorCS5sb25nIHN5c191dGltZQkJLyogMzAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgc3R0eSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBndHR5IHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2FjY2VzcworCS5sb25nIHN5c19uaWNlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMzUgLSBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc3luYworCS5sb25nIHN5c19raWxsCisJLmxvbmcgc3lzX3JlbmFtZQorCS5sb25nIHN5c19ta2RpcgorCS5sb25nIHN5c19ybWRpcgkJLyogNDAgKi8KKwkubG9uZyBzeXNfZHVwCisJLmxvbmcgc3lzX3BpcGUKKwkubG9uZyBzeXNfdGltZXMKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgcHJvZiBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19icmsJCS8qIDQ1ICovCisJLmxvbmcgc3lzX3NldGdpZDE2CisJLmxvbmcgc3lzX2dldGdpZDE2CisJLmxvbmcgc3lzX3NpZ25hbAorCS5sb25nIHN5c19nZXRldWlkMTYKKwkubG9uZyBzeXNfZ2V0ZWdpZDE2CS8qIDUwICovCisJLmxvbmcgc3lzX2FjY3QKKwkubG9uZyBzeXNfdW1vdW50CS8qIHJlY3ljbGVkIG5ldmVyIHVzZWQgcGh5cygpICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfaW9jdGwKKwkubG9uZyBzeXNfZmNudGwJCS8qIDU1ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zZXRwZ2lkCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19vbGR1bmFtZQorCS5sb25nIHN5c191bWFzawkJLyogNjAgKi8KKwkubG9uZyBzeXNfY2hyb290CisJLmxvbmcgc3lzX3VzdGF0CisJLmxvbmcgc3lzX2R1cDIKKwkubG9uZyBzeXNfZ2V0cHBpZAorCS5sb25nIHN5c19nZXRwZ3JwCS8qIDY1ICovCisJLmxvbmcgc3lzX3NldHNpZAorCS5sb25nIHN5c19zaWdhY3Rpb24KKwkubG9uZyBzeXNfc2dldG1hc2sKKwkubG9uZyBzeXNfc3NldG1hc2sKKwkubG9uZyBzeXNfc2V0cmV1aWQxNgkvKiA3MCAqLworCS5sb25nIHN5c19zZXRyZWdpZDE2CisJLmxvbmcgc3lzX3NpZ3N1c3BlbmQKKwkubG9uZyBzeXNfc2lncGVuZGluZworCS5sb25nIHN5c19zZXRob3N0bmFtZQorCS5sb25nIHN5c19zZXRybGltaXQJLyogNzUgKi8KKwkubG9uZyBzeXNfb2xkX2dldHJsaW1pdAorCS5sb25nIHN5c19nZXRydXNhZ2UKKwkubG9uZyBzeXNfZ2V0dGltZW9mZGF5CisJLmxvbmcgc3lzX3NldHRpbWVvZmRheQorCS5sb25nIHN5c19nZXRncm91cHMxNgkvKiA4MCAqLworCS5sb25nIHN5c19zZXRncm91cHMxNgorCS5sb25nIG9sZF9zZWxlY3QKKwkubG9uZyBzeXNfc3ltbGluaworCS5sb25nIHN5c19sc3RhdAorCS5sb25nIHN5c19yZWFkbGluawkvKiA4NSAqLworCS5sb25nIHN5c191c2VsaWIKKwkubG9uZyBzeXNfc3dhcG9uCisJLmxvbmcgc3lzX3JlYm9vdAorCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCisJLmxvbmcgc3lzX211bm1hcAorCS5sb25nIHN5c190cnVuY2F0ZQorCS5sb25nIHN5c19mdHJ1bmNhdGUKKwkubG9uZyBzeXNfZmNobW9kCisJLmxvbmcgc3lzX2ZjaG93bjE2CS8qIDk1ICovCisJLmxvbmcgc3lzX2dldHByaW9yaXR5CisJLmxvbmcgc3lzX3NldHByaW9yaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2ZpbCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zdGF0ZnMKKwkubG9uZyBzeXNfZnN0YXRmcwkvKiAxMDAgKi8KKwkubG9uZyBzeXNfaW9wZXJtCisJLmxvbmcgc3lzX3NvY2tldGNhbGwKKwkubG9uZyBzeXNfc3lzbG9nCisJLmxvbmcgc3lzX3NldGl0aW1lcgorCS5sb25nIHN5c19nZXRpdGltZXIJLyogMTA1ICovCisJLmxvbmcgc3lzX25ld3N0YXQKKwkubG9uZyBzeXNfbmV3bHN0YXQKKwkubG9uZyBzeXNfbmV3ZnN0YXQKKwkubG9uZyBzeXNfdW5hbWUKKwkubG9uZyBzeXNfaW9wbAkJLyogMTEwICovCisJLmxvbmcgc3lzX3ZoYW5ndXAKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgImlkbGUiIHN5c3RlbSBjYWxsICovCisJLmxvbmcgc3lzX3ZtODZvbGQKKwkubG9uZyBzeXNfd2FpdDQKKwkubG9uZyBzeXNfc3dhcG9mZgkvKiAxMTUgKi8KKwkubG9uZyBzeXNfc3lzaW5mbworCS5sb25nIHN5c19pcGMKKwkubG9uZyBzeXNfZnN5bmMKKwkubG9uZyBzeXNfc2lncmV0dXJuCisJLmxvbmcgc3lzX2Nsb25lCQkvKiAxMjAgKi8KKwkubG9uZyBzeXNfc2V0ZG9tYWlubmFtZQorCS5sb25nIHN5c19uZXd1bmFtZQorCS5sb25nIHN5c19tb2RpZnlfbGR0CisJLmxvbmcgc3lzX2FkanRpbWV4CisJLmxvbmcgc3lzX21wcm90ZWN0CS8qIDEyNSAqLworCS5sb25nIHN5c19zaWdwcm9jbWFzaworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiY3JlYXRlX21vZHVsZSIgKi8gCisJLmxvbmcgc3lzX2luaXRfbW9kdWxlCisJLmxvbmcgc3lzX2RlbGV0ZV9tb2R1bGUKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAxMzA6CW9sZCAiZ2V0X2tlcm5lbF9zeW1zIiAqLworCS5sb25nIHN5c19xdW90YWN0bAorCS5sb25nIHN5c19nZXRwZ2lkCisJLmxvbmcgc3lzX2ZjaGRpcgorCS5sb25nIHN5c19iZGZsdXNoCisJLmxvbmcgc3lzX3N5c2ZzCQkvKiAxMzUgKi8KKwkubG9uZyBzeXNfcGVyc29uYWxpdHkKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiByZXNlcnZlZCBmb3IgYWZzX3N5c2NhbGwgKi8KKwkubG9uZyBzeXNfc2V0ZnN1aWQxNgorCS5sb25nIHN5c19zZXRmc2dpZDE2CisJLmxvbmcgc3lzX2xsc2VlawkvKiAxNDAgKi8KKwkubG9uZyBzeXNfZ2V0ZGVudHMKKwkubG9uZyBzeXNfc2VsZWN0CisJLmxvbmcgc3lzX2Zsb2NrCisJLmxvbmcgc3lzX21zeW5jCisJLmxvbmcgc3lzX3JlYWR2CQkvKiAxNDUgKi8KKwkubG9uZyBzeXNfd3JpdGV2CisJLmxvbmcgc3lzX2dldHNpZAorCS5sb25nIHN5c19mZGF0YXN5bmMKKwkubG9uZyBzeXNfc3lzY3RsCisJLmxvbmcgc3lzX21sb2NrCQkvKiAxNTAgKi8KKwkubG9uZyBzeXNfbXVubG9jaworCS5sb25nIHN5c19tbG9ja2FsbAorCS5sb25nIHN5c19tdW5sb2NrYWxsCisJLmxvbmcgc3lzX3NjaGVkX3NldHBhcmFtCisJLmxvbmcgc3lzX3NjaGVkX2dldHBhcmFtICAgLyogMTU1ICovCisJLmxvbmcgc3lzX3NjaGVkX3NldHNjaGVkdWxlcgorCS5sb25nIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIKKwkubG9uZyBzeXNfc2NoZWRfeWllbGQKKwkubG9uZyBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAorCS5sb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluICAvKiAxNjAgKi8KKwkubG9uZyBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisJLmxvbmcgc3lzX25hbm9zbGVlcAorCS5sb25nIHN5c19tcmVtYXAKKwkubG9uZyBzeXNfc2V0cmVzdWlkMTYKKwkubG9uZyBzeXNfZ2V0cmVzdWlkMTYJLyogMTY1ICovCisJLmxvbmcgc3lzX3ZtODYKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBPbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLworCS5sb25nIHN5c19wb2xsCisJLmxvbmcgc3lzX25mc3NlcnZjdGwKKwkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJLyogMTcwICovCisJLmxvbmcgc3lzX2dldHJlc2dpZDE2CisJLmxvbmcgc3lzX3ByY3RsCisJLmxvbmcgc3lzX3J0X3NpZ3JldHVybgorCS5sb25nIHN5c19ydF9zaWdhY3Rpb24KKwkubG9uZyBzeXNfcnRfc2lncHJvY21hc2sJLyogMTc1ICovCisJLmxvbmcgc3lzX3J0X3NpZ3BlbmRpbmcKKwkubG9uZyBzeXNfcnRfc2lndGltZWR3YWl0CisJLmxvbmcgc3lzX3J0X3NpZ3F1ZXVlaW5mbworCS5sb25nIHN5c19ydF9zaWdzdXNwZW5kCisJLmxvbmcgc3lzX3ByZWFkNjQJLyogMTgwICovCisJLmxvbmcgc3lzX3B3cml0ZTY0CisJLmxvbmcgc3lzX2Nob3duMTYKKwkubG9uZyBzeXNfZ2V0Y3dkCisJLmxvbmcgc3lzX2NhcGdldAorCS5sb25nIHN5c19jYXBzZXQJLyogMTg1ICovCisJLmxvbmcgc3lzX3NpZ2FsdHN0YWNrCisJLmxvbmcgc3lzX3NlbmRmaWxlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMxICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMyICovCisJLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KKwkubG9uZyBzeXNfZ2V0cmxpbWl0CisJLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX3RydW5jYXRlNjQKKwkubG9uZyBzeXNfZnRydW5jYXRlNjQKKwkubG9uZyBzeXNfc3RhdDY0CS8qIDE5NSAqLworCS5sb25nIHN5c19sc3RhdDY0CisJLmxvbmcgc3lzX2ZzdGF0NjQKKwkubG9uZyBzeXNfbGNob3duCisJLmxvbmcgc3lzX2dldHVpZAorCS5sb25nIHN5c19nZXRnaWQJLyogMjAwICovCisJLmxvbmcgc3lzX2dldGV1aWQKKwkubG9uZyBzeXNfZ2V0ZWdpZAorCS5sb25nIHN5c19zZXRyZXVpZAorCS5sb25nIHN5c19zZXRyZWdpZAorCS5sb25nIHN5c19nZXRncm91cHMJLyogMjA1ICovCisJLmxvbmcgc3lzX3NldGdyb3VwcworCS5sb25nIHN5c19mY2hvd24KKwkubG9uZyBzeXNfc2V0cmVzdWlkCisJLmxvbmcgc3lzX2dldHJlc3VpZAorCS5sb25nIHN5c19zZXRyZXNnaWQJLyogMjEwICovCisJLmxvbmcgc3lzX2dldHJlc2dpZAorCS5sb25nIHN5c19jaG93bgorCS5sb25nIHN5c19zZXR1aWQKKwkubG9uZyBzeXNfc2V0Z2lkCisJLmxvbmcgc3lzX3NldGZzdWlkCS8qIDIxNSAqLworCS5sb25nIHN5c19zZXRmc2dpZAorCS5sb25nIHN5c19waXZvdF9yb290CisJLmxvbmcgc3lzX21pbmNvcmUKKwkubG9uZyBzeXNfbWFkdmlzZQorCS5sb25nIHN5c19nZXRkZW50czY0CS8qIDIyMCAqLworCS5sb25nIHN5c19mY250bDY0CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIFRVWCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCisJLmxvbmcgc3lzX2dldHRpZAorCS5sb25nIHN5c19yZWFkYWhlYWQJLyogMjI1ICovCisJLmxvbmcgc3lzX3NldHhhdHRyCisJLmxvbmcgc3lzX2xzZXR4YXR0cgorCS5sb25nIHN5c19mc2V0eGF0dHIKKwkubG9uZyBzeXNfZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGdldHhhdHRyCS8qIDIzMCAqLworCS5sb25nIHN5c19mZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGlzdHhhdHRyCisJLmxvbmcgc3lzX2xsaXN0eGF0dHIKKwkubG9uZyBzeXNfZmxpc3R4YXR0cgorCS5sb25nIHN5c19yZW1vdmV4YXR0cgkvKiAyMzUgKi8KKwkubG9uZyBzeXNfbHJlbW92ZXhhdHRyCisJLmxvbmcgc3lzX2ZyZW1vdmV4YXR0cgorCS5sb25nIHN5c190a2lsbAorCS5sb25nIHN5c19zZW5kZmlsZTY0CisJLmxvbmcgc3lzX2Z1dGV4CQkvKiAyNDAgKi8KKwkubG9uZyBzeXNfc2NoZWRfc2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfc2NoZWRfZ2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfc2V0X3RocmVhZF9hcmVhCisJLmxvbmcgc3lzX2dldF90aHJlYWRfYXJlYQorCS5sb25nIHN5c19pb19zZXR1cAkvKiAyNDUgKi8KKwkubG9uZyBzeXNfaW9fZGVzdHJveQorCS5sb25nIHN5c19pb19nZXRldmVudHMKKwkubG9uZyBzeXNfaW9fc3VibWl0CisJLmxvbmcgc3lzX2lvX2NhbmNlbAorCS5sb25nIHN5c19mYWR2aXNlNjQJLyogMjUwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwKKwkubG9uZyBzeXNfZXhpdF9ncm91cAorCS5sb25nIHN5c19sb29rdXBfZGNvb2tpZQorCS5sb25nIHN5c19lcG9sbF9jcmVhdGUKKwkubG9uZyBzeXNfZXBvbGxfY3RsCS8qIDI1NSAqLworCS5sb25nIHN5c19lcG9sbF93YWl0CisgCS5sb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzCisgCS5sb25nIHN5c19zZXRfdGlkX2FkZHJlc3MKKyAJLmxvbmcgc3lzX3RpbWVyX2NyZWF0ZQorIAkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkJLyogMjYwICovCisgCS5sb25nIHN5c190aW1lcl9nZXR0aW1lCisgCS5sb25nIHN5c190aW1lcl9nZXRvdmVycnVuCisgCS5sb25nIHN5c190aW1lcl9kZWxldGUKKyAJLmxvbmcgc3lzX2Nsb2NrX3NldHRpbWUKKyAJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUJCS8qIDI2NSAqLworIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCisgCS5sb25nIHN5c19jbG9ja19uYW5vc2xlZXAKKwkubG9uZyBzeXNfc3RhdGZzNjQKKwkubG9uZyBzeXNfZnN0YXRmczY0CQorCS5sb25nIHN5c190Z2tpbGwJLyogMjcwICovCisJLmxvbmcgc3lzX3V0aW1lcworIAkubG9uZyBzeXNfZmFkdmlzZTY0XzY0CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX3ZzZXJ2ZXIgKi8KKwkubG9uZyBzeXNfbWJpbmQKKwkubG9uZyBzeXNfZ2V0X21lbXBvbGljeQorCS5sb25nIHN5c19zZXRfbWVtcG9saWN5CisJLmxvbmcgc3lzX21xX29wZW4KKwkubG9uZyBzeXNfbXFfdW5saW5rCisJLmxvbmcgc3lzX21xX3RpbWVkc2VuZAorCS5sb25nIHN5c19tcV90aW1lZHJlY2VpdmUJLyogMjgwICovCisJLmxvbmcgc3lzX21xX25vdGlmeQorCS5sb25nIHN5c19tcV9nZXRzZXRhdHRyCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIHJlc2VydmVkIGZvciBrZXhlYyAqLworCS5sb25nIHN5c193YWl0aWQKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogMjg1ICovIC8qIGF2YWlsYWJsZSAqLworCS5sb25nIHN5c19hZGRfa2V5CisJLmxvbmcgc3lzX3JlcXVlc3Rfa2V5CisJLmxvbmcgc3lzX2tleWN0bAorCitzeXNjYWxsX3RhYmxlX3NpemU9KC4tc3lzX2NhbGxfdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL2hlYWQuUyAtLSB0aGUgMzItYml0IHN0YXJ0dXAgY29kZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBFbmhhbmNlZCBDUFUgZGV0ZWN0aW9uIGFuZCBmZWF0dXJlIHNldHRpbmcgY29kZSBieSBNaWtlIEphZ2RpcworICogIGFuZCBNYXJ0aW4gTWFyZXMsIE5vdmVtYmVyIDE5OTcuCisgKi8KKworLnRleHQKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKy8qCisgKiBSZWZlcmVuY2VzIHRvIG1lbWJlcnMgb2YgdGhlIG5ld19jcHVfZGF0YSBzdHJ1Y3R1cmUuCisgKi8KKworI2RlZmluZSBYODYJCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4NgorI2RlZmluZSBYODZfVkVORE9SCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4Nl92ZW5kb3IKKyNkZWZpbmUgWDg2X01PREVMCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4Nl9tb2RlbAorI2RlZmluZSBYODZfTUFTSwluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfbWFzaworI2RlZmluZSBYODZfSEFSRF9NQVRICW5ld19jcHVfZGF0YStDUFVJTkZPX2hhcmRfbWF0aAorI2RlZmluZSBYODZfQ1BVSUQJbmV3X2NwdV9kYXRhK0NQVUlORk9fY3B1aWRfbGV2ZWwKKyNkZWZpbmUgWDg2X0NBUEFCSUxJVFkJbmV3X2NwdV9kYXRhK0NQVUlORk9feDg2X2NhcGFiaWxpdHkKKyNkZWZpbmUgWDg2X1ZFTkRPUl9JRAluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfdmVuZG9yX2lkCisKKy8qCisgKiBUaGlzIGlzIGhvdyBtdWNoIG1lbW9yeSAqaW4gYWRkaXRpb24gdG8gdGhlIG1lbW9yeSBjb3ZlcmVkIHVwIHRvCisgKiBhbmQgaW5jbHVkaW5nIF9lbmQqIHdlIG5lZWQgbWFwcGVkIGluaXRpYWxseS4gIFdlIG5lZWQgb25lIGJpdCBmb3IKKyAqIGVhY2ggcG9zc2libGUgcGFnZSwgYnV0IG9ubHkgaW4gbG93IG1lbW9yeSwgd2hpY2ggbWVhbnMKKyAqIDJeMzIvNDA5Ni84ID0gMTI4SyB3b3JzdCBjYXNlICg0Ry80RyBzcGxpdC4pCisgKgorICogTW9kdWxvIHJvdW5kaW5nLCBlYWNoIG1lZ2FieXRlIGFzc2lnbmVkIGhlcmUgcmVxdWlyZXMgYSBraWxvYnl0ZSBvZgorICogbWVtb3J5LCB3aGljaCBpcyBjdXJyZW50bHkgdW5yZWNsYWltZWQuCisgKgorICogVGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBhIHBhZ2UuCisgKi8KKyNkZWZpbmUgSU5JVF9NQVBfQkVZT05EX0VORAkoMTI4KjEwMjQpCisKKworLyoKKyAqIDMyLWJpdCBrZXJuZWwgZW50cnlwb2ludDsgb25seSB1c2VkIGJ5IHRoZSBib290IENQVS4gIE9uIGVudHJ5LAorICogJWVzaSBwb2ludHMgdG8gdGhlIHJlYWwtbW9kZSBjb2RlIGFzIGEgMzItYml0IHBvaW50ZXIuCisgKiBDUyBhbmQgRFMgbXVzdCBiZSA0IEdCIGZsYXQgc2VnbWVudHMsIGJ1dCB3ZSBkb24ndCBkZXBlbmQgb24KKyAqIGFueSBwYXJ0aWN1bGFyIEdEVCBsYXlvdXQsIGJlY2F1c2Ugd2UgbG9hZCBvdXIgb3duIGFzIHNvb24gYXMgd2UKKyAqIGNhbi4KKyAqLworRU5UUlkoc3RhcnR1cF8zMikKKworLyoKKyAqIFNldCBzZWdtZW50cyB0byBrbm93biB2YWx1ZXMuCisgKi8KKwljbGQKKwlsZ2R0IGJvb3RfZ2R0X2Rlc2NyIC0gX19QQUdFX09GRlNFVAorCW1vdmwgJChfX0JPT1RfRFMpLCVlYXgKKwltb3ZsICVlYXgsJWRzCisJbW92bCAlZWF4LCVlcworCW1vdmwgJWVheCwlZnMKKwltb3ZsICVlYXgsJWdzCisKKy8qCisgKiBDbGVhciBCU1MgZmlyc3Qgc28gdGhhdCB0aGVyZSBhcmUgbm8gc3VycHJpc2VzLi4uCisgKiBObyBuZWVkIHRvIGNsZCBhcyBERiBpcyBhbHJlYWR5IGNsZWFyIGZyb20gY2xkIGFib3ZlLi4uCisgKi8KKwl4b3JsICVlYXgsJWVheAorCW1vdmwgJF9fYnNzX3N0YXJ0IC0gX19QQUdFX09GRlNFVCwlZWRpCisJbW92bCAkX19ic3Nfc3RvcCAtIF9fUEFHRV9PRkZTRVQsJWVjeAorCXN1YmwgJWVkaSwlZWN4CisJc2hybCAkMiwlZWN4CisJcmVwIDsgc3Rvc2wKKworLyoKKyAqIEluaXRpYWxpemUgcGFnZSB0YWJsZXMuICBUaGlzIGNyZWF0ZXMgYSBQREUgYW5kIGEgc2V0IG9mIHBhZ2UKKyAqIHRhYmxlcywgd2hpY2ggYXJlIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYmV5b25kIF9lbmQuICBUaGUgdmFyaWFibGUKKyAqIGluaXRfcGdfdGFibGVzX2VuZCBpcyBzZXQgdXAgdG8gcG9pbnQgdG8gdGhlIGZpcnN0ICJzYWZlIiBsb2NhdGlvbi4KKyAqIE1hcHBpbmdzIGFyZSBjcmVhdGVkIGJvdGggYXQgdmlydHVhbCBhZGRyZXNzIDAgKGlkZW50aXR5IG1hcHBpbmcpCisgKiBhbmQgUEFHRV9PRkZTRVQgZm9yIHVwIHRvIF9lbmQrc2l6ZW9mKHBhZ2UgdGFibGVzKStJTklUX01BUF9CRVlPTkRfRU5ELgorICoKKyAqIFdhcm5pbmc6IGRvbid0IHVzZSAlZXNpIG9yIHRoZSBzdGFjayBpbiB0aGlzIGNvZGUuICBIb3dldmVyLCAlZXNwCisgKiBjYW4gYmUgdXNlZCBhcyBhIEdQUiBpZiB5b3UgcmVhbGx5IG5lZWQgaXQuLi4KKyAqLworcGFnZV9wZGVfb2Zmc2V0ID0gKF9fUEFHRV9PRkZTRVQgPj4gMjApOworCisJbW92bCAkKHBnMCAtIF9fUEFHRV9PRkZTRVQpLCAlZWRpCisJbW92bCAkKHN3YXBwZXJfcGdfZGlyIC0gX19QQUdFX09GRlNFVCksICVlZHgKKwltb3ZsICQweDAwNywgJWVheAkJCS8qIDB4MDA3ID0gUFJFU0VOVCtSVytVU0VSICovCisxMDoKKwlsZWFsIDB4MDA3KCVlZGkpLCVlY3gJCQkvKiBDcmVhdGUgUERFIGVudHJ5ICovCisJbW92bCAlZWN4LCglZWR4KQkJCS8qIFN0b3JlIGlkZW50aXR5IFBERSBlbnRyeSAqLworCW1vdmwgJWVjeCxwYWdlX3BkZV9vZmZzZXQoJWVkeCkJCS8qIFN0b3JlIGtlcm5lbCBQREUgZW50cnkgKi8KKwlhZGRsICQ0LCVlZHgKKwltb3ZsICQxMDI0LCAlZWN4CisxMToKKwlzdG9zbAorCWFkZGwgJDB4MTAwMCwlZWF4CisJbG9vcCAxMWIKKwkvKiBFbmQgY29uZGl0aW9uOiB3ZSBtdXN0IG1hcCB1cCB0byBhbmQgaW5jbHVkaW5nIElOSVRfTUFQX0JFWU9ORF9FTkQgKi8KKwkvKiBieXRlcyBiZXlvbmQgdGhlIGVuZCBvZiBvdXIgb3duIHBhZ2UgdGFibGVzOyB0aGUgKzB4MDA3IGlzIHRoZSBhdHRyaWJ1dGUgYml0cyAqLworCWxlYWwgKElOSVRfTUFQX0JFWU9ORF9FTkQrMHgwMDcpKCVlZGkpLCVlYnAKKwljbXBsICVlYnAsJWVheAorCWpiIDEwYgorCW1vdmwgJWVkaSwoaW5pdF9wZ190YWJsZXNfZW5kIC0gX19QQUdFX09GRlNFVCkKKworI2lmZGVmIENPTkZJR19TTVAKKwl4b3JsICVlYngsJWVieAkJCQkvKiBUaGlzIGlzIHRoZSBib290IENQVSAoQlNQKSAqLworCWptcCAzZgorCisvKgorICogTm9uLWJvb3QgQ1BVIGVudHJ5IHBvaW50OyBlbnRlcmVkIGZyb20gdHJhbXBvbGluZS5TCisgKiBXZSBjYW4ndCBsZ2R0IGhlcmUsIGJlY2F1c2UgbGdkdCBpdHNlbGYgdXNlcyBhIGRhdGEgc2VnbWVudCwgYnV0CisgKiB3ZSBrbm93IHRoZSB0cmFtcG9saW5lIGhhcyBhbHJlYWR5IGxvYWRlZCB0aGUgYm9vdF9nZHRfdGFibGUgR0RUCisgKiBmb3IgdXMuCisgKi8KK0VOVFJZKHN0YXJ0dXBfMzJfc21wKQorCWNsZAorCW1vdmwgJChfX0JPT1RfRFMpLCVlYXgKKwltb3ZsICVlYXgsJWRzCisJbW92bCAlZWF4LCVlcworCW1vdmwgJWVheCwlZnMKKwltb3ZsICVlYXgsJWdzCisKKy8qCisgKglOZXcgcGFnZSB0YWJsZXMgbWF5IGJlIGluIDRNYnl0ZSBwYWdlIG1vZGUgYW5kIG1heQorICoJYmUgdXNpbmcgdGhlIGdsb2JhbCBwYWdlcy4gCisgKgorICoJTk9URSEgSWYgd2UgYXJlIG9uIGEgNDg2IHdlIG1heSBoYXZlIG5vIGNyNCBhdCBhbGwhCisgKglTbyB3ZSBkbyBub3QgdHJ5IHRvIHRvdWNoIGl0IHVubGVzcyB3ZSByZWFsbHkgaGF2ZQorICoJc29tZSBiaXRzIGluIGl0IHRvIHNldC4gIFRoaXMgd29uJ3Qgd29yayBpZiB0aGUgQlNQCisgKglpbXBsZW1lbnRzIGNyNCBidXQgdGhpcyBBUCBkb2VzIG5vdCAtLSB2ZXJ5IHVubGlrZWx5CisgKglidXQgYmUgd2FybmVkISAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgcHNlIGZlYXR1cmUKKyAqCWlmIG5vdCBlcXVhbGx5IHN1cHBvcnRlZC4gLS1tYWNybworICoKKyAqCU5PVEUhIFdlIGhhdmUgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCB3ZSdyZQorICoJbm90IHlldCBvZmZzZXQgUEFHRV9PRkZTRVQuLgorICovCisjZGVmaW5lIGNyNF9iaXRzIG1tdV9jcjRfZmVhdHVyZXMtX19QQUdFX09GRlNFVAorCW1vdmwgY3I0X2JpdHMsJWVkeAorCWFuZGwgJWVkeCwlZWR4CisJanogNmYKKwltb3ZsICVjcjQsJWVheAkJIyBUdXJuIG9uIHBhZ2luZyBvcHRpb25zIChQU0UsUEFFLC4uKQorCW9ybCAlZWR4LCVlYXgKKwltb3ZsICVlYXgsJWNyNAorCisJYnRsICQ1LCAlZWF4CQkjIGNoZWNrIGlmIFBBRSBpcyBlbmFibGVkCisJam5jIDZmCisKKwkvKiBDaGVjayBpZiBleHRlbmRlZCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkICovCisJbW92bCAkMHg4MDAwMDAwMCwgJWVheAorCWNwdWlkCisJY21wbCAkMHg4MDAwMDAwMCwgJWVheAorCWpiZSA2ZgorCW1vdiAkMHg4MDAwMDAwMSwgJWVheAorCWNwdWlkCisJLyogRXhlY3V0ZSBEaXNhYmxlIGJpdCBzdXBwb3J0ZWQ/ICovCisJYnRsICQyMCwgJWVkeAorCWpuYyA2ZgorCisJLyogU2V0dXAgRUZFUiAoRXh0ZW5kZWQgRmVhdHVyZSBFbmFibGUgUmVnaXN0ZXIpICovCisJbW92bCAkMHhjMDAwMDA4MCwgJWVjeAorCXJkbXNyCisKKwlidHNsICQxMSwgJWVheAorCS8qIE1ha2UgY2hhbmdlcyBlZmZlY3RpdmUgKi8KKwl3cm1zcgorCis2OgorCS8qIFRoaXMgaXMgYSBzZWNvbmRhcnkgcHJvY2Vzc29yIChBUCkgKi8KKwl4b3JsICVlYngsJWVieAorCWluY2wgJWVieAorCiszOgorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworLyoKKyAqIEVuYWJsZSBwYWdpbmcKKyAqLworCW1vdmwgJHN3YXBwZXJfcGdfZGlyLV9fUEFHRV9PRkZTRVQsJWVheAorCW1vdmwgJWVheCwlY3IzCQkvKiBzZXQgdGhlIHBhZ2UgdGFibGUgcG9pbnRlci4uICovCisJbW92bCAlY3IwLCVlYXgKKwlvcmwgJDB4ODAwMDAwMDAsJWVheAorCW1vdmwgJWVheCwlY3IwCQkvKiAuLmFuZCBzZXQgcGFnaW5nIChQRykgYml0ICovCisJbGptcCAkX19CT09UX0NTLCQxZgkvKiBDbGVhciBwcmVmZXRjaCBhbmQgbm9ybWFsaXplICVlaXAgKi8KKzE6CisJLyogU2V0IHVwIHRoZSBzdGFjayBwb2ludGVyICovCisJbHNzIHN0YWNrX3N0YXJ0LCVlc3AKKworLyoKKyAqIEluaXRpYWxpemUgZWZsYWdzLiAgU29tZSBCSU9TJ3MgbGVhdmUgYml0cyBsaWtlIE5UIHNldC4gIFRoaXMgd291bGQKKyAqIGNvbmZ1c2UgdGhlIGRlYnVnZ2VyIGlmIHRoaXMgY29kZSBpcyB0cmFjZWQuCisgKiBYWFggLSBiZXN0IHRvIGluaXRpYWxpemUgYmVmb3JlIHN3aXRjaGluZyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqLworCXB1c2hsICQwCisJcG9wZmwKKworI2lmZGVmIENPTkZJR19TTVAKKwlhbmRsICVlYngsJWVieAorCWp6ICAxZgkJCQkvKiBJbml0aWFsIENQVSBjbGVhbnMgQlNTICovCisJam1wIGNoZWNrQ1BVdHlwZQorMToKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBzdGFydCBzeXN0ZW0gMzItYml0IHNldHVwLiBXZSBuZWVkIHRvIHJlLWRvIHNvbWUgb2YgdGhlIHRoaW5ncyBkb25lCisgKiBpbiAxNi1iaXQgbW9kZSBmb3IgdGhlICJyZWFsIiBvcGVyYXRpb25zLgorICovCisJY2FsbCBzZXR1cF9pZHQKKworLyoKKyAqIENvcHkgYm9vdHVwIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSB3YXkuCisgKiBOb3RlOiAlZXNpIHN0aWxsIGhhcyB0aGUgcG9pbnRlciB0byB0aGUgcmVhbC1tb2RlIGRhdGEuCisgKi8KKwltb3ZsICRib290X3BhcmFtcywlZWRpCisJbW92bCAkKFBBUkFNX1NJWkUvNCksJWVjeAorCWNsZAorCXJlcAorCW1vdnNsCisJbW92bCBib290X3BhcmFtcytORVdfQ0xfUE9JTlRFUiwlZXNpCisJYW5kbCAlZXNpLCVlc2kKKwlqbnogMmYJCQkjIE5ldyBjb21tYW5kIGxpbmUgcHJvdG9jb2wKKwljbXB3ICQoT0xEX0NMX01BR0lDKSxPTERfQ0xfTUFHSUNfQUREUgorCWpuZSAxZgorCW1vdnp3bCBPTERfQ0xfT0ZGU0VULCVlc2kKKwlhZGRsICQoT0xEX0NMX0JBU0VfQUREUiksJWVzaQorMjoKKwltb3ZsICRzYXZlZF9jb21tYW5kX2xpbmUsJWVkaQorCW1vdmwgJChDT01NQU5EX0xJTkVfU0laRS80KSwlZWN4CisJcmVwCisJbW92c2wKKzE6CitjaGVja0NQVXR5cGU6CisKKwltb3ZsICQtMSxYODZfQ1BVSUQJCSMgIC0xIGZvciBubyBDUFVJRCBpbml0aWFsbHkKKworLyogY2hlY2sgaWYgaXQgaXMgNDg2IG9yIDM4Ni4gKi8KKy8qCisgKiBYWFggLSB0aGlzIGRvZXMgYSBsb3Qgb2YgdW5uZWNlc3Nhcnkgc2V0dXAuICBBbGlnbm1lbnQgY2hlY2tzIGRvbid0CisgKiBhcHBseSBhdCBvdXIgY3BsIG9mIDAgYW5kIHRoZSBzdGFjayBvdWdodCB0byBiZSBhbGlnbmVkIGFscmVhZHksIGFuZAorICogd2UgZG9uJ3QgbmVlZCB0byBwcmVzZXJ2ZSBlZmxhZ3MuCisgKi8KKworCW1vdmIgJDMsWDg2CQkjIGF0IGxlYXN0IDM4NgorCXB1c2hmbAkJCSMgcHVzaCBFRkxBR1MKKwlwb3BsICVlYXgJCSMgZ2V0IEVGTEFHUworCW1vdmwgJWVheCwlZWN4CQkjIHNhdmUgb3JpZ2luYWwgRUZMQUdTCisJeG9ybCAkMHgyNDAwMDAsJWVheAkjIGZsaXAgQUMgYW5kIElEIGJpdHMgaW4gRUZMQUdTCisJcHVzaGwgJWVheAkJIyBjb3B5IHRvIEVGTEFHUworCXBvcGZsCQkJIyBzZXQgRUZMQUdTCisJcHVzaGZsCQkJIyBnZXQgbmV3IEVGTEFHUworCXBvcGwgJWVheAkJIyBwdXQgaXQgaW4gZWF4CisJeG9ybCAlZWN4LCVlYXgJCSMgY2hhbmdlIGluIGZsYWdzCisJcHVzaGwgJWVjeAkJIyByZXN0b3JlIG9yaWdpbmFsIEVGTEFHUworCXBvcGZsCisJdGVzdGwgJDB4NDAwMDAsJWVheAkjIGNoZWNrIGlmIEFDIGJpdCBjaGFuZ2VkCisJamUgaXMzODYKKworCW1vdmIgJDQsWDg2CQkjIGF0IGxlYXN0IDQ4NgorCXRlc3RsICQweDIwMDAwMCwlZWF4CSMgY2hlY2sgaWYgSUQgYml0IGNoYW5nZWQKKwlqZSBpczQ4NgorCisJLyogZ2V0IHZlbmRvciBpbmZvICovCisJeG9ybCAlZWF4LCVlYXgJCQkjIGNhbGwgQ1BVSUQgd2l0aCAwIC0+IHJldHVybiB2ZW5kb3IgSUQKKwljcHVpZAorCW1vdmwgJWVheCxYODZfQ1BVSUQJCSMgc2F2ZSBDUFVJRCBsZXZlbAorCW1vdmwgJWVieCxYODZfVkVORE9SX0lECQkjIGxvIDQgY2hhcnMKKwltb3ZsICVlZHgsWDg2X1ZFTkRPUl9JRCs0CSMgbmV4dCA0IGNoYXJzCisJbW92bCAlZWN4LFg4Nl9WRU5ET1JfSUQrOAkjIGxhc3QgNCBjaGFycworCisJb3JsICVlYXgsJWVheAkJCSMgZG8gd2UgaGF2ZSBwcm9jZXNzb3IgaW5mbyBhcyB3ZWxsPworCWplIGlzNDg2CisKKwltb3ZsICQxLCVlYXgJCSMgVXNlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbiB0byBnZXQgQ1BVIHR5cGUKKwljcHVpZAorCW1vdmIgJWFsLCVjbAkJIyBzYXZlIHJlZyBmb3IgZnV0dXJlIHVzZQorCWFuZGIgJDB4MGYsJWFoCQkjIG1hc2sgcHJvY2Vzc29yIGZhbWlseQorCW1vdmIgJWFoLFg4NgorCWFuZGIgJDB4ZjAsJWFsCQkjIG1hc2sgbW9kZWwKKwlzaHJiICQ0LCVhbAorCW1vdmIgJWFsLFg4Nl9NT0RFTAorCWFuZGIgJDB4MGYsJWNsCQkjIG1hc2sgbWFzayByZXZpc2lvbgorCW1vdmIgJWNsLFg4Nl9NQVNLCisJbW92bCAlZWR4LFg4Nl9DQVBBQklMSVRZCisKK2lzNDg2Ogltb3ZsICQweDUwMDIyLCVlY3gJIyBzZXQgQU0sIFdQLCBORSBhbmQgTVAKKwlqbXAgMmYKKworaXMzODY6CW1vdmwgJDIsJWVjeAkJIyBzZXQgTVAKKzI6CW1vdmwgJWNyMCwlZWF4CisJYW5kbCAkMHg4MDAwMDAxMSwlZWF4CSMgU2F2ZSBQRyxQRSxFVAorCW9ybCAlZWN4LCVlYXgKKwltb3ZsICVlYXgsJWNyMAorCisJY2FsbCBjaGVja194ODcKKwlpbmNiIHJlYWR5CisJbGdkdCBjcHVfZ2R0X2Rlc2NyCisJbGlkdCBpZHRfZGVzY3IKKwlsam1wICQoX19LRVJORUxfQ1MpLCQxZgorMToJbW92bCAkKF9fS0VSTkVMX0RTKSwlZWF4CSMgcmVsb2FkIGFsbCB0aGUgc2VnbWVudCByZWdpc3RlcnMKKwltb3ZsICVlYXgsJXNzCQkJIyBhZnRlciBjaGFuZ2luZyBnZHQuCisKKwltb3ZsICQoX19VU0VSX0RTKSwlZWF4CQkjIERTL0VTIGNvbnRhaW5zIGRlZmF1bHQgVVNFUiBzZWdtZW50CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKworCXhvcmwgJWVheCwlZWF4CQkJIyBDbGVhciBGUy9HUyBhbmQgTERUCisJbW92bCAlZWF4LCVmcworCW1vdmwgJWVheCwlZ3MKKwlsbGR0ICVheAorCWNsZAkJCSMgZ2NjMiB3YW50cyB0aGUgZGlyZWN0aW9uIGZsYWcgY2xlYXJlZCBhdCBhbGwgdGltZXMKKyNpZmRlZiBDT05GSUdfU01QCisJbW92YiByZWFkeSwgJWNsCQorCWNtcGIgJDEsJWNsCisJamUgMWYJCQkjIHRoZSBmaXJzdCBDUFUgY2FsbHMgc3RhcnRfa2VybmVsCisJCQkJIyBhbGwgb3RoZXIgQ1BVcyBjYWxsIGluaXRpYWxpemVfc2Vjb25kYXJ5CisJY2FsbCBpbml0aWFsaXplX3NlY29uZGFyeQorCWptcCBMNgorMToKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisJY2FsbCBzdGFydF9rZXJuZWwKK0w2OgorCWptcCBMNgkJCSMgbWFpbiBzaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUsIGJ1dAorCQkJCSMganVzdCBpbiBjYXNlLCB3ZSBrbm93IHdoYXQgaGFwcGVucy4KKworLyoKKyAqIFdlIGRlcGVuZCBvbiBFVCB0byBiZSBjb3JyZWN0LiBUaGlzIGNoZWNrcyBmb3IgMjg3LzM4Ny4KKyAqLworY2hlY2tfeDg3OgorCW1vdmIgJDAsWDg2X0hBUkRfTUFUSAorCWNsdHMKKwlmbmluaXQKKwlmc3RzdyAlYXgKKwljbXBiICQwLCVhbAorCWplIDFmCisJbW92bCAlY3IwLCVlYXgJCS8qIG5vIGNvcHJvY2Vzc29yOiBoYXZlIHRvIHNldCBiaXRzICovCisJeG9ybCAkNCwlZWF4CQkvKiBzZXQgRU0gKi8KKwltb3ZsICVlYXgsJWNyMAorCXJldAorCUFMSUdOCisxOgltb3ZiICQxLFg4Nl9IQVJEX01BVEgKKwkuYnl0ZSAweERCLDB4RTQJCS8qIGZzZXRwbSBmb3IgMjg3LCBpZ25vcmVkIGJ5IDM4NyAqLworCXJldAorCisvKgorICogIHNldHVwX2lkdAorICoKKyAqICBzZXRzIHVwIGEgaWR0IHdpdGggMjU2IGVudHJpZXMgcG9pbnRpbmcgdG8KKyAqICBpZ25vcmVfaW50LCBpbnRlcnJ1cHQgZ2F0ZXMuIEl0IGRvZXNuJ3QgYWN0dWFsbHkgbG9hZAorICogIGlkdCAtIHRoYXQgY2FuIGJlIGRvbmUgb25seSBhZnRlciBwYWdpbmcgaGFzIGJlZW4gZW5hYmxlZAorICogIGFuZCB0aGUga2VybmVsIG1vdmVkIHRvIFBBR0VfT0ZGU0VULiBJbnRlcnJ1cHRzCisgKiAgYXJlIGVuYWJsZWQgZWxzZXdoZXJlLCB3aGVuIHdlIGNhbiBiZSByZWxhdGl2ZWx5CisgKiAgc3VyZSBldmVyeXRoaW5nIGlzIG9rLgorICoKKyAqICBXYXJuaW5nOiAlZXNpIGlzIGxpdmUgYWNyb3NzIHRoaXMgZnVuY3Rpb24uCisgKi8KK3NldHVwX2lkdDoKKwlsZWEgaWdub3JlX2ludCwlZWR4CisJbW92bCAkKF9fS0VSTkVMX0NTIDw8IDE2KSwlZWF4CisJbW92dyAlZHgsJWF4CQkvKiBzZWxlY3RvciA9IDB4MDAxMCA9IGNzICovCisJbW92dyAkMHg4RTAwLCVkeAkvKiBpbnRlcnJ1cHQgZ2F0ZSAtIGRwbD0wLCBwcmVzZW50ICovCisKKwlsZWEgaWR0X3RhYmxlLCVlZGkKKwltb3YgJDI1NiwlZWN4CitycF9zaWR0OgorCW1vdmwgJWVheCwoJWVkaSkKKwltb3ZsICVlZHgsNCglZWRpKQorCWFkZGwgJDgsJWVkaQorCWRlYyAlZWN4CisJam5lIHJwX3NpZHQKKwlyZXQKKworLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgImhhbmRsZXIiIDotKSAqLworCUFMSUdOCitpZ25vcmVfaW50OgorCWNsZAorCXB1c2hsICVlYXgKKwlwdXNobCAlZWN4CisJcHVzaGwgJWVkeAorCXB1c2hsICVlcworCXB1c2hsICVkcworCW1vdmwgJChfX0tFUk5FTF9EUyksJWVheAorCW1vdmwgJWVheCwlZHMKKwltb3ZsICVlYXgsJWVzCisJcHVzaGwgMTYoJWVzcCkKKwlwdXNobCAyNCglZXNwKQorCXB1c2hsIDMyKCVlc3ApCisJcHVzaGwgNDAoJWVzcCkKKwlwdXNobCAkaW50X21zZworCWNhbGwgcHJpbnRrCisJYWRkbCAkKDUqNCksJWVzcAorCXBvcGwgJWRzCisJcG9wbCAlZXMKKwlwb3BsICVlZHgKKwlwb3BsICVlY3gKKwlwb3BsICVlYXgKKwlpcmV0CisKKy8qCisgKiBSZWFsIGJlZ2lubmluZyBvZiBub3JtYWwgInRleHQiIHNlZ21lbnQKKyAqLworRU5UUlkoc3RleHQpCitFTlRSWShfc3RleHQpCisKKy8qCisgKiBCU1Mgc2VjdGlvbgorICovCisuc2VjdGlvbiAiLmJzcy5wYWdlX2FsaWduZWQiLCJ3IgorRU5UUlkoc3dhcHBlcl9wZ19kaXIpCisJLmZpbGwgMTAyNCw0LDAKK0VOVFJZKGVtcHR5X3plcm9fcGFnZSkKKwkuZmlsbCA0MDk2LDEsMAorCisvKgorICogVGhpcyBzdGFydHMgdGhlIGRhdGEgc2VjdGlvbi4KKyAqLworLmRhdGEKKworRU5UUlkoc3RhY2tfc3RhcnQpCisJLmxvbmcgaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUKKwkubG9uZyBfX0JPT1RfRFMKKworcmVhZHk6CS5ieXRlIDAKKworaW50X21zZzoKKwkuYXNjaXogIlVua25vd24gaW50ZXJydXB0IG9yIGZhdWx0IGF0IEVJUCAlcCAlcCAlcFxuIgorCisvKgorICogVGhlIElEVCBhbmQgR0RUICdkZXNjcmlwdG9ycycgYXJlIGEgc3RyYW5nZSA0OC1iaXQgb2JqZWN0CisgKiBvbmx5IHVzZWQgYnkgdGhlIGxpZHQgYW5kIGxnZHQgaW5zdHJ1Y3Rpb25zLiBUaGV5IGFyZSBub3QKKyAqIGxpa2UgdXN1YWwgc2VnbWVudCBkZXNjcmlwdG9ycyAtIHRoZXkgY29uc2lzdCBvZiBhIDE2LWJpdAorICogc2VnbWVudCBzaXplLCBhbmQgMzItYml0IGxpbmVhciBhZGRyZXNzIHZhbHVlOgorICovCisKKy5nbG9ibCBib290X2dkdF9kZXNjcgorLmdsb2JsIGlkdF9kZXNjcgorLmdsb2JsIGNwdV9nZHRfZGVzY3IKKworCUFMSUdOCisjIGVhcmx5IGJvb3QgR0RUIGRlc2NyaXB0b3IgKG11c3QgdXNlIDE6MSBhZGRyZXNzIG1hcHBpbmcpCisJLndvcmQgMAkJCQkjIDMyIGJpdCBhbGlnbiBnZHRfZGVzYy5hZGRyZXNzCitib290X2dkdF9kZXNjcjoKKwkud29yZCBfX0JPT1RfRFMrNworCS5sb25nIGJvb3RfZ2R0X3RhYmxlIC0gX19QQUdFX09GRlNFVAorCisJLndvcmQgMAkJCQkjIDMyLWJpdCBhbGlnbiBpZHRfZGVzYy5hZGRyZXNzCitpZHRfZGVzY3I6CisJLndvcmQgSURUX0VOVFJJRVMqOC0xCQkjIGlkdCBjb250YWlucyAyNTYgZW50cmllcworCS5sb25nIGlkdF90YWJsZQorCisjIGJvb3QgR0RUIGRlc2NyaXB0b3IgKGxhdGVyIG9uIHVzZWQgYnkgQ1BVIzApOgorCS53b3JkIDAJCQkJIyAzMiBiaXQgYWxpZ24gZ2R0X2Rlc2MuYWRkcmVzcworY3B1X2dkdF9kZXNjcjoKKwkud29yZCBHRFRfRU5UUklFUyo4LTEKKwkubG9uZyBjcHVfZ2R0X3RhYmxlCisKKwkuZmlsbCBOUl9DUFVTLTEsOCwwCQkjIHNwYWNlIGZvciB0aGUgb3RoZXIgR0RUIGRlc2NyaXB0b3JzCisKKy8qCisgKiBUaGUgYm9vdF9nZHRfdGFibGUgbXVzdCBtaXJyb3IgdGhlIGVxdWl2YWxlbnQgaW4gc2V0dXAuUyBhbmQgaXMKKyAqIHVzZWQgb25seSBmb3IgYm9vdGluZy4KKyAqLworCS5hbGlnbiBMMV9DQUNIRV9CWVRFUworRU5UUlkoYm9vdF9nZHRfdGFibGUpCisJLmZpbGwgR0RUX0VOVFJZX0JPT1RfQ1MsOCwwCisJLnF1YWQgMHgwMGNmOWEwMDAwMDBmZmZmCS8qIGtlcm5lbCA0R0IgY29kZSBhdCAweDAwMDAwMDAwICovCisJLnF1YWQgMHgwMGNmOTIwMDAwMDBmZmZmCS8qIGtlcm5lbCA0R0IgZGF0YSBhdCAweDAwMDAwMDAwICovCisKKy8qCisgKiBUaGUgR2xvYmFsIERlc2NyaXB0b3IgVGFibGUgY29udGFpbnMgMjggcXVhZHdvcmRzLCBwZXItQ1BVLgorICovCisJLmFsaWduIFBBR0VfU0laRV9hc20KK0VOVFJZKGNwdV9nZHRfdGFibGUpCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIE5VTEwgZGVzY3JpcHRvciAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDBiIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4MTMgcmVzZXJ2ZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgxYiByZXNlcnZlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDIwIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDI4IHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDMzIFRMUyBlbnRyeSAxICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4M2IgVExTIGVudHJ5IDIgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg0MyBUTFMgZW50cnkgMyAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDRiIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4NTMgcmVzZXJ2ZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg1YiByZXNlcnZlZCAqLworCisJLnF1YWQgMHgwMGNmOWEwMDAwMDBmZmZmCS8qIDB4NjAga2VybmVsIDRHQiBjb2RlIGF0IDB4MDAwMDAwMDAgKi8KKwkucXVhZCAweDAwY2Y5MjAwMDAwMGZmZmYJLyogMHg2OCBrZXJuZWwgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLworCS5xdWFkIDB4MDBjZmZhMDAwMDAwZmZmZgkvKiAweDczIHVzZXIgNEdCIGNvZGUgYXQgMHgwMDAwMDAwMCAqLworCS5xdWFkIDB4MDBjZmYyMDAwMDAwZmZmZgkvKiAweDdiIHVzZXIgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLworCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ODAgVFNTIGRlc2NyaXB0b3IgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg4OCBMRFQgZGVzY3JpcHRvciAqLworCisJLyogU2VnbWVudHMgdXNlZCBmb3IgY2FsbGluZyBQblAgQklPUyAqLworCS5xdWFkIDB4MDBjMDlhMDAwMDAwMDAwMAkvKiAweDkwIDMyLWJpdCBjb2RlICovCisJLnF1YWQgMHgwMDgwOWEwMDAwMDAwMDAwCS8qIDB4OTggMTYtYml0IGNvZGUgKi8KKwkucXVhZCAweDAwODA5MjAwMDAwMDAwMDAJLyogMHhhMCAxNi1iaXQgZGF0YSAqLworCS5xdWFkIDB4MDA4MDkyMDAwMDAwMDAwMAkvKiAweGE4IDE2LWJpdCBkYXRhICovCisJLnF1YWQgMHgwMDgwOTIwMDAwMDAwMDAwCS8qIDB4YjAgMTYtYml0IGRhdGEgKi8KKwkvKgorCSAqIFRoZSBBUE0gc2VnbWVudHMgaGF2ZSBieXRlIGdyYW51bGFyaXR5IGFuZCB0aGVpciBiYXNlcworCSAqIGFuZCBsaW1pdHMgYXJlIHNldCBhdCBydW4gdGltZS4KKwkgKi8KKwkucXVhZCAweDAwNDA5YTAwMDAwMDAwMDAJLyogMHhiOCBBUE0gQ1MgICAgY29kZSAqLworCS5xdWFkIDB4MDAwMDlhMDAwMDAwMDAwMAkvKiAweGMwIEFQTSBDUyAxNiBjb2RlICgxNiBiaXQpICovCisJLnF1YWQgMHgwMDQwOTIwMDAwMDAwMDAwCS8qIDB4YzggQVBNIERTICAgIGRhdGEgKi8KKworCS5xdWFkIDB4MDAwMDkyMDAwMDAwMDAwMAkvKiAweGQwIC0gRVNQRklYIDE2LWJpdCBTUyAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGQ4IC0gdW51c2VkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZTAgLSB1bnVzZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhlOCAtIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGYwIC0gdW51c2VkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZjggLSBHRFQgZW50cnkgMzE6IGRvdWJsZS1mYXVsdCBUU1MgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pMzg2X2tzeW1zLmMgYi9hcmNoL2kzODYva2VybmVsL2kzODZfa3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVjMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg2X2tzeW1zLmMKQEAgLTAsMCArMSwxOTUgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbW14Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKK2V4dGVybiBzcGlubG9ja190IHJ0Y19sb2NrOworCisvKiBUaGlzIGlzIGRlZmluaXRlbHkgYSBHUEwtb25seSBzeW1ib2wgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9nZHRfdGFibGUpOworCisjaWYgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkKK2V4dGVybiB2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9yZWFsX3Jlc3RhcnQpOworZXh0ZXJuIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworRVhQT1JUX1NZTUJPTChkZWZhdWx0X2lkbGUpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBGQVNUQ0FMTCggX193cml0ZV9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpKTsKK2V4dGVybiB2b2lkIEZBU1RDQUxMKCBfX3JlYWRfbG9ja19mYWlsZWQocndsb2NrX3QgKnJ3KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0hEKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERV9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfSERfTU9EVUxFKQorZXh0ZXJuIHN0cnVjdCBkcml2ZV9pbmZvX3N0cnVjdCBkcml2ZV9pbmZvOworRVhQT1JUX1NZTUJPTChkcml2ZV9pbmZvKTsKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVfa2h6OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKTsKKworLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KK0VYUE9SVF9TWU1CT0woYm9vdF9jcHVfZGF0YSk7CisjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQorRVhQT1JUX1NZTUJPTChub2RlX2RhdGEpOworRVhQT1JUX1NZTUJPTChwaHlzbm9kZV9tYXApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQorRVhQT1JUX1NZTUJPTCh4cXVhZF9wb3J0aW8pOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0woZHVtcF9mcHUpOworRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2ZwdV9iZWdpbik7CitFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CitFWFBPUlRfU1lNQk9MKGlvcmVtYXBfbm9jYWNoZSk7CitFWFBPUlRfU1lNQk9MKGlvdW5tYXApOworRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0wocG1faWRsZSk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CitFWFBPUlRfU1lNQk9MKGdldF9jbW9zX3RpbWUpOworRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKK0VYUE9SVF9TWU1CT0woYXBtX2luZm8pOworCitFWFBPUlRfU1lNQk9MKF9fZG93bl9mYWlsZWQpOworRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkX2ludGVycnVwdGlibGUpOworRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkX3RyeWxvY2spOworRVhQT1JUX1NZTUJPTChfX3VwX3dha2V1cCk7CisvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyk7CisvKiBEZWxheSBsb29wcyAqLworRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKK0VYUE9SVF9TWU1CT0woX19kZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKKworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzEpOworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzIpOworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzQpOworCitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfMSk7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfMik7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfNCk7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfOCk7CisKK0VYUE9SVF9TWU1CT0woc3RycGJyayk7CitFWFBPUlRfU1lNQk9MKHN0cnN0cik7CisKK0VYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woY2xlYXJfdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY2xlYXJfdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfbGwpOworRVhQT1JUX1NZTUJPTChfX2NvcHlfdG9fdXNlcl9sbCk7CitFWFBPUlRfU1lNQk9MKHN0cm5sZW5fdXNlcik7CisKK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKK0VYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOworCisjaWZkZWYgQ09ORklHX1BDSQorRVhQT1JUX1NZTUJPTChwY2lfbWVtX3N0YXJ0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSV9CSU9TCitFWFBPUlRfU1lNQk9MKHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKTsKK0VYUE9SVF9TWU1CT0wocGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1VTRV8zRE5PVworRVhQT1JUX1NZTUJPTChfbW14X21lbWNweSk7CitFWFBPUlRfU1lNQk9MKG1teF9jbGVhcl9wYWdlKTsKK0VYUE9SVF9TWU1CT0wobW14X2NvcHlfcGFnZSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSFQKK0VYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKK0VYUE9SVF9TWU1CT0woY3B1X2RhdGEpOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jYWxsb3V0X21hcCk7CitFWFBPUlRfU1lNQk9MKF9fd3JpdGVfbG9ja19mYWlsZWQpOworRVhQT1JUX1NZTUJPTChfX3JlYWRfbG9ja19mYWlsZWQpOworCisvKiBHbG9iYWwgU01QIHN0dWZmICovCitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKKworLyogVExCIGZsdXNoaW5nICovCitFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCitFWFBPUlRfU1lNQk9MKElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorRVhQT1JUX1NZTUJPTChtYWNoaW5lX2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZUCitFWFBPUlRfU1lNQk9MKHNjcmVlbl9pbmZvKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKGdldF93Y2hhbik7CisKK0VYUE9SVF9TWU1CT0wocnRjX2xvY2spOworCitFWFBPUlRfU1lNQk9MX0dQTChzZXRfbm1pX2NhbGxiYWNrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVuc2V0X25taV9jYWxsYmFjayk7CisKKyN1bmRlZiBtZW1jbXAKK2V4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKK0VYUE9SVF9TWU1CT0wobWVtY21wKTsKKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9kaWVfbm90aWZpZXIpOworI2lmZGVmIENPTkZJR19IQVZFX0RFQ19MT0NLCitFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKF9fUEFHRV9LRVJORUwpOworCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KK0VYUE9SVF9TWU1CT0woa21hcCk7CitFWFBPUlRfU1lNQk9MKGt1bm1hcCk7CitFWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljKTsKK0VYUE9SVF9TWU1CT0woa3VubWFwX2F0b21pYyk7CitFWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljX3RvX3BhZ2UpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSSkgfHwgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUlfTU9EVUxFKQorRVhQT1JUX1NZTUJPTChpc3RfaW5mbyk7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMgYi9hcmNoL2kzODYva2VybmVsL2kzODcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTVlMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0IExpbnVzIFRvcnZhbGRzCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKiAgR2VuZXJhbCBGUFUgc3RhdGUgaGFuZGxpbmcgY2xlYW51cHMKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL21hdGhfZW11Lmg+CisjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdXNlci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCisjZGVmaW5lIEhBVkVfSFdGUCAoYm9vdF9jcHVfZGF0YS5oYXJkX21hdGgpCisjZWxzZQorI2RlZmluZSBIQVZFX0hXRlAgMQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG14Y3NyX2ZlYXR1cmVfbWFzayA9IDB4ZmZmZmZmZmY7CisKK3ZvaWQgbXhjc3JfZmVhdHVyZV9tYXNrX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCWNsdHMoKTsKKwlpZiAoY3B1X2hhc19meHNyKSB7CisJCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlLCAwLCBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkpOworCQlhc20gdm9sYXRpbGUoImZ4c2F2ZSAlMCIgOiA6ICJtIiAoY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlKSk7IAorCQltYXNrID0gY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlLm14Y3NyX21hc2s7CisJCWlmIChtYXNrID09IDApIG1hc2sgPSAweDAwMDBmZmJmOworCX0gCisJbXhjc3JfZmVhdHVyZV9tYXNrICY9IG1hc2s7CisJc3R0cygpOworfQorCisvKgorICogVGhlIF9jdXJyZW50XyB0YXNrIGlzIHVzaW5nIHRoZSBGUFUgZm9yIHRoZSBmaXJzdCB0aW1lCisgKiBzbyBpbml0aWFsaXplIGl0IGFuZCBzZXQgdGhlIG14Y3NyIHRvIGl0cyBkZWZhdWx0CisgKiB2YWx1ZSBhdCByZXNldCBpZiB3ZSBzdXBwb3J0IFhNTSBpbnN0cnVjdGlvbnMgYW5kIHRoZW4KKyAqIHJlbWViZXIgdGhlIGN1cnJlbnQgdGFzayBoYXMgdXNlZCB0aGUgRlBVLgorICovCit2b2lkIGluaXRfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWlmIChjcHVfaGFzX2Z4c3IpIHsKKwkJbWVtc2V0KCZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuY3dkID0gMHgzN2Y7CisJCWlmIChjcHVfaGFzX3htbSkKKwkJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLm14Y3NyID0gMHgxZjgwOworCX0gZWxzZSB7CisJCW1lbXNldCgmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdCkpOworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZCA9IDB4ZmZmZjAzN2Z1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZCA9IDB4ZmZmZjAwMDB1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnR3ZCA9IDB4ZmZmZmZmZmZ1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmZvcyA9IDB4ZmZmZjAwMDB1OworCX0KKwkvKiBvbmx5IHRoZSBkZXZpY2Ugbm90IGF2YWlsYWJsZSBleGNlcHRpb24gb3IgcHRyYWNlIGNhbiBjYWxsIGluaXRfZnB1ICovCisJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKHRzayk7Cit9CisKKy8qCisgKiBGUFUgbGF6eSBzdGF0ZSBzYXZlIGhhbmRsaW5nLgorICovCisKK3ZvaWQga2VybmVsX2ZwdV9iZWdpbih2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKHRocmVhZC0+c3RhdHVzICYgVFNfVVNFREZQVSkgeworCQlfX3NhdmVfaW5pdF9mcHUodGhyZWFkLT50YXNrKTsKKwkJcmV0dXJuOworCX0KKwljbHRzKCk7Cit9CisKK3ZvaWQgcmVzdG9yZV9mcHUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJYXNtIHZvbGF0aWxlKCAiZnhyc3RvciAlMCIKKwkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnhzYXZlKSApOworCX0gZWxzZSB7CisJCWFzbSB2b2xhdGlsZSggImZyc3RvciAlMCIKKwkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnNhdmUpICk7CisJfQorfQorCisvKgorICogRlBVIHRhZyB3b3JkIGNvbnZlcnNpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgdHdkX2kzODdfdG9fZnhzciggdW5zaWduZWQgc2hvcnQgdHdkICkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOyAvKiB0byBhdm9pZCAxNiBiaXQgcHJlZml4ZXMgaW4gdGhlIGNvZGUgKi8KKyAKKwkvKiBUcmFuc2Zvcm0gZWFjaCBwYWlyIG9mIGJpdHMgaW50byAwMSAodmFsaWQpIG9yIDAwIChlbXB0eSkgKi8KKyAgICAgICAgdG1wID0gfnR3ZDsKKyAgICAgICAgdG1wID0gKHRtcCB8ICh0bXA+PjEpKSAmIDB4NTU1NTsgLyogMFYwVjBWMFYwVjBWMFYwViAqLworICAgICAgICAvKiBhbmQgbW92ZSB0aGUgdmFsaWQgYml0cyB0byB0aGUgbG93ZXIgYnl0ZS4gKi8KKyAgICAgICAgdG1wID0gKHRtcCB8ICh0bXAgPj4gMSkpICYgMHgzMzMzOyAvKiAwMFZWMDBWVjAwVlYwMFZWICovCisgICAgICAgIHRtcCA9ICh0bXAgfCAodG1wID4+IDIpKSAmIDB4MGYwZjsgLyogMDAwMFZWVlYwMDAwVlZWViAqLworICAgICAgICB0bXAgPSAodG1wIHwgKHRtcCA+PiA0KSkgJiAweDAwZmY7IC8qIDAwMDAwMDAwVlZWVlZWVlYgKi8KKyAgICAgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHR3ZF9meHNyX3RvX2kzODcoIHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4c2F2ZSApCit7CisJc3RydWN0IF9mcHhyZWcgKnN0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRvcyA9IChmeHNhdmUtPnN3ZCA+PiAxMSkgJiA3OworCXVuc2lnbmVkIGxvbmcgdHdkID0gKHVuc2lnbmVkIGxvbmcpIGZ4c2F2ZS0+dHdkOworCXVuc2lnbmVkIGxvbmcgdGFnOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMHhmZmZmMDAwMHU7CisJaW50IGk7CisKKyNkZWZpbmUgRlBSRUdfQUREUihmLCBuKQkoKHZvaWQgKikmKGYpLT5zdF9zcGFjZSArIChuKSAqIDE2KTsKKworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKysgKSB7CisJCWlmICggdHdkICYgMHgxICkgeworCQkJc3QgPSBGUFJFR19BRERSKCBmeHNhdmUsIChpIC0gdG9zKSAmIDcgKTsKKworCQkJc3dpdGNoICggc3QtPmV4cG9uZW50ICYgMHg3ZmZmICkgeworCQkJY2FzZSAweDdmZmY6CisJCQkJdGFnID0gMjsJCS8qIFNwZWNpYWwgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDAwOgorCQkJCWlmICggIXN0LT5zaWduaWZpY2FuZFswXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsxXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsyXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFszXSApIHsKKwkJCQkJdGFnID0gMTsJLyogWmVybyAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmICggc3QtPnNpZ25pZmljYW5kWzNdICYgMHg4MDAwICkgeworCQkJCQl0YWcgPSAwOwkvKiBWYWxpZCAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0YWcgPSAzOwkJCS8qIEVtcHR5ICovCisJCX0KKwkJcmV0IHw9ICh0YWcgPDwgKDIgKiBpKSk7CisJCXR3ZCA9IHR3ZCA+PiAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRlBVIHN0YXRlIGludGVyYWN0aW9uLgorICovCisKK3Vuc2lnbmVkIHNob3J0IGdldF9mcHVfY3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5jd2Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZDsKKwl9Cit9CisKK3Vuc2lnbmVkIHNob3J0IGdldF9mcHVfc3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5zd2Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZDsKKwl9Cit9CisKKyNpZiAwCit1bnNpZ25lZCBzaG9ydCBnZXRfZnB1X3R3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQlyZXR1cm4gdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUudHdkOworCX0gZWxzZSB7CisJCXJldHVybiAodW5zaWduZWQgc2hvcnQpdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS50d2Q7CisJfQorfQorI2VuZGlmICAvKiAgMCAgKi8KKwordW5zaWduZWQgc2hvcnQgZ2V0X2ZwdV9teGNzciggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc194bW0gKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzcjsKKwl9IGVsc2UgeworCQlyZXR1cm4gMHgxZjgwOworCX0KK30KKworI2lmIDAKKwordm9pZCBzZXRfZnB1X2N3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIHNob3J0IGN3ZCApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLmN3ZCA9IGN3ZDsKKwl9IGVsc2UgeworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZCA9ICgobG9uZyljd2QgfCAweGZmZmYwMDAwdSk7CisJfQorfQorCit2b2lkIHNldF9mcHVfc3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgc2hvcnQgc3dkICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3dkID0gc3dkOworCX0gZWxzZSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnNhdmUuc3dkID0gKChsb25nKXN3ZCB8IDB4ZmZmZjAwMDB1KTsKKwl9Cit9CisKK3ZvaWQgc2V0X2ZwdV90d2QoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBzaG9ydCB0d2QgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS50d2QgPSB0d2RfaTM4N190b19meHNyKHR3ZCk7CisJfSBlbHNlIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS50d2QgPSAoKGxvbmcpdHdkIHwgMHhmZmZmMDAwMHUpOworCX0KK30KKworI2VuZGlmICAvKiAgMCAgKi8KKworLyoKKyAqIEZYU1IgZmxvYXRpbmcgcG9pbnQgZW52aXJvbm1lbnQgY29udmVyc2lvbnMuCisgKi8KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfdG9fdXNlciggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmLAorCQkJCQlzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeHNhdmUgKQoreworCXVuc2lnbmVkIGxvbmcgZW52WzddOworCXN0cnVjdCBfZnByZWcgX191c2VyICp0bzsKKwlzdHJ1Y3QgX2ZweHJlZyAqZnJvbTsKKwlpbnQgaTsKKworCWVudlswXSA9ICh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+Y3dkIHwgMHhmZmZmMDAwMHVsOworCWVudlsxXSA9ICh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+c3dkIHwgMHhmZmZmMDAwMHVsOworCWVudlsyXSA9IHR3ZF9meHNyX3RvX2kzODcoZnhzYXZlKTsKKwllbnZbM10gPSBmeHNhdmUtPmZpcDsKKwllbnZbNF0gPSBmeHNhdmUtPmZjcyB8ICgodW5zaWduZWQgbG9uZylmeHNhdmUtPmZvcCA8PCAxNik7CisJZW52WzVdID0gZnhzYXZlLT5mb287CisJZW52WzZdID0gZnhzYXZlLT5mb3M7CisKKwlpZiAoIF9fY29weV90b191c2VyKCBidWYsIGVudiwgNyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSApICkKKwkJcmV0dXJuIDE7CisKKwl0byA9ICZidWYtPl9zdFswXTsKKwlmcm9tID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKyssIHRvKyssIGZyb20rKyApIHsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnQgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil0bzsKKwkJdW5zaWduZWQgbG9uZyAqZiA9ICh1bnNpZ25lZCBsb25nICopZnJvbTsKKworCQlpZiAoX19wdXRfdXNlcigqZiwgdCkgfHwKKwkJCQlfX3B1dF91c2VyKCooZiArIDEpLCB0ICsgMSkgfHwKKwkJCQlfX3B1dF91c2VyKGZyb20tPmV4cG9uZW50LCAmdG8tPmV4cG9uZW50KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKCBzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeHNhdmUsCisJCQkJCSAgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZweHJlZyAqdG87CisJc3RydWN0IF9mcHJlZyBfX3VzZXIgKmZyb207CisJaW50IGk7CisKKwlpZiAoIF9fY29weV9mcm9tX3VzZXIoIGVudiwgYnVmLCA3ICogc2l6ZW9mKGxvbmcpICkgKQorCQlyZXR1cm4gMTsKKworCWZ4c2F2ZS0+Y3dkID0gKHVuc2lnbmVkIHNob3J0KShlbnZbMF0gJiAweGZmZmYpOworCWZ4c2F2ZS0+c3dkID0gKHVuc2lnbmVkIHNob3J0KShlbnZbMV0gJiAweGZmZmYpOworCWZ4c2F2ZS0+dHdkID0gdHdkX2kzODdfdG9fZnhzcigodW5zaWduZWQgc2hvcnQpKGVudlsyXSAmIDB4ZmZmZikpOworCWZ4c2F2ZS0+ZmlwID0gZW52WzNdOworCWZ4c2F2ZS0+Zm9wID0gKHVuc2lnbmVkIHNob3J0KSgoZW52WzRdICYgMHhmZmZmMDAwMHVsKSA+PiAxNik7CisJZnhzYXZlLT5mY3MgPSAoZW52WzRdICYgMHhmZmZmKTsKKwlmeHNhdmUtPmZvbyA9IGVudls1XTsKKwlmeHNhdmUtPmZvcyA9IGVudls2XTsKKworCXRvID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZyb20gPSAmYnVmLT5fc3RbMF07CisJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKywgdG8rKywgZnJvbSsrICkgeworCQl1bnNpZ25lZCBsb25nICp0ID0gKHVuc2lnbmVkIGxvbmcgKil0bzsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmYgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilmcm9tOworCisJCWlmIChfX2dldF91c2VyKCp0LCBmKSB8fAorCQkJCV9fZ2V0X3VzZXIoKih0ICsgMSksIGYgKyAxKSB8fAorCQkJCV9fZ2V0X3VzZXIodG8tPmV4cG9uZW50LCAmZnJvbS0+ZXhwb25lbnQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2lnbmFsIGZyYW1lIGhhbmRsZXJzLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNhdmVfaTM4N19mc2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwl1bmxhenlfZnB1KCB0c2sgKTsKKwl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN0YXR1cyA9IHRzay0+dGhyZWFkLmkzODcuZnNhdmUuc3dkOworCWlmICggX19jb3B5X3RvX3VzZXIoIGJ1ZiwgJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaTM4N19mc2F2ZV9zdHJ1Y3QpICkgKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9pMzg3X2Z4c2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IGVyciA9IDA7CisKKwl1bmxhenlfZnB1KCB0c2sgKTsKKworCWlmICggY29udmVydF9meHNyX3RvX3VzZXIoIGJ1ZiwgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlICkgKQorCQlyZXR1cm4gLTE7CisKKwllcnIgfD0gX19wdXRfdXNlciggdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3dkLCAmYnVmLT5zdGF0dXMgKTsKKwllcnIgfD0gX19wdXRfdXNlciggWDg2X0ZYU1JfTUFHSUMsICZidWYtPm1hZ2ljICk7CisJaWYgKCBlcnIgKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIF9fY29weV90b191c2VyKCAmYnVmLT5fZnhzcl9lbnZbMF0sICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpICkgKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKK2ludCBzYXZlX2kzODcoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJaWYgKCAhdXNlZF9tYXRoKCkgKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgd2lsbCBjYXVzZSBhICJmaW5pdCIgdG8gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBuZXh0CisJICogYXR0ZW1wdGVkIEZQVSBvcGVyYXRpb24gYnkgdGhlICdjdXJyZW50JyBwcm9jZXNzLgorCSAqLworCWNsZWFyX3VzZWRfbWF0aCgpOworCisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJcmV0dXJuIHNhdmVfaTM4N19meHNhdmUoIGJ1ZiApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHNhdmVfaTM4N19mc2F2ZSggYnVmICk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gc2F2ZV9pMzg3X3NvZnQoICZjdXJyZW50LT50aHJlYWQuaTM4Ny5zb2Z0LCBidWYgKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc3RvcmVfaTM4N19mc2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJY2xlYXJfZnB1KCB0c2sgKTsKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsIGJ1ZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdCkgKTsKK30KKworc3RhdGljIGludCByZXN0b3JlX2kzODdfZnhzYXZlKCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYgKQoreworCWludCBlcnI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWNsZWFyX2ZwdSggdHNrICk7CisJZXJyID0gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCAmYnVmLT5fZnhzcl9lbnZbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpICk7CisJLyogbXhjc3IgcmVzZXJ2ZWQgYml0cyBtdXN0IGJlIG1hc2tlZCB0byB6ZXJvIGZvciBzZWN1cml0eSByZWFzb25zICovCisJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOworCXJldHVybiBlcnIgPyAxIDogY29udmVydF9meHNyX2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCBidWYgKTsKK30KKworaW50IHJlc3RvcmVfaTM4Nyggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlpbnQgZXJyOworCisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJZXJyID0gcmVzdG9yZV9pMzg3X2Z4c2F2ZSggYnVmICk7CisJCX0gZWxzZSB7CisJCQllcnIgPSByZXN0b3JlX2kzODdfZnNhdmUoIGJ1ZiApOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcmVzdG9yZV9pMzg3X3NvZnQoICZjdXJyZW50LT50aHJlYWQuaTM4Ny5zb2Z0LCBidWYgKTsKKwl9CisJc2V0X3VzZWRfbWF0aCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwdHJhY2UgcmVxdWVzdCBoYW5kbGVycy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnByZWdzX2ZzYXZlKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCXJldHVybiBfX2NvcHlfdG9fdXNlciggYnVmLCAmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9mcHJlZ3NfZnhzYXZlKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlyZXR1cm4gY29udmVydF9meHNyX3RvX3VzZXIoIChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopYnVmLAorCQkJCSAgICAgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlICk7Cit9CisKK2ludCBnZXRfZnByZWdzKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggSEFWRV9IV0ZQICkgeworCQlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJCXJldHVybiBnZXRfZnByZWdzX2Z4c2F2ZSggYnVmLCB0c2sgKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBnZXRfZnByZWdzX2ZzYXZlKCBidWYsIHRzayApOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNhdmVfaTM4N19zb2Z0KCAmdHNrLT50aHJlYWQuaTM4Ny5zb2Z0LAorCQkJCSAgICAgICAoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqKWJ1ZiApOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgc2V0X2ZwcmVnc19mc2F2ZSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmICkKK3sKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsIGJ1ZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSApOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZXRfZnByZWdzX2Z4c2F2ZSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiApCit7CisJcmV0dXJuIGNvbnZlcnRfZnhzcl9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCQkgICAgICAgKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilidWYgKTsKK30KKworaW50IHNldF9mcHJlZ3MoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiApCit7CisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJcmV0dXJuIHNldF9mcHJlZ3NfZnhzYXZlKCB0c2ssIGJ1ZiApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHNldF9mcHJlZ3NfZnNhdmUoIHRzaywgYnVmICk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gcmVzdG9yZV9pMzg3X3NvZnQoICZ0c2stPnRocmVhZC5pMzg3LnNvZnQsCisJCQkJCSAgKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilidWYgKTsKKwl9Cit9CisKK2ludCBnZXRfZnB4cmVncyggc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJaWYgKF9fY29weV90b191c2VyKCBidWYsICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlPOworCX0KK30KKworaW50IHNldF9mcHhyZWdzKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYgKQoreworCWludCByZXQgPSAwOworCisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCWlmIChfX2NvcHlfZnJvbV91c2VyKCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsIGJ1ZiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkgKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCS8qIG14Y3NyIHJlc2VydmVkIGJpdHMgbXVzdCBiZSBtYXNrZWQgdG8gemVybyBmb3Igc2VjdXJpdHkgcmVhc29ucyAqLworCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzciAmPSBteGNzcl9mZWF0dXJlX21hc2s7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZQVSBzdGF0ZSBmb3IgY29yZSBkdW1wcy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcHVfZnNhdmUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0ICpmcHUgKQoreworCW1lbWNweSggZnB1LCAmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwKKwkJc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcHVfZnhzYXZlKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCAqZnB1ICkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdG87CisJdW5zaWduZWQgc2hvcnQgKmZyb207CisJaW50IGk7CisKKwltZW1jcHkoIGZwdSwgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCA3ICogc2l6ZW9mKGxvbmcpICk7CisKKwl0byA9ICh1bnNpZ25lZCBzaG9ydCAqKSZmcHUtPnN0X3NwYWNlWzBdOworCWZyb20gPSAodW5zaWduZWQgc2hvcnQgKikmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3Rfc3BhY2VbMF07CisJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKywgdG8gKz0gNSwgZnJvbSArPSA4ICkgeworCQltZW1jcHkoIHRvLCBmcm9tLCA1ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSApOworCX0KK30KKworaW50IGR1bXBfZnB1KCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgKmZwdSApCit7CisJaW50IGZwdmFsaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJZnB2YWxpZCA9ICEhdXNlZF9tYXRoKCk7CisJaWYgKCBmcHZhbGlkICkgeworCQl1bmxhenlfZnB1KCB0c2sgKTsKKwkJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCQljb3B5X2ZwdV9meHNhdmUoIHRzaywgZnB1ICk7CisJCX0gZWxzZSB7CisJCQljb3B5X2ZwdV9mc2F2ZSggdHNrLCBmcHUgKTsKKwkJfQorCX0KKworCXJldHVybiBmcHZhbGlkOworfQorCitpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgKmZwdSkKK3sKKwlpbnQgZnB2YWxpZCA9ICEhdHNrX3VzZWRfbWF0aCh0c2spOworCisJaWYgKGZwdmFsaWQpIHsKKwkJaWYgKHRzayA9PSBjdXJyZW50KQorCQkJdW5sYXp5X2ZwdSh0c2spOworCQlpZiAoY3B1X2hhc19meHNyKQorCQkJY29weV9mcHVfZnhzYXZlKHRzaywgZnB1KTsKKwkJZWxzZQorCQkJY29weV9mcHVfZnNhdmUodHNrLCBmcHUpOworCX0KKwlyZXR1cm4gZnB2YWxpZDsKK30KKworaW50IGR1bXBfdGFza19leHRlbmRlZF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmcHUpCit7CisJaW50IGZwdmFsaWQgPSB0c2tfdXNlZF9tYXRoKHRzaykgJiYgY3B1X2hhc19meHNyOworCisJaWYgKGZwdmFsaWQpIHsKKwkJaWYgKHRzayA9PSBjdXJyZW50KQorCQkgICAgICAgdW5sYXp5X2ZwdSh0c2spOworCQltZW1jcHkoZnB1LCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsIHNpemVvZigqZnB1KSk7CisJfQorCXJldHVybiBmcHZhbGlkOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGJlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKQEAgLTAsMCArMSw0MjkgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vODI1M3BpdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPGlvX3BvcnRzLmg+CisKKy8qCisgKiBUaGlzIGlzIHRoZSAnbGVnYWN5JyA4MjU5QSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIsCisgKiBwcmVzZW50IGluIHRoZSBtYWpvcml0eSBvZiBQQy9BVCBib3hlcy4KKyAqIHBsdXMgc29tZSBnZW5lcmljIHg4NiBzcGVjaWZpYyB0aGluZ3MgaWYgZ2VuZXJpYyBzcGVjaWZpY3MgbWFrZXMKKyAqIGFueSBzZW5zZSBhdCBhbGwuCisgKiB0aGlzIGZpbGUgc2hvdWxkIGJlY29tZSBhcmNoL2kzODYva2VybmVsL2lycS5jIHdoZW4gdGhlIG9sZCBpcnEuYworICogbW92ZXMgdG8gYXJjaCBpbmRlcGVuZGVudCBsYW5kCisgKi8KKworREVGSU5FX1NQSU5MT0NLKGk4MjU5QV9sb2NrKTsKKworc3RhdGljIHZvaWQgZW5kXzgyNTlBX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSAmJgorCQkJCQkJCWlycV9kZXNjW2lycV0uYWN0aW9uKQorCQllbmFibGVfODI1OUFfaXJxKGlycSk7Cit9CisKKyNkZWZpbmUgc2h1dGRvd25fODI1OUFfaXJxCWRpc2FibGVfODI1OUFfaXJxCisKK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja184MjU5QSh1bnNpZ25lZCBpbnQpOworCit1bnNpZ25lZCBpbnQgc3RhcnR1cF84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sgCisJZW5hYmxlXzgyNTlBX2lycShpcnEpOworCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaTgyNTlBX2lycV90eXBlID0geworCS50eXBlbmFtZSA9ICJYVC1QSUMiLAorCS5zdGFydHVwID0gc3RhcnR1cF84MjU5QV9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25fODI1OUFfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV84MjU5QV9pcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QSwKKwkuZW5kID0gZW5kXzgyNTlBX2lycSwKK307CisKKy8qCisgKiA4MjU5QSBQSUMgZnVuY3Rpb25zIHRvIGhhbmRsZSBJU0EgZGV2aWNlczoKKyAqLworCisvKgorICogVGhpcyBjb250YWlucyB0aGUgaXJxIG1hc2sgZm9yIGJvdGggODI1OUEgaXJxIGNvbnRyb2xsZXJzLAorICovCit1bnNpZ25lZCBpbnQgY2FjaGVkX2lycV9tYXNrID0gMHhmZmZmOworCisvKgorICogTm90IGFsbCBJUlFzIGNhbiBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgSU8tQVBJQywgZWcuIG9uIGNlcnRhaW4gKG9sZGVyKQorICogYm9hcmRzIHRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgbm90IHJlYWxseSBjb25uZWN0ZWQgdG8gYW55IElPLUFQSUMgcGluLAorICogaXQncyBmZWQgdG8gdGhlIG1hc3RlciA4MjU5QSdzIElSMCBsaW5lIG9ubHkuCisgKgorICogQW55ICcxJyBiaXQgaW4gdGhpcyBtYXNrIG1lYW5zIHRoZSBJUlEgaXMgcm91dGVkIHRocm91Z2ggdGhlIElPLUFQSUMuCisgKiB0aGlzICdtaXhlZCBtb2RlJyBJUlEgaGFuZGxpbmcgY29zdHMgbm90aGluZyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkCisgKiBhdCBJUlEgc2V0dXAgdGltZS4KKyAqLwordW5zaWduZWQgbG9uZyBpb19hcGljX2lycXM7CisKK3ZvaWQgZGlzYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwljYWNoZWRfaXJxX21hc2sgfD0gbWFzazsKKwlpZiAoaXJxICYgOCkKKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgUElDX1NMQVZFX0lNUik7CisJZWxzZQorCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgZW5hYmxlXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gfigxIDw8IGlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCWNhY2hlZF9pcnFfbWFzayAmPSBtYXNrOworCWlmIChpcnEgJiA4KQorCQlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsKKwllbHNlCisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGk4MjU5QV9pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMTw8aXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCWlmIChpcnEgPCA4KQorCQlyZXQgPSBpbmIoUElDX01BU1RFUl9DTUQpICYgbWFzazsKKwllbHNlCisJCXJldCA9IGluYihQSUNfU0xBVkVfQ01EKSAmIChtYXNrID4+IDgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1ha2VfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJaW9fYXBpY19pcnFzICY9IH4oMTw8aXJxKTsKKwlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmaTgyNTlBX2lycV90eXBlOworCWVuYWJsZV9pcnEoaXJxKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0byBiZSBjYWxsZWQgcmFyZWx5LiBTd2l0Y2hpbmcgYmV0d2VlbgorICogODI1OUEgcmVnaXN0ZXJzIGlzIHNsb3cuCisgKiBUaGlzIGhhcyB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIGlycSBjb250cm9sbGVyIHNwaW5sb2NrCisgKiBiZWZvcmUgYmVpbmcgY2FsbGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBpODI1OUFfaXJxX3JlYWwodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgdmFsdWU7CisJaW50IGlycW1hc2sgPSAxPDxpcnE7CisKKwlpZiAoaXJxIDwgOCkgeworCQlvdXRiKDB4MEIsUElDX01BU1RFUl9DTUQpOwkvKiBJU1IgcmVnaXN0ZXIgKi8KKwkJdmFsdWUgPSBpbmIoUElDX01BU1RFUl9DTUQpICYgaXJxbWFzazsKKwkJb3V0YigweDBBLFBJQ19NQVNURVJfQ01EKTsJLyogYmFjayB0byB0aGUgSVJSIHJlZ2lzdGVyICovCisJCXJldHVybiB2YWx1ZTsKKwl9CisJb3V0YigweDBCLFBJQ19TTEFWRV9DTUQpOwkvKiBJU1IgcmVnaXN0ZXIgKi8KKwl2YWx1ZSA9IGluYihQSUNfU0xBVkVfQ01EKSAmIChpcnFtYXNrID4+IDgpOworCW91dGIoMHgwQSxQSUNfU0xBVkVfQ01EKTsJLyogYmFjayB0byB0aGUgSVJSIHJlZ2lzdGVyICovCisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogQ2FyZWZ1bCEgVGhlIDgyNTlBIGlzIGEgZnJhZ2lsZSBiZWFzdCwgaXQgcHJldHR5CisgKiBtdWNoIF9oYXNfIHRvIGJlIGRvbmUgZXhhY3RseSBsaWtlIHRoaXMgKG1hc2sgaXQKKyAqIGZpcnN0LCBfdGhlbl8gc2VuZCB0aGUgRU9JLCBhbmQgdGhlIG9yZGVyIG9mIEVPSQorICogdG8gdGhlIHR3byA4MjU5cyBpcyBpbXBvcnRhbnQhCisgKi8KK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja184MjU5QSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBpcnFtYXNrID0gMSA8PCBpcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCS8qCisJICogTGlnaHR3ZWlnaHQgc3B1cmlvdXMgSVJRIGRldGVjdGlvbi4gV2UgZG8gbm90IHdhbnQKKwkgKiB0byBvdmVyZG8gc3B1cmlvdXMgSVJRIGhhbmRsaW5nIC0gaXQncyB1c3VhbGx5IGEgc2lnbgorCSAqIG9mIGhhcmR3YXJlIHByb2JsZW1zLCBzbyB3ZSBvbmx5IGRvIHRoZSBjaGVja3Mgd2UgY2FuCisJICogZG8gd2l0aG91dCBzbG93aW5nIGRvd24gZ29vZCBoYXJkd2FyZSB1bm5lY2Vzc2VyaWx5LgorCSAqCisJICogTm90ZSB0aGF0IElSUTcgYW5kIElSUTE1ICh0aGUgdHdvIHNwdXJpb3VzIElSUXMKKwkgKiB1c3VhbGx5IHJlc3VsdGluZyBmcm9tIHRoZSA4MjU5QS0xfDIgUElDcykgb2NjdXIKKwkgKiBldmVuIGlmIHRoZSBJUlEgaXMgbWFza2VkIGluIHRoZSA4MjU5QS4gVGh1cyB3ZQorCSAqIGNhbiBjaGVjayBzcHVyaW91cyA4MjU5QSBJUlFzIHdpdGhvdXQgZG9pbmcgdGhlCisJICogcXVpdGUgc2xvdyBpODI1OUFfaXJxX3JlYWwoKSBjYWxsIGZvciBldmVyeSBJUlEuCisJICogVGhpcyBkb2VzIG5vdCBjb3ZlciAxMDAlIG9mIHNwdXJpb3VzIGludGVycnVwdHMsCisJICogYnV0IHNob3VsZCBiZSBlbm91Z2ggdG8gd2FybiB0aGUgdXNlciB0aGF0IHRoZXJlCisJICogaXMgc29tZXRoaW5nIGJhZCBnb2luZyBvbiAuLi4KKwkgKi8KKwlpZiAoY2FjaGVkX2lycV9tYXNrICYgaXJxbWFzaykKKwkJZ290byBzcHVyaW91c184MjU5QV9pcnE7CisJY2FjaGVkX2lycV9tYXNrIHw9IGlycW1hc2s7CisKK2hhbmRsZV9yZWFsX2lycToKKwlpZiAoaXJxICYgOCkgeworCQlpbmIoUElDX1NMQVZFX0lNUik7CS8qIERVTU1ZIC0gKGRvIHdlIG5lZWQgdGhpcz8pICovCisJCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIFBJQ19TTEFWRV9JTVIpOworCQlvdXRiKDB4NjArKGlycSY3KSxQSUNfU0xBVkVfQ01EKTsvKiAnU3BlY2lmaWMgRU9JJyB0byBzbGF2ZSAqLworCQlvdXRiKDB4NjArUElDX0NBU0NBREVfSVIsUElDX01BU1RFUl9DTUQpOyAvKiAnU3BlY2lmaWMgRU9JJyB0byBtYXN0ZXItSVJRMiAqLworCX0gZWxzZSB7CisJCWluYihQSUNfTUFTVEVSX0lNUik7CS8qIERVTU1ZIC0gKGRvIHdlIG5lZWQgdGhpcz8pICovCisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7CisJCW91dGIoMHg2MCtpcnEsUElDX01BU1RFUl9DTUQpOwkvKiAnU3BlY2lmaWMgRU9JIHRvIG1hc3RlciAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCXJldHVybjsKKworc3B1cmlvdXNfODI1OUFfaXJxOgorCS8qCisJICogdGhpcyBpcyB0aGUgc2xvdyBwYXRoIC0gc2hvdWxkIGhhcHBlbiByYXJlbHkuCisJICovCisJaWYgKGk4MjU5QV9pcnFfcmVhbChpcnEpKQorCQkvKgorCQkgKiBvb3BzLCB0aGUgSVJRIF9pc18gaW4gc2VydmljZSBhY2NvcmRpbmcgdG8gdGhlCisJCSAqIDgyNTlBIC0gbm90IHNwdXJpb3VzLCBnbyBoYW5kbGUgaXQuCisJCSAqLworCQlnb3RvIGhhbmRsZV9yZWFsX2lycTsKKworCXsKKwkJc3RhdGljIGludCBzcHVyaW91c19pcnFfbWFzazsKKwkJLyoKKwkJICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgSVJRIGlzIHNwdXJpb3VzLAorCQkgKiBsZXRzIEFDSyBhbmQgcmVwb3J0IGl0LiBbb25jZSBwZXIgSVJRXQorCQkgKi8KKwkJaWYgKCEoc3B1cmlvdXNfaXJxX21hc2sgJiBpcnFtYXNrKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNwdXJpb3VzIDgyNTlBIGludGVycnVwdDogSVJRJWQuXG4iLCBpcnEpOworCQkJc3B1cmlvdXNfaXJxX21hc2sgfD0gaXJxbWFzazsKKwkJfQorCQlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKwkJLyoKKwkJICogVGhlb3JldGljYWxseSB3ZSBkbyBub3QgaGF2ZSB0byBoYW5kbGUgdGhpcyBJUlEsCisJCSAqIGJ1dCBpbiBMaW51eCB0aGlzIGRvZXMgbm90IGNhdXNlIHByb2JsZW1zIGFuZCBpcworCQkgKiBzaW1wbGVyIGZvciB1cy4KKwkJICovCisJCWdvdG8gaGFuZGxlX3JlYWxfaXJxOworCX0KK30KKworc3RhdGljIGNoYXIgaXJxX3RyaWdnZXJbMl07CisvKioKKyAqIEVMQ1IgcmVnaXN0ZXJzICgweDRkMCwgMHg0ZDEpIGNvbnRyb2wgZWRnZS9sZXZlbCBvZiBJUlEKKyAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9FTENSKGNoYXIgKnRyaWdnZXIpCit7CisJb3V0Yih0cmlnZ2VyWzBdLCAweDRkMCk7CisJb3V0Yih0cmlnZ2VyWzFdLCAweDRkMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfRUxDUihjaGFyICp0cmlnZ2VyKQoreworCS8qIElSUSAwLDEsMiw4LDEzIGFyZSBtYXJrZWQgYXMgcmVzZXJ2ZWQgKi8KKwl0cmlnZ2VyWzBdID0gaW5iKDB4NGQwKSAmIDB4Rjg7CisJdHJpZ2dlclsxXSA9IGluYigweDRkMSkgJiAweERFOworfQorCitzdGF0aWMgaW50IGk4MjU5QV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpbml0XzgyNTlBKDApOworCXJlc3RvcmVfRUxDUihpcnFfdHJpZ2dlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgyNTlBX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCXNhdmVfRUxDUihpcnFfdHJpZ2dlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGk4MjU5X3N5c2Rldl9jbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJpODI1OSIpLAorCS5zdXNwZW5kID0gaTgyNTlBX3N1c3BlbmQsCisJLnJlc3VtZSA9IGk4MjU5QV9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmaTgyNTlfc3lzZGV2X2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTgyNTlBX2luaXRfc3lzZnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmk4MjU5X3N5c2Rldl9jbGFzcyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pODI1OUEpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKGk4MjU5QV9pbml0X3N5c2ZzKTsKKwordm9pZCBpbml0XzgyNTlBKGludCBhdXRvX2VvaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlvdXRiKDB4ZmYsIFBJQ19NQVNURVJfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLworCW91dGIoMHhmZiwgUElDX1NMQVZFX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTIgKi8KKworCS8qCisJICogb3V0Yl9wIC0gdGhpcyBoYXMgdG8gd29yayBvbiBhIHdpZGUgcmFuZ2Ugb2YgUEMgaGFyZHdhcmUuCisJICovCisJb3V0Yl9wKDB4MTEsIFBJQ19NQVNURVJfQ01EKTsJLyogSUNXMTogc2VsZWN0IDgyNTlBLTEgaW5pdCAqLworCW91dGJfcCgweDIwICsgMCwgUElDX01BU1RFUl9JTVIpOwkvKiBJQ1cyOiA4MjU5QS0xIElSMC03IG1hcHBlZCB0byAweDIwLTB4MjcgKi8KKwlvdXRiX3AoMVUgPDwgUElDX0NBU0NBREVfSVIsIFBJQ19NQVNURVJfSU1SKTsJLyogODI1OUEtMSAodGhlIG1hc3RlcikgaGFzIGEgc2xhdmUgb24gSVIyICovCisJaWYgKGF1dG9fZW9pKQkvKiBtYXN0ZXIgZG9lcyBBdXRvIEVPSSAqLworCQlvdXRiX3AoTUFTVEVSX0lDVzRfREVGQVVMVCB8IFBJQ19JQ1c0X0FFT0ksIFBJQ19NQVNURVJfSU1SKTsKKwllbHNlCQkvKiBtYXN0ZXIgZXhwZWN0cyBub3JtYWwgRU9JICovCisJCW91dGJfcChNQVNURVJfSUNXNF9ERUZBVUxULCBQSUNfTUFTVEVSX0lNUik7CisKKwlvdXRiX3AoMHgxMSwgUElDX1NMQVZFX0NNRCk7CS8qIElDVzE6IHNlbGVjdCA4MjU5QS0yIGluaXQgKi8KKwlvdXRiX3AoMHgyMCArIDgsIFBJQ19TTEFWRV9JTVIpOwkvKiBJQ1cyOiA4MjU5QS0yIElSMC03IG1hcHBlZCB0byAweDI4LTB4MmYgKi8KKwlvdXRiX3AoUElDX0NBU0NBREVfSVIsIFBJQ19TTEFWRV9JTVIpOwkvKiA4MjU5QS0yIGlzIGEgc2xhdmUgb24gbWFzdGVyJ3MgSVIyICovCisJb3V0Yl9wKFNMQVZFX0lDVzRfREVGQVVMVCwgUElDX1NMQVZFX0lNUik7IC8qIChzbGF2ZSdzIHN1cHBvcnQgZm9yIEFFT0kgaW4gZmxhdCBtb2RlIGlzIHRvIGJlIGludmVzdGlnYXRlZCkgKi8KKwlpZiAoYXV0b19lb2kpCisJCS8qCisJCSAqIGluIEFFT0kgbW9kZSB3ZSBqdXN0IGhhdmUgdG8gbWFzayB0aGUgaW50ZXJydXB0CisJCSAqIHdoZW4gYWNraW5nLgorCQkgKi8KKwkJaTgyNTlBX2lycV90eXBlLmFjayA9IGRpc2FibGVfODI1OUFfaXJxOworCWVsc2UKKwkJaTgyNTlBX2lycV90eXBlLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QTsKKworCXVkZWxheSgxMDApOwkJLyogd2FpdCBmb3IgODI1OUEgdG8gaW5pdGlhbGl6ZSAqLworCisJb3V0YihjYWNoZWRfbWFzdGVyX21hc2ssIFBJQ19NQVNURVJfSU1SKTsgLyogcmVzdG9yZSBtYXN0ZXIgSVJRIG1hc2sgKi8KKwlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsJICAvKiByZXN0b3JlIHNsYXZlIElSUSBtYXNrICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogTm90ZSB0aGF0IG9uIGEgNDg2LCB3ZSBkb24ndCB3YW50IHRvIGRvIGEgU0lHRlBFIG9uIGFuIGlycTEzCisgKiBhcyB0aGUgaXJxIGlzIHVucmVsaWFibGUsIGFuZCBleGNlcHRpb24gMTYgd29ya3MgY29ycmVjdGx5CisgKiAoaWUgYXMgZXhwbGFpbmVkIGluIHRoZSBpbnRlbCBsaXRlcmF0dXJlKS4gT24gYSAzODYsIHlvdQorICogY2FuJ3QgdXNlIGV4Y2VwdGlvbiAxNiBkdWUgdG8gYmFkIElCTSBkZXNpZ24sIHNvIHdlIGhhdmUgdG8KKyAqIHJlbHkgb24gdGhlIGxlc3MgZXhhY3QgaXJxMTMuCisgKgorICogQ2FyZWZ1bC4uIE5vdCBvbmx5IGlzIElSUTEzIHVucmVsaWFibGUsIGJ1dCBpdCBpcyBhbHNvCisgKiBsZWFkcyB0byByYWNlcy4gSUJNIGRlc2lnbmVycyB3aG8gY2FtZSB1cCB3aXRoIGl0IHNob3VsZAorICogYmUgc2hvdC4KKyAqLworIAorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWF0aF9lcnJvcl9pcnEoaW50IGNwbCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlleHRlcm4gdm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICopOworCW91dGIoMCwweEYwKTsKKwlpZiAoaWdub3JlX2ZwdV9pcnEgfHwgIWJvb3RfY3B1X2RhdGEuaGFyZF9tYXRoKQorCQlyZXR1cm4gSVJRX05PTkU7CisJbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5laXApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIE5ldyBtb3RoZXJib2FyZHMgc29tZXRpbWVzIG1ha2UgSVJRIDEzIGJlIGEgUENJIGludGVycnVwdCwKKyAqIHNvIGFsbG93IGludGVycnVwdCBzaGFyaW5nLgorICovCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBmcHVfaXJxID0geyBtYXRoX2Vycm9yX2lycSwgMCwgQ1BVX01BU0tfTk9ORSwgImZwdSIsIE5VTEwsIE5VTEwgfTsKKwordm9pZCBfX2luaXQgaW5pdF9JU0FfaXJxcyAodm9pZCkKK3sKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWluaXRfYnNwX0FQSUMoKTsKKyNlbmRpZgorCWluaXRfODI1OUEoMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKKwkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKKwkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOworCisJCWlmIChpIDwgMTYpIHsKKwkJCS8qCisJCQkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHRzOgorCQkJICovCisJCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJmk4MjU5QV9pcnFfdHlwZTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAnaGlnaCcgUENJIElSUXMgZmlsbGVkIGluIG9uIGRlbWFuZAorCQkJICovCisJCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJm5vX2lycV90eXBlOworCQl9CisJfQorfQorCit2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoreworCWludCBpOworCisJLyogYWxsIHRoZSBzZXQgdXAgYmVmb3JlIHRoZSBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAqLworCXByZV9pbnRyX2luaXRfaG9vaygpOworCisJLyoKKwkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQorCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQorCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKE5SX1ZFQ1RPUlMgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOyBpKyspIHsKKwkJaW50IHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIGk7CisJCWlmIChpID49IE5SX0lSUVMpCisJCQlicmVhazsKKwkJaWYgKHZlY3RvciAhPSBTWVNDQUxMX1ZFQ1RPUikgCisJCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2ldKTsKKwl9CisKKwkvKiBzZXR1cCBhZnRlciBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAodXN1YWxseSBhZGQgaW4KKwkgKiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGdhdGVzKQorCSAqLworCWludHJfaW5pdF9ob29rKCk7CisKKwkvKgorCSAqIFNldCB0aGUgY2xvY2sgdG8gSFogSHosIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkCisJICogdmVjdG9yIG5vdzoKKwkgKi8KKwlzZXR1cF9waXRfdGltZXIoKTsKKworCS8qCisJICogRXh0ZXJuYWwgRlBVPyBTZXQgdXAgaXJxMTMgaWYgc28sIGZvcgorCSAqIG9yaWdpbmFsIGJyYWluZGFtYWdlZCBJQk0gRkVSUiBjb3VwbGluZy4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS5oYXJkX21hdGggJiYgIWNwdV9oYXNfZnB1KQorCQlzZXR1cF9pcnEoRlBVX0lSUSwgJmZwdV9pcnEpOworCisJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FhOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZnNfc3RydWN0IGluaXRfZnMgPSBJTklUX0ZTOworc3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IElOSVRfRklMRVM7CitzdGF0aWMgc3RydWN0IHNpZ25hbF9zdHJ1Y3QgaW5pdF9zaWduYWxzID0gSU5JVF9TSUdOQUxTKGluaXRfc2lnbmFscyk7CitzdGF0aWMgc3RydWN0IHNpZ2hhbmRfc3RydWN0IGluaXRfc2lnaGFuZCA9IElOSVRfU0lHSEFORChpbml0X3NpZ2hhbmQpOworc3RydWN0IG1tX3N0cnVjdCBpbml0X21tID0gSU5JVF9NTShpbml0X21tKTsKKworRVhQT1JUX1NZTUJPTChpbml0X21tKTsKKworLyoKKyAqIEluaXRpYWwgdGhyZWFkIHN0cnVjdHVyZS4KKyAqCisgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgVEhSRUFEX1NJWkUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCisgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KKyAqLwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIAorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KKwkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKKworLyoKKyAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCisgKgorICogQWxsIG90aGVyIHRhc2sgc3RydWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBvbiBzbGFicyBpbiBmb3JrLmMKKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOworCitFWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7CisKKy8qCisgKiBwZXItQ1BVIFRTUyBzZWdtZW50cy4gVGhyZWFkcyBhcmUgY29tcGxldGVseSAnc29mdCcgb24gTGludXgsCisgKiBubyBtb3JlIHBlci10YXNrIFRTUydzLgorICovIAorREVGSU5FX1BFUl9DUFUoc3RydWN0IHRzc19zdHJ1Y3QsIGluaXRfdHNzKSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wID0gSU5JVF9UU1M7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMzUwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC0wLDAgKzEsMjU0NSBAQAorLyoKKyAqCUludGVsIElPLUFQSUMgc3VwcG9ydCBmb3IgbXVsdGktUGVudGl1bSBob3N0cy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIsIEhham5hbGthIFN6YWJvCisgKgorICoJTWFueSB0aGFua3MgdG8gU3RpZyBWZW5hYXMgZm9yIHRyeWluZyBvdXQgY291bnRsZXNzIGV4cGVyaW1lbnRhbAorICoJcGF0Y2hlcyBhbmQgcmVwb3J0aW5nL2RlYnVnZ2luZyBwcm9ibGVtcyBwYXRpZW50bHkhCisgKgorICoJKGMpIDE5OTksIE11bHRpcGxlIElPLUFQSUMgc3VwcG9ydCwgZGV2ZWxvcGVkIGJ5CisgKglLZW4taWNoaSBZYWt1IDx5YWt1QGNzczEua2JuZXMubmVjLmNvLmpwPiBhbmQKKyAqICAgICAgSGlkZW1pIEtpc2hpbW90byA8a2lzaW1vdG9AY3NzMS5rYm5lcy5uZWMuY28uanA+LAorICoJZnVydGhlciB0ZXN0ZWQgYW5kIGNsZWFuZWQgdXAgYnkgWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglhbmQgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICoJRml4ZXMKKyAqCU1hY2llaiBXLiBSb3p5Y2tpCToJQml0cyBmb3IgZ2VudWluZSA4MjQ4OURYIEFQSUNzOworICoJCQkJCXRoYW5rcyB0byBFcmljIEdpbG1vcmUKKyAqCQkJCQlhbmQgUm9sZiBHLiBUZXdzCisgKgkJCQkJZm9yIHRlc3RpbmcgdGhlc2UgZXh0ZW5zaXZlbHkKKyAqCVBhdWwgRGllZmVuYmF1Z2gJOglBZGRlZCBmdWxsIEFDUEkgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKworI2luY2x1ZGUgImlvX3BvcnRzLmgiCisKK2ludCAoKmlvYXBpY19yZW51bWJlcl9pcnEpKGludCBpb2FwaWMsIGludCBpcnEpOworYXRvbWljX3QgaXJxX21pc19jb3VudDsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhpb2FwaWNfbG9jayk7CisKKy8qCisgKglJcyB0aGUgU2lTIEFQSUMgcm13IGJ1ZyBwcmVzZW50ID8KKyAqCS0xID0gZG9uJ3Qga25vdywgMCA9IG5vLCAxID0geWVzCisgKi8KK2ludCBzaXNfYXBpY19idWcgPSAtMTsKKworLyoKKyAqICMgb2YgSVJRIHJvdXRpbmcgcmVnaXN0ZXJzCisgKi8KK2ludCBucl9pb2FwaWNfcmVnaXN0ZXJzW01BWF9JT19BUElDU107CisKKy8qCisgKiBSb3VnaCBlc3RpbWF0aW9uIG9mIGhvdyBtYW55IHNoYXJlZCBJUlFzIHRoZXJlIGFyZSwgY2FuCisgKiBiZSBjaGFuZ2VkIGFueXRpbWUuCisgKi8KKyNkZWZpbmUgTUFYX1BMVVNfU0hBUkVEX0lSUVMgTlJfSVJRUworI2RlZmluZSBQSU5fTUFQX1NJWkUgKE1BWF9QTFVTX1NIQVJFRF9JUlFTICsgTlJfSVJRUykKKworLyoKKyAqIFRoaXMgaXMgcGVyZm9ybWFuY2UtY3JpdGljYWwsIHdlIHdhbnQgdG8gZG8gaXQgTygxKQorICoKKyAqIHRoZSBpbmRleGluZyBvcmRlciBvZiB0aGlzIGFycmF5IGZhdm9ycyAxOjEgbWFwcGluZ3MKKyAqIGJldHdlZW4gcGlucyBhbmQgSVJRcy4KKyAqLworCitzdGF0aWMgc3RydWN0IGlycV9waW5fbGlzdCB7CisJaW50IGFwaWMsIHBpbiwgbmV4dDsKK30gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CisKK2ludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisjZGVmaW5lIHZlY3Rvcl90b19pcnEodmVjdG9yKSAJXAorCShwbGF0Zm9ybV9sZWdhY3lfaXJxKHZlY3RvcikgPyB2ZWN0b3IgOiB2ZWN0b3JfaXJxW3ZlY3Rvcl0pCisjZWxzZQorI2RlZmluZSB2ZWN0b3JfdG9faXJxKHZlY3RvcikJKHZlY3RvcikKKyNlbmRpZgorCisvKgorICogVGhlIGNvbW1vbiBjYXNlIGlzIDE6MSBJUlE8LT5waW4gbWFwcGluZ3MuIFNvbWV0aW1lcyB0aGVyZSBhcmUKKyAqIHNoYXJlZCBJU0Etc3BhY2UgSVJRcywgc28gd2UgaGF2ZSB0byBzdXBwb3J0IHRoZW0uIFdlIGFyZSBzdXBlcgorICogZmFzdCBpbiB0aGUgY29tbW9uIGNhc2UsIGFuZCBmYXN0IGZvciBzaGFyZWQgSVNBLXNwYWNlIElSUXMuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9waW5fdG9faXJxKHVuc2lnbmVkIGludCBpcnEsIGludCBhcGljLCBpbnQgcGluKQoreworCXN0YXRpYyBpbnQgZmlyc3RfZnJlZV9lbnRyeSA9IE5SX0lSUVM7CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisKKwl3aGlsZSAoZW50cnktPm5leHQpCisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisKKwlpZiAoZW50cnktPnBpbiAhPSAtMSkgeworCQllbnRyeS0+bmV4dCA9IGZpcnN0X2ZyZWVfZW50cnk7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJCWlmICgrK2ZpcnN0X2ZyZWVfZW50cnkgPj0gUElOX01BUF9TSVpFKQorCQkJcGFuaWMoImlvX2FwaWMuYzogd2hvb3BzIik7CisJfQorCWVudHJ5LT5hcGljID0gYXBpYzsKKwllbnRyeS0+cGluID0gcGluOworfQorCisvKgorICogUmVyb3V0ZSBhbiBJUlEgdG8gYSBkaWZmZXJlbnQgcGluLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcmVwbGFjZV9waW5fYXRfaXJxKHVuc2lnbmVkIGludCBpcnEsCisJCQkJICAgICAgaW50IG9sZGFwaWMsIGludCBvbGRwaW4sCisJCQkJICAgICAgaW50IG5ld2FwaWMsIGludCBuZXdwaW4pCit7CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZW50cnktPmFwaWMgPT0gb2xkYXBpYyAmJiBlbnRyeS0+cGluID09IG9sZHBpbikgeworCQkJZW50cnktPmFwaWMgPSBuZXdhcGljOworCQkJZW50cnktPnBpbiA9IG5ld3BpbjsKKwkJfQorCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX21vZGlmeV9JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgbG9uZyBlbmFibGUsIHVuc2lnbmVkIGxvbmcgZGlzYWJsZSkKK3sKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGlycTsKKwl1bnNpZ25lZCBpbnQgcGluLCByZWc7CisKKwlmb3IgKDs7KSB7CisJCXBpbiA9IGVudHJ5LT5waW47CisJCWlmIChwaW4gPT0gLTEpCisJCQlicmVhazsKKwkJcmVnID0gaW9fYXBpY19yZWFkKGVudHJ5LT5hcGljLCAweDEwICsgcGluKjIpOworCQlyZWcgJj0gfmRpc2FibGU7CisJCXJlZyB8PSBlbmFibGU7CisJCWlvX2FwaWNfbW9kaWZ5KGVudHJ5LT5hcGljLCAweDEwICsgcGluKjIsIHJlZyk7CisJCWlmICghZW50cnktPm5leHQpCisJCQlicmVhazsKKwkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsKKwl9Cit9CisKKy8qIG1hc2sgPSAxICovCitzdGF0aWMgdm9pZCBfX21hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJX19tb2RpZnlfSU9fQVBJQ19pcnEoaXJxLCAweDAwMDEwMDAwLCAwKTsKK30KKworLyogbWFzayA9IDAgKi8KK3N0YXRpYyB2b2lkIF9fdW5tYXNrX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMCwgMHgwMDAxMDAwMCk7Cit9CisKKy8qIG1hc2sgPSAxLCB0cmlnZ2VyID0gMCAqLworc3RhdGljIHZvaWQgX19tYXNrX2FuZF9lZGdlX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMHgwMDAxMDAwMCwgMHgwMDAwODAwMCk7Cit9CisKKy8qIG1hc2sgPSAwLCB0cmlnZ2VyID0gMSAqLworc3RhdGljIHZvaWQgX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMHgwMDAwODAwMCwgMHgwMDAxMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCV9fbWFza19JT19BUElDX2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFza19JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJX191bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9JT19BUElDX3Bpbih1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHBpbikKK3sKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIENoZWNrIGRlbGl2ZXJ5X21vZGUgdG8gYmUgc3VyZSB3ZSdyZSBub3QgY2xlYXJpbmcgYW4gU01JIHBpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCSooKChpbnQqKSZlbnRyeSkgKyAwKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CisJKigoKGludCopJmVudHJ5KSArIDEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEgKyAyICogcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlmIChlbnRyeS5kZWxpdmVyeV9tb2RlID09IGRlc3RfU01JKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERpc2FibGUgaXQgaW4gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CisJICovCisJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CisJZW50cnkubWFzayA9IDE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAwKSk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAxKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfSU9fQVBJQyAodm9pZCkKK3sKKwlpbnQgYXBpYywgcGluOworCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKKwkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykKKwkJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBjcHVtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBpbjsKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGlycTsKKwl1bnNpZ25lZCBpbnQgYXBpY2lkX3ZhbHVlOworCQorCWFwaWNpZF92YWx1ZSA9IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrKTsKKwkvKiBQcmVwYXJlIHRvIGRvIHRoZSBpb19hcGljX3dyaXRlICovCisJYXBpY2lkX3ZhbHVlID0gYXBpY2lkX3ZhbHVlIDw8IDI0OworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWZvciAoOzspIHsKKwkJcGluID0gZW50cnktPnBpbjsKKwkJaWYgKHBpbiA9PSAtMSkKKwkJCWJyZWFrOworCQlpb19hcGljX3dyaXRlKGVudHJ5LT5hcGljLCAweDEwICsgMSArIHBpbioyLCBhcGljaWRfdmFsdWUpOworCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUlFCQUxBTkNFKQorIyBpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIGtlcm5lbF90aHJlYWQoKSAqLworIyBpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgkvKiBrc3RhdCAqLworIyBpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCkgKi8KKyMgaW5jbHVkZSA8bGludXgvdGltZXIuaD4JLyogdGltZV9hZnRlcigpICovCisgCisjIGlmZGVmIENPTkZJR19CQUxBTkNFRF9JUlFfREVCVUcKKyMgIGRlZmluZSBURHByaW50ayh4Li4uKSBkbyB7IHByaW50aygiPCVsZDolczolZD46ICIsIGppZmZpZXMsIF9fRklMRV9fLCBfX0xJTkVfXyk7IHByaW50ayh4KTsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBEcHJpbnRrKHguLi4pIGRvIHsgVERwcmludGsoeCk7IH0gd2hpbGUgKDApCisjIGVsc2UKKyMgIGRlZmluZSBURHByaW50ayh4Li4uKSAKKyMgIGRlZmluZSBEcHJpbnRrKHguLi4pIAorIyBlbmRpZgorCitjcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbTlJfSVJRU107CisKKyNkZWZpbmUgSVJRQkFMQU5DRV9DSEVDS19BUkNIIC05OTkKK3N0YXRpYyBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlZCA9IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSDsKK3N0YXRpYyBpbnQgcGh5c2ljYWxfYmFsYW5jZSA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NwdV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nICogbGFzdF9pcnE7CisJdW5zaWduZWQgbG9uZyAqIGlycV9kZWx0YTsKKwl1bnNpZ25lZCBsb25nIGlycTsKK30gaXJxX2NwdV9kYXRhW05SX0NQVVNdOworCisjZGVmaW5lIENQVV9JUlEoY3B1KQkJKGlycV9jcHVfZGF0YVtjcHVdLmlycSkKKyNkZWZpbmUgTEFTVF9DUFVfSVJRKGNwdSxpcnEpICAgKGlycV9jcHVfZGF0YVtjcHVdLmxhc3RfaXJxW2lycV0pCisjZGVmaW5lIElSUV9ERUxUQShjcHUsaXJxKSAJKGlycV9jcHVfZGF0YVtjcHVdLmlycV9kZWx0YVtpcnFdKQorCisjZGVmaW5lIElETEVfRU5PVUdIKGNwdSxub3cpIFwKKwkoaWRsZV9jcHUoY3B1KSAmJiAoKG5vdykgLSBwZXJfY3B1KGlycV9zdGF0LCAoY3B1KSkuaWRsZV90aW1lc3RhbXAgPiAxKSkKKworI2RlZmluZSBJUlFfQUxMT1dFRChjcHUsIGFsbG93ZWRfbWFzaykJY3B1X2lzc2V0KGNwdSwgYWxsb3dlZF9tYXNrKQorCisjZGVmaW5lIENQVV9UT19QQUNLQUdFSU5ERVgoaSkgKGZpcnN0X2NwdShjcHVfc2libGluZ19tYXBbaV0pKQorCisjZGVmaW5lIE1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUwJKDUqSFopCisjZGVmaW5lIE1JTl9CQUxBTkNFRF9JUlFfSU5URVJWQUwJKEhaLzIpCisjZGVmaW5lIEJBTEFOQ0VEX0lSUV9NT1JFX0RFTFRBCQkoSFovMTApCisjZGVmaW5lIEJBTEFOQ0VEX0lSUV9MRVNTX0RFTFRBCQkoSFopCisKK3N0YXRpYyBsb25nIGJhbGFuY2VkX2lycV9pbnRlcnZhbCA9IE1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUw7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vdmUoaW50IGN1cnJfY3B1LCBjcHVtYXNrX3QgYWxsb3dlZF9tYXNrLAorCQkJdW5zaWduZWQgbG9uZyBub3csIGludCBkaXJlY3Rpb24pCit7CisJaW50IHNlYXJjaF9pZGxlID0gMTsKKwlpbnQgY3B1ID0gY3Vycl9jcHU7CisKKwlnb3RvIGluc2lkZTsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KGNwdSA9PSBjdXJyX2NwdSkpCisJCQlzZWFyY2hfaWRsZSA9IDA7CitpbnNpZGU6CisJCWlmIChkaXJlY3Rpb24gPT0gMSkgeworCQkJY3B1Kys7CisJCQlpZiAoY3B1ID49IE5SX0NQVVMpCisJCQkJY3B1ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNwdS0tOworCQkJaWYgKGNwdSA9PSAtMSkKKwkJCQljcHUgPSBOUl9DUFVTLTE7CisJCX0KKwl9IHdoaWxlICghY3B1X29ubGluZShjcHUpIHx8ICFJUlFfQUxMT1dFRChjcHUsYWxsb3dlZF9tYXNrKSB8fAorCQkJKHNlYXJjaF9pZGxlICYmICFJRExFX0VOT1VHSChjcHUsbm93KSkpOworCisJcmV0dXJuIGNwdTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJhbGFuY2VfaXJxKGludCBjcHUsIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWNwdW1hc2tfdCBhbGxvd2VkX21hc2s7CisJdW5zaWduZWQgaW50IG5ld19jcHU7CisJCQorCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkKQorCQlyZXR1cm47IAorCisJY3B1c19hbmQoYWxsb3dlZF9tYXNrLCBjcHVfb25saW5lX21hcCwgaXJxX2FmZmluaXR5W2lycV0pOworCW5ld19jcHUgPSBtb3ZlKGNwdSwgYWxsb3dlZF9tYXNrLCBub3csIDEpOworCWlmIChjcHUgIT0gbmV3X2NwdSkgeworCQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0gPSBjcHVtYXNrX29mX2NwdShuZXdfY3B1KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJvdGF0ZV9pcnFzX2Ftb25nX2NwdXModW5zaWduZWQgbG9uZyB1c2VmdWxfbG9hZF90aHJlc2hvbGQpCit7CisJaW50IGksIGo7CisJRHByaW50aygiUm90YXRpbmcgSVJRcyBhbW9uZyBDUFVzLlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBjcHVfb25saW5lKGkpICYmIChqIDwgTlJfSVJRUyk7IGorKykgeworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24pCisJCQkJY29udGludWU7CisJCQkvKiBJcyBpdCBhIHNpZ25pZmljYW50IGxvYWQgPyAgKi8KKwkJCWlmIChJUlFfREVMVEEoQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKSxqKSA8CisJCQkJCQl1c2VmdWxfbG9hZF90aHJlc2hvbGQpCisJCQkJY29udGludWU7CisJCQliYWxhbmNlX2lycShpLCBqKTsKKwkJfQorCX0KKwliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtYXgoKGxvbmcpTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJYmFsYW5jZWRfaXJxX2ludGVydmFsIC0gQkFMQU5DRURfSVJRX0xFU1NfREVMVEEpOwkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRvX2lycV9iYWxhbmNlKHZvaWQpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBtYXhfY3B1X2lycSA9IDAsIG1pbl9jcHVfaXJxID0gKH4wKTsKKwl1bnNpZ25lZCBsb25nIG1vdmVfdGhpc19sb2FkID0gMDsKKwlpbnQgbWF4X2xvYWRlZCA9IDAsIG1pbl9sb2FkZWQgPSAwOworCWludCBsb2FkOworCXVuc2lnbmVkIGxvbmcgdXNlZnVsX2xvYWRfdGhyZXNob2xkID0gYmFsYW5jZWRfaXJxX2ludGVydmFsICsgMTA7CisJaW50IHNlbGVjdGVkX2lycTsKKwlpbnQgdG1wX2xvYWRlZCwgZmlyc3RfYXR0ZW1wdCA9IDE7CisJdW5zaWduZWQgbG9uZyB0bXBfY3B1X2lycTsKKwl1bnNpZ25lZCBsb25nIGltYmFsYW5jZSA9IDA7CisJY3B1bWFza190IGFsbG93ZWRfbWFzaywgdGFyZ2V0X2NwdV9tYXNrLCB0bXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWludCBwYWNrYWdlX2luZGV4OworCQlDUFVfSVJRKGkpID0gMDsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCXBhY2thZ2VfaW5kZXggPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfSVJRUzsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIHZhbHVlX25vdywgZGVsdGE7CisJCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCisJCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCQljb250aW51ZTsKKwkJCWlmICggcGFja2FnZV9pbmRleCA9PSBpICkKKwkJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSA9IDA7CisJCQkvKiBEZXRlcm1pbmUgdGhlIHRvdGFsIGNvdW50IHBlciBwcm9jZXNzb3IgcGVyIElSUSAqLworCQkJdmFsdWVfbm93ID0gKHVuc2lnbmVkIGxvbmcpIGtzdGF0X2NwdShpKS5pcnFzW2pdOworCisJCQkvKiBEZXRlcm1pbmUgdGhlIGFjdGl2aXR5IHBlciBwcm9jZXNzb3IgcGVyIElSUSAqLworCQkJZGVsdGEgPSB2YWx1ZV9ub3cgLSBMQVNUX0NQVV9JUlEoaSxqKTsKKworCQkJLyogVXBkYXRlIGxhc3RfY3B1X2lycVtdW10gZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwkJCUxBU1RfQ1BVX0lSUShpLGopID0gdmFsdWVfbm93OworCisJCQkvKiBJZ25vcmUgSVJRcyB3aG9zZSByYXRlIGlzIGxlc3MgdGhhbiB0aGUgY2xvY2sgKi8KKwkJCWlmIChkZWx0YSA8IHVzZWZ1bF9sb2FkX3RocmVzaG9sZCkKKwkJCQljb250aW51ZTsKKwkJCS8qIHVwZGF0ZSB0aGUgbG9hZCBmb3IgdGhlIHByb2Nlc3NvciBvciBwYWNrYWdlIHRvdGFsICovCisJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSArPSBkZWx0YTsKKworCQkJLyogS2VlcCB0cmFjayBvZiB0aGUgaGlnaGVyIG51bWJlcmVkIHNpYmxpbmcgYXMgd2VsbCAqLworCQkJaWYgKGkgIT0gcGFja2FnZV9pbmRleCkKKwkJCQlDUFVfSVJRKGkpICs9IGRlbHRhOworCQkJLyoKKwkJCSAqIFdlIGhhdmUgc2libGluZyBBIGFuZCBzaWJsaW5nIEIgaW4gdGhlIHBhY2thZ2UKKwkJCSAqCisJCQkgKiBjcHVfaXJxW0FdID0gbG9hZCBmb3IgY3B1IEEgKyBsb2FkIGZvciBjcHUgQgorCQkJICogY3B1X2lycVtCXSA9IGxvYWQgZm9yIGNwdSBCCisJCQkgKi8KKwkJCUNQVV9JUlEocGFja2FnZV9pbmRleCkgKz0gZGVsdGE7CisJCX0KKwl9CisJLyogRmluZCB0aGUgbGVhc3QgbG9hZGVkIHByb2Nlc3NvciBwYWNrYWdlICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9vbmxpbmUoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKGkgIT0gQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWluX2NwdV9pcnEgPiBDUFVfSVJRKGkpKSB7CisJCQltaW5fY3B1X2lycSA9IENQVV9JUlEoaSk7CisJCQltaW5fbG9hZGVkID0gaTsKKwkJfQorCX0KKwltYXhfY3B1X2lycSA9IFVMT05HX01BWDsKKwordHJ5YW5vdGhlcmNwdToKKwkvKiBMb29rIGZvciBoZWF2aWVzdCBsb2FkZWQgcHJvY2Vzc29yLgorCSAqIFdlIG1heSBjb21lIGJhY2sgdG8gZ2V0IHRoZSBuZXh0IGhlYXZpZXN0IGxvYWRlZCBwcm9jZXNzb3IuCisJICogU2tpcCBwcm9jZXNzb3JzIHdpdGggdHJpdmlhbCBsb2Fkcy4KKwkgKi8KKwl0bXBfY3B1X2lycSA9IDA7CisJdG1wX2xvYWRlZCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlmIChpICE9IENQVV9UT19QQUNLQUdFSU5ERVgoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKG1heF9jcHVfaXJxIDw9IENQVV9JUlEoaSkpIAorCQkJY29udGludWU7CisJCWlmICh0bXBfY3B1X2lycSA8IENQVV9JUlEoaSkpIHsKKwkJCXRtcF9jcHVfaXJxID0gQ1BVX0lSUShpKTsKKwkJCXRtcF9sb2FkZWQgPSBpOworCQl9CisJfQorCisJaWYgKHRtcF9sb2FkZWQgPT0gLTEpIHsKKyAJIC8qIEluIHRoZSBjYXNlIG9mIHNtYWxsIG51bWJlciBvZiBoZWF2eSBpbnRlcnJ1cHQgc291cmNlcywgCisJICAqIGxvYWRpbmcgc29tZSBvZiB0aGUgY3B1cyB0b28gbXVjaC4gV2UgdXNlIEluZ28ncyBvcmlnaW5hbCAKKwkgICogYXBwcm9hY2ggdG8gcm90YXRlIHRoZW0gYXJvdW5kLgorCSAgKi8KKwkJaWYgKCFmaXJzdF9hdHRlbXB0ICYmIGltYmFsYW5jZSA+PSB1c2VmdWxfbG9hZF90aHJlc2hvbGQpIHsKKwkJCXJvdGF0ZV9pcnFzX2Ftb25nX2NwdXModXNlZnVsX2xvYWRfdGhyZXNob2xkKTsKKwkJCXJldHVybjsKKwkJfQorCQlnb3RvIG5vdF93b3J0aF90aGVfZWZmb3J0OworCX0KKwkKKwlmaXJzdF9hdHRlbXB0ID0gMDsJCS8qIGhlYXZpZXN0IHNlYXJjaCAqLworCW1heF9jcHVfaXJxID0gdG1wX2NwdV9pcnE7CS8qIGxvYWQgKi8KKwltYXhfbG9hZGVkID0gdG1wX2xvYWRlZDsJLyogcHJvY2Vzc29yICovCisJaW1iYWxhbmNlID0gKG1heF9jcHVfaXJxIC0gbWluX2NwdV9pcnEpIC8gMjsKKwkKKwlEcHJpbnRrKCJtYXhfbG9hZGVkIGNwdSA9ICVkXG4iLCBtYXhfbG9hZGVkKTsKKwlEcHJpbnRrKCJtaW5fbG9hZGVkIGNwdSA9ICVkXG4iLCBtaW5fbG9hZGVkKTsKKwlEcHJpbnRrKCJtYXhfY3B1X2lycSBsb2FkID0gJWxkXG4iLCBtYXhfY3B1X2lycSk7CisJRHByaW50aygibWluX2NwdV9pcnEgbG9hZCA9ICVsZFxuIiwgbWluX2NwdV9pcnEpOworCURwcmludGsoImxvYWQgaW1iYWxhbmNlID0gJWx1XG4iLCBpbWJhbGFuY2UpOworCisJLyogaWYgaW1iYWxhbmNlIGlzIGxlc3MgdGhhbiBhcHByb3ggMTAlIG9mIG1heCBsb2FkLCB0aGVuCisJICogb2JzZXJ2ZSBkaW1pbmlzaGluZyByZXR1cm5zIGFjdGlvbi4gLSBxdWl0CisJICovCisJaWYgKGltYmFsYW5jZSA8IChtYXhfY3B1X2lycSA+PiAzKSkgeworCQlEcHJpbnRrKCJJbWJhbGFuY2UgdG9vIHRyaXZpYWxcbiIpOworCQlnb3RvIG5vdF93b3J0aF90aGVfZWZmb3J0OworCX0KKwordHJ5YW5vdGhlcmlycToKKwkvKiBpZiB3ZSBzZWxlY3QgYW4gSVJRIHRvIG1vdmUgdGhhdCBjYW4ndCBnbyB3aGVyZSB3ZSB3YW50LCB0aGVuCisJICogc2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgb25lIHRvIHRyeS4KKwkgKi8KKwltb3ZlX3RoaXNfbG9hZCA9IDA7CisJc2VsZWN0ZWRfaXJxID0gLTE7CisJZm9yIChqID0gMDsgaiA8IE5SX0lSUVM7IGorKykgeworCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCisJCWlmICghaXJxX2Rlc2Nbal0uYWN0aW9uKQorCQkJY29udGludWU7CisJCWlmIChpbWJhbGFuY2UgPD0gSVJRX0RFTFRBKG1heF9sb2FkZWQsaikpCisJCQljb250aW51ZTsKKwkJLyogVHJ5IHRvIGZpbmQgdGhlIElSUSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGltYmFsYW5jZQorCQkgKiB3aXRob3V0IGdvaW5nIG92ZXIuCisJCSAqLworCQlpZiAobW92ZV90aGlzX2xvYWQgPCBJUlFfREVMVEEobWF4X2xvYWRlZCxqKSkgeworCQkJbW92ZV90aGlzX2xvYWQgPSBJUlFfREVMVEEobWF4X2xvYWRlZCxqKTsKKwkJCXNlbGVjdGVkX2lycSA9IGo7CisJCX0KKwl9CisJaWYgKHNlbGVjdGVkX2lycSA9PSAtMSkgeworCQlnb3RvIHRyeWFub3RoZXJjcHU7CisJfQorCisJaW1iYWxhbmNlID0gbW92ZV90aGlzX2xvYWQ7CisJCisJLyogRm9yIHBoeXNpY2FsX2JhbGFuY2UgY2FzZSwgd2UgYWNjdW1sYXRlZCBib3RoIGxvYWQKKwkgKiB2YWx1ZXMgaW4gdGhlIG9uZSBvZiB0aGUgc2libGluZ3MgY3B1X2lycVtdLAorCSAqIHRvIHVzZSB0aGUgc2FtZSBjb2RlIGZvciBwaHlzaWNhbCBhbmQgbG9naWNhbCBwcm9jZXNzb3JzCisJICogYXMgbXVjaCBhcyBwb3NzaWJsZS4gCisJICoKKwkgKiBOT1RFOiB0aGUgY3B1X2lycVtdIGFycmF5IGhvbGRzIHRoZSBzdW0gb2YgdGhlIGxvYWQgZm9yCisJICogc2libGluZyBBIGFuZCBzaWJsaW5nIEIgaW4gdGhlIHNsb3QgZm9yIHRoZSBsb3dlc3QgbnVtYmVyZWQKKwkgKiBzaWJsaW5nIChBKSwgX0FORF8gdGhlIGxvYWQgZm9yIHNpYmxpbmcgQiBpbiB0aGUgc2xvdCBmb3IKKwkgKiB0aGUgaGlnaGVyIG51bWJlcmVkIHNpYmxpbmcuCisJICoKKwkgKiBXZSBzZWVrIHRoZSBsZWFzdCBsb2FkZWQgc2libGluZyBieSBtYWtpbmcgdGhlIGNvbXBhcmlzb24KKwkgKiAoQStCKS8yIHZzIEIKKwkgKi8KKwlsb2FkID0gQ1BVX0lSUShtaW5fbG9hZGVkKSA+PiAxOworCWZvcl9lYWNoX2NwdV9tYXNrKGosIGNwdV9zaWJsaW5nX21hcFttaW5fbG9hZGVkXSkgeworCQlpZiAobG9hZCA+IENQVV9JUlEoaikpIHsKKwkJCS8qIFRoaXMgd29uJ3QgY2hhbmdlIGNwdV9zaWJsaW5nX21hcFttaW5fbG9hZGVkXSAqLworCQkJbG9hZCA9IENQVV9JUlEoaik7CisJCQltaW5fbG9hZGVkID0gajsKKwkJfQorCX0KKworCWNwdXNfYW5kKGFsbG93ZWRfbWFzaywgY3B1X29ubGluZV9tYXAsIGlycV9hZmZpbml0eVtzZWxlY3RlZF9pcnFdKTsKKwl0YXJnZXRfY3B1X21hc2sgPSBjcHVtYXNrX29mX2NwdShtaW5fbG9hZGVkKTsKKwljcHVzX2FuZCh0bXAsIHRhcmdldF9jcHVfbWFzaywgYWxsb3dlZF9tYXNrKTsKKworCWlmICghY3B1c19lbXB0eSh0bXApKSB7CisJCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIHNlbGVjdGVkX2lycTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlEcHJpbnRrKCJpcnEgPSAlZCBtb3ZlZCB0byBjcHUgPSAlZFxuIiwKKwkJCQlzZWxlY3RlZF9pcnEsIG1pbl9sb2FkZWQpOworCQkvKiBtYXJrIGZvciBjaGFuZ2UgZGVzdGluYXRpb24gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3NlbGVjdGVkX2lycV0gPQorCQkJCQljcHVtYXNrX29mX2NwdShtaW5fbG9hZGVkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCQkvKiBTaW5jZSB3ZSBtYWRlIGEgY2hhbmdlLCBjb21lIGJhY2sgc29vbmVyIHRvIAorCQkgKiBjaGVjayBmb3IgbW9yZSB2YXJpYXRpb24uCisJCSAqLworCQliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtYXgoKGxvbmcpTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJCWJhbGFuY2VkX2lycV9pbnRlcnZhbCAtIEJBTEFOQ0VEX0lSUV9MRVNTX0RFTFRBKTsJCisJCXJldHVybjsKKwl9CisJZ290byB0cnlhbm90aGVyaXJxOworCitub3Rfd29ydGhfdGhlX2VmZm9ydDoKKwkvKgorCSAqIGlmIHdlIGRpZCBub3QgZmluZCBhbiBJUlEgdG8gbW92ZSwgdGhlbiBhZGp1c3QgdGhlIHRpbWUgaW50ZXJ2YWwKKwkgKiB1cHdhcmQKKwkgKi8KKwliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtaW4oKGxvbmcpTUFYX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJYmFsYW5jZWRfaXJxX2ludGVydmFsICsgQkFMQU5DRURfSVJRX01PUkVfREVMVEEpOwkKKwlEcHJpbnRrKCJJUlEgd29ydGggcm90YXRpbmcgbm90IGZvdW5kXG4iKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYmFsYW5jZWRfaXJxKHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHByZXZfYmFsYW5jZV90aW1lID0gamlmZmllczsKKwlsb25nIHRpbWVfcmVtYWluaW5nID0gYmFsYW5jZWRfaXJxX2ludGVydmFsOworCisJZGFlbW9uaXplKCJraXJxZCIpOworCQorCS8qIHB1c2ggZXZlcnl0aGluZyB0byBDUFUgMCB0byBnaXZlIHVzIGEgc3RhcnRpbmcgcG9pbnQuICAqLworCWZvciAoaSA9IDAgOyBpIDwgTlJfSVJRUyA7IGkrKykgeworCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaV0gPSBjcHVtYXNrX29mX2NwdSgwKTsKKwl9CisKKwlmb3IgKCA7IDsgKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVfcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dCh0aW1lX3JlbWFpbmluZyk7CisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCQlwcmV2X2JhbGFuY2VfdGltZStiYWxhbmNlZF9pcnFfaW50ZXJ2YWwpKSB7CisJCQlkb19pcnFfYmFsYW5jZSgpOworCQkJcHJldl9iYWxhbmNlX3RpbWUgPSBqaWZmaWVzOworCQkJdGltZV9yZW1haW5pbmcgPSBiYWxhbmNlZF9pcnFfaW50ZXJ2YWw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJhbGFuY2VkX2lycV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjOworCWNwdW1hc2tfdCB0bXA7CisKKwljcHVzX3NoaWZ0X3JpZ2h0KHRtcCwgY3B1X29ubGluZV9tYXAsIDIpOworICAgICAgICBjID0gJmJvb3RfY3B1X2RhdGE7CisJLyogV2hlbiBub3Qgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbW1hbmQgbGluZSBhc2sgc3ViYXJjaGl0ZWN0dXJlLiAqLworCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkID09IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSCkKKwkJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IE5PX0JBTEFOQ0VfSVJROworCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkKQorCQlyZXR1cm4gMDsKKwkKKwkgLyogZGlzYWJsZSBpcnFiYWxhbmNlIGNvbXBsZXRlbHkgaWYgdGhlcmUgaXMgb25seSBvbmUgcHJvY2Vzc29yIG9ubGluZSAqLworCWlmIChudW1fb25saW5lX2NwdXMoKSA8IDIpIHsKKwkJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEVuYWJsZSBwaHlzaWNhbCBiYWxhbmNlIG9ubHkgaWYgbW9yZSB0aGFuIDEgcGh5c2ljYWwgcHJvY2Vzc29yCisJICogaXMgcHJlc2VudAorCSAqLworCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSAmJiAhY3B1c19lbXB0eSh0bXApKQorCQlwaHlzaWNhbF9iYWxhbmNlID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCQlpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCQlpZiAoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSA9PSBOVUxMIHx8IGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJhbGFuY2VkX2lycV9pbml0OiBvdXQgb2YgbWVtb3J5Iik7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQltZW1zZXQoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSwwLHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMpOworCQltZW1zZXQoaXJxX2NwdV9kYXRhW2ldLmxhc3RfaXJxLDAsc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogTlJfSVJRUyk7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIGJhbGFuY2VkX2lycVxuIik7CisJaWYgKGtlcm5lbF90aHJlYWQoYmFsYW5jZWRfaXJxLCBOVUxMLCBDTE9ORV9LRVJORUwpID49IDApIAorCQlyZXR1cm4gMDsKKwllbHNlIAorCQlwcmludGsoS0VSTl9FUlIgImJhbGFuY2VkX2lycV9pbml0OiBmYWlsZWQgdG8gc3Bhd24gYmFsYW5jZWRfaXJxIik7CitmYWlsZWQ6CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZihpcnFfY3B1X2RhdGFbaV0uaXJxX2RlbHRhKQorCQkJa2ZyZWUoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSk7CisJCWlmKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSkKKwkJCWtmcmVlKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGlycWJhbGFuY2VfZGlzYWJsZShjaGFyICpzdHIpCit7CisJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoIm5vaXJxYmFsYW5jZSIsIGlycWJhbGFuY2VfZGlzYWJsZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX2lycShpbnQgaXJxKQoreworCS8qIG5vdGUgLSB3ZSBob2xkIHRoZSBkZXNjLT5sb2NrICovCisJaWYgKHVubGlrZWx5KCFjcHVzX2VtcHR5KHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdKSkpIHsKKwkJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSk7CisJCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0pOworCX0KK30KKworbGF0ZV9pbml0Y2FsbChiYWxhbmNlZF9pcnFfaW5pdCk7CisKKyNlbHNlIC8qICFDT05GSUdfSVJRQkFMQU5DRSAqLworc3RhdGljIGlubGluZSB2b2lkIG1vdmVfaXJxKGludCBpcnEpIHsgfQorI2VuZGlmIC8qIENPTkZJR19JUlFCQUxBTkNFICovCisKKyNpZm5kZWYgQ09ORklHX1NNUAordm9pZCBmYXN0Y2FsbCBzZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpCit7CisJdW5zaWduZWQgaW50IGNmZzsKKworCS8qCisJICogV2FpdCBmb3IgaWRsZS4KKwkgKi8KKwlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKwljZmcgPSBBUElDX0RNX0ZJWEVEIHwgQVBJQ19ERVNUX1NFTEYgfCB2ZWN0b3IgfCBBUElDX0RFU1RfTE9HSUNBTDsKKwkvKgorCSAqIFNlbmQgdGhlIElQSS4gVGhlIHdyaXRlIHRvIEFQSUNfSUNSIGZpcmVzIHRoaXMgb2ZmLgorCSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBjZmcpOworfQorI2VuZGlmIC8qICFDT05GSUdfU01QICovCisKKworLyoKKyAqIHN1cHBvcnQgZm9yIGJyb2tlbiBNUCBCSU9TcywgZW5hYmxlcyBoYW5kLXJlZGlyZWN0aW9uIG9mIFBJUlEwLTcgdG8KKyAqIHNwZWNpZmljIENQVS1zaWRlIElSUXMuCisgKi8KKworI2RlZmluZSBNQVhfUElSUVMgOAorc3RhdGljIGludCBwaXJxX2VudHJpZXMgW01BWF9QSVJRU107CitzdGF0aWMgaW50IHBpcnFzX2VuYWJsZWQ7CitpbnQgc2tpcF9pb2FwaWNfc2V0dXA7CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19zZXR1cChjaGFyICpzdHIpCit7CisJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2FwaWMiLCBpb2FwaWNfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfcGlycV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGksIG1heDsKKwlpbnQgaW50c1tNQVhfUElSUVMrMV07CisKKwlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9QSVJRUzsgaSsrKQorCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKKworCXBpcnFzX2VuYWJsZWQgPSAxOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiUElSUSByZWRpcmVjdGlvbiwgd29ya2luZyBhcm91bmQgYnJva2VuIE1QLUJJT1MuXG4iKTsKKwltYXggPSBNQVhfUElSUVM7CisJaWYgKGludHNbMF0gPCBNQVhfUElSUVMpCisJCW1heCA9IGludHNbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJIi4uLiBQSVJRJWQgLT4gSVJRICVkXG4iLCBpLCBpbnRzW2krMV0pOworCQkvKgorCQkgKiBQSVJRcyBhcmUgbWFwcGVkIHVwc2lkZSBkb3duLCB1c3VhbGx5LgorCQkgKi8KKwkJcGlycV9lbnRyaWVzW01BWF9QSVJRUy1pLTFdID0gaW50c1tpKzFdOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicGlycT0iLCBpb2FwaWNfcGlycV9zZXR1cCk7CisKKy8qCisgKiBGaW5kIHRoZSBJUlEgZW50cnkgbnVtYmVyIG9mIGEgY2VydGFpbiBwaW4uCisgKi8KK3N0YXRpYyBpbnQgZmluZF9pcnFfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIGludCB0eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspCisJCWlmIChtcF9pcnFzW2ldLm1wY19pcnF0eXBlID09IHR5cGUgJiYKKwkJICAgIChtcF9pcnFzW2ldLm1wY19kc3RhcGljID09IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCB8fAorCQkgICAgIG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gTVBfQVBJQ19BTEwpICYmCisJCSAgICBtcF9pcnFzW2ldLm1wY19kc3RpcnEgPT0gcGluKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBwaW4gdG8gd2hpY2ggSVJRW2lycV0gKElTQSkgaXMgY29ubmVjdGVkCisgKi8KK3N0YXRpYyBpbnQgZmluZF9pc2FfaXJxX3BpbihpbnQgaXJxLCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7CisJCWludCBsYnVzID0gbXBfaXJxc1tpXS5tcGNfc3JjYnVzOworCisJCWlmICgobXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX0lTQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19FSVNBIHx8CisJCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX01DQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19ORUM5OAorCQkgICAgKSAmJgorCQkgICAgKG1wX2lycXNbaV0ubXBjX2lycXR5cGUgPT0gdHlwZSkgJiYKKwkJICAgIChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgPT0gaXJxKSkKKworCQkJcmV0dXJuIG1wX2lycXNbaV0ubXBjX2RzdGlycTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCBhIHNwZWNpZmljIFBDSSBJUlEgZW50cnkuCisgKiBOb3QgYW4gX19pbml0LCBwb3NzaWJseSBuZWVkZWQgYnkgbW9kdWxlcworICovCitzdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbik7CisKK2ludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbikKK3sKKwlpbnQgYXBpYywgaSwgYmVzdF9ndWVzcyA9IC0xOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgInF1ZXJ5aW5nIFBDSSAtPiBJUlEgbWFwcGluZyBidXM6JWQsICIKKwkJInNsb3Q6JWQsIHBpbjolZC5cbiIsIGJ1cywgc2xvdCwgcGluKTsKKwlpZiAobXBfYnVzX2lkX3RvX3BjaV9idXNbYnVzXSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0kgQklPUyBwYXNzZWQgbm9uZXhpc3RlbnQgUENJIGJ1cyAlZCFcbiIsIGJ1cyk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspIHsKKwkJaW50IGxidXMgPSBtcF9pcnFzW2ldLm1wY19zcmNidXM7CisKKwkJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKKwkJCWlmIChtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQgPT0gbXBfaXJxc1tpXS5tcGNfZHN0YXBpYyB8fAorCQkJICAgIG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gTVBfQVBJQ19BTEwpCisJCQkJYnJlYWs7CisKKwkJaWYgKChtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfUENJKSAmJgorCQkgICAgIW1wX2lycXNbaV0ubXBjX2lycXR5cGUgJiYKKwkJICAgIChidXMgPT0gbGJ1cykgJiYKKwkJICAgIChzbG90ID09ICgobXBfaXJxc1tpXS5tcGNfc3JjYnVzaXJxID4+IDIpICYgMHgxZikpKSB7CisJCQlpbnQgaXJxID0gcGluXzJfaXJxKGksYXBpYyxtcF9pcnFzW2ldLm1wY19kc3RpcnEpOworCisJCQlpZiAoIShhcGljIHx8IElPX0FQSUNfSVJRKGlycSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocGluID09IChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgJiAzKSkKKwkJCQlyZXR1cm4gaXJxOworCQkJLyoKKwkJCSAqIFVzZSB0aGUgZmlyc3QgYWxsLWJ1dC1waW4gbWF0Y2hpbmcgZW50cnkgYXMgYQorCQkJICogYmVzdC1ndWVzcyBmdXp6eSByZXN1bHQgZm9yIGJyb2tlbiBtcHRhYmxlcy4KKwkJCSAqLworCQkJaWYgKGJlc3RfZ3Vlc3MgPCAwKQorCQkJCWJlc3RfZ3Vlc3MgPSBpcnE7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3Vlc3M7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBpcyBvbmx5IGEgaGVscGVyIGZvciB0aGUgaTM4NiBzbXAgYm9vdCBwcm9jZXNzIHdoZXJlIAorICogd2UgbmVlZCB0byByZXByb2dyYW0gdGhlIGlvcmVkdGJscyB0byBjYXRlciBmb3IgdGhlIGNwdXMgd2hpY2ggaGF2ZSBjb21lIG9ubGluZQorICogc28gbWFzayBpbiBhbGwgY2FzZXMgc2hvdWxkIHNpbXBseSBiZSBUQVJHRVRfQ1BVUworICovCit2b2lkIF9faW5pdCBzZXR1cF9pb2FwaWNfZGVzdCh2b2lkKQoreworCWludCBwaW4sIGlvYXBpYywgaXJxLCBpcnFfZW50cnk7CisKKwlpZiAoc2tpcF9pb2FwaWNfc2V0dXAgPT0gMSkKKwkJcmV0dXJuOworCisJZm9yIChpb2FwaWMgPSAwOyBpb2FwaWMgPCBucl9pb2FwaWNzOyBpb2FwaWMrKykgeworCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbaW9hcGljXTsgcGluKyspIHsKKwkJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOworCQkJaWYgKGlycV9lbnRyeSA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKKwkJCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgVEFSR0VUX0NQVVMpOworCQl9CisKKwl9Cit9CisKKy8qCisgKiBFSVNBIEVkZ2UvTGV2ZWwgY29udHJvbCByZWdpc3RlciwgRUxDUgorICovCitzdGF0aWMgaW50IEVJU0FfRUxDUih1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPCAxNikgeworCQl1bnNpZ25lZCBpbnQgcG9ydCA9IDB4NGQwICsgKGlycSA+PiAzKTsKKwkJcmV0dXJuIChpbmIocG9ydCkgPj4gKGlycSAmIDcpKSAmIDE7CisJfQorCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiQnJva2VuIE1QdGFibGUgcmVwb3J0cyBJU0EgaXJxICVkXG4iLCBpcnEpOworCXJldHVybiAwOworfQorCisvKiBFSVNBIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSB6ZXJvIGFuZCBjYW4gYmUgZWRnZSBvciBsZXZlbAorICogdHJpZ2dlciBkZXBlbmRpbmcgb24gdGhlIEVMQ1IgdmFsdWUuICBJZiBhbiBpbnRlcnJ1cHQgaXMgbGlzdGVkIGFzCisgKiBFSVNBIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLCB0aGF0IG1lYW5zIGl0cyB0cmlnZ2VyIHR5cGUgbXVzdAorICogYmUgcmVhZCBpbiBmcm9tIHRoZSBFTENSICovCisKKyNkZWZpbmUgZGVmYXVsdF9FSVNBX3RyaWdnZXIoaWR4KQkoRUlTQV9FTENSKG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzaXJxKSkKKyNkZWZpbmUgZGVmYXVsdF9FSVNBX3BvbGFyaXR5KGlkeCkJKDApCisKKy8qIElTQSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfSVNBX3RyaWdnZXIoaWR4KQkoMCkKKyNkZWZpbmUgZGVmYXVsdF9JU0FfcG9sYXJpdHkoaWR4KQkoMCkKKworLyogUENJIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSBvbmUgbGV2ZWwgdHJpZ2dlcmVkLAorICogd2hlbiBsaXN0ZWQgYXMgY29uZm9ybWluZyBpbiB0aGUgTVAgdGFibGUuICovCisKKyNkZWZpbmUgZGVmYXVsdF9QQ0lfdHJpZ2dlcihpZHgpCSgxKQorI2RlZmluZSBkZWZhdWx0X1BDSV9wb2xhcml0eShpZHgpCSgxKQorCisvKiBNQ0EgaW50ZXJydXB0cyBhcmUgYWx3YXlzIHBvbGFyaXR5IHplcm8gbGV2ZWwgdHJpZ2dlcmVkLAorICogd2hlbiBsaXN0ZWQgYXMgY29uZm9ybWluZyBpbiB0aGUgTVAgdGFibGUuICovCisKKyNkZWZpbmUgZGVmYXVsdF9NQ0FfdHJpZ2dlcihpZHgpCSgxKQorI2RlZmluZSBkZWZhdWx0X01DQV9wb2xhcml0eShpZHgpCSgwKQorCisvKiBORUM5OCBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfTkVDOThfdHJpZ2dlcihpZHgpICAgICAoMCkKKyNkZWZpbmUgZGVmYXVsdF9ORUM5OF9wb2xhcml0eShpZHgpICAgICgwKQorCitzdGF0aWMgaW50IF9faW5pdCBNUEJJT1NfcG9sYXJpdHkoaW50IGlkeCkKK3sKKwlpbnQgYnVzID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXM7CisJaW50IHBvbGFyaXR5OworCisJLyoKKwkgKiBEZXRlcm1pbmUgSVJRIGxpbmUgcG9sYXJpdHkgKGhpZ2ggYWN0aXZlIG9yIGxvdyBhY3RpdmUpOgorCSAqLworCXN3aXRjaCAobXBfaXJxc1tpZHhdLm1wY19pcnFmbGFnICYgMykKKwl7CisJCWNhc2UgMDogLyogY29uZm9ybXMsIGllLiBidXMtdHlwZSBkZXBlbmRlbnQgcG9sYXJpdHkgKi8KKwkJeworCQkJc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQorCQkJeworCQkJCWNhc2UgTVBfQlVTX0lTQTogLyogSVNBIHBpbiAqLworCQkJCXsKKwkJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X0lTQV9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfRUlTQTogLyogRUlTQSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9FSVNBX3BvbGFyaXR5KGlkeCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIE1QX0JVU19QQ0k6IC8qIFBDSSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9QQ0lfcG9sYXJpdHkoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX01DQTogLyogTUNBIHBpbiAqLworCQkJCXsKKwkJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X01DQV9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTkVDOTg6IC8qIE5FQyA5OCBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9ORUM5OF9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJCQlwb2xhcml0eSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogLyogaGlnaCBhY3RpdmUgKi8KKwkJeworCQkJcG9sYXJpdHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOiAvKiByZXNlcnZlZCAqLworCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCXBvbGFyaXR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogLyogbG93IGFjdGl2ZSAqLworCQl7CisJCQlwb2xhcml0eSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiAvKiBpbnZhbGlkICovCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJcG9sYXJpdHkgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHBvbGFyaXR5OworfQorCitzdGF0aWMgaW50IE1QQklPU190cmlnZ2VyKGludCBpZHgpCit7CisJaW50IGJ1cyA9IG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzOworCWludCB0cmlnZ2VyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgSVJRIHRyaWdnZXIgbW9kZSAoZWRnZSBvciBsZXZlbCBzZW5zaXRpdmUpOgorCSAqLworCXN3aXRjaCAoKG1wX2lycXNbaWR4XS5tcGNfaXJxZmxhZz4+MikgJiAzKQorCXsKKwkJY2FzZSAwOiAvKiBjb25mb3JtcywgaWUuIGJ1cy10eXBlIGRlcGVuZGVudCAqLworCQl7CisJCQlzd2l0Y2ggKG1wX2J1c19pZF90b190eXBlW2J1c10pCisJCQl7CisJCQkJY2FzZSBNUF9CVVNfSVNBOiAvKiBJU0EgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9JU0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfRUlTQTogLyogRUlTQSBwaW4gKi8KKwkJCQl7CisJCQkJCXRyaWdnZXIgPSBkZWZhdWx0X0VJU0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfUENJOiAvKiBQQ0kgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9QQ0lfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTUNBOiAvKiBNQ0EgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9NQ0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTkVDOTg6IC8qIE5FQyA5OCBwaW4gKi8KKwkJCQl7CisJCQkJCXRyaWdnZXIgPSBkZWZhdWx0X05FQzk4X3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCQkJdHJpZ2dlciA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogLyogZWRnZSAqLworCQl7CisJCQl0cmlnZ2VyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMjogLyogcmVzZXJ2ZWQgKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CisJCQl0cmlnZ2VyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogLyogbGV2ZWwgKi8KKwkJeworCQkJdHJpZ2dlciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiAvKiBpbnZhbGlkICovCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJdHJpZ2dlciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdHJpZ2dlcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3BvbGFyaXR5KGludCBpZHgpCit7CisJcmV0dXJuIE1QQklPU19wb2xhcml0eShpZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcnFfdHJpZ2dlcihpbnQgaWR4KQoreworCXJldHVybiBNUEJJT1NfdHJpZ2dlcihpZHgpOworfQorCitzdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbikKK3sKKwlpbnQgaXJxLCBpOworCWludCBidXMgPSBtcF9pcnFzW2lkeF0ubXBjX3NyY2J1czsKKworCS8qCisJICogRGVidWdnaW5nIGNoZWNrLCB3ZSBhcmUgaW4gYmlnIHRyb3VibGUgaWYgdGhpcyBtZXNzYWdlIHBvcHMgdXAhCisJICovCisJaWYgKG1wX2lycXNbaWR4XS5tcGNfZHN0aXJxICE9IHBpbikKKwkJcHJpbnRrKEtFUk5fRVJSICJicm9rZW4gQklPUyBvciBNUFRBQkxFIHBhcnNlciwgYXlpZWUhIVxuIik7CisKKwlzd2l0Y2ggKG1wX2J1c19pZF90b190eXBlW2J1c10pCisJeworCQljYXNlIE1QX0JVU19JU0E6IC8qIElTQSBwaW4gKi8KKwkJY2FzZSBNUF9CVVNfRUlTQToKKwkJY2FzZSBNUF9CVVNfTUNBOgorCQljYXNlIE1QX0JVU19ORUM5ODoKKwkJeworCQkJaXJxID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXNpcnE7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE1QX0JVU19QQ0k6IC8qIFBDSSBwaW4gKi8KKwkJeworCQkJLyoKKwkJCSAqIFBDSSBJUlFzIGFyZSBtYXBwZWQgaW4gb3JkZXIKKwkJCSAqLworCQkJaSA9IGlycSA9IDA7CisJCQl3aGlsZSAoaSA8IGFwaWMpCisJCQkJaXJxICs9IG5yX2lvYXBpY19yZWdpc3RlcnNbaSsrXTsKKwkJCWlycSArPSBwaW47CisKKwkJCS8qCisJCQkgKiBGb3IgTVBTIG1vZGUsIHNvIGZhciBvbmx5IG5lZWRlZCBieSBFUzcwMDAgcGxhdGZvcm0KKwkJCSAqLworCQkJaWYgKGlvYXBpY19yZW51bWJlcl9pcnEpCisJCQkJaXJxID0gaW9hcGljX3JlbnVtYmVyX2lycShhcGljLCBpcnEpOworCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgInVua25vd24gYnVzIHR5cGUgJWQuXG4iLGJ1cyk7IAorCQkJaXJxID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBQQ0kgSVJRIGNvbW1hbmQgbGluZSByZWRpcmVjdGlvbi4gWWVzLCBsaW1pdHMgYXJlIGhhcmRjb2RlZC4KKwkgKi8KKwlpZiAoKHBpbiA+PSAxNikgJiYgKHBpbiA8PSAyMykpIHsKKwkJaWYgKHBpcnFfZW50cmllc1twaW4tMTZdICE9IC0xKSB7CisJCQlpZiAoIXBpcnFfZW50cmllc1twaW4tMTZdKSB7CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkiZGlzYWJsaW5nIFBJUlElZFxuIiwgcGluLTE2KTsKKwkJCX0gZWxzZSB7CisJCQkJaXJxID0gcGlycV9lbnRyaWVzW3Bpbi0xNl07CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkidXNpbmcgUElSUSVkIC0+IElSUSAlZFxuIiwKKwkJCQkJCXBpbi0xNiwgaXJxKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW5saW5lIGludCBJT19BUElDX2lycV90cmlnZ2VyKGludCBpcnEpCit7CisJaW50IGFwaWMsIGlkeCwgcGluOworCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbYXBpY107IHBpbisrKSB7CisJCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljLHBpbixtcF9JTlQpOworCQkJaWYgKChpZHggIT0gLTEpICYmIChpcnEgPT0gcGluXzJfaXJxKGlkeCxhcGljLHBpbikpKQorCQkJCXJldHVybiBpcnFfdHJpZ2dlcihpZHgpOworCQl9CisJfQorCS8qCisJICogbm9uZXhpc3RlbnQgSVJRcyBhcmUgZWRnZSBkZWZhdWx0CisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qIGlycV92ZWN0b3JzIGlzIGluZGV4ZWQgYnkgdGhlIHN1bSBvZiBhbGwgUlRFcyBpbiBhbGwgSS9PIEFQSUNzLiAqLwordTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gPSB7IEZJUlNUX0RFVklDRV9WRUNUT1IgLCAwIH07CisKK2ludCBhc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxKQoreworCXN0YXRpYyBpbnQgY3VycmVudF92ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SLCBvZmZzZXQgPSAwOworCisJQlVHX09OKGlycSA+PSBOUl9JUlFfVkVDVE9SUyk7CisJaWYgKGlycSAhPSBBVVRPX0FTU0lHTiAmJiBJT19BUElDX1ZFQ1RPUihpcnEpID4gMCkKKwkJcmV0dXJuIElPX0FQSUNfVkVDVE9SKGlycSk7CituZXh0OgorCWN1cnJlbnRfdmVjdG9yICs9IDg7CisJaWYgKGN1cnJlbnRfdmVjdG9yID09IFNZU0NBTExfVkVDVE9SKQorCQlnb3RvIG5leHQ7CisKKwlpZiAoY3VycmVudF92ZWN0b3IgPj0gRklSU1RfU1lTVEVNX1ZFQ1RPUikgeworCQlvZmZzZXQrKzsKKwkJaWYgKCEob2Zmc2V0JTgpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiArIG9mZnNldDsKKwl9CisKKwl2ZWN0b3JfaXJxW2N1cnJlbnRfdmVjdG9yXSA9IGlycTsKKwlpZiAoaXJxICE9IEFVVE9fQVNTSUdOKQorCQlJT19BUElDX1ZFQ1RPUihpcnEpID0gY3VycmVudF92ZWN0b3I7CisKKwlyZXR1cm4gY3VycmVudF92ZWN0b3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGU7CitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGU7CisKKyNkZWZpbmUgSU9BUElDX0FVVE8JLTEKKyNkZWZpbmUgSU9BUElDX0VER0UJMAorI2RlZmluZSBJT0FQSUNfTEVWRUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9hcGljX3JlZ2lzdGVyX2ludHIoaW50IGlycSwgaW50IHZlY3RvciwgdW5zaWduZWQgbG9uZyB0cmlnZ2VyKQoreworCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGlycSkpIHsKKwkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKKwkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKKwkJCWlycV9kZXNjW3ZlY3Rvcl0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKKwkJZWxzZQorCQkJaXJxX2Rlc2NbdmVjdG9yXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbdmVjdG9yXSk7CisJfSBlbHNlCXsKKwkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKKwkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKKwkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKKwkJZWxzZQorCQkJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaXJxXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnFzKHZvaWQpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJaW50IGFwaWMsIHBpbiwgaWR4LCBpcnEsIGZpcnN0X25vdGNvbiA9IDEsIHZlY3RvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHICJpbml0IElPX0FQSUMgSVJRc1xuIik7CisKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgeworCisJCS8qCisJCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkJICovCisJCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKKworCQllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJCWVudHJ5LmRlc3RfbW9kZSA9IElOVF9ERVNUX01PREU7CisJCWVudHJ5Lm1hc2sgPSAwOwkJCQkvKiBlbmFibGUgSVJRICovCisJCWVudHJ5LmRlc3QubG9naWNhbC5sb2dpY2FsX2Rlc3QgPSAKKwkJCQkJY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKworCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljLHBpbixtcF9JTlQpOworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlpZiAoZmlyc3Rfbm90Y29uKSB7CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkiIElPLUFQSUMgKGFwaWNpZC1waW4pICVkLSVkIiwKKwkJCQkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCwKKwkJCQkJCXBpbik7CisJCQkJZmlyc3Rfbm90Y29uID0gMDsKKwkJCX0gZWxzZQorCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiwgJWQtJWQiLAorCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQsIHBpbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVudHJ5LnRyaWdnZXIgPSBpcnFfdHJpZ2dlcihpZHgpOworCQllbnRyeS5wb2xhcml0eSA9IGlycV9wb2xhcml0eShpZHgpOworCisJCWlmIChpcnFfdHJpZ2dlcihpZHgpKSB7CisJCQllbnRyeS50cmlnZ2VyID0gMTsKKwkJCWVudHJ5Lm1hc2sgPSAxOworCQl9CisKKwkJaXJxID0gcGluXzJfaXJxKGlkeCwgYXBpYywgcGluKTsKKwkJLyoKKwkJICogc2tpcCBhZGRpbmcgdGhlIHRpbWVyIGludCBvbiBzZWNvbmRhcnkgbm9kZXMsIHdoaWNoIGNhdXNlcworCQkgKiBhIHNtYWxsIGJ1dCBwYWluZnVsIHJpZnQgaW4gdGhlIHRpbWUtc3BhY2UgY29udGludXVtCisJCSAqLworCQlpZiAobXVsdGlfdGltZXJfY2hlY2soYXBpYywgaXJxKSkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlhZGRfcGluX3RvX2lycShpcnEsIGFwaWMsIHBpbik7CisKKwkJaWYgKCFhcGljICYmICFJT19BUElDX0lSUShpcnEpKQorCQkJY29udGludWU7CisKKwkJaWYgKElPX0FQSUNfSVJRKGlycSkpIHsKKwkJCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSk7CisJCQllbnRyeS52ZWN0b3IgPSB2ZWN0b3I7CisJCQlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIHZlY3RvciwgSU9BUElDX0FVVE8pOworCQkKKwkJCWlmICghYXBpYyAmJiAoaXJxIDwgMTYpKQorCQkJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwl9CisJfQorCisJaWYgKCFmaXJzdF9ub3Rjb24pCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiBub3QgY29ubmVjdGVkLlxuIik7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIDgyNTlBLW1hc3RlciBvdXRwdXQgcGluOgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfRXh0SU5UX0lSUTBfcGluKHVuc2lnbmVkIGludCBwaW4sIGludCB2ZWN0b3IpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKKworCWRpc2FibGVfODI1OUFfaXJxKDApOworCisJLyogbWFzayBMVlQwICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQgfCBBUElDX0RNX0VYVElOVCk7CisKKwkvKgorCSAqIFdlIHVzZSBsb2dpY2FsIGRlbGl2ZXJ5IHRvIGdldCB0aGUgdGltZXIgSVJRCisJICogdG8gdGhlIGZpcnN0IENQVS4KKwkgKi8KKwllbnRyeS5kZXN0X21vZGUgPSBJTlRfREVTVF9NT0RFOworCWVudHJ5Lm1hc2sgPSAwOwkJCQkJLyogdW5tYXNrIElSUSBub3cgKi8KKwllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKwllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJZW50cnkucG9sYXJpdHkgPSAwOworCWVudHJ5LnRyaWdnZXIgPSAwOworCWVudHJ5LnZlY3RvciA9IHZlY3RvcjsKKworCS8qCisJICogVGhlIHRpbWVyIElSUSBkb2Vzbid0IGhhdmUgdG8ga25vdyB0aGF0IGJlaGluZCB0aGUKKwkgKiBzY2VuZSB3ZSBoYXZlIGEgODI1OUEtbWFzdGVyIGluIEFFT0kgbW9kZSAuLi4KKwkgKi8KKwlpcnFfZGVzY1swXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisKKwkvKgorCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFVORVhQRUNURURfSU9fQVBJQyh2b2lkKQoreworfQorCit2b2lkIF9faW5pdCBwcmludF9JT19BUElDKHZvaWQpCit7CisJaW50IGFwaWMsIGk7CisJdW5pb24gSU9fQVBJQ19yZWdfMDAgcmVnXzAwOworCXVuaW9uIElPX0FQSUNfcmVnXzAxIHJlZ18wMTsKKwl1bmlvbiBJT19BUElDX3JlZ18wMiByZWdfMDI7CisJdW5pb24gSU9fQVBJQ19yZWdfMDMgcmVnXzAzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisgCXByaW50ayhLRVJOX0RFQlVHICJudW1iZXIgb2YgTVAgSVJRIHNvdXJjZXM6ICVkLlxuIiwgbXBfaXJxX2VudHJpZXMpOworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspCisJCXByaW50ayhLRVJOX0RFQlVHICJudW1iZXIgb2YgSU8tQVBJQyAjJWQgcmVnaXN0ZXJzOiAlZC5cbiIsCisJCSAgICAgICBtcF9pb2FwaWNzW2ldLm1wY19hcGljaWQsIG5yX2lvYXBpY19yZWdpc3RlcnNbaV0pOworCisJLyoKKwkgKiBXZSBhcmUgYSBiaXQgY29uc2VydmF0aXZlIGFib3V0IHdoYXQgd2UgZXhwZWN0LiAgV2UgaGF2ZSB0bworCSAqIGtub3cgYWJvdXQgZXZlcnkgaGFyZHdhcmUgY2hhbmdlIEFTQVAuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAidGVzdGluZyB0aGUgSU8gQVBJQy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4iKTsKKworCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMCk7CisJcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAxKTsKKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDEwKQorCQlyZWdfMDIucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDIpOworCWlmIChyZWdfMDEuYml0cy52ZXJzaW9uID49IDB4MjApCisJCXJlZ18wMy5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJTyBBUElDICMlZC4uLi4uLlxuIiwgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDA6ICUwOFhcbiIsIHJlZ18wMC5yYXcpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogcGh5c2ljYWwgQVBJQyBpZDogJTAyWFxuIiwgcmVnXzAwLmJpdHMuSUQpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogRGVsaXZlcnkgVHlwZTogJVhcbiIsIHJlZ18wMC5iaXRzLmRlbGl2ZXJ5X3R5cGUpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDogJVhcbiIsIHJlZ18wMC5iaXRzLkxUUyk7CisJaWYgKHJlZ18wMC5iaXRzLklEID49IGdldF9waHlzaWNhbF9icm9hZGNhc3QoKSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJaWYgKHJlZ18wMC5iaXRzLl9fcmVzZXJ2ZWRfMSB8fCByZWdfMDAuYml0cy5fX3Jlc2VydmVkXzIpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gcmVnaXN0ZXIgIzAxOiAlMDhYXG4iLCByZWdfMDEucmF3KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBtYXggcmVkaXJlY3Rpb24gZW50cmllczogJTA0WFxuIiwgcmVnXzAxLmJpdHMuZW50cmllcyk7CisJaWYgKAkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDBmKSAmJiAvKiBvbGRlciAoTmVwdHVuZSkgYm9hcmRzICovCisJCShyZWdfMDEuYml0cy5lbnRyaWVzICE9IDB4MTcpICYmIC8qIHR5cGljYWwgSVNBK1BDSSBib2FyZHMgKi8KKwkJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgxYikgJiYgLyogQ29tcGFxIFByb2xpYW50IGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDFmKSAmJiAvKiBkdWFsIFhlb24gYm9hcmRzICovCisJCShyZWdfMDEuYml0cy5lbnRyaWVzICE9IDB4MjIpICYmIC8qIGJpZ2dlciBYZW9uIGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDJFKSAmJgorCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDNGKQorCSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBQUlEgaW1wbGVtZW50ZWQ6ICVYXG4iLCByZWdfMDEuYml0cy5QUlEpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgICA6IElPIEFQSUMgdmVyc2lvbjogJTA0WFxuIiwgcmVnXzAxLmJpdHMudmVyc2lvbik7CisJaWYgKAkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDAxKSAmJiAvKiA4MjQ4OURYIElPLUFQSUNzICovCisJCShyZWdfMDEuYml0cy52ZXJzaW9uICE9IDB4MTApICYmIC8qIG9sZGVzdCBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDExKSAmJiAvKiBQZW50aXVtL1BybyBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDEzKSAmJiAvKiBYZW9uIElPLUFQSUNzICovCisJCShyZWdfMDEuYml0cy52ZXJzaW9uICE9IDB4MjApICAgIC8qIEludGVsIFA2NEggKDgyODA2IEFBKSAqLworCSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJaWYgKHJlZ18wMS5iaXRzLl9fcmVzZXJ2ZWRfMSB8fCByZWdfMDEuYml0cy5fX3Jlc2VydmVkXzIpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCisJLyoKKwkgKiBTb21lIEludGVsIGNoaXBzZXRzIHdpdGggSU8gQVBJQyBWRVJTSU9OIG9mIDB4MT8gZG9uJ3QgaGF2ZSByZWdfMDIsCisJICogYnV0IHRoZSB2YWx1ZSBvZiByZWdfMDIgaXMgcmVhZCBhcyB0aGUgcHJldmlvdXMgcmVhZCByZWdpc3RlcgorCSAqIHZhbHVlLCBzbyBpZ25vcmUgaXQgaWYgcmVnXzAyID09IHJlZ18wMS4KKwkgKi8KKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDEwICYmIHJlZ18wMi5yYXcgIT0gcmVnXzAxLnJhdykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDI6ICUwOFhcbiIsIHJlZ18wMi5yYXcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBhcmJpdHJhdGlvbjogJTAyWFxuIiwgcmVnXzAyLmJpdHMuYXJiaXRyYXRpb24pOworCQlpZiAocmVnXzAyLmJpdHMuX19yZXNlcnZlZF8xIHx8IHJlZ18wMi5iaXRzLl9fcmVzZXJ2ZWRfMikKKwkJCVVORVhQRUNURURfSU9fQVBJQygpOworCX0KKworCS8qCisJICogU29tZSBJbnRlbCBjaGlwc2V0cyB3aXRoIElPIEFQSUMgVkVSU0lPTiBvZiAweDI/IGRvbid0IGhhdmUgcmVnXzAyCisJICogb3IgcmVnXzAzLCBidXQgdGhlIHZhbHVlIG9mIHJlZ18wWzIzXSBpcyByZWFkIGFzIHRoZSBwcmV2aW91cyByZWFkCisJICogcmVnaXN0ZXIgdmFsdWUsIHNvIGlnbm9yZSBpdCBpZiByZWdfMDMgPT0gcmVnXzBbMTJdLgorCSAqLworCWlmIChyZWdfMDEuYml0cy52ZXJzaW9uID49IDB4MjAgJiYgcmVnXzAzLnJhdyAhPSByZWdfMDIucmF3ICYmCisJICAgIHJlZ18wMy5yYXcgIT0gcmVnXzAxLnJhdykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDM6ICUwOFhcbiIsIHJlZ18wMy5yYXcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBCb290IERUICAgIDogJVhcbiIsIHJlZ18wMy5iaXRzLmJvb3RfRFQpOworCQlpZiAocmVnXzAzLmJpdHMuX19yZXNlcnZlZF8xKQorCQkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gSVJRIHJlZGlyZWN0aW9uIHRhYmxlOlxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiIE5SIExvZyBQaHkgTWFzayBUcmlnIElSUiBQb2wiCisJCQkgICIgU3RhdCBEZXN0IERlbGkgVmVjdDogICBcbiIpOworCisJZm9yIChpID0gMDsgaSA8PSByZWdfMDEuYml0cy5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCSooKChpbnQgKikmZW50cnkpKzApID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAraSoyKTsKKwkJKigoKGludCAqKSZlbnRyeSkrMSkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMStpKjIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIgJTAyeCAlMDNYICUwMlggICIsCisJCQlpLAorCQkJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCwKKwkJCWVudHJ5LmRlc3QucGh5c2ljYWwucGh5c2ljYWxfZGVzdAorCQkpOworCisJCXByaW50aygiJTFkICAgICUxZCAgICAlMWQgICAlMWQgICAlMWQgICAgJTFkICAgICUxZCAgICAlMDJYXG4iLAorCQkJZW50cnkubWFzaywKKwkJCWVudHJ5LnRyaWdnZXIsCisJCQllbnRyeS5pcnIsCisJCQllbnRyeS5wb2xhcml0eSwKKwkJCWVudHJ5LmRlbGl2ZXJ5X3N0YXR1cywKKwkJCWVudHJ5LmRlc3RfbW9kZSwKKwkJCWVudHJ5LmRlbGl2ZXJ5X21vZGUsCisJCQllbnRyeS52ZWN0b3IKKwkJKTsKKwl9CisJfQorCWlmICh1c2VfcGNpX3ZlY3RvcigpKQorCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyB2ZWN0b3ItYmFzZWQgaW5kZXhpbmdcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJJUlEgdG8gcGluIG1hcHBpbmdzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGk7CisJCWlmIChlbnRyeS0+cGluIDwgMCkKKwkJCWNvbnRpbnVlOworIAkJaWYgKHVzZV9wY2lfdmVjdG9yKCkgJiYgIXBsYXRmb3JtX2xlZ2FjeV9pcnEoaSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVJRJWQgIiwgSU9fQVBJQ19WRUNUT1IoaSkpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVJRJWQgIiwgaSk7CisJCWZvciAoOzspIHsKKwkJCXByaW50aygiLT4gJWQ6JWQiLCBlbnRyeS0+YXBpYywgZW50cnktPnBpbik7CisJCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJCWJyZWFrOworCQkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIGRvbmUuXG4iKTsKKworCXJldHVybjsKK30KKworI2lmIDAKKworc3RhdGljIHZvaWQgcHJpbnRfQVBJQ19iaXRmaWVsZCAoaW50IGJhc2UpCit7CisJdW5zaWduZWQgaW50IHY7CisJaW50IGksIGo7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fREVCVUcgIjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmXG4iIEtFUk5fREVCVUcpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdiA9IGFwaWNfcmVhZChiYXNlICsgaSoweDEwKTsKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCWlmICh2ICYgKDE8PGopKQorCQkJCXByaW50aygiMSIpOworCQkJZWxzZQorCQkJCXByaW50aygiMCIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3ZvaWQgLypfX2luaXQqLyBwcmludF9sb2NhbF9BUElDKHZvaWQgKiBkdW1teSkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgdmVyLCBtYXhsdnQ7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAicHJpbnRpbmcgbG9jYWwgQVBJQyBjb250ZW50cyBvbiBDUFUjJWQvJWQ6XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUQpOworCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIElEOiAgICAgICUwOHggKCUwMXgpXG4iLCB2LCBHRVRfQVBJQ19JRCh2KSk7CisJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLi4uIEFQSUMgVkVSU0lPTjogJTA4eFxuIiwgdik7CisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2KTsKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFRBU0tQUkk6ICUwOHggKCUwMngpXG4iLCB2LCB2ICYgQVBJQ19UUFJJX01BU0spOworCisJaWYgKEFQSUNfSU5URUdSQVRFRCh2ZXIpKSB7CQkJLyogITgyNDg5RFggKi8KKwkJdiA9IGFwaWNfcmVhZChBUElDX0FSQlBSSSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBBUkJQUkk6ICUwOHggKCUwMngpXG4iLCB2LAorCQkJdiAmIEFQSUNfQVJCUFJJX01BU0spOworCQl2ID0gYXBpY19yZWFkKEFQSUNfUFJPQ1BSSSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBQUk9DUFJJOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfRU9JKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgRU9JOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfUlJSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgUlJSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTERSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTERSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfREZSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgREZSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFNQSVY6ICUwOHhcbiIsIHYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElTUiBmaWVsZDpcbiIpOworCXByaW50X0FQSUNfYml0ZmllbGQoQVBJQ19JU1IpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTVIgZmllbGQ6XG4iKTsKKwlwcmludF9BUElDX2JpdGZpZWxkKEFQSUNfVE1SKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSVJSIGZpZWxkOlxuIik7CisJcHJpbnRfQVBJQ19iaXRmaWVsZChBUElDX0lSUik7CisKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKHZlcikpIHsJCS8qICE4MjQ4OURYICovCisJCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLiAqLworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgRVNSOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUNSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUNSMik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjI6ICUwOHhcbiIsIHYpOworCisJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlRUOiAlMDh4XG4iLCB2KTsKKworCWlmIChtYXhsdnQgPiAzKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBpcyBMVlQjNC4gKi8KKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExWVFBDOiAlMDh4XG4iLCB2KTsKKwl9CisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlQwOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExWVDE6ICUwOHhcbiIsIHYpOworCisJaWYgKG1heGx2dCA+IDIpIHsJCQkvKiBFUlIgaXMgTFZUIzMuICovCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRFUlIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTFZURVJSOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfVE1JQ1QpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTUlDVDogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVE1DQ1Q6ICUwOHhcbiIsIHYpOworCXYgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVERDUjogJTA4eFxuIiwgdik7CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkIHByaW50X2FsbF9sb2NhbF9BUElDcyAodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShwcmludF9sb2NhbF9BUElDLCBOVUxMLCAxLCAxKTsKK30KKwordm9pZCAvKl9faW5pdCovIHByaW50X1BJQyh2b2lkKQoreworCWV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOworCXVuc2lnbmVkIGludCB2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlxucHJpbnRpbmcgUElDIGNvbnRlbnRzXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCisJdiA9IGluYigweGExKSA8PCA4IHwgaW5iKDB4MjEpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDICBJTVI6ICUwNHhcbiIsIHYpOworCisJdiA9IGluYigweGEwKSA8PCA4IHwgaW5iKDB4MjApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDICBJUlI6ICUwNHhcbiIsIHYpOworCisJb3V0YigweDBiLDB4YTApOworCW91dGIoMHgwYiwweDIwKTsKKwl2ID0gaW5iKDB4YTApIDw8IDggfCBpbmIoMHgyMCk7CisJb3V0YigweDBhLDB4YTApOworCW91dGIoMHgwYSwweDIwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIFBJQyAgSVNSOiAlMDR4XG4iLCB2KTsKKworCXYgPSBpbmIoMHg0ZDEpIDw8IDggfCBpbmIoMHg0ZDApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDIEVMQ1I6ICUwNHhcbiIsIHYpOworfQorCisjZW5kaWYgIC8qICAwICAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX0lPX0FQSUModm9pZCkKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMSByZWdfMDE7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoaSA9IDA7IGkgPCBQSU5fTUFQX1NJWkU7IGkrKykgeworCQlpcnFfMl9waW5baV0ucGluID0gLTE7CisJCWlycV8yX3BpbltpXS5uZXh0ID0gMDsKKwl9CisJaWYgKCFwaXJxc19lbmFibGVkKQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BJUlFTOyBpKyspCisJCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBJTy1BUElDIElSUSByZWdpc3RlcnMgKD09ICNwaW5zKToKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGksIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2ldID0gcmVnXzAxLmJpdHMuZW50cmllcysxOworCX0KKworCS8qCisJICogRG8gbm90IHRydXN0IHRoZSBJTy1BUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cAorCSAqLworCWNsZWFyX0lPX0FQSUMoKTsKK30KKworLyoKKyAqIE5vdCBhbiBfX2luaXQsIG5lZWRlZCBieSB0aGUgcmVib290IGNvZGUKKyAqLwordm9pZCBkaXNhYmxlX0lPX0FQSUModm9pZCkKK3sKKwkvKgorCSAqIENsZWFyIHRoZSBJTy1BUElDIGJlZm9yZSByZWJvb3Rpbmc6CisJICovCisJY2xlYXJfSU9fQVBJQygpOworCisJZGlzY29ubmVjdF9ic3BfQVBJQygpOworfQorCisvKgorICogZnVuY3Rpb24gdG8gc2V0IHRoZSBJTy1BUElDIHBoeXNpY2FsIElEcyBiYXNlZCBvbiB0aGUKKyAqIHZhbHVlcyBzdG9yZWQgaW4gdGhlIE1QQyB0YWJsZS4KKyAqCisgKiBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+ICBUdWUgRGVjIDIxIDEyOjI1OjA1IENTVCAxOTk5CisgKi8KKworI2lmbmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYyh2b2lkKQoreworCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKKwlwaHlzaWRfbWFza190IHBoeXNfaWRfcHJlc2VudF9tYXA7CisJaW50IGFwaWM7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBvbGRfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVGhpcyBpcyBicm9rZW47IGFueXRoaW5nIHdpdGggYSByZWFsIGNwdSBjb3VudCBoYXMgdG8KKwkgKiBjaXJjdW12ZW50IHRoaXMgaWRpb2N5IHJlZ2FyZGxlc3MuCisJICovCisJcGh5c19pZF9wcmVzZW50X21hcCA9IGlvYXBpY19waHlzX2lkX21hcChwaHlzX2NwdV9wcmVzZW50X21hcCk7CisKKwkvKgorCSAqIFNldCB0aGUgSU9BUElDIElEIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1QQyB0YWJsZS4KKwkgKi8KKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisKKwkJLyogUmVhZCB0aGUgcmVnaXN0ZXIgMCB2YWx1ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJcmVnXzAwLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJCisJCW9sZF9pZCA9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKKworCQlpZiAobXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID49IGdldF9waHlzaWNhbF9icm9hZGNhc3QoKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgSU8tQVBJQyMlZCBJRCBpcyAlZCBpbiB0aGUgTVBDIHRhYmxlIS4uLlxuIiwKKwkJCQlhcGljLCBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpOworCQkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZml4aW5nIHVwIHRvICVkLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQkJcmVnXzAwLmJpdHMuSUQpOworCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID0gcmVnXzAwLmJpdHMuSUQ7CisJCX0KKworCQkvKiBEb24ndCBjaGVjayBJL08gQVBJQyBJRHMgZm9yIHNvbWUgeEFQSUMgc3lzdGVtcy4gIFRoZXkgaGF2ZQorCQkgKiBubyBtZWFuaW5nIHdpdGhvdXQgdGhlIHNlcmlhbCBBUElDIGJ1cy4gKi8KKwkJaWYgKE5PX0lPQVBJQ19DSEVDSykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2ssIGlzIHRoZSBJRCByZWFsbHkgZnJlZT8gRXZlcnkgQVBJQyBpbiBhCisJCSAqIHN5c3RlbSBtdXN0IGhhdmUgYSB1bmlxdWUgSUQgb3Igd2UgZ2V0IGxvdHMgb2YgbmljZQorCQkgKiAnc3R1Y2sgb24gc21wX2ludmFsaWRhdGVfbmVlZGVkIElQSSB3YWl0JyBtZXNzYWdlcy4KKwkJICovCisJCWlmIChjaGVja19hcGljaWRfdXNlZChwaHlzX2lkX3ByZXNlbnRfbWFwLAorCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBJTy1BUElDIyVkIElEICVkIGlzIGFscmVhZHkgdXNlZCEuLi5cbiIsCisJCQkJYXBpYywgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCk7IGkrKykKKwkJCQlpZiAoIXBoeXNpZF9pc3NldChpLCBwaHlzX2lkX3ByZXNlbnRfbWFwKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA+PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpCisJCQkJcGFuaWMoIk1heCBBUElDIElEIGV4Y2VlZGVkIVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIi4uLiBmaXhpbmcgdXAgdG8gJWQuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIiwKKwkJCQlpKTsKKwkJCXBoeXNpZF9zZXQoaSwgcGh5c19pZF9wcmVzZW50X21hcCk7CisJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQgPSBpOworCQl9IGVsc2UgeworCQkJcGh5c2lkX21hc2tfdCB0bXA7CisJCQl0bXAgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQobXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlNldHRpbmcgJWQgaW4gdGhlICIKKwkJCQkJInBoeXNfaWRfcHJlc2VudF9tYXBcbiIsCisJCQkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7CisJCQlwaHlzaWRzX29yKHBoeXNfaWRfcHJlc2VudF9tYXAsIHBoeXNfaWRfcHJlc2VudF9tYXAsIHRtcCk7CisJCX0KKworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBJUlEgcm91dGluZyB0YWJsZQorCQkgKiBpZiB0aGUgSUQgY2hhbmdlZC4KKwkJICovCisJCWlmIChvbGRfaWQgIT0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKQorCQkJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspCisJCQkJaWYgKG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gb2xkX2lkKQorCQkJCQltcF9pcnFzW2ldLm1wY19kc3RhcGljCisJCQkJCQk9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKKworCQkvKgorCQkgKiBSZWFkIHRoZSByaWdodCB2YWx1ZSBmcm9tIHRoZSBNUEMgdGFibGUgYW5kCisJCSAqIHdyaXRlIGl0IGludG8gdGhlIElEIHJlZ2lzdGVyLgorCSAJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiLi4uY2hhbmdpbmcgSU8tQVBJQyBwaHlzaWNhbCBBUElDIElEIHRvICVkIC4uLiIsCisJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpOworCisJCXJlZ18wMC5iaXRzLklEID0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJaW9fYXBpY193cml0ZShhcGljLCAwLCByZWdfMDAucmF3KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sKKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlpZiAocmVnXzAwLmJpdHMuSUQgIT0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKQorCQkJcHJpbnRrKCJjb3VsZCBub3Qgc2V0IElEIVxuIik7CisJCWVsc2UKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiBvay5cbiIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYyh2b2lkKSB7IH0KKyNlbmRpZgorCisvKgorICogVGhlcmUgaXMgYSBuYXN0eSBidWcgaW4gc29tZSBvbGRlciBTTVAgYm9hcmRzLCB0aGVpciBtcHRhYmxlIGxpZXMKKyAqIGFib3V0IHRoZSB0aW1lciBJUlEuIFdlIGRvIHRoZSBmb2xsb3dpbmcgdG8gd29yayBhcm91bmQgdGhlIHNpdHVhdGlvbjoKKyAqCisgKgktIHRpbWVyIElSUSBkZWZhdWx0cyB0byBJTy1BUElDIElSUQorICoJLSBpZiB0aGlzIGZ1bmN0aW9uIGRldGVjdHMgdGhhdCB0aW1lciBJUlFzIGFyZSBkZWZ1bmN0LCB0aGVuIHdlIGZhbGwKKyAqCSAgYmFjayB0byBJU0EgdGltZXIgSVJRcworICovCitzdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pcnFfd29ya3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHQxID0gamlmZmllczsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwkvKiBMZXQgdGVuIHRpY2tzIHBhc3MuLi4gKi8KKwltZGVsYXkoKDEwICogMTAwMCkgLyBIWik7CisKKwkvKgorCSAqIEV4cGVjdCBhIGZldyB0aWNrcyBhdCBsZWFzdCwgdG8gYmUgc3VyZSBzb21lIHBvc3NpYmxlCisJICogZ2x1ZSBsb2dpYyBkb2VzIG5vdCBsb2NrIHVwIGFmdGVyIG9uZSBvciB0d28gZmlyc3QKKwkgKiB0aWNrcyBpbiBhIG5vbi1FeHRJTlQgbW9kZS4gIEFsc28gdGhlIGxvY2FsIEFQSUMKKwkgKiBtaWdodCBoYXZlIGNhY2hlZCBvbmUgRXh0SU5UIGludGVycnVwdC4gIEZpbmFsbHksIGF0CisJICogbGVhc3Qgb25lIHRpY2sgbWF5IGJlIGxvc3QgZHVlIHRvIGRlbGF5cy4KKwkgKi8KKwlpZiAoamlmZmllcyAtIHQxID4gNCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIHRoZSBTTVArSU9BUElDIGNhc2UgaXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlcmUgYXJlIGFuIHVuc3BlY2lmaWVkCisgKiBudW1iZXIgb2YgcGVuZGluZyBJUlEgZXZlbnRzIHVuaGFuZGxlZC4gVGhlc2UgY2FzZXMgYXJlIHZlcnkgcmFyZSwKKyAqIHNvIHdlICdyZXNlbmQnIHRoZXNlIElSUXMgdmlhIElQSXMsIHRvIHRoZSBzYW1lIENQVS4gSXQncyBtdWNoCisgKiBiZXR0ZXIgdG8gZG8gaXQgdGhpcyB3YXkgYXMgdGh1cyB3ZSBkbyBub3QgaGF2ZSB0byBiZSBhd2FyZSBvZgorICogJ3BlbmRpbmcnIGludGVycnVwdHMgaW4gdGhlIElSUSBwYXRoLCBleGNlcHQgYXQgdGhpcyBwb2ludC4KKyAqLworLyoKKyAqIEVkZ2UgdHJpZ2dlcmVkIG5lZWRzIHRvIHJlc2VuZCBhbnkgaW50ZXJydXB0CisgKiB0aGF0IHdhcyBkZWxheWVkIGJ1dCB0aGlzIGlzIG5vdyBoYW5kbGVkIGluIHRoZSBkZXZpY2UKKyAqIGluZGVwZW5kZW50IGNvZGUuCisgKi8KKworLyoKKyAqIFN0YXJ0aW5nIHVwIGEgZWRnZS10cmlnZ2VyZWQgSU8tQVBJQyBpbnRlcnJ1cHQgaXMKKyAqIG5hc3R5IC0gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgdGhlIGVkZ2UuCisgKiBJZiBpdCBpcyBhbHJlYWR5IGFzc2VydGVkIGZvciBzb21lIHJlYXNvbiwgd2UgbmVlZAorICogcmV0dXJuIDEgdG8gaW5kaWNhdGUgdGhhdCBpcyB3YXMgcGVuZGluZy4KKyAqCisgKiBUaGlzIGlzIG5vdCBjb21wbGV0ZSAtIHdlIHNob3VsZCBiZSBhYmxlIHRvIGZha2UKKyAqIGFuIGVkZ2UgZXZlbiBpZiBpdCBpc24ndCBvbiB0aGUgODI1OUEuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2VkZ2VfaW9hcGljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCB3YXNfcGVuZGluZyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlmIChpcnEgPCAxNikgeworCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCQlpZiAoaTgyNTlBX2lycV9wZW5kaW5nKGlycSkpCisJCQl3YXNfcGVuZGluZyA9IDE7CisJfQorCV9fdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB3YXNfcGVuZGluZzsKK30KKworLyoKKyAqIE9uY2Ugd2UgaGF2ZSByZWNvcmRlZCBJUlFfUEVORElORyBhbHJlYWR5LCB3ZSBjYW4gbWFzayB0aGUKKyAqIGludGVycnVwdCBmb3IgcmVhbC4gVGhpcyBwcmV2ZW50cyBJUlEgc3Rvcm1zIGZyb20gdW5oYW5kbGVkCisgKiBkZXZpY2VzLgorICovCitzdGF0aWMgdm9pZCBhY2tfZWRnZV9pb2FwaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJbW92ZV9pcnEoaXJxKTsKKwlpZiAoKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9QRU5ESU5HIHwgSVJRX0RJU0FCTEVEKSkKKwkJCQkJPT0gKElSUV9QRU5ESU5HIHwgSVJRX0RJU0FCTEVEKSkKKwkJbWFza19JT19BUElDX2lycShpcnEpOworCWFja19BUElDX2lycSgpOworfQorCisvKgorICogTGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgY2FuIGp1c3QgYmUgbWFza2VkLAorICogYW5kIHNodXR0aW5nIGRvd24gYW5kIHN0YXJ0aW5nIHVwIHRoZSBpbnRlcnJ1cHQKKyAqIGlzIHRoZSBzYW1lIGFzIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhlbSAtLSBleGNlcHQKKyAqIHdpdGggYSBzdGFydHVwIG5lZWQgdG8gcmV0dXJuIGEgIndhcyBwZW5kaW5nIiB2YWx1ZS4KKyAqCisgKiBMZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlCisgKiBkbyBub3QgdG91Y2ggYW55IElPLUFQSUMgcmVnaXN0ZXIgd2hpbGUgaGFuZGxpbmcKKyAqIHRoZW0uIFdlIGFjayB0aGUgQVBJQyBpbiB0aGUgZW5kLUlSUSBoYW5kbGVyLCBub3QKKyAqIGluIHRoZSBzdGFydC1JUlEtaGFuZGxlci4gUHJvdGVjdGlvbiBhZ2FpbnN0IHJlZW50cmFuY2UKKyAqIGZyb20gdGhlIHNhbWUgaW50ZXJydXB0IGlzIHN0aWxsIHByb3ZpZGVkLCBib3RoIGJ5IHRoZQorICogZ2VuZXJpYyBJUlEgbGF5ZXIgYW5kIGJ5IHRoZSBmYWN0IHRoYXQgYW4gdW5hY2tlZCBsb2NhbAorICogQVBJQyBkb2VzIG5vdCBhY2NlcHQgSVJRcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xldmVsX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7CisKKwlyZXR1cm4gMDsgLyogZG9uJ3QgY2hlY2sgZm9yIHBlbmRpbmcgKi8KK30KKworc3RhdGljIHZvaWQgZW5kX2xldmVsX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB2OworCWludCBpOworCisJbW92ZV9pcnEoaXJxKTsKKy8qCisgKiBJdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycmF0dW0gd2hpY2ggYWZmZWN0cyBhdCBsZWFzdCB2ZXJzaW9uIDB4MTEKKyAqIG9mIEkvTyBBUElDICh0aGF0J3MgdGhlIDgyMDkzQUEgYW5kIGNvcmVzIGludGVncmF0ZWQgaW50byB2YXJpb3VzCisgKiBjaGlwc2V0cykuICBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgYSBsZXZlbC10cmlnZ2VyZWQgaW50ZXJydXB0IGlzCisgKiBlcnJvbmVvdXNseSBkZWxpdmVyZWQgYXMgZWRnZS10cmlnZ2VyZWQgb25lIGJ1dCB0aGUgcmVzcGVjdGl2ZSBJUlIKKyAqIGJpdCBnZXRzIHNldCBuZXZlcnRoZWxlc3MuICBBcyBhIHJlc3VsdCB0aGUgSS9PIHVuaXQgZXhwZWN0cyBhbiBFT0kKKyAqIG1lc3NhZ2UgYnV0IGl0IHdpbGwgbmV2ZXIgYXJyaXZlIGFuZCBmdXJ0aGVyIGludGVycnVwdHMgYXJlIGJsb2NrZWQKKyAqIGZyb20gdGhlIHNvdXJjZS4gIFRoZSBleGFjdCByZWFzb24gaXMgc28gZmFyIHVua25vd24sIGJ1dCB0aGUKKyAqIHBoZW5vbWVub24gd2FzIG9ic2VydmVkIHdoZW4gdHdvIGNvbnNlY3V0aXZlIGludGVycnVwdCByZXF1ZXN0cworICogZnJvbSBhIGdpdmVuIHNvdXJjZSBnZXQgZGVsaXZlcmVkIHRvIHRoZSBzYW1lIENQVSBhbmQgdGhlIHNvdXJjZSBpcworICogdGVtcG9yYXJpbHkgZGlzYWJsZWQgaW4gYmV0d2Vlbi4KKyAqCisgKiBBIHdvcmthcm91bmQgaXMgdG8gc2ltdWxhdGUgYW4gRU9JIG1lc3NhZ2UgbWFudWFsbHkuICBXZSBhY2hpZXZlIGl0CisgKiBieSBzZXR0aW5nIHRoZSB0cmlnZ2VyIG1vZGUgdG8gZWRnZSBhbmQgdGhlbiB0byBsZXZlbCB3aGVuIHRoZSBlZGdlCisgKiB0cmlnZ2VyIG1vZGUgZ2V0cyBkZXRlY3RlZCBpbiB0aGUgVE1SIG9mIGEgbG9jYWwgQVBJQyBmb3IgYQorICogbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdC4gIFdlIG1hc2sgdGhlIHNvdXJjZSBmb3IgdGhlIHRpbWUgb2YgdGhlCisgKiBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgZXNjYXBpbmcgbWVhbndoaWxlLgorICogVGhlIGlkZWEgaXMgZnJvbSBNYW5mcmVkIFNwcmF1bC4gIC0tbWFjcm8KKyAqLworCWkgPSBJT19BUElDX1ZFQ1RPUihpcnEpOworCisJdiA9IGFwaWNfcmVhZChBUElDX1RNUiArICgoaSAmIH4weDFmKSA+PiAxKSk7CisKKwlhY2tfQVBJQ19pcnEoKTsKKworCWlmICghKHYgJiAoMSA8PCAoaSAmIDB4MWYpKSkpIHsKKwkJYXRvbWljX2luYygmaXJxX21pc19jb3VudCk7CisJCXNwaW5fbG9jaygmaW9hcGljX2xvY2spOworCQlfX21hc2tfYW5kX2VkZ2VfSU9fQVBJQ19pcnEoaXJxKTsKKwkJX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxKGlycSk7CisJCXNwaW5fdW5sb2NrKCZpb2FwaWNfbG9jayk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJcmV0dXJuIHN0YXJ0dXBfZWRnZV9pb2FwaWNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGFja19lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJYWNrX2VkZ2VfaW9hcGljX2lycShpcnEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbGV2ZWxfaW9hcGljX3ZlY3RvciAodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJcmV0dXJuIHN0YXJ0dXBfbGV2ZWxfaW9hcGljX2lycSAoaXJxKTsKK30KKworc3RhdGljIHZvaWQgZW5kX2xldmVsX2lvYXBpY192ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCWVuZF9sZXZlbF9pb2FwaWNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfSU9fQVBJQ192ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXNrX0lPX0FQSUNfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CisKKwl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV92ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IsCisJCQkJCWNwdW1hc2tfdCBjcHVfbWFzaykKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBjcHVfbWFzayk7Cit9CisjZW5kaWYKKworLyoKKyAqIExldmVsIGFuZCBlZGdlIHRyaWdnZXJlZCBJTy1BUElDIGludGVycnVwdHMgbmVlZCBkaWZmZXJlbnQgaGFuZGxpbmcsCisgKiBzbyB3ZSB1c2UgdHdvIHNlcGFyYXRlIElSUSBkZXNjcmlwdG9ycy4gRWRnZSB0cmlnZ2VyZWQgSVJRcyBjYW4gYmUKKyAqIGhhbmRsZWQgd2l0aCB0aGUgbGV2ZWwtdHJpZ2dlcmVkIGRlc2NyaXB0b3IsIGJ1dCB0aGF0IG9uZSBoYXMgc2xpZ2h0bHkKKyAqIG1vcmUgb3ZlcmhlYWQuIExldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIGNhbm5vdCBiZSBoYW5kbGVkIHdpdGggdGhlCisgKiBlZGdlLXRyaWdnZXJlZCBoYW5kbGVyLCB3aXRob3V0IHJpc2tpbmcgSVJRIHN0b3JtcyBhbmQgb3RoZXIgdWdseQorICogcmFjZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSA9IHsKKwkudHlwZW5hbWUgCT0gIklPLUFQSUMtZWRnZSIsCisJLnN0YXJ0dXAgCT0gc3RhcnR1cF9lZGdlX2lvYXBpYywKKwkuc2h1dGRvd24gCT0gc2h1dGRvd25fZWRnZV9pb2FwaWMsCisJLmVuYWJsZSAJPSBlbmFibGVfZWRnZV9pb2FwaWMsCisJLmRpc2FibGUgCT0gZGlzYWJsZV9lZGdlX2lvYXBpYywKKwkuYWNrIAkJPSBhY2tfZWRnZV9pb2FwaWMsCisJLmVuZCAJCT0gZW5kX2VkZ2VfaW9hcGljLAorCS5zZXRfYWZmaW5pdHkgCT0gc2V0X2lvYXBpY19hZmZpbml0eSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGUgPSB7CisJLnR5cGVuYW1lIAk9ICJJTy1BUElDLWxldmVsIiwKKwkuc3RhcnR1cCAJPSBzdGFydHVwX2xldmVsX2lvYXBpYywKKwkuc2h1dGRvd24gCT0gc2h1dGRvd25fbGV2ZWxfaW9hcGljLAorCS5lbmFibGUgCT0gZW5hYmxlX2xldmVsX2lvYXBpYywKKwkuZGlzYWJsZSAJPSBkaXNhYmxlX2xldmVsX2lvYXBpYywKKwkuYWNrIAkJPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaW9hcGljLAorCS5lbmQgCQk9IGVuZF9sZXZlbF9pb2FwaWMsCisJLnNldF9hZmZpbml0eSAJPSBzZXRfaW9hcGljX2FmZmluaXR5LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfSU9fQVBJQ190cmFwcyh2b2lkKQoreworCWludCBpcnE7CisKKwkvKgorCSAqIE5PVEUhIFRoZSBsb2NhbCBBUElDIGlzbid0IHZlcnkgZ29vZCBhdCBoYW5kbGluZworCSAqIG11bHRpcGxlIGludGVycnVwdHMgYXQgdGhlIHNhbWUgaW50ZXJydXB0IGxldmVsLgorCSAqIEFzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBieSB0YWtpbmcgdGhlCisJICogdmVjdG9yIG51bWJlciBhbmQgc2hpZnRpbmcgdGhhdCByaWdodCBieSA0LCB3ZQorCSAqIHdhbnQgdG8gc3ByZWFkIHRoZXNlIG91dCBhIGJpdCBzbyB0aGF0IHRoZXkgZG9uJ3QKKwkgKiBhbGwgZmFsbCBpbiB0aGUgc2FtZSBpbnRlcnJ1cHQgbGV2ZWwuCisJICoKKwkgKiBBbHNvLCB3ZSd2ZSBnb3QgdG8gYmUgY2FyZWZ1bCBub3QgdG8gdHJhc2ggZ2F0ZQorCSAqIDB4ODAsIGJlY2F1c2UgaW50IDB4ODAgaXMgaG0sIGtpbmQgb2YgaW1wb3J0YW50aXNoLiA7KQorCSAqLworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUyA7IGlycSsrKSB7CisJCWludCB0bXAgPSBpcnE7CisJCWlmICh1c2VfcGNpX3ZlY3RvcigpKSB7CisJCQlpZiAoIXBsYXRmb3JtX2xlZ2FjeV9pcnEodG1wKSkKKwkJCQlpZiAoKHRtcCA9IHZlY3Rvcl90b19pcnEodG1wKSkgPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChJT19BUElDX0lSUSh0bXApICYmICFJT19BUElDX1ZFQ1RPUih0bXApKSB7CisJCQkvKgorCQkJICogSG1tLi4gV2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcywKKwkJCSAqIHNvIGRlZmF1bHQgdG8gYW4gb2xkLWZhc2hpb25lZCA4MjU5CisJCQkgKiBpbnRlcnJ1cHQgaWYgd2UgY2FuLi4KKwkJCSAqLworCQkJaWYgKGlycSA8IDE2KQorCQkJCW1ha2VfODI1OUFfaXJxKGlycSk7CisJCQllbHNlCisJCQkJLyogU3RyYW5nZS4gT2gsIHdlbGwuLiAqLworCQkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZub19pcnFfdHlwZTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhcGljX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworfQorCitzdGF0aWMgdm9pZCBhY2tfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCWFja19BUElDX2lycSgpOworfQorCitzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgCT0gImxvY2FsLUFQSUMtZWRnZSIsCisJLnN0YXJ0dXAgCT0gTlVMTCwgLyogc3RhcnR1cF9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLworCS5zaHV0ZG93biAJPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLworCS5lbmFibGUgCT0gZW5hYmxlX2xhcGljX2lycSwKKwkuZGlzYWJsZSAJPSBkaXNhYmxlX2xhcGljX2lycSwKKwkuYWNrIAkJPSBhY2tfbGFwaWNfaXJxLAorCS5lbmQgCQk9IGVuZF9sYXBpY19pcnEKK307CisKK3N0YXRpYyB2b2lkIHNldHVwX25taSAodm9pZCkKK3sKKwkvKgorIAkgKiBEaXJ0eSB0cmljayB0byBlbmFibGUgdGhlIE5NSSB3YXRjaGRvZyAuLi4KKwkgKiBXZSBwdXQgdGhlIDgyNTlBIG1hc3RlciBpbnRvIEFFT0kgbW9kZSBhbmQKKwkgKiB1bm1hc2sgb24gYWxsIGxvY2FsIEFQSUNzIExWVDAgYXMgTk1JLgorCSAqCisJICogVGhlIGlkZWEgdG8gdXNlIHRoZSA4MjU5QSBpbiBBRU9JIG1vZGUgKCc4MjU5QSBWaXJ0dWFsIFdpcmUnKQorCSAqIGlzIGZyb20gTWFjaWVqIFcuIFJvenlja2kgLSBzbyB3ZSBkbyBub3QgaGF2ZSB0byBFT0kgZnJvbQorCSAqIHRoZSBOTUkgaGFuZGxlciBvciB0aGUgdGltZXIgaW50ZXJydXB0LgorCSAqLyAKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTyAiYWN0aXZhdGluZyBOTUkgV2F0Y2hkb2cgLi4uIik7CisKKwlvbl9lYWNoX2NwdShlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCwgTlVMTCwgMSwgMSk7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgZG9uZS5cbiIpOworfQorCisvKgorICogVGhpcyBsb29rcyBhIGJpdCBoYWNraXNoIGJ1dCBpdCdzIGFib3V0IHRoZSBvbmx5IG9uZSB3YXkgb2Ygc2VuZGluZworICogYSBmZXcgSU5UQSBjeWNsZXMgdG8gODI1OUFzIGFuZCBhbnkgYXNzb2NpYXRlZCBnbHVlIGxvZ2ljLiAgSUNSIGRvZXMKKyAqIG5vdCBzdXBwb3J0IHRoZSBFeHRJTlQgbW9kZSwgdW5mb3J0dW5hdGVseS4gIFdlIG5lZWQgdG8gc2VuZCB0aGVzZQorICogY3ljbGVzIGFzIHNvbWUgaTgyNDg5RFgtYmFzZWQgYm9hcmRzIGhhdmUgZ2x1ZSBsb2dpYyB0aGF0IGtlZXBzIHRoZQorICogODI1OUEgaW50ZXJydXB0IGxpbmUgYXNzZXJ0ZWQgdW50aWwgSU5UQS4gIC0tbWFjcm8KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19FeHRJTlRfbG9naWModm9pZCkKK3sKKwlpbnQgcGluLCBpOworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5MCwgZW50cnkxOworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwaW4gPSBmaW5kX2lzYV9pcnFfcGluKDgsIG1wX0lOVCk7CisJaWYgKHBpbiA9PSAtMSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJKigoKGludCAqKSZlbnRyeTApICsgMSkgPSBpb19hcGljX3JlYWQoMCwgMHgxMSArIDIgKiBwaW4pOworCSooKChpbnQgKikmZW50cnkwKSArIDApID0gaW9fYXBpY19yZWFkKDAsIDB4MTAgKyAyICogcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbik7CisKKwltZW1zZXQoJmVudHJ5MSwgMCwgc2l6ZW9mKGVudHJ5MSkpOworCisJZW50cnkxLmRlc3RfbW9kZSA9IDA7CQkJLyogcGh5c2ljYWwgZGVsaXZlcnkgKi8KKwllbnRyeTEubWFzayA9IDA7CQkJLyogdW5tYXNrIElSUSBub3cgKi8KKwllbnRyeTEuZGVzdC5waHlzaWNhbC5waHlzaWNhbF9kZXN0ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJZW50cnkxLmRlbGl2ZXJ5X21vZGUgPSBkZXN0X0V4dElOVDsKKwllbnRyeTEucG9sYXJpdHkgPSBlbnRyeTAucG9sYXJpdHk7CisJZW50cnkxLnRyaWdnZXIgPSAwOworCWVudHJ5MS52ZWN0b3IgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZSgwLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTEpICsgMSkpOworCWlvX2FwaWNfd3JpdGUoMCwgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkxKSArIDApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJc2F2ZV9jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzYXZlX2ZyZXFfc2VsZWN0ID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCk7CisJQ01PU19XUklURSgoc2F2ZV9mcmVxX3NlbGVjdCAmIH5SVENfUkFURV9TRUxFQ1QpIHwgMHg2LAorCQkgICBSVENfRlJFUV9TRUxFQ1QpOworCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sIHwgUlRDX1BJRSwgUlRDX0NPTlRST0wpOworCisJaSA9IDEwMDsKKwl3aGlsZSAoaS0tID4gMCkgeworCQltZGVsYXkoMTApOworCQlpZiAoKENNT1NfUkVBRChSVENfSU5UUl9GTEFHUykgJiBSVENfUEYpID09IFJUQ19QRikKKwkJCWkgLT0gMTA7CisJfQorCisJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1dSSVRFKHNhdmVfZnJlcV9zZWxlY3QsIFJUQ19GUkVRX1NFTEVDVCk7CisJY2xlYXJfSU9fQVBJQ19waW4oMCwgcGluKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoMCwgMHgxMSArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkwKSArIDEpKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTAgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MCkgKyAwKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBwYXJhbm9pZCwgYnV0IGl0J3Mgc3VwcG9zZWQgdG8gY29vcGVyYXRlIHdpdGgKKyAqIGEgd2lkZSByYW5nZSBvZiBib2FyZHMgYW5kIEJJT1MgYnVncy4gIEZvcnR1bmF0ZWx5IG9ubHkgdGhlIHRpbWVyIElSUQorICogaXMgc28gc2NyZXd5LiAgVGhhbmtzIHRvIEJyaWFuIFBlcmtpbnMgZm9yIHRlc3RpbmcvaGFja2luZyB0aGlzIGJlYXN0CisgKiBmYW5hdGljYWxseSBvbiBoaXMgdHJ1bHkgYnVnZ3kgYm9hcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja190aW1lcih2b2lkKQoreworCWludCBwaW4xLCBwaW4yOworCWludCB2ZWN0b3I7CisKKwkvKgorCSAqIGdldC9zZXQgdGhlIHRpbWVyIElSUSB2ZWN0b3I6CisJICovCisJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoMCk7CisJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFswXSk7CisKKwkvKgorCSAqIFN1YnRsZSwgY29kZSBpbiBkb190aW1lcl9pbnRlcnJ1cHQoKSBleHBlY3RzIGFuIEFFT0kKKwkgKiBtb2RlIGZvciB0aGUgODI1OUEgd2hlbmV2ZXIgaW50ZXJydXB0cyBhcmUgcm91dGVkCisJICogdGhyb3VnaCBJL08gQVBJQ3MuICBBbHNvIElSUTAgaGFzIHRvIGJlIGVuYWJsZWQgaW4KKwkgKiB0aGUgODI1OUEgd2hpY2ggaW1wbGllcyB0aGUgdmlydHVhbCB3aXJlIGhhcyB0byBiZQorCSAqIGRpc2FibGVkIGluIHRoZSBsb2NhbCBBUElDLgorCSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9FWFRJTlQpOworCWluaXRfODI1OUEoMSk7CisJdGltZXJfYWNrID0gMTsKKwllbmFibGVfODI1OUFfaXJxKDApOworCisJcGluMSA9IGZpbmRfaXNhX2lycV9waW4oMCwgbXBfSU5UKTsKKwlwaW4yID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiLi5USU1FUjogdmVjdG9yPTB4JTAyWCBwaW4xPSVkIHBpbjI9JWRcbiIsIHZlY3RvciwgcGluMSwgcGluMik7CisKKwlpZiAocGluMSAhPSAtMSkgeworCQkvKgorCQkgKiBPaywgZG9lcyBJUlEwIHRocm91Z2ggdGhlIElPQVBJQyB3b3JrPworCQkgKi8KKwkJdW5tYXNrX0lPX0FQSUNfaXJxKDApOworCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKKwkJCQlzZXR1cF9ubWkoKTsKKwkJCQllbmFibGVfODI1OUFfaXJxKDApOworCQkJCWNoZWNrX25taV93YXRjaGRvZygpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbjEpOworCQlwcmludGsoS0VSTl9FUlIgIi4uTVAtQklPUyBidWc6IDgyNTQgdGltZXIgbm90IGNvbm5lY3RlZCB0byBJTy1BUElDXG4iKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIChJUlEwKSB0aHJvdWdoIHRoZSA4MjU5QSAuLi4gIik7CisJaWYgKHBpbjIgIT0gLTEpIHsKKwkJcHJpbnRrKCJcbi4uLi4uIChmb3VuZCBwaW4gJWQpIC4uLiIsIHBpbjIpOworCQkvKgorCQkgKiBsZWdhY3kgZGV2aWNlcyBzaG91bGQgYmUgY29ubmVjdGVkIHRvIElPIEFQSUMgIzAKKwkJICovCisJCXNldHVwX0V4dElOVF9JUlEwX3BpbihwaW4yLCB2ZWN0b3IpOworCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJCXByaW50aygid29ya3MuXG4iKTsKKwkJCWlmIChwaW4xICE9IC0xKQorCQkJCXJlcGxhY2VfcGluX2F0X2lycSgwLCAwLCBwaW4xLCAwLCBwaW4yKTsKKwkJCWVsc2UKKwkJCQlhZGRfcGluX3RvX2lycSgwLCAwLCBwaW4yKTsKKwkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCQlzZXR1cF9ubWkoKTsKKwkJCQljaGVja19ubWlfd2F0Y2hkb2coKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBDbGVhbnVwLCBqdXN0IGluIGNhc2UgLi4uCisJCSAqLworCQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4yKTsKKwl9CisJcHJpbnRrKCIgZmFpbGVkLlxuIik7CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9JT19BUElDKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRpbWVyIGRvZXNuJ3Qgd29yayB0aHJvdWdoIHRoZSBJTy1BUElDIC0gZGlzYWJsaW5nIE5NSSBXYXRjaGRvZyFcbiIpOworCQlubWlfd2F0Y2hkb2cgPSAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIi4uLnRyeWluZyB0byBzZXQgdXAgdGltZXIgYXMgVmlydHVhbCBXaXJlIElSUS4uLiIpOworCisJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJaXJxX2Rlc2NbMF0uaGFuZGxlciA9ICZsYXBpY19pcnFfdHlwZTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRklYRUQgfCB2ZWN0b3IpOwkvKiBGaXhlZCBtb2RlICovCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKKworCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgeworCQlwcmludGsoIiB3b3Jrcy5cbiIpOworCQlyZXR1cm47CisJfQorCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9GSVhFRCB8IHZlY3Rvcik7CisJcHJpbnRrKCIgZmFpbGVkLlxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIGFzIEV4dElOVCBJUlEuLi4iKTsKKworCXRpbWVyX2FjayA9IDA7CisJaW5pdF84MjU5QSgwKTsKKwltYWtlXzgyNTlBX2lycSgwKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRVhUSU5UKTsKKworCXVubG9ja19FeHRJTlRfbG9naWMoKTsKKworCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgeworCQlwcmludGsoIiB3b3Jrcy5cbiIpOworCQlyZXR1cm47CisJfQorCXByaW50aygiIGZhaWxlZCA6KC5cbiIpOworCXBhbmljKCJJTy1BUElDICsgdGltZXIgZG9lc24ndCB3b3JrISAgQm9vdCB3aXRoIGFwaWM9ZGVidWcgYW5kIHNlbmQgYSAiCisJCSJyZXBvcnQuICBUaGVuIHRyeSBib290aW5nIHdpdGggdGhlICdub2FwaWMnIG9wdGlvbiIpOworfQorCisvKgorICoKKyAqIElSUSdzIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhlIFBJQyBpbiB0aGUgTVBTIElPQVBJQyBjYXNlLgorICogLSBJUlEyIGlzIHRoZSBjYXNjYWRlIElSUSwgYW5kIGNhbm5vdCBiZSBhIGlvLWFwaWMgSVJRLgorICogICBMaW51eCBkb2Vzbid0IHJlYWxseSBjYXJlLCBhcyBpdCdzIG5vdCBhY3R1YWxseSB1c2VkCisgKiAgIGZvciBhbnkgaW50ZXJydXB0IGhhbmRsaW5nIGFueXdheS4KKyAqLworI2RlZmluZSBQSUNfSVJRUwkoMSA8PCBQSUNfQ0FTQ0FERV9JUikKKwordm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQyh2b2lkKQoreworCWVuYWJsZV9JT19BUElDKCk7CisKKwlpZiAoYWNwaV9pb2FwaWMpCisJCWlvX2FwaWNfaXJxcyA9IH4wOwkvKiBhbGwgSVJRcyBnbyB0aHJvdWdoIElPQVBJQyAqLworCWVsc2UKKwkJaW9fYXBpY19pcnFzID0gflBJQ19JUlFTOworCisJcHJpbnRrKCJFTkFCTElORyBJTy1BUElDIElSUXNcbiIpOworCisJLyoKKwkgKiBTZXQgdXAgSU8tQVBJQyBJUlEgcm91dGluZy4KKwkgKi8KKwlpZiAoIWFjcGlfaW9hcGljKQorCQlzZXR1cF9pb2FwaWNfaWRzX2Zyb21fbXBjKCk7CisJc3luY19BcmJfSURzKCk7CisJc2V0dXBfSU9fQVBJQ19pcnFzKCk7CisJaW5pdF9JT19BUElDX3RyYXBzKCk7CisJY2hlY2tfdGltZXIoKTsKKwlpZiAoIWFjcGlfaW9hcGljKQorCQlwcmludF9JT19BUElDKCk7Cit9CisKKy8qCisgKglDYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lLiBJZiB3ZSBkaWRudCBmaW5kIGFueQorICoJQVBJQyBidWdzIHRoZW4gd2UgY2FuIGFsbG93IHRoZSBtb2RpZnkgZmFzdCBwYXRoCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGlvX2FwaWNfYnVnX2ZpbmFsaXplKHZvaWQpCit7CisJaWYoc2lzX2FwaWNfYnVnID09IC0xKQorCQlzaXNfYXBpY19idWcgPSAwOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGlvX2FwaWNfYnVnX2ZpbmFsaXplKTsKKworc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhIHsKKwlzdHJ1Y3Qgc3lzX2RldmljZSBkZXY7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnlbMF07Cit9Oworc3RhdGljIHN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSAqIG1wX2lvYXBpY19kYXRhW01BWF9JT19BUElDU107CisKK3N0YXRpYyBpbnQgaW9hcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgc3lzZnNfaW9hcGljX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwkKKwlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOworCWVudHJ5ID0gZGF0YS0+ZW50cnk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgeworCQkqKCgoaW50ICopZW50cnkpICsgMSkgPSBpb19hcGljX3JlYWQoZGV2LT5pZCwgMHgxMSArIDIgKiBpKTsKKwkJKigoKGludCAqKWVudHJ5KSArIDApID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDB4MTAgKyAyICogaSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb2FwaWNfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKmVudHJ5OworCXN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKKwlpbnQgaTsKKwkKKwlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOworCWVudHJ5ID0gZGF0YS0+ZW50cnk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDApOworCWlmIChyZWdfMDAuYml0cy5JRCAhPSBtcF9pb2FwaWNzW2Rldi0+aWRdLm1wY19hcGljaWQpIHsKKwkJcmVnXzAwLmJpdHMuSUQgPSBtcF9pb2FwaWNzW2Rldi0+aWRdLm1wY19hcGljaWQ7CisJCWlvX2FwaWNfd3JpdGUoZGV2LT5pZCwgMCwgcmVnXzAwLnJhdyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2Rldi0+aWRdOyBpICsrLCBlbnRyeSArKyApIHsKKwkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAweDExKzIqaSwgKigoKGludCAqKWVudHJ5KSsxKSk7CisJCWlvX2FwaWNfd3JpdGUoZGV2LT5pZCwgMHgxMCsyKmksICooKChpbnQgKillbnRyeSkrMCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGlvYXBpY19zeXNkZXZfY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiaW9hcGljIiksCisJLnN1c3BlbmQgPSBpb2FwaWNfc3VzcGVuZCwKKwkucmVzdW1lID0gaW9hcGljX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19pbml0X3N5c2ZzKHZvaWQpCit7CisJc3RydWN0IHN5c19kZXZpY2UgKiBkZXY7CisJaW50IGksIHNpemUsIGVycm9yID0gMDsKKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpb2FwaWNfc3lzZGV2X2NsYXNzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKysgKSB7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHN5c19kZXZpY2UpICsgbnJfaW9hcGljX3JlZ2lzdGVyc1tpXSAKKwkJCSogc2l6ZW9mKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5KTsKKwkJbXBfaW9hcGljX2RhdGFbaV0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1wX2lvYXBpY19kYXRhW2ldKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHN1c3BlbmQvcmVzdW1lIElPQVBJQyAlZFxuIiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQltZW1zZXQobXBfaW9hcGljX2RhdGFbaV0sIDAsIHNpemUpOworCQlkZXYgPSAmbXBfaW9hcGljX2RhdGFbaV0tPmRldjsKKwkJZGV2LT5pZCA9IGk7IAorCQlkZXYtPmNscyA9ICZpb2FwaWNfc3lzZGV2X2NsYXNzOworCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcihkZXYpOworCQlpZiAoZXJyb3IpIHsKKwkJCWtmcmVlKG1wX2lvYXBpY19kYXRhW2ldKTsKKwkJCW1wX2lvYXBpY19kYXRhW2ldID0gTlVMTDsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3VzcGVuZC9yZXN1bWUgSU9BUElDICVkXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChpb2FwaWNfaW5pdF9zeXNmcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEktYmFzZWQgSU9BUElDIENvbmZpZ3VyYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisKK2ludCBfX2luaXQgaW9fYXBpY19nZXRfdW5pcXVlX2lkIChpbnQgaW9hcGljLCBpbnQgYXBpY19pZCkKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7CisJc3RhdGljIHBoeXNpZF9tYXNrX3QgYXBpY19pZF9tYXAgPSBQSFlTSURfTUFTS19OT05FOworCXBoeXNpZF9tYXNrX3QgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGkgPSAwOworCisJLyoKKwkgKiBUaGUgUDQgcGxhdGZvcm0gc3VwcG9ydHMgdXAgdG8gMjU2IEFQSUMgSURzIG9uIHR3byBzZXBhcmF0ZSBBUElDIAorCSAqIGJ1c2VzIChvbmUgZm9yIExBUElDcywgb25lIGZvciBJT0FQSUNzKSwgd2hlcmUgcHJlZGVjZXNzb3JzIG9ubHkgCisJICogc3VwcG9ydHMgdXAgdG8gMTYgb24gb25lIHNoYXJlZCBBUElDIGJ1cy4KKwkgKiAKKwkgKiBUQkQ6IEV4cGFuZCBMQVBJQy9JT0FQSUMgc3VwcG9ydCBvbiBQNC1jbGFzcyBzeXN0ZW1zIHRvIHRha2UgZnVsbAorCSAqICAgICAgYWR2YW50YWdlIG9mIG5ldyBBUElDIGJ1cyBhcmNoaXRlY3R1cmUuCisJICovCisKKwlpZiAocGh5c2lkc19lbXB0eShhcGljX2lkX21hcCkpCisJCWFwaWNfaWRfbWFwID0gaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKGFwaWNfaWQgPj0gZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklPQVBJQ1slZF06IEludmFsaWQgYXBpY19pZCAlZCwgdHJ5aW5nICIKKwkJCSIlZFxuIiwgaW9hcGljLCBhcGljX2lkLCByZWdfMDAuYml0cy5JRCk7CisJCWFwaWNfaWQgPSByZWdfMDAuYml0cy5JRDsKKwl9CisKKwkvKgorCSAqIEV2ZXJ5IEFQSUMgaW4gYSBzeXN0ZW0gbXVzdCBoYXZlIGEgdW5pcXVlIElEIG9yIHdlIGdldCBsb3RzIG9mIG5pY2UgCisJICogJ3N0dWNrIG9uIHNtcF9pbnZhbGlkYXRlX25lZWRlZCBJUEkgd2FpdCcgbWVzc2FnZXMuCisJICovCisJaWYgKGNoZWNrX2FwaWNpZF91c2VkKGFwaWNfaWRfbWFwLCBhcGljX2lkKSkgeworCisJCWZvciAoaSA9IDA7IGkgPCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCk7IGkrKykgeworCQkJaWYgKCFjaGVja19hcGljaWRfdXNlZChhcGljX2lkX21hcCwgaSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpCisJCQlwYW5pYygiTWF4IGFwaWNfaWQgZXhjZWVkZWQhXG4iKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0FQSUNbJWRdOiBhcGljX2lkICVkIGFscmVhZHkgdXNlZCwgIgorCQkJInRyeWluZyAlZFxuIiwgaW9hcGljLCBhcGljX2lkLCBpKTsKKworCQlhcGljX2lkID0gaTsKKwl9IAorCisJdG1wID0gYXBpY2lkX3RvX2NwdV9wcmVzZW50KGFwaWNfaWQpOworCXBoeXNpZHNfb3IoYXBpY19pZF9tYXAsIGFwaWNfaWRfbWFwLCB0bXApOworCisJaWYgKHJlZ18wMC5iaXRzLklEICE9IGFwaWNfaWQpIHsKKwkJcmVnXzAwLmJpdHMuSUQgPSBhcGljX2lkOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlpb19hcGljX3dyaXRlKGlvYXBpYywgMCwgcmVnXzAwLnJhdyk7CisJCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKHJlZ18wMC5iaXRzLklEICE9IGFwaWNfaWQpCisJCQlwYW5pYygiSU9BUElDWyVkXTogVW5hYmxlIGNoYW5nZSBhcGljX2lkIVxuIiwgaW9hcGljKTsKKwl9CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTworCQkJIklPQVBJQ1slZF06IEFzc2lnbmVkIGFwaWNfaWQgJWRcbiIsIGlvYXBpYywgYXBpY19pZCk7CisKKwlyZXR1cm4gYXBpY19pZDsKK30KKworCitpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3ZlcnNpb24gKGludCBpb2FwaWMpCit7CisJdW5pb24gSU9fQVBJQ19yZWdfMDEJcmVnXzAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZWdfMDEuYml0cy52ZXJzaW9uOworfQorCisKK2ludCBfX2luaXQgaW9fYXBpY19nZXRfcmVkaXJfZW50cmllcyAoaW50IGlvYXBpYykKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMQlyZWdfMDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMS5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlZ18wMS5iaXRzLmVudHJpZXM7Cit9CisKKworaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nIChpbnQgaW9hcGljLCBpbnQgcGluLCBpbnQgaXJxLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKK3sKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFJT19BUElDX0lSUShpcnEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSU9BUElDWyVkXTogSW52YWxpZCByZWZlcmVuY2UgdG8gSVJRIDBcbiIsCisJCQlpb2FwaWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEdlbmVyYXRlIGEgUENJIElSUSByb3V0aW5nIGVudHJ5IGFuZCBwcm9ncmFtIHRoZSBJT0FQSUMgYWNjb3JkaW5nbHkuCisJICogTm90ZSB0aGF0IHdlIG1hc2sgKGRpc2FibGUpIElSUXMgbm93IC0tIHRoZXNlIGdldCBlbmFibGVkIHdoZW4gdGhlCisJICogY29ycmVzcG9uZGluZyBkZXZpY2UgZHJpdmVyIHJlZ2lzdGVycyBmb3IgdGhpcyBJUlEuCisJICovCisKKwltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CisKKwllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJZW50cnkuZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKwllbnRyeS50cmlnZ2VyID0gZWRnZV9sZXZlbDsKKwllbnRyeS5wb2xhcml0eSA9IGFjdGl2ZV9oaWdoX2xvdzsKKwllbnRyeS5tYXNrICA9IDE7CisKKwkvKgorCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCisJICovCisJaWYgKGlycSA+PSAxNikKKwkJYWRkX3Bpbl90b19pcnEoaXJxLCBpb2FwaWMsIHBpbik7CisKKwllbnRyeS52ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEpOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgS0VSTl9ERUJVRyAiSU9BUElDWyVkXTogU2V0IFBDSSByb3V0aW5nIGVudHJ5ICIKKwkJIiglZC0lZCAtPiAweCV4IC0+IElSUSAlZCBNb2RlOiVpIEFjdGl2ZTolaSlcbiIsIGlvYXBpYywKKwkJbXBfaW9hcGljc1tpb2FwaWNdLm1wY19hcGljaWQsIHBpbiwgZW50cnkudmVjdG9yLCBpcnEsCisJCWVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdyk7CisKKwlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIGVudHJ5LnZlY3RvciwgZWRnZV9sZXZlbCk7CisKKwlpZiAoIWlvYXBpYyAmJiAoaXJxIDwgMTYpKQorCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShpb2FwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI1MTYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqCWxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKKyAqCisgKiBUaGlzIGNvbnRhaW5zIHRoZSBpby1wZXJtaXNzaW9uIGJpdG1hcCBjb2RlIC0gd3JpdHRlbiBieSBvYnosIHdpdGggY2hhbmdlcworICogYnkgTGludXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKy8qIFNldCBFWFRFTlQgYml0cyBzdGFydGluZyBhdCBCQVNFIGluIEJJVE1BUCB0byB2YWx1ZSBUVVJOX09OLiAqLworc3RhdGljIHZvaWQgc2V0X2JpdG1hcCh1bnNpZ25lZCBsb25nICpiaXRtYXAsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgZXh0ZW50LCBpbnQgbmV3X3ZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nICpiaXRtYXBfYmFzZSA9IGJpdG1hcCArIChiYXNlIC8gQklUU19QRVJfTE9ORyk7CisJdW5zaWduZWQgaW50IGxvd19pbmRleCA9IGJhc2UgJiAoQklUU19QRVJfTE9ORy0xKTsKKwlpbnQgbGVuZ3RoID0gbG93X2luZGV4ICsgZXh0ZW50OworCisJaWYgKGxvd19pbmRleCAhPSAwKSB7CisJCW1hc2sgPSAofjBVTCA8PCBsb3dfaW5kZXgpOworCQlpZiAobGVuZ3RoIDwgQklUU19QRVJfTE9ORykKKwkJCW1hc2sgJj0gfih+MFVMIDw8IGxlbmd0aCk7CisJCWlmIChuZXdfdmFsdWUpCisJCQkqYml0bWFwX2Jhc2UrKyB8PSBtYXNrOworCQllbHNlCisJCQkqYml0bWFwX2Jhc2UrKyAmPSB+bWFzazsKKwkJbGVuZ3RoIC09IEJJVFNfUEVSX0xPTkc7CisJfQorCisJbWFzayA9IChuZXdfdmFsdWUgPyB+MFVMIDogMFVMKTsKKwl3aGlsZSAobGVuZ3RoID49IEJJVFNfUEVSX0xPTkcpIHsKKwkJKmJpdG1hcF9iYXNlKysgPSBtYXNrOworCQlsZW5ndGggLT0gQklUU19QRVJfTE9ORzsKKwl9CisKKwlpZiAobGVuZ3RoID4gMCkgeworCQltYXNrID0gfih+MFVMIDw8IGxlbmd0aCk7CisJCWlmIChuZXdfdmFsdWUpCisJCQkqYml0bWFwX2Jhc2UrKyB8PSBtYXNrOworCQllbHNlCisJCQkqYml0bWFwX2Jhc2UrKyAmPSB+bWFzazsKKwl9Cit9CisKKworLyoKKyAqIHRoaXMgY2hhbmdlcyB0aGUgaW8gcGVybWlzc2lvbnMgYml0bWFwIGluIHRoZSBjdXJyZW50IHRhc2suCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wZXJtKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBudW0sIGludCB0dXJuX29uKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbWF4X2xvbmcsIGJ5dGVzLCBieXRlc191cGRhdGVkOworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICogdCA9ICZjdXJyZW50LT50aHJlYWQ7CisJc3RydWN0IHRzc19zdHJ1Y3QgKiB0c3M7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwOworCisJaWYgKChmcm9tICsgbnVtIDw9IGZyb20pIHx8IChmcm9tICsgbnVtID4gSU9fQklUTUFQX0JJVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHVybl9vbiAmJiAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogSWYgaXQncyB0aGUgZmlyc3QgaW9wZXJtKCkgY2FsbCBpbiB0aGlzIHRocmVhZCdzIGxpZmV0aW1lLCBzZXQgdGhlCisJICogSU8gYml0bWFwIHVwLiBpb3Blcm0oKSBpcyBtdWNoIGxlc3MgdGltaW5nIGNyaXRpY2FsIHRoYW4gY2xvbmUoKSwKKwkgKiB0aGlzIGlzIHdoeSB3ZSBkZWxheSB0aGlzIG9wZXJhdGlvbiB1bnRpbCBub3c6CisJICovCisJaWYgKCF0LT5pb19iaXRtYXBfcHRyKSB7CisJCWJpdG1hcCA9IGttYWxsb2MoSU9fQklUTUFQX0JZVEVTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFiaXRtYXApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1zZXQoYml0bWFwLCAweGZmLCBJT19CSVRNQVBfQllURVMpOworCQl0LT5pb19iaXRtYXBfcHRyID0gYml0bWFwOworCX0KKworCS8qCisJICogZG8gaXQgaW4gdGhlIHBlci10aHJlYWQgY29weSBhbmQgaW4gdGhlIFRTUyAuLi4KKwkgKgorCSAqIERpc2FibGUgcHJlZW1wdGlvbiB2aWEgZ2V0X2NwdSgpIC0gd2UgbXVzdCBub3Qgc3dpdGNoIGF3YXkKKwkgKiBiZWNhdXNlIHRoZSAtPmlvX2JpdG1hcF9tYXggdmFsdWUgbXVzdCBtYXRjaCB0aGUgYml0bWFwCisJICogY29udGVudHM6CisJICovCisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisKKwlzZXRfYml0bWFwKHQtPmlvX2JpdG1hcF9wdHIsIGZyb20sIG51bSwgIXR1cm5fb24pOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIGEgKHBvc3NpYmx5IG5ldykgbWF4aW11bS4gVGhpcyBpcyBzaW1wbGUgYW5kIHN0dXBpZCwKKwkgKiB0byBrZWVwIGl0IG9idmlvdXNseSBjb3JyZWN0OgorCSAqLworCW1heF9sb25nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgSU9fQklUTUFQX0xPTkdTOyBpKyspCisJCWlmICh0LT5pb19iaXRtYXBfcHRyW2ldICE9IH4wVUwpCisJCQltYXhfbG9uZyA9IGk7CisKKwlieXRlcyA9IChtYXhfbG9uZyArIDEpICogc2l6ZW9mKGxvbmcpOworCWJ5dGVzX3VwZGF0ZWQgPSBtYXgoYnl0ZXMsIHQtPmlvX2JpdG1hcF9tYXgpOworCisJdC0+aW9fYml0bWFwX21heCA9IGJ5dGVzOworCisJLyoKKwkgKiBTZXRzIHRoZSBsYXp5IHRyaWdnZXIgc28gdGhhdCB0aGUgbmV4dCBJL08gb3BlcmF0aW9uIHdpbGwKKwkgKiByZWxvYWQgdGhlIGNvcnJlY3QgYml0bWFwLgorCSAqLworCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVRfTEFaWTsKKworCXB1dF9jcHUoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc3lzX2lvcGwgaGFzIHRvIGJlIHVzZWQgd2hlbiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIElPIHBvcnRzCisgKiBiZXlvbmQgdGhlIDB4M2ZmIHJhbmdlOiB0byBnZXQgdGhlIGZ1bGwgNjU1MzYgcG9ydHMgYml0bWFwcGVkCisgKiB5b3UnZCBuZWVkIDhrQiBvZiBiaXRtYXBzL3Byb2Nlc3MsIHdoaWNoIGlzIGEgYml0IGV4Y2Vzc2l2ZS4KKyAqCisgKiBIZXJlIHdlIGp1c3QgY2hhbmdlIHRoZSBlZmxhZ3MgdmFsdWUgb24gdGhlIHN0YWNrOiB3ZSBhbGxvdworICogb25seSB0aGUgc3VwZXItdXNlciB0byBkbyBpdC4gVGhpcyBkZXBlbmRzIG9uIHRoZSBzdGFjay1sYXlvdXQKKyAqIG9uIHN5c3RlbS1jYWxsIGVudHJ5IC0gc2VlIGFsc28gZm9yaygpIGFuZCB0aGUgc2lnbmFsIGhhbmRsaW5nCisgKiBjb2RlLgorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wbCh1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJnVudXNlZDsKKwl1bnNpZ25lZCBpbnQgbGV2ZWwgPSByZWdzLT5lYng7CisJdW5zaWduZWQgaW50IG9sZCA9IChyZWdzLT5lZmxhZ3MgPj4gMTIpICYgMzsKKworCWlmIChsZXZlbCA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFRyeWluZyB0byBnYWluIG1vcmUgcHJpdmlsZWdlcz8gKi8KKwlpZiAobGV2ZWwgPiBvbGQpIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisJcmVncy0+ZWZsYWdzID0gKHJlZ3MtPmVmbGFncyAmfiAweDMwMDBVTCkgfCAobGV2ZWwgPDwgMTIpOworCS8qIE1ha2Ugc3VyZSB3ZSByZXR1cm4gdGhlIGxvbmcgd2F5IChub3Qgc3lzZW50ZXIpICovCisJc2V0X3RocmVhZF9mbGFnKFRJRl9JUkVUKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTQ1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICoJbGludXgvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworICoKKyAqCUNvcHlyaWdodCAoQykgMTk5MiwgMTk5OCBMaW51cyBUb3J2YWxkcywgSW5nbyBNb2xuYXIKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxvd2VzdCBsZXZlbCB4ODYtc3BlY2lmaWMgaW50ZXJydXB0CisgKiBlbnRyeSwgaXJxLXN0YWNrcyBhbmQgaXJxIHN0YXRpc3RpY3MgY29kZS4gQWxsIHRoZSByZW1haW5pbmcKKyAqIGlycSBsb2dpYyBpcyBkb25lIGJ5IHRoZSBnZW5lcmljIGtlcm5lbC9pcnEvIGNvZGUgYW5kCisgKiBieSB0aGUgeDg2LXNwZWNpZmljIGlycSBjb250cm9sbGVyIGNvZGUuIChlLmcuIGk4MjU5LmMgYW5kCisgKiBpb19hcGljLmMuKQorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKworREVGSU5FX1BFUl9DUFUoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpIF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXA7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woaXJxX3N0YXQpOworCisjaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgorICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMuCisgKi8KK3ZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlwcmludGsoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR180S1NUQUNLUworLyoKKyAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIGNvbnRleHRzICh0aHJlYWQgaW5mb3JtYXRpb24gYW5kIHN0YWNrKQorICovCit1bmlvbiBpcnFfY3R4IHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gICAgICB0aW5mbzsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07Cit9OworCitzdGF0aWMgdW5pb24gaXJxX2N0eCAqaGFyZGlycV9jdHhbTlJfQ1BVU107CitzdGF0aWMgdW5pb24gaXJxX2N0eCAqc29mdGlycV9jdHhbTlJfQ1BVU107CisjZW5kaWYKKworLyoKKyAqIGRvX0lSUSBoYW5kbGVzIGFsbCBub3JtYWwgZGV2aWNlIElSUSdzICh0aGUgc3BlY2lhbAorICogU01QIGNyb3NzLUNQVSBpbnRlcnJ1cHRzIGhhdmUgdGhlaXIgb3duIHNwZWNpZmljCisgKiBoYW5kbGVycykuCisgKi8KK2Zhc3RjYWxsIHVuc2lnbmVkIGludCBkb19JUlEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CQorCS8qIGhpZ2ggYml0cyB1c2VkIGluIHJldF9mcm9tXyBjb2RlICovCisJaW50IGlycSA9IHJlZ3MtPm9yaWdfZWF4ICYgMHhmZjsKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKwl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7CisJdTMyICppc3A7CisjZW5kaWYKKworCWlycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XCisJLyogRGVidWdnaW5nIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdzogaXMgdGhlcmUgbGVzcyB0aGFuIDFLQiBmcmVlPyAqLworCXsKKwkJbG9uZyBlc3A7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImFuZGwgJSVlc3AsJTAiIDoKKwkJCQkJIj1yIiAoZXNwKSA6ICIwIiAoVEhSRUFEX1NJWkUgLSAxKSk7CisJCWlmICh1bmxpa2VseShlc3AgPCAoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgKyBTVEFDS19XQVJOKSkpIHsKKwkJCXByaW50aygiZG9fSVJROiBzdGFjayBvdmVyZmxvdzogJWxkXG4iLAorCQkJCWVzcCAtIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCisKKwljdXJjdHggPSAodW5pb24gaXJxX2N0eCAqKSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJaXJxY3R4ID0gaGFyZGlycV9jdHhbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCS8qCisJICogdGhpcyBpcyB3aGVyZSB3ZSBzd2l0Y2ggdG8gdGhlIElSUSBzdGFjay4gSG93ZXZlciwgaWYgd2UgYXJlCisJICogYWxyZWFkeSB1c2luZyB0aGUgSVJRIHN0YWNrIChiZWNhdXNlIHdlIGludGVycnVwdGVkIGEgaGFyZGlycQorCSAqIGhhbmRsZXIpIHdlIGNhbid0IGRvIHRoYXQgYW5kIGp1c3QgaGF2ZSB0byBrZWVwIHVzaW5nIHRoZQorCSAqIGN1cnJlbnQgc3RhY2sgKHdoaWNoIGlzIHRoZSBpcnEgc3RhY2sgYWxyZWFkeSBhZnRlciBhbGwpCisJICovCisJaWYgKGN1cmN0eCAhPSBpcnFjdHgpIHsKKwkJaW50IGFyZzEsIGFyZzIsIGVieDsKKworCQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIElSUSBzdGFjayAqLworCQlpc3AgPSAodTMyKikgKChjaGFyKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7CisJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCisJCWFzbSB2b2xhdGlsZSgKKwkJCSIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgIFxuIgorCQkJIiAgICAgICBjYWxsICAgIF9fZG9fSVJRICAgICAgICAgXG4iCisJCQkiICAgICAgIG1vdmwgICAlJWVieCwlJWVzcCAgICAgIFxuIgorCQkJOiAiPWEiIChhcmcxKSwgIj1kIiAoYXJnMiksICI9YiIgKGVieCkKKwkJCTogICIwIiAoaXJxKSwgICAiMSIgKHJlZ3MpLCAgIjIiIChpc3ApCisJCQk6ICJtZW1vcnkiLCAiY2MiLCAiZWN4IgorCQkpOworCX0gZWxzZQorI2VuZGlmCisJCV9fZG9fSVJRKGlycSwgcmVncyk7CisKKwlpcnFfZXhpdCgpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKworLyoKKyAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0CisgKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgorICovCitzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KKwkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisKK3N0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQorCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKworLyoKKyAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCisgKi8KK3ZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpCit7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCisJaWYgKGhhcmRpcnFfY3R4W2NwdV0pCisJCXJldHVybjsKKworCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4KikgJmhhcmRpcnFfc3RhY2tbY3B1KlRIUkVBRF9TSVpFXTsKKwlpcnFjdHgtPnRpbmZvLnRhc2sgICAgICAgICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmV4ZWNfZG9tYWluICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmNwdSAgICAgICAgICAgICAgID0gY3B1OworCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCAgICAgPSBIQVJESVJRX09GRlNFVDsKKwlpcnFjdHgtPnRpbmZvLmFkZHJfbGltaXQgICAgICAgID0gTUFLRV9NTV9TRUcoMCk7CisKKwloYXJkaXJxX2N0eFtjcHVdID0gaXJxY3R4OworCisJaXJxY3R4ID0gKHVuaW9uIGlycV9jdHgqKSAmc29mdGlycV9zdGFja1tjcHUqVEhSRUFEX1NJWkVdOworCWlycWN0eC0+dGluZm8udGFzayAgICAgICAgICAgICAgPSBOVUxMOworCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4gICAgICAgPSBOVUxMOworCWlycWN0eC0+dGluZm8uY3B1ICAgICAgICAgICAgICAgPSBjcHU7CisJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50ICAgICA9IFNPRlRJUlFfT0ZGU0VUOworCWlycWN0eC0+dGluZm8uYWRkcl9saW1pdCAgICAgICAgPSBNQUtFX01NX1NFRygwKTsKKworCXNvZnRpcnFfY3R4W2NwdV0gPSBpcnFjdHg7CisKKwlwcmludGsoIkNQVSAldSBpcnFzdGFja3MsIGhhcmQ9JXAgc29mdD0lcFxuIiwKKwkJY3B1LGhhcmRpcnFfY3R4W2NwdV0sc29mdGlycV9jdHhbY3B1XSk7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgX19kb19zb2Z0aXJxKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgZG9fc29mdGlycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRocmVhZF9pbmZvICpjdXJjdHg7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCXUzMiAqaXNwOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobG9jYWxfc29mdGlycV9wZW5kaW5nKCkpIHsKKwkJY3VyY3R4ID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCQlpcnFjdHggPSBzb2Z0aXJxX2N0eFtzbXBfcHJvY2Vzc29yX2lkKCldOworCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRhc2s7CisJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCisJCS8qIGJ1aWxkIHRoZSBzdGFjayBmcmFtZSBvbiB0aGUgc29mdGlycSBzdGFjayAqLworCQlpc3AgPSAodTMyKikgKChjaGFyKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCisJCWFzbSB2b2xhdGlsZSgKKwkJCSIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgXG4iCisJCQkiICAgICAgIGNhbGwgICAgX19kb19zb2Z0aXJxICAgIFxuIgorCQkJIiAgICAgICBtb3ZsICAgICUlZWJ4LCUlZXNwICAgICBcbiIKKwkJCTogIj1iIihpc3ApCisJCQk6ICIwIihpc3ApCisJCQk6ICJtZW1vcnkiLCAiY2MiLCAiZWR4IiwgImVjeCIsICJlYXgiCisJCSk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKGRvX3NvZnRpcnEpOworI2VuZGlmCisKKy8qCisgKiBJbnRlcnJ1cHQgc3RhdGlzdGljczoKKyAqLworCithdG9taWNfdCBpcnFfZXJyX2NvdW50OworCisvKgorICogL3Byb2MvaW50ZXJydXB0cyBwcmludGluZzoKKyAqLworCitpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKK3sKKwlpbnQgaSA9ICoobG9mZl90ICopIHYsIGo7CisJc3RydWN0IGlycWFjdGlvbiAqIGFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGkgPT0gMCkgeworCQlzZXFfcHJpbnRmKHAsICIgICAgICAgICAgICIpOworCQlmb3IgKGo9MDsgajxOUl9DUFVTOyBqKyspCisJCQlpZiAoY3B1X29ubGluZShqKSkKKwkJCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKwl9CisKKwlpZiAoaSA8IE5SX0lSUVMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKKwkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOworCQlpZiAoIWFjdGlvbikKKwkJCWdvdG8gc2tpcDsKKwkJc2VxX3ByaW50ZihwLCAiJTNkOiAiLGkpOworI2lmbmRlZiBDT05GSUdfU01QCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxcyhpKSk7CisjZWxzZQorCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CisjZW5kaWYKKwkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5oYW5kbGVyLT50eXBlbmFtZSk7CisJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOworCisJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCisJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKKworCQlzZXFfcHV0YyhwLCAnXG4nKTsKK3NraXA6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykgeworCQlzZXFfcHJpbnRmKHAsICJOTUk6ICIpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBubWlfY291bnQoaikpOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJc2VxX3ByaW50ZihwLCAiTE9DOiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKKwkJCWlmIChjcHVfb25saW5lKGopKQorCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwKKwkJCQkJcGVyX2NwdShpcnFfc3RhdCxqKS5hcGljX3RpbWVyX2lycXMpOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKyNlbmRpZgorCQlzZXFfcHJpbnRmKHAsICJFUlI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCisJCXNlcV9wcmludGYocCwgIk1JUzogJTEwdVxuIiwgYXRvbWljX3JlYWQoJmlycV9taXNfY291bnQpKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxNjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogIEtlcm5lbCBQcm9iZXMgKEtQcm9iZXMpCisgKiAgYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDAyLCAyMDA0CisgKgorICogMjAwMi1PY3QJQ3JlYXRlZCBieSBWYW1zaSBLcmlzaG5hIFMgPHZhbXNpX2tyaXNobmFAaW4uaWJtLmNvbT4gS2VybmVsCisgKgkJUHJvYmVzIGluaXRpYWwgaW1wbGVtZW50YXRpb24gKCBpbmNsdWRlcyBjb250cmlidXRpb25zIGZyb20KKyAqCQlSdXN0eSBSdXNzZWxsKS4KKyAqIDIwMDQtSnVseQlTdXBhcm5hIEJoYXR0YWNoYXJ5YSA8c3VwYXJuYUBpbi5pYm0uY29tPiBhZGRlZCBqdW1wZXIgcHJvYmVzCisgKgkJaW50ZXJmYWNlIHRvIGFjY2VzcyBmdW5jdGlvbiBhcmd1bWVudHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworLyoga3Byb2JlX3N0YXR1cyBzZXR0aW5ncyAqLworI2RlZmluZSBLUFJPQkVfSElUX0FDVElWRQkweDAwMDAwMDAxCisjZGVmaW5lIEtQUk9CRV9ISVRfU1MJCTB4MDAwMDAwMDIKKworc3RhdGljIHN0cnVjdCBrcHJvYmUgKmN1cnJlbnRfa3Byb2JlOworc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1cywga3Byb2JlX29sZF9lZmxhZ3MsIGtwcm9iZV9zYXZlZF9lZmxhZ3M7CitzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CitzdGF0aWMgbG9uZyAqanByb2JlX3NhdmVkX2VzcDsKKy8qIGNvcHkgb2YgdGhlIGtlcm5lbCBzdGFjayBhdCB0aGUgcHJvYmUgZmlyZSB0aW1lICovCitzdGF0aWMga3Byb2JlX29wY29kZV90IGpwcm9iZXNfc3RhY2tbTUFYX1NUQUNLX1NJWkVdOwordm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKTsKKworLyoKKyAqIHJldHVybnMgbm9uLXplcm8gaWYgb3Bjb2RlIG1vZGlmaWVzIHRoZSBpbnRlcnJ1cHQgZmxhZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfSUZfbW9kaWZpZXIoa3Byb2JlX29wY29kZV90IG9wY29kZSkKK3sKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgMHhmYToJCS8qIGNsaSAqLworCWNhc2UgMHhmYjoJCS8qIHN0aSAqLworCWNhc2UgMHhjZjoJCS8qIGlyZXQvaXJldGQgKi8KKwljYXNlIDB4OWQ6CQkvKiBwb3BmL3BvcGZkICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJbWVtY3B5KHAtPmFpbnNuLmluc24sIHAtPmFkZHIsIE1BWF9JTlNOX1NJWkUgKiBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7Cit9CisKK3ZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCSpwLT5hZGRyID0gcC0+b3Bjb2RlOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CisJcmVncy0+ZWZsYWdzICY9IH5JRl9NQVNLOworCS8qc2luZ2xlIHN0ZXAgaW5saW5lIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhbiBpbnQzKi8KKwlpZiAocC0+b3Bjb2RlID09IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pCisJCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CisJZWxzZQorCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZykmcC0+YWluc24uaW5zbjsKK30KKworLyoKKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CisgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtwcm9iZSAqcDsKKwlpbnQgcmV0ID0gMDsKKwlrcHJvYmVfb3Bjb2RlX3QgKmFkZHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgKmxwOworCisJLyogV2UncmUgaW4gYW4gaW50ZXJydXB0LCBidXQgdGhpcyBpcyBjbGVhciBhbmQgQlVHKCktc2FmZS4gKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKiBDaGVjayBpZiB0aGUgYXBwbGljYXRpb24gaXMgdXNpbmcgTERUIGVudHJ5IGZvciBpdHMgY29kZSBzZWdtZW50IGFuZAorCSAqIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcyBieSByZWFkaW5nIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB0aGUgTERUIGVudHJ5LgorCSAqLworCWlmICgocmVncy0+eGNzICYgNCkgJiYgKGN1cnJlbnQtPm1tKSkgeworCQlscCA9ICh1bnNpZ25lZCBsb25nICopICgodW5zaWduZWQgbG9uZykoKHJlZ3MtPnhjcyA+PiAzKSAqIDgpCisJCQkJCSsgKGNoYXIgKikgY3VycmVudC0+bW0tPmNvbnRleHQubGR0KTsKKwkJYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgKGdldF9kZXNjX2Jhc2UobHApICsgcmVncy0+ZWlwIC0KKwkJCQkJCXNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwl9IGVsc2UgeworCQlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKShyZWdzLT5laXAgLSBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJfQorCS8qIENoZWNrIHdlJ3JlIG5vdCBhY3R1YWxseSByZWN1cnNpbmcgKi8KKwlpZiAoa3Byb2JlX3J1bm5pbmcoKSkgeworCQkvKiBXZSAqYXJlKiBob2xkaW5nIGxvY2sgaGVyZSwgc28gdGhpcyBpcyBzYWZlLgorCQkgICBEaXNhcm0gdGhlIHByb2JlIHdlIGp1c3QgaGl0LCBhbmQgaWdub3JlIGl0LiAqLworCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwkJaWYgKHApIHsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJCQkJcmVncy0+ZWZsYWdzIHw9IGtwcm9iZV9zYXZlZF9lZmxhZ3M7CisJCQkJdW5sb2NrX2twcm9iZXMoKTsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KKwkJCWRpc2FybV9rcHJvYmUocCwgcmVncyk7CisJCQlyZXQgPSAxOworCQl9IGVsc2UgeworCQkJcCA9IGN1cnJlbnRfa3Byb2JlOworCQkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgcC0+YnJlYWtfaGFuZGxlcihwLCByZWdzKSkgeworCQkJCWdvdG8gc3NfcHJvYmU7CisJCQl9CisJCX0KKwkJLyogSWYgaXQncyBub3Qgb3VycywgY2FuJ3QgYmUgZGVsZXRlIHJhY2UsICh3ZSBob2xkIGxvY2spLiAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlsb2NrX2twcm9iZXMoKTsKKwlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwlpZiAoIXApIHsKKwkJdW5sb2NrX2twcm9iZXMoKTsKKwkJaWYgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spIHsKKwkJCS8qIFdlIGFyZSBpbiB2aXJ0dWFsLTgwODYgbW9kZS4gUmV0dXJuIDAgKi8KKwkJCWdvdG8gbm9fa3Byb2JlOworCQl9CisKKwkJaWYgKCphZGRyICE9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKKwkJCS8qCisJCQkgKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCByaWdodAorCQkJICogYWZ0ZXIgd2UgaGl0IGl0LiAgQW5vdGhlciBjcHUgaGFzIHJlbW92ZWQKKwkJCSAqIGVpdGhlciBhIHByb2JlcG9pbnQgb3IgYSBkZWJ1Z2dlciBicmVha3BvaW50CisJCQkgKiBhdCB0aGlzIGFkZHJlc3MuICBJbiBlaXRoZXIgY2FzZSwgbm8gZnVydGhlcgorCQkJICogaGFuZGxpbmcgb2YgdGhpcyBpbnRlcnJ1cHQgaXMgYXBwcm9wcmlhdGUuCisJCQkgKi8KKwkJCXJldCA9IDE7CisJCX0KKwkJLyogTm90IG9uZSBvZiBvdXJzOiBsZXQga2VybmVsIGhhbmRsZSBpdCAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlrcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9BQ1RJVkU7CisJY3VycmVudF9rcHJvYmUgPSBwOworCWtwcm9iZV9zYXZlZF9lZmxhZ3MgPSBrcHJvYmVfb2xkX2VmbGFncworCSAgICA9IChyZWdzLT5lZmxhZ3MgJiAoVEZfTUFTSyB8IElGX01BU0spKTsKKwlpZiAoaXNfSUZfbW9kaWZpZXIocC0+b3Bjb2RlKSkKKwkJa3Byb2JlX3NhdmVkX2VmbGFncyAmPSB+SUZfTUFTSzsKKworCWlmIChwLT5wcmVfaGFuZGxlciAmJiBwLT5wcmVfaGFuZGxlcihwLCByZWdzKSkKKwkJLyogaGFuZGxlciBoYXMgYWxyZWFkeSBzZXQgdGhpbmdzIHVwLCBzbyBza2lwIHNzIHNldHVwICovCisJCXJldHVybiAxOworCitzc19wcm9iZToKKwlwcmVwYXJlX3NpbmdsZXN0ZXAocCwgcmVncyk7CisJa3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9ISVRfU1M7CisJcmV0dXJuIDE7CisKK25vX2twcm9iZToKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBzaW5nbGUtc3RlcHBpbmcuICBwLT5hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICogaW5zdHJ1Y3Rpb24gd2hvc2UgZmlyc3QgYnl0ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgImludCAzIgorICogaW5zdHJ1Y3Rpb24uICBUbyBhdm9pZCB0aGUgU01QIHByb2JsZW1zIHRoYXQgY2FuIG9jY3VyIHdoZW4gd2UKKyAqIHRlbXBvcmFyaWx5IHB1dCBiYWNrIHRoZSBvcmlnaW5hbCBvcGNvZGUgdG8gc2luZ2xlLXN0ZXAsIHdlCisgKiBzaW5nbGUtc3RlcHBlZCBhIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcworICogY29weSBpcyBwLT5haW5zbi5pbnNuLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdG8gcmV0dXJuIGZyb20gdGhlIHBvc3Qtc2luZ2xlLXN0ZXAKKyAqIGludGVycnVwdC4gIFdlIGhhdmUgdG8gZml4IHVwIHRoZSBzdGFjayBhcyBmb2xsb3dzOgorICoKKyAqIDApIEV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhYnNvbHV0ZSBvciBpbmRpcmVjdCBqdW1wIG9yIGNhbGwgaW5zdHJ1Y3Rpb25zLAorICogdGhlIG5ldyBlaXAgaXMgcmVsYXRpdmUgdG8gdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4gIFdlIG5lZWQgdG8gbWFrZQorICogaXQgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorICoKKyAqIDEpIElmIHRoZSBzaW5nbGUtc3RlcHBlZCBpbnN0cnVjdGlvbiB3YXMgcHVzaGZsLCB0aGVuIHRoZSBURiBhbmQgSUYKKyAqIGZsYWdzIGFyZSBzZXQgaW4gdGhlIGp1c3QtcHVzaGVkIGVmbGFncywgYW5kIG1heSBuZWVkIHRvIGJlIGNsZWFyZWQuCisgKgorICogMikgSWYgdGhlIHNpbmdsZS1zdGVwcGVkIGluc3RydWN0aW9uIHdhcyBhIGNhbGwsIHRoZSByZXR1cm4gYWRkcmVzcworICogdGhhdCBpcyBhdG9wIHRoZSBzdGFjayBpcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4KKyAqIFdlIG5lZWQgdG8gbWFrZSBpdCB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgKnRvcyA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKKwl1bnNpZ25lZCBsb25nIG5leHRfZWlwID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvcHlfZWlwID0gKHVuc2lnbmVkIGxvbmcpJnAtPmFpbnNuLmluc247CisJdW5zaWduZWQgbG9uZyBvcmlnX2VpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CisKKwlzd2l0Y2ggKHAtPmFpbnNuLmluc25bMF0pIHsKKwljYXNlIDB4OWM6CQkvKiBwdXNoZmwgKi8KKwkJKnRvcyAmPSB+KFRGX01BU0sgfCBJRl9NQVNLKTsKKwkJKnRvcyB8PSBrcHJvYmVfb2xkX2VmbGFnczsKKwkJYnJlYWs7CisJY2FzZSAweGU4OgkJLyogY2FsbCByZWxhdGl2ZSAtIEZpeCByZXR1cm4gYWRkciAqLworCQkqdG9zID0gb3JpZ19laXAgKyAoKnRvcyAtIGNvcHlfZWlwKTsKKwkJYnJlYWs7CisJY2FzZSAweGZmOgorCQlpZiAoKHAtPmFpbnNuLmluc25bMV0gJiAweDMwKSA9PSAweDEwKSB7CisJCQkvKiBjYWxsIGFic29sdXRlLCBpbmRpcmVjdCAqLworCQkJLyogRml4IHJldHVybiBhZGRyOyBlaXAgaXMgY29ycmVjdC4gKi8KKwkJCW5leHRfZWlwID0gcmVncy0+ZWlwOworCQkJKnRvcyA9IG9yaWdfZWlwICsgKCp0b3MgLSBjb3B5X2VpcCk7CisJCX0gZWxzZSBpZiAoKChwLT5haW5zbi5pbnNuWzFdICYgMHgzMSkgPT0gMHgyMCkgfHwJLyogam1wIG5lYXIsIGFic29sdXRlIGluZGlyZWN0ICovCisJCQkgICAoKHAtPmFpbnNuLmluc25bMV0gJiAweDMxKSA9PSAweDIxKSkgewkvKiBqbXAgZmFyLCBhYnNvbHV0ZSBpbmRpcmVjdCAqLworCQkJLyogZWlwIGlzIGNvcnJlY3QuICovCisJCQluZXh0X2VpcCA9IHJlZ3MtPmVpcDsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4ZWE6CQkvKiBqbXAgYWJzb2x1dGUgLS0gZWlwIGlzIGNvcnJlY3QgKi8KKwkJbmV4dF9laXAgPSByZWdzLT5laXA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlpZiAobmV4dF9laXApIHsKKwkJcmVncy0+ZWlwID0gbmV4dF9laXA7CisJfSBlbHNlIHsKKwkJcmVncy0+ZWlwID0gb3JpZ19laXAgKyAocmVncy0+ZWlwIC0gY29weV9laXApOworCX0KK30KKworLyoKKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CisgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4gIEFuZCB3ZSBob2xkIGtwcm9iZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lIGludCBwb3N0X2twcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICgha3Byb2JlX3J1bm5pbmcoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcikKKwkJY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgMCk7CisKKwlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX3NhdmVkX2VmbGFnczsKKworCXVubG9ja19rcHJvYmVzKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisJLyoKKwkgKiBpZiBzb21lYm9keSBlbHNlIGlzIHNpbmdsZXN0ZXBwaW5nIGFjcm9zcyBhIHByb2JlIHBvaW50LCBlZmxhZ3MKKwkgKiB3aWxsIGhhdmUgVEYgc2V0LCBpbiB3aGljaCBjYXNlLCBjb250aW51ZSB0aGUgcmVtYWluaW5nIHByb2Nlc3NpbmcKKwkgKiBvZiBkb19kZWJ1ZywgYXMgaWYgdGhpcyBpcyBub3QgYSBwcm9iZSBoaXQuCisJICovCisJaWYgKHJlZ3MtPmVmbGFncyAmIFRGX01BU0spCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEludGVycnVwdHMgZGlzYWJsZWQsIGtwcm9iZV9sb2NrIGhlbGQuICovCitzdGF0aWMgaW5saW5lIGludCBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK3sKKwlpZiAoY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIKKwkgICAgJiYgY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIHRyYXBucikpCisJCXJldHVybiAxOworCisJaWYgKGtwcm9iZV9zdGF0dXMgJiBLUFJPQkVfSElUX1NTKSB7CisJCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCQlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX29sZF9lZmxhZ3M7CisKKwkJdW5sb2NrX2twcm9iZXMoKTsKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyYXBwZXIgcm91dGluZSB0byBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KKyAqLworaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBESUVfSU5UMzoKKwkJaWYgKGtwcm9iZV9oYW5kbGVyKGFyZ3MtPnJlZ3MpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwljYXNlIERJRV9ERUJVRzoKKwkJaWYgKHBvc3Rfa3Byb2JlX2hhbmRsZXIoYXJncy0+cmVncykpCisJCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCWJyZWFrOworCWNhc2UgRElFX0dQRjoKKwkJaWYgKGtwcm9iZV9ydW5uaW5nKCkgJiYKKwkJICAgIGtwcm9iZV9mYXVsdF9oYW5kbGVyKGFyZ3MtPnJlZ3MsIGFyZ3MtPnRyYXBucikpCisJCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCWJyZWFrOworCWNhc2UgRElFX1BBR0VfRkFVTFQ6CisJCWlmIChrcHJvYmVfcnVubmluZygpICYmCisJCSAgICBrcHJvYmVfZmF1bHRfaGFuZGxlcihhcmdzLT5yZWdzLCBhcmdzLT50cmFwbnIpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitpbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlqcHJvYmVfc2F2ZWRfcmVncyA9ICpyZWdzOworCWpwcm9iZV9zYXZlZF9lc3AgPSAmcmVncy0+ZXNwOworCWFkZHIgPSAodW5zaWduZWQgbG9uZylqcHJvYmVfc2F2ZWRfZXNwOworCisJLyoKKwkgKiBUQkQ6IEFzIExpbnVzIHBvaW50ZWQgb3V0LCBnY2MgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZWUKKwkgKiBvd25zIHRoZSBhcmd1bWVudCBzcGFjZSBhbmQgY291bGQgb3ZlcndyaXRlIGl0LCBlLmcuCisJICogdGFpbGNhbGwgb3B0aW1pemF0aW9uLiBTbywgdG8gYmUgYWJzb2x1dGVseSBzYWZlCisJICogd2UgYWxzbyBzYXZlIGFuZCByZXN0b3JlIGVub3VnaCBzdGFjayBieXRlcyB0byBjb3ZlcgorCSAqIHRoZSBhcmd1bWVudCBhcmVhLgorCSAqLworCW1lbWNweShqcHJvYmVzX3N0YWNrLCAoa3Byb2JlX29wY29kZV90ICopIGFkZHIsIE1JTl9TVEFDS19TSVpFKGFkZHIpKTsKKwlyZWdzLT5lZmxhZ3MgJj0gfklGX01BU0s7CisJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpKGpwLT5lbnRyeSk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQganByb2JlX3JldHVybih2b2lkKQoreworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwlhc20gdm9sYXRpbGUgKCIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgXG4iCisJCSAgICAgICIgICAgICAgaW50MwkJCVxuIgorCQkgICAgICAiICAgICAgIC5nbG9ibCBqcHJvYmVfcmV0dXJuX2VuZAlcbiIKKwkJICAgICAgIiAgICAgICBqcHJvYmVfcmV0dXJuX2VuZDoJXG4iCisJCSAgICAgICIgICAgICAgbm9wCQkJXG4iOjoiYiIKKwkJICAgICAgKGpwcm9iZV9zYXZlZF9lc3ApOiJtZW1vcnkiKTsKK30KKworaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1OCAqYWRkciA9ICh1OCAqKSAocmVncy0+ZWlwIC0gMSk7CisJdW5zaWduZWQgbG9uZyBzdGFja19hZGRyID0gKHVuc2lnbmVkIGxvbmcpanByb2JlX3NhdmVkX2VzcDsKKwlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CisKKwlpZiAoKGFkZHIgPiAodTggKikganByb2JlX3JldHVybikgJiYgKGFkZHIgPCAodTggKikganByb2JlX3JldHVybl9lbmQpKSB7CisJCWlmICgmcmVncy0+ZXNwICE9IGpwcm9iZV9zYXZlZF9lc3ApIHsKKwkJCXN0cnVjdCBwdF9yZWdzICpzYXZlZF9yZWdzID0KKwkJCSAgICBjb250YWluZXJfb2YoanByb2JlX3NhdmVkX2VzcCwgc3RydWN0IHB0X3JlZ3MsIGVzcCk7CisJCQlwcmludGsoImN1cnJlbnQgZXNwICVwIGRvZXMgbm90IG1hdGNoIHNhdmVkIGVzcCAlcFxuIiwKKwkJCSAgICAgICAmcmVncy0+ZXNwLCBqcHJvYmVfc2F2ZWRfZXNwKTsKKwkJCXByaW50aygiU2F2ZWQgcmVnaXN0ZXJzIGZvciBqcHJvYmUgJXBcbiIsIGpwKTsKKwkJCXNob3dfcmVnaXN0ZXJzKHNhdmVkX3JlZ3MpOworCQkJcHJpbnRrKCJDdXJyZW50IHJlZ2lzdGVyc1xuIik7CisJCQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwkJCUJVRygpOworCQl9CisJCSpyZWdzID0ganByb2JlX3NhdmVkX3JlZ3M7CisJCW1lbWNweSgoa3Byb2JlX29wY29kZV90ICopIHN0YWNrX2FkZHIsIGpwcm9iZXNfc3RhY2ssCisJCSAgICAgICBNSU5fU1RBQ0tfU0laRShzdGFja19hZGRyKSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTBhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogbGludXgva2VybmVsL2xkdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIEtyaXNobmEgQmFsYXN1YnJhbWFuaWFuIGFuZCBMaW51cyBUb3J2YWxkcworICogQ29weXJpZ2h0IChDKSAxOTk5IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworI2lmZGVmIENPTkZJR19TTVAgLyogYXZvaWRzICJkZWZpbmVkIGJ1dCBub3QgdXNlZCIgd2FybmlnICovCitzdGF0aWMgdm9pZCBmbHVzaF9sZHQodm9pZCAqbnVsbCkKK3sKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tKQorCQlsb2FkX0xEVCgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFsbG9jX2xkdChtbV9jb250ZXh0X3QgKnBjLCBpbnQgbWluY291bnQsIGludCByZWxvYWQpCit7CisJdm9pZCAqb2xkbGR0OworCXZvaWQgKm5ld2xkdDsKKwlpbnQgb2xkc2l6ZTsKKworCWlmIChtaW5jb3VudCA8PSBwYy0+c2l6ZSkKKwkJcmV0dXJuIDA7CisJb2xkc2l6ZSA9IHBjLT5zaXplOworCW1pbmNvdW50ID0gKG1pbmNvdW50KzUxMSkmKH41MTEpOworCWlmIChtaW5jb3VudCpMRFRfRU5UUllfU0laRSA+IFBBR0VfU0laRSkKKwkJbmV3bGR0ID0gdm1hbGxvYyhtaW5jb3VudCpMRFRfRU5UUllfU0laRSk7CisJZWxzZQorCQluZXdsZHQgPSBrbWFsbG9jKG1pbmNvdW50KkxEVF9FTlRSWV9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghbmV3bGR0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChvbGRzaXplKQorCQltZW1jcHkobmV3bGR0LCBwYy0+bGR0LCBvbGRzaXplKkxEVF9FTlRSWV9TSVpFKTsKKwlvbGRsZHQgPSBwYy0+bGR0OworCW1lbXNldChuZXdsZHQrb2xkc2l6ZSpMRFRfRU5UUllfU0laRSwgMCwgKG1pbmNvdW50LW9sZHNpemUpKkxEVF9FTlRSWV9TSVpFKTsKKwlwYy0+bGR0ID0gbmV3bGR0OworCXdtYigpOworCXBjLT5zaXplID0gbWluY291bnQ7CisJd21iKCk7CisKKwlpZiAocmVsb2FkKSB7CisjaWZkZWYgQ09ORklHX1NNUAorCQljcHVtYXNrX3QgbWFzazsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCWxvYWRfTERUKHBjKTsKKwkJbWFzayA9IGNwdW1hc2tfb2ZfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWlmICghY3B1c19lcXVhbChjdXJyZW50LT5tbS0+Y3B1X3ZtX21hc2ssIG1hc2spKQorCQkJc21wX2NhbGxfZnVuY3Rpb24oZmx1c2hfbGR0LCBOVUxMLCAxLCAxKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKyNlbHNlCisJCWxvYWRfTERUKHBjKTsKKyNlbmRpZgorCX0KKwlpZiAob2xkc2l6ZSkgeworCQlpZiAob2xkc2l6ZSpMRFRfRU5UUllfU0laRSA+IFBBR0VfU0laRSkKKwkJCXZmcmVlKG9sZGxkdCk7CisJCWVsc2UKKwkJCWtmcmVlKG9sZGxkdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb3B5X2xkdChtbV9jb250ZXh0X3QgKm5ldywgbW1fY29udGV4dF90ICpvbGQpCit7CisJaW50IGVyciA9IGFsbG9jX2xkdChuZXcsIG9sZC0+c2l6ZSwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJbWVtY3B5KG5ldy0+bGR0LCBvbGQtPmxkdCwgb2xkLT5zaXplKkxEVF9FTlRSWV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdlIGRvIG5vdCBoYXZlIHRvIG11Y2sgd2l0aCBkZXNjcmlwdG9ycyBoZXJlLCB0aGF0IGlzCisgKiBkb25lIGluIHN3aXRjaF9tbSgpIGFzIG5lZWRlZC4KKyAqLworaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBvbGRfbW07CisJaW50IHJldHZhbCA9IDA7CisKKwlpbml0X01VVEVYKCZtbS0+Y29udGV4dC5zZW0pOworCW1tLT5jb250ZXh0LnNpemUgPSAwOworCW9sZF9tbSA9IGN1cnJlbnQtPm1tOworCWlmIChvbGRfbW0gJiYgb2xkX21tLT5jb250ZXh0LnNpemUgPiAwKSB7CisJCWRvd24oJm9sZF9tbS0+Y29udGV4dC5zZW0pOworCQlyZXR2YWwgPSBjb3B5X2xkdCgmbW0tPmNvbnRleHQsICZvbGRfbW0tPmNvbnRleHQpOworCQl1cCgmb2xkX21tLT5jb250ZXh0LnNlbSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBObyBuZWVkIHRvIGxvY2sgdGhlIE1NIGFzIHdlIGFyZSB0aGUgbGFzdCB1c2VyCisgKi8KK3ZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmIChtbS0+Y29udGV4dC5zaXplKSB7CisJCWlmIChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCisJCQljbGVhcl9MRFQoKTsKKwkJaWYgKG1tLT5jb250ZXh0LnNpemUqTERUX0VOVFJZX1NJWkUgPiBQQUdFX1NJWkUpCisJCQl2ZnJlZShtbS0+Y29udGV4dC5sZHQpOworCQllbHNlCisJCQlrZnJlZShtbS0+Y29udGV4dC5sZHQpOworCQltbS0+Y29udGV4dC5zaXplID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOworCisJaWYgKCFtbS0+Y29udGV4dC5zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCisJCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOworCisJZG93bigmbW0tPmNvbnRleHQuc2VtKTsKKwlzaXplID0gbW0tPmNvbnRleHQuc2l6ZSpMRFRfRU5UUllfU0laRTsKKwlpZiAoc2l6ZSA+IGJ5dGVjb3VudCkKKwkJc2l6ZSA9IGJ5dGVjb3VudDsKKworCWVyciA9IDA7CisJaWYgKGNvcHlfdG9fdXNlcihwdHIsIG1tLT5jb250ZXh0LmxkdCwgc2l6ZSkpCisJCWVyciA9IC1FRkFVTFQ7CisJdXAoJm1tLT5jb250ZXh0LnNlbSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCWlmIChzaXplICE9IGJ5dGVjb3VudCkgeworCQkvKiB6ZXJvLWZpbGwgdGhlIHJlc3QgKi8KKwkJaWYgKGNsZWFyX3VzZXIocHRyK3NpemUsIGJ5dGVjb3VudC1zaXplKSAhPSAwKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwl9CisJcmV0dXJuIGJ5dGVjb3VudDsKK2Vycm9yX3JldHVybjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKmFkZHJlc3M7CisKKwllcnIgPSAwOworCWFkZHJlc3MgPSAmZGVmYXVsdF9sZHRbMF07CisJc2l6ZSA9IDUqc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCk7CisJaWYgKHNpemUgPiBieXRlY291bnQpCisJCXNpemUgPSBieXRlY291bnQ7CisKKwllcnIgPSBzaXplOworCWlmIChjb3B5X3RvX3VzZXIocHRyLCBhZGRyZXNzLCBzaXplKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IG9sZG1vZGUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07CisJX191MzIgZW50cnlfMSwgZW50cnlfMiwgKmxwOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgdXNlcl9kZXNjIGxkdF9pbmZvOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChieXRlY291bnQgIT0gc2l6ZW9mKGxkdF9pbmZvKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAtRUZBVUxUOyAJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZsZHRfaW5mbywgcHRyLCBzaXplb2YobGR0X2luZm8pKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGxkdF9pbmZvLmVudHJ5X251bWJlciA+PSBMRFRfRU5UUklFUykKKwkJZ290byBvdXQ7CisJaWYgKGxkdF9pbmZvLmNvbnRlbnRzID09IDMpIHsKKwkJaWYgKG9sZG1vZGUpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxkdF9pbmZvLnNlZ19ub3RfcHJlc2VudCA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bigmbW0tPmNvbnRleHQuc2VtKTsKKwlpZiAobGR0X2luZm8uZW50cnlfbnVtYmVyID49IG1tLT5jb250ZXh0LnNpemUpIHsKKwkJZXJyb3IgPSBhbGxvY19sZHQoJmN1cnJlbnQtPm1tLT5jb250ZXh0LCBsZHRfaW5mby5lbnRyeV9udW1iZXIrMSwgMSk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbHAgPSAoX191MzIgKikgKChsZHRfaW5mby5lbnRyeV9udW1iZXIgPDwgMykgKyAoY2hhciAqKSBtbS0+Y29udGV4dC5sZHQpOworCisgICAJLyogQWxsb3cgTERUcyB0byBiZSBjbGVhcmVkIGJ5IHRoZSB1c2VyLiAqLworICAgCWlmIChsZHRfaW5mby5iYXNlX2FkZHIgPT0gMCAmJiBsZHRfaW5mby5saW1pdCA9PSAwKSB7CisJCWlmIChvbGRtb2RlIHx8IExEVF9lbXB0eSgmbGR0X2luZm8pKSB7CisJCQllbnRyeV8xID0gMDsKKwkJCWVudHJ5XzIgPSAwOworCQkJZ290byBpbnN0YWxsOworCQl9CisJfQorCisJZW50cnlfMSA9IExEVF9lbnRyeV9hKCZsZHRfaW5mbyk7CisJZW50cnlfMiA9IExEVF9lbnRyeV9iKCZsZHRfaW5mbyk7CisJaWYgKG9sZG1vZGUpCisJCWVudHJ5XzIgJj0gfigxIDw8IDIwKTsKKworCS8qIEluc3RhbGwgdGhlIG5ldyBlbnRyeSAuLi4gICovCitpbnN0YWxsOgorCSpscAk9IGVudHJ5XzE7CisJKihscCsxKQk9IGVudHJ5XzI7CisJZXJyb3IgPSAwOworCitvdXRfdW5sb2NrOgorCXVwKCZtbS0+Y29udGV4dC5zZW0pOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX21vZGlmeV9sZHQoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCByZXQgPSAtRU5PU1lTOworCisJc3dpdGNoIChmdW5jKSB7CisJY2FzZSAwOgorCQlyZXQgPSByZWFkX2xkdChwdHIsIGJ5dGVjb3VudCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmV0ID0gd3JpdGVfbGR0KHB0ciwgYnl0ZWNvdW50LCAxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXQgPSByZWFkX2RlZmF1bHRfbGR0KHB0ciwgYnl0ZWNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQlyZXQgPSB3cml0ZV9sZHQocHRyLCBieXRlY291bnQsIDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMgYi9hcmNoL2kzODYva2VybmVsL21jYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDBmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21jYS5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMKKyAqICBXcml0dGVuIGJ5IE1hcnRpbiBLb2xpbmVrLCBGZWJydWFyeSAxOTk2CisgKgorICogQ2hhbmdlczoKKyAqCisgKglDaHJpcyBCZWF1cmVnYXJkIEp1bHkgMjh0aCwgMTk5NgorICoJLSBGaXhlZCB1cCBpbnRlZ3JhdGVkIFNDU0kgZGV0ZWN0aW9uCisgKgorICoJQ2hyaXMgQmVhdXJlZ2FyZCBBdWd1c3QgM3JkLCAxOTk2CisgKgktIE1hZGUgbWNhX2luZm8gbG9jYWwKKyAqCS0gTWFkZSBpbnRlZ3JhdGVkIHJlZ2lzdGVycyBhY2Nlc3NpYmxlIHRocm91Z2ggc3RhbmRhcmQgZnVuY3Rpb24gY2FsbHMKKyAqCS0gQWRkZWQgbmFtZSBmaWVsZAorICoJLSBNb3JlIHNhbml0eSBjaGVja2luZworICoKKyAqCUNocmlzIEJlYXVyZWdhcmQgQXVndXN0IDl0aCwgMTk5NgorICoJLSBSZXdyb3RlIC9wcm9jL21jYQorICoKKyAqCUNocmlzIEJlYXVyZWdhcmQgSmFudWFyeSA3dGgsIDE5OTcKKyAqCS0gQWRkZWQgYmFzaWMgTk1JLXByb2Nlc3NpbmcKKyAqCS0gQWRkZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBtY2FfaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKglEYXZpZCBXZWluZWhhbGwgT2N0b2JlciAxMnRoLCAxOTk4CisgKgktIE1hZGUgYSBsb3Qgb2YgY2xlYW5pbmcgdXAgaW4gdGhlIHNvdXJjZQorICoJLSBBZGRlZCB1c2Ugb2Ygc2F2ZV9mbGFncyAvIHJlc3RvcmVfZmxhZ3MKKyAqCS0gQWRkZWQgdGhlICdkcml2ZXJfbG9hZGVkJyBmbGFnIGluIE1DQV9hZGFwdGVyCisgKgktIEFkZGVkIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGlvbiBvZiBaUCBHdSdzIG1jYV9maW5kX3VudXNlZF9hZGFwdGVyCisgKgorICoJRGF2aWQgV2VpbmVoYWxsIE1hcmNoIDI0dGgsIDE5OTkKKyAqCS0gRml4ZWQgdGhlIG91dHB1dCBvZiAnRHJpdmVyIEluc3RhbGxlZCcgaW4gL3Byb2MvbWNhL3BvcworICoJLSBNYWRlIHRoZSBJbnRlZ3JhdGVkIFZpZGVvICYgU0NTSSBzaG93IHVwIGV2ZW4gaWYgdGhleSBoYXZlIGlkIDAwMDAKKyAqCisgKglBbGV4YW5kZXIgVmlybyBOb3ZlbWJlciA5dGgsIDE5OTkKKyAqCS0gU3dpdGNoZWQgdG8gcmVndWxhciBwcm9jZnMgbWV0aG9kcworICoKKyAqCUFsZnJlZCBBcm5vbGQgJiBEYXZpZCBXZWluZWhhbGwgQXVndXN0IDIzcmQsIDIwMDAKKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgUGxhbmFyIFBPUy1yZWdpc3RlcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdoaWNoX3Njc2kgPSAwOworCitpbnQgTUNBX2J1cyA9IDA7CitFWFBPUlRfU1lNQk9MKE1DQV9idXMpOworCisvKgorICogTW90aGVyYm9hcmQgcmVnaXN0ZXIgc3BpbmxvY2suIFVudGVzdGVkIG9uIFNNUCBhdCB0aGUgbW9tZW50LCBidXQKKyAqIGFyZSB0aGVyZSBhbnkgTUNBIFNNUCBib3hlcz8KKyAqCisgKiBZZXMgLSBBbGFuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWNhX2xvY2spOworCisvKiBCdWlsZCB0aGUgc3RhdHVzIGluZm8gZm9yIHRoZSBhZGFwdGVyICovCisKK3N0YXRpYyB2b2lkIG1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMoc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYpIHsKKwltY2FfZGV2LT5zdGF0dXMgPSBNQ0FfQURBUFRFUl9OT05FOworCisJbWNhX2Rldi0+cG9zX2lkID0gbWNhX2Rldi0+cG9zWzBdCisJCSsgKG1jYV9kZXYtPnBvc1sxXSA8PCA4KTsKKworCWlmKCFtY2FfZGV2LT5wb3NfaWQgJiYgbWNhX2Rldi0+c2xvdCA8IE1DQV9NQVhfU0xPVF9OUikgeworCisJCS8qIGlkID0gMHgwMDAwIHVzdWFsbHkgaW5kaWNhdGVzIGhhcmR3YXJlIGZhaWx1cmUsCisJCSAqIGhvd2V2ZXIsIFpQIEd1ICh6cGdAY2FzdGxlLm5ldD4gcmVwb3J0cyB0aGF0IGhpcyA5NTU2CisJCSAqIGhhcyAweDAwMDAgYXMgaWQgYW5kIGV2ZXJ5dGhpbmcgc3RpbGwgd29ya3MuIFRoZXJlCisJCSAqIGFsc28gc2VlbSB0byBiZSBhbiBhZGFwdGVyIHdpdGggaWQgPSAweDAwMDA7IHRoZQorCQkgKiBOQ1IgUGFyYWxsZWwgQnVzIE1lbW9yeSBDYXJkLiBVbnRpbCB0aGlzIGlzIGNvbmZpcm1lZCwKKwkJICogaG93ZXZlciwgdGhpcyBjb2RlIHdpbGwgc3RheS4KKwkJICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfRVJST1I7CisKKwkJcmV0dXJuOworCX0gZWxzZSBpZihtY2FfZGV2LT5wb3NfaWQgIT0gMHhmZmZmKSB7CisKKwkJLyogMHhmZmZmIHVzdWFsbHkgaW5kaWNhdGVzIHRoYXQgdGhlcmUncyBubyBhZGFwdGVyLAorCQkgKiBob3dldmVyLCBzb21lIGludGVncmF0ZWQgYWRhcHRlcnMgbWF5IGhhdmUgMHhmZmZmIGFzCisJCSAqIHRoZWlyIGlkIGFuZCBzdGlsbCBiZSB2YWxpZC4gRXhhbXBsZXMgYXJlIG9uLWJvYXJkCisJCSAqIFZHQSBvZiB0aGUgNTVzeCwgdGhlIGludGVncmF0ZWQgU0NTSSBvZiB0aGUgNTYgJiA1NywKKwkJICogYW5kIHBvc3NpYmx5IGFsc28gdGhlIDk1IFVMVElNRURJQS4KKwkJICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfTk9STUFMOworCX0KKworCWlmKChtY2FfZGV2LT5wb3NfaWQgPT0gMHhmZmZmIHx8CisJICAgIG1jYV9kZXYtPnBvc19pZCA9PSAweDAwMDApICYmIG1jYV9kZXYtPnNsb3QgPj0gTUNBX01BWF9TTE9UX05SKSB7CisJCWludCBqOworCisJCWZvcihqID0gMjsgaiA8IDg7IGorKykgeworCQkJaWYobWNhX2Rldi0+cG9zW2pdICE9IDB4ZmYpIHsKKwkJCQltY2FfZGV2LT5zdGF0dXMgPSBNQ0FfQURBUFRFUl9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZighKG1jYV9kZXYtPnBvc1syXSAmIE1DQV9FTkFCTEVEKSkgeworCisJCS8qIGVuYWJsZWQgYml0IGlzIGluIFBPUyAyICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfRElTQUJMRUQ7CisJfQorfSAvKiBtY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1jYV9zdGFuZGFyZF9yZXNvdXJjZXNbXSA9IHsKKwl7IC5zdGFydCA9IDB4NjAsIC5lbmQgPSAweDYwLCAubmFtZSA9ICJzeXN0ZW0gY29udHJvbCBwb3J0IEIgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkwLCAuZW5kID0gMHg5MCwgLm5hbWUgPSAiYXJiaXRyYXRpb24gKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkxLCAuZW5kID0gMHg5MSwgLm5hbWUgPSAiY2FyZCBTZWxlY3QgRmVlZGJhY2sgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkyLCAuZW5kID0gMHg5MiwgLm5hbWUgPSAic3lzdGVtIENvbnRyb2wgcG9ydCBBIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHg5NCwgLmVuZCA9IDB4OTQsIC5uYW1lID0gInN5c3RlbSBib2FyZCBzZXR1cCAoTUNBKSIgfSwKKwl7IC5zdGFydCA9IDB4OTYsIC5lbmQgPSAweDk3LCAubmFtZSA9ICJQT1MgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDEwMCwgLmVuZCA9IDB4MTA3LCAubmFtZSA9ICJQT1MgKE1DQSkiIH0KK307CisKKyNkZWZpbmUgTUNBX1NUQU5EQVJEX1JFU09VUkNFUwkoc2l6ZW9mKG1jYV9zdGFuZGFyZF9yZXNvdXJjZXMpL3NpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKQorCisvKioKKyAqCW1jYV9yZWFkX2FuZF9zdG9yZV9wb3MgLSByZWFkIHRoZSBQT1MgcmVnaXN0ZXJzIGludG8gYSBtZW1vcnkgYnVmZmVyCisgKiAgICAgIEBwb3M6IGEgY2hhciBwb2ludGVyIHRvIDggYnl0ZXMsIGNvbnRhaW5zIHRoZSBQT1MgcmVnaXN0ZXIgdmFsdWUgb24KKyAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCByZXR1cm4KKyAqCisgKglSZXR1cm5zIDEgaWYgYSBjYXJkIGFjdHVhbGx5IGV4aXN0cyAoaS5lLiB0aGUgcG9zIGlzbid0CisgKglhbGwgMHhmZikgb3IgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBtY2FfcmVhZF9hbmRfc3RvcmVfcG9zKHVuc2lnbmVkIGNoYXIgKnBvcykgeworCWludCBqOworCWludCBmb3VuZCA9IDA7CisKKwlmb3Ioaj0wOyBqPDg7IGorKykgeworCQlpZigocG9zW2pdID0gaW5iX3AoTUNBX1BPU19SRUcoaikpKSAhPSAweGZmKSB7CisJCQkvKiAweGZmIGFsbCBhY3Jvc3MgbWVhbnMgbm8gZGV2aWNlLiAweDAwIG1lYW5zCisJCQkgKiBzb21ldGhpbmcncyBicm9rZW4sIGJ1dCBhIGRldmljZSBpcworCQkJICogcHJvYmFibHkgdGhlcmUuICBIb3dldmVyLCBpZiB5b3UgZ2V0IDB4MDAKKwkJCSAqIGZyb20gYSBtb3RoZXJib2FyZCByZWdpc3RlciBpdCB3b24ndCBtYXR0ZXIKKwkJCSAqIHdoYXQgd2UgZmluZC4gIEZvciB0aGUgcmVjb3JkLCBvbiB0aGUKKwkJCSAqIDU3U0xDLCB0aGUgaW50ZWdyYXRlZCBTQ1NJIGFkYXB0ZXIgaGFzCisJCQkgKiAweGZmZmYgZm9yIHRoZSBhZGFwdGVyIElELCBidXQgbm9uemVybyBmb3IKKwkJCSAqIG90aGVyIHJlZ2lzdGVycy4gICovCisKKwkJCWZvdW5kID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1jYV9wY19yZWFkX3BvcyhzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKHJlZyA8IDAgfHwgcmVnID49IDgpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYV9sb2NrLCBmbGFncyk7CisJaWYobWNhX2Rldi0+cG9zX3JlZ2lzdGVyKSB7CisJCS8qIERpc2FibGUgYWRhcHRlciBzZXR1cCwgZW5hYmxlIG1vdGhlcmJvYXJkIHNldHVwICovCisKKwkJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisJCW91dGJfcChtY2FfZGV2LT5wb3NfcmVnaXN0ZXIsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCisJCWJ5dGUgPSBpbmJfcChNQ0FfUE9TX1JFRyhyZWcpKTsKKwkJb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCX0gZWxzZSB7CisKKwkJLyogTWFrZSBzdXJlIG1vdGhlcmJvYXJkIHNldHVwIGlzIG9mZiAqLworCisJCW91dGJfcCgweGZmLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKworCQkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAqLworCisJCW91dGJfcCgweDh8KG1jYV9kZXYtPnNsb3QgJiAweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCQlieXRlID0gaW5iX3AoTUNBX1BPU19SRUcocmVnKSk7CisJCW91dGJfcCgwLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FfbG9jaywgZmxhZ3MpOworCisJbWNhX2Rldi0+cG9zW3JlZ10gPSBieXRlOworCisJcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyB2b2lkIG1jYV9wY193cml0ZV9wb3Moc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYsIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYocmVnIDwgMCB8fCByZWcgPj0gOCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYV9sb2NrLCBmbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgbW90aGVyYm9hcmQgc2V0dXAgaXMgb2ZmICovCisKKwlvdXRiX3AoMHhmZiwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisKKwkvKiBSZWFkIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAqLworCisJb3V0Yl9wKDB4OHwobWNhX2Rldi0+c2xvdCYweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCW91dGJfcChieXRlLCBNQ0FfUE9TX1JFRyhyZWcpKTsKKwlvdXRiX3AoMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYV9sb2NrLCBmbGFncyk7CisKKwkvKiBVcGRhdGUgdGhlIGdsb2JhbCByZWdpc3RlciBsaXN0LCB3aGlsZSB3ZSBoYXZlIHRoZSBieXRlICovCisKKwltY2FfZGV2LT5wb3NbcmVnXSA9IGJ5dGU7CisKK30KKworLyogZm9yIHRoZSBwcmltYXJ5IE1DQSBidXMsIHdlIGhhdmUgaWRlbnRpdHkgdHJhbnNmb3JtcyAqLworc3RhdGljIGludCBtY2FfZHVtbXlfdHJhbnNmb3JtX2lycShzdHJ1Y3QgbWNhX2RldmljZSAqIG1jYV9kZXYsIGludCBpcnEpCit7CisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIGludCBtY2FfZHVtbXlfdHJhbnNmb3JtX2lvcG9ydChzdHJ1Y3QgbWNhX2RldmljZSAqIG1jYV9kZXYsIGludCBwb3J0KQoreworCXJldHVybiBwb3J0OworfQorCitzdGF0aWMgdm9pZCAqbWNhX2R1bW15X3RyYW5zZm9ybV9tZW1vcnkoc3RydWN0IG1jYV9kZXZpY2UgKiBtY2FfZGV2LCB2b2lkICptZW0pCit7CisJcmV0dXJuIG1lbTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBtY2FfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2OworCXVuc2lnbmVkIGNoYXIgcG9zWzhdOworCXNob3J0IG1jYV9idWlsdGluX3Njc2lfcG9ydHNbXSA9IHsweGY3LCAweGZkLCAweDAwfTsKKwlzdHJ1Y3QgbWNhX2J1cyAqYnVzOworCisJLyogV0FSTklORzogQmUgY2FyZWZ1bCB3aGVuIG1ha2luZyBjaGFuZ2VzIGhlcmUuIFB1dHRpbmcgYW4gYWRhcHRlcgorCSAqIGFuZCB0aGUgbW90aGVyYm9hcmQgc2ltdWx0YW5lb3VzbHkgaW50byBzZXR1cCBtb2RlIG1heSByZXN1bHQgaW4KKwkgKiBkYW1hZ2UgdG8gY2hpcHMgKGFjY29yZGluZyB0byBUaGUgSW5kaXNwZW5zaWJsZSBQQyBIYXJkd2FyZSBCb29rCisJICogYnkgSGFucy1QZXRlciBNZXNzbWVyKS4gQWxzbywgd2UgZGlzYWJsZSBzeXN0ZW0gaW50ZXJydXB0cyAoc28KKwkgKiB0aGF0IHdlIGFyZSBub3QgZGlzdHVyYmVkIGluIHRoZSBtaWRkbGUgb2YgdGhpcykuCisJICovCisKKwkvKiBNYWtlIHN1cmUgdGhlIE1DQSBidXMgaXMgcHJlc2VudCAqLworCisJaWYgKG1jYV9zeXN0ZW1faW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUNBIGJ1cyBzeXN0ZW0gaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFNQ0FfYnVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gIk1pY3JvIENoYW5uZWwgYnVzIGRldGVjdGVkLlxuIik7CisKKwkvKiBBbGwgTUNBIHN5c3RlbXMgaGF2ZSBhdCBsZWFzdCBhIHByaW1hcnkgYnVzICovCisJYnVzID0gbWNhX2F0dGFjaF9idXMoTUNBX1BSSU1BUllfQlVTKTsKKwlpZiAoIWJ1cykKKwkJZ290byBvdXRfbm9tZW07CisJYnVzLT5kZWZhdWx0X2RtYV9tYXNrID0gMHhmZmZmZmZmZkxMOworCWJ1cy0+Zi5tY2Ffd3JpdGVfcG9zID0gbWNhX3BjX3dyaXRlX3BvczsKKwlidXMtPmYubWNhX3JlYWRfcG9zID0gbWNhX3BjX3JlYWRfcG9zOworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX2lycSA9IG1jYV9kdW1teV90cmFuc2Zvcm1faXJxOworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX2lvcG9ydCA9IG1jYV9kdW1teV90cmFuc2Zvcm1faW9wb3J0OworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX21lbW9yeSA9IG1jYV9kdW1teV90cmFuc2Zvcm1fbWVtb3J5OworCisJLyogZ2V0IHRoZSBtb3RoZXJib2FyZCBkZXZpY2UgKi8KKwltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZih1bmxpa2VseSghbWNhX2RldikpCisJCWdvdG8gb3V0X25vbWVtOworCW1lbXNldChtY2FfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpKTsKKworCS8qCisJICogV2UgZG8gbm90IGV4cGVjdCBtYW55IE1DQSBpbnRlcnJ1cHRzIGR1cmluZyBpbml0aWFsaXphdGlvbiwKKwkgKiBidXQgbGV0IHVzIGJlIHNhZmU6CisJICovCisJc3Bpbl9sb2NrX2lycSgmbWNhX2xvY2spOworCisJLyogTWFrZSBzdXJlIGFkYXB0ZXIgc2V0dXAgaXMgb2ZmICovCisKKwlvdXRiX3AoMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKworCS8qIFJlYWQgbW90aGVyYm9hcmQgUE9TIHJlZ2lzdGVycyAqLworCisJbWNhX2Rldi0+cG9zX3JlZ2lzdGVyID0gMHg3ZjsKKwlvdXRiX3AobWNhX2Rldi0+cG9zX3JlZ2lzdGVyLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKwltY2FfZGV2LT5uYW1lWzBdID0gMDsKKwltY2FfcmVhZF9hbmRfc3RvcmVfcG9zKG1jYV9kZXYtPnBvcyk7CisJbWNhX2NvbmZpZ3VyZV9hZGFwdGVyX3N0YXR1cyhtY2FfZGV2KTsKKwkvKiBmYWtlIFBPUyBhbmQgc2xvdCBmb3IgYSBtb3RoZXJib2FyZCAqLworCW1jYV9kZXYtPnBvc19pZCA9IE1DQV9NT1RIRVJCT0FSRF9QT1M7CisJbWNhX2Rldi0+c2xvdCA9IE1DQV9NT1RIRVJCT0FSRDsKKwltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisKKwltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwlpZih1bmxpa2VseSghbWNhX2RldikpCisJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKKwltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CisKKworCS8qIFB1dCBtb3RoZXJib2FyZCBpbnRvIHZpZGVvIHNldHVwIG1vZGUsIHJlYWQgaW50ZWdyYXRlZCB2aWRlbworCSAqIFBPUyByZWdpc3RlcnMsIGFuZCB0dXJuIG1vdGhlcmJvYXJkIHNldHVwIG9mZi4KKwkgKi8KKworCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IDB4ZGY7CisJb3V0Yl9wKG1jYV9kZXYtPnBvc19yZWdpc3RlciwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisJbWNhX2Rldi0+bmFtZVswXSA9IDA7CisJbWNhX3JlYWRfYW5kX3N0b3JlX3BvcyhtY2FfZGV2LT5wb3MpOworCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJLyogZmFrZSBQT1MgYW5kIHNsb3QgZm9yIHRoZSBpbnRlZ3JhdGVkIHZpZGVvICovCisJbWNhX2Rldi0+cG9zX2lkID0gTUNBX0lOVEVHVklERU9fUE9TOworCW1jYV9kZXYtPnNsb3QgPSBNQ0FfSU5URUdWSURFTzsKKwltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisKKwkvKiBQdXQgbW90aGVyYm9hcmQgaW50byBzY3NpIHNldHVwIG1vZGUsIHJlYWQgaW50ZWdyYXRlZCBzY3NpCisJICogUE9TIHJlZ2lzdGVycywgYW5kIHR1cm4gbW90aGVyYm9hcmQgc2V0dXAgb2ZmLgorCSAqCisJICogSXQgc2VlbXMgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBTQ1NJIHJlZ2lzdGVycy4gTWFydGluIHNheXMgdGhhdAorCSAqIGZvciB0aGUgNTYsNTcsIDB4ZjcgaXMgdGhlIG9uZSwgYnV0IGZhaWxzIG9uIHRoZSA3Ni4KKwkgKiBBbGZyZWRvIChhcGVuYUB2bmV0LmlibS5jb20pIHNheXMKKwkgKiAweGZkIHdvcmtzIG9uIGhpcyBtYWNoaW5lLiBXZSdsbCB0cnkgYm90aCBvZiB0aGVtLiBJIGZpZ3VyZSBpdCdzCisJICogYSBnb29kIGJldCB0aGF0IG9ubHkgb25lIGNvdWxkIGJlIHZhbGlkIGF0IGEgdGltZS4gVGhpcyBjb3VsZAorCSAqIHNjcmV3IHVwIHRob3VnaCBpZiBvbmUgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2Ugb24gdGhlIG90aGVyCisJICogbWFjaGluZS4KKwkgKi8KKworCWZvcihpID0gMDsgKHdoaWNoX3Njc2kgPSBtY2FfYnVpbHRpbl9zY3NpX3BvcnRzW2ldKSAhPSAwOyBpKyspIHsKKwkJb3V0Yl9wKHdoaWNoX3Njc2ksIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCQlpZihtY2FfcmVhZF9hbmRfc3RvcmVfcG9zKHBvcykpCisJCQlicmVhazsKKwl9CisJaWYod2hpY2hfc2NzaSkgeworCQkvKiBmb3VuZCBhIHNjc2kgY2FyZCAqLworCQltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwkJaWYodW5saWtlbHkoIW1jYV9kZXYpKQorCQkJZ290byBvdXRfdW5sb2NrX25vbWVtOworCQltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CisKKwkJZm9yKGogPSAwOyBqIDwgODsgaisrKQorCQkJbWNhX2Rldi0+cG9zW2pdID0gcG9zW2pdOworCisJCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJCS8qIGZha2UgUE9TIGFuZCBzbG90IGZvciBpbnRlZ3JhdGVkIFNDU0kgY29udHJvbGxlciAqLworCQltY2FfZGV2LT5wb3NfaWQgPSBNQ0FfSU5URUdTQ1NJX1BPUzsKKwkJbWNhX2Rldi0+c2xvdCA9IE1DQV9JTlRFR1NDU0k7CisJCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IHdoaWNoX3Njc2k7CisJCW1jYV9yZWdpc3Rlcl9kZXZpY2UoTUNBX1BSSU1BUllfQlVTLCBtY2FfZGV2KTsKKwl9CisKKwkvKiBUdXJuIG9mZiBtb3RoZXJib2FyZCBzZXR1cCAqLworCisJb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCisJLyogTm93IGxvb3Agb3ZlciBNQ0Egc2xvdHM6IHB1dCBlYWNoIGFkYXB0ZXIgaW50byBzZXR1cCBtb2RlLCBhbmQKKwkgKiByZWFkIGl0cyBQT1MgcmVnaXN0ZXJzLiBUaGVuIHB1dCBhZGFwdGVyIHNldHVwIG9mZi4KKwkgKi8KKworCWZvcihpPTA7IGk8TUNBX01BWF9TTE9UX05SOyBpKyspIHsKKwkJb3V0Yl9wKDB4OHwoaSYweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCQlpZighbWNhX3JlYWRfYW5kX3N0b3JlX3Bvcyhwb3MpKQorCQkJY29udGludWU7CisKKwkJbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJCWlmKHVubGlrZWx5KCFtY2FfZGV2KSkKKwkJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKKwkJbWVtc2V0KG1jYV9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSkpOworCisJCWZvcihqPTA7IGo8ODsgaisrKQorCQkJbWNhX2Rldi0+cG9zW2pdPXBvc1tqXTsKKworCQltY2FfZGV2LT5kcml2ZXJfbG9hZGVkID0gMDsKKwkJbWNhX2Rldi0+c2xvdCA9IGk7CisJCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IDA7CisJCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJCW1jYV9yZWdpc3Rlcl9kZXZpY2UoTUNBX1BSSU1BUllfQlVTLCBtY2FfZGV2KTsKKwl9CisJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmV0dXJuIG1lbW9yeSBzdGFydCAqLworCXNwaW5fdW5sb2NrX2lycSgmbWNhX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1DQV9TVEFOREFSRF9SRVNPVVJDRVM7IGkrKykKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCBtY2Ffc3RhbmRhcmRfcmVzb3VyY2VzICsgaSk7CisKKwltY2FfZG9fcHJvY19pbml0KCk7CisKKwlyZXR1cm4gMDsKKworIG91dF91bmxvY2tfbm9tZW06CisJc3Bpbl91bmxvY2tfaXJxKCZtY2FfbG9jayk7Cisgb3V0X25vbWVtOgorCXByaW50ayhLRVJOX0VNRVJHICJGYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24gaW4gTUNBIHNldHVwIVxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N1YnN5c19pbml0Y2FsbChtY2FfaW5pdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBtY2FfaGFuZGxlX25taV9kZXZpY2Uoc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYsIGludCBjaGVja19mbGFnKQoreworCWludCBzbG90ID0gbWNhX2Rldi0+c2xvdDsKKworCWlmKHNsb3QgPT0gTUNBX0lOVEVHU0NTSSkgeworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IGNhdXNlZCBieSBNQ0EgaW50ZWdyYXRlZCBTQ1NJIGFkYXB0ZXIgKCVzKVxuIiwKKwkJCW1jYV9kZXYtPm5hbWUpOworCX0gZWxzZSBpZihzbG90ID09IE1DQV9JTlRFR1ZJREVPKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5NSTogY2F1c2VkIGJ5IE1DQSBpbnRlZ3JhdGVkIHZpZGVvIGFkYXB0ZXIgKCVzKVxuIiwKKwkJCW1jYV9kZXYtPm5hbWUpOworCX0gZWxzZSBpZihzbG90ID09IE1DQV9NT1RIRVJCT0FSRCkgeworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IGNhdXNlZCBieSBtb3RoZXJib2FyZCAoJXMpXG4iLAorCQkJbWNhX2Rldi0+bmFtZSk7CisJfQorCisJLyogTW9yZSBpbmZvIGF2YWlsYWJsZSBpbiBQT1MgNiBhbmQgNz8gKi8KKworCWlmKGNoZWNrX2ZsYWcpIHsKKwkJdW5zaWduZWQgY2hhciBwb3M2LCBwb3M3OworCisJCXBvczYgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDYpOworCQlwb3M3ID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCA3KTsKKworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IFBPUyA2ID0gMHgleCwgUE9TIDcgPSAweCV4XG4iLCBwb3M2LCBwb3M3KTsKKwl9CisKK30gLyogbWNhX2hhbmRsZV9ubWlfc2xvdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBtY2FfaGFuZGxlX25taV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBwb3M1OworCisJcG9zNSA9IG1jYV9kZXZpY2VfcmVhZF9wb3MobWNhX2RldiwgNSk7CisKKwlpZighKHBvczUgJiAweDgwKSkgeworCQkvKiBCaXQgNyBvZiBQT1MgNSBpcyByZXNldCB3aGVuIHRoaXMgYWRhcHRlciBoYXMgYSBoYXJkd2FyZQorCQkgKiBlcnJvci4gQml0IDcgaXQgcmVzZXQgaWYgdGhlcmUncyBlcnJvciBpbmZvcm1hdGlvbgorCQkgKiBhdmFpbGFibGUgaW4gUE9TIDYgYW5kIDcuCisJCSAqLworCQltY2FfaGFuZGxlX25taV9kZXZpY2UobWNhX2RldiwgIShwb3M1ICYgMHg0MCkpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWNhX2hhbmRsZV9ubWkodm9pZCkKK3sKKwkvKiBGaXJzdCB0cnkgLSBzY2FuIHRoZSB2YXJpb3VzIGFkYXB0ZXJzIGFuZCBzZWUgaWYgYSBzcGVjaWZpYworCSAqIGFkYXB0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgZXJyb3IuCisJICovCisJYnVzX2Zvcl9lYWNoX2RldigmbWNhX2J1c190eXBlLCBOVUxMLCBOVUxMLCBtY2FfaGFuZGxlX25taV9jYWxsYmFjayk7CisKKwltY2Ffbm1pX2hvb2soKTsKK30gLyogbWNhX2hhbmRsZV9ubWkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2M2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICoJSW50ZWwgQ1BVIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIGZvciBMaW51eAorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFRpZ3JhbiBBaXZhemlhbgorICoKKyAqCVRoaXMgZHJpdmVyIGFsbG93cyB0byB1cGdyYWRlIG1pY3JvY29kZSBvbiBJbnRlbCBwcm9jZXNzb3JzCisgKgliZWxvbmdpbmcgdG8gSUEtMzIgZmFtaWx5IC0gUGVudGl1bVBybywgUGVudGl1bSBJSSwgCisgKglQZW50aXVtIElJSSwgWGVvbiwgUGVudGl1bSA0LCBldGMuCisgKgorICoJUmVmZXJlbmNlOiBTZWN0aW9uIDguMTAgb2YgVm9sdW1lIElJSSwgSW50ZWwgUGVudGl1bSA0IE1hbnVhbCwgCisgKglPcmRlciBOdW1iZXIgMjQ1NDcyIG9yIGZyZWUgZG93bmxvYWQgZnJvbToKKyAqCQkKKyAqCWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzLzI0NTQ3Mi5odG0KKyAqCisgKglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ28gdG8gaHR0cDovL3d3dy51cmJhbm15dGgub3JnL21pY3JvY29kZQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJMS4wCTE2IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCUluaXRpYWwgcmVsZWFzZS4KKyAqCTEuMDEJMTggRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJQWRkZWQgcmVhZCgpIHN1cHBvcnQgKyBjbGVhbnVwcy4KKyAqCTEuMDIJMjEgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJQWRkZWQgJ2RldmljZSB0cmltbWluZycgc3VwcG9ydC4gb3BlbihPX1dST05MWSkgemVyb2VzCisgKgkJYW5kIGZyZWVzIHRoZSBzYXZlZCBjb3B5IG9mIGFwcGxpZWQgbWljcm9jb2RlLgorICoJMS4wMwkyOSBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlNYWRlIHRvIHVzZSBkZXZmcyAoL2Rldi9jcHUvbWljcm9jb2RlKSArIGNsZWFudXBzLgorICoJMS4wNAkwNiBKdW4gMjAwMCwgU2ltb24gVHJpbW1lciA8c2ltb25AdmVyaXRhcy5jb20+CisgKgkJQWRkZWQgbWlzYyBkZXZpY2Ugc3VwcG9ydCAobm93IHVzZXMgYm90aCBkZXZmcyBhbmQgbWlzYykuCisgKgkJQWRkZWQgTUlDUk9DT0RFX0lPQ0ZSRUUgaW9jdGwgdG8gY2xlYXIgbWVtb3J5LgorICoJMS4wNQkwOSBKdW4gMjAwMCwgU2ltb24gVHJpbW1lciA8c2ltb25AdmVyaXRhcy5jb20+CisgKgkJTWVzc2FnZXMgZm9yIGVycm9yIGNhc2VzIChub24gSW50ZWwgJiBubyBzdWl0YWJsZSBtaWNyb2NvZGUpLgorICoJMS4wNgkwMyBBdWcgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJUmVtb3ZlZCAtPnJlbGVhc2UoKS4gUmVtb3ZlZCBleGNsdXNpdmUgb3BlbiBhbmQgc3RhdHVzIGJpdG1hcC4KKyAqCQlBZGRlZCBtaWNyb2NvZGVfcndzZW0gdG8gc2VyaWFsaXplIHJlYWQoKS93cml0ZSgpL2lvY3RsKCkuCisgKgkJUmVtb3ZlZCBnbG9iYWwga2VybmVsIGxvY2sgdXNhZ2UuCisgKgkxLjA3CTA3IFNlcCAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlXcml0ZSAwIHRvIDB4OEIgbXNyIGFuZCB0aGVuIGNwdWlkIGJlZm9yZSByZWFkaW5nIHJldmlzaW9uLAorICoJCXNvIHRoYXQgaXQgd29ya3MgZXZlbiBpZiB0aGVyZSB3ZXJlIG5vIHVwZGF0ZSBkb25lIGJ5IHRoZQorICoJCUJJT1MuIE90aGVyd2lzZSwgcmVhZGluZyBmcm9tIDB4OEIgZ2l2ZXMganVuayAod2hpY2ggaGFwcGVuZWQKKyAqCQl0byBiZSAwIG9uIG15IG1hY2hpbmUgd2hpY2ggaXMgd2h5IGl0IHdvcmtlZCBldmVuIHdoZW4gSQorICoJCWRpc2FibGVkIHVwZGF0ZSBieSB0aGUgQklPUykKKyAqCQlUaGFua3MgdG8gRXJpYyBXLiBCaWVkZXJtYW4gPGViaWVkZXJtYW5AbG54aS5jb20+IGZvciB0aGUgZml4LgorICoJMS4wOAkxMSBEZWMgMjAwMCwgUmljaGFyZCBTY2hhYWwgPHJpY2hhcmQuc2NoYWFsQGludGVsLmNvbT4gYW5kCisgKgkJCSAgICAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJSW50ZWwgUGVudGl1bSA0IHByb2Nlc3NvciBzdXBwb3J0IGFuZCBidWdmaXhlcy4KKyAqCTEuMDkJMzAgT2N0IDIwMDEsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUJ1Z2ZpeCBmb3IgSFQgKEh5cGVyLVRocmVhZGluZykgZW5hYmxlZCBwcm9jZXNzb3JzCisgKgkJd2hlcmVieSBwcm9jZXNzb3IgcmVzb3VyY2VzIGFyZSBzaGFyZWQgYnkgYWxsIGxvZ2ljYWwgcHJvY2Vzc29ycworICoJCWluIGEgc2luZ2xlIENQVSBwYWNrYWdlLgorICoJMS4xMAkyOCBGZWIgMjAwMiBBc2l0IEsgTWFsbGljayA8YXNpdC5rLm1hbGxpY2tAaW50ZWwuY29tPiBhbmQKKyAqCQlUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4sCisgKgkJU2VyaWFsaXplIHVwZGF0ZXMgYXMgcmVxdWlyZWQgb24gSFQgcHJvY2Vzc29ycyBkdWUgdG8gc3BlY3VsYXRpdmUKKyAqCQluYXR1cmUgb2YgaW1wbGVtZW50YXRpb24uCisgKgkxLjExCTIyIE1hciAyMDAyIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUZpeCB0aGUgcGFuaWMgd2hlbiB3cml0aW5nIHplcm8tbGVuZ3RoIG1pY3JvY29kZSBjaHVuay4KKyAqCTEuMTIJMjkgU2VwIDIwMDMgTml0aW4gS2FtYmxlIDxuaXRpbi5hLmthbWJsZUBpbnRlbC5jb20+LCAKKyAqCQlKdW4gTmFrYWppbWEgPGp1bi5uYWthamltYUBpbnRlbC5jb20+CisgKgkJU3VwcG9ydCBmb3IgdGhlIG1pY3JvY29kZSB1cGRhdGVzIGluIHRoZSBuZXcgZm9ybWF0LgorICoJMS4xMwkxMCBPY3QgMjAwMyBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlSZW1vdmVkIC0+cmVhZCgpIG1ldGhvZCBhbmQgb2Jzb2xldGVkIE1JQ1JPQ09ERV9JT0NGUkVFIGlvY3RsCisgKgkJYmVjYXVzZSB3ZSBubyBsb25nZXIgaG9sZCBhIGNvcHkgb2YgYXBwbGllZCBtaWNyb2NvZGUgCisgKgkJaW4ga2VybmVsIG1lbW9yeS4KKyAqCTEuMTQJMjUgSnVuIDIwMDQgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KKyAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgorICovCisKKy8vI2RlZmluZSBERUJVRyAvKiBwcl9kZWJ1ZyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBDUFUgKElBLTMyKSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0IgorCisjZGVmaW5lIERFRkFVTFRfVUNPREVfREFUQVNJWkUgCSgyMDAwKSAJICAvKiAyMDAwIGJ5dGVzICovCisjZGVmaW5lIE1DX0hFQURFUl9TSVpFCQkoc2l6ZW9mIChtaWNyb2NvZGVfaGVhZGVyX3QpKSAgCSAgLyogNDggYnl0ZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUgKERFRkFVTFRfVUNPREVfREFUQVNJWkUgKyBNQ19IRUFERVJfU0laRSkgLyogMjA0OCBieXRlcyAqLworI2RlZmluZSBFWFRfSEVBREVSX1NJWkUJCShzaXplb2YgKHN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSkpIC8qIDIwIGJ5dGVzICovCisjZGVmaW5lIEVYVF9TSUdOQVRVUkVfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlKSkgLyogMTIgYnl0ZXMgKi8KKyNkZWZpbmUgRFdTSVpFCQkJKHNpemVvZiAodTMyKSkKKyNkZWZpbmUgZ2V0X3RvdGFsc2l6ZShtYykgXAorCSgoKG1pY3JvY29kZV90ICopbWMpLT5oZHIudG90YWxzaXplID8gXAorCSAoKG1pY3JvY29kZV90ICopbWMpLT5oZHIudG90YWxzaXplIDogREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUpCisjZGVmaW5lIGdldF9kYXRhc2l6ZShtYykgXAorCSgoKG1pY3JvY29kZV90ICopbWMpLT5oZHIuZGF0YXNpemUgPyBcCisJICgobWljcm9jb2RlX3QgKiltYyktPmhkci5kYXRhc2l6ZSA6IERFRkFVTFRfVUNPREVfREFUQVNJWkUpCisKKyNkZWZpbmUgc2lnbWF0Y2goczEsIHMyLCBwMSwgcDIpIFwKKwkoKChzMSkgPT0gKHMyKSkgJiYgKCgocDEpICYgKHAyKSkgfHwgKCgocDEpID09IDApICYmICgocDIpID09IDApKSkpCisKKyNkZWZpbmUgZXh0dGFibGVfc2l6ZShldCkgKChldCktPmNvdW50ICogRVhUX1NJR05BVFVSRV9TSVpFICsgRVhUX0hFQURFUl9TSVpFKQorCisvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhtaWNyb2NvZGVfdXBkYXRlX2xvY2spOworCisvKiBubyBjb25jdXJyZW50IC0+d3JpdGUoKXMgYXJlIGFsbG93ZWQgb24gL2Rldi9jcHUvbWljcm9jb2RlICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChtaWNyb2NvZGVfc2VtKTsKKworc3RhdGljIHZvaWQgX191c2VyICp1c2VyX2J1ZmZlcjsJLyogdXNlciBhcmVhIG1pY3JvY29kZSBkYXRhIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2VyX2J1ZmZlcl9zaXplOwkvKiBpdCdzIHNpemUgKi8KKwordHlwZWRlZiBlbnVtIG1jX2Vycm9yX2NvZGUgeworCU1DX1NVQ0NFU1MgCT0gMCwKKwlNQ19OT1RGT1VORCAJPSAxLAorCU1DX01BUktFRCAJPSAyLAorCU1DX0FMTE9DQVRFRCAJPSAzLAorfSBtY19lcnJvcl9jb2RlX3Q7CisKK3N0YXRpYyBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8geworCXVuc2lnbmVkIGludCBzaWc7CisJdW5zaWduZWQgaW50IHBmOworCXVuc2lnbmVkIGludCByZXY7CisJdW5zaWduZWQgaW50IGNrc3VtOworCW1jX2Vycm9yX2NvZGVfdCBlcnI7CisJbWljcm9jb2RlX3QgKm1jOworfSB1Y29kZV9jcHVfaW5mb1tOUl9DUFVTXTsKKwkJCQkKK3N0YXRpYyBpbnQgbWljcm9jb2RlX29wZW4gKHN0cnVjdCBpbm9kZSAqdW51c2VkMSwgc3RydWN0IGZpbGUgKnVudXNlZDIpCit7CisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvICh2b2lkICp1bnVzZWQpCit7CisJaW50IGNwdV9udW0gPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHVfbnVtOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOworCXVuc2lnbmVkIGludCB2YWxbMl07CisKKwl1Y2ktPnNpZyA9IHVjaS0+cGYgPSB1Y2ktPnJldiA9IHVjaS0+Y2tzdW0gPSAwOworCXVjaS0+ZXJyID0gTUNfTk9URk9VTkQ7IAorCXVjaS0+bWMgPSBOVUxMOworCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCBjLT54ODYgPCA2IHx8CisJICAgIAljcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0lBNjQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBub3QgYSBjYXBhYmxlIEludGVsIHByb2Nlc3NvclxuIiwgY3B1X251bSk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl1Y2ktPnNpZyA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKKworCQlpZiAoKGMtPng4Nl9tb2RlbCA+PSA1KSB8fCAoYy0+eDg2ID4gNikpIHsKKwkJCS8qIGdldCBwcm9jZXNzb3IgZmxhZ3MgZnJvbSBNU1IgMHgxNyAqLworCQkJcmRtc3IoTVNSX0lBMzJfUExBVEZPUk1fSUQsIHZhbFswXSwgdmFsWzFdKTsKKwkJCXVjaS0+cGYgPSAxIDw8ICgodmFsWzFdID4+IDE4KSAmIDcpOworCQl9CisJfQorCisJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLworCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB1Y2ktPnJldik7CisJcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKKwkJCXVjaS0+c2lnLCB1Y2ktPnBmLCB1Y2ktPnJldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX21pY3JvY29kZV91cGRhdGUgKGludCBjcHVfbnVtLCBtaWNyb2NvZGVfaGVhZGVyX3QgKm1jX2hlYWRlciwgaW50IHNpZywgaW50IHBmLCBpbnQgY2tzdW0pCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisKKwlwcl9kZWJ1ZygiTWljcm9jb2RlIEZvdW5kLlxuIik7CisJcHJfZGVidWcoIiAgIEhlYWRlciBSZXZpc2lvbiAweCV4XG4iLCBtY19oZWFkZXItPmhkcnZlcik7CisJcHJfZGVidWcoIiAgIExvYWRlciBSZXZpc2lvbiAweCV4XG4iLCBtY19oZWFkZXItPmxkcnZlcik7CisJcHJfZGVidWcoIiAgIFJldmlzaW9uIDB4JXggXG4iLCBtY19oZWFkZXItPnJldik7CisJcHJfZGVidWcoIiAgIERhdGUgJXgvJXgvJXhcbiIsCisJCSgobWNfaGVhZGVyLT5kYXRlID4+IDI0ICkgJiAweGZmKSwKKwkJKChtY19oZWFkZXItPmRhdGUgPj4gMTYgKSAmIDB4ZmYpLAorCQkobWNfaGVhZGVyLT5kYXRlICYgMHhGRkZGKSk7CisJcHJfZGVidWcoIiAgIFNpZ25hdHVyZSAweCV4XG4iLCBzaWcpOworCXByX2RlYnVnKCIgICBUeXBlIDB4JXggRmFtaWx5IDB4JXggTW9kZWwgMHgleCBTdGVwcGluZyAweCV4XG4iLAorCQkoKHNpZyA+PiAxMikgJiAweDMpLAorCQkoKHNpZyA+PiA4KSAmIDB4ZiksCisJCSgoc2lnID4+IDQpICYgMHhmKSwKKwkJKChzaWcgJiAweGYpKSk7CisJcHJfZGVidWcoIiAgIFByb2Nlc3NvciBGbGFncyAweCV4XG4iLCBwZik7CisJcHJfZGVidWcoIiAgIENoZWNrc3VtIDB4JXhcbiIsIGNrc3VtKTsKKworCWlmIChtY19oZWFkZXItPnJldiA8IHVjaS0+cmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBub3QgJ3VwZ3JhZGluZycgdG8gZWFybGllciByZXZpc2lvbiIKKwkJICAgICAgICIgMHgleCAoY3VycmVudD0weCV4KVxuIiwgY3B1X251bSwgbWNfaGVhZGVyLT5yZXYsIHVjaS0+cmV2KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChtY19oZWFkZXItPnJldiA9PSB1Y2ktPnJldikgeworCQkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCisJCXVjaS0+ZXJyID0gTUNfU1VDQ0VTUzsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIGFscmVhZHkgYXQgcmV2aXNpb24iCisJCQkiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdV9udW0sIG1jX2hlYWRlci0+cmV2LCB1Y2ktPnJldik7CisJCWdvdG8gb3V0OworCX0KKworCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlIHVwZGF0ZSB3aXRoICIKKwkJIiByZXZpc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLCBjcHVfbnVtLCBtY19oZWFkZXItPnJldiwgdWNpLT5yZXYpOworCXVjaS0+Y2tzdW0gPSBja3N1bTsKKwl1Y2ktPnBmID0gcGY7IC8qIGtlZXAgdGhlIG9yaWdpbmFsIG1jIHBmIGZvciBja3N1bSBjYWxjdWxhdGlvbiAqLworCXVjaS0+ZXJyID0gTUNfTUFSS0VEOyAvKiBmb3VuZCB0aGUgbWF0Y2ggKi8KK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZmluZF9tYXRjaGluZ191Y29kZXMgKHZvaWQpIAoreworCWludCBjdXJzb3IgPSAwOworCWludCBlcnJvciA9IDA7CisKKwl3aGlsZSAoY3Vyc29yICsgTUNfSEVBREVSX1NJWkUgPCB1c2VyX2J1ZmZlcl9zaXplKSB7CisJCW1pY3JvY29kZV9oZWFkZXJfdCBtY19oZWFkZXI7CisJCXZvaWQgKm5ld21jID0gTlVMTDsKKwkJaW50IGksIHN1bSwgY3B1X251bSwgYWxsb2NhdGVkX2ZsYWcsIHRvdGFsX3NpemUsIGRhdGFfc2l6ZSwgZXh0X3RhYmxlX3NpemU7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtY19oZWFkZXIsIHVzZXJfYnVmZmVyICsgY3Vyc29yLCBNQ19IRUFERVJfU0laRSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXRvdGFsX3NpemUgPSBnZXRfdG90YWxzaXplKCZtY19oZWFkZXIpOworCQlpZiAoKGN1cnNvciArIHRvdGFsX3NpemUgPiB1c2VyX2J1ZmZlcl9zaXplKSB8fCAodG90YWxfc2l6ZSA8IERFRkFVTFRfVUNPREVfVE9UQUxTSVpFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGF0YV9zaXplID0gZ2V0X2RhdGFzaXplKCZtY19oZWFkZXIpOworCQlpZiAoKGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFID4gdG90YWxfc2l6ZSkgfHwgKGRhdGFfc2l6ZSA8IERFRkFVTFRfVUNPREVfREFUQVNJWkUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobWNfaGVhZGVyLmxkcnZlciAhPSAxIHx8IG1jX2hlYWRlci5oZHJ2ZXIgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBVbmtub3duIG1pY3JvY29kZSB1cGRhdGUgZm9ybWF0XG4iKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCQlmb3IgKGNwdV9udW0gPSAwOyBjcHVfbnVtIDwgbnVtX29ubGluZV9jcHVzKCk7IGNwdV9udW0rKykgeworCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJCQlpZiAodWNpLT5lcnIgIT0gTUNfTk9URk9VTkQpIC8qIGFscmVhZHkgZm91bmQgYSBtYXRjaCBvciBub3QgYW4gb25saW5lIGNwdSovCisJCQkJY29udGludWU7CisKKwkJCWlmIChzaWdtYXRjaChtY19oZWFkZXIuc2lnLCB1Y2ktPnNpZywgbWNfaGVhZGVyLnBmLCB1Y2ktPnBmKSkKKwkJCQltYXJrX21pY3JvY29kZV91cGRhdGUoY3B1X251bSwgJm1jX2hlYWRlciwgbWNfaGVhZGVyLnNpZywgbWNfaGVhZGVyLnBmLCBtY19oZWFkZXIuY2tzdW0pOworCQl9CisKKwkJZXh0X3RhYmxlX3NpemUgPSB0b3RhbF9zaXplIC0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKTsKKwkJaWYgKGV4dF90YWJsZV9zaXplKSB7CisJCQlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgZXh0X2hlYWRlcjsKKwkJCXN0cnVjdCBleHRlbmRlZF9zaWduYXR1cmUgZXh0X3NpZzsKKwkJCWludCBleHRfc2lnY291bnQ7CisKKwkJCWlmICgoZXh0X3RhYmxlX3NpemUgPCBFWFRfSEVBREVSX1NJWkUpIAorCQkJCQl8fCAoKGV4dF90YWJsZV9zaXplIC0gRVhUX0hFQURFUl9TSVpFKSAlIEVYVF9TSUdOQVRVUkVfU0laRSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZXh0X2hlYWRlciwgdXNlcl9idWZmZXIgKyBjdXJzb3IgCisJCQkJCSsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUsIEVYVF9IRUFERVJfU0laRSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOworCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChleHRfdGFibGVfc2l6ZSAhPSBleHR0YWJsZV9zaXplKCZleHRfaGVhZGVyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLmNvdW50OworCQkJCisJCQlmb3IgKGkgPSAwOyBpIDwgZXh0X3NpZ2NvdW50OyBpKyspIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmV4dF9zaWcsIHVzZXJfYnVmZmVyICsgY3Vyc29yICsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUgKyBFWFRfSEVBREVSX1NJWkUgCisJCQkJCQkrIEVYVF9TSUdOQVRVUkVfU0laRSAqIGksIEVYVF9TSUdOQVRVUkVfU0laRSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IHJlYWQgdXNlciBkYXRhXG4iKTsKKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJZm9yIChjcHVfbnVtID0gMDsgY3B1X251bSA8IG51bV9vbmxpbmVfY3B1cygpOyBjcHVfbnVtKyspIHsKKwkJCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJCQkJCWlmICh1Y2ktPmVyciAhPSBNQ19OT1RGT1VORCkgLyogYWxyZWFkeSBmb3VuZCBhIG1hdGNoIG9yIG5vdCBhbiBvbmxpbmUgY3B1Ki8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoc2lnbWF0Y2goZXh0X3NpZy5zaWcsIHVjaS0+c2lnLCBleHRfc2lnLnBmLCB1Y2ktPnBmKSkgeworCQkJCQkJbWFya19taWNyb2NvZGVfdXBkYXRlKGNwdV9udW0sICZtY19oZWFkZXIsIGV4dF9zaWcuc2lnLCBleHRfc2lnLnBmLCBleHRfc2lnLmNrc3VtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBub3cgY2hlY2sgaWYgYW55IGNwdSBoYXMgbWF0Y2hlZCAqLworCQlmb3IgKGNwdV9udW0gPSAwLCBhbGxvY2F0ZWRfZmxhZyA9IDAsIHN1bSA9IDA7IGNwdV9udW0gPCBudW1fb25saW5lX2NwdXMoKTsgY3B1X251bSsrKSB7CisJCQlpZiAodWNvZGVfY3B1X2luZm9bY3B1X251bV0uZXJyID09IE1DX01BUktFRCkgeyAKKwkJCQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKKwkJCQlpZiAoIWFsbG9jYXRlZF9mbGFnKSB7CisJCQkJCWFsbG9jYXRlZF9mbGFnID0gMTsKKwkJCQkJbmV3bWMgPSB2bWFsbG9jKHRvdGFsX3NpemUpOworCQkJCQlpZiAoIW5ld21jKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCQkJCWVycm9yID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihuZXdtYyArIE1DX0hFQURFUl9TSVpFLCAKKwkJCQkJCQkJdXNlcl9idWZmZXIgKyBjdXJzb3IgKyBNQ19IRUFERVJfU0laRSwgCisJCQkJCQkJCXRvdGFsX3NpemUgLSBNQ19IRUFERVJfU0laRSkpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCQkJCQl2ZnJlZShuZXdtYyk7CisJCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQltZW1jcHkobmV3bWMsICZtY19oZWFkZXIsIE1DX0hFQURFUl9TSVpFKTsKKwkJCQkJLyogY2hlY2sgZXh0ZW5kZWQgdGFibGUgY2hlY2tzdW0gKi8KKwkJCQkJaWYgKGV4dF90YWJsZV9zaXplKSB7CisJCQkJCQlpbnQgZXh0X3RhYmxlX3N1bSA9IDA7CisJCQkJCQlpbnQgKiBleHRfdGFibGVwID0gKCgodm9pZCAqKSBuZXdtYykgKyBNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSk7CisJCQkJCQlpID0gZXh0X3RhYmxlX3NpemUgLyBEV1NJWkU7CisJCQkJCQl3aGlsZSAoaS0tKSBleHRfdGFibGVfc3VtICs9IGV4dF90YWJsZXBbaV07CisJCQkJCQlpZiAoZXh0X3RhYmxlX3N1bSkgeworCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY3JvY29kZTogYWJvcnRpbmcsIGJhZCBleHRlbmRlZCBzaWduYXR1cmUgdGFibGUgY2hlY2tzdW1cbiIpOworCQkJCQkJCXZmcmVlKG5ld21jKTsKKwkJCQkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJCQkJZ290byBvdXQ7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtICovCisJCQkJCWkgPSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpIC8gRFdTSVpFOworCQkJCQl3aGlsZSAoaS0tKSBzdW0gKz0gKChpbnQgKiluZXdtYylbaV07CisJCQkJCXN1bSAtPSAobWNfaGVhZGVyLnNpZyArIG1jX2hlYWRlci5wZiArIG1jX2hlYWRlci5ja3N1bSk7CisJCQkJfQorCQkJCXVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLm1jID0gbmV3bWM7CisJCQkJdWNvZGVfY3B1X2luZm9bY3B1X251bV0uZXJyID0gTUNfQUxMT0NBVEVEOyAvKiBtYyB1cGRhdGVkICovCisJCQkJaWYgKHN1bSArIHVjaS0+c2lnICsgdWNpLT5wZiArIHVjaS0+Y2tzdW0gIT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgYWJvcnRpbmcsIGJhZCBjaGVja3N1bVxuIiwgY3B1X251bSk7CisJCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJCWN1cnNvciArPSB0b3RhbF9zaXplOyAvKiBnb3RvIHRoZSBuZXh0IHVwZGF0ZSBwYXRjaCAqLworCX0gLyogZW5kIG9mIHdoaWxlICovCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkb191cGRhdGVfb25lICh2b2lkICogdW51c2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbFsyXTsKKwlpbnQgY3B1X251bSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKKworCWlmICh1Y2ktPm1jID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBObyBuZXcgbWljcm9jb2RlIGRhdGEgZm9yIENQVSVkXG4iLCBjcHVfbnVtKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOyAgICAgICAgICAKKworCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KKwl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKKwkJKHVuc2lnbmVkIGxvbmcpIHVjaS0+bWMtPmJpdHMsIAorCQkodW5zaWduZWQgbG9uZykgdWNpLT5tYy0+Yml0cyA+PiAxNiA+PiAxNik7CisJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiY3B1aWQiIDogOiA6ICJheCIsICJieCIsICJjeCIsICJkeCIpOworCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCisJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIHZhbFsxXSk7CisKKwkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCisJdWNpLT5lcnIgPSBNQ19TVUNDRVNTOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCBmcm9tIHJldmlzaW9uICIKKwkgICAgICAgIjB4JXggdG8gMHgleCwgZGF0ZSA9ICUwOHggXG4iLCAKKwkgICAgICAgY3B1X251bSwgdWNpLT5yZXYsIHZhbFsxXSwgdWNpLT5tYy0+aGRyLmRhdGUpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBkb19taWNyb2NvZGVfdXBkYXRlICh2b2lkKQoreworCWludCBpLCBlcnJvcjsKKworCWlmIChvbl9lYWNoX2NwdShjb2xsZWN0X2NwdV9pbmZvLCBOVUxMLCAxLCAxKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciEgQ291bGQgbm90IHJ1biBvbiBhbGwgcHJvY2Vzc29yc1xuIik7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChlcnJvciA9IGZpbmRfbWF0Y2hpbmdfdWNvZGVzKCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciBpbiB0aGUgbWljcm9jb2RlIGRhdGFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWlmIChvbl9lYWNoX2NwdShkb191cGRhdGVfb25lLCBOVUxMLCAxLCAxKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciEgQ291bGQgbm90IHJ1biBvbiBhbGwgcHJvY2Vzc29yc1xuIik7CisJCWVycm9yID0gLUVJTzsKKwl9CisKK291dF9mcmVlOgorCWZvciAoaSA9IDA7IGkgPCBudW1fb25saW5lX2NwdXMoKTsgaSsrKSB7CisJCWlmICh1Y29kZV9jcHVfaW5mb1tpXS5tYykgeworCQkJaW50IGo7CisJCQl2b2lkICp0bXAgPSB1Y29kZV9jcHVfaW5mb1tpXS5tYzsKKwkJCXZmcmVlKHRtcCk7CisJCQlmb3IgKGogPSBpOyBqIDwgbnVtX29ubGluZV9jcHVzKCk7IGorKykgeworCQkJCWlmICh1Y29kZV9jcHVfaW5mb1tqXS5tYyA9PSB0bXApCisJCQkJCXVjb2RlX2NwdV9pbmZvW2pdLm1jID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1pY3JvY29kZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJldDsKKworCWlmIChsZW4gPCBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogbm90IGVub3VnaCBkYXRhXG4iKTsgCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgobGVuID4+IFBBR0VfU0hJRlQpID4gbnVtX3BoeXNwYWdlcykgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogdG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIG51bV9waHlzcGFnZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZtaWNyb2NvZGVfc2VtKTsKKworCXVzZXJfYnVmZmVyID0gKHZvaWQgX191c2VyICopIGJ1ZjsKKwl1c2VyX2J1ZmZlcl9zaXplID0gKGludCkgbGVuOworCisJcmV0ID0gZG9fbWljcm9jb2RlX3VwZGF0ZSgpOworCWlmICghcmV0KQorCQlyZXQgPSAoc3NpemVfdClsZW47CisKKwl1cCgmbWljcm9jb2RlX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1pY3JvY29kZV9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCQkvKiAKKwkJICogIFhYWDogd2lsbCBiZSByZW1vdmVkIGFmdGVyIG1pY3JvY29kZV9jdGwgCisJCSAqICBpcyB1cGRhdGVkIHRvIGlnbm9yZSBmYWlsdXJlIG9mIHRoaXMgaW9jdGwoKQorCQkgKi8KKwkJY2FzZSBNSUNST0NPREVfSU9DRlJFRToKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaWNyb2NvZGVfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IG1pY3JvY29kZV93cml0ZSwKKwkuaW9jdGwJCT0gbWljcm9jb2RlX2lvY3RsLAorCS5vcGVuCQk9IG1pY3JvY29kZV9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG1pY3JvY29kZV9kZXYgPSB7CisJLm1pbm9yCQk9IE1JQ1JPQ09ERV9NSU5PUiwKKwkubmFtZQkJPSAibWljcm9jb2RlIiwKKwkuZGV2ZnNfbmFtZQk9ICJjcHUvbWljcm9jb2RlIiwKKwkuZm9wcwkJPSAmbWljcm9jb2RlX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtaWNyb2NvZGVfaW5pdCAodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQlNSUNST0NPREVfTUlOT1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAKKwkJIklBLTMyIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTiAiIDx0aWdyYW5AdmVyaXRhcy5jb20+XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9leGl0ICh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmbWljcm9jb2RlX2Rldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiSUEtMzIgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIgdiIgTUlDUk9DT0RFX1ZFUlNJT04gIiB1bnJlZ2lzdGVyZWRcbiIpOworfQorCittb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCkKK21vZHVsZV9leGl0KG1pY3JvY29kZV9leGl0KQorTU9EVUxFX0FMSUFTX01JU0NERVYoTUlDUk9DT0RFX01JTk9SKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDljOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiAgS2VybmVsIG1vZHVsZSBoZWxwIGZvciBpMzg2LgorICAgIENvcHlyaWdodCAoQykgMjAwMSBSdXN0eSBSdXNzZWxsLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZtdC4uLikKKyNlbmRpZgorCit2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChzaXplID09IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiB2bWFsbG9jX2V4ZWMoc2l6ZSk7Cit9CisKKworLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KK3ZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQoreworCXZmcmVlKG1vZHVsZV9yZWdpb24pOworCS8qIEZJWE1FOiBJZiBtb2R1bGVfcmVnaW9uID09IG1vZC0+aW5pdF9yZWdpb24sIHRyaW0gZXhjZXB0aW9uCisgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICovCit9CisKKy8qIFdlIGRvbid0IG5lZWQgYW55dGhpbmcgc3BlY2lhbC4gKi8KK2ludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCisJCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKKwkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJRWxmMzJfUmVsICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOworCUVsZjMyX1N5bSAqc3ltOworCXVpbnQzMl90ICpsb2NhdGlvbjsKKworCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGUgc2VjdGlvbiAldSB0byAldVxuIiwgcmVsc2VjLAorCSAgICAgICBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbyk7CisJZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKKwkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KKwkJbG9jYXRpb24gPSAodm9pZCAqKXNlY2hkcnNbc2VjaGRyc1tyZWxzZWNdLnNoX2luZm9dLnNoX2FkZHIKKwkJCSsgcmVsW2ldLnJfb2Zmc2V0OworCQkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvLiAgTm90ZSB0aGF0IGFsbAorCQkgICB1bmRlZmluZWQgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQuICAqLworCQlzeW0gPSAoRWxmMzJfU3ltICopc2VjaGRyc1tzeW1pbmRleF0uc2hfYWRkcgorCQkJKyBFTEYzMl9SX1NZTShyZWxbaV0ucl9pbmZvKTsKKworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgeworCQljYXNlIFJfMzg2XzMyOgorCQkJLyogV2UgYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBsb2NhdGlvbiBnaXZlbiAqLworCQkJKmxvY2F0aW9uICs9IHN5bS0+c3RfdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBSXzM4Nl9QQzMyOgorCQkJLyogQWRkIHRoZSB2YWx1ZSwgc3VidHJhY3QgaXRzIHBvc3RpdGlvbiAqLworCQkJKmxvY2F0aW9uICs9IHN5bS0+c3RfdmFsdWUgLSAodWludDMyX3QpbG9jYXRpb247CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBVbmtub3duIHJlbG9jYXRpb246ICV1XG4iLAorCQkJICAgICAgIG1lLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZjMyX1NoZHIgKnNlY2hkcnMsCisJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IEFERCBSRUxPQ0FUSU9OIHVuc3VwcG9ydGVkXG4iLAorCSAgICAgICBtZS0+bmFtZSk7CisJcmV0dXJuIC1FTk9FWEVDOworfQorCitleHRlcm4gdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXModm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7IAorCitpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCisJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKwkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCWNvbnN0IEVsZl9TaGRyICpzOworCWNoYXIgKnNlY3N0cmluZ3MgPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisKKwkvKiBsb29rIGZvciAuYWx0aW5zdHJ1Y3Rpb25zIHRvIHBhdGNoICovIAorCWZvciAocyA9IHNlY2hkcnM7IHMgPCBzZWNoZHJzICsgaGRyLT5lX3NobnVtOyBzKyspIHsgCisJCXZvaWQgKnNlZzsgCQkKKwkJaWYgKHN0cmNtcCgiLmFsdGluc3RydWN0aW9ucyIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlzZWcgPSAodm9pZCAqKXMtPnNoX2FkZHI7IAorCQlhcHBseV9hbHRlcm5hdGl2ZXMoc2VnLCBzZWcgKyBzLT5zaF9zaXplKTsgCisJfSAJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDdhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKglJbnRlbCBNdWx0aXByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIDEuMSBhbmQgMS40CisgKgljb21wbGlhbnQgTVAtdGFibGUgcGFyc2luZyByb3V0aW5lcy4KKyAqCisgKgkoYykgMTk5NSBBbGFuIENveCwgQnVpbGRpbmcgIzMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCShjKSAxOTk4LCAxOTk5LCAyMDAwIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqCUZpeGVzCisgKgkJRXJpY2ggQm9sZXluCToJTVAgdjEuNCBhbmQgYWRkaXRpb25hbCBjaGFuZ2VzLgorICoJCUFsYW4gQ294CToJQWRkZWQgRUJEQSBzY2FubmluZworICoJCUluZ28gTW9sbmFyCToJdmFyaW91cyBjbGVhbnVwcyBhbmQgcmV3cml0ZXMKKyAqCQlNYWNpZWogVy4gUm96eWNraToJQml0cyBmb3IgZGVmYXVsdCBNUCBjb25maWd1cmF0aW9ucworICoJCVBhdWwgRGllZmVuYmF1Z2g6CUFkZGVkIGZ1bGwgQUNQSSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX21wcGFyc2UuaD4KKyNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KKworLyogSGF2ZSB3ZSBmb3VuZCBhbiBNUCB0YWJsZSAqLworaW50IHNtcF9mb3VuZF9jb25maWc7Cit1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYXhjcHVzID0gTlJfQ1BVUzsKKworLyoKKyAqIFZhcmlvdXMgTGludXgtaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgZnJvbSB0aGUKKyAqIE1QLXRhYmxlLgorICovCitpbnQgYXBpY192ZXJzaW9uIFtNQVhfQVBJQ1NdOworaW50IG1wX2J1c19pZF90b190eXBlIFtNQVhfTVBfQlVTU0VTXTsKK2ludCBtcF9idXNfaWRfdG9fbm9kZSBbTUFYX01QX0JVU1NFU107CitpbnQgbXBfYnVzX2lkX3RvX2xvY2FsIFtNQVhfTVBfQlVTU0VTXTsKK2ludCBxdWFkX2xvY2FsX3RvX21wX2J1c19pZCBbTlJfQ1BVUy80XVs0XTsKK2ludCBtcF9idXNfaWRfdG9fcGNpX2J1cyBbTUFYX01QX0JVU1NFU10gPSB7IFswIC4uLiBNQVhfTVBfQlVTU0VTLTFdID0gLTEgfTsKK3N0YXRpYyBpbnQgbXBfY3VycmVudF9wY2lfaWQ7CisKKy8qIEkvTyBBUElDIGVudHJpZXMgKi8KK3N0cnVjdCBtcGNfY29uZmlnX2lvYXBpYyBtcF9pb2FwaWNzW01BWF9JT19BUElDU107CisKKy8qICMgb2YgTVAgSVJRIHNvdXJjZSBlbnRyaWVzICovCitzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgbXBfaXJxc1tNQVhfSVJRX1NPVVJDRVNdOworCisvKiBNUCBJUlEgc291cmNlIGVudHJpZXMgKi8KK2ludCBtcF9pcnFfZW50cmllczsKKworaW50IG5yX2lvYXBpY3M7CisKK2ludCBwaWNfbW9kZTsKK3Vuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKKworLyogUHJvY2Vzc29yIHRoYXQgaXMgZG9pbmcgdGhlIGJvb3QgdXAgKi8KK3Vuc2lnbmVkIGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSAtMVU7Cit1bnNpZ25lZCBpbnQgYm9vdF9jcHVfbG9naWNhbF9hcGljaWQgPSAtMVU7CisvKiBJbnRlcm5hbCBwcm9jZXNzb3IgY291bnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBudW1fcHJvY2Vzc29yczsKKworLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KK3BoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CisKK3U4IGJpb3NfY3B1X2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CisKKy8qCisgKiBJbnRlbCBNUCBCSU9TIHRhYmxlIHBhcnNpbmcgcm91dGluZXM6CisgKi8KKworCisvKgorICogQ2hlY2tzdW0gYW4gTVAgY29uZmlndXJhdGlvbiBibG9jay4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBtcGZfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqbXAsIGludCBsZW4pCit7CisJaW50IHN1bSA9IDA7CisKKwl3aGlsZSAobGVuLS0pCisJCXN1bSArPSAqbXArKzsKKworCXJldHVybiBzdW0gJiAweEZGOworfQorCisvKgorICogSGF2ZSB0byBtYXRjaCB0cmFuc2xhdGlvbiB0YWJsZSBlbnRyaWVzIHRvIG1haW4gdGFibGUgZW50cmllcyBieSBjb3VudGVyCisgKiBoZW5jZSB0aGUgbXBjX3JlY29yZCB2YXJpYWJsZSAuLi4uIGNhbid0IHNlZSBhIGxlc3MgZGlzZ3VzdGluZyB3YXkgb2YKKyAqIGRvaW5nIHRoaXMgLi4uLgorICovCisKK3N0YXRpYyBpbnQgbXBjX3JlY29yZDsgCitzdGF0aWMgc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKnRyYW5zbGF0aW9uX3RhYmxlW01BWF9NUENfRU5UUlldIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgaW50IE1QX3ZhbGlkX2FwaWNpZChpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gaHdlaWdodF9sb25nKGFwaWNpZCAmIDB4ZikgPT0gMSAmJiAoYXBpY2lkID4+IDQpICE9IDB4ZjsKK30KKyNlbHNlCitzdGF0aWMgaW50IE1QX3ZhbGlkX2FwaWNpZChpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlpZiAodmVyc2lvbiA+PSAweDE0KQorCQlyZXR1cm4gYXBpY2lkIDwgMHhmZjsKKwllbHNlCisJCXJldHVybiBhcGljaWQgPCAweGY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm0pCit7CisgCWludCB2ZXIsIGFwaWNpZDsKKwlwaHlzaWRfbWFza190IHRtcDsKKyAJCisJaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCisJCXJldHVybjsKKworCWFwaWNpZCA9IG1wY19hcGljX2lkKG0sIHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdKTsKKworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDApKQorCQlEcHJpbnRrKCIgICAgRmxvYXRpbmcgcG9pbnQgdW5pdCBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8NykpCisJCURwcmludGsoIiAgICBNYWNoaW5lIEV4Y2VwdGlvbiBzdXBwb3J0ZWQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDw4KSkKKwkJRHByaW50aygiICAgIDY0IGJpdCBjb21wYXJlICYgZXhjaGFuZ2Ugc3VwcG9ydGVkLlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8OSkpCisJCURwcmludGsoIiAgICBJbnRlcm5hbCBBUElDIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxMSkpCisJCURwcmludGsoIiAgICBTRVAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDEyKSkKKwkJRHByaW50aygiICAgIE1UUlIgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxMykpCisJCURwcmludGsoIiAgICBQR0UgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxNCkpCisJCURwcmludGsoIiAgICBNQ0EgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxNSkpCisJCURwcmludGsoIiAgICBDTU9WICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTYpKQorCQlEcHJpbnRrKCIgICAgUEFUICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTcpKQorCQlEcHJpbnRrKCIgICAgUFNFICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTgpKQorCQlEcHJpbnRrKCIgICAgUFNOICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTkpKQorCQlEcHJpbnRrKCIgICAgQ2FjaGUgTGluZSBGbHVzaCBJbnN0cnVjdGlvbiBwcmVzZW50LlxuIik7CisJLyogMjAgUmVzZXJ2ZWQgKi8KKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyMSkpCisJCURwcmludGsoIiAgICBEZWJ1ZyBUcmFjZSBhbmQgRU1PTiBTdG9yZSBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjIpKQorCQlEcHJpbnRrKCIgICAgQUNQSSBUaGVybWFsIFRocm90dGxlIFJlZ2lzdGVycyAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDIzKSkKKwkJRHByaW50aygiICAgIE1NWCAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDI0KSkKKwkJRHByaW50aygiICAgIEZYU1IgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNSkpCisJCURwcmludGsoIiAgICBYTU0gIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNikpCisJCURwcmludGsoIiAgICBXaWxsYW1ldHRlIE5ldyBJbnN0cnVjdGlvbnMgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNykpCisJCURwcmludGsoIiAgICBTZWxmIFNub29wICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjgpKQorCQlEcHJpbnRrKCIgICAgSFQgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyOSkpCisJCURwcmludGsoIiAgICBUaGVybWFsIE1vbml0b3IgcHJlc2VudC5cbiIpOworCS8qIDMwLCAzMSBSZXNlcnZlZCAqLworCisKKwlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworCQlEcHJpbnRrKCIgICAgQm9vdHVwIENQVVxuIik7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPm1wY19hcGljaWQ7CisJCWJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gYXBpY2lkOworCX0KKworCWlmIChudW1fcHJvY2Vzc29ycyA+PSBOUl9DUFVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IE5SX0NQVVMgbGltaXQgb2YgJWkgcmVhY2hlZC4iCisJCQkiICBQcm9jZXNzb3IgaWdub3JlZC5cbiIsIE5SX0NQVVMpOyAKKwkJcmV0dXJuOworCX0KKworCWlmIChudW1fcHJvY2Vzc29ycyA+PSBtYXhjcHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IG1heGNwdXMgbGltaXQgb2YgJWkgcmVhY2hlZC4iCisJCQkiIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgbWF4Y3B1cyk7IAorCQlyZXR1cm47CisJfQorCW51bV9wcm9jZXNzb3JzKys7CisJdmVyID0gbS0+bXBjX2FwaWN2ZXI7CisKKwlpZiAoIU1QX3ZhbGlkX2FwaWNpZChhcGljaWQsIHZlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2Vzc29yICMlZCBJTlZBTElELiAoTWF4IElEOiAlZCkuXG4iLAorCQkJbS0+bXBjX2FwaWNpZCwgTUFYX0FQSUNTKTsKKwkJLS1udW1fcHJvY2Vzc29yczsKKwkJcmV0dXJuOworCX0KKworCXRtcCA9IGFwaWNpZF90b19jcHVfcHJlc2VudChhcGljaWQpOworCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCB0bXApOworCQorCS8qCisJICogVmFsaWRhdGUgdmVyc2lvbgorCSAqLworCWlmICh2ZXIgPT0gMHgwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISBmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLCBtLT5tcGNfYXBpY2lkKTsKKwkJdmVyID0gMHgxMDsKKwl9CisJYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOworCWJpb3NfY3B1X2FwaWNpZFtudW1fcHJvY2Vzc29ycyAtIDFdID0gbS0+bXBjX2FwaWNpZDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2J1c19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm0pCit7CisJY2hhciBzdHJbN107CisKKwltZW1jcHkoc3RyLCBtLT5tcGNfYnVzdHlwZSwgNik7CisJc3RyWzZdID0gMDsKKworCW1wY19vZW1fYnVzX2luZm8obSwgc3RyLCB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSk7CisKKwlpZiAoc3RybmNtcChzdHIsIEJVU1RZUEVfSVNBLCBzaXplb2YoQlVTVFlQRV9JU0EpLTEpID09IDApIHsKKwkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19JU0E7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9FSVNBLCBzaXplb2YoQlVTVFlQRV9FSVNBKS0xKSA9PSAwKSB7CisJCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfRUlTQTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX1BDSSwgc2l6ZW9mKEJVU1RZUEVfUENJKS0xKSA9PSAwKSB7CisJCW1wY19vZW1fcGNpX2J1cyhtLCB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSk7CisJCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfUENJOworCQltcF9idXNfaWRfdG9fcGNpX2J1c1ttLT5tcGNfYnVzaWRdID0gbXBfY3VycmVudF9wY2lfaWQ7CisJCW1wX2N1cnJlbnRfcGNpX2lkKys7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9NQ0EsIHNpemVvZihCVVNUWVBFX01DQSktMSkgPT0gMCkgeworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX01DQTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX05FQzk4LCBzaXplb2YoQlVTVFlQRV9ORUM5OCktMSkgPT0gMCkgeworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX05FQzk4OworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVua25vd24gYnVzdHlwZSAlcyAtIGlnbm9yaW5nXG4iLCBzdHIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2lvYXBpY19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19pb2FwaWMgKm0pCit7CisJaWYgKCEobS0+bXBjX2ZsYWdzICYgTVBDX0FQSUNfVVNBQkxFKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSS9PIEFQSUMgIyVkIFZlcnNpb24gJWQgYXQgMHglbFguXG4iLAorCQltLT5tcGNfYXBpY2lkLCBtLT5tcGNfYXBpY3ZlciwgbS0+bXBjX2FwaWNhZGRyKTsKKwlpZiAobnJfaW9hcGljcyA+PSBNQVhfSU9fQVBJQ1MpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTWF4ICMgb2YgSS9PIEFQSUNzICglZCkgZXhjZWVkZWQgKGZvdW5kICVkKS5cbiIsCisJCQlNQVhfSU9fQVBJQ1MsIG5yX2lvYXBpY3MpOworCQlwYW5pYygiUmVjb21waWxlIGtlcm5lbCB3aXRoIGJpZ2dlciBNQVhfSU9fQVBJQ1MhLlxuIik7CisJfQorCWlmICghbS0+bXBjX2FwaWNhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0FSTklORzogYm9ndXMgemVybyBJL08gQVBJQyBhZGRyZXNzIgorCQkJIiBmb3VuZCBpbiBNUCB0YWJsZSwgc2tpcHBpbmchXG4iKTsKKwkJcmV0dXJuOworCX0KKwltcF9pb2FwaWNzW25yX2lvYXBpY3NdID0gKm07CisJbnJfaW9hcGljcysrOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfaW50c3JjX2luZm8gKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbSkKK3sKKwltcF9pcnFzIFttcF9pcnFfZW50cmllc10gPSAqbTsKKwlEcHJpbnRrKCJJbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICVkLCIKKwkJIiBJUlEgJTAyeCwgQVBJQyBJRCAleCwgQVBJQyBJTlQgJTAyeFxuIiwKKwkJCW0tPm1wY19pcnF0eXBlLCBtLT5tcGNfaXJxZmxhZyAmIDMsCisJCQkobS0+bXBjX2lycWZsYWcgPj4gMikgJiAzLCBtLT5tcGNfc3JjYnVzLAorCQkJbS0+bXBjX3NyY2J1c2lycSwgbS0+bXBjX2RzdGFwaWMsIG0tPm1wY19kc3RpcnEpOworCWlmICgrK21wX2lycV9lbnRyaWVzID09IE1BWF9JUlFfU09VUkNFUykKKwkJcGFuaWMoIk1heCAjIG9mIGlycSBzb3VyY2VzIGV4Y2VlZGVkISFcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfbGludHNyY19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICptKQoreworCURwcmludGsoIkxpbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICVkLCIKKwkJIiBJUlEgJTAyeCwgQVBJQyBJRCAleCwgQVBJQyBMSU5UICUwMnhcbiIsCisJCQltLT5tcGNfaXJxdHlwZSwgbS0+bXBjX2lycWZsYWcgJiAzLAorCQkJKG0tPm1wY19pcnFmbGFnID4+IDIpICYzLCBtLT5tcGNfc3JjYnVzaWQsCisJCQltLT5tcGNfc3JjYnVzaXJxLCBtLT5tcGNfZGVzdGFwaWMsIG0tPm1wY19kZXN0YXBpY2xpbnQpOworCS8qCisJICogV2VsbCBpdCBzZWVtcyBhbGwgU01QIGJvYXJkcyBpbiBleGlzdGVuY2UKKwkgKiB1c2UgRXh0SU5UL0xWVDEgPT0gTElOVDAgYW5kCisJICogTk1JL0xWVDIgPT0gTElOVDEgLSB0aGUgZm9sbG93aW5nIGNoZWNrCisJICogd2lsbCBzaG93IHVzIGlmIHRoaXMgYXNzdW1wdGlvbnMgaXMgZmFsc2UuCisJICogVW50aWwgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBhZGQgYmFnZ2FnZS4KKwkgKi8KKwlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX0V4dElOVCkgJiYKKwkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMCkpCisJCQlCVUcoKTsKKwlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX05NSSkgJiYKKwkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMSkpCisJCQlCVUcoKTsKK30KKworI2lmZGVmIENPTkZJR19YODZfTlVNQVEKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF90cmFuc2xhdGlvbl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ190cmFuc2xhdGlvbiAqbSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJUcmFuc2xhdGlvbjogcmVjb3JkICVkLCB0eXBlICVkLCBxdWFkICVkLCBnbG9iYWwgJWQsIGxvY2FsICVkXG4iLCBtcGNfcmVjb3JkLCBtLT50cmFuc190eXBlLCBtLT50cmFuc19xdWFkLCBtLT50cmFuc19nbG9iYWwsIG0tPnRyYW5zX2xvY2FsKTsKKworCWlmIChtcGNfcmVjb3JkID49IE1BWF9NUENfRU5UUlkpIAorCQlwcmludGsoS0VSTl9FUlIgIk1BWF9NUENfRU5UUlkgZXhjZWVkZWQhXG4iKTsKKwllbHNlCisJCXRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdID0gbTsgLyogc3Rhc2ggdGhpcyBmb3IgbGF0ZXIgKi8KKwlpZiAobS0+dHJhbnNfcXVhZCA8IE1BWF9OVU1OT0RFUyAmJiAhbm9kZV9vbmxpbmUobS0+dHJhbnNfcXVhZCkpCisJCW5vZGVfc2V0X29ubGluZShtLT50cmFuc19xdWFkKTsKK30KKworLyoKKyAqIFJlYWQvcGFyc2UgdGhlIE1QQyBvZW0gdGFibGVzCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9yZWFkX21wY19vZW0oc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqb2VtdGFibGUsIFwKKwl1bnNpZ25lZCBzaG9ydCBvZW1zaXplKQoreworCWludCBjb3VudCA9IHNpemVvZiAoKm9lbXRhYmxlKTsgLyogdGhlIGhlYWRlciBzaXplICovCisJdW5zaWduZWQgY2hhciAqb2VtcHRyID0gKCh1bnNpZ25lZCBjaGFyICopb2VtdGFibGUpK2NvdW50OworCQorCW1wY19yZWNvcmQgPSAwOworCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIGFuIE9FTSBNUEMgdGFibGUgYXQgJThwIC0gcGFyc2luZyBpdCAuLi4gXG4iLCBvZW10YWJsZSk7CisJaWYgKG1lbWNtcChvZW10YWJsZS0+b2VtX3NpZ25hdHVyZSxNUENfT0VNX1NJR05BVFVSRSw0KSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNUCBtcGMgb2VtdGFibGU6IGJhZCBzaWduYXR1cmUgWyVjJWMlYyVjXSFcbiIsCisJCQlvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVswXSwKKwkJCW9lbXRhYmxlLT5vZW1fc2lnbmF0dXJlWzFdLAorCQkJb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbMl0sCisJCQlvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVszXSk7CisJCXJldHVybjsKKwl9CisJaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlLG9lbXRhYmxlLT5vZW1fbGVuZ3RoKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNUCBvZW0gbXB0YWJsZTogY2hlY2tzdW0gZXJyb3IhXG4iKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoY291bnQgPCBvZW10YWJsZS0+b2VtX2xlbmd0aCkgeworCQlzd2l0Y2ggKCpvZW1wdHIpIHsKKwkJCWNhc2UgTVBfVFJBTlNMQVRJT046CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ190cmFuc2xhdGlvbiAqKW9lbXB0cjsKKwkJCQlNUF90cmFuc2xhdGlvbl9pbmZvKG0pOworCQkJCW9lbXB0ciArPSBzaXplb2YoKm0pOworCQkJCWNvdW50ICs9IHNpemVvZigqbSk7CisJCQkJKyttcGNfcmVjb3JkOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnJlY29nbmlzZWQgT0VNIHRhYmxlIGVudHJ5IHR5cGUhIC0gJWRcbiIsIChpbnQpICpvZW1wdHIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorICAgICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCisJCWNoYXIgKnByb2R1Y3RpZCkKK3sKKwlpZiAoc3RybmNtcChvZW0sICJJQk0gTlVNQSIsIDgpKQorCQlwcmludGsoIldhcm5pbmchICBNYXkgbm90IGJlIGEgTlVNQS1RIHN5c3RlbSFcbiIpOworCWlmIChtcGMtPm1wY19vZW1wdHIpCisJCXNtcF9yZWFkX21wY19vZW0oKHN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKikgbXBjLT5tcGNfb2VtcHRyLAorCQkJCW1wYy0+bXBjX29lbXNpemUpOworfQorI2VuZGlmCS8qIENPTkZJR19YODZfTlVNQVEgKi8KKworLyoKKyAqIFJlYWQvcGFyc2UgdGhlIE1QQworICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9yZWFkX21wYyhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMpCit7CisJY2hhciBzdHJbMTZdOworCWNoYXIgb2VtWzEwXTsKKwlpbnQgY291bnQ9c2l6ZW9mKCptcGMpOworCXVuc2lnbmVkIGNoYXIgKm1wdD0oKHVuc2lnbmVkIGNoYXIgKiltcGMpK2NvdW50OworCisJaWYgKG1lbWNtcChtcGMtPm1wY19zaWduYXR1cmUsTVBDX1NJR05BVFVSRSw0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNNUCBtcHRhYmxlOiBiYWQgc2lnbmF0dXJlIFsweCV4XSFcbiIsCisJCQkqKHUzMiAqKW1wYy0+bXBjX3NpZ25hdHVyZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLG1wYy0+bXBjX2xlbmd0aCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogY2hlY2tzdW0gZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtcGMtPm1wY19zcGVjIT0weDAxICYmIG1wYy0+bXBjX3NwZWMhPTB4MDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogYmFkIHRhYmxlIHZlcnNpb24gKCVkKSEhXG4iLAorCQkJbXBjLT5tcGNfc3BlYyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW1wYy0+bXBjX2xhcGljKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IG51bGwgbG9jYWwgQVBJQyBhZGRyZXNzIVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkob2VtLG1wYy0+bXBjX29lbSw4KTsKKwlvZW1bOF09MDsKKwlwcmludGsoS0VSTl9JTkZPICJPRU0gSUQ6ICVzICIsb2VtKTsKKworCW1lbWNweShzdHIsbXBjLT5tcGNfcHJvZHVjdGlkLDEyKTsKKwlzdHJbMTJdPTA7CisJcHJpbnRrKCJQcm9kdWN0IElEOiAlcyAiLHN0cik7CisKKwltcHNfb2VtX2NoZWNrKG1wYywgb2VtLCBzdHIpOworCisJcHJpbnRrKCJBUElDIGF0OiAweCVsWFxuIixtcGMtPm1wY19sYXBpYyk7CisKKwkvKiAKKwkgKiBTYXZlIHRoZSBsb2NhbCBBUElDIGFkZHJlc3MgKGl0IG1pZ2h0IGJlIG5vbi1kZWZhdWx0KSAtLSBidXQgb25seQorCSAqIGlmIHdlJ3JlIG5vdCB1c2luZyBBQ1BJLgorCSAqLworCWlmICghYWNwaV9sYXBpYykKKwkJbXBfbGFwaWNfYWRkciA9IG1wYy0+bXBjX2xhcGljOworCisJLyoKKwkgKglOb3cgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBibG9ja3MuCisJICovCisJbXBjX3JlY29yZCA9IDA7CisJd2hpbGUgKGNvdW50IDwgbXBjLT5tcGNfbGVuZ3RoKSB7CisJCXN3aXRjaCgqbXB0KSB7CisJCQljYXNlIE1QX1BST0NFU1NPUjoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKiltcHQ7CisJCQkJLyogQUNQSSBtYXkgaGF2ZSBhbHJlYWR5IHByb3ZpZGVkIHRoaXMgZGF0YSAqLworCQkJCWlmICghYWNwaV9sYXBpYykKKwkJCQkJTVBfcHJvY2Vzc29yX2luZm8obSk7CisJCQkJbXB0ICs9IHNpemVvZigqbSk7CisJCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfQlVTOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqKW1wdDsKKwkJCQlNUF9idXNfaW5mbyhtKTsKKwkJCQltcHQgKz0gc2l6ZW9mKCptKTsKKwkJCQljb3VudCArPSBzaXplb2YoKm0pOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBNUF9JT0FQSUM6CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfaW9hcGljICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfaW9hcGljICopbXB0OworCQkJCU1QX2lvYXBpY19pbmZvKG0pOworCQkJCW1wdCs9c2l6ZW9mKCptKTsKKwkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfSU5UU1JDOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqKW1wdDsKKworCQkJCU1QX2ludHNyY19pbmZvKG0pOworCQkJCW1wdCs9c2l6ZW9mKCptKTsKKwkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfTElOVFNSQzoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqKW1wdDsKKwkJCQlNUF9saW50c3JjX2luZm8obSk7CisJCQkJbXB0Kz1zaXplb2YoKm0pOworCQkJCWNvdW50Kz1zaXplb2YoKm0pOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQljb3VudCA9IG1wYy0+bXBjX2xlbmd0aDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkrK21wY19yZWNvcmQ7CisJfQorCWNsdXN0ZXJlZF9hcGljX2NoZWNrKCk7CisJaWYgKCFudW1fcHJvY2Vzc29ycykKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogbm8gcHJvY2Vzc29ycyByZWdpc3RlcmVkIVxuIik7CisJcmV0dXJuIG51bV9wcm9jZXNzb3JzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBFTENSX3RyaWdnZXIodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKworCXBvcnQgPSAweDRkMCArIChpcnEgPj4gMyk7CisJcmV0dXJuIChpbmIocG9ydCkgPj4gKGlycSAmIDcpKSAmIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb25zdHJ1Y3RfZGVmYXVsdF9pb2lycV9tcHRhYmxlKGludCBtcGNfZGVmYXVsdF90eXBlKQoreworCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyBpbnRzcmM7CisJaW50IGk7CisJaW50IEVMQ1JfZmFsbGJhY2sgPSAwOworCisJaW50c3JjLm1wY190eXBlID0gTVBfSU5UU1JDOworCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CQkJLyogY29uZm9ybWluZyAqLworCWludHNyYy5tcGNfc3JjYnVzID0gMDsKKwlpbnRzcmMubXBjX2RzdGFwaWMgPSBtcF9pb2FwaWNzWzBdLm1wY19hcGljaWQ7CisKKwlpbnRzcmMubXBjX2lycXR5cGUgPSBtcF9JTlQ7CisKKwkvKgorCSAqICBJZiB0cnVlLCB3ZSBoYXZlIGFuIElTQS9QQ0kgc3lzdGVtIHdpdGggbm8gSVJRIGVudHJpZXMKKwkgKiAgaW4gdGhlIE1QIHRhYmxlLiBUbyBwcmV2ZW50IHRoZSBQQ0kgaW50ZXJydXB0cyBmcm9tIGJlaW5nIHNldCB1cAorCSAqICBpbmNvcnJlY3RseSwgd2UgdHJ5IHRvIHVzZSB0aGUgRUxDUi4gVGhlIHNhbml0eSBjaGVjayB0byBzZWUgaWYKKwkgKiAgdGhlcmUgaXMgZ29vZCBFTENSIGRhdGEgaXMgdmVyeSBzaW1wbGUgLSBJUlEwLCAxLCAyIGFuZCAxMyBjYW4KKwkgKiAgbmV2ZXIgYmUgbGV2ZWwgc2Vuc2l0aXZlLCBzbyB3ZSBzaW1wbHkgc2VlIGlmIHRoZSBFTENSIGFncmVlcy4KKwkgKiAgSWYgaXQgZG9lcywgd2UgYXNzdW1lIGl0J3MgdmFsaWQuCisJICovCisJaWYgKG1wY19kZWZhdWx0X3R5cGUgPT0gNSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJU0EvUENJIGJ1cyB0eXBlIHdpdGggbm8gSVJRIGluZm9ybWF0aW9uLi4uIGZhbGxpbmcgYmFjayB0byBFTENSXG4iKTsKKworCQlpZiAoRUxDUl90cmlnZ2VyKDApIHx8IEVMQ1JfdHJpZ2dlcigxKSB8fCBFTENSX3RyaWdnZXIoMikgfHwgRUxDUl90cmlnZ2VyKDEzKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVMQ1IgY29udGFpbnMgaW52YWxpZCBkYXRhLi4uIG5vdCB1c2luZyBFTENSXG4iKTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBFTENSIHRvIGlkZW50aWZ5IFBDSSBpbnRlcnJ1cHRzXG4iKTsKKwkJCUVMQ1JfZmFsbGJhY2sgPSAxOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJc3dpdGNoIChtcGNfZGVmYXVsdF90eXBlKSB7CisJCWNhc2UgMjoKKwkJCWlmIChpID09IDAgfHwgaSA9PSAxMykKKwkJCQljb250aW51ZTsJLyogSVJRMCAmIElSUTEzIG5vdCBjb25uZWN0ZWQgKi8KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJaWYgKGkgPT0gMikKKwkJCQljb250aW51ZTsJLyogSVJRMiBpcyBuZXZlciBjb25uZWN0ZWQgKi8KKwkJfQorCisJCWlmIChFTENSX2ZhbGxiYWNrKSB7CisJCQkvKgorCQkJICogIElmIHRoZSBFTENSIGluZGljYXRlcyBhIGxldmVsLXNlbnNpdGl2ZSBpbnRlcnJ1cHQsIHdlCisJCQkgKiAgY29weSB0aGF0IGluZm9ybWF0aW9uIG92ZXIgdG8gdGhlIE1QIHRhYmxlIGluIHRoZQorCQkJICogIGlycWZsYWcgZmllbGQgKGxldmVsIHNlbnNpdGl2ZSwgYWN0aXZlIGhpZ2ggcG9sYXJpdHkpLgorCQkJICovCisJCQlpZiAoRUxDUl90cmlnZ2VyKGkpKQorCQkJCWludHNyYy5tcGNfaXJxZmxhZyA9IDEzOworCQkJZWxzZQorCQkJCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CisJCX0KKworCQlpbnRzcmMubXBjX3NyY2J1c2lycSA9IGk7CisJCWludHNyYy5tcGNfZHN0aXJxID0gaSA/IGkgOiAyOwkJLyogSVJRMCB0byBJTlRJTjIgKi8KKwkJTVBfaW50c3JjX2luZm8oJmludHNyYyk7CisJfQorCisJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfRXh0SU5UOworCWludHNyYy5tcGNfc3JjYnVzaXJxID0gMDsKKwlpbnRzcmMubXBjX2RzdGlycSA9IDA7CQkJCS8qIDgyNTlBIHRvIElOVElOMCAqLworCU1QX2ludHNyY19pbmZvKCZpbnRzcmMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGNvbnN0cnVjdF9kZWZhdWx0X0lTQV9tcHRhYmxlKGludCBtcGNfZGVmYXVsdF90eXBlKQoreworCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciBwcm9jZXNzb3I7CisJc3RydWN0IG1wY19jb25maWdfYnVzIGJ1czsKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pb2FwaWMgaW9hcGljOworCXN0cnVjdCBtcGNfY29uZmlnX2xpbnRzcmMgbGludHNyYzsKKwlpbnQgbGludHR5cGVzWzJdID0geyBtcF9FeHRJTlQsIG1wX05NSSB9OworCWludCBpOworCisJLyoKKwkgKiBsb2NhbCBBUElDIGhhcyBkZWZhdWx0IGFkZHJlc3MKKwkgKi8KKwltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKworCS8qCisJICogMiBDUFVzLCBudW1iZXJlZCAwICYgMS4KKwkgKi8KKwlwcm9jZXNzb3IubXBjX3R5cGUgPSBNUF9QUk9DRVNTT1I7CisJLyogRWl0aGVyIGFuIGludGVncmF0ZWQgQVBJQyBvciBhIGRpc2NyZXRlIDgyNDg5RFguICovCisJcHJvY2Vzc29yLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSBDUFVfRU5BQkxFRDsKKwlwcm9jZXNzb3IubXBjX2NwdWZlYXR1cmUgPSAoYm9vdF9jcHVfZGF0YS54ODYgPDwgOCkgfAorCQkJCSAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PCA0KSB8CisJCQkJICAgYm9vdF9jcHVfZGF0YS54ODZfbWFzazsKKwlwcm9jZXNzb3IubXBjX2ZlYXR1cmVmbGFnID0gYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVswXTsKKwlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzBdID0gMDsKKwlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzFdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXByb2Nlc3Nvci5tcGNfYXBpY2lkID0gaTsKKwkJTVBfcHJvY2Vzc29yX2luZm8oJnByb2Nlc3Nvcik7CisJfQorCisJYnVzLm1wY190eXBlID0gTVBfQlVTOworCWJ1cy5tcGNfYnVzaWQgPSAwOworCXN3aXRjaCAobXBjX2RlZmF1bHRfdHlwZSkgeworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCI/Pz9cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gJWRcbiIsCisJCQkJbXBjX2RlZmF1bHRfdHlwZSk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQljYXNlIDU6CisJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiSVNBICAgIiwgNik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDY6CisJCWNhc2UgMzoKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJFSVNBICAiLCA2KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCWNhc2UgNzoKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJNQ0EgICAiLCA2KTsKKwl9CisJTVBfYnVzX2luZm8oJmJ1cyk7CisJaWYgKG1wY19kZWZhdWx0X3R5cGUgPiA0KSB7CisJCWJ1cy5tcGNfYnVzaWQgPSAxOworCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiUENJICAgIiwgNik7CisJCU1QX2J1c19pbmZvKCZidXMpOworCX0KKworCWlvYXBpYy5tcGNfdHlwZSA9IE1QX0lPQVBJQzsKKwlpb2FwaWMubXBjX2FwaWNpZCA9IDI7CisJaW9hcGljLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlpb2FwaWMubXBjX2ZsYWdzID0gTVBDX0FQSUNfVVNBQkxFOworCWlvYXBpYy5tcGNfYXBpY2FkZHIgPSAweEZFQzAwMDAwOworCU1QX2lvYXBpY19pbmZvKCZpb2FwaWMpOworCisJLyoKKwkgKiBXZSBzZXQgdXAgbW9zdCBvZiB0aGUgbG93IDE2IElPLUFQSUMgcGlucyBhY2NvcmRpbmcgdG8gTVBTIHJ1bGVzLgorCSAqLworCWNvbnN0cnVjdF9kZWZhdWx0X2lvaXJxX21wdGFibGUobXBjX2RlZmF1bHRfdHlwZSk7CisKKwlsaW50c3JjLm1wY190eXBlID0gTVBfTElOVFNSQzsKKwlsaW50c3JjLm1wY19pcnFmbGFnID0gMDsJCS8qIGNvbmZvcm1pbmcgKi8KKwlsaW50c3JjLm1wY19zcmNidXNpZCA9IDA7CisJbGludHNyYy5tcGNfc3JjYnVzaXJxID0gMDsKKwlsaW50c3JjLm1wY19kZXN0YXBpYyA9IE1QX0FQSUNfQUxMOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbGludHNyYy5tcGNfaXJxdHlwZSA9IGxpbnR0eXBlc1tpXTsKKwkJbGludHNyYy5tcGNfZGVzdGFwaWNsaW50ID0gaTsKKwkJTVBfbGludHNyY19pbmZvKCZsaW50c3JjKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZl9mb3VuZDsKKworLyoKKyAqIFNjYW4gdGhlIG1lbW9yeSBibG9ja3MgZm9yIGFuIFNNUCBjb25maWd1cmF0aW9uIGJsb2NrLgorICovCit2b2lkIF9faW5pdCBnZXRfc21wX2NvbmZpZyAodm9pZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZiA9IG1wZl9mb3VuZDsKKworCS8qCisJICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAorCSAqIGVudW1lcmF0ZS9jb25maWd1cmUgcHJvY2Vzc29ycyAoQ09ORklHX0FDUElfQk9PVCkuICBOb3RlIHRoYXQgCisJICogQUNQSSBzdXBwb3J0cyBib3RoIGxvZ2ljYWwgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSBhbmQgcGh5c2ljYWwgCisJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCisJICovCisJaWYgKGFjcGlfbGFwaWMgJiYgYWNwaV9pb2FwaWMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChhY3BpX2xhcGljKQorCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBBQ1BJIGZvciBwcm9jZXNzb3IgKExBUElDKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gIkludGVsIE11bHRpUHJvY2Vzc29yIFNwZWNpZmljYXRpb24gdjEuJWRcbiIsIG1wZi0+bXBmX3NwZWNpZmljYXRpb24pOworCWlmIChtcGYtPm1wZl9mZWF0dXJlMiAmICgxPDw3KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIgICAgSU1DUiBhbmQgUElDIGNvbXBhdGliaWxpdHkgbW9kZS5cbiIpOworCQlwaWNfbW9kZSA9IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgIFZpcnR1YWwgV2lyZSBjb21wYXRpYmlsaXR5IG1vZGUuXG4iKTsKKwkJcGljX21vZGUgPSAwOworCX0KKworCS8qCisJICogTm93IHNlZSBpZiB3ZSBuZWVkIHRvIHJlYWQgZnVydGhlci4KKwkgKi8KKwlpZiAobXBmLT5tcGZfZmVhdHVyZTEgIT0gMCkgeworCisJCXByaW50ayhLRVJOX0lORk8gIkRlZmF1bHQgTVAgY29uZmlndXJhdGlvbiAjJWRcbiIsIG1wZi0+bXBmX2ZlYXR1cmUxKTsKKwkJY29uc3RydWN0X2RlZmF1bHRfSVNBX21wdGFibGUobXBmLT5tcGZfZmVhdHVyZTEpOworCisJfSBlbHNlIGlmIChtcGYtPm1wZl9waHlzcHRyKSB7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgcGh5c2ljYWwgaGFyZHdhcmUgdGFibGUuICBBbnl0aGluZyBoZXJlIHdpbGwKKwkJICogb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgorCQkgKi8KKwkJaWYgKCFzbXBfcmVhZF9tcGMoKHZvaWQgKiltcGYtPm1wZl9waHlzcHRyKSkgeworCQkJc21wX2ZvdW5kX2NvbmZpZyA9IDA7CisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBNUCB0YWJsZSBlcnJvcnMgZGV0ZWN0ZWQhLi4uXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiLi4uIGRpc2FibGluZyBTTVAgc3VwcG9ydC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgbm8gZXhwbGljaXQgTVAgSVJRIGVudHJpZXMsIHRoZW4gd2UgYXJlCisJCSAqIGJyb2tlbi4gIFdlIHNldCB1cCBtb3N0IG9mIHRoZSBsb3cgMTYgSU8tQVBJQyBwaW5zIHRvCisJCSAqIElTQSBkZWZhdWx0cyBhbmQgaG9wZSBpdCB3aWxsIHdvcmsuCisJCSAqLworCQlpZiAoIW1wX2lycV9lbnRyaWVzKSB7CisJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgYnVzOworCisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBubyBleHBsaWNpdCBJUlEgZW50cmllcywgdXNpbmcgZGVmYXVsdCBtcHRhYmxlLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCisJCQlidXMubXBjX3R5cGUgPSBNUF9CVVM7CisJCQlidXMubXBjX2J1c2lkID0gMDsKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJJU0EgICAiLCA2KTsKKwkJCU1QX2J1c19pbmZvKCZidXMpOworCisJCQljb25zdHJ1Y3RfZGVmYXVsdF9pb2lycV9tcHRhYmxlKDApOworCQl9CisKKwl9IGVsc2UKKwkJQlVHKCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3JzOiAlZFxuIiwgbnVtX3Byb2Nlc3NvcnMpOworCS8qCisJICogT25seSB1c2UgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gZm91bmQuCisJICovCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9zY2FuX2NvbmZpZyAodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nICpicCA9IHBoeXNfdG9fdmlydChiYXNlKTsKKwlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZjsKKworCURwcmludGsoIlNjYW4gU01QIGZyb20gJXAgZm9yICVsZCBieXRlcy5cbiIsIGJwLGxlbmd0aCk7CisJaWYgKHNpemVvZigqbXBmKSAhPSAxNikKKwkJcHJpbnRrKCJFcnJvcjogTVBGIHNpemVcbiIpOworCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJbXBmID0gKHN0cnVjdCBpbnRlbF9tcF9mbG9hdGluZyAqKWJwOworCQlpZiAoKCpicCA9PSBTTVBfTUFHSUNfSURFTlQpICYmCisJCQkobXBmLT5tcGZfbGVuZ3RoID09IDEpICYmCisJCQkhbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopYnAsIDE2KSAmJgorCQkJKChtcGYtPm1wZl9zcGVjaWZpY2F0aW9uID09IDEpCisJCQkJfHwgKG1wZi0+bXBmX3NwZWNpZmljYXRpb24gPT0gNCkpICkgeworCisJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKKwkJCXByaW50ayhLRVJOX0lORk8gImZvdW5kIFNNUCBNUC10YWJsZSBhdCAlMDhseFxuIiwKKwkJCQkJCXZpcnRfdG9fcGh5cyhtcGYpKTsKKwkJCXJlc2VydmVfYm9vdG1lbSh2aXJ0X3RvX3BoeXMobXBmKSwgUEFHRV9TSVpFKTsKKwkJCWlmIChtcGYtPm1wZl9waHlzcHRyKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW5ub3QgYWNjZXNzIHRvIE1QQyB0YWJsZSB0byBjb21wdXRlCisJCQkJICogdGFibGUgc2l6ZSB5ZXQsIGFzIG9ubHkgZmV3IG1lZ2FieXRlcyBmcm9tCisJCQkJICogdGhlIGJvdHRvbSBpcyBtYXBwZWQgbm93LgorCQkJCSAqIFBDLTk4MDAncyBNUEMgdGFibGUgcGxhY2VzIG9uIHRoZSB2ZXJ5IGxhc3QKKwkJCQkgKiBvZiBwaHlzaWNhbCBtZW1vcnk7IHNvIHRoYXQgc2ltcGx5IHJlc2VydmluZworCQkJCSAqIFBBR0VfU0laRSBmcm9tIG1wZy0+bXBmX3BoeXNwdHIgeWllbGRzIEJVRygpCisJCQkJICogaW4gcmVzZXJ2ZV9ib290bWVtLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFBBR0VfU0laRTsKKwkJCQl1bnNpZ25lZCBsb25nIGVuZCA9IG1heF9sb3dfcGZuICogUEFHRV9TSVpFOworCQkJCWlmIChtcGYtPm1wZl9waHlzcHRyICsgc2l6ZSA+IGVuZCkKKwkJCQkJc2l6ZSA9IGVuZCAtIG1wZi0+bXBmX3BoeXNwdHI7CisJCQkJcmVzZXJ2ZV9ib290bWVtKG1wZi0+bXBmX3BoeXNwdHIsIHNpemUpOworCQkJfQorCisJCQltcGZfZm91bmQgPSBtcGY7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicCArPSA0OworCQlsZW5ndGggLT0gMTY7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBmaW5kX3NtcF9jb25maWcgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisKKwkvKgorCSAqIEZJWE1FOiBMaW51eCBhc3N1bWVzIHlvdSBoYXZlIDY0MEsgb2YgYmFzZSByYW0uLgorCSAqIHRoaXMgY29udGludWVzIHRoZSBlcnJvci4uLgorCSAqCisJICogMSkgU2NhbiB0aGUgYm90dG9tIDFLIGZvciBhIHNpZ25hdHVyZQorCSAqIDIpIFNjYW4gdGhlIHRvcCAxSyBvZiBiYXNlIFJBTQorCSAqIDMpIFNjYW4gdGhlIDY0SyBvZiBiaW9zCisJICovCisJaWYgKHNtcF9zY2FuX2NvbmZpZygweDAsMHg0MDApIHx8CisJCXNtcF9zY2FuX2NvbmZpZyg2MzkqMHg0MDAsMHg0MDApIHx8CisJCQlzbXBfc2Nhbl9jb25maWcoMHhGMDAwMCwweDEwMDAwKSkKKwkJcmV0dXJuOworCS8qCisJICogSWYgaXQgaXMgYW4gU01QIG1hY2hpbmUgd2Ugc2hvdWxkIGtub3cgbm93LCB1bmxlc3MgdGhlCisJICogY29uZmlndXJhdGlvbiBpcyBpbiBhbiBFSVNBL01DQSBidXMgbWFjaGluZSB3aXRoIGFuCisJICogZXh0ZW5kZWQgYmlvcyBkYXRhIGFyZWEuCisJICoKKwkgKiB0aGVyZSBpcyBhIHJlYWwtbW9kZSBzZWdtZW50ZWQgcG9pbnRlciBwb2ludGluZyB0byB0aGUKKwkgKiA0SyBFQkRBIGFyZWEgYXQgMHg0MEUsIGNhbGN1bGF0ZSBhbmQgc2NhbiBpdCBoZXJlLgorCSAqCisJICogTk9URSEgVGhlcmUgYXJlIExpbnV4IGxvYWRlcnMgdGhhdCB3aWxsIGNvcnJ1cHQgdGhlIEVCREEKKwkgKiBhcmVhLCBhbmQgYXMgc3VjaCB0aGlzIGtpbmQgb2YgU01QIGNvbmZpZyBtYXkgYmUgbGVzcworCSAqIHRydXN0d29ydGh5LCBzaW1wbHkgYmVjYXVzZSB0aGUgU01QIHRhYmxlIG1heSBoYXZlIGJlZW4KKwkgKiBzdG9tcGVkIG9uIGR1cmluZyBlYXJseSBib290LiBUaGVzZSBsb2FkZXJzIGFyZSBidWdneSBhbmQKKwkgKiBzaG91bGQgYmUgZml4ZWQuCisJICoKKwkgKiBNUDEuNCBTUEVDIHN0YXRlcyB0byBvbmx5IHNjYW4gZmlyc3QgMUsgb2YgNEsgRUJEQS4KKwkgKi8KKworCWFkZHJlc3MgPSBnZXRfYmlvc19lYmRhKCk7CisJaWYgKGFkZHJlc3MpCisJCXNtcF9zY2FuX2NvbmZpZyhhZGRyZXNzLCAweDQwMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBNUCBDb25maWd1cmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FDUElfQk9PVAorCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzICgKKwl1NjQJCQlhZGRyZXNzKQoreworCW1wX2xhcGljX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcmVzczsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBtcF9sYXBpY19hZGRyKTsKKworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQorCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCisJRHByaW50aygiQm9vdCBDUFUgPSAlZFxuIiwgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKK30KKworCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9sYXBpYyAoCisJdTgJCQlpZCwgCisJdTgJCQllbmFibGVkKQoreworCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciBwcm9jZXNzb3I7CisJaW50CQkJYm9vdF9jcHUgPSAwOworCQorCWlmIChNQVhfQVBJQ1MgLSBpZCA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3NvciAjJWQgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCWlkLCBNQVhfQVBJQ1MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkKKwkJYm9vdF9jcHUgPSAxOworCisJcHJvY2Vzc29yLm1wY190eXBlID0gTVBfUFJPQ0VTU09SOworCXByb2Nlc3Nvci5tcGNfYXBpY2lkID0gaWQ7CisJcHJvY2Vzc29yLm1wY19hcGljdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSAoZW5hYmxlZCA/IENQVV9FTkFCTEVEIDogMCk7CisJcHJvY2Vzc29yLm1wY19jcHVmbGFnIHw9IChib290X2NwdSA/IENQVV9CT09UUFJPQ0VTU09SIDogMCk7CisJcHJvY2Vzc29yLm1wY19jcHVmZWF0dXJlID0gKGJvb3RfY3B1X2RhdGEueDg2IDw8IDgpIHwgCisJCShib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PCA0KSB8IGJvb3RfY3B1X2RhdGEueDg2X21hc2s7CisJcHJvY2Vzc29yLm1wY19mZWF0dXJlZmxhZyA9IGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbMF07CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFswXSA9IDA7CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFsxXSA9IDA7CisKKwlNUF9wcm9jZXNzb3JfaW5mbygmcHJvY2Vzc29yKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikgfHwgZGVmaW5lZChDT05GSUdfQUNQSV9CT09UKSkKKworI2RlZmluZSBNUF9JU0FfQlVTCQkwCisjZGVmaW5lIE1QX01BWF9JT0FQSUNfUElOCTEyNworCitzdGF0aWMgc3RydWN0IG1wX2lvYXBpY19yb3V0aW5nIHsKKwlpbnQJCQlhcGljX2lkOworCWludAkJCWdzaV9iYXNlOworCWludAkJCWdzaV9lbmQ7CisJdTMyCQkJcGluX3Byb2dyYW1tZWRbNF07Cit9IG1wX2lvYXBpY19yb3V0aW5nW01BWF9JT19BUElDU107CisKKworc3RhdGljIGludCBtcF9maW5kX2lvYXBpYyAoCisJaW50CQkJZ3NpKQoreworCWludAkJCWkgPSAwOworCisJLyogRmluZCB0aGUgSU9BUElDIHRoYXQgbWFuYWdlcyB0aGlzIEdTSS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCWlmICgoZ3NpID49IG1wX2lvYXBpY19yb3V0aW5nW2ldLmdzaV9iYXNlKQorCQkJJiYgKGdzaSA8PSBtcF9pb2FwaWNfcm91dGluZ1tpXS5nc2lfZW5kKSkKKwkJCXJldHVybiBpOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IFVuYWJsZSB0byBsb2NhdGUgSU9BUElDIGZvciBHU0kgJWRcbiIsIGdzaSk7CisKKwlyZXR1cm4gLTE7Cit9CisJCisKK3ZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2lvYXBpYyAoCisJdTgJCQlpZCwgCisJdTMyCQkJYWRkcmVzcywKKwl1MzIJCQlnc2lfYmFzZSkKK3sKKwlpbnQJCQlpZHggPSAwOworCisJaWYgKG5yX2lvYXBpY3MgPj0gTUFYX0lPX0FQSUNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IE1heCAjIG9mIEkvTyBBUElDcyAoJWQpIGV4Y2VlZGVkICIKKwkJCSIoZm91bmQgJWQpXG4iLCBNQVhfSU9fQVBJQ1MsIG5yX2lvYXBpY3MpOworCQlwYW5pYygiUmVjb21waWxlIGtlcm5lbCB3aXRoIGJpZ2dlciBNQVhfSU9fQVBJQ1MhXG4iKTsKKwl9CisJaWYgKCFhZGRyZXNzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0FSTklORzogQm9ndXMgKHplcm8pIEkvTyBBUElDIGFkZHJlc3MiCisJCQkiIGZvdW5kIGluIE1BRFQgdGFibGUsIHNraXBwaW5nIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZHggPSBucl9pb2FwaWNzKys7CisKKwltcF9pb2FwaWNzW2lkeF0ubXBjX3R5cGUgPSBNUF9JT0FQSUM7CisJbXBfaW9hcGljc1tpZHhdLm1wY19mbGFncyA9IE1QQ19BUElDX1VTQUJMRTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyID0gYWRkcmVzczsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfSU9fQVBJQ19CQVNFXzAgKyBpZHgsIGFkZHJlc3MpOworCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY2lkID0gaW9fYXBpY19nZXRfdW5pcXVlX2lkKGlkeCwgaWQpOworCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciA9IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaWR4KTsKKwkKKwkvKiAKKwkgKiBCdWlsZCBiYXNpYyBHU0kgbG9va3VwIHRhYmxlIHRvIGZhY2lsaXRhdGUgZ3NpLT5pb19hcGljIGxvb2t1cHMKKwkgKiBhbmQgdG8gcHJldmVudCByZXByb2dyYW1taW5nIG9mIElPQVBJQyBwaW5zIChQQ0kgR1NJcykuCisJICovCisJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5hcGljX2lkID0gbXBfaW9hcGljc1tpZHhdLm1wY19hcGljaWQ7CisJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfYmFzZSA9IGdzaV9iYXNlOworCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uZ3NpX2VuZCA9IGdzaV9iYXNlICsgCisJCWlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMoaWR4KTsKKworCXByaW50aygiSU9BUElDWyVkXTogYXBpY19pZCAlZCwgdmVyc2lvbiAlZCwgYWRkcmVzcyAweCVseCwgIgorCQkiR1NJICVkLSVkXG4iLCBpZHgsIG1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY2lkLCAKKwkJbXBfaW9hcGljc1tpZHhdLm1wY19hcGljdmVyLCBtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyLAorCQltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9iYXNlLAorCQltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9lbmQpOworCisJcmV0dXJuOworfQorCisKK3ZvaWQgX19pbml0IG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKAorCXU4CQkJYnVzX2lycSwKKwl1OAkJCXBvbGFyaXR5LCAKKwl1OAkJCXRyaWdnZXIsIAorCXUzMgkJCWdzaSkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOworCWludAkJCWlvYXBpYyA9IC0xOworCWludAkJCXBpbiA9IC0xOworCisJLyogCisJICogQ29udmVydCAnZ3NpJyB0byAnaW9hcGljLnBpbicuCisJICovCisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKKwlpZiAoaW9hcGljIDwgMCkKKwkJcmV0dXJuOworCXBpbiA9IGdzaSAtIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10uZ3NpX2Jhc2U7CisKKwkvKgorCSAqIFRCRDogVGhpcyBjaGVjayBpcyBmb3IgZmF1bHR5IHRpbWVyIGVudHJpZXMsIHdoZXJlIHRoZSBvdmVycmlkZQorCSAqICAgICAgZXJyb25lb3VzbHkgc2V0cyB0aGUgdHJpZ2dlciB0byBsZXZlbCwgcmVzdWx0aW5nIGluIGEgSFVHRSAKKwkgKiAgICAgIGluY3JlYXNlIG9mIHRpbWVyIGludGVycnVwdHMhCisJICovCisJaWYgKChidXNfaXJxID09IDApICYmICh0cmlnZ2VyID09IDMpKQorCQl0cmlnZ2VyID0gMTsKKworCWludHNyYy5tcGNfdHlwZSA9IE1QX0lOVFNSQzsKKwlpbnRzcmMubXBjX2lycXR5cGUgPSBtcF9JTlQ7CisJaW50c3JjLm1wY19pcnFmbGFnID0gKHRyaWdnZXIgPDwgMikgfCBwb2xhcml0eTsKKwlpbnRzcmMubXBjX3NyY2J1cyA9IE1QX0lTQV9CVVM7CisJaW50c3JjLm1wY19zcmNidXNpcnEgPSBidXNfaXJxOwkJCQkgICAgICAgLyogSVJRICovCisJaW50c3JjLm1wY19kc3RhcGljID0gbXBfaW9hcGljc1tpb2FwaWNdLm1wY19hcGljaWQ7CSAgIC8qIEFQSUMgSUQgKi8KKwlpbnRzcmMubXBjX2RzdGlycSA9IHBpbjsJCQkJICAgIC8qIElOVElOIyAqLworCisJRHByaW50aygiSW50OiB0eXBlICVkLCBwb2wgJWQsIHRyaWcgJWQsIGJ1cyAlZCwgaXJxICVkLCAlZC0lZFxuIiwKKwkJaW50c3JjLm1wY19pcnF0eXBlLCBpbnRzcmMubXBjX2lycWZsYWcgJiAzLCAKKwkJKGludHNyYy5tcGNfaXJxZmxhZyA+PiAyKSAmIDMsIGludHNyYy5tcGNfc3JjYnVzLCAKKwkJaW50c3JjLm1wY19zcmNidXNpcnEsIGludHNyYy5tcGNfZHN0YXBpYywgaW50c3JjLm1wY19kc3RpcnEpOworCisJbXBfaXJxc1ttcF9pcnFfZW50cmllc10gPSBpbnRzcmM7CisJaWYgKCsrbXBfaXJxX2VudHJpZXMgPT0gTUFYX0lSUV9TT1VSQ0VTKQorCQlwYW5pYygiTWF4ICMgb2YgaXJxIHNvdXJjZXMgZXhjZWVkZWQhXG4iKTsKKworCXJldHVybjsKK30KKworaW50IGVzNzAwMF9wbGF0OworCit2b2lkIF9faW5pdCBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcyAodm9pZCkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOworCWludAkJCWkgPSAwOworCWludAkJCWlvYXBpYyA9IC0xOworCisJLyogCisJICogRmFicmljYXRlIHRoZSBsZWdhY3kgSVNBIGJ1cyAoYnVzICMzMSkuCisJICovCisJbXBfYnVzX2lkX3RvX3R5cGVbTVBfSVNBX0JVU10gPSBNUF9CVVNfSVNBOworCURwcmludGsoIkJ1cyAjJWQgaXMgSVNBXG4iLCBNUF9JU0FfQlVTKTsKKworCS8qCisJICogT2xkZXIgZ2VuZXJhdGlvbnMgb2YgRVM3MDAwIGhhdmUgbm8gbGVnYWN5IGlkZW50aXR5IG1hcHBpbmdzCisJICovCisJaWYgKGVzNzAwMF9wbGF0ID09IDEpCisJCXJldHVybjsKKworCS8qIAorCSAqIExvY2F0ZSB0aGUgSU9BUElDIHRoYXQgbWFuYWdlcyB0aGUgSVNBIElSUXMgKDAtMTUpLiAKKwkgKi8KKwlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYygwKTsKKwlpZiAoaW9hcGljIDwgMCkKKwkJcmV0dXJuOworCisJaW50c3JjLm1wY190eXBlID0gTVBfSU5UU1JDOworCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CQkJCQkvKiBDb25mb3JtaW5nICovCisJaW50c3JjLm1wY19zcmNidXMgPSBNUF9JU0FfQlVTOworCWludHNyYy5tcGNfZHN0YXBpYyA9IG1wX2lvYXBpY3NbaW9hcGljXS5tcGNfYXBpY2lkOworCisJLyogCisJICogVXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUlFzIDAtMTUuICBVbmxlc3MKKwkgKiBvdmVycmlkZW4gYnkgKE1BRFQpIGludGVycnVwdCBzb3VyY2Ugb3ZlcnJpZGUgZW50cmllcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpbnQgaWR4OworCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbXBfaXJxX2VudHJpZXM7IGlkeCsrKSB7CisJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKmlycSA9IG1wX2lycXMgKyBpZHg7CisKKwkJCS8qIERvIHdlIGFscmVhZHkgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoaXMgSVNBIElSUT8gKi8KKwkJCWlmIChpcnEtPm1wY19zcmNidXMgPT0gTVBfSVNBX0JVUyAmJiBpcnEtPm1wY19zcmNidXNpcnEgPT0gaSkKKwkJCQlicmVhazsKKworCQkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIGEgbWFwcGluZyBmb3IgdGhpcyBJT0FQSUMgcGluICovCisJCQlpZiAoKGlycS0+bXBjX2RzdGFwaWMgPT0gaW50c3JjLm1wY19kc3RhcGljKSAmJgorCQkJCShpcnEtPm1wY19kc3RpcnEgPT0gaSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWR4ICE9IG1wX2lycV9lbnRyaWVzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogSVJRJWQgdXNlZCBieSBvdmVycmlkZS5cbiIsIGkpOworCQkJY29udGludWU7CQkJLyogSVJRIGFscmVhZHkgdXNlZCAqLworCQl9CisKKwkJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfSU5UOworCQlpbnRzcmMubXBjX3NyY2J1c2lycSA9IGk7CQkgICAvKiBJZGVudGl0eSBtYXBwZWQgKi8KKwkJaW50c3JjLm1wY19kc3RpcnEgPSBpOworCisJCURwcmludGsoIkludDogdHlwZSAlZCwgcG9sICVkLCB0cmlnICVkLCBidXMgJWQsIGlycSAlZCwgIgorCQkJIiVkLSVkXG4iLCBpbnRzcmMubXBjX2lycXR5cGUsIGludHNyYy5tcGNfaXJxZmxhZyAmIDMsIAorCQkJKGludHNyYy5tcGNfaXJxZmxhZyA+PiAyKSAmIDMsIGludHNyYy5tcGNfc3JjYnVzLCAKKwkJCWludHNyYy5tcGNfc3JjYnVzaXJxLCBpbnRzcmMubXBjX2RzdGFwaWMsIAorCQkJaW50c3JjLm1wY19kc3RpcnEpOworCisJCW1wX2lycXNbbXBfaXJxX2VudHJpZXNdID0gaW50c3JjOworCQlpZiAoKyttcF9pcnFfZW50cmllcyA9PSBNQVhfSVJRX1NPVVJDRVMpCisJCQlwYW5pYygiTWF4ICMgb2YgaXJxIHNvdXJjZXMgZXhjZWVkZWQhXG4iKTsKKwl9Cit9CisKK2ludCBtcF9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoreworCWludAkJCWlvYXBpYyA9IC0xOworCWludAkJCWlvYXBpY19waW4gPSAwOworCWludAkJCWlkeCwgYml0ID0gMDsKKworI2lmZGVmIENPTkZJR19BQ1BJX0JVUworCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCisJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKKwkJcmV0dXJuIGdzaTsKKyNlbmRpZgorCisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKKwlpZiAoaW9hcGljIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBJT0FQSUMgZm9yIEdTSSAldVxuIiwgZ3NpKTsKKwkJcmV0dXJuIGdzaTsKKwl9CisKKwlpb2FwaWNfcGluID0gZ3NpIC0gbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5nc2lfYmFzZTsKKworCWlmIChpb2FwaWNfcmVudW1iZXJfaXJxKQorCQlnc2kgPSBpb2FwaWNfcmVudW1iZXJfaXJxKGlvYXBpYywgZ3NpKTsKKworCS8qIAorCSAqIEF2b2lkIHBpbiByZXByb2dyYW1taW5nLiAgUFJUcyB0eXBpY2FsbHkgaW5jbHVkZSBlbnRyaWVzICAKKwkgKiB3aXRoIHJlZHVuZGFudCBwaW4tPmdzaSBtYXBwaW5ncyAoYnV0IHVuaXF1ZSBQQ0kgZGV2aWNlcyk7CisJICogd2Ugb25seSBwcm9ncmFtIHRoZSBJT0FQSUMgb24gdGhlIGZpcnN0LgorCSAqLworCWJpdCA9IGlvYXBpY19waW4gJSAzMjsKKwlpZHggPSAoaW9hcGljX3BpbiA8IDMyKSA/IDAgOiAoaW9hcGljX3BpbiAvIDMyKTsKKwlpZiAoaWR4ID4gMykgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgcmVmZXJlbmNlIHRvIElPQVBJQyBwaW4gIgorCQkJIiVkLSVkXG4iLCBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmFwaWNfaWQsIAorCQkJaW9hcGljX3Bpbik7CisJCXJldHVybiBnc2k7CisJfQorCWlmICgoMTw8Yml0KSAmIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWRbaWR4XSkgeworCQlEcHJpbnRrKEtFUk5fREVCVUcgIlBpbiAlZC0lZCBhbHJlYWR5IHByb2dyYW1tZWRcbiIsCisJCQltcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmFwaWNfaWQsIGlvYXBpY19waW4pOworCQlyZXR1cm4gZ3NpOworCX0KKworCW1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWRbaWR4XSB8PSAoMTw8Yml0KTsKKworCWlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKGlvYXBpYywgaW9hcGljX3BpbiwgZ3NpLAorCQkgICAgZWRnZV9sZXZlbCA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEsCisJCSAgICBhY3RpdmVfaGlnaF9sb3cgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDAgOiAxKTsKKwlyZXR1cm4gZ3NpOworfQorCisjZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMgJiYgKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSIHx8IENPTkZJR19BQ1BJX0JPT1QpKi8KKyNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDAwIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UgTUEgMDIxMzksCisgKiAgIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqICAgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1zci5jCisgKgorICogeDg2IE1TUiBhY2Nlc3MgZGV2aWNlCisgKgorICogVGhpcyBkZXZpY2UgaXMgYWNjZXNzZWQgYnkgbHNlZWsoKSB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgbnVtYmVyCisgKiBhbmQgdGhlbiByZWFkL3dyaXRlIGluIGNodW5rcyBvZiA4IGJ5dGVzLiAgQSBsYXJnZXIgc2l6ZSBtZWFucyBtdWx0aXBsZQorICogcmVhZHMgb3Igd3JpdGVzIG9mIHRoZSBzYW1lIHJlZ2lzdGVyLgorICoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgL2Rldi9jcHUvJWQvbXNyIHdoZXJlICVkIGlzIHRoZSBtaW5vciBudW1iZXIsIGFuZCBvbgorICogYW4gU01QIGJveCB3aWxsIGRpcmVjdCB0aGUgYWNjZXNzIHRvIENQVSAlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbXNyX2NsYXNzOworCisvKiBOb3RlOiAiZXJyIiBpcyBoYW5kbGVkIGluIGEgZnVubnkgd2F5IGJlbG93LiAgT3RoZXJ3aXNlIG9uZSB2ZXJzaW9uCisgICBvZiBnY2Mgb3IgYW5vdGhlciBicmVha3MuICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHdybXNyX2Vpbyh1MzIgcmVnLCB1MzIgZWF4LCB1MzIgZWR4KQoreworCWludCBlcnI7CisKKwlhc20gdm9sYXRpbGUgKCIxOgl3cm1zclxuIgorCQkgICAgICAiMjpcbiIKKwkJICAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkJICAgICAgIjM6CW1vdmwgJTQsJTBcbiIKKwkJICAgICAgIglqbXAgMmJcbiIKKwkJICAgICAgIi5wcmV2aW91c1xuIgorCQkgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAiCS5hbGlnbiA0XG4iICIJLmxvbmcgMWIsM2JcbiIgIi5wcmV2aW91cyI6Ij0mYkRTIiAoZXJyKQorCQkgICAgICA6ImEiKGVheCksICJkIihlZHgpLCAiYyIocmVnKSwgImkiKC1FSU8pLCAiMCIoMCkpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmRtc3JfZWlvKHUzMiByZWcsIHUzMiAqZWF4LCB1MzIgKmVkeCkKK3sKKwlpbnQgZXJyOworCisJYXNtIHZvbGF0aWxlICgiMToJcmRtc3JcbiIKKwkJICAgICAgIjI6XG4iCisJCSAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSAgICAgICIzOgltb3ZsICU0LCUwXG4iCisJCSAgICAgICIJam1wIDJiXG4iCisJCSAgICAgICIucHJldmlvdXNcbiIKKwkJICAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJICAgICAgIgkuYWxpZ24gNFxuIgorCQkgICAgICAiCS5sb25nIDFiLDNiXG4iCisJCSAgICAgICIucHJldmlvdXMiOiI9JmJEUyIgKGVyciksICI9YSIoKmVheCksICI9ZCIoKmVkeCkKKwkJICAgICAgOiJjIihyZWcpLCAiaSIoLUVJTyksICIwIigwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorCitzdHJ1Y3QgbXNyX2NvbW1hbmQgeworCWludCBjcHU7CisJaW50IGVycjsKKwl1MzIgcmVnOworCXUzMiBkYXRhWzJdOworfTsKKworc3RhdGljIHZvaWQgbXNyX3NtcF93cm1zcih2b2lkICpjbWRfYmxvY2spCit7CisJc3RydWN0IG1zcl9jb21tYW5kICpjbWQgPSAoc3RydWN0IG1zcl9jb21tYW5kICopY21kX2Jsb2NrOworCisJaWYgKGNtZC0+Y3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY21kLT5lcnIgPSB3cm1zcl9laW8oY21kLT5yZWcsIGNtZC0+ZGF0YVswXSwgY21kLT5kYXRhWzFdKTsKK30KKworc3RhdGljIHZvaWQgbXNyX3NtcF9yZG1zcih2b2lkICpjbWRfYmxvY2spCit7CisJc3RydWN0IG1zcl9jb21tYW5kICpjbWQgPSAoc3RydWN0IG1zcl9jb21tYW5kICopY21kX2Jsb2NrOworCisJaWYgKGNtZC0+Y3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY21kLT5lcnIgPSByZG1zcl9laW8oY21kLT5yZWcsICZjbWQtPmRhdGFbMF0sICZjbWQtPmRhdGFbMV0pOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb193cm1zcihpbnQgY3B1LCB1MzIgcmVnLCB1MzIgZWF4LCB1MzIgZWR4KQoreworCXN0cnVjdCBtc3JfY29tbWFuZCBjbWQ7CisJaW50IHJldDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCXJldCA9IHdybXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKKwl9IGVsc2UgeworCQljbWQuY3B1ID0gY3B1OworCQljbWQucmVnID0gcmVnOworCQljbWQuZGF0YVswXSA9IGVheDsKKwkJY21kLmRhdGFbMV0gPSBlZHg7CisKKwkJc21wX2NhbGxfZnVuY3Rpb24obXNyX3NtcF93cm1zciwgJmNtZCwgMSwgMSk7CisJCXJldCA9IGNtZC5lcnI7CisJfQorCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fcmRtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyICogZWF4LCB1MzIgKiBlZHgpCit7CisJc3RydWN0IG1zcl9jb21tYW5kIGNtZDsKKwlpbnQgcmV0OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJcmV0ID0gcmRtc3JfZWlvKHJlZywgZWF4LCBlZHgpOworCX0gZWxzZSB7CisJCWNtZC5jcHUgPSBjcHU7CisJCWNtZC5yZWcgPSByZWc7CisKKwkJc21wX2NhbGxfZnVuY3Rpb24obXNyX3NtcF9yZG1zciwgJmNtZCwgMSwgMSk7CisKKwkJKmVheCA9IGNtZC5kYXRhWzBdOworCQkqZWR4ID0gY21kLmRhdGFbMV07CisKKwkJcmV0ID0gY21kLmVycjsKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZQkJCQkvKiAhIENPTkZJR19TTVAgKi8KKworc3RhdGljIGlubGluZSBpbnQgZG9fd3Jtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyIGVheCwgdTMyIGVkeCkKK3sKKwlyZXR1cm4gd3Jtc3JfZWlvKHJlZywgZWF4LCBlZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb19yZG1zcihpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKmVheCwgdTMyICplZHgpCit7CisJcmV0dXJuIHJkbXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKK30KKworI2VuZGlmCQkJCS8qICEgQ09ORklHX1NNUCAqLworCitzdGF0aWMgbG9mZl90IG1zcl9zZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKwlsb2ZmX3QgcmV0ID0gLUVJTlZBTDsKKworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChvcmlnKSB7CisJY2FzZSAwOgorCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZmlsZS0+Zl9wb3MgKz0gb2Zmc2V0OworCQlyZXQgPSBmaWxlLT5mX3BvczsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1MzIgX191c2VyICp0bXAgPSAodTMyIF9fdXNlciAqKSBidWY7CisJdTMyIGRhdGFbMl07CisJc2l6ZV90IHJ2OworCXUzMiByZWcgPSAqcHBvczsKKwlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZXJyOworCisJaWYgKGNvdW50ICUgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIEludmFsaWQgY2h1bmsgc2l6ZSAqLworCisJZm9yIChydiA9IDA7IGNvdW50OyBjb3VudCAtPSA4KSB7CisJCWVyciA9IGRvX3JkbXNyKGNwdSwgcmVnLCAmZGF0YVswXSwgJmRhdGFbMV0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGNvcHlfdG9fdXNlcih0bXAsICZkYXRhLCA4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0bXAgKz0gMjsKKwl9CisKKwlyZXR1cm4gKChjaGFyIF9fdXNlciAqKXRtcCkgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljb25zdCB1MzIgX191c2VyICp0bXAgPSAoY29uc3QgdTMyIF9fdXNlciAqKWJ1ZjsKKwl1MzIgZGF0YVsyXTsKKwlzaXplX3QgcnY7CisJdTMyIHJlZyA9ICpwcG9zOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBlcnI7CisKKwlpZiAoY291bnQgJSA4KQorCQlyZXR1cm4gLUVJTlZBTDsJLyogSW52YWxpZCBjaHVuayBzaXplICovCisKKwlmb3IgKHJ2ID0gMDsgY291bnQ7IGNvdW50IC09IDgpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB0bXAsIDgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IGRvX3dybXNyKGNwdSwgcmVnLCBkYXRhWzBdLCBkYXRhWzFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXRtcCArPSAyOworCX0KKworCXJldHVybiAoKGNoYXIgX191c2VyICopdG1wKSAtIGJ1ZjsKK30KKworc3RhdGljIGludCBtc3Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmKGNwdV9kYXRhKVtjcHVdOworCisJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CS8qIE5vIHN1Y2ggQ1BVICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01TUikpCisJCXJldHVybiAtRUlPOwkvKiBNU1Igbm90IHN1cHBvcnRlZCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc3JfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbXNyX3NlZWssCisJLnJlYWQgPSBtc3JfcmVhZCwKKwkud3JpdGUgPSBtc3Jfd3JpdGUsCisJLm9wZW4gPSBtc3Jfb3BlbiwKK307CisKK3N0YXRpYyBpbnQgbXNyX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGludCBpKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2VycjsKKworCWNsYXNzX2VyciA9IGNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKG1zcl9jbGFzcywgTUtERVYoTVNSX01BSk9SLCBpKSwgTlVMTCwgIm1zciVkIixpKTsKKwlpZiAoSVNfRVJSKGNsYXNzX2VycikpIAorCQllcnIgPSBQVFJfRVJSKGNsYXNzX2Vycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXNyX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJbXNyX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RFQUQ6CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CQorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtc3JfY2xhc3NfY3B1X25vdGlmaWVyID0KK3sKKwkubm90aWZpZXJfY2FsbCA9IG1zcl9jbGFzc19jcHVfY2FsbGJhY2ssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc3JfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWkgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIiwgJm1zcl9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1zcjogdW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbXNyXG4iLAorCQkgICAgICAgTVNSX01BSk9SKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJbXNyX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm1zciIpOworCWlmIChJU19FUlIobXNyX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKG1zcl9jbGFzcyk7CisJCWdvdG8gb3V0X2NocmRldjsKKwl9CisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCWVyciA9IG1zcl9jbGFzc19zaW1wbGVfZGV2aWNlX2FkZChpKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJZ290byBvdXRfY2xhc3M7CisJfQorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbXNyX2NsYXNzX2NwdV9ub3RpZmllcik7CisKKwllcnIgPSAwOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJaSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShpKQorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihNU1JfTUFKT1IsIGkpKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShtc3JfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zcl9leGl0KHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobXNyX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CisJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm1zcl9jbGFzc19jcHVfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChtc3JfaW5pdCk7Cittb2R1bGVfZXhpdChtc3JfZXhpdCkKKworTU9EVUxFX0FVVEhPUigiSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIng4NiBnZW5lcmljIE1TUiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL2kzODYva2VybmVsL25taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjBjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0wLDAgKzEsNTcwIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9ubWkuYworICoKKyAqICBOTUkgd2F0Y2hkb2cgc3VwcG9ydCBvbiBBUElDIHN5c3RlbXMKKyAqCisgKiAgU3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiAgRml4ZXM6CisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBBTUQgSzcgc3VwcG9ydCBmb3IgbG9jYWwgQVBJQyBOTUkgd2F0Y2hkb2cuCisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQb3dlciBNYW5hZ2VtZW50IGZvciBsb2NhbCBBUElDIE5NSSB3YXRjaGRvZy4KKyAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBlbnRpdW0gNCBzdXBwb3J0IGZvciBsb2NhbCBBUElDIE5NSSB3YXRjaGRvZy4KKyAqICBQYXZlbCBNYWNoZWsgYW5kCisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQTSBjb252ZXJ0ZWQgdG8gZHJpdmVyIG1vZGVsLiBEaXNhYmxlL2VuYWJsZSBBUEkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgorCisjaW5jbHVkZSAibWFjaF90cmFwcy5oIgorCit1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX05PTkU7CitleHRlcm4gaW50IHVua25vd25fbm1pX3BhbmljOworc3RhdGljIHVuc2lnbmVkIGludCBubWlfaHogPSBIWjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX3BlcmZjdHJfbXNyOwkvKiB0aGUgTVNSIHRvIHJlc2V0IGluIE5NSSBoYW5kbGVyICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5taV9wNF9jY2NyX3ZhbDsKK2V4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyoKKyAqIGxhcGljX25taV9vd25lciB0cmFja3MgdGhlIG93bmVyc2hpcCBvZiB0aGUgbGFwaWMgTk1JIGhhcmR3YXJlOgorICogLSBpdCBtYXkgYmUgcmVzZXJ2ZWQgYnkgc29tZSBvdGhlciBkcml2ZXIsIG9yIG5vdAorICogLSB3aGVuIG5vdCByZXNlcnZlZCBieSBzb21lIG90aGVyIGRyaXZlciwgaXQgbWF5IGJlIHVzZWQgZm9yCisgKiAgIHRoZSBOTUkgd2F0Y2hkb2csIG9yIG5vdAorICoKKyAqIFRoaXMgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGZyb20gbm1pX2FjdGl2ZSBiZWNhdXNlIHRoZSBOTUkKKyAqIHdhdGNoZG9nIG1heSBhbHNvIGJlIGRyaXZlbiBmcm9tIHRoZSBJL08gQVBJQyB0aW1lci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhsYXBpY19ubWlfb3duZXJfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX25taV9vd25lcjsKKyNkZWZpbmUgTEFQSUNfTk1JX1dBVENIRE9HCSgxPDwwKQorI2RlZmluZSBMQVBJQ19OTUlfUkVTRVJWRUQJKDE8PDEpCisKKy8qIG5taV9hY3RpdmU6CisgKiArMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBhY3RpdmUsIGJ1dCBjYW4gYmUgZGlzYWJsZWQKKyAqICAwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGhhcyBub3QgYmVlbiBzZXQgdXAsIGFuZCBjYW5ub3QKKyAqICAgICBiZSBlbmFibGVkCisgKiAtMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBkaXNhYmxlZCwgYnV0IGNhbiBiZSBlbmFibGVkCisgKi8KK2ludCBubWlfYWN0aXZlOworCisjZGVmaW5lIEs3X0VWTlRTRUxfRU5BQkxFCSgxIDw8IDIyKQorI2RlZmluZSBLN19FVk5UU0VMX0lOVAkJKDEgPDwgMjApCisjZGVmaW5lIEs3X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQorI2RlZmluZSBLN19FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCisjZGVmaW5lIEs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORwkweDc2CisjZGVmaW5lIEs3X05NSV9FVkVOVAkJSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCisKKyNkZWZpbmUgUDZfRVZOVFNFTDBfRU5BQkxFCSgxIDw8IDIyKQorI2RlZmluZSBQNl9FVk5UU0VMX0lOVAkJKDEgPDwgMjApCisjZGVmaW5lIFA2X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQorI2RlZmluZSBQNl9FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCisjZGVmaW5lIFA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAkweDc5CisjZGVmaW5lIFA2X05NSV9FVkVOVAkJUDZfRVZFTlRfQ1BVX0NMT0NLU19OT1RfSEFMVEVECisKKyNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFCTB4MUEwCisjZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRV9QRVJGX0FWQUlMCSgxPDw3KQorI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCSgxPDwxMikKKyNkZWZpbmUgTVNSX1A0X1BFUkZDVFIwCQkweDMwMAorI2RlZmluZSBNU1JfUDRfQ0NDUjAJCTB4MzYwCisjZGVmaW5lIFA0X0VTQ1JfRVZFTlRfU0VMRUNUKE4pCSgoTik8PDI1KQorI2RlZmluZSBQNF9FU0NSX09TCQkoMTw8MykKKyNkZWZpbmUgUDRfRVNDUl9VU1IJCSgxPDwyKQorI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkwCSgxPDwyNikKKyNkZWZpbmUgUDRfQ0NDUl9PVkZfUE1JMQkoMTw8MjcpCisjZGVmaW5lIFA0X0NDQ1JfVEhSRVNIT0xEKE4pCSgoTik8PDIwKQorI2RlZmluZSBQNF9DQ0NSX0NPTVBMRU1FTlQJKDE8PDE5KQorI2RlZmluZSBQNF9DQ0NSX0NPTVBBUkUJCSgxPDwxOCkKKyNkZWZpbmUgUDRfQ0NDUl9SRVFVSVJFRAkoMzw8MTYpCisjZGVmaW5lIFA0X0NDQ1JfRVNDUl9TRUxFQ1QoTikJKChOKTw8MTMpCisjZGVmaW5lIFA0X0NDQ1JfRU5BQkxFCQkoMTw8MTIpCisvKiBTZXQgdXAgSVFfQ09VTlRFUjAgdG8gYmVoYXZlIGxpa2UgYSBjbG9jaywgYnkgaGF2aW5nIElRX0NDQ1IwIGZpbHRlcgorICAgQ1JVX0VTQ1IwICh3aXRoIGFueSBub24tbnVsbCBldmVudCBzZWxlY3RvcikgdGhyb3VnaCBhIGNvbXBsZW1lbnRlZAorICAgbWF4IHRocmVzaG9sZC4gW0lBMzItVm9sMywgU2VjdGlvbiAxNC45LjldICovCisjZGVmaW5lIE1TUl9QNF9JUV9DT1VOVEVSMAkweDMwQworI2RlZmluZSBQNF9OTUlfQ1JVX0VTQ1IwCShQNF9FU0NSX0VWRU5UX1NFTEVDVCgweDNGKXxQNF9FU0NSX09TfFA0X0VTQ1JfVVNSKQorI2RlZmluZSBQNF9OTUlfSVFfQ0NDUjAJXAorCShQNF9DQ0NSX09WRl9QTUkwfFA0X0NDQ1JfVEhSRVNIT0xEKDE1KXxQNF9DQ0NSX0NPTVBMRU1FTlR8CVwKKwkgUDRfQ0NDUl9DT01QQVJFfFA0X0NDQ1JfUkVRVUlSRUR8UDRfQ0NDUl9FU0NSX1NFTEVDVCg0KXxQNF9DQ0NSX0VOQUJMRSkKKworaW50IF9faW5pdCBjaGVja19ubWlfd2F0Y2hkb2cgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHByZXZfbm1pX2NvdW50W05SX0NQVVNdOworCWludCBjcHU7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0ZXN0aW5nIE5NSSB3YXRjaGRvZyAuLi4gIik7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQlwcmV2X25taV9jb3VudFtjcHVdID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5fX25taV9jb3VudDsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbWRlbGF5KCgxMCoxMDAwKS9ubWlfaHopOyAvLyB3YWl0IDEwIHRpY2tzCisKKwkvKiBGSVhNRTogT25seSBib290IENQVSBpcyBvbmxpbmUgYXQgdGhpcyBzdGFnZS4gIENoZWNrIENQVXMKKyAgICAgICAgICAgYXMgdGhleSBjb21lIHVwLiAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKyNpZmRlZiBDT05GSUdfU01QCisJCS8qIENoZWNrIGNwdV9jYWxsaW5fbWFwIGhlcmUgYmVjYXVzZSB0aGF0IGlzIHNldAorCQkgICBhZnRlciB0aGUgdGltZXIgaXMgc3RhcnRlZC4gKi8KKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCisJCQljb250aW51ZTsKKyNlbmRpZgorCQlpZiAobm1pX2NvdW50KGNwdSkgLSBwcmV2X25taV9jb3VudFtjcHVdIDw9IDUpIHsKKwkJCXByaW50aygiQ1BVIyVkOiBOTUkgYXBwZWFycyB0byBiZSBzdHVjayFcbiIsIGNwdSk7CisJCQlubWlfYWN0aXZlID0gMDsKKwkJCWxhcGljX25taV9vd25lciAmPSB+TEFQSUNfTk1JX1dBVENIRE9HOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXByaW50aygiT0suXG4iKTsKKworCS8qIG5vdyB0aGF0IHdlIGtub3cgaXQgd29ya3Mgd2UgY2FuIHJlZHVjZSBOTUkgZnJlcXVlbmN5IHRvCisJICAgc29tZXRoaW5nIG1vcmUgcmVhc29uYWJsZTsgbWFrZXMgYSBkaWZmZXJlbmNlIGluIHNvbWUgY29uZmlncyAqLworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCW5taV9oeiA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm1pX3dhdGNoZG9nKGNoYXIgKnN0cikKK3sKKwlpbnQgbm1pOworCisJZ2V0X29wdGlvbigmc3RyLCAmbm1pKTsKKworCWlmIChubWkgPj0gTk1JX0lOVkFMSUQpCisJCXJldHVybiAwOworCWlmIChubWkgPT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IG5taTsKKwkvKgorCSAqIElmIGFueSBvdGhlciB4ODYgQ1BVIGhhcyBhIGxvY2FsIEFQSUMsIHRoZW4KKwkgKiBwbGVhc2UgdGVzdCB0aGUgTk1JIHN0dWZmIHRoZXJlIGFuZCBzZW5kIG1lIHRoZQorCSAqIG1pc3NpbmcgYml0cy4gUmlnaHQgbm93IEludGVsIFA2L1A0IGFuZCBBTUQgSzcgb25seS4KKwkgKi8KKwlpZiAoKG5taSA9PSBOTUlfTE9DQUxfQVBJQykgJiYKKwkJCShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkJCShib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJbm1pX3dhdGNoZG9nID0gbm1pOworCWlmICgobm1pID09IE5NSV9MT0NBTF9BUElDKSAmJgorCQkJKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgJiYKKwkgIAkJKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgfHwgYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUpKQorCQlubWlfd2F0Y2hkb2cgPSBubWk7CisJLyoKKwkgKiBXZSBjYW4gZW5hYmxlIHRoZSBJTy1BUElDIHdhdGNoZG9nCisJICogdW5jb25kaXRpb25hbGx5LgorCSAqLworCWlmIChubWkgPT0gTk1JX0lPX0FQSUMpIHsKKwkJbm1pX2FjdGl2ZSA9IDE7CisJCW5taV93YXRjaGRvZyA9IG5taTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5taV93YXRjaGRvZz0iLCBzZXR1cF9ubWlfd2F0Y2hkb2cpOworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmIChubWlfYWN0aXZlIDw9IDApCisJCXJldHVybjsKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCQljYXNlIDY6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCisJCQkJYnJlYWs7CisKKwkJCXdybXNyKE1TUl9QNl9FVk5UU0VMMCwgMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDB4MykKKwkJCQlicmVhazsKKworCQkJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCAwLCAwKTsKKwkJCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIDAsIDApOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCW5taV9hY3RpdmUgPSAtMTsKKwkvKiB0ZWxsIGRvX25taSgpIGFuZCBvdGhlcnMgdGhhdCB3ZSdyZSBub3QgYWN0aXZlIGFueSBtb3JlICovCisJbm1pX3dhdGNoZG9nID0gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmIChubWlfYWN0aXZlIDwgMCkgeworCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKKwkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coKTsKKwl9Cit9CisKK2ludCByZXNlcnZlX2xhcGljX25taSh2b2lkKQoreworCXVuc2lnbmVkIGludCBvbGRfb3duZXI7CisKKwlzcGluX2xvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwlvbGRfb3duZXIgPSBsYXBpY19ubWlfb3duZXI7CisJbGFwaWNfbm1pX293bmVyIHw9IExBUElDX05NSV9SRVNFUlZFRDsKKwlzcGluX3VubG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOworCWlmIChvbGRfb3duZXIgJiBMQVBJQ19OTUlfUkVTRVJWRUQpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKG9sZF9vd25lciAmIExBUElDX05NSV9XQVRDSERPRykKKwkJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX2xhcGljX25taSh2b2lkKQoreworCXVuc2lnbmVkIGludCBuZXdfb3duZXI7CisKKwlzcGluX2xvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwluZXdfb3duZXIgPSBsYXBpY19ubWlfb3duZXIgJiB+TEFQSUNfTk1JX1JFU0VSVkVEOworCWxhcGljX25taV9vd25lciA9IG5ld19vd25lcjsKKwlzcGluX3VubG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOworCWlmIChuZXdfb3duZXIgJiBMQVBJQ19OTUlfV0FUQ0hET0cpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKK30KKwordm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSB8fCAobm1pX2FjdGl2ZSA8PSAwKSkKKwkJcmV0dXJuOworCisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJbm1pX2FjdGl2ZSA9IC0xOworCW5taV93YXRjaGRvZyA9IE5NSV9OT05FOworfQorCit2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAobm1pX2FjdGl2ZSA8IDApIHsKKwkJbm1pX3dhdGNoZG9nID0gTk1JX0lPX0FQSUM7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCQlubWlfYWN0aXZlID0gMTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBubWlfcG1fYWN0aXZlOyAvKiBubWlfYWN0aXZlIGJlZm9yZSBzdXNwZW5kICovCisKK3N0YXRpYyBpbnQgbGFwaWNfbm1pX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCW5taV9wbV9hY3RpdmUgPSBubWlfYWN0aXZlOworCWRpc2FibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFwaWNfbm1pX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCWlmIChubWlfcG1fYWN0aXZlID4gMCkKKwkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG5taV9zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJsYXBpY19ubWkiKSwKKwkucmVzdW1lCQk9IGxhcGljX25taV9yZXN1bWUsCisJLnN1c3BlbmQJPSBsYXBpY19ubWlfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfbGFwaWNfbm1pID0geworCS5pZAk9IDAsCisJLmNscwk9ICZubWlfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xhcGljX25taV9zeXNmcyh2b2lkKQoreworCWludCBlcnJvcjsKKworCWlmIChubWlfYWN0aXZlID09IDAgfHwgbm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCQlyZXR1cm4gMDsKKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZubWlfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfbGFwaWNfbm1pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisvKiBtdXN0IGNvbWUgYWZ0ZXIgdGhlIGxvY2FsIEFQSUMncyBkZXZpY2VfaW5pdGNhbGwoKSAqLworbGF0ZV9pbml0Y2FsbChpbml0X2xhcGljX25taV9zeXNmcyk7CisKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworLyoKKyAqIEFjdGl2YXRlIHRoZSBOTUkgd2F0Y2hkb2cgdmlhIHRoZSBsb2NhbCBBUElDLgorICogT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5IEtlaXRoIE93ZW5zLgorICovCisKK3N0YXRpYyB2b2lkIGNsZWFyX21zcl9yYW5nZSh1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBuOyArK2kpCisJCXdybXNyKGJhc2UraSwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2s3X3dhdGNoZG9nKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV2bnRzZWw7CisKKwlubWlfcGVyZmN0cl9tc3IgPSBNU1JfSzdfUEVSRkNUUjA7CisKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X0VWTlRTRUwwLCA0KTsKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X1BFUkZDVFIwLCA0KTsKKworCWV2bnRzZWwgPSBLN19FVk5UU0VMX0lOVAorCQl8IEs3X0VWTlRTRUxfT1MKKwkJfCBLN19FVk5UU0VMX1VTUgorCQl8IEs3X05NSV9FVkVOVDsKKworCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgZXZudHNlbCwgMCk7CisJRHByaW50aygic2V0dGluZyBLN19QRVJGQ1RSMCB0byAlMDhseFxuIiwgLShjcHVfa2h6L25taV9oeioxMDAwKSk7CisJd3Jtc3IoTVNSX0s3X1BFUkZDVFIwLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBLN19FVk5UU0VMX0VOQUJMRTsKKwl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIGV2bnRzZWwsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9wNl93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBldm50c2VsOworCisJbm1pX3BlcmZjdHJfbXNyID0gTVNSX1A2X1BFUkZDVFIwOworCisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNl9FVk5UU0VMMCwgMik7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNl9QRVJGQ1RSMCwgMik7CisKKwlldm50c2VsID0gUDZfRVZOVFNFTF9JTlQKKwkJfCBQNl9FVk5UU0VMX09TCisJCXwgUDZfRVZOVFNFTF9VU1IKKwkJfCBQNl9OTUlfRVZFTlQ7CisKKwl3cm1zcihNU1JfUDZfRVZOVFNFTDAsIGV2bnRzZWwsIDApOworCURwcmludGsoInNldHRpbmcgUDZfUEVSRkNUUjAgdG8gJTA4bHhcbiIsIC0oY3B1X2toei9ubWlfaHoqMTAwMCkpOworCXdybXNyKE1TUl9QNl9QRVJGQ1RSMCwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgMCk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBQNl9FVk5UU0VMMF9FTkFCTEU7CisJd3Jtc3IoTVNSX1A2X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKK30KKworc3RhdGljIGludCBzZXR1cF9wNF93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBtaXNjX2VuYWJsZSwgZHVtbXk7CisKKwlyZG1zcihNU1JfUDRfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlLCBkdW1teSk7CisJaWYgKCEobWlzY19lbmFibGUgJiBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTCkpCisJCXJldHVybiAwOworCisJbm1pX3BlcmZjdHJfbXNyID0gTVNSX1A0X0lRX0NPVU5URVIwOworCW5taV9wNF9jY2NyX3ZhbCA9IFA0X05NSV9JUV9DQ0NSMDsKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKHNtcF9udW1fc2libGluZ3MgPT0gMikKKwkJbm1pX3A0X2NjY3JfdmFsIHw9IFA0X0NDQ1JfT1ZGX1BNSTE7CisjZW5kaWYKKworCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTCkpCisJCWNsZWFyX21zcl9yYW5nZSgweDNGMSwgMik7CisJLyogTVNSIDB4M0YwIHNlZW1zIHRvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIG9mIDB4RkMwMCwgYnV0IGN1cnJlbnQKKwkgICBkb2NzIGRvZXNuJ3QgZnVsbHkgZGVmaW5lIGl0LCBzbyBsZWF2ZSBpdCBhbG9uZSBmb3Igbm93LiAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSAweDMpIHsKKwkJLyogTVNSX1A0X0lRX0VTQ1IwLzEgKDB4M2JhLzB4M2JiKSByZW1vdmVkICovCisJCWNsZWFyX21zcl9yYW5nZSgweDNBMCwgMjYpOworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQkMsIDMpOworCX0gZWxzZSB7CisJCWNsZWFyX21zcl9yYW5nZSgweDNBMCwgMzEpOworCX0KKwljbGVhcl9tc3JfcmFuZ2UoMHgzQzAsIDYpOworCWNsZWFyX21zcl9yYW5nZSgweDNDOCwgNik7CisJY2xlYXJfbXNyX3JhbmdlKDB4M0UwLCAyKTsKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX1A0X0NDQ1IwLCAxOCk7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNF9QRVJGQ1RSMCwgMTgpOworCisJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSMCwgUDRfTk1JX0NSVV9FU0NSMCwgMCk7CisJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBQNF9OTUlfSVFfQ0NDUjAgJiB+UDRfQ0NDUl9FTkFCTEUsIDApOworCURwcmludGsoInNldHRpbmcgUDRfSVFfQ09VTlRFUjAgdG8gMHglMDhseFxuIiwgLShjcHVfa2h6L25taV9oeioxMDAwKSk7CisJd3Jtc3IoTVNSX1A0X0lRX0NPVU5URVIwLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBubWlfcDRfY2Njcl92YWwsIDApOworCXJldHVybiAxOworfQorCit2b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nICh2b2lkKQoreworCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ICE9IDYgJiYgYm9vdF9jcHVfZGF0YS54ODYgIT0gMTUpCisJCQlyZXR1cm47CisJCXNldHVwX2s3X3dhdGNoZG9nKCk7CisJCWJyZWFrOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCQljYXNlIDY6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCisJCQkJcmV0dXJuOworCisJCQlzZXR1cF9wNl93YXRjaGRvZygpOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweDMpCisJCQkJcmV0dXJuOworCisJCQlpZiAoIXNldHVwX3A0X3dhdGNoZG9nKCkpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlsYXBpY19ubWlfb3duZXIgPSBMQVBJQ19OTUlfV0FUQ0hET0c7CisJbm1pX2FjdGl2ZSA9IDE7Cit9CisKKy8qCisgKiB0aGUgYmVzdCB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgYSBDUFUgaGFzIGEgJ2hhcmQgbG9ja3VwJyBwcm9ibGVtCisgKiBpcyB0byBjaGVjayBpdCdzIGxvY2FsIEFQSUMgdGltZXIgSVJRIGNvdW50cy4gSWYgdGhleSBhcmUgbm90CisgKiBjaGFuZ2luZyB0aGVuIHRoYXQgQ1BVIGhhcyBzb21lIHByb2JsZW0uCisgKgorICogYXMgdGhlc2Ugd2F0Y2hkb2cgTk1JIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBldmVyeSBDUFUsIHdlIG9ubHkKKyAqIGhhdmUgdG8gY2hlY2sgdGhlIGN1cnJlbnQgcHJvY2Vzc29yLgorICoKKyAqIHNpbmNlIE5NSXMgZG9uJ3QgbGlzdGVuIHRvIF9hbnlfIGxvY2tzLCB3ZSBoYXZlIHRvIGJlIGV4dHJlbWVseQorICogY2FyZWZ1bCBub3QgdG8gcmVseSBvbiB1bnNhZmUgdmFyaWFibGVzLiBUaGUgcHJpbnRrIG1pZ2h0IGxvY2sKKyAqIHVwIHRob3VnaCwgc28gd2UgaGF2ZSB0byBicmVhayB1cCBhbnkgY29uc29sZSBsb2NrcyBmaXJzdCAuLi4KKyAqIFt3aGVuIHRoZXJlIHdpbGwgYmUgbW9yZSB0dHktcmVsYXRlZCBsb2NrcywgYnJlYWsgdGhlbSB1cAorICogIGhlcmUgdG9vIV0KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CisJbGFzdF9pcnFfc3VtcyBbTlJfQ1BVU10sCisJYWxlcnRfY291bnRlciBbTlJfQ1BVU107CisKK3ZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBKdXN0IHJlc2V0IHRoZSBhbGVydCBjb3VudGVycywgKG90aGVyIENQVXMgbWlnaHQgYmUKKwkgKiBzcGlubmluZyBvbiBsb2NrcyB3ZSBob2xkKToKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlhbGVydF9jb3VudGVyW2ldID0gMDsKK30KKworZXh0ZXJuIHZvaWQgZGllX25taShzdHJ1Y3QgcHRfcmVncyAqLCBjb25zdCBjaGFyICptc2cpOworCit2b2lkIG5taV93YXRjaGRvZ190aWNrIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisKKwkvKgorCSAqIFNpbmNlIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+IGlzIGFsd2F5cyBvbiB0aGUgc3RhY2ssIGFuZCB3ZQorCSAqIGFsd2F5cyBzd2l0Y2ggdGhlIHN0YWNrIE5NSS1hdG9taWNhbGx5LCBpdCdzIHNhZmUgdG8gdXNlCisJICogc21wX3Byb2Nlc3Nvcl9pZCgpLgorCSAqLworCWludCBzdW0sIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXN1bSA9IHBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzOworCisJaWYgKGxhc3RfaXJxX3N1bXNbY3B1XSA9PSBzdW0pIHsKKwkJLyoKKwkJICogQXlpZWUsIGxvb2tzIGxpa2UgdGhpcyBDUFUgaXMgc3R1Y2sgLi4uCisJCSAqIHdhaXQgYSBmZXcgSVJRcyAoNSBzZWNvbmRzKSBiZWZvcmUgZG9pbmcgdGhlIG9vcHMgLi4uCisJCSAqLworCQlhbGVydF9jb3VudGVyW2NwdV0rKzsKKwkJaWYgKGFsZXJ0X2NvdW50ZXJbY3B1XSA9PSA1Km5taV9oeikKKwkJCWRpZV9ubWkocmVncywgIk5NSSBXYXRjaGRvZyBkZXRlY3RlZCBMT0NLVVAiKTsKKwl9IGVsc2UgeworCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07CisJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJfQorCWlmIChubWlfcGVyZmN0cl9tc3IpIHsKKwkJaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDRfSVFfQ09VTlRFUjApIHsKKwkJCS8qCisJCQkgKiBQNCBxdWlya3M6CisJCQkgKiAtIEFuIG92ZXJmbG93biBwZXJmY3RyIHdpbGwgYXNzZXJ0IGl0cyBpbnRlcnJ1cHQKKwkJCSAqICAgdW50aWwgdGhlIE9WRiBmbGFnIGluIGl0cyBDQ0NSIGlzIGNsZWFyZWQuCisJCQkgKiAtIExWVFBDIGlzIG1hc2tlZCBvbiBpbnRlcnJ1cHQgYW5kIG11c3QgYmUKKwkJCSAqICAgdW5tYXNrZWQgYnkgdGhlIExWVFBDIGhhbmRsZXIuCisJCQkgKi8KKwkJCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgbm1pX3A0X2NjY3JfdmFsLCAwKTsKKwkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCQl9CisJCWVsc2UgaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDZfUEVSRkNUUjApIHsKKwkJCS8qIE9ubHkgUDYgYmFzZWQgUGVudGl1bSBNIG5lZWQgdG8gcmUtdW5tYXNrCisJCQkgKiB0aGUgYXBpYyB2ZWN0b3IgYnV0IGl0IGRvZXNuJ3QgaHVydAorCQkJICogb3RoZXIgUDYgdmFyaWFudCAqLworCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJCX0KKwkJd3Jtc3Iobm1pX3BlcmZjdHJfbXNyLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgaW50IHVua25vd25fbm1pX3BhbmljX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIShyZWFzb24gJiAweGMwKSkgeworCQlzcHJpbnRmKGJ1ZiwgIk5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeFxuIiwgcmVhc29uKTsKKwkJZGllX25taShyZWdzLCBidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByb2MgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL2tlcm5lbC91bmtub3duX25taV9wYW5pYworICovCitpbnQgcHJvY191bmtub3duX25taV9wYW5pYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgb2xkX3N0YXRlOworCisJb2xkX3N0YXRlID0gdW5rbm93bl9ubWlfcGFuaWM7CisJcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAoISFvbGRfc3RhdGUgPT0gISF1bmtub3duX25taV9wYW5pYykKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5rbm93bl9ubWlfcGFuaWMpIHsKKwkJaWYgKHJlc2VydmVfbGFwaWNfbm1pKCkgPCAwKSB7CisJCQl1bmtub3duX25taV9wYW5pYyA9IDA7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IGVsc2UgeworCQkJc2V0X25taV9jYWxsYmFjayh1bmtub3duX25taV9wYW5pY19jYWxsYmFjayk7CisJCX0KKwl9IGVsc2UgeworCQlyZWxlYXNlX2xhcGljX25taSgpOworCQl1bnNldF9ubWlfY2FsbGJhY2soKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKG5taV9hY3RpdmUpOworRVhQT1JUX1NZTUJPTChubWlfd2F0Y2hkb2cpOworRVhQT1JUX1NZTUJPTChyZXNlcnZlX2xhcGljX25taSk7CitFWFBPUlRfU1lNQk9MKHJlbGVhc2VfbGFwaWNfbm1pKTsKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2cpOworRVhQT1JUX1NZTUJPTChlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFlZGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9udW1hcS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGdvbmVAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbnVtYXEuaD4KKyNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKworI2RlZmluZQlNQl9UT19QQUdFUyhhZGRyKSAoKGFkZHIpIDw8ICgyMCAtIFBBR0VfU0hJRlQpKQorCisvKgorICogRnVuY3Rpb246IHNtcF9kdW1wX3FjdCgpCisgKgorICogRGVzY3JpcHRpb246IGdldHMgbWVtb3J5IGxheW91dCBmcm9tIHRoZSBxdWFkIGNvbmZpZyB0YWJsZS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyBub2RlX29ubGluZV9tYXAgd2l0aCB0aGUgbm9kZXMgKHF1YWRzKSBwcmVzZW50LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc21wX2R1bXBfcWN0KHZvaWQpCit7CisJaW50IG5vZGU7CisJc3RydWN0IGVhY2hxdWFkbWVtICplcTsKKwlzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2QgPQorCQkoc3RydWN0IHN5c19jZmdfZGF0YSAqKV9fdmEoU1lTX0NGR19EQVRBX1BSSVZfQUREUik7CisKKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCWZvcl9lYWNoX25vZGUobm9kZSkgeworCQlpZiAoc2NkLT5xdWFkc19wcmVzZW50MzFfMCAmICgxIDw8IG5vZGUpKSB7CisJCQlub2RlX3NldF9vbmxpbmUobm9kZSk7CisJCQllcSA9ICZzY2QtPmVxW25vZGVdOworCQkJLyogQ29udmVydCB0byBwYWdlcyAqLworCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0gPSBNQl9UT19QQUdFUygKKwkJCQllcS0+aGlfc2hyZF9tZW1fc3RhcnQgLSBlcS0+cHJpdl9tZW1fc2l6ZSk7CisJCQlub2RlX2VuZF9wZm5bbm9kZV0gPSBNQl9UT19QQUdFUygKKwkJCQllcS0+aGlfc2hyZF9tZW1fc3RhcnQgKyBlcS0+aGlfc2hyZF9tZW1fc2l6ZSk7CisKKwkJCW1lbW9yeV9wcmVzZW50KG5vZGUsCisJCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0sIG5vZGVfZW5kX3Bmbltub2RlXSk7CisJCQlub2RlX3JlbWFwX3NpemVbbm9kZV0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5vZGUsCisJCQkJCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0sCisJCQkJCQkJbm9kZV9lbmRfcGZuW25vZGVdKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFVubGlrZSBTdW1taXQsIHdlIGRvbid0IHJlYWxseSBjYXJlIHRvIGxldCB0aGUgTlVNQS1RCisgKiBmYWxsIGJhY2sgdG8gZmxhdCBtb2RlLiAgRG9uJ3QgY29tcGlsZSBmb3IgTlVNQS1RCisgKiB1bmxlc3MgeW91IHJlYWxseSBuZWVkIGl0IQorICovCitpbnQgX19pbml0IGdldF9tZW1jZmdfbnVtYXEodm9pZCkKK3sKKwlzbXBfZHVtcF9xY3QoKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlMmUwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0LgorICoKKyAqIE9uIGkzODYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgZHluYW1pYyBETUEgYWRkcmVzcyB0cmFuc2xhdGlvbiwKKyAqIHNvIGNvbnNpc3RlbnQgYWxsb2MvZnJlZSBhcmUgbWVyZWx5IHBhZ2UgYWxsb2NhdGlvbi9mcmVlaW5nLgorICogVGhlIHJlc3Qgb2YgdGhlIGR5bmFtaWMgRE1BIG1hcHBpbmcgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkCisgKiBpbiBhc20vcGNpLmguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IGRtYV9jb2hlcmVudF9tZW0geworCXZvaWQJCSp2aXJ0X2Jhc2U7CisJdTMyCQlkZXZpY2VfYmFzZTsKKwlpbnQJCXNpemU7CisJaW50CQlmbGFnczsKKwl1bnNpZ25lZCBsb25nCSpiaXRtYXA7Cit9OworCit2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCit7CisJdm9pZCAqcmV0OworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYgPyBkZXYtPmRtYV9tZW0gOiBOVUxMOworCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKwkvKiBpZ25vcmUgcmVnaW9uIHNwZWNpZmllcnMgKi8KKwlnZnAgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKKworCWlmIChtZW0pIHsKKwkJaW50IHBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLAorCQkJCQkJICAgICBvcmRlcik7CisJCWlmIChwYWdlID49IDApIHsKKwkJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOworCQkJcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKKwkJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfRVhDTFVTSVZFKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRldiA9PSBOVUxMIHx8IChkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgMHhmZmZmZmZmZikpCisJCWdmcCB8PSBHRlBfRE1BOworCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgb3JkZXIpOworCisJaWYgKHJldCAhPSBOVUxMKSB7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fcGh5cyhyZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2ID8gZGV2LT5kbWFfbWVtIDogTlVMTDsKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJCisJaWYgKG1lbSAmJiB2YWRkciA+PSBtZW0tPnZpcnRfYmFzZSAmJiB2YWRkciA8IChtZW0tPnZpcnRfYmFzZSArIChtZW0tPnNpemUgPDwgUEFHRV9TSElGVCkpKSB7CisJCWludCBwYWdlID0gKHZhZGRyIC0gbWVtLT52aXJ0X2Jhc2UpID4+IFBBR0VfU0hJRlQ7CisKKwkJYml0bWFwX3JlbGVhc2VfcmVnaW9uKG1lbS0+Yml0bWFwLCBwYWdlLCBvcmRlcik7CisJfSBlbHNlCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIG9yZGVyKTsKK30KKworaW50IGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCisJCQkJZG1hX2FkZHJfdCBkZXZpY2VfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXNlOworCWludCBwYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgYml0bWFwX3NpemUgPSAocGFnZXMgKyAzMSkvMzI7CisKKwlpZiAoKGZsYWdzICYgKERNQV9NRU1PUllfTUFQIHwgRE1BX01FTU9SWV9JTykpID09IDApCisJCWdvdG8gb3V0OworCWlmICghc2l6ZSkKKwkJZ290byBvdXQ7CisJaWYgKGRldi0+ZG1hX21lbSkKKwkJZ290byBvdXQ7CisKKwkvKiBGSVhNRTogdGhpcyByb3V0aW5lIGp1c3QgaWdub3JlcyBETUFfTUVNT1JZX0lOQ0xVREVTX0NISUxEUkVOICovCisKKwltZW1fYmFzZSA9IGlvcmVtYXAoYnVzX2FkZHIsIHNpemUpOworCWlmICghbWVtX2Jhc2UpCisJCWdvdG8gb3V0OworCisJZGV2LT5kbWFfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9jb2hlcmVudF9tZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+ZG1hX21lbSkKKwkJZ290byBvdXQ7CisJbWVtc2V0KGRldi0+ZG1hX21lbSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtKSk7CisJZGV2LT5kbWFfbWVtLT5iaXRtYXAgPSBrbWFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+ZG1hX21lbS0+Yml0bWFwKQorCQlnb3RvIGZyZWUxX291dDsKKwltZW1zZXQoZGV2LT5kbWFfbWVtLT5iaXRtYXAsIDAsIGJpdG1hcF9zaXplKTsKKworCWRldi0+ZG1hX21lbS0+dmlydF9iYXNlID0gbWVtX2Jhc2U7CisJZGV2LT5kbWFfbWVtLT5kZXZpY2VfYmFzZSA9IGRldmljZV9hZGRyOworCWRldi0+ZG1hX21lbS0+c2l6ZSA9IHBhZ2VzOworCWRldi0+ZG1hX21lbS0+ZmxhZ3MgPSBmbGFnczsKKworCWlmIChmbGFncyAmIERNQV9NRU1PUllfTUFQKQorCQlyZXR1cm4gRE1BX01FTU9SWV9NQVA7CisKKwlyZXR1cm4gRE1BX01FTU9SWV9JTzsKKworIGZyZWUxX291dDoKKwlrZnJlZShkZXYtPmRtYV9tZW0tPmJpdG1hcCk7Cisgb3V0OgorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkpOworCit2b2lkIGRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldi0+ZG1hX21lbTsKKwkKKwlpZighbWVtKQorCQlyZXR1cm47CisJZGV2LT5kbWFfbWVtID0gTlVMTDsKKwlpb3VubWFwKG1lbS0+dmlydF9iYXNlKTsKKwlrZnJlZShtZW0tPmJpdG1hcCk7CisJa2ZyZWUobWVtKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3JlbGVhc2VfZGVjbGFyZWRfbWVtb3J5KTsKKwordm9pZCAqZG1hX21hcmtfZGVjbGFyZWRfbWVtb3J5X29jY3VwaWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJZG1hX2FkZHJfdCBkZXZpY2VfYWRkciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldi0+ZG1hX21lbTsKKwlpbnQgcGFnZXMgPSAoc2l6ZSArIChkZXZpY2VfYWRkciAmIH5QQUdFX01BU0spICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlpbnQgcG9zLCBlcnI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwb3MgPSAoZGV2aWNlX2FkZHIgLSBtZW0tPmRldmljZV9iYXNlKSA+PiBQQUdFX1NISUZUOworCWVyciA9IGJpdG1hcF9hbGxvY2F0ZV9yZWdpb24obWVtLT5iaXRtYXAsIHBvcywgZ2V0X29yZGVyKHBhZ2VzKSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBtZW0tPnZpcnRfYmFzZSArIChwb3MgPDwgUEFHRV9TSElGVCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tYXJrX2RlY2xhcmVkX21lbW9yeV9vY2N1cGllZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMCwwICsxLDg0OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBwcm9jZXNzIGhhbmRsaW5nLi4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xkdC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2lmZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgorI2luY2x1ZGUgPGFzbS9tYXRoX2VtdS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOworCitzdGF0aWMgaW50IGhsdF9jb3VudGVyOworCit1bnNpZ25lZCBsb25nIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSAwOworRVhQT1JUX1NZTUJPTChib290X29wdGlvbl9pZGxlX292ZXJyaWRlKTsKKworLyoKKyAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgorICovCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuZXNwKVszXTsKK30KKworLyoKKyAqIFBvd2VybWFuYWdlbWVudCBpZGxlIGZ1bmN0aW9uLCBpZiBhbnkuLgorICovCit2b2lkICgqcG1faWRsZSkodm9pZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBjcHVfaWRsZV9zdGF0ZSk7CisKK3ZvaWQgZGlzYWJsZV9obHQodm9pZCkKK3sKKwlobHRfY291bnRlcisrOworfQorCitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaGx0KTsKKwordm9pZCBlbmFibGVfaGx0KHZvaWQpCit7CisJaGx0X2NvdW50ZXItLTsKK30KKworRVhQT1JUX1NZTUJPTChlbmFibGVfaGx0KTsKKworLyoKKyAqIFdlIHVzZSB0aGlzIGlmIHdlIGRvbid0IGhhdmUgYW55IGJldHRlcgorICogaWRsZSByb3V0aW5lLi4KKyAqLwordm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKK3sKKwlpZiAoIWhsdF9jb3VudGVyICYmIGJvb3RfY3B1X2RhdGEuaGx0X3dvcmtzX29rKSB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlzYWZlX2hhbHQoKTsKKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZSB7CisJCWNwdV9yZWxheCgpOworCX0KK30KKworLyoKKyAqIE9uIFNNUCBpdCdzIHNsaWdodGx5IGZhc3RlciAoYnV0IG11Y2ggbW9yZSBwb3dlci1jb25zdW1pbmchKQorICogdG8gcG9sbCB0aGUgLT53b3JrLm5lZWRfcmVzY2hlZCBmbGFnIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlCisgKiBjcm9zcy1DUFUgSVBJIHRvIGFycml2ZS4gVXNlIHRoaXMgb3B0aW9uIHdpdGggY2F1dGlvbi4KKyAqLworc3RhdGljIHZvaWQgcG9sbF9pZGxlICh2b2lkKQoreworCWludCBvbGR2YWw7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKgorCSAqIERlYWwgd2l0aCBhbm90aGVyIENQVSBqdXN0IGhhdmluZyBjaG9zZW4gYSB0aHJlYWQgdG8KKwkgKiBydW4gaGVyZToKKwkgKi8KKwlvbGR2YWwgPSB0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKTsKKworCWlmICghb2xkdmFsKSB7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQlhc20gdm9sYXRpbGUoCisJCQkiMjoiCisJCQkidGVzdGwgJTAsICUxOyIKKwkJCSJyZXA7IG5vcDsiCisJCQkiamUgMmI7IgorCQkJOiA6ICJpIihfVElGX05FRURfUkVTQ0hFRCksICJtIiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncykpOworCisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJfSBlbHNlIHsKKwkJc2V0X25lZWRfcmVzY2hlZCgpOworCX0KK30KKworLyoKKyAqIFRoZSBpZGxlIHRocmVhZC4gVGhlcmUncyBubyB1c2VmdWwgd29yayB0byBiZQorICogZG9uZSwgc28ganVzdCB0cnkgdG8gY29uc2VydmUgcG93ZXIgYW5kIGhhdmUgYQorICogbG93IGV4aXQgbGF0ZW5jeSAoaWUgc2l0IGluIGEgbG9vcCB3YWl0aW5nIGZvcgorICogc29tZWJvZHkgdG8gc2F5IHRoYXQgdGhleSdkIGxpa2UgdG8gcmVzY2hlZHVsZSkKKyAqLwordm9pZCBjcHVfaWRsZSAodm9pZCkKK3sKKwkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCXZvaWQgKCppZGxlKSh2b2lkKTsKKworCQkJaWYgKF9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpKQorCQkJCV9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpID0gMDsKKworCQkJcm1iKCk7CisJCQlpZGxlID0gcG1faWRsZTsKKworCQkJaWYgKCFpZGxlKQorCQkJCWlkbGUgPSBkZWZhdWx0X2lkbGU7CisKKwkJCV9fZ2V0X2NwdV92YXIoaXJxX3N0YXQpLmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKKwkJCWlkbGUoKTsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KK30KKwordm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7CisJY3B1bWFza190IG1hcDsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUodGhpc19jcHUpKTsKKwlwdXRfY3B1KCk7CisKKwljcHVzX2NsZWFyKG1hcCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJcGVyX2NwdShjcHVfaWRsZV9zdGF0ZSwgY3B1KSA9IDE7CisJCWNwdV9zZXQoY3B1LCBtYXApOworCX0KKworCV9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpID0gMDsKKworCXdtYigpOworCWRvIHsKKwkJc3NsZWVwKDEpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQkJaWYgKGNwdV9pc3NldChjcHUsIG1hcCkgJiYgIXBlcl9jcHUoY3B1X2lkbGVfc3RhdGUsIGNwdSkpCisJCQkJY3B1X2NsZWFyKGNwdSwgbWFwKTsKKwkJfQorCQljcHVzX2FuZChtYXAsIG1hcCwgY3B1X29ubGluZV9tYXApOworCX0gd2hpbGUgKCFjcHVzX2VtcHR5KG1hcCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CisKKy8qCisgKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCisgKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCisgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCisgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgorICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICovCitzdGF0aWMgdm9pZCBtd2FpdF9pZGxlKHZvaWQpCit7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJZG8geworCQkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOworCQkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJCWJyZWFrOworCQkJX19td2FpdCgwLCAwKTsKKwkJfSB3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKTsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHNlbGVjdF9pZGxlX3JvdXRpbmUoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01XQUlUKSkgeworCQlwcmludGsoIm1vbml0b3IvbXdhaXQgZmVhdHVyZSBwcmVzZW50LlxuIik7CisJCS8qCisJCSAqIFNraXAsIGlmIHNldHVwIGhhcyBvdmVycmlkZGVuIGlkbGUuCisJCSAqIE9uZSBDUFUgc3VwcG9ydHMgbXdhaXQgPT4gQWxsIENQVXMgc3VwcG9ydHMgbXdhaXQKKwkJICovCisJCWlmICghcG1faWRsZSkgeworCQkJcHJpbnRrKCJ1c2luZyBtd2FpdCBpbiBpZGxlIHRocmVhZHMuXG4iKTsKKwkJCXBtX2lkbGUgPSBtd2FpdF9pZGxlOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpZGxlX3NldHVwIChjaGFyICpzdHIpCit7CisJaWYgKCFzdHJuY21wKHN0ciwgInBvbGwiLCA0KSkgeworCQlwcmludGsoInVzaW5nIHBvbGxpbmcgaWRsZSB0aHJlYWRzLlxuIik7CisJCXBtX2lkbGUgPSBwb2xsX2lkbGU7CisjaWZkZWYgQ09ORklHX1g4Nl9TTVAKKwkJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKQorCQkJcHJpbnRrKCJXQVJOSU5HOiBwb2xsaW5nIGlkbGUgYW5kIEhUIGVuYWJsZWQsIHBlcmZvcm1hbmNlIG1heSBkZWdyYWRlLlxuIik7CisjZW5kaWYKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImhhbHQiLCA0KSkgeworCQlwcmludGsoInVzaW5nIGhhbHQgaW4gaWRsZSB0aHJlYWRzLlxuIik7CisJCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CisJfQorCisJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlkbGU9IiwgaWRsZV9zZXR1cCk7CisKK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNyMCA9IDBMLCBjcjIgPSAwTCwgY3IzID0gMEwsIGNyNCA9IDBMOworCisJcHJpbnRrKCJcbiIpOworCXByaW50aygiUGlkOiAlZCwgY29tbTogJTIwc1xuIiwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKKwlwcmludGsoIkVJUDogJTA0eDpbPCUwOGx4Pl0gQ1BVOiAlZFxuIiwweGZmZmYgJiByZWdzLT54Y3MscmVncy0+ZWlwLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50X3N5bWJvbCgiRUlQIGlzIGF0ICVzXG4iLCByZWdzLT5laXApOworCisJaWYgKHJlZ3MtPnhjcyAmIDMpCisJCXByaW50aygiIEVTUDogJTA0eDolMDhseCIsMHhmZmZmICYgcmVncy0+eHNzLHJlZ3MtPmVzcCk7CisJcHJpbnRrKCIgRUZMQUdTOiAlMDhseCAgICAlcyAgKCVzKVxuIiwKKwkgICAgICAgcmVncy0+ZWZsYWdzLCBwcmludF90YWludGVkKCksIHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpOworCXByaW50aygiRUFYOiAlMDhseCBFQlg6ICUwOGx4IEVDWDogJTA4bHggRURYOiAlMDhseFxuIiwKKwkJcmVncy0+ZWF4LHJlZ3MtPmVieCxyZWdzLT5lY3gscmVncy0+ZWR4KTsKKwlwcmludGsoIkVTSTogJTA4bHggRURJOiAlMDhseCBFQlA6ICUwOGx4IiwKKwkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCk7CisJcHJpbnRrKCIgRFM6ICUwNHggRVM6ICUwNHhcbiIsCisJCTB4ZmZmZiAmIHJlZ3MtPnhkcywweGZmZmYgJiByZWdzLT54ZXMpOworCisJX19hc21fXygibW92bCAlJWNyMCwgJTAiOiAiPXIiIChjcjApKTsKKwlfX2FzbV9fKCJtb3ZsICUlY3IyLCAlMCI6ICI9ciIgKGNyMikpOworCV9fYXNtX18oIm1vdmwgJSVjcjMsICUwIjogIj1yIiAoY3IzKSk7CisJLyogVGhpcyBjb3VsZCBmYXVsdCBpZiAlY3I0IGRvZXMgbm90IGV4aXN0ICovCisJX19hc21fXygiMTogbW92bCAlJWNyNCwgJTAJCVxuIgorCQkiMjoJCQkJXG4iCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiCVxuIgorCQkiLmxvbmcgMWIsMmIJCQlcbiIKKwkJIi5wcmV2aW91cwkJCVxuIgorCQk6ICI9ciIgKGNyNCk6ICIwIiAoMCkpOworCXByaW50aygiQ1IwOiAlMDhseCBDUjI6ICUwOGx4IENSMzogJTA4bHggQ1I0OiAlMDhseFxuIiwgY3IwLCBjcjIsIGNyMywgY3I0KTsKKwlzaG93X3RyYWNlKE5VTEwsICZyZWdzLT5lc3ApOworfQorCisvKgorICogVGhpcyBnZXRzIHJ1biB3aXRoICVlYnggY29udGFpbmluZyB0aGUKKyAqIGZ1bmN0aW9uIHRvIGNhbGwsIGFuZCAlZWR4IGNvbnRhaW5pbmcKKyAqIHRoZSAiYXJncyIuCisgKi8KK2V4dGVybiB2b2lkIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQpOworX19hc21fXygiLnNlY3Rpb24gLnRleHRcbiIKKwkiLmFsaWduIDRcbiIKKwkia2VybmVsX3RocmVhZF9oZWxwZXI6XG5cdCIKKwkibW92bCAlZWR4LCVlYXhcblx0IgorCSJwdXNobCAlZWR4XG5cdCIKKwkiY2FsbCAqJWVieFxuXHQiCisJInB1c2hsICVlYXhcblx0IgorCSJjYWxsIGRvX2V4aXRcbiIKKwkiLnByZXZpb3VzIik7CisKKy8qCisgKiBDcmVhdGUgYSBrZXJuZWwgdGhyZWFkCisgKi8KK2ludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisKKwltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisKKwlyZWdzLmVieCA9ICh1bnNpZ25lZCBsb25nKSBmbjsKKwlyZWdzLmVkeCA9ICh1bnNpZ25lZCBsb25nKSBhcmc7CisKKwlyZWdzLnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLnhlcyA9IF9fVVNFUl9EUzsKKwlyZWdzLm9yaWdfZWF4ID0gLTE7CisJcmVncy5laXAgPSAodW5zaWduZWQgbG9uZykga2VybmVsX3RocmVhZF9oZWxwZXI7CisJcmVncy54Y3MgPSBfX0tFUk5FTF9DUzsKKwlyZWdzLmVmbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX1NGIHwgWDg2X0VGTEFHU19QRiB8IDB4MjsKKworCS8qIE9rLCBjcmVhdGUgdGhlIG5ldyBwcm9jZXNzLi4gKi8KKwlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEZyZWUgY3VycmVudCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4uCisgKi8KK3ZvaWQgZXhpdF90aHJlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmdHNrLT50aHJlYWQ7CisKKwkvKiBUaGUgcHJvY2VzcyBtYXkgaGF2ZSBhbGxvY2F0ZWQgYW4gaW8gcG9ydCBiaXRtYXAuLi4gbnVrZSBpdC4gKi8KKwlpZiAodW5saWtlbHkoTlVMTCAhPSB0LT5pb19iaXRtYXBfcHRyKSkgeworCQlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwkJa2ZyZWUodC0+aW9fYml0bWFwX3B0cik7CisJCXQtPmlvX2JpdG1hcF9wdHIgPSBOVUxMOworCQkvKgorCQkgKiBDYXJlZnVsLCBjbGVhciB0aGlzIGluIHRoZSBUU1MgdG9vOgorCQkgKi8KKwkJbWVtc2V0KHRzcy0+aW9fYml0bWFwLCAweGZmLCB0c3MtPmlvX2JpdG1hcF9tYXgpOworCQl0LT5pb19iaXRtYXBfbWF4ID0gMDsKKwkJdHNzLT5pb19iaXRtYXBfb3duZXIgPSBOVUxMOworCQl0c3MtPmlvX2JpdG1hcF9tYXggPSAwOworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUOworCQlwdXRfY3B1KCk7CisJfQorfQorCit2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCW1lbXNldCh0c2stPnRocmVhZC5kZWJ1Z3JlZywgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpOworCW1lbXNldCh0c2stPnRocmVhZC50bHNfYXJyYXksIDAsIHNpemVvZih0c2stPnRocmVhZC50bHNfYXJyYXkpKTsJCisJLyoKKwkgKiBGb3JnZXQgY29wcm9jZXNzb3Igc3RhdGUuLgorCSAqLworCWNsZWFyX2ZwdSh0c2spOworCWNsZWFyX3VzZWRfbWF0aCgpOworfQorCit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQoreworCWlmIChkZWFkX3Rhc2stPm1tKSB7CisJCS8vIHRlbXBvcmFyeSBkZWJ1Z2dpbmcgY2hlY2sKKwkJaWYgKGRlYWRfdGFzay0+bW0tPmNvbnRleHQuc2l6ZSkgeworCQkJcHJpbnRrKCJXQVJOSU5HOiBkZWFkIHByb2Nlc3MgJThzIHN0aWxsIGhhcyBMRFQ/IDwlcC8lZD5cbiIsCisJCQkJCWRlYWRfdGFzay0+Y29tbSwKKwkJCQkJZGVhZF90YXNrLT5tbS0+Y29udGV4dC5sZHQsCisJCQkJCWRlYWRfdGFzay0+bW0tPmNvbnRleHQuc2l6ZSk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXJlbGVhc2Vfdm04Nl9pcnFzKGRlYWRfdGFzayk7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGJlZm9yZSB3ZSBhbGxvY2F0ZSBhIG5ldyB0aHJlYWQgYW5kIGNvcHkKKyAqIHRoZSBjdXJyZW50IHRhc2sgaW50byBpdC4KKyAqLwordm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJdW5sYXp5X2ZwdSh0c2spOworfQorCitpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGVzcCwKKwl1bnNpZ25lZCBsb25nIHVudXNlZCwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKiBjaGlsZHJlZ3M7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IGVycjsKKworCWNoaWxkcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikgKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworCSpjaGlsZHJlZ3MgPSAqcmVnczsKKwljaGlsZHJlZ3MtPmVheCA9IDA7CisJY2hpbGRyZWdzLT5lc3AgPSBlc3A7CisKKwlwLT50aHJlYWQuZXNwID0gKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVnczsKKwlwLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAoY2hpbGRyZWdzKzEpOworCisJcC0+dGhyZWFkLmVpcCA9ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrOworCisJc2F2ZXNlZ21lbnQoZnMscC0+dGhyZWFkLmZzKTsKKwlzYXZlc2VnbWVudChncyxwLT50aHJlYWQuZ3MpOworCisJdHNrID0gY3VycmVudDsKKwlpZiAodW5saWtlbHkoTlVMTCAhPSB0c2stPnRocmVhZC5pb19iaXRtYXBfcHRyKSkgeworCQlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IGttYWxsb2MoSU9fQklUTUFQX0JZVEVTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwLT50aHJlYWQuaW9fYml0bWFwX3B0cikgeworCQkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtY3B5KHAtPnRocmVhZC5pb19iaXRtYXBfcHRyLCB0c2stPnRocmVhZC5pb19iaXRtYXBfcHRyLAorCQkJSU9fQklUTUFQX0JZVEVTKTsKKwl9CisKKwkvKgorCSAqIFNldCBhIG5ldyBUTFMgZm9yIHRoZSBjaGlsZCB0aHJlYWQ/CisJICovCisJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKSB7CisJCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKwkJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCQlpbnQgaWR4OworCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopY2hpbGRyZWdzLT5lc2ksIHNpemVvZihpbmZvKSkpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKExEVF9lbXB0eSgmaW5mbykpCisJCQlnb3RvIG91dDsKKworCQlpZHggPSBpbmZvLmVudHJ5X251bWJlcjsKKwkJaWYgKGlkeCA8IEdEVF9FTlRSWV9UTFNfTUlOIHx8IGlkeCA+IEdEVF9FTlRSWV9UTFNfTUFYKQorCQkJZ290byBvdXQ7CisKKwkJZGVzYyA9IHAtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKwkJZGVzYy0+YSA9IExEVF9lbnRyeV9hKCZpbmZvKTsKKwkJZGVzYy0+YiA9IExEVF9lbnRyeV9iKCZpbmZvKTsKKwl9CisKKwllcnIgPSAwOworIG91dDoKKwlpZiAoZXJyICYmIHAtPnRocmVhZC5pb19iaXRtYXBfcHRyKSB7CisJCWtmcmVlKHAtPnRocmVhZC5pb19iaXRtYXBfcHRyKTsKKwkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KKyAqLwordm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKK3sKKwlpbnQgaTsKKworLyogY2hhbmdlZCB0aGUgc2l6ZSBjYWxjdWxhdGlvbnMgLSBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgYmV0dGVyLiBsYnQgKi8KKwlkdW1wLT5tYWdpYyA9IENNQUdJQzsKKwlkdW1wLT5zdGFydF9jb2RlID0gMDsKKwlkdW1wLT5zdGFydF9zdGFjayA9IHJlZ3MtPmVzcCAmIH4oUEFHRV9TSVpFIC0gMSk7CisJZHVtcC0+dV90c2l6ZSA9ICgodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChjdXJyZW50LT5tbS0+YnJrICsgKFBBR0VfU0laRS0xKSkpID4+IFBBR0VfU0hJRlQ7CisJZHVtcC0+dV9kc2l6ZSAtPSBkdW1wLT51X3RzaXplOworCWR1bXAtPnVfc3NpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWR1bXAtPnVfZGVidWdyZWdbaV0gPSBjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbaV07ICAKKworCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKKwkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKKworCWR1bXAtPnJlZ3MuZWJ4ID0gcmVncy0+ZWJ4OworCWR1bXAtPnJlZ3MuZWN4ID0gcmVncy0+ZWN4OworCWR1bXAtPnJlZ3MuZWR4ID0gcmVncy0+ZWR4OworCWR1bXAtPnJlZ3MuZXNpID0gcmVncy0+ZXNpOworCWR1bXAtPnJlZ3MuZWRpID0gcmVncy0+ZWRpOworCWR1bXAtPnJlZ3MuZWJwID0gcmVncy0+ZWJwOworCWR1bXAtPnJlZ3MuZWF4ID0gcmVncy0+ZWF4OworCWR1bXAtPnJlZ3MuZHMgPSByZWdzLT54ZHM7CisJZHVtcC0+cmVncy5lcyA9IHJlZ3MtPnhlczsKKwlzYXZlc2VnbWVudChmcyxkdW1wLT5yZWdzLmZzKTsKKwlzYXZlc2VnbWVudChncyxkdW1wLT5yZWdzLmdzKTsKKwlkdW1wLT5yZWdzLm9yaWdfZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJZHVtcC0+cmVncy5laXAgPSByZWdzLT5laXA7CisJZHVtcC0+cmVncy5jcyA9IHJlZ3MtPnhjczsKKwlkdW1wLT5yZWdzLmVmbGFncyA9IHJlZ3MtPmVmbGFnczsKKwlkdW1wLT5yZWdzLmVzcCA9IHJlZ3MtPmVzcDsKKwlkdW1wLT5yZWdzLnNzID0gcmVncy0+eHNzOworCisJZHVtcC0+dV9mcHZhbGlkID0gZHVtcF9mcHUgKHJlZ3MsICZkdW1wLT5pMzg3KTsKK30KKworLyogCisgKiBDYXB0dXJlIHRoZSB1c2VyIHNwYWNlIHJlZ2lzdGVycyBpZiB0aGUgdGFzayBpcyBub3QgcnVubmluZyAoaW4gdXNlciBzcGFjZSkKKyAqLworaW50IGR1bXBfdGFza19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzIHB0cmVnczsKKwkKKwlwdHJlZ3MgPSAqKHN0cnVjdCBwdF9yZWdzICopCisJCSgodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvK1RIUkVBRF9TSVpFIC0gc2l6ZW9mKHB0cmVncykpOworCXB0cmVncy54Y3MgJj0gMHhmZmZmOworCXB0cmVncy54ZHMgJj0gMHhmZmZmOworCXB0cmVncy54ZXMgJj0gMHhmZmZmOworCXB0cmVncy54c3MgJj0gMHhmZmZmOworCisJZWxmX2NvcmVfY29weV9yZWdzKHJlZ3MsICZwdHJlZ3MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFuZGxlX2lvX2JpdG1hcChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqbmV4dCwgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKK3sKKwlpZiAoIW5leHQtPmlvX2JpdG1hcF9wdHIpIHsKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgYml0bWFwIHZpYSBhbiBpbnZhbGlkIG9mZnNldC4gV2Ugc3RpbGwgY2FjaGUKKwkJICogdGhlIHByZXZpb3VzIGJpdG1hcCBvd25lciBhbmQgdGhlIElPIGJpdG1hcCBjb250ZW50czoKKwkJICovCisJCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVQ7CisJCXJldHVybjsKKwl9CisJaWYgKGxpa2VseShuZXh0ID09IHRzcy0+aW9fYml0bWFwX293bmVyKSkgeworCQkvKgorCQkgKiBQcmV2aW91cyBvd25lciBvZiB0aGUgYml0bWFwIChoZW5jZSB0aGUgYml0bWFwIGNvbnRlbnQpCisJCSAqIG1hdGNoZXMgdGhlIG5leHQgdGFzaywgd2UgZG9udCBoYXZlIHRvIGRvIGFueXRoaW5nIGJ1dAorCQkgKiB0byBzZXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIFRTUzoKKwkJICovCisJCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJT19CSVRNQVBfT0ZGU0VUOworCQlyZXR1cm47CisJfQorCS8qCisJICogTGF6eSBUU1MncyBJL08gYml0bWFwIGNvcHkuIFdlIHNldCBhbiBpbnZhbGlkIG9mZnNldCBoZXJlCisJICogYW5kIHdlIGxldCB0aGUgdGFzayB0byBnZXQgYSBHUEYgaW4gY2FzZSBhbiBJL08gaW5zdHJ1Y3Rpb24KKwkgKiBpcyBwZXJmb3JtZWQuICBUaGUgaGFuZGxlciBvZiB0aGUgR1BGIHdpbGwgdmVyaWZ5IHRoYXQgdGhlCisJICogZmF1bHRpbmcgdGFzayBoYXMgYSB2YWxpZCBJL08gYml0bWFwIGFuZCwgaXQgdHJ1ZSwgZG9lcyB0aGUKKwkgKiByZWFsIGNvcHkgYW5kIHJlc3RhcnQgdGhlIGluc3RydWN0aW9uLiAgVGhpcyB3aWxsIHNhdmUgdXMKKwkgKiByZWR1bmRhbnQgY29waWVzIHdoZW4gdGhlIGN1cnJlbnRseSBzd2l0Y2hlZCB0YXNrIGRvZXMgbm90CisJICogcGVyZm9ybSBhbnkgSS9PIGR1cmluZyBpdHMgdGltZXNsaWNlLgorCSAqLworCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVRfTEFaWTsKK30KKy8qCisgKiBUaGlzIHNwZWNpYWwgbWFjcm8gY2FuIGJlIHVzZWQgdG8gbG9hZCBhIGRlYnVnZ2luZyByZWdpc3RlcgorICovCisjZGVmaW5lIGxvYWRkZWJ1Zyh0aHJlYWQscmVnaXN0ZXIpIFwKKwkJX19hc21fXygibW92bCAlMCwlJWRiIiAjcmVnaXN0ZXIgIFwKKwkJCTogLyogbm8gb3V0cHV0ICovIFwKKwkJCToiciIgKHRocmVhZC0+ZGVidWdyZWdbcmVnaXN0ZXJdKSkKKworLyoKKyAqCXN3aXRjaF90byh4LHluKSBzaG91bGQgc3dpdGNoIHRhc2tzIGZyb20geCB0byB5LgorICoKKyAqIFdlIGZzYXZlL2Z3YWl0IHNvIHRoYXQgYW4gZXhjZXB0aW9uIGdvZXMgb2ZmIGF0IHRoZSByaWdodCB0aW1lCisgKiAoYXMgYSBjYWxsIGZyb20gdGhlIGZzYXZlIG9yIGZ3YWl0IGluIGVmZmVjdCkgcmF0aGVyIHRoYW4gdG8KKyAqIHRoZSB3cm9uZyBwcm9jZXNzLiBMYXp5IEZQIHNhdmluZyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlCisgKiB3aXRoIG1vZGVybiBDUFUncywgYW5kIHRoaXMgc2ltcGxpZmllcyBhIGxvdCBvZiB0aGluZ3MgKFNNUAorICogYW5kIFVQIGJlY29tZSB0aGUgc2FtZSkuCisgKgorICogTk9URSEgV2UgdXNlZCB0byB1c2UgdGhlIHg4NiBoYXJkd2FyZSBjb250ZXh0IHN3aXRjaGluZy4gVGhlCisgKiByZWFzb24gZm9yIG5vdCB1c2luZyBpdCBhbnkgbW9yZSBiZWNvbWVzIGFwcGFyZW50IHdoZW4geW91CisgKiB0cnkgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IGZyb20gc2F2ZWQgc3RhdGUgdGhhdCBpcyBubyBsb25nZXIKKyAqIHZhbGlkIChzdGFsZSBzZWdtZW50IHJlZ2lzdGVyIHZhbHVlcyBpbiBwYXJ0aWN1bGFyKS4gV2l0aCB0aGUKKyAqIGhhcmR3YXJlIHRhc2stc3dpdGNoLCB0aGVyZSBpcyBubyB3YXkgdG8gZml4IHVwIGJhZCBzdGF0ZSBpbgorICogYSByZWFzb25hYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgZmFjdCB0aGF0IEludGVsIGRvY3VtZW50cyB0aGUgaGFyZHdhcmUgdGFzay1zd2l0Y2hpbmcgdG8KKyAqIGJlIHNsb3cgaXMgYSBmYWlybHkgcmVkIGhlcnJpbmcgLSB0aGlzIGNvZGUgaXMgbm90IG5vdGljZWFibHkKKyAqIGZhc3Rlci4gSG93ZXZlciwgdGhlcmUgX2lzXyBzb21lIHJvb20gZm9yIGltcHJvdmVtZW50IGhlcmUsCisgKiBzbyB0aGUgcGVyZm9ybWFuY2UgaXNzdWVzIG1heSBldmVudHVhbGx5IGJlIGEgdmFsaWQgcG9pbnQuCisgKiBNb3JlIGltcG9ydGFudCwgaG93ZXZlciwgaXMgdGhlIGZhY3QgdGhhdCB0aGlzIGFsbG93cyB1cyBtdWNoCisgKiBtb3JlIGZsZXhpYmlsaXR5LgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgKGluICVlYXgpIHdpbGwgYmUgdGhlICJwcmV2IiB0YXNrIGFmdGVyCisgKiB0aGUgdGFzay1zd2l0Y2gsIGFuZCBzaG93cyB1cCBpbiByZXRfZnJvbV9mb3JrIGluIGVudHJ5LlMsCisgKiBmb3IgZXhhbXBsZS4KKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGZhc3RjYWxsICogX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2ID0gJnByZXZfcC0+dGhyZWFkLAorCQkJCSAqbmV4dCA9ICZuZXh0X3AtPnRocmVhZDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKworCS8qIG5ldmVyIHB1dCBhIHByaW50ayBpbiBfX3N3aXRjaF90by4uLiBwcmludGsoKSBjYWxscyB3YWtlX3VwKigpIGluZGlyZWN0bHkgKi8KKworCV9fdW5sYXp5X2ZwdShwcmV2X3ApOworCisJLyoKKwkgKiBSZWxvYWQgZXNwMCwgTERUIGFuZCB0aGUgcGFnZSB0YWJsZSBwb2ludGVyOgorCSAqLworCWxvYWRfZXNwMCh0c3MsIG5leHQpOworCisJLyoKKwkgKiBMb2FkIHRoZSBwZXItdGhyZWFkIFRocmVhZC1Mb2NhbCBTdG9yYWdlIGRlc2NyaXB0b3IuCisJICovCisJbG9hZF9UTFMobmV4dCwgY3B1KTsKKworCS8qCisJICogU2F2ZSBhd2F5ICVmcyBhbmQgJWdzLiBObyBuZWVkIHRvIHNhdmUgJWVzIGFuZCAlZHMsIGFzCisJICogdGhvc2UgYXJlIGFsd2F5cyBrZXJuZWwgc2VnbWVudHMgd2hpbGUgaW5zaWRlIHRoZSBrZXJuZWwuCisJICovCisJYXNtIHZvbGF0aWxlKCJtb3ZsICUlZnMsJTAiOiI9bSIgKCooaW50ICopJnByZXYtPmZzKSk7CisJYXNtIHZvbGF0aWxlKCJtb3ZsICUlZ3MsJTAiOiI9bSIgKCooaW50ICopJnByZXYtPmdzKSk7CisKKwkvKgorCSAqIFJlc3RvcmUgJWZzIGFuZCAlZ3MgaWYgbmVlZGVkLgorCSAqLworCWlmICh1bmxpa2VseShwcmV2LT5mcyB8IHByZXYtPmdzIHwgbmV4dC0+ZnMgfCBuZXh0LT5ncykpIHsKKwkJbG9hZHNlZ21lbnQoZnMsIG5leHQtPmZzKTsKKwkJbG9hZHNlZ21lbnQoZ3MsIG5leHQtPmdzKTsKKwl9CisKKwkvKgorCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycworCSAqLworCWlmICh1bmxpa2VseShuZXh0LT5kZWJ1Z3JlZ1s3XSkpIHsKKwkJbG9hZGRlYnVnKG5leHQsIDApOworCQlsb2FkZGVidWcobmV4dCwgMSk7CisJCWxvYWRkZWJ1ZyhuZXh0LCAyKTsKKwkJbG9hZGRlYnVnKG5leHQsIDMpOworCQkvKiBubyA0IGFuZCA1ICovCisJCWxvYWRkZWJ1ZyhuZXh0LCA2KTsKKwkJbG9hZGRlYnVnKG5leHQsIDcpOworCX0KKworCWlmICh1bmxpa2VseShwcmV2LT5pb19iaXRtYXBfcHRyIHx8IG5leHQtPmlvX2JpdG1hcF9wdHIpKQorCQloYW5kbGVfaW9fYml0bWFwKG5leHQsIHRzcyk7CisKKwlyZXR1cm4gcHJldl9wOworfQorCithc21saW5rYWdlIGludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MuZXNwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBuZXdzcDsKKwlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOworCisJY2xvbmVfZmxhZ3MgPSByZWdzLmVieDsKKwluZXdzcCA9IHJlZ3MuZWN4OworCXBhcmVudF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MuZWR4OworCWNoaWxkX3RpZHB0ciA9IChpbnQgX191c2VyICopcmVncy5lZGk7CisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLmVzcDsKKwlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLCBwYXJlbnRfdGlkcHRyLCBjaGlsZF90aWRwdHIpOworfQorCisvKgorICogVGhpcyBpcyB0cml2aWFsLCBhbmQgb24gdGhlIGZhY2Ugb2YgaXQgbG9va3MgbGlrZSBpdAorICogY291bGQgZXF1YWxseSB3ZWxsIGJlIGRvbmUgaW4gdXNlciBtb2RlLgorICoKKyAqIE5vdCBzbywgZm9yIHF1aXRlIHVub2J2aW91cyByZWFzb25zIC0gcmVnaXN0ZXIgcHJlc3N1cmUuCisgKiBJbiB1c2VyIG1vZGUgdmZvcmsoKSBjYW5ub3QgaGF2ZSBhIHN0YWNrIGZyYW1lLCBhbmQgaWYKKyAqIGRvbmUgYnkgY2FsbGluZyB0aGUgImNsb25lKCkiIHN5c3RlbSBjYWxsIGRpcmVjdGx5LCB5b3UKKyAqIGRvIG5vdCBoYXZlIGVub3VnaCBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgdG8gaG9sZCBhbGwKKyAqIHRoZSBpbmZvcm1hdGlvbiB5b3UgbmVlZC4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsIHJlZ3MuZXNwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCWludCBlcnJvcjsKKwljaGFyICogZmlsZW5hbWU7CisKKwlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIHJlZ3MuZWJ4KTsKKwllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOworCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwKKwkJCShjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmVjeCwKKwkJCShjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmVkeCwKKwkJCSZyZWdzKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQl0YXNrX2xvY2soY3VycmVudCk7CisJCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCQl0YXNrX3VubG9jayhjdXJyZW50KTsKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHJldHVybiB1c2luZyBzeXNlbnRlci4uICovCisJCXNldF90aHJlYWRfZmxhZyhUSUZfSVJFVCk7CisJfQorCXB1dG5hbWUoZmlsZW5hbWUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworI2RlZmluZSB0b3BfZXNwICAgICAgICAgICAgICAgIChUSFJFQURfU0laRSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNkZWZpbmUgdG9wX2VicCAgICAgICAgICAgICAgICAoVEhSRUFEX1NJWkUgLSAyKnNpemVvZih1bnNpZ25lZCBsb25nKSkKKwordW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgZWJwLCBlc3AsIGVpcDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2U7CisJaW50IGNvdW50ID0gMDsKKwlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcmV0dXJuIDA7CisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOworCWVzcCA9IHAtPnRocmVhZC5lc3A7CisJaWYgKCFzdGFja19wYWdlIHx8IGVzcCA8IHN0YWNrX3BhZ2UgfHwgZXNwID4gdG9wX2VzcCtzdGFja19wYWdlKQorCQlyZXR1cm4gMDsKKwkvKiBpbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oOnN3aXRjaF90bygpIHB1c2hlcyBlYnAgbGFzdC4gKi8KKwllYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgZXNwOworCWRvIHsKKwkJaWYgKGVicCA8IHN0YWNrX3BhZ2UgfHwgZWJwID4gdG9wX2VicCtzdGFja19wYWdlKQorCQkJcmV0dXJuIDA7CisJCWVpcCA9ICoodW5zaWduZWQgbG9uZyAqKSAoZWJwKzQpOworCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhlaXApKQorCQkJcmV0dXJuIGVpcDsKKwkJZWJwID0gKih1bnNpZ25lZCBsb25nICopIGVicDsKKwl9IHdoaWxlIChjb3VudCsrIDwgMTYpOworCXJldHVybiAwOworfQorCisvKgorICogc3lzX2FsbG9jX3RocmVhZF9hcmVhOiBnZXQgYSB5ZXQgdW51c2VkIFRMUyBkZXNjcmlwdG9yIGluZGV4LgorICovCitzdGF0aWMgaW50IGdldF9mcmVlX2lkeCh2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBHRFRfRU5UUllfVExTX0VOVFJJRVM7IGlkeCsrKQorCQlpZiAoZGVzY19lbXB0eSh0LT50bHNfYXJyYXkgKyBpZHgpKQorCQkJcmV0dXJuIGlkeCArIEdEVF9FTlRSWV9UTFNfTUlOOworCXJldHVybiAtRVNSQ0g7Cit9CisKKy8qCisgKiBTZXQgYSBnaXZlbiBUTFMgZGVzY3JpcHRvcjoKKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdV9pbmZvKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCWludCBjcHUsIGlkeDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgdV9pbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZHggPSBpbmZvLmVudHJ5X251bWJlcjsKKworCS8qCisJICogaW5kZXggLTEgbWVhbnMgdGhlIGtlcm5lbCBzaG91bGQgdHJ5IHRvIGZpbmQgYW5kCisJICogYWxsb2NhdGUgYW4gZW1wdHkgZGVzY3JpcHRvcjoKKwkgKi8KKwlpZiAoaWR4ID09IC0xKSB7CisJCWlkeCA9IGdldF9mcmVlX2lkeCgpOworCQlpZiAoaWR4IDwgMCkKKwkJCXJldHVybiBpZHg7CisJCWlmIChwdXRfdXNlcihpZHgsICZ1X2luZm8tPmVudHJ5X251bWJlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoaWR4IDwgR0RUX0VOVFJZX1RMU19NSU4gfHwgaWR4ID4gR0RUX0VOVFJZX1RMU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYyA9IHQtPnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCisJLyoKKwkgKiBXZSBtdXN0IG5vdCBnZXQgcHJlZW1wdGVkIHdoaWxlIG1vZGlmeWluZyB0aGUgVExTLgorCSAqLworCWNwdSA9IGdldF9jcHUoKTsKKworCWlmIChMRFRfZW1wdHkoJmluZm8pKSB7CisJCWRlc2MtPmEgPSAwOworCQlkZXNjLT5iID0gMDsKKwl9IGVsc2UgeworCQlkZXNjLT5hID0gTERUX2VudHJ5X2EoJmluZm8pOworCQlkZXNjLT5iID0gTERUX2VudHJ5X2IoJmluZm8pOworCX0KKwlsb2FkX1RMUyh0LCBjcHUpOworCisJcHV0X2NwdSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgVGhyZWFkLUxvY2FsIFN0b3JhZ2UgYXJlYToKKyAqLworCisjZGVmaW5lIEdFVF9CQVNFKGRlc2MpICggXAorCSgoKGRlc2MpLT5hID4+IDE2KSAmIDB4MDAwMGZmZmYpIHwgXAorCSgoKGRlc2MpLT5iIDw8IDE2KSAmIDB4MDBmZjAwMDApIHwgXAorCSggKGRlc2MpLT5iICAgICAgICAmIDB4ZmYwMDAwMDApICAgKQorCisjZGVmaW5lIEdFVF9MSU1JVChkZXNjKSAoIFwKKwkoKGRlc2MpLT5hICYgMHgwZmZmZikgfCBcCisJICgoZGVzYyktPmIgJiAweGYwMDAwKSApCisJCisjZGVmaW5lIEdFVF8zMkJJVChkZXNjKQkJKCgoZGVzYyktPmIgPj4gMjIpICYgMSkKKyNkZWZpbmUgR0VUX0NPTlRFTlRTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDEwKSAmIDMpCisjZGVmaW5lIEdFVF9XUklUQUJMRShkZXNjKQkoKChkZXNjKS0+YiA+PiAgOSkgJiAxKQorI2RlZmluZSBHRVRfTElNSVRfUEFHRVMoZGVzYykJKCgoZGVzYyktPmIgPj4gMjMpICYgMSkKKyNkZWZpbmUgR0VUX1BSRVNFTlQoZGVzYykJKCgoZGVzYyktPmIgPj4gMTUpICYgMSkKKyNkZWZpbmUgR0VUX1VTRUFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gMjApICYgMSkKKworYXNtbGlua2FnZSBpbnQgc3lzX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdV9pbmZvKQoreworCXN0cnVjdCB1c2VyX2Rlc2MgaW5mbzsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmRlc2M7CisJaW50IGlkeDsKKworCWlmIChnZXRfdXNlcihpZHgsICZ1X2luZm8tPmVudHJ5X251bWJlcikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjID0gY3VycmVudC0+dGhyZWFkLnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCisJaW5mby5lbnRyeV9udW1iZXIgPSBpZHg7CisJaW5mby5iYXNlX2FkZHIgPSBHRVRfQkFTRShkZXNjKTsKKwlpbmZvLmxpbWl0ID0gR0VUX0xJTUlUKGRlc2MpOworCWluZm8uc2VnXzMyYml0ID0gR0VUXzMyQklUKGRlc2MpOworCWluZm8uY29udGVudHMgPSBHRVRfQ09OVEVOVFMoZGVzYyk7CisJaW5mby5yZWFkX2V4ZWNfb25seSA9ICFHRVRfV1JJVEFCTEUoZGVzYyk7CisJaW5mby5saW1pdF9pbl9wYWdlcyA9IEdFVF9MSU1JVF9QQUdFUyhkZXNjKTsKKwlpbmZvLnNlZ19ub3RfcHJlc2VudCA9ICFHRVRfUFJFU0VOVChkZXNjKTsKKwlpbmZvLnVzZWFibGUgPSBHRVRfVVNFQUJMRShkZXNjKTsKKworCWlmIChjb3B5X3RvX3VzZXIodV9pbmZvLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQoreworCWlmIChyYW5kb21pemVfdmFfc3BhY2UpCisJCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOworCXJldHVybiBzcCAmIH4weGY7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmYxNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtMCwwICsxLDcxNyBAQAorLyogcHRyYWNlLmMgKi8KKy8qIEJ5IFJvc3MgQmlybyAxLzIzLzkyICovCisvKgorICogUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9sZHQuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCisKKy8qIGRldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gKi8KKy8qIDEgPSBhY2Nlc3MgMCA9IG5vIGFjY2VzcyAqLworI2RlZmluZSBGTEFHX01BU0sgMHgwMDA0NGRkNQorCisvKiBzZXQncyB0aGUgdHJhcCBmbGFnLiAqLworI2RlZmluZSBUUkFQX0ZMQUcgMHgxMDAKKworLyoKKyAqIE9mZnNldCBvZiBlZmxhZ3Mgb24gY2hpbGQgc3RhY2suLgorICovCisjZGVmaW5lIEVGTF9PRkZTRVQgKChFRkwtMikqNC1zaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwdF9yZWdzICpnZXRfY2hpbGRfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdm9pZCAqc3RhY2tfdG9wID0gKHZvaWQgKil0YXNrLT50aHJlYWQuZXNwMDsKKwlyZXR1cm4gc3RhY2tfdG9wIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSB3aWxsIGdldCBhIHdvcmQgb2ZmIG9mIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4gCisgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLiAgCisgKiB0aGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGFsbCB0aGUgcHJpdmlsZWdlZCBzdGFja3MgYXJlIGluIG91cgorICogZGF0YSBzcGFjZS4KKyAqLyAgIAorc3RhdGljIGlubGluZSBpbnQgZ2V0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGNoYXIgKnN0YWNrOworCisJc3RhY2sgPSAodW5zaWduZWQgY2hhciAqKXRhc2stPnRocmVhZC5lc3AwOworCXN0YWNrICs9IG9mZnNldDsKKwlyZXR1cm4gKCooKGludCAqKXN0YWNrKSk7Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgd2lsbCBwdXQgYSB3b3JkIG9uIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4gCisgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLiAgCisgKiB0aGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGFsbCB0aGUgcHJpdmlsZWdlZCBzdGFja3MgYXJlIGluIG91cgorICogZGF0YSBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHV0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0LAorCXVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyICogc3RhY2s7CisKKwlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopIHRhc2stPnRocmVhZC5lc3AwOworCXN0YWNrICs9IG9mZnNldDsKKwkqKHVuc2lnbmVkIGxvbmcgKikgc3RhY2sgPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCXVuc2lnbmVkIGxvbmcgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJc3dpdGNoIChyZWdubyA+PiAyKSB7CisJCWNhc2UgRlM6CisJCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWNoaWxkLT50aHJlYWQuZnMgPSB2YWx1ZTsKKwkJCXJldHVybiAwOworCQljYXNlIEdTOgorCQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQkJcmV0dXJuIC1FSU87CisJCQljaGlsZC0+dGhyZWFkLmdzID0gdmFsdWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBEUzoKKwkJY2FzZSBFUzoKKwkJCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQorCQkJCXJldHVybiAtRUlPOworCQkJdmFsdWUgJj0gMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgU1M6CisJCWNhc2UgQ1M6CisJCQlpZiAoKHZhbHVlICYgMykgIT0gMykKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXZhbHVlICY9IDB4ZmZmZjsKKwkJCWJyZWFrOworCQljYXNlIEVGTDoKKwkJCXZhbHVlICY9IEZMQUdfTUFTSzsKKwkJCXZhbHVlIHw9IGdldF9zdGFja19sb25nKGNoaWxkLCBFRkxfT0ZGU0VUKSAmIH5GTEFHX01BU0s7CisJCQlicmVhazsKKwl9CisJaWYgKHJlZ25vID4gR1MqNCkKKwkJcmVnbm8gLT0gMio0OworCXB1dF9zdGFja19sb25nKGNoaWxkLCByZWdubyAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJdW5zaWduZWQgbG9uZyByZWdubykKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IH4wVUw7CisKKwlzd2l0Y2ggKHJlZ25vID4+IDIpIHsKKwkJY2FzZSBGUzoKKwkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZnM7CisJCQlicmVhazsKKwkJY2FzZSBHUzoKKwkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZ3M7CisJCQlicmVhazsKKwkJY2FzZSBEUzoKKwkJY2FzZSBFUzoKKwkJY2FzZSBTUzoKKwkJY2FzZSBDUzoKKwkJCXJldHZhbCA9IDB4ZmZmZjsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJaWYgKHJlZ25vID4gR1MqNCkKKwkJCQlyZWdubyAtPSAyKjQ7CisJCQlyZWdubyA9IHJlZ25vIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKKwkJCXJldHZhbCAmPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgcmVnbm8pOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIExEVF9TRUdNRU5UIDQKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udmVydF9laXBfdG9fbGluZWFyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgc2VnOworCisJYWRkciA9IHJlZ3MtPmVpcDsKKwlzZWcgPSByZWdzLT54Y3MgJiAweGZmZmY7CisJaWYgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spIHsKKwkJYWRkciA9IChhZGRyICYgMHhmZmZmKSArIChzZWcgPDwgNCk7CisJCXJldHVybiBhZGRyOworCX0KKworCS8qCisJICogV2UnbGwgYXNzdW1lIHRoYXQgdGhlIGNvZGUgc2VnbWVudHMgaW4gdGhlIEdEVAorCSAqIGFyZSBhbGwgemVyby1iYXNlZC4gVGhhdCBpcyBsYXJnZWx5IHRydWU6IHRoZQorCSAqIFRMUyBzZWdtZW50cyBhcmUgdXNlZCBmb3IgZGF0YSwgYW5kIHRoZSBQTlBCSU9TCisJICogYW5kIEFQTSBiaW9zIG9uZXMgd2UganVzdCBpZ25vcmUgaGVyZS4KKwkgKi8KKwlpZiAoc2VnICYgTERUX1NFR01FTlQpIHsKKwkJdTMyICpkZXNjOworCQl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwkJZG93bigmY2hpbGQtPm1tLT5jb250ZXh0LnNlbSk7CisJCWRlc2MgPSBjaGlsZC0+bW0tPmNvbnRleHQubGR0ICsgKHNlZyAmIH43KTsKKwkJYmFzZSA9IChkZXNjWzBdID4+IDE2KSB8ICgoZGVzY1sxXSAmIDB4ZmYpIDw8IDE2KSB8IChkZXNjWzFdICYgMHhmZjAwMDAwMCk7CisKKwkJLyogMTYtYml0IGNvZGUgc2VnbWVudD8gKi8KKwkJaWYgKCEoKGRlc2NbMV0gPj4gMjIpICYgMSkpCisJCQlhZGRyICY9IDB4ZmZmZjsKKwkJYWRkciArPSBiYXNlOworCQl1cCgmY2hpbGQtPm1tLT5jb250ZXh0LnNlbSk7CisJfQorCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19hdF9wb3BmKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpLCBjb3BpZWQ7CisJdW5zaWduZWQgY2hhciBvcGNvZGVbMTZdOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGNvbnZlcnRfZWlwX3RvX2xpbmVhcihjaGlsZCwgcmVncyk7CisKKwljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgb3Bjb2RlLCBzaXplb2Yob3Bjb2RlKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IGNvcGllZDsgaSsrKSB7CisJCXN3aXRjaCAob3Bjb2RlW2ldKSB7CisJCS8qIHBvcGYgKi8KKwkJY2FzZSAweDlkOgorCQkJcmV0dXJuIDE7CisJCS8qIG9wY29kZSBhbmQgYWRkcmVzcyBzaXplIHByZWZpeGVzICovCisJCWNhc2UgMHg2NjogY2FzZSAweDY3OgorCQkJY29udGludWU7CisJCS8qIGlycmVsZXZhbnQgcHJlZml4ZXMgKHNlZ21lbnQgb3ZlcnJpZGVzIGFuZCByZXBlYXRzKSAqLworCQljYXNlIDB4MjY6IGNhc2UgMHgyZToKKwkJY2FzZSAweDM2OiBjYXNlIDB4M2U6CisJCWNhc2UgMHg2NDogY2FzZSAweDY1OgorCQljYXNlIDB4ZjA6IGNhc2UgMHhmMjogY2FzZSAweGYzOgorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogcHVzaGY6IE5PVEUhIFdlIHNob3VsZCBwcm9iYWJseSBub3QgbGV0CisJCSAqIHRoZSB1c2VyIHNlZSB0aGUgVEYgYml0IGJlaW5nIHNldC4gQnV0CisJCSAqIGl0J3MgbW9yZSBwYWluIHRoYW4gaXQncyB3b3J0aCB0byBhdm9pZAorCQkgKiBpdCwgYW5kIGEgZGVidWdnZXIgY291bGQgZW11bGF0ZSB0aGlzCisJCSAqIGFsbCBpbiB1c2VyIHNwYWNlIGlmIGl0IF9yZWFsbHlfIGNhcmVzLgorCQkgKi8KKwkJY2FzZSAweDljOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zaW5nbGVzdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfY2hpbGRfcmVncyhjaGlsZCk7CisKKwkvKgorCSAqIEFsd2F5cyBzZXQgVElGX1NJTkdMRVNURVAgLSB0aGlzIGd1YXJhbnRlZXMgdGhhdCAKKwkgKiB3ZSBzaW5nbGUtc3RlcCBzeXN0ZW0gY2FsbHMgZXRjLi4gIFRoaXMgd2lsbCBhbHNvCisJICogY2F1c2UgdXMgdG8gc2V0IFRGIHdoZW4gcmV0dXJuaW5nIHRvIHVzZXIgbW9kZS4KKwkgKi8KKwlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lOR0xFU1RFUCk7CisKKwkvKgorCSAqIElmIFRGIHdhcyBhbHJlYWR5IHNldCwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZQorCSAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBUUkFQX0ZMQUcpCisJCXJldHVybjsKKworCS8qIFNldCBURiBvbiB0aGUga2VybmVsIHN0YWNrLi4gKi8KKwlyZWdzLT5lZmxhZ3MgfD0gVFJBUF9GTEFHOworCisJLyoKKwkgKiAuLmJ1dCBpZiBURiBpcyBjaGFuZ2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiB3ZSB3aWxsIHRyYWNlLAorCSAqIGRvbid0IG1hcmsgaXQgYXMgYmVpbmcgInVzIiB0aGF0IHNldCBpdCwgc28gdGhhdCB3ZQorCSAqIHdvbid0IGNsZWFyIGl0IGJ5IGhhbmQgbGF0ZXIuCisJICovCisJaWYgKGlzX2F0X3BvcGYoY2hpbGQsIHJlZ3MpKQorCQlyZXR1cm47CisJCisJY2hpbGQtPnB0cmFjZSB8PSBQVF9EVFJBQ0U7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3NpbmdsZXN0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwkvKiBBbHdheXMgY2xlYXIgVElGX1NJTkdMRVNURVAuLi4gKi8KKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TSU5HTEVTVEVQKTsKKworCS8qIEJ1dCB0b3VjaCBURiBvbmx5IGlmIGl0IHdhcyBzZXQgYnkgdXMuLiAqLworCWlmIChjaGlsZC0+cHRyYWNlICYgUFRfRFRSQUNFKSB7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2NoaWxkX3JlZ3MoY2hpbGQpOworCQlyZWdzLT5lZmxhZ3MgJj0gflRSQVBfRkxBRzsKKwkJY2hpbGQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCX0KK30KKworLyoKKyAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgorICoKKyAqIE1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuCisgKi8KK3ZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sgCisJY2xlYXJfc2luZ2xlc3RlcChjaGlsZCk7Cit9CisKKy8qCisgKiBQZXJmb3JtIGdldF90aHJlYWRfYXJlYSBvbiBiZWhhbGYgb2YgdGhlIHRyYWNlZCBjaGlsZC4KKyAqLworc3RhdGljIGludAorcHRyYWNlX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkgICAgICAgaW50IGlkeCwgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCisvKgorICogR2V0IHRoZSBjdXJyZW50IFRocmVhZC1Mb2NhbCBTdG9yYWdlIGFyZWE6CisgKi8KKworI2RlZmluZSBHRVRfQkFTRShkZXNjKSAoIFwKKwkoKChkZXNjKS0+YSA+PiAxNikgJiAweDAwMDBmZmZmKSB8IFwKKwkoKChkZXNjKS0+YiA8PCAxNikgJiAweDAwZmYwMDAwKSB8IFwKKwkoIChkZXNjKS0+YiAgICAgICAgJiAweGZmMDAwMDAwKSAgICkKKworI2RlZmluZSBHRVRfTElNSVQoZGVzYykgKCBcCisJKChkZXNjKS0+YSAmIDB4MGZmZmYpIHwgXAorCSAoKGRlc2MpLT5iICYgMHhmMDAwMCkgKQorCisjZGVmaW5lIEdFVF8zMkJJVChkZXNjKQkJKCgoZGVzYyktPmIgPj4gMjIpICYgMSkKKyNkZWZpbmUgR0VUX0NPTlRFTlRTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDEwKSAmIDMpCisjZGVmaW5lIEdFVF9XUklUQUJMRShkZXNjKQkoKChkZXNjKS0+YiA+PiAgOSkgJiAxKQorI2RlZmluZSBHRVRfTElNSVRfUEFHRVMoZGVzYykJKCgoZGVzYyktPmIgPj4gMjMpICYgMSkKKyNkZWZpbmUgR0VUX1BSRVNFTlQoZGVzYykJKCgoZGVzYyktPmIgPj4gMTUpICYgMSkKKyNkZWZpbmUgR0VUX1VTRUFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gMjApICYgMSkKKworCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjID0gY2hpbGQtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKworCWluZm8uZW50cnlfbnVtYmVyID0gaWR4OworCWluZm8uYmFzZV9hZGRyID0gR0VUX0JBU0UoZGVzYyk7CisJaW5mby5saW1pdCA9IEdFVF9MSU1JVChkZXNjKTsKKwlpbmZvLnNlZ18zMmJpdCA9IEdFVF8zMkJJVChkZXNjKTsKKwlpbmZvLmNvbnRlbnRzID0gR0VUX0NPTlRFTlRTKGRlc2MpOworCWluZm8ucmVhZF9leGVjX29ubHkgPSAhR0VUX1dSSVRBQkxFKGRlc2MpOworCWluZm8ubGltaXRfaW5fcGFnZXMgPSBHRVRfTElNSVRfUEFHRVMoZGVzYyk7CisJaW5mby5zZWdfbm90X3ByZXNlbnQgPSAhR0VUX1BSRVNFTlQoZGVzYyk7CisJaW5mby51c2VhYmxlID0gR0VUX1VTRUFCTEUoZGVzYyk7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJfZGVzYywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNldF90aHJlYWRfYXJlYSBvbiBiZWhhbGYgb2YgdGhlIHRyYWNlZCBjaGlsZC4KKyAqLworc3RhdGljIGludAorcHRyYWNlX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkgICAgICAgaW50IGlkeCwgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCB1c2VyX2Rlc2MsIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGlkeCA8IEdEVF9FTlRSWV9UTFNfTUlOIHx8IGlkeCA+IEdEVF9FTlRSWV9UTFNfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2MgPSBjaGlsZC0+dGhyZWFkLnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCWlmIChMRFRfZW1wdHkoJmluZm8pKSB7CisJCWRlc2MtPmEgPSAwOworCQlkZXNjLT5iID0gMDsKKwl9IGVsc2UgeworCQlkZXNjLT5hID0gTERUX2VudHJ5X2EoJmluZm8pOworCQlkZXNjLT5iID0gTERUX2VudHJ5X2IoJmluZm8pOworCX0KKworCXJldHVybiAwOworfQorCithc21saW5rYWdlIGludCBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CisJc3RydWN0IHVzZXIgKiBkdW1teSA9IE5VTEw7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhOworCisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSAtRVBFUk07CisJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKKwkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLworCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudC0+cGFyZW50LCBjdXJyZW50KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQkvKiBzZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgZmxhZ3MuICovCisJCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gLUVTUkNIOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJY2hpbGQgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJaWYgKGNoaWxkKQorCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoIWNoaWxkKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FUEVSTTsKKwlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLworCQlnb3RvIG91dF90c2s7CisKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7CisJCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOworCQlnb3RvIG91dF90c2s7CisJfQorCisJcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3RzazsKKworCXN3aXRjaCAocmVxdWVzdCkgeworCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KKwljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgY29waWVkOworCisJCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7CisJCXJldCA9IC1FSU87CisJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCisJCQlicmVhazsKKwkJcmV0ID0gcHV0X3VzZXIodG1wLCBkYXRhcCk7CisJCWJyZWFrOworCX0KKworCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDAgfHwgCisJCSAgICBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIDMpCisJCQlicmVhazsKKworCQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCisJCWlmKGFkZHIgPCBGUkFNRV9TSVpFKnNpemVvZihsb25nKSkKKwkJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJCWlmKGFkZHIgPj0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1swXSAmJgorCQkgICBhZGRyIDw9IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbN10peworCQkJYWRkciAtPSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzBdOworCQkJYWRkciA9IGFkZHIgPj4gMjsKKwkJCXRtcCA9IGNoaWxkLT50aHJlYWQuZGVidWdyZWdbYWRkcl07CisJCX0KKwkJcmV0ID0gcHV0X3VzZXIodG1wLCBkYXRhcCk7CisJCWJyZWFrOworCX0KKworCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLworCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgorCQlyZXQgPSAwOworCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlPOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLworCQlyZXQgPSAtRUlPOworCQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCB8fCAKKwkJICAgIGFkZHIgPiBzaXplb2Yoc3RydWN0IHVzZXIpIC0gMykKKwkJCWJyZWFrOworCisJCWlmIChhZGRyIDwgRlJBTUVfU0laRSpzaXplb2YobG9uZykpIHsKKwkJCXJldCA9IHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBXZSBuZWVkIHRvIGJlIHZlcnkgY2FyZWZ1bCBoZXJlLiAgV2UgaW1wbGljaXRseQorCQkgICB3YW50IHRvIG1vZGlmeSBhIHBvcnRpb24gb2YgdGhlIHRhc2tfc3RydWN0LCBhbmQgd2UKKwkJICAgaGF2ZSB0byBiZSBzZWxlY3RpdmUgYWJvdXQgd2hhdCBwb3J0aW9ucyB3ZSBhbGxvdyBzb21lb25lCisJCSAgIHRvIG1vZGlmeS4gKi8KKworCQkgIHJldCA9IC1FSU87CisJCSAgaWYoYWRkciA+PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzBdICYmCisJCSAgICAgYWRkciA8PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzddKXsKKworCQkJICBpZihhZGRyID09IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbNF0pIGJyZWFrOworCQkJICBpZihhZGRyID09IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbNV0pIGJyZWFrOworCQkJICBpZihhZGRyIDwgKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1s0XSAmJgorCQkJICAgICAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpID49IFRBU0tfU0laRS0zKSBicmVhazsKKwkJCSAgCisJCQkgIC8qIFNhbml0eS1jaGVjayBkYXRhLiBUYWtlIG9uZSBoYWxmLWJ5dGUgYXQgb25jZSB3aXRoCisJCQkgICAqIGNoZWNrID0gKHZhbCA+PiAoMTYgKyA0KmkpKSAmIDB4Zi4gSXQgY29udGFpbnMgdGhlCisJCQkgICAqIFIvV2kgYW5kIExFTmkgYml0czsgYml0cyAwIGFuZCAxIGFyZSBSL1dpLCBhbmQgYml0cworCQkJICAgKiAyIGFuZCAzIGFyZSBMRU5pLiBHaXZlbiBhIGxpc3Qgb2YgaW52YWxpZCB2YWx1ZXMsCisJCQkgICAqIHdlIGRvIG1hc2sgfD0gMSA8PCBpbnZhbGlkX3ZhbHVlLCBzbyB0aGF0CisJCQkgICAqIChtYXNrID4+IGNoZWNrKSAmIDEgaXMgYSBjb3JyZWN0IHRlc3QgZm9yIGludmFsaWQKKwkJCSAgICogdmFsdWVzLgorCQkJICAgKgorCQkJICAgKiBSL1dpIGNvbnRhaW5zIHRoZSB0eXBlIG9mIHRoZSBicmVha3BvaW50IC8KKwkJCSAgICogd2F0Y2hwb2ludCwgTEVOaSBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSB3YXRjaGVkCisJCQkgICAqIGRhdGEgaW4gdGhlIHdhdGNocG9pbnQgY2FzZS4KKwkJCSAgICoKKwkJCSAgICogVGhlIGludmFsaWQgdmFsdWVzIGFyZToKKwkJCSAgICogLSBMRU5pID09IDB4MTAgKHVuZGVmaW5lZCksIHNvIG1hc2sgfD0gMHgwZjAwLgorCQkJICAgKiAtIFIvV2kgPT0gMHgxMCAoYnJlYWsgb24gSS9PIHJlYWRzIG9yIHdyaXRlcyksIHNvCisJCQkgICAqICAgbWFzayB8PSAweDQ0NDQuCisJCQkgICAqIC0gUi9XaSA9PSAweDAwICYmIExFTmkgIT0gMHgwMCwgc28gd2UgaGF2ZSBtYXNrIHw9CisJCQkgICAqICAgMHgxMTEwLgorCQkJICAgKgorCQkJICAgKiBGaW5hbGx5LCBtYXNrID0gMHgwZjAwIHwgMHg0NDQ0IHwgMHgxMTEwID09IDB4NWY1NC4KKwkJCSAgICoKKwkJCSAgICogU2VlIHRoZSBJbnRlbCBNYW51YWwgIlN5c3RlbSBQcm9ncmFtbWluZyBHdWlkZSIsCisJCQkgICAqIDE1LjIuNAorCQkJICAgKgorCQkJICAgKiBOb3RlIHRoYXQgTEVOaSA9PSAweDEwIGlzIGRlZmluZWQgb24geDg2XzY0IGluIGxvbmcKKwkJCSAgICogbW9kZSAoaS5lLiBldmVuIGZvciAzMi1iaXQgdXNlcnNwYWNlIHNvZnR3YXJlLCBidXQKKwkJCSAgICogNjQtYml0IGtlcm5lbCksIHNvIHRoZSB4ODZfNjQgbWFzayB2YWx1ZSBpcyAweDU0NTQuCisJCQkgICAqIFNlZSB0aGUgQU1EIG1hbnVhbCBuby4gMjQ1OTMgKEFNRDY0IFN5c3RlbQorCQkJICAgKiBQcm9ncmFtbWluZykqLworCisJCQkgIGlmKGFkZHIgPT0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1s3XSkgeworCQkJCSAgZGF0YSAmPSB+RFJfQ09OVFJPTF9SRVNFUlZFRDsKKwkJCQkgIGZvcihpPTA7IGk8NDsgaSsrKQorCQkJCQkgIGlmICgoMHg1ZjU0ID4+ICgoZGF0YSA+PiAoMTYgKyA0KmkpKSAmIDB4ZikpICYgMSkKKwkJCQkJCSAgZ290byBvdXRfdHNrOworCQkJICB9CisKKwkJCSAgYWRkciAtPSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnOworCQkJICBhZGRyID0gYWRkciA+PiAyOworCQkJICBjaGlsZC0+dGhyZWFkLmRlYnVncmVnW2FkZHJdID0gZGF0YTsKKwkJCSAgcmV0ID0gMDsKKwkJICB9CisJCSAgYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TWVNDQUxMOgkvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLworCWNhc2UgUFRSQUNFX0NPTlQ6CS8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLworCQlyZXQgPSAtRUlPOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPiBfTlNJRykKKwkJCWJyZWFrOworCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkgeworCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQl9CisJCWVsc2UgeworCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCX0KKwkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7CisJCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCisJCWNsZWFyX3NpbmdsZXN0ZXAoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXQgPSAwOworCQlicmVhazsKKworLyoKKyAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLiAKKyAqIHBlcmhhcHMgaXQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgc3RhdHVzIHRoYXQgaXQgd2FudHMgdG8gCisgKiBleGl0LgorICovCisJY2FzZSBQVFJBQ0VfS0lMTDoKKwkJcmV0ID0gMDsKKwkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKQkvKiBhbHJlYWR5IGRlYWQgKi8KKwkJCWJyZWFrOworCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKKwkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KKwkJY2xlYXJfc2luZ2xlc3RlcChjaGlsZCk7CisJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDoJLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCisJCXJldCA9IC1FSU87CisJCWlmICgodW5zaWduZWQgbG9uZykgZGF0YSA+IF9OU0lHKQorCQkJYnJlYWs7CisJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQlzZXRfc2luZ2xlc3RlcChjaGlsZCk7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHJ1bi4gKi8KKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9ERVRBQ0g6CisJCS8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCisJCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBncCByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YXAsIEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWZvciAoIGkgPSAwOyBpIDwgRlJBTUVfU0laRSpzaXplb2YobG9uZyk7IGkgKz0gc2l6ZW9mKGxvbmcpICkgeworCQkJX19wdXRfdXNlcihnZXRyZWcoY2hpbGQsIGkpLCBkYXRhcCk7CisJCQlkYXRhcCsrOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGFwLCBGUkFNRV9TSVpFKnNpemVvZihsb25nKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlmb3IgKCBpID0gMDsgaSA8IEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpOyBpICs9IHNpemVvZihsb25nKSApIHsKKwkJCV9fZ2V0X3VzZXIodG1wLCBkYXRhcCk7CisJCQlwdXRyZWcoY2hpbGQsIGksIHRtcCk7CisJCQlkYXRhcCsrOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhcCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWlmICghdHNrX3VzZWRfbWF0aChjaGlsZCkpCisJCQlpbml0X2ZwdShjaGlsZCk7CisJCWdldF9mcHJlZ3MoKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgoY2hpbGQpOworCQlzZXRfZnByZWdzKGNoaWxkLCAoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICopZGF0YSk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQWFJFR1M6IHsgLyogR2V0IHRoZSBjaGlsZCBleHRlbmRlZCBGUFUgc3RhdGUuICovCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKQorCQkJaW5pdF9mcHUoY2hpbGQpOworCQlyZXQgPSBnZXRfZnB4cmVncygoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICopZGF0YSwgY2hpbGQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9TRVRGUFhSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgZXh0ZW5kZWQgRlBVIHN0YXRlLiAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgoY2hpbGQpOworCQlyZXQgPSBzZXRfZnB4cmVncyhjaGlsZCwgKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqKWRhdGEpOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CisJCXJldCA9IHB0cmFjZV9nZXRfdGhyZWFkX2FyZWEoY2hpbGQsIGFkZHIsCisJCQkJCShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqKSBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUE6CisJCXJldCA9IHB0cmFjZV9zZXRfdGhyZWFkX2FyZWEoY2hpbGQsIGFkZHIsCisJCQkJCShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqKSBkYXRhKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCWJyZWFrOworCX0KK291dF90c2s6CisJcHV0X3Rhc2tfc3RydWN0KGNoaWxkKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzZW5kX3NpZ3RyYXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJaW5mby5zaV9zaWdubyA9IFNJR1RSQVA7CisJaW5mby5zaV9jb2RlID0gVFJBUF9CUktQVDsKKworCS8qIFVzZXItbW9kZSBlaXA/ICovCisJaW5mby5zaV9hZGRyID0gdXNlcl9tb2RlKHJlZ3MpID8gKHZvaWQgX191c2VyICopIHJlZ3MtPmVpcCA6IE5VTEw7CisKKwkvKiBTZW5kIHVzIHRoZSBmYWtleSBTSUdUUkFQICovCisJZm9yY2Vfc2lnX2luZm8oU0lHVFJBUCwgJmluZm8sIHRzayk7Cit9CisKKy8qIG5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2FsbCBlbnRyeS9leGl0CisgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLnN5c2NhbGxfdHJhY2UKKyAqLworX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpCit2b2lkIGRvX3N5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlbnRyeWV4aXQpCit7CisJLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KKwlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPm9yaWdfZWF4KTsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkgeworCQlpZiAoIWVudHJ5ZXhpdCkKKwkJCWF1ZGl0X3N5c2NhbGxfZW50cnkoY3VycmVudCwgcmVncy0+b3JpZ19lYXgsCisJCQkJCSAgICByZWdzLT5lYngsIHJlZ3MtPmVjeCwKKwkJCQkJICAgIHJlZ3MtPmVkeCwgcmVncy0+ZXNpKTsKKwkJZWxzZQorCQkJYXVkaXRfc3lzY2FsbF9leGl0KGN1cnJlbnQsIHJlZ3MtPmVheCk7CisJfQorCisJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXJldHVybjsKKworCS8qIEZha2UgYSBkZWJ1ZyB0cmFwICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlzZW5kX3NpZ3RyYXAoY3VycmVudCwgcmVncywgMCk7CisKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlyZXR1cm47CisKKwkvKiB0aGUgMHg4MCBwcm92aWRlcyBhIHdheSBmb3IgdGhlIHRyYWNpbmcgcGFyZW50IHRvIGRpc3Rpbmd1aXNoCisJICAgYmV0d2VlbiBhIHN5c2NhbGwgc3RvcCBhbmQgU0lHVFJBUCBkZWxpdmVyeSAqLworCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSA/IDB4ODAgOiAwKSk7CisKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWY4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHdvcmstYXJvdW5kcyBmb3IgeDg2IGFuZCB4ODZfNjQgcGxhdGZvcm0gYnVncy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaW50ZWxfaXJxYmFsYW5jZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IGNvbmZpZywgcmV2OworCXUzMiB3b3JkOworCisJLyogQklPUyBtYXkgZW5hYmxlIGhhcmR3YXJlIElSUSBiYWxhbmNpbmcgZm9yCisJICogRTc1MjAvRTczMjAvRTc1MjUocmV2aXNpb24gSUQgMHg5IGFuZCBiZWxvdykKKwkgKiBiYXNlZCBwbGF0Zm9ybXMuCisJICogRGlzYWJsZSBTVyBpcnFiYWxhbmNlL2FmZmluaXR5IG9uIHRob3NlIHBsYXRmb3Jtcy4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7CisJaWYgKHJldiA+IDB4OSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwgRTc1MjAvNzMyMC83NTI1IGRldGVjdGVkLiIpOworCisJLyogZW5hYmxlIGFjY2VzcyB0byBjb25maWcgc3BhY2UqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgJmNvbmZpZyk7CisJY29uZmlnIHw9IDB4MjsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWcpOworCisJLyogcmVhZCB4VFBSIHJlZ2lzdGVyICovCisJcmF3X3BjaV9vcHMtPnJlYWQoMCwgMCwgMHg0MCwgMHg0YywgMiwgJndvcmQpOworCisJaWYgKCEod29yZCAmICgxIDw8IDEzKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGlycSBiYWxhbmNpbmcgYW5kIGFmZmluaXR5XG4iKTsKKyNpZmRlZiBDT05GSUdfSVJRQkFMQU5DRQorCQlpcnFiYWxhbmNlX2Rpc2FibGUoIiIpOworI2VuZGlmCisJCW5vaXJxZGVidWdfc2V0dXAoIiIpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCW5vX2lycV9hZmZpbml0eSA9IDE7CisjZW5kaWYKKwl9CisKKwljb25maWcgJj0gfjB4MjsKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBjb25maWcgc3BhY2UqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZjQsIGNvbmZpZyk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3MzIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTI1X01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2U5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlICJtYWNoX3JlYm9vdC5oIgorCisvKgorICogUG93ZXIgb2ZmIGZ1bmN0aW9uLCBpZiBhbnkKKyAqLwordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CisKK3N0YXRpYyBpbnQgcmVib290X21vZGU7CitzdGF0aWMgaW50IHJlYm9vdF90aHJ1X2Jpb3M7CisKKyNpZmRlZiBDT05GSUdfU01QCitpbnQgcmVib290X3NtcCA9IDA7CitzdGF0aWMgaW50IHJlYm9vdF9jcHUgPSAtMTsKKy8qIHNoYW1lbGVzc2x5IGdyYWJiZWQgZnJvbSBsaWIvdnNwcmludGYuYyBmb3IgcmVhZGFiaWxpdHkgKi8KKyNkZWZpbmUgaXNfZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKyNlbmRpZgorc3RhdGljIGludCBfX2luaXQgcmVib290X3NldHVwKGNoYXIgKnN0cikKK3sKKwl3aGlsZSgxKSB7CisJCXN3aXRjaCAoKnN0cikgeworCQljYXNlICd3JzogLyogIndhcm0iIHJlYm9vdCAobm8gbWVtb3J5IHRlc3RpbmcgZXRjKSAqLworCQkJcmVib290X21vZGUgPSAweDEyMzQ7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6IC8qICJjb2xkIiByZWJvb3QgKHdpdGggbWVtb3J5IHRlc3RpbmcgZXRjKSAqLworCQkJcmVib290X21vZGUgPSAweDA7CisJCQlicmVhazsKKwkJY2FzZSAnYic6IC8qICJiaW9zIiByZWJvb3QgYnkganVtcGluZyB0aHJvdWdoIHRoZSBCSU9TICovCisJCQlyZWJvb3RfdGhydV9iaW9zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzogLyogImhhcmQiIHJlYm9vdCBieSB0b2dnbGluZyBSRVNFVCBhbmQvb3IgY3Jhc2hpbmcgdGhlIENQVSAqLworCQkJcmVib290X3RocnVfYmlvcyA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU01QCisJCWNhc2UgJ3MnOiAvKiAic21wIiByZWJvb3QgYnkgZXhlY3V0aW5nIHJlc2V0IG9uIEJTUCBvciBvdGhlciBDUFUqLworCQkJcmVib290X3NtcCA9IDE7CisJCQlpZiAoaXNfZGlnaXQoKihzdHIrMSkpKSB7CisJCQkJcmVib290X2NwdSA9IChpbnQpICgqKHN0cisxKSAtICcwJyk7CisJCQkJaWYgKGlzX2RpZ2l0KCooc3RyKzIpKSkgCisJCQkJCXJlYm9vdF9jcHUgPSByZWJvb3RfY3B1KjEwICsgKGludCkoKihzdHIrMikgLSAnMCcpOworCQkJfQorCQkJCS8qIHdlIHdpbGwgbGVhdmUgc29ydGluZyBvdXQgdGhlIGZpbmFsIHZhbHVlIAorCQkJCXdoZW4gd2UgYXJlIHJlYWR5IHRvIHJlYm9vdCwgc2luY2Ugd2UgbWlnaHQgbm90CisgCQkJCWhhdmUgc2V0IHVwIGJvb3RfY3B1X2lkIG9yIHNtcF9udW1fY3B1ICovCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmKChzdHIgPSBzdHJjaHIoc3RyLCcsJykpICE9IE5VTEwpCisJCQlzdHIrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJyZWJvb3Q9IiwgcmVib290X3NldHVwKTsKKworLyoKKyAqIFJlYm9vdCBvcHRpb25zIGFuZCBzeXN0ZW0gYXV0by1kZXRlY3Rpb24gY29kZSBwcm92aWRlZCBieQorICogRGVsbCBJbmMuIHNvIHRoZWlyIHN5c3RlbXMgImp1c3Qgd29yayIuIDotKQorICovCisKKy8qCisgKiBTb21lIG1hY2hpbmVzIHJlcXVpcmUgdGhlICJyZWJvb3Q9YiIgIGNvbW1hbmRsaW5lIG9wdGlvbiwgdGhpcyBxdWlyayBtYWtlcyB0aGF0IGF1dG9tYXRpYy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2Jpb3NfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmICghcmVib290X3RocnVfYmlvcykgeworCQlyZWJvb3RfdGhydV9iaW9zID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgc2VyaWVzIGJvYXJkIGRldGVjdGVkLiBTZWxlY3RpbmcgQklPUy1tZXRob2QgZm9yIHJlYm9vdHMuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU29tZSBtYWNoaW5lcyByZXF1aXJlIHRoZSAicmVib290PXMiICBjb21tYW5kbGluZSBvcHRpb24sIHRoaXMgcXVpcmsgbWFrZXMgdGhhdCBhdXRvbWF0aWMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9zbXBfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoIXJlYm9vdF9zbXApIHsKKwkJcmVib290X3NtcCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIHNlcmllcyBib2FyZCBkZXRlY3RlZC4gU2VsZWN0aW5nIFNNUC1tZXRob2QgZm9yIHJlYm9vdHMuXG4iLCBkLT5pZGVudCk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIG1hY2hpbmVzIHJlcXVpcmUgdGhlICJyZWJvb3Q9YixzIiAgY29tbWFuZGxpbmUgb3B0aW9uLCB0aGlzIHF1aXJrIG1ha2VzIHRoYXQgYXV0b21hdGljLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfc21wX2Jpb3NfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXNldF9zbXBfcmVib290KGQpOworCXNldF9iaW9zX3JlYm9vdChkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgcmVib290X2RtaV90YWJsZVtdID0geworCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIERlbGwgMTMwMCdzICovCisJCS5jYWxsYmFjayA9IHNldF9zbXBfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAxMzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAxMzAwLyIpLAorCQl9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCAzMDAncyAqLworCQkuY2FsbGJhY2sgPSBzZXRfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAzMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDMwMC8iKSwKKwkJfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIERlbGwgMjQwMCdzICovCisJCS5jYWxsYmFjayA9IHNldF9iaW9zX3JlYm9vdCwKKwkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDI0MDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDI0MDAiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgcmVib290X2luaXQodm9pZCkKK3sKKwlkbWlfY2hlY2tfc3lzdGVtKHJlYm9vdF9kbWlfdGFibGUpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKHJlYm9vdF9pbml0KTsKKworLyogVGhlIGZvbGxvd2luZyBjb2RlIGFuZCBkYXRhIHJlYm9vdHMgdGhlIG1hY2hpbmUgYnkgc3dpdGNoaW5nIHRvIHJlYWwKKyAgIG1vZGUgYW5kIGp1bXBpbmcgdG8gdGhlIEJJT1MgcmVzZXQgZW50cnkgcG9pbnQsIGFzIGlmIHRoZSBDUFUgaGFzCisgICByZWFsbHkgYmVlbiByZXNldC4gIFRoZSBwcmV2aW91cyB2ZXJzaW9uIGFza2VkIHRoZSBrZXlib2FyZAorICAgY29udHJvbGxlciB0byBwdWxzZSB0aGUgQ1BVIHJlc2V0IGxpbmUsIHdoaWNoIGlzIG1vcmUgdGhvcm91Z2gsIGJ1dAorICAgZG9lc24ndCB3b3JrIHdpdGggYXQgbGVhc3Qgb25lIHR5cGUgb2YgNDg2IG1vdGhlcmJvYXJkLiAgSXQgaXMgZWFzeQorICAgdG8gc3RvcCB0aGlzIGNvZGUgd29ya2luZzsgaGVuY2UgdGhlIGNvcGlvdXMgY29tbWVudHMuICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcKK3JlYWxfbW9kZV9nZHRfZW50cmllcyBbM10gPQoreworCTB4MDAwMDAwMDAwMDAwMDAwMFVMTCwJLyogTnVsbCBkZXNjcmlwdG9yICovCisJMHgwMDAwOWEwMDAwMDBmZmZmVUxMLAkvKiAxNi1iaXQgcmVhbC1tb2RlIDY0ayBjb2RlIGF0IDB4MDAwMDAwMDAgKi8KKwkweDAwMDA5MjAwMDEwMGZmZmZVTEwJLyogMTYtYml0IHJlYWwtbW9kZSA2NGsgZGF0YSBhdCAweDAwMDAwMTAwICovCit9OworCitzdGF0aWMgc3RydWN0Cit7CisJdW5zaWduZWQgc2hvcnQgICAgICAgc2l6ZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgbG9uZyBsb25nICogYmFzZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9CityZWFsX21vZGVfZ2R0ID0geyBzaXplb2YgKHJlYWxfbW9kZV9nZHRfZW50cmllcykgLSAxLCByZWFsX21vZGVfZ2R0X2VudHJpZXMgfSwKK3JlYWxfbW9kZV9pZHQgPSB7IDB4M2ZmLCBOVUxMIH0sCitub19pZHQgPSB7IDAsIE5VTEwgfTsKKworCisvKiBUaGlzIGlzIDE2LWJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHRvIGRpc2FibGUgcGFnaW5nIGFuZCB0aGUgY2FjaGUsCisgICBzd2l0Y2ggdG8gcmVhbCBtb2RlIGFuZCBqdW1wIHRvIHRoZSBCSU9TIHJlc2V0IGNvZGUuCisKKyAgIFRoZSBpbnN0cnVjdGlvbiB0aGF0IHN3aXRjaGVzIHRvIHJlYWwgbW9kZSBieSB3cml0aW5nIHRvIENSMCBtdXN0IGJlCisgICBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhIGZhciBqdW1wIGluc3RydWN0aW9uLCB3aGljaCBzZXQgQ1MgdG8gYQorICAgdmFsaWQgdmFsdWUgZm9yIHJlYWwgbW9kZSwgYW5kIGZsdXNoZXMgdGhlIHByZWZldGNoIHF1ZXVlIHRvIGF2b2lkCisgICBydW5uaW5nIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlY29kZWQgaW4gcHJvdGVjdGVkCisgICBtb2RlLgorCisgICBDbGVhcnMgYWxsIHRoZSBmbGFncyBleGNlcHQgRVQsIGVzcGVjaWFsbHkgUEcgKHBhZ2luZyksIFBFCisgICAocHJvdGVjdGVkLW1vZGUgZW5hYmxlKSBhbmQgVFMgKHRhc2sgc3dpdGNoIGZvciBjb3Byb2Nlc3NvciBzdGF0ZQorICAgc2F2ZSkuICBGbHVzaGVzIHRoZSBUTEIgYWZ0ZXIgcGFnaW5nIGhhcyBiZWVuIGRpc2FibGVkLiAgU2V0cyBDRCBhbmQKKyAgIE5XLCB0byBkaXNhYmxlIHRoZSBjYWNoZSBvbiBhIDQ4NiwgYW5kIGludmFsaWRhdGVzIHRoZSBjYWNoZS4gIFRoaXMKKyAgIGlzIG1vcmUgbGlrZSB0aGUgc3RhdGUgb2YgYSA0ODYgYWZ0ZXIgcmVzZXQuICBJIGRvbid0IGtub3cgaWYKKyAgIHNvbWV0aGluZyBlbHNlIHNob3VsZCBiZSBkb25lIGZvciBvdGhlciBjaGlwcy4KKworICAgTW9yZSBjb3VsZCBiZSBkb25lIGhlcmUgdG8gc2V0IHVwIHRoZSByZWdpc3RlcnMgYXMgaWYgYSBDUFUgcmVzZXQgaGFkCisgICBvY2N1cnJlZDsgaG9wZWZ1bGx5IHJlYWwgQklPU3MgZG9uJ3QgYXNzdW1lIG11Y2guICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWxfbW9kZV9zd2l0Y2ggW10gPQoreworCTB4NjYsIDB4MGYsIDB4MjAsIDB4YzAsCQkJLyogICAgbW92bCAgJWNyMCwlZWF4ICAgICAgICAqLworCTB4NjYsIDB4ODMsIDB4ZTAsIDB4MTEsCQkJLyogICAgYW5kbCAgJDB4MDAwMDAwMTEsJWVheCAqLworCTB4NjYsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsCS8qICAgIG9ybCAgICQweDYwMDAwMDAwLCVlYXggKi8KKwkweDY2LCAweDBmLCAweDIyLCAweGMwLAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMCAgICAgICAgKi8KKwkweDY2LCAweDBmLCAweDIyLCAweGQ4LAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMyAgICAgICAgKi8KKwkweDY2LCAweDBmLCAweDIwLCAweGMzLAkJCS8qICAgIG1vdmwgICVjcjAsJWVieCAgICAgICAgKi8KKwkweDY2LCAweDgxLCAweGUzLCAweDAwLCAweDAwLCAweDAwLCAweDYwLAkvKiAgICBhbmRsICAkMHg2MDAwMDAwMCwlZWJ4ICovCisJMHg3NCwgMHgwMiwJCQkJLyogICAganogICAgZiAgICAgICAgICAgICAgICAqLworCTB4MGYsIDB4MDksCQkJCS8qICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgKi8KKwkweDI0LCAweDEwLAkJCQkvKiBmOiBhbmRiICAkMHgxMCxhbCAgICAgICAgICovCisJMHg2NiwgMHgwZiwgMHgyMiwgMHhjMAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMCAgICAgICAgKi8KK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBqdW1wX3RvX2Jpb3MgW10gPQoreworCTB4ZWEsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYJCS8qICAgIGxqbXAgICQweGZmZmYsJDB4MDAwMCAgKi8KK307CisKKy8qCisgKiBTd2l0Y2ggdG8gcmVhbCBtb2RlIGFuZCB0aGVuIGV4ZWN1dGUgdGhlIGNvZGUKKyAqIHNwZWNpZmllZCBieSB0aGUgY29kZSBhbmQgbGVuZ3RoIHBhcmFtZXRlcnMuCisgKiBXZSBhc3N1bWUgdGhhdCBsZW5ndGggd2lsbCBhd2F5cyBiZSBsZXNzIHRoYXQgMTAwIQorICovCit2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKmNvZGUsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBXcml0ZSB6ZXJvIHRvIENNT1MgcmVnaXN0ZXIgbnVtYmVyIDB4MGYsIHdoaWNoIHRoZSBCSU9TIFBPU1QKKwkgICByb3V0aW5lIHdpbGwgcmVjb2duaXplIGFzIHRlbGxpbmcgaXQgdG8gZG8gYSBwcm9wZXIgcmVib290LiAgKFdlbGwKKwkgICB0aGF0J3Mgd2hhdCB0aGlzIGJvb2sgaW4gZnJvbnQgb2YgbWUgc2F5cyAtLSBpdCBtYXkgb25seSBhcHBseSB0bworCSAgIHRoZSBQaG9lbml4IEJJT1MgdGhvdWdoLCBpdCdzIG5vdCBjbGVhcikuICBBdCB0aGUgc2FtZSB0aW1lLAorCSAgIGRpc2FibGUgTk1JcyBieSBzZXR0aW5nIHRoZSB0b3AgYml0IGluIHRoZSBDTU9TIGFkZHJlc3MgcmVnaXN0ZXIsCisJICAgYXMgd2UncmUgYWJvdXQgdG8gZG8gcGVjdWxpYXIgdGhpbmdzIHRvIHRoZSBDUFUuICBJJ20gbm90IHN1cmUgaWYKKwkgICBgb3V0Yl9wJyBpcyBuZWVkZWQgaW5zdGVhZCBvZiBqdXN0IGBvdXRiJy4gIFVzZSBpdCB0byBiZSBvbiB0aGUKKwkgICBzYWZlIHNpZGUuICAoWWVzLCBDTU9TX1dSSVRFIGRvZXMgb3V0Yl9wJ3MuIC0gIFBhdWwgRy4pCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlDTU9TX1dSSVRFKDB4MDAsIDB4OGYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1hcCB0aGUga2VybmVsIGF0IHZpcnR1YWwgYWRkcmVzcyB6ZXJvLCBhcyB3ZWxsIGFzIG9mZnNldCB6ZXJvCisJICAgZnJvbSB0aGUga2VybmVsIHNlZ21lbnQuICBUaGlzIGFzc3VtZXMgdGhlIGtlcm5lbCBzZWdtZW50IHN0YXJ0cyBhdAorCSAgIHZpcnR1YWwgYWRkcmVzcyBQQUdFX09GRlNFVC4gKi8KKworCW1lbWNweSAoc3dhcHBlcl9wZ19kaXIsIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QR0RfUFRSUywKKwkJc2l6ZW9mIChzd2FwcGVyX3BnX2RpciBbMF0pICogS0VSTkVMX1BHRF9QVFJTKTsKKworCS8qCisJICogVXNlIGBzd2FwcGVyX3BnX2RpcicgYXMgb3VyIHBhZ2UgZGlyZWN0b3J5LgorCSAqLworCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKKworCS8qIFdyaXRlIDB4MTIzNCB0byBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24gMHg0NzIuICBUaGUgQklPUyByZWFkcworCSAgIHRoaXMgb24gYm9vdGluZyB0byB0ZWxsIGl0IHRvICJCeXBhc3MgbWVtb3J5IHRlc3QgKGFsc28gd2FybQorCSAgIGJvb3QpIi4gIFRoaXMgc2VlbXMgbGlrZSBhIGZhaXJseSBzdGFuZGFyZCB0aGluZyB0aGF0IGdldHMgc2V0IGJ5CisJICAgUkVCT09ULkNPTSBwcm9ncmFtcywgYW5kIHRoZSBwcmV2aW91cyByZXNldCByb3V0aW5lIGRpZCB0aGlzCisJICAgdG9vLiAqLworCisJKigodW5zaWduZWQgc2hvcnQgKikweDQ3MikgPSByZWJvb3RfbW9kZTsKKworCS8qIEZvciB0aGUgc3dpdGNoIHRvIHJlYWwgbW9kZSwgY29weSBzb21lIGNvZGUgdG8gbG93IG1lbW9yeS4gIEl0IGhhcworCSAgIHRvIGJlIGluIHRoZSBmaXJzdCA2NGsgYmVjYXVzZSBpdCBpcyBydW5uaW5nIGluIDE2LWJpdCBtb2RlLCBhbmQgaXQKKwkgICBoYXMgdG8gaGF2ZSB0aGUgc2FtZSBwaHlzaWNhbCBhbmQgdmlydHVhbCBhZGRyZXNzLCBiZWNhdXNlIGl0IHR1cm5zCisJICAgb2ZmIHBhZ2luZy4gIENvcHkgaXQgbmVhciB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwYWdlLCBvdXQgb2YgdGhlIHdheQorCSAgIG9mIEJJT1MgdmFyaWFibGVzLiAqLworCisJbWVtY3B5ICgodm9pZCAqKSAoMHgxMDAwIC0gc2l6ZW9mIChyZWFsX21vZGVfc3dpdGNoKSAtIDEwMCksCisJCXJlYWxfbW9kZV9zd2l0Y2gsIHNpemVvZiAocmVhbF9tb2RlX3N3aXRjaCkpOworCW1lbWNweSAoKHZvaWQgKikgKDB4MTAwMCAtIDEwMCksIGNvZGUsIGxlbmd0aCk7CisKKwkvKiBTZXQgdXAgdGhlIElEVCBmb3IgcmVhbCBtb2RlLiAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaWR0ICUwIiA6IDogIm0iIChyZWFsX21vZGVfaWR0KSk7CisKKwkvKiBTZXQgdXAgYSBHRFQgZnJvbSB3aGljaCB3ZSBjYW4gbG9hZCBzZWdtZW50IGRlc2NyaXB0b3JzIGZvciByZWFsCisJICAgbW9kZS4gIFRoZSBHRFQgaXMgbm90IHVzZWQgaW4gcmVhbCBtb2RlOyBpdCBpcyBqdXN0IG5lZWRlZCBoZXJlIHRvCisJICAgcHJlcGFyZSB0aGUgZGVzY3JpcHRvcnMuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxnZHQgJTAiIDogOiAibSIgKHJlYWxfbW9kZV9nZHQpKTsKKworCS8qIExvYWQgdGhlIGRhdGEgc2VnbWVudCByZWdpc3RlcnMsIGFuZCB0aHVzIHRoZSBkZXNjcmlwdG9ycyByZWFkeSBmb3IKKwkgICByZWFsIG1vZGUuICBUaGUgYmFzZSBhZGRyZXNzIG9mIGVhY2ggc2VnbWVudCBpcyAweDEwMCwgMTYgdGltZXMgdGhlCisJICAgc2VsZWN0b3IgdmFsdWUgYmVpbmcgbG9hZGVkIGhlcmUuICBUaGlzIGlzIHNvIHRoYXQgdGhlIHNlZ21lbnQKKwkgICByZWdpc3RlcnMgZG9uJ3QgaGF2ZSB0byBiZSByZWxvYWRlZCBhZnRlciBzd2l0Y2hpbmcgdG8gcmVhbCBtb2RlOgorCSAgIHRoZSB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgZm9yIHJlYWwgbW9kZSBvcGVyYXRpb24gYWxyZWFkeS4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAkMHgwMDEwLCUlZWF4XG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWRzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWVzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWZzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWdzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJXNzIiA6IDogOiAiZWF4Iik7CisKKwkvKiBKdW1wIHRvIHRoZSAxNi1iaXQgY29kZSB0aGF0IHdlIGNvcGllZCBlYXJsaWVyLiAgSXQgZGlzYWJsZXMgcGFnaW5nCisJICAgYW5kIHRoZSBjYWNoZSwgc3dpdGNoZXMgdG8gcmVhbCBtb2RlLCBhbmQganVtcHMgdG8gdGhlIEJJT1MgcmVzZXQKKwkgICBlbnRyeSBwb2ludC4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGptcCAkMHgwMDA4LCUwIgorCQkJCToKKwkJCQk6ICJpIiAoKHZvaWQgKikgKDB4MTAwMCAtIHNpemVvZiAocmVhbF9tb2RlX3N3aXRjaCkgLSAxMDApKSk7Cit9CisKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBfX3VudXNlZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNwdWlkOworCQorCWNwdWlkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKworCWlmIChyZWJvb3Rfc21wKSB7CisKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHJlYm9vdF9jcHUgaXMgdmFsaWQgCisJCSAgIGlmIGl0cyBub3QsIGRlZmF1bHQgdG8gdGhlIEJTUCAqLworCQlpZiAoKHJlYm9vdF9jcHUgPT0gLTEpIHx8ICAKKwkJICAgICAgKHJlYm9vdF9jcHUgPiAoTlJfQ1BVUyAtMSkpICB8fCAKKwkJICAgICAgIXBoeXNpZF9pc3NldChjcHVpZCwgcGh5c19jcHVfcHJlc2VudF9tYXApKQorCQkJcmVib290X2NwdSA9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKKworCQlyZWJvb3Rfc21wID0gMDsgIC8qIHVzZSB0aGlzIGFzIGEgZmxhZyB0byBvbmx5IGdvIHRocm91Z2ggdGhpcyBvbmNlKi8KKwkJLyogcmUtcnVuIHRoaXMgZnVuY3Rpb24gb24gdGhlIG90aGVyIENQVXMKKwkJICAgaXQgd2lsbCBmYWxsIHRob3VnaCB0aGlzIHNlY3Rpb24gc2luY2Ugd2UgaGF2ZSAKKwkJICAgY2xlYXJlZCByZWJvb3Rfc21wLCBhbmQgZG8gdGhlIHJlYm9vdCBpZiBpdCBpcyB0aGUKKwkJICAgY29ycmVjdCBDUFUsIG90aGVyd2lzZSBpdCBoYWx0cy4gKi8KKwkJaWYgKHJlYm9vdF9jcHUgIT0gY3B1aWQpCisJCQlzbXBfY2FsbF9mdW5jdGlvbigodm9pZCAqKW1hY2hpbmVfcmVzdGFydCAsIE5VTEwsIDEsIDApOworCX0KKworCS8qIGlmIHJlYm9vdF9jcHUgaXMgc3RpbGwgLTEsIHRoZW4gd2Ugd2FudCBhIHRyYWRpb25hbCByZWJvb3QsIAorCSAgIGFuZCBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gdGhlIHJlYm9vdF9jcHUsLCBoYWx0ICovCisJaWYgKChyZWJvb3RfY3B1ICE9IC0xKSAmJiAoY3B1aWQgIT0gcmVib290X2NwdSkpIHsKKwkJZm9yICg7OykKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJobHQiKTsKKwl9CisJLyoKKwkgKiBTdG9wIGFsbCBDUFVzIGFuZCB0dXJuIG9mZiBsb2NhbCBBUElDcyBhbmQgdGhlIElPLUFQSUMsIHNvCisJICogb3RoZXIgT1NzIHNlZSBhIGNsZWFuIElSUSBzdGF0ZS4KKwkgKi8KKwlzbXBfc2VuZF9zdG9wKCk7CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisJbGFwaWNfc2h1dGRvd24oKTsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWRpc2FibGVfSU9fQVBJQygpOworI2VuZGlmCisKKwlpZiAoIXJlYm9vdF90aHJ1X2Jpb3MpIHsKKwkJaWYgKGVmaV9lbmFibGVkKSB7CisJCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9DT0xELCBFRklfU1VDQ0VTUywgMCwgTlVMTCk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCI6IDoibSIgKG5vX2lkdCkpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImludDMiKTsKKwkJfQorCQkvKiByZWJvb3RpbmcgbmVlZHMgdG8gdG91Y2ggdGhlIHBhZ2UgYXQgYWJzb2x1dGUgYWRkciAwICovCisJCSooKHVuc2lnbmVkIHNob3J0ICopX192YSgweDQ3MikpID0gcmVib290X21vZGU7CisJCWZvciAoOzspIHsKKwkJCW1hY2hfcmVib290KCk7CisJCQkvKiBUaGF0IGRpZG4ndCB3b3JrIC0gZm9yY2UgYSB0cmlwbGUgZmF1bHQuLiAqLworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpZHQgJTAiOiA6Im0iIChub19pZHQpKTsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQzIik7CisJCX0KKwl9CisJaWYgKGVmaV9lbmFibGVkKQorCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9XQVJNLCBFRklfU1VDQ0VTUywgMCwgTlVMTCk7CisKKwltYWNoaW5lX3JlYWxfcmVzdGFydChqdW1wX3RvX2Jpb3MsIHNpemVvZihqdW1wX3RvX2Jpb3MpKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQoreworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfaGFsdCk7CisKK3ZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlsYXBpY19zaHV0ZG93bigpOworCisJaWYgKGVmaV9lbmFibGVkKQorCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9TSFVURE9XTiwgRUZJX1NVQ0NFU1MsIDAsIE5VTEwpOworCWlmIChwbV9wb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZigpOworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcG93ZXJfb2ZmKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zY3gyMDAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllMjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMgCisKKyAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPgorCisgICBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBzdXBwb3J0LiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY3gyMDAuaD4KKworLyogVmVyaWZ5IHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgcmVhbGx5IGlzIHRoZXJlICovCisjZGVmaW5lIHNjeDIwMF9jYl9wcm9iZShiYXNlKSAoaW53KChiYXNlKSArIFNDeDIwMF9DQkEpID09IChiYXNlKSkKKworI2RlZmluZSBOQU1FICJzY3gyMDAiCisKK01PRFVMRV9BVVRIT1IoIkNocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOYXRTZW1pIFNDeDIwMCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwordW5zaWduZWQgc2N4MjAwX2dwaW9fYmFzZSA9IDA7Citsb25nIHNjeDIwMF9ncGlvX3NoYWRvd1syXTsKKwordW5zaWduZWQgc2N4MjAwX2NiX2Jhc2UgPSAwOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2N4MjAwX3RibFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfWEJVUykgICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDMTEwMF9YQlVTKSAgIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHNjeDIwMF90YmwpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY3gyMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzY3gyMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzY3gyMDAiLAorCS5pZF90YWJsZSA9IHNjeDIwMF90YmwsCisJLnByb2JlID0gc2N4MjAwX3Byb2JlLAorfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzY3gyMDBfZ3Bpb19jb25maWdfbG9jayk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjeDIwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgYmFuazsKKwl1bnNpZ25lZCBiYXNlOworCisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UgfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgeworCQliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyBiYXNlIDB4JXhcbiIsIGJhc2UpOworCisJCWlmIChyZXF1ZXN0X3JlZ2lvbihiYXNlLCBTQ3gyMDBfR1BJT19TSVpFLCAiTmF0U2VtaSBTQ3gyMDAgR1BJTyIpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIEkvTyBmb3IgR1BJT3NcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXNjeDIwMF9ncGlvX2Jhc2UgPSBiYXNlOworCisJCS8qIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIGRyaXZlbiBvbiB0aGUgR1BJTyBzaWduYWxzICovCisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyArK2JhbmspCisJCQlzY3gyMDBfZ3Bpb19zaGFkb3dbYmFua10gPSBpbmwoc2N4MjAwX2dwaW9fYmFzZSArIDB4MTAgKiBiYW5rKTsKKworCX0gZWxzZSB7CisJCS8qIGZpbmQgdGhlIGJhc2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gQmxvY2sgKi8KKwkJaWYgKHNjeDIwMF9jYl9wcm9iZShTQ3gyMDBfQ0JfQkFTRV9GSVhFRCkpIHsKKwkJCXNjeDIwMF9jYl9iYXNlID0gU0N4MjAwX0NCX0JBU0VfRklYRUQ7CisJCX0gZWxzZSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgU0N4MjAwX0NCQV9TQ1JBVENILCAmYmFzZSk7CisJCQlpZiAoc2N4MjAwX2NiX3Byb2JlKGJhc2UpKSB7CisJCQkJc2N4MjAwX2NiX2Jhc2UgPSBiYXNlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIE5BTUUgIjogQ29uZmlndXJhdGlvbiBCbG9jayBub3QgZm91bmRcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBDb25maWd1cmF0aW9uIEJsb2NrIGJhc2UgMHgleFxuIiwgc2N4MjAwX2NiX2Jhc2UpOworCX0KKworCXJldHVybiAwOworfQorCit1MzIgc2N4MjAwX2dwaW9fY29uZmlndXJlKGludCBpbmRleCwgdTMyIG1hc2ssIHUzMiBiaXRzKQoreworCXUzMiBjb25maWcsIG5ld19jb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3gyMDBfZ3Bpb19jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bChpbmRleCwgc2N4MjAwX2dwaW9fYmFzZSArIDB4MjApOworCWNvbmZpZyA9IGlubChzY3gyMDBfZ3Bpb19iYXNlICsgMHgyNCk7CisKKwluZXdfY29uZmlnID0gKGNvbmZpZyAmIG1hc2spIHwgYml0czsKKwlvdXRsKG5ld19jb25maWcsIHNjeDIwMF9ncGlvX2Jhc2UgKyAweDI0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjeDIwMF9ncGlvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY29uZmlnOworfQorCisjaWYgMAordm9pZCBzY3gyMDBfZ3Bpb19kdW1wKHVuc2lnbmVkIGluZGV4KQoreworCXUzMiBjb25maWcgPSBzY3gyMDBfZ3Bpb19jb25maWd1cmUoaW5kZXgsIH4wLCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiR1BJTyUwMnU6IDB4JTA4bHgiLCBpbmRleCwgKHVuc2lnbmVkIGxvbmcpY29uZmlnKTsKKwkKKwlpZiAoY29uZmlnICYgMSkgCisJCXByaW50aygiIE9FIik7IC8qIG91dHB1dCBlbmFibGVkICovCisJZWxzZQorCQlwcmludGsoIiBUUyIpOyAvKiB0cmlzdGF0ZSAqLworCWlmIChjb25maWcgJiAyKSAKKwkJcHJpbnRrKCIgUFAiKTsgLyogcHVzaCBwdWxsICovCisJZWxzZQorCQlwcmludGsoIiBPRCIpOyAvKiBvcGVuIGRyYWluICovCisJaWYgKGNvbmZpZyAmIDQpIAorCQlwcmludGsoIiBQVUUiKTsgLyogcHVsbCB1cCBlbmFibGVkICovCisJZWxzZQorCQlwcmludGsoIiBQVUQiKTsgLyogcHVsbCB1cCBkaXNhYmxlZCAqLworCWlmIChjb25maWcgJiA4KSAKKwkJcHJpbnRrKCIgTE9DS0VEIik7IC8qIGxvY2tlZCAqLworCWlmIChjb25maWcgJiAxNikgCisJCXByaW50aygiIExFVkVMIik7IC8qIGxldmVsIGlucHV0ICovCisJZWxzZQorCQlwcmludGsoIiBFREdFIik7IC8qIGVkZ2UgaW5wdXQgKi8KKwlpZiAoY29uZmlnICYgMzIpIAorCQlwcmludGsoIiBISSIpOyAvKiB0cmlnZ2VyIG9uIHJpc2luZyBlZGdlICovCisJZWxzZQorCQlwcmludGsoIiBMTyIpOyAvKiB0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZSAqLworCWlmIChjb25maWcgJiA2NCkgCisJCXByaW50aygiIERFQk9VTkNFIik7IC8qIGRlYm91bmNlICovCisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogTmF0U2VtaSBTQ3gyMDAgRHJpdmVyXG4iKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNjeDIwMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzY3gyMDBfcGNpX2RyaXZlcik7CisJcmVsZWFzZV9yZWdpb24oc2N4MjAwX2dwaW9fYmFzZSwgU0N4MjAwX0dQSU9fU0laRSk7Cit9CisKK21vZHVsZV9pbml0KHNjeDIwMF9pbml0KTsKK21vZHVsZV9leGl0KHNjeDIwMF9jbGVhbnVwKTsKKworRVhQT1JUX1NZTUJPTChzY3gyMDBfZ3Bpb19iYXNlKTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2dwaW9fc2hhZG93KTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2dwaW9fY29uZmlndXJlKTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2NiX2Jhc2UpOworCisvKgorICAgIExvY2FsIHZhcmlhYmxlczoKKyAgICAgICAgY29tcGlsZS1jb21tYW5kOiAibWFrZSAtayAtQyAuLi8uLi8uLiBTVUJESVJTPWFyY2gvaTM4Ni9rZXJuZWwgbW9kdWxlcyIKKyAgICAgICAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZjQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBpMzg2IHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTkgTGludXMgVG9ydmFsZHMKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgMTk5OSBSZWQgSGF0LCBJbmMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBydyBzZW1hcGhvcmVzIGltcGxlbWVudGVkIE5vdmVtYmVyIDE5OTkgYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qCisgKiBTZW1hcGhvcmVzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIHR3by13YXkgY291bnRlcjoKKyAqIFRoZSAiY291bnQiIHZhcmlhYmxlIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoIHByb2Nlc3MKKyAqIHRoYXQgdHJpZXMgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCB3aGlsZSB0aGUgInNsZWVwaW5nIgorICogdmFyaWFibGUgaXMgYSBjb3VudCBvZiBzdWNoIGFjcXVpcmVzLgorICoKKyAqIE5vdGFibHksIHRoZSBpbmxpbmUgInVwKCkiIGFuZCAiZG93bigpIiBmdW5jdGlvbnMgY2FuCisgKiBlZmZpY2llbnRseSB0ZXN0IGlmIHRoZXkgbmVlZCB0byBkbyBhbnkgZXh0cmEgd29yayAodXAKKyAqIG5lZWRzIHRvIGRvIHNvbWV0aGluZyBvbmx5IGlmIGNvdW50IHdhcyBuZWdhdGl2ZSBiZWZvcmUKKyAqIHRoZSBpbmNyZW1lbnQgb3BlcmF0aW9uLgorICoKKyAqICJzbGVlcGluZyIgYW5kIHRoZSBjb250ZW50aW9uIHJvdXRpbmUgb3JkZXJpbmcgaXMgcHJvdGVjdGVkCisgKiBieSB0aGUgc3BpbmxvY2sgaW4gdGhlIHNlbWFwaG9yZSdzIHdhaXRxdWV1ZSBoZWFkLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKyAqIGNvbnRlbnRpb24gb24gdGhlIGxvY2ssIGFuZCBhcyBzdWNoIGFsbCB0aGlzIGlzIHRoZQorICogIm5vbi1jcml0aWNhbCIgcGFydCBvZiB0aGUgd2hvbGUgc2VtYXBob3JlIGJ1c2luZXNzLiBUaGUKKyAqIGNyaXRpY2FsIHBhcnQgaXMgdGhlIGlubGluZSBzdHVmZiBpbiA8YXNtL3NlbWFwaG9yZS5oPgorICogd2hlcmUgd2Ugd2FudCB0byBhdm9pZCBhbnkgZXh0cmEganVtcHMgYW5kIGNhbGxzLgorICovCisKKy8qCisgKiBMb2dpYzoKKyAqICAtIG9ubHkgb24gYSBib3VuZGFyeSBjb25kaXRpb24gZG8gd2UgbmVlZCB0byBjYXJlLiBXaGVuIHdlIGdvCisgKiAgICBmcm9tIGEgbmVnYXRpdmUgY291bnQgdG8gYSBub24tbmVnYXRpdmUsIHdlIHdha2UgcGVvcGxlIHVwLgorICogIC0gd2hlbiB3ZSBnbyBmcm9tIGEgbm9uLW5lZ2F0aXZlIGNvdW50IHRvIGEgbmVnYXRpdmUgZG8gd2UKKyAqICAgIChhKSBzeW5jaHJvbml6ZSB3aXRoIHRoZSAic2xlZXBlciIgY291bnQgYW5kIChiKSBtYWtlIHN1cmUKKyAqICAgIHRoYXQgd2UncmUgb24gdGhlIHdha2V1cCBsaXN0IGJlZm9yZSB3ZSBzeW5jaHJvbml6ZSBzbyB0aGF0CisgKiAgICB3ZSBjYW5ub3QgbG9zZSB3YWtldXAgZXZlbnRzLgorICovCisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIF9fYXR0cmlidXRlX3VzZWRfXyAgX191cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgX19hdHRyaWJ1dGVfdXNlZF9fIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzay0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmVfbG9ja2VkKCZzZW0tPndhaXQsICZ3YWl0KTsKKworCXNlbS0+c2xlZXBlcnMrKzsKKwlmb3IgKDs7KSB7CisJCWludCBzbGVlcGVycyA9IHNlbS0+c2xlZXBlcnM7CisKKwkJLyoKKwkJICogQWRkICJldmVyeWJvZHkgZWxzZSIgaW50byBpdC4gVGhleSBhcmVuJ3QKKwkJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrIGluCisJCSAqIHRoZSB3YWl0X3F1ZXVlX2hlYWQuCisJCSAqLworCQlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMgLSAxLCAmc2VtLT5jb3VudCkpIHsKKwkJCXNlbS0+c2xlZXBlcnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc2VtLT5zbGVlcGVycyA9IDE7CS8qIHVzIC0gc2VlIC0xIGFib3ZlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisKKwkJc2NoZWR1bGUoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwkJdHNrLT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOworCXdha2VfdXBfbG9ja2VkKCZzZW0tPndhaXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKK30KKworc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19zY2hlZCBfX2Rvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0c2stPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOworCisJc2VtLT5zbGVlcGVycysrOworCWZvciAoOzspIHsKKwkJaW50IHNsZWVwZXJzID0gc2VtLT5zbGVlcGVyczsKKworCQkvKgorCQkgKiBXaXRoIHNpZ25hbHMgcGVuZGluZywgdGhpcyB0dXJucyBpbnRvCisJCSAqIHRoZSB0cnlsb2NrIGZhaWx1cmUgY2FzZSAtIHdlIHdvbid0IGJlCisJCSAqIHNsZWVwaW5nLCBhbmQgd2UqIGNhbid0IGdldCB0aGUgbG9jayBhcworCQkgKiBpdCBoYXMgY29udGVudGlvbi4gSnVzdCBjb3JyZWN0IHRoZSBjb3VudAorCQkgKiBhbmQgZXhpdC4KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVJTlRSOworCQkJc2VtLT5zbGVlcGVycyA9IDA7CisJCQlhdG9taWNfYWRkKHNsZWVwZXJzLCAmc2VtLT5jb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGludG8gaXQuIFRoZXkgYXJlbid0CisJCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbgorCQkgKiB3YWl0X3F1ZXVlX2hlYWQuIFRoZSAiLTEiIGlzIGJlY2F1c2Ugd2UncmUKKwkJICogc3RpbGwgaG9waW5nIHRvIGdldCB0aGUgc2VtYXBob3JlLgorCQkgKi8KKwkJaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzIC0gMSwgJnNlbS0+Y291bnQpKSB7CisJCQlzZW0tPnNsZWVwZXJzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNlbS0+c2xlZXBlcnMgPSAxOwkvKiB1cyAtIHNlZSAtMSBhYm92ZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCisJCXNjaGVkdWxlKCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJCXRzay0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlX2xvY2tlZCgmc2VtLT53YWl0LCAmd2FpdCk7CisJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKworCXRzay0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRyeWxvY2sgZmFpbGVkIC0gbWFrZSBzdXJlIHdlIGNvcnJlY3QgZm9yCisgKiBoYXZpbmcgZGVjcmVtZW50ZWQgdGhlIGNvdW50LgorICoKKyAqIFdlIGNvdWxkIGhhdmUgZG9uZSB0aGUgdHJ5bG9jayB3aXRoIGEKKyAqIHNpbmdsZSAiY21weGNoZyIgd2l0aG91dCBmYWlsdXJlIGNhc2VzLAorICogYnV0IHRoZW4gaXQgd291bGRuJ3Qgd29yayBvbiBhIDM4Ni4KKyAqLworc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlpbnQgc2xlZXBlcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCXNsZWVwZXJzID0gc2VtLT5zbGVlcGVycyArIDE7CisJc2VtLT5zbGVlcGVycyA9IDA7CisKKwkvKgorCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGFuZCB1cyBpbnRvIGl0LiBUaGV5IGFyZW4ndAorCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbiB0aGUKKwkgKiB3YWl0X3F1ZXVlX2hlYWQuCisJICovCisJaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzLCAmc2VtLT5jb3VudCkpIHsKKwkJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAorICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcworICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KKyAqIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gdGhlIHNlbWFwaG9yZS4KKyAqCisgKiAlZWF4IGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKKyAqIHJlZ2lzdGVycyAoJWVheCwgJWVkeCBhbmQgJWVjeCkgZXhjZXB0ICVlYXggd2hpc2ggaXMgZWl0aGVyIGEgcmV0dXJuCisgKiB2YWx1ZSBvciBqdXN0IGNsb2JiZXJlZC4uCisgKi8KK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRcbiIKKyJfX2Rvd25fZmFpbGVkOlxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkicHVzaGwgJWVicFxuXHQiCisJIm1vdmwgICVlc3AsJWVicFxuXHQiCisjZW5kaWYKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fZG93blxuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZVxuIgorIl9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZTpcblx0IgorI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCisJInB1c2hsICVlYnBcblx0IgorCSJtb3ZsICAlZXNwLCVlYnBcblx0IgorI2VuZGlmCisJInB1c2hsICVlZHhcblx0IgorCSJwdXNobCAlZWN4XG5cdCIKKwkiY2FsbCBfX2Rvd25faW50ZXJydXB0aWJsZVxuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRfdHJ5bG9ja1xuIgorIl9fZG93bl9mYWlsZWRfdHJ5bG9jazpcblx0IgorI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCisJInB1c2hsICVlYnBcblx0IgorCSJtb3ZsICAlZXNwLCVlYnBcblx0IgorI2VuZGlmCisJInB1c2hsICVlZHhcblx0IgorCSJwdXNobCAlZWN4XG5cdCIKKwkiY2FsbCBfX2Rvd25fdHJ5bG9ja1xuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fdXBfd2FrZXVwXG4iCisiX191cF93YWtldXA6XG5cdCIKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fdXBcblx0IgorCSJwb3BsICVlY3hcblx0IgorCSJwb3BsICVlZHhcblx0IgorCSJyZXQiCispOworCisvKgorICogcncgc3BpbmxvY2sgZmFsbGJhY2tzCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCithc20oCisiLnNlY3Rpb24gLnNjaGVkLnRleHRcbiIKKyIuYWxpZ24JNFxuIgorIi5nbG9ibAlfX3dyaXRlX2xvY2tfZmFpbGVkXG4iCisiX193cml0ZV9sb2NrX2ZhaWxlZDpcblx0IgorCUxPQ0sgImFkZGwJJCIgUldfTE9DS19CSUFTX1NUUiAiLCglZWF4KVxuIgorIjE6CXJlcDsgbm9wXG5cdCIKKwkiY21wbAkkIiBSV19MT0NLX0JJQVNfU1RSICIsKCVlYXgpXG5cdCIKKwkiam5lCTFiXG5cdCIKKwlMT0NLICJzdWJsCSQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJWVheClcblx0IgorCSJqbnoJX193cml0ZV9sb2NrX2ZhaWxlZFxuXHQiCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbgk0XG4iCisiLmdsb2JsCV9fcmVhZF9sb2NrX2ZhaWxlZFxuIgorIl9fcmVhZF9sb2NrX2ZhaWxlZDpcblx0IgorCUxPQ0sgImluY2wJKCVlYXgpXG4iCisiMToJcmVwOyBub3Bcblx0IgorCSJjbXBsCSQxLCglZWF4KVxuXHQiCisJImpzCTFiXG5cdCIKKwlMT0NLICJkZWNsCSglZWF4KVxuXHQiCisJImpzCV9fcmVhZF9sb2NrX2ZhaWxlZFxuXHQiCisJInJldCIKKyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVlYzczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC0wLDAgKzEsMTUzNSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICoKKyAqICBTdXBwb3J0IG9mIEJJR01FTSBhZGRlZCBieSBHZXJoYXJkIFdpY2hlcnQsIFNpZW1lbnMgQUcsIEp1bHkgMTk5OQorICoKKyAqICBNZW1vcnkgcmVnaW9uIHN1cHBvcnQKKyAqCURhdmlkIFBhcnNvbnMgPG9yY0BwZWxsLmNoaS5pbC51cz4sIEp1bHktQXVndXN0IDE5OTkKKyAqCisgKiAgQWRkZWQgRTgyMCBzYW5pdGl6YXRpb24gcm91dGluZSAocmVtb3ZlcyBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucyk7CisgKiAgQnJpYW4gTW95bGUgPGJtb3lsZUBtdmlzdGEuY29tPiwgRmVicnVhcnkgMjAwMQorICoKKyAqIE1vdmVkIENQVSBkZXRlY3Rpb24gY29kZSB0byBjcHUvJHtjcHV9LmMKKyAqICAgIFBhdHJpY2sgTW9jaGVsIDxtb2NoZWxAb3NkbC5vcmc+LCBNYXJjaCAyMDAyCisgKgorICogIFByb3Zpc2lvbnMgZm9yIGVtcHR5IEU4MjAgbWVtb3J5IHJlZ2lvbnMgKHJlcG9ydGVkIGJ5IGNlcnRhaW4gQklPU2VzKS4KKyAqICBBbGV4IEFjaGVuYmFjaCA8eGVsYUBzbGl0LmRlPiwgRGVjZW1iZXIgMjAwMi4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGluaXRpYWxpemF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic2V0dXBfYXJjaF9wcmUuaCIKKyNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KKworLyogVGhpcyB2YWx1ZSBpcyBzZXQgdXAgYnkgdGhlIGVhcmx5IGJvb3QgY29kZSB0byBwb2ludCB0byB0aGUgdmFsdWUKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBib290IHRpbWUgcGFnZSB0YWJsZXMuICBJdCBjb250YWlucyBhICpwaHlzaWNhbCoKKyAgIGFkZHJlc3MsIGFuZCBtdXN0IG5vdCBiZSBpbiB0aGUgLmJzcyBzZWdtZW50ISAqLwordW5zaWduZWQgbG9uZyBpbml0X3BnX3RhYmxlc19lbmQgX19pbml0ZGF0YSA9IH4wVUw7CisKK2ludCBkaXNhYmxlX3BzZSBfX2luaXRkYXRhID0gMDsKKworLyoKKyAqIE1hY2hpbmUgc2V0dXAuLgorICovCisKKyNpZmRlZiBDT05GSUdfRUZJCitpbnQgZWZpX2VuYWJsZWQgPSAwOworRVhQT1JUX1NZTUJPTChlZmlfZW5hYmxlZCk7CisjZW5kaWYKKworLyogY3B1IGRhdGEgYXMgZGV0ZWN0ZWQgYnkgdGhlIGFzc2VtYmx5IGNvZGUgaW4gaGVhZC5TICovCitzdHJ1Y3QgY3B1aW5mb194ODYgbmV3X2NwdV9kYXRhIF9faW5pdGRhdGEgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OworLyogY29tbW9uIGNwdSBkYXRhIGZvciBhbGwgY3B1cyAqLworc3RydWN0IGNwdWluZm9feDg2IGJvb3RfY3B1X2RhdGEgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OworCit1bnNpZ25lZCBsb25nIG1tdV9jcjRfZmVhdHVyZXM7CisKKyNpZmRlZglDT05GSUdfQUNQSV9JTlRFUlBSRVRFUgorCWludCBhY3BpX2Rpc2FibGVkID0gMDsKKyNlbHNlCisJaW50IGFjcGlfZGlzYWJsZWQgPSAxOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOworCisjaWZkZWYJQ09ORklHX0FDUElfQk9PVAoraW50IF9faW5pdGRhdGEgYWNwaV9mb3JjZSA9IDA7CitleHRlcm4gYWNwaV9pbnRlcnJ1cHRfZmxhZ3MJYWNwaV9zY2lfZmxhZ3M7CisjZW5kaWYKKworLyogZm9yIE1DQSwgYnV0IGFueW9uZSBlbHNlIGNhbiB1c2UgaXQgaWYgdGhleSB3YW50ICovCit1bnNpZ25lZCBpbnQgbWFjaGluZV9pZDsKK3Vuc2lnbmVkIGludCBtYWNoaW5lX3N1Ym1vZGVsX2lkOwordW5zaWduZWQgaW50IEJJT1NfcmV2aXNpb247Cit1bnNpZ25lZCBpbnQgbWNhX3BlbnRpdW1fZmxhZzsKKworLyogRm9yIFBDSSBvciBvdGhlciBtZW1vcnktbWFwcGVkIHJlc291cmNlcyAqLwordW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHgxMDAwMDAwMDsKKworLyogQm9vdCBsb2FkZXIgSUQgYXMgYW4gaW50ZWdlciwgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KK2ludCBib290bG9hZGVyX3R5cGU7CisKKy8qIHVzZXItZGVmaW5lZCBoaWdobWVtIHNpemUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlnaG1lbV9wYWdlcyA9IC0xOworCisvKgorICogU2V0dXAgb3B0aW9ucworICovCitzdHJ1Y3QgZHJpdmVfaW5mb19zdHJ1Y3QgeyBjaGFyIGR1bW15WzMyXTsgfSBkcml2ZV9pbmZvOworc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOworc3RydWN0IGFwbV9pbmZvIGFwbV9pbmZvOworc3RydWN0IHN5c19kZXNjX3RhYmxlX3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgdGFibGVbMF07Cit9Oworc3RydWN0IGVkaWRfaW5mbyBlZGlkX2luZm87CitzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CitzdHJ1Y3QgZTgyMG1hcCBlODIwOworCitleHRlcm4gdm9pZCBlYXJseV9jcHVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGRtaV9zY2FuX21hY2hpbmUodm9pZCk7CitleHRlcm4gdm9pZCBnZW5lcmljX2FwaWNfcHJvYmUoY2hhciAqKTsKK2V4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOworCit1bnNpZ25lZCBsb25nIHNhdmVkX3ZpZGVvbW9kZTsKKworI2RlZmluZSBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0sgIAkweDA3RkYKKyNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRwkJMHg4MDAwCisjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAJCisKK3N0YXRpYyBjaGFyIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisKK3Vuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBib290X3BhcmFtc1tQQVJBTV9TSVpFXTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0geworCS5uYW1lCT0gIktlcm5lbCBkYXRhIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvZGVfcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiS2VybmVsIGNvZGUiLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3lzdGVtX3JvbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTeXN0ZW0gUk9NIiwKKwkuc3RhcnQJPSAweGYwMDAwLAorCS5lbmQJPSAweGZmZmZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBleHRlbnNpb25fcm9tX3Jlc291cmNlID0geworCS5uYW1lCT0gIkV4dGVuc2lvbiBST00iLAorCS5zdGFydAk9IDB4ZTAwMDAsCisJLmVuZAk9IDB4ZWZmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFkYXB0ZXJfcm9tX3Jlc291cmNlc1tdID0geyB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAweGM4MDAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9IH07CisKKyNkZWZpbmUgQURBUFRFUl9ST01fUkVTT1VSQ0VTIFwKKwkoc2l6ZW9mIGFkYXB0ZXJfcm9tX3Jlc291cmNlcyAvIHNpemVvZiBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbMF0pCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmlkZW9fcm9tX3Jlc291cmNlID0geworCS5uYW1lIAk9ICJWaWRlbyBST00iLAorCS5zdGFydAk9IDB4YzAwMDAsCisJLmVuZAk9IDB4YzdmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZpZGVvX3JhbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJWaWRlbyBSQU0gYXJlYSIsCisJLnN0YXJ0CT0gMHhhMDAwMCwKKwkuZW5kCT0gMHhiZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdGFuZGFyZF9pb19yZXNvdXJjZXNbXSA9IHsgeworCS5uYW1lCT0gImRtYTEiLAorCS5zdGFydAk9IDB4MDAwMCwKKwkuZW5kCT0gMHgwMDFmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJwaWMxIiwKKwkuc3RhcnQJPSAweDAwMjAsCisJLmVuZAk9IDB4MDAyMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUgICA9ICJ0aW1lcjAiLAorCS5zdGFydAk9IDB4MDA0MCwKKwkuZW5kICAgID0gMHgwMDQzLAorCS5mbGFncyAgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUgICA9ICJ0aW1lcjEiLAorCS5zdGFydCAgPSAweDAwNTAsCisJLmVuZCAgICA9IDB4MDA1MywKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAia2V5Ym9hcmQiLAorCS5zdGFydAk9IDB4MDA2MCwKKwkuZW5kCT0gMHgwMDZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJkbWEgcGFnZSByZWciLAorCS5zdGFydAk9IDB4MDA4MCwKKwkuZW5kCT0gMHgwMDhmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJwaWMyIiwKKwkuc3RhcnQJPSAweDAwYTAsCisJLmVuZAk9IDB4MDBhMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAiZG1hMiIsCisJLnN0YXJ0CT0gMHgwMGMwLAorCS5lbmQJPSAweDAwZGYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gImZwdSIsCisJLnN0YXJ0CT0gMHgwMGYwLAorCS5lbmQJPSAweDAwZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSB9OworCisjZGVmaW5lIFNUQU5EQVJEX0lPX1JFU09VUkNFUyBcCisJKHNpemVvZiBzdGFuZGFyZF9pb19yZXNvdXJjZXMgLyBzaXplb2Ygc3RhbmRhcmRfaW9fcmVzb3VyY2VzWzBdKQorCisjZGVmaW5lIHJvbXNpZ25hdHVyZSh4KSAoKih1bnNpZ25lZCBzaG9ydCAqKSh4KSA9PSAweGFhNTUpCisKK3N0YXRpYyBpbnQgX19pbml0IHJvbWNoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKnJvbSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJdW5zaWduZWQgY2hhciAqcCwgc3VtID0gMDsKKworCWZvciAocCA9IHJvbTsgcCA8IHJvbSArIGxlbmd0aDsgcCsrKQorCQlzdW0gKz0gKnA7CisJcmV0dXJuIHN1bSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJvYmVfcm9tcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGxlbmd0aCwgdXBwZXI7CisJdW5zaWduZWQgY2hhciAqcm9tOworCWludAkgICAgICBpOworCisJLyogdmlkZW8gcm9tICovCisJdXBwZXIgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJZm9yIChzdGFydCA9IHZpZGVvX3JvbV9yZXNvdXJjZS5zdGFydDsgc3RhcnQgPCB1cHBlcjsgc3RhcnQgKz0gMjA0OCkgeworCQlyb20gPSBpc2FfYnVzX3RvX3ZpcnQoc3RhcnQpOworCQlpZiAoIXJvbXNpZ25hdHVyZShyb20pKQorCQkJY29udGludWU7CisKKwkJdmlkZW9fcm9tX3Jlc291cmNlLnN0YXJ0ID0gc3RhcnQ7CisKKwkJLyogMCA8IGxlbmd0aCA8PSAweDdmICogNTEyLCBoaXN0b3JpY2FsbHkgKi8KKwkJbGVuZ3RoID0gcm9tWzJdICogNTEyOworCisJCS8qIGlmIGNoZWNrc3VtIG9rYXksIHRydXN0IGxlbmd0aCBieXRlICovCisJCWlmIChsZW5ndGggJiYgcm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKQorCQkJdmlkZW9fcm9tX3Jlc291cmNlLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnZpZGVvX3JvbV9yZXNvdXJjZSk7CisJCWJyZWFrOworCX0KKworCXN0YXJ0ID0gKHZpZGVvX3JvbV9yZXNvdXJjZS5lbmQgKyAxICsgMjA0NykgJiB+MjA0N1VMOworCWlmIChzdGFydCA8IHVwcGVyKQorCQlzdGFydCA9IHVwcGVyOworCisJLyogc3lzdGVtIHJvbSAqLworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmc3lzdGVtX3JvbV9yZXNvdXJjZSk7CisJdXBwZXIgPSBzeXN0ZW1fcm9tX3Jlc291cmNlLnN0YXJ0OworCisJLyogY2hlY2sgZm9yIGV4dGVuc2lvbiByb20gKGlnbm9yZSBsZW5ndGggYnl0ZSEpICovCisJcm9tID0gaXNhX2J1c190b192aXJ0KGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQpOworCWlmIChyb21zaWduYXR1cmUocm9tKSkgeworCQlsZW5ndGggPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLmVuZCAtIGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQgKyAxOworCQlpZiAocm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKSB7CisJCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmV4dGVuc2lvbl9yb21fcmVzb3VyY2UpOworCQkJdXBwZXIgPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0OworCQl9CisJfQorCisJLyogY2hlY2sgZm9yIGFkYXB0ZXIgcm9tcyBvbiAyayBib3VuZGFyaWVzICovCisJZm9yIChpID0gMDsgaSA8IEFEQVBURVJfUk9NX1JFU09VUkNFUyAmJiBzdGFydCA8IHVwcGVyOyBzdGFydCArPSAyMDQ4KSB7CisJCXJvbSA9IGlzYV9idXNfdG9fdmlydChzdGFydCk7CisJCWlmICghcm9tc2lnbmF0dXJlKHJvbSkpCisJCQljb250aW51ZTsKKworCQkvKiAwIDwgbGVuZ3RoIDw9IDB4N2YgKiA1MTIsIGhpc3RvcmljYWxseSAqLworCQlsZW5ndGggPSByb21bMl0gKiA1MTI7CisKKwkJLyogYnV0IGFjY2VwdCBhbnkgbGVuZ3RoIHRoYXQgZml0cyBpZiBjaGVja3N1bSBva2F5ICovCisJCWlmICghbGVuZ3RoIHx8IHN0YXJ0ICsgbGVuZ3RoID4gdXBwZXIgfHwgIXJvbWNoZWNrc3VtKHJvbSwgbGVuZ3RoKSkKKwkJCWNvbnRpbnVlOworCisJCWFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXS5zdGFydCA9IHN0YXJ0OworCQlhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaV0uZW5kID0gc3RhcnQgKyBsZW5ndGggLSAxOworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXSk7CisKKwkJc3RhcnQgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaSsrXS5lbmQgJiB+MjA0N1VMOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGxpbWl0X3JlZ2lvbnModW5zaWduZWQgbG9uZyBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1cnJlbnRfYWRkciA9IDA7CisJaW50IGk7CisKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQkJY3VycmVudF9hZGRyID0gbWVtbWFwLm1hcFtpXS5waHlzX2FkZHIgKworCQkJCSAgICAgICAobWVtbWFwLm1hcFtpXS5udW1fcGFnZXMgPDwgMTIpOworCQkJaWYgKG1lbW1hcC5tYXBbaV0udHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgeworCQkJCWlmIChjdXJyZW50X2FkZHIgPj0gc2l6ZSkgeworCQkJCQltZW1tYXAubWFwW2ldLm51bV9wYWdlcyAtPQorCQkJCQkJKCgoY3VycmVudF9hZGRyLXNpemUpICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQpOworCQkJCQltZW1tYXAubnJfbWFwID0gaSArIDE7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SQU0pIHsKKwkJCWN1cnJlbnRfYWRkciA9IGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplOworCQkJaWYgKGN1cnJlbnRfYWRkciA+PSBzaXplKSB7CisJCQkJZTgyMC5tYXBbaV0uc2l6ZSAtPSBjdXJyZW50X2FkZHItc2l6ZTsKKwkJCQllODIwLm5yX21hcCA9IGkgKyAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGFkZF9tZW1vcnlfcmVnaW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit7CisJaW50IHg7CisKKwlpZiAoIWVmaV9lbmFibGVkKSB7CisgICAgICAgCQl4ID0gZTgyMC5ucl9tYXA7CisKKwkJaWYgKHggPT0gRTgyME1BWCkgeworCQkgICAgcHJpbnRrKEtFUk5fRVJSICJPb29wcyEgVG9vIG1hbnkgZW50cmllcyBpbiB0aGUgbWVtb3J5IG1hcCFcbiIpOworCQkgICAgcmV0dXJuOworCQl9CisKKwkJZTgyMC5tYXBbeF0uYWRkciA9IHN0YXJ0OworCQllODIwLm1hcFt4XS5zaXplID0gc2l6ZTsKKwkJZTgyMC5tYXBbeF0udHlwZSA9IHR5cGU7CisJCWU4MjAubnJfbWFwKys7CisJfQorfSAvKiBhZGRfbWVtb3J5X3JlZ2lvbiAqLworCisjZGVmaW5lIEU4MjBfREVCVUcJMQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRfbWVtb3J5X21hcChjaGFyICp3aG8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlwcmludGsoIiAlczogJTAxNkx4IC0gJTAxNkx4ICIsIHdobywKKwkJCWU4MjAubWFwW2ldLmFkZHIsCisJCQllODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCXN3aXRjaCAoZTgyMC5tYXBbaV0udHlwZSkgeworCQljYXNlIEU4MjBfUkFNOglwcmludGsoIih1c2FibGUpXG4iKTsKKwkJCQlicmVhazsKKwkJY2FzZSBFODIwX1JFU0VSVkVEOgorCQkJCXByaW50aygiKHJlc2VydmVkKVxuIik7CisJCQkJYnJlYWs7CisJCWNhc2UgRTgyMF9BQ1BJOgorCQkJCXByaW50aygiKEFDUEkgZGF0YSlcbiIpOworCQkJCWJyZWFrOworCQljYXNlIEU4MjBfTlZTOgorCQkJCXByaW50aygiKEFDUEkgTlZTKVxuIik7CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CXByaW50aygidHlwZSAlbHVcbiIsIGU4MjAubWFwW2ldLnR5cGUpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogU2FuaXRpemUgdGhlIEJJT1MgZTgyMCBtYXAuCisgKgorICogU29tZSBlODIwIHJlc3BvbnNlcyBpbmNsdWRlIG92ZXJsYXBwaW5nIGVudHJpZXMuICBUaGUgZm9sbG93aW5nIAorICogcmVwbGFjZXMgdGhlIG9yaWdpbmFsIGU4MjAgbWFwIHdpdGggYSBuZXcgb25lLCByZW1vdmluZyBvdmVybGFwcy4KKyAqCisgKi8KK3N0cnVjdCBjaGFuZ2VfbWVtYmVyIHsKKwlzdHJ1Y3QgZTgyMGVudHJ5ICpwYmlvczsgLyogcG9pbnRlciB0byBvcmlnaW5hbCBiaW9zIGVudHJ5ICovCisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7IC8qIGFkZHJlc3MgZm9yIHRoaXMgY2hhbmdlIHBvaW50ICovCit9Oworc3RhdGljIHN0cnVjdCBjaGFuZ2VfbWVtYmVyIGNoYW5nZV9wb2ludF9saXN0WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5ICpvdmVybGFwX2xpc3RbRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5IG5ld19iaW9zW0U4MjBNQVhdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHNhbml0aXplX2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBjaGFyICogcG5yX21hcCkKK3sKKwlzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3RtcDsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdHlwZSwgbGFzdF90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X2FkZHI7CisJaW50IGNoZ2lkeCwgc3RpbGxfY2hhbmdpbmc7CisJaW50IG92ZXJsYXBfZW50cmllczsKKwlpbnQgbmV3X2Jpb3NfZW50cnk7CisJaW50IG9sZF9uciwgbmV3X25yLCBjaGdfbnI7CisJaW50IGk7CisKKwkvKgorCQlWaXN1YWxseSB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgKDEsMiwzLDQgPSBtZW1vcnkgdHlwZXMpLi4uCisKKwkJU2FtcGxlIG1lbW9yeSBtYXAgKHcvb3ZlcmxhcHMpOgorCQkgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJCSAgIF9fX18xMTExX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgMTExMTExMTFfX19fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fMzNfXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fXzMzMzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fMjJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fMjIyMl8KKwkJICAgX19fX19fX19fMTExMTExMTExX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fXzExXworCQkgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKworCQlTYW5pdGl6ZWQgZXF1aXZhbGVudCAobm8gb3ZlcmxhcCk6CisJCSAgIDFfX19fX19fX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgX19fMV9fX19fX19fX19fX19fX19fX19fCisJCSAgIF9fX18yMl9fX19fX19fX19fX19fX19fXworCQkgICBfX19fX18xMV9fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fMV9fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX18zX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fXzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fXzJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fMV9fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX180X19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX18yX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJKi8KKworCS8qIGlmIHRoZXJlJ3Mgb25seSBvbmUgbWVtb3J5IHJlZ2lvbiwgZG9uJ3QgYm90aGVyICovCisJaWYgKCpwbnJfbWFwIDwgMikKKwkJcmV0dXJuIC0xOworCisJb2xkX25yID0gKnBucl9tYXA7CisKKwkvKiBiYWlsIG91dCBpZiB3ZSBmaW5kIGFueSB1bnJlYXNvbmFibGUgYWRkcmVzc2VzIGluIGJpb3MgbWFwICovCisJZm9yIChpPTA7IGk8b2xkX25yOyBpKyspCisJCWlmIChiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemUgPCBiaW9zbWFwW2ldLmFkZHIpCisJCQlyZXR1cm4gLTE7CisKKwkvKiBjcmVhdGUgcG9pbnRlcnMgZm9yIGluaXRpYWwgY2hhbmdlLXBvaW50IGluZm9ybWF0aW9uIChmb3Igc29ydGluZykgKi8KKwlmb3IgKGk9MDsgaSA8IDIqb2xkX25yOyBpKyspCisJCWNoYW5nZV9wb2ludFtpXSA9ICZjaGFuZ2VfcG9pbnRfbGlzdFtpXTsKKworCS8qIHJlY29yZCBhbGwga25vd24gY2hhbmdlLXBvaW50cyAoc3RhcnRpbmcgYW5kIGVuZGluZyBhZGRyZXNzZXMpLAorCSAgIG9taXR0aW5nIHRob3NlIHRoYXQgYXJlIGZvciBlbXB0eSBtZW1vcnkgcmVnaW9ucyAqLworCWNoZ2lkeCA9IDA7CisJZm9yIChpPTA7IGkgPCBvbGRfbnI7IGkrKykJeworCQlpZiAoYmlvc21hcFtpXS5zaXplICE9IDApIHsKKwkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gYmlvc21hcFtpXS5hZGRyOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGJpb3MgPSAmYmlvc21hcFtpXTsKKwkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gYmlvc21hcFtpXS5hZGRyICsgYmlvc21hcFtpXS5zaXplOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGJpb3MgPSAmYmlvc21hcFtpXTsKKwkJfQorCX0KKwljaGdfbnIgPSBjaGdpZHg7ICAgIAkvKiB0cnVlIG51bWJlciBvZiBjaGFuZ2UtcG9pbnRzICovCisKKwkvKiBzb3J0IGNoYW5nZS1wb2ludCBsaXN0IGJ5IG1lbW9yeSBhZGRyZXNzZXMgKGxvdyAtPiBoaWdoKSAqLworCXN0aWxsX2NoYW5naW5nID0gMTsKKwl3aGlsZSAoc3RpbGxfY2hhbmdpbmcpCXsKKwkJc3RpbGxfY2hhbmdpbmcgPSAwOworCQlmb3IgKGk9MTsgaSA8IGNoZ19ucjsgaSsrKSAgeworCQkJLyogaWYgPGN1cnJlbnRfYWRkcj4gPiA8bGFzdF9hZGRyPiwgc3dhcCAqLworCQkJLyogb3IsIGlmIGN1cnJlbnQ9PHN0YXJ0X2FkZHI+ICYgbGFzdD08ZW5kX2FkZHI+LCBzd2FwICovCisJCQlpZiAoKGNoYW5nZV9wb2ludFtpXS0+YWRkciA8IGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyKSB8fAorCQkJCSgoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyKSAmJgorCQkJCSAoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpXS0+cGJpb3MtPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaS0xXS0+YWRkciAhPSBjaGFuZ2VfcG9pbnRbaS0xXS0+cGJpb3MtPmFkZHIpKQorCQkJICAgKQorCQkJeworCQkJCWNoYW5nZV90bXAgPSBjaGFuZ2VfcG9pbnRbaV07CisJCQkJY2hhbmdlX3BvaW50W2ldID0gY2hhbmdlX3BvaW50W2ktMV07CisJCQkJY2hhbmdlX3BvaW50W2ktMV0gPSBjaGFuZ2VfdG1wOworCQkJCXN0aWxsX2NoYW5naW5nPTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjcmVhdGUgYSBuZXcgYmlvcyBtZW1vcnkgbWFwLCByZW1vdmluZyBvdmVybGFwcyAqLworCW92ZXJsYXBfZW50cmllcz0wOwkgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG92ZXJsYXAgdGFibGUgKi8KKwluZXdfYmlvc19lbnRyeT0wOwkgLyogaW5kZXggZm9yIGNyZWF0aW5nIG5ldyBiaW9zIG1hcCBlbnRyaWVzICovCisJbGFzdF90eXBlID0gMDsJCSAvKiBzdGFydCB3aXRoIHVuZGVmaW5lZCBtZW1vcnkgdHlwZSAqLworCWxhc3RfYWRkciA9IDA7CQkgLyogc3RhcnQgd2l0aCAwIGFzIGxhc3Qgc3RhcnRpbmcgYWRkcmVzcyAqLworCS8qIGxvb3AgdGhyb3VnaCBjaGFuZ2UtcG9pbnRzLCBkZXRlcm1pbmluZyBhZmZlY3Qgb24gdGhlIG5ldyBiaW9zIG1hcCAqLworCWZvciAoY2hnaWR4PTA7IGNoZ2lkeCA8IGNoZ19ucjsgY2hnaWR4KyspCisJeworCQkvKiBrZWVwIHRyYWNrIG9mIGFsbCBvdmVybGFwcGluZyBiaW9zIGVudHJpZXMgKi8KKwkJaWYgKGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID09IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5wYmlvcy0+YWRkcikKKwkJeworCQkJLyogYWRkIG1hcCBlbnRyeSB0byBvdmVybGFwIGxpc3QgKD4gMSBlbnRyeSBpbXBsaWVzIGFuIG92ZXJsYXApICovCisJCQlvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzKytdPWNoYW5nZV9wb2ludFtjaGdpZHhdLT5wYmlvczsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3QgKG9yZGVyIGluZGVwZW5kZW50LCBzbyBzd2FwIHdpdGggbGFzdCkgKi8KKwkJCWZvciAoaT0wOyBpPG92ZXJsYXBfZW50cmllczsgaSsrKQorCQkJeworCQkJCWlmIChvdmVybGFwX2xpc3RbaV0gPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zKQorCQkJCQlvdmVybGFwX2xpc3RbaV0gPSBvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzLTFdOworCQkJfQorCQkJb3ZlcmxhcF9lbnRyaWVzLS07CisJCX0KKwkJLyogaWYgdGhlcmUgYXJlIG92ZXJsYXBwaW5nIGVudHJpZXMsIGRlY2lkZSB3aGljaCAidHlwZSIgdG8gdXNlICovCisJCS8qIChsYXJnZXIgdmFsdWUgdGFrZXMgcHJlY2VkZW5jZSAtLSAxPXVzYWJsZSwgMiwzLDQsNCs9dW51c2FibGUpICovCisJCWN1cnJlbnRfdHlwZSA9IDA7CisJCWZvciAoaT0wOyBpPG92ZXJsYXBfZW50cmllczsgaSsrKQorCQkJaWYgKG92ZXJsYXBfbGlzdFtpXS0+dHlwZSA+IGN1cnJlbnRfdHlwZSkKKwkJCQljdXJyZW50X3R5cGUgPSBvdmVybGFwX2xpc3RbaV0tPnR5cGU7CisJCS8qIGNvbnRpbnVlIGJ1aWxkaW5nIHVwIG5ldyBiaW9zIG1hcCBiYXNlZCBvbiB0aGlzIGluZm9ybWF0aW9uICovCisJCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlKQl7CisJCQlpZiAobGFzdF90eXBlICE9IDApCSB7CisJCQkJbmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgPQorCQkJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciAtIGxhc3RfYWRkcjsKKwkJCQkvKiBtb3ZlIGZvcndhcmQgb25seSBpZiB0aGUgbmV3IHNpemUgd2FzIG5vbi16ZXJvICovCisJCQkJaWYgKG5ld19iaW9zW25ld19iaW9zX2VudHJ5XS5zaXplICE9IDApCisJCQkJCWlmICgrK25ld19iaW9zX2VudHJ5ID49IEU4MjBNQVgpCisJCQkJCQlicmVhazsgCS8qIG5vIG1vcmUgc3BhY2UgbGVmdCBmb3IgbmV3IGJpb3MgZW50cmllcyAqLworCQkJfQorCQkJaWYgKGN1cnJlbnRfdHlwZSAhPSAwKQl7CisJCQkJbmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLmFkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0udHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJCQlsYXN0X2FkZHI9Y2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHI7CisJCQl9CisJCQlsYXN0X3R5cGUgPSBjdXJyZW50X3R5cGU7CisJCX0KKwl9CisJbmV3X25yID0gbmV3X2Jpb3NfZW50cnk7ICAgLyogcmV0YWluIGNvdW50IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCisKKwkvKiBjb3B5IG5ldyBiaW9zIG1hcHBpbmcgaW50byBvcmlnaW5hbCBsb2NhdGlvbiAqLworCW1lbWNweShiaW9zbWFwLCBuZXdfYmlvcywgbmV3X25yKnNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSk7CisJKnBucl9tYXAgPSBuZXdfbnI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgdGhlIEJJT1MgZTgyMCBtYXAgaW50byBhIHNhZmUgcGxhY2UuCisgKgorICogU2FuaXR5LWNoZWNrIGl0IHdoaWxlIHdlJ3JlIGF0IGl0Li4KKyAqCisgKiBJZiB3ZSdyZSBsdWNreSBhbmQgbGl2ZSBvbiBhIG1vZGVybiBzeXN0ZW0sIHRoZSBzZXR1cCBjb2RlCisgKiB3aWxsIGhhdmUgZ2l2ZW4gdXMgYSBtZW1vcnkgbWFwIHRoYXQgd2UgY2FuIHVzZSB0byBwcm9wZXJseQorICogc2V0IHVwIG1lbW9yeS4gIElmIHdlIGFyZW4ndCwgd2UnbGwgZmFrZSBhIG1lbW9yeSBtYXAuCisgKgorICogV2UgY2hlY2sgdG8gc2VlIHRoYXQgdGhlIG1lbW9yeSBtYXAgY29udGFpbnMgYXQgbGVhc3QgMiBlbGVtZW50cworICogYmVmb3JlIHdlJ2xsIHVzZSBpdCwgYmVjYXVzZSB0aGUgZGV0ZWN0aW9uIGNvZGUgaW4gc2V0dXAuUyBtYXkKKyAqIG5vdCBiZSBwZXJmZWN0IGFuZCBtb3N0IGV2ZXJ5IFBDIGtub3duIHRvIG1hbiBoYXMgdHdvIG1lbW9yeQorICogcmVnaW9uczogb25lIGZyb20gMCB0byA2NDBrLCBhbmQgb25lIGZyb20gMW1iIHVwLiAgKFRoZSBJQk0KKyAqIHRoaW5rcGFkIDU2MHgsIGZvciBleGFtcGxlLCBkb2VzIG5vdCBjb29wZXJhdGUgd2l0aCB0aGUgbWVtb3J5CisgKiBkZXRlY3Rpb24gY29kZS4pCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvcHlfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGludCBucl9tYXApCit7CisJLyogT25seSBvbmUgbWVtb3J5IHJlZ2lvbiAob3IgbmVnYXRpdmUpPyBJZ25vcmUgaXQgKi8KKwlpZiAobnJfbWFwIDwgMikKKwkJcmV0dXJuIC0xOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBiaW9zbWFwLT5hZGRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IGJpb3NtYXAtPnNpemU7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIHNpemU7CisJCXVuc2lnbmVkIGxvbmcgdHlwZSA9IGJpb3NtYXAtPnR5cGU7CisKKwkJLyogT3ZlcmZsb3cgaW4gNjQgYml0cz8gSWdub3JlIHRoZSBtZW1vcnkgbWFwLiAqLworCQlpZiAoc3RhcnQgPiBlbmQpCisJCQlyZXR1cm4gLTE7CisKKwkJLyoKKwkJICogU29tZSBCSU9TZXMgY2xhaW0gUkFNIGluIHRoZSA2NDBrIC0gMU0gcmVnaW9uLgorCQkgKiBOb3QgcmlnaHQuIEZpeCBpdCB1cC4KKwkJICovCisJCWlmICh0eXBlID09IEU4MjBfUkFNKSB7CisJCQlpZiAoc3RhcnQgPCAweDEwMDAwMFVMTCAmJiBlbmQgPiAweEEwMDAwVUxMKSB7CisJCQkJaWYgKHN0YXJ0IDwgMHhBMDAwMFVMTCkKKwkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIDB4QTAwMDBVTEwtc3RhcnQsIHR5cGUpOworCQkJCWlmIChlbmQgPD0gMHgxMDAwMDBVTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCXN0YXJ0ID0gMHgxMDAwMDBVTEw7CisJCQkJc2l6ZSA9IGVuZCAtIHN0YXJ0OworCQkJfQorCQl9CisJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0LCBzaXplLCB0eXBlKTsKKwl9IHdoaWxlIChiaW9zbWFwKyssLS1ucl9tYXApOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfRUREKSB8fCBkZWZpbmVkKENPTkZJR19FRERfTU9EVUxFKQorc3RydWN0IGVkZCBlZGQ7CisjaWZkZWYgQ09ORklHX0VERF9NT0RVTEUKK0VYUE9SVF9TWU1CT0woZWRkKTsKKyNlbmRpZgorLyoqCisgKiBjb3B5X2VkZCgpIC0gQ29weSB0aGUgQklPUyBFREQgaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICBmcm9tIGJvb3RfcGFyYW1zIGludG8gYSBzYWZlIHBsYWNlLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZWRkKHZvaWQpCit7CisgICAgIG1lbWNweShlZGQubWJyX3NpZ25hdHVyZSwgRUREX01CUl9TSUdOQVRVUkUsIHNpemVvZihlZGQubWJyX3NpZ25hdHVyZSkpOworICAgICBtZW1jcHkoZWRkLmVkZF9pbmZvLCBFRERfQlVGLCBzaXplb2YoZWRkLmVkZF9pbmZvKSk7CisgICAgIGVkZC5tYnJfc2lnbmF0dXJlX25yID0gRUREX01CUl9TSUdfTlI7CisgICAgIGVkZC5lZGRfaW5mb19uciA9IEVERF9OUjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9lZGQodm9pZCkKK3sKK30KKyNlbmRpZgorCisvKgorICogRG8gTk9UIEVWRVIgbG9vayBhdCB0aGUgQklPUyBtZW1vcnkgc2l6ZSBsb2NhdGlvbi4KKyAqIEl0IGRvZXMgbm90IHdvcmsgb24gbWFueSBtYWNoaW5lcy4KKyAqLworI2RlZmluZSBMT1dNRU1TSVpFKCkJKDB4OWYwMDApCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9jbWRsaW5lX2Vhcmx5IChjaGFyICoqIGNtZGxpbmVfcCkKK3sKKwljaGFyIGMgPSAnICcsICp0byA9IGNvbW1hbmRfbGluZSwgKmZyb20gPSBzYXZlZF9jb21tYW5kX2xpbmU7CisJaW50IGxlbiA9IDA7CisJaW50IHVzZXJkZWYgPSAwOworCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCXNhdmVkX2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRS0xXSA9ICdcMCc7CisKKwlmb3IgKDs7KSB7CisJCWlmIChjICE9ICcgJykKKwkJCWdvdG8gbmV4dF9jaGFyOworCQkvKgorCQkgKiAibWVtPW5vcGVudGl1bSIgZGlzYWJsZXMgdGhlIDRNQiBwYWdlIHRhYmxlcy4KKwkJICogIm1lbT1YWFhba0ttTV0iIGRlZmluZXMgYSBtZW1vcnkgcmVnaW9uIGZyb20gSElHSF9NRU0KKwkJICogdG8gPG1lbT4sIG92ZXJyaWRpbmcgdGhlIGJpb3Mgc2l6ZS4KKwkJICogIm1lbW1hcD1YWFhbS2ttTV1AWFhYW0trbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbiBmcm9tCisJCSAqIDxzdGFydD4gdG8gPHN0YXJ0Pis8bWVtPiwgb3ZlcnJpZGluZyB0aGUgYmlvcyBzaXplLgorCQkgKgorCQkgKiBIUEEgdGVsbHMgbWUgYm9vdGxvYWRlcnMgbmVlZCB0byBwYXJzZSBtZW09LCBzbyBubyBuZXcKKwkJICogb3B0aW9uIHNob3VsZCBiZSBtZW09ICBbYWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0XQorCQkgKi8KKwkJaWYgKCFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgeworCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKKwkJCQl0by0tOworCQkJaWYgKCFtZW1jbXAoZnJvbSs0LCAibm9wZW50aXVtIiwgOSkpIHsKKwkJCQlmcm9tICs9IDkrNDsKKwkJCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfUFNFLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwkJCQlkaXNhYmxlX3BzZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBtZW1vcnkgc2l6ZSwgd2UKKwkJCQkgKiBsaW1pdCB0aGUgQklPUy1wcm92aWRlZCBtZW1vcnkgbWFwIHRvCisJCQkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisJCQkJICogdGhlIGV4YWN0IG1hcC4gbWVtPW51bWJlciBjYW4gYmUgdXNlZCB0bworCQkJCSAqIHRyaW0gdGhlIGV4aXN0aW5nIG1lbW9yeSBtYXAuCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9zaXplOworIAorCQkJCW1lbV9zaXplID0gbWVtcGFyc2UoZnJvbSs0LCAmZnJvbSk7CisJCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7CisJCQkJdXNlcmRlZj0xOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibWVtbWFwPSIsIDcpKSB7CisJCQlpZiAodG8gIT0gY29tbWFuZF9saW5lKQorCQkJCXRvLS07CisJCQlpZiAoIW1lbWNtcChmcm9tKzcsICJleGFjdG1hcCIsIDgpKSB7CisJCQkJZnJvbSArPSA4Kzc7CisJCQkJZTgyMC5ucl9tYXAgPSAwOworCQkJCXVzZXJkZWYgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCisJCQkJICogbGltaXQgdGhlIEJJT1MtcHJvdmlkZWQgbWVtb3J5IG1hcCB0bworCQkJCSAqIHRoYXQgc2l6ZS4gZXhhY3RtYXAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorCQkJCSAqIHRoZSBleGFjdCBtYXAuIG1lbT1udW1iZXIgY2FuIGJlIHVzZWQgdG8KKwkJCQkgKiB0cmltIHRoZSBleGlzdGluZyBtZW1vcnkgbWFwLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF9hdCwgbWVtX3NpemU7CisgCisJCQkJbWVtX3NpemUgPSBtZW1wYXJzZShmcm9tKzcsICZmcm9tKTsKKwkJCQlpZiAoKmZyb20gPT0gJ0AnKSB7CisJCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SQU0pOworCQkJCX0gZWxzZSBpZiAoKmZyb20gPT0gJyMnKSB7CisJCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9BQ1BJKTsKKwkJCQl9IGVsc2UgaWYgKCpmcm9tID09ICckJykgeworCQkJCQlzdGFydF9hdCA9IG1lbXBhcnNlKGZyb20rMSwgJmZyb20pOworCQkJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfUkVTRVJWRUQpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpbWl0X3JlZ2lvbnMobWVtX3NpemUpOworCQkJCQl1c2VyZGVmPTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibm9leGVjPSIsIDcpKQorCQkJbm9leGVjX3NldHVwKGZyb20gKyA3KTsKKworCisjaWZkZWYgIENPTkZJR19YODZfU01QCisJCS8qCisJCSAqIElmIHRoZSBCSU9TIGVudW1lcmF0ZXMgcGh5c2ljYWwgcHJvY2Vzc29ycyBiZWZvcmUgbG9naWNhbCwKKwkJICogbWF4Y3B1cz1OIGF0IGVudW1lcmF0aW9uLXRpbWUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVC4KKwkJICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgIm1heGNwdXM9IiwgOCkpIHsKKwkJCWV4dGVybiB1bnNpZ25lZCBpbnQgbWF4Y3B1czsKKworCQkJbWF4Y3B1cyA9IHNpbXBsZV9zdHJ0b3VsKGZyb20gKyA4LCBOVUxMLCAwKTsKKwkJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisJCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9b2ZmIiwgOCkpIHsKKwkJCWRpc2FibGVfYWNwaSgpOworCQl9CisKKwkJLyogYWNwaT1mb3JjZSB0byBvdmVyLXJpZGUgYmxhY2stbGlzdCAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPWZvcmNlIiwgMTApKSB7CisJCQlhY3BpX2ZvcmNlID0gMTsKKwkJCWFjcGlfaHQgPSAxOworCQkJYWNwaV9kaXNhYmxlZCA9IDA7CisJCX0KKworCQkvKiBhY3BpPXN0cmljdCBkaXNhYmxlcyBvdXQtb2Ytc3BlYyB3b3JrYXJvdW5kcyAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPXN0cmljdCIsIDExKSkgeworCQkJYWNwaV9zdHJpY3QgPSAxOworCQl9CisKKwkJLyogTGltaXQgQUNQSSBqdXN0IHRvIGJvb3QtdGltZSB0byBlbmFibGUgSFQgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1odCIsIDcpKSB7CisJCQlpZiAoIWFjcGlfZm9yY2UpCisJCQkJZGlzYWJsZV9hY3BpKCk7CisJCQlhY3BpX2h0ID0gMTsKKwkJfQorCQkKKwkJLyogInBjaT1ub2FjcGkiIGRpc2FibGUgQUNQSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAicGNpPW5vYWNwaSIsIDEwKSkgeworCQkJYWNwaV9kaXNhYmxlX3BjaSgpOworCQl9CisJCS8qICJhY3BpPW5vaXJxIiBkaXNhYmxlcyBBQ1BJIGludGVycnVwdCByb3V0aW5nICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9bm9pcnEiLCAxMCkpIHsKKwkJCWFjcGlfbm9pcnFfc2V0KCk7CisJCX0KKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1lZGdlIiwgMTMpKQorCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9ICAxOworCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGlfc2NpPWxldmVsIiwgMTQpKQorCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9zY2k9aGlnaCIsIDEzKSkKKwkJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMTsKKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1sb3ciLCAxMikpCisJCQlhY3BpX3NjaV9mbGFncy5wb2xhcml0eSA9IDM7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIiwgMjQpKQorCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCS8qIGRpc2FibGUgSU8tQVBJQyAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2FwaWMiLCA2KSkKKwkJCWRpc2FibGVfaW9hcGljX3NldHVwKCk7CisjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCisjZW5kaWYgLyogQ09ORklHX0FDUElfQk9PVCAqLworCisJCS8qCisJCSAqIGhpZ2htZW09c2l6ZSBmb3JjZXMgaGlnaG1lbSB0byBiZSBleGFjdGx5ICdzaXplJyBieXRlcy4KKwkJICogVGhpcyB3b3JrcyBldmVuIG9uIGJveGVzIHRoYXQgaGF2ZSBubyBoaWdobWVtIG90aGVyd2lzZS4KKwkJICogVGhpcyBhbHNvIHdvcmtzIHRvIHJlZHVjZSBoaWdobWVtIHNpemUgb24gYmlnZ2VyIGJveGVzLgorCQkgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiaGlnaG1lbT0iLCA4KSkKKwkJCWhpZ2htZW1fcGFnZXMgPSBtZW1wYXJzZShmcm9tKzgsICZmcm9tKSA+PiBQQUdFX1NISUZUOworCQorCQkvKgorCQkgKiB2bWFsbG9jPXNpemUgZm9yY2VzIHRoZSB2bWFsbG9jIGFyZWEgdG8gYmUgZXhhY3RseSAnc2l6ZScKKwkJICogYnl0ZXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgKG9yIGRlY3JlYXNlKSB0aGUKKwkJICogdm1hbGxvYyBhcmVhIC0gdGhlIGRlZmF1bHQgaXMgMTI4bS4KKwkJICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgInZtYWxsb2M9IiwgOCkpCisJCQlfX1ZNQUxMT0NfUkVTRVJWRSA9IG1lbXBhcnNlKGZyb20rOCwgJmZyb20pOworCisJbmV4dF9jaGFyOgorCQljID0gKihmcm9tKyspOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJaWYgKENPTU1BTkRfTElORV9TSVpFIDw9ICsrbGVuKQorCQkJYnJlYWs7CisJCSoodG8rKykgPSBjOworCX0KKwkqdG8gPSAnXDAnOworCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CisJaWYgKHVzZXJkZWYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXNlci1kZWZpbmVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKKwkJcHJpbnRfbWVtb3J5X21hcCgidXNlciIpOworCX0KK30KKworLyoKKyAqIENhbGxiYWNrIGZvciBlZmlfbWVtb3J5X3dhbGsuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitlZmlfZmluZF9tYXhfcGZuKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyAqbWF4X3BmbiA9IGFyZywgcGZuOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXBmbiA9IFBGTl9VUChlbmQgLTEpOworCQlpZiAocGZuID4gKm1heF9wZm4pCisJCQkqbWF4X3BmbiA9IHBmbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKKyAqLwordm9pZCBfX2luaXQgZmluZF9tYXhfcGZuKHZvaWQpCit7CisJaW50IGk7CisKKwltYXhfcGZuID0gMDsKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZWZpX21lbW1hcF93YWxrKGVmaV9maW5kX21heF9wZm4sICZtYXhfcGZuKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwkJLyogUkFNPyAqLworCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKKwkJCWNvbnRpbnVlOworCQlzdGFydCA9IFBGTl9VUChlODIwLm1hcFtpXS5hZGRyKTsKKwkJZW5kID0gUEZOX0RPV04oZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUpOworCQlpZiAoc3RhcnQgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmIChlbmQgPiBtYXhfcGZuKQorCQkJbWF4X3BmbiA9IGVuZDsKKwl9Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgbG93IGFuZCBoaWdoIG1lbW9yeSByYW5nZXM6CisgKi8KK3Vuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfbWF4X2xvd19wZm4odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuOworCisJbWF4X2xvd19wZm4gPSBtYXhfcGZuOworCWlmIChtYXhfbG93X3BmbiA+IE1BWE1FTV9QRk4pIHsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgPT0gLTEpCisJCQloaWdobWVtX3BhZ2VzID0gbWF4X3BmbiAtIE1BWE1FTV9QRk47CisJCWlmIChoaWdobWVtX3BhZ2VzICsgTUFYTUVNX1BGTiA8IG1heF9wZm4pCisJCQltYXhfcGZuID0gTUFYTUVNX1BGTiArIGhpZ2htZW1fcGFnZXM7CisJCWlmIChoaWdobWVtX3BhZ2VzICsgTUFYTUVNX1BGTiA+IG1heF9wZm4pIHsKKwkJCXByaW50aygib25seSAlbHVNQiBoaWdobWVtIHBhZ2VzIGF2YWlsYWJsZSwgaWdub3JpbmcgaGlnaG1lbSBzaXplIG9mICV1TUIuXG4iLCBwYWdlc190b19tYihtYXhfcGZuIC0gTUFYTUVNX1BGTiksIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpKTsKKwkJCWhpZ2htZW1fcGFnZXMgPSAwOworCQl9CisJCW1heF9sb3dfcGZuID0gTUFYTUVNX1BGTjsKKyNpZm5kZWYgQ09ORklHX0hJR0hNRU0KKwkJLyogTWF4aW11bSBtZW1vcnkgdXNhYmxlIGlzIHdoYXQgaXMgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyBvbmx5ICVsZE1CIHdpbGwgYmUgdXNlZC5cbiIsCisJCQkJCU1BWE1FTT4+MjApOworCQlpZiAobWF4X3BmbiA+IE1BWF9OT05QQUVfUEZOKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgUEFFIGVuYWJsZWQga2VybmVsLlxuIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIEhJR0hNRU0gZW5hYmxlZCBrZXJuZWwuXG4iKTsKKwkJbWF4X3BmbiA9IE1BWE1FTV9QRk47CisjZWxzZSAvKiAhQ09ORklHX0hJR0hNRU0gKi8KKyNpZm5kZWYgQ09ORklHX1g4Nl9QQUUKKwkJaWYgKG1heF9wZm4gPiBNQVhfTk9OUEFFX1BGTikgeworCQkJbWF4X3BmbiA9IE1BWF9OT05QQUVfUEZOOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyBvbmx5IDRHQiB3aWxsIGJlIHVzZWQuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIFBBRSBlbmFibGVkIGtlcm5lbC5cbiIpOworCQl9CisjZW5kaWYgLyogIUNPTkZJR19YODZfUEFFICovCisjZW5kaWYgLyogIUNPTkZJR19ISUdITUVNICovCisJfSBlbHNlIHsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgPT0gLTEpCisJCQloaWdobWVtX3BhZ2VzID0gMDsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCQlpZiAoaGlnaG1lbV9wYWdlcyA+PSBtYXhfcGZuKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImhpZ2htZW0gc2l6ZSBzcGVjaWZpZWQgKCV1TUIpIGlzIGJpZ2dlciB0aGFuIHBhZ2VzIGF2YWlsYWJsZSAoJWx1TUIpIS5cbiIsIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpLCBwYWdlc190b19tYihtYXhfcGZuKSk7CisJCQloaWdobWVtX3BhZ2VzID0gMDsKKwkJfQorCQlpZiAoaGlnaG1lbV9wYWdlcykgeworCQkJaWYgKG1heF9sb3dfcGZuLWhpZ2htZW1fcGFnZXMgPCA2NCoxMDI0KjEwMjQvUEFHRV9TSVpFKXsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhpZ2htZW0gc2l6ZSAldU1CIHJlc3VsdHMgaW4gc21hbGxlciB0aGFuIDY0TUIgbG93bWVtLCBpZ25vcmluZyBpdC5cbiIsIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpKTsKKwkJCQloaWdobWVtX3BhZ2VzID0gMDsKKwkJCX0KKwkJCW1heF9sb3dfcGZuIC09IGhpZ2htZW1fcGFnZXM7CisJCX0KKyNlbHNlCisJCWlmIChoaWdobWVtX3BhZ2VzKQorCQkJcHJpbnRrKEtFUk5fRVJSICJpZ25vcmluZyBoaWdobWVtIHNpemUgb24gbm9uLWhpZ2htZW0ga2VybmVsIVxuIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIG1heF9sb3dfcGZuOworfQorCisvKgorICogRnJlZSBhbGwgYXZhaWxhYmxlIG1lbW9yeSBmb3IgYm9vdCB0aW1lIGFsbG9jYXRpb24uICBVc2VkCisgKiBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ5IGVmaV9tZW1vcnlfd2FsaygpCisgKi8KKworc3RhdGljIGludCBfX2luaXQKK2ZyZWVfYXZhaWxhYmxlX21lbW9yeSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdm9pZCAqYXJnKQoreworCS8qIGNoZWNrIG1heF9sb3dfcGZuICovCisJaWYgKHN0YXJ0ID49ICgobWF4X2xvd19wZm4gKyAxKSA8PCBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIDA7CisJaWYgKGVuZCA+PSAoKG1heF9sb3dfcGZuICsgMSkgPDwgUEFHRV9TSElGVCkpCisJCWVuZCA9IChtYXhfbG93X3BmbiArIDEpIDw8IFBBR0VfU0hJRlQ7CisJaWYgKHN0YXJ0IDwgZW5kKQorCQlmcmVlX2Jvb3RtZW0oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworCXJldHVybiAwOworfQorLyoKKyAqIFJlZ2lzdGVyIGZ1bGx5IGF2YWlsYWJsZSBsb3cgUkFNIHBhZ2VzIHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXModW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbikKK3sKKwlpbnQgaTsKKworCWlmIChlZmlfZW5hYmxlZCkgeworCQllZmlfbWVtbWFwX3dhbGsoZnJlZV9hdmFpbGFibGVfbWVtb3J5LCBOVUxMKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGN1cnJfcGZuLCBsYXN0X3Bmbiwgc2l6ZTsKKwkJLyoKKwkJICogUmVzZXJ2ZSB1c2FibGUgbG93IG1lbW9yeQorCQkgKi8KKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgIT0gRTgyMF9SQU0pCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogV2UgYXJlIHJvdW5kaW5nIHVwIHRoZSBzdGFydCBhZGRyZXNzIG9mIHVzYWJsZSBtZW1vcnk6CisJCSAqLworCQljdXJyX3BmbiA9IFBGTl9VUChlODIwLm1hcFtpXS5hZGRyKTsKKwkJaWYgKGN1cnJfcGZuID49IG1heF9sb3dfcGZuKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIC4uLiBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgdXNhYmxlIHJhbmdlIGRvd253YXJkczoKKwkJICovCisJCWxhc3RfcGZuID0gUEZOX0RPV04oZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUpOworCisJCWlmIChsYXN0X3BmbiA+IG1heF9sb3dfcGZuKQorCQkJbGFzdF9wZm4gPSBtYXhfbG93X3BmbjsKKworCQkvKgorCQkgKiAuLiBmaW5hbGx5LCBkaWQgYWxsIHRoZSByb3VuZGluZyBhbmQgcGxheWluZworCQkgKiBhcm91bmQganVzdCBtYWtlIHRoZSBhcmVhIGdvIGF3YXk/CisJCSAqLworCQlpZiAobGFzdF9wZm4gPD0gY3Vycl9wZm4pCisJCQljb250aW51ZTsKKworCQlzaXplID0gbGFzdF9wZm4gLSBjdXJyX3BmbjsKKwkJZnJlZV9ib290bWVtKFBGTl9QSFlTKGN1cnJfcGZuKSwgUEZOX1BIWVMoc2l6ZSkpOworCX0KK30KKworLyoKKyAqIHdvcmthcm91bmQgZm9yIERlbGwgc3lzdGVtcyB0aGF0IG5lZ2xlY3QgdG8gcmVzZXJ2ZSBFQkRBCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2ViZGFfcmVnaW9uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisJYWRkciA9IGdldF9iaW9zX2ViZGEoKTsKKwlpZiAoYWRkcikKKwkJcmVzZXJ2ZV9ib290bWVtKGFkZHIsIFBBR0VfU0laRSk7CQorfQorCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHNldHVwX21lbW9yeSh2b2lkKQoreworCS8qCisJICogcGFydGlhbGx5IHVzZWQgcGFnZXMgYXJlIG5vdCB1c2FibGUgLSB0aHVzCisJICogd2UgYXJlIHJvdW5kaW5nIHVwd2FyZHM6CisJICovCisJbWluX2xvd19wZm4gPSBQRk5fVVAoaW5pdF9wZ190YWJsZXNfZW5kKTsKKworCWZpbmRfbWF4X3BmbigpOworCisJbWF4X2xvd19wZm4gPSBmaW5kX21heF9sb3dfcGZuKCk7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47CisJaWYgKG1heF9wZm4gPiBtYXhfbG93X3BmbikgeworCQloaWdoc3RhcnRfcGZuID0gbWF4X2xvd19wZm47CisJfQorCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgSElHSE1FTSBhdmFpbGFibGUuXG4iLAorCQlwYWdlc190b19tYihoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pKTsKKyNlbmRpZgorCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgTE9XTUVNIGF2YWlsYWJsZS5cbiIsCisJCQlwYWdlc190b19tYihtYXhfbG93X3BmbikpOworCisJc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3IoKTsKKworCXJldHVybiBtYXhfbG93X3BmbjsKK30KKwordm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7MCwgMCwgMH07CisJdW5zaWduZWQgaW50IG1heF9kbWEsIGxvdzsKKworCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKGNoYXIgKilNQVhfRE1BX0FERFJFU1MpID4+IFBBR0VfU0hJRlQ7CisJbG93ID0gbWF4X2xvd19wZm47CisKKwlpZiAobG93IDwgbWF4X2RtYSkKKwkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBsb3c7CisJZWxzZSB7CisJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKKwkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBsb3cgLSBtYXhfZG1hOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuIC0gbG93OworI2VuZGlmCisJfQorCWZyZWVfYXJlYV9pbml0KHpvbmVzX3NpemUpOworfQorI2Vsc2UKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNldHVwX21lbW9yeSh2b2lkKTsKK2V4dGVybiB2b2lkIHpvbmVfc2l6ZXNfaW5pdCh2b2lkKTsKKyNlbmRpZiAvKiAhQ09ORklHX0RJU0NPTlRJR01FTSAqLworCit2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgYm9vdC10aW1lIGFsbG9jYXRvciAod2l0aCBsb3cgbWVtb3J5IG9ubHkpOgorCSAqLworCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbShtaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOworCisJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMobWF4X2xvd19wZm4pOworCisJLyoKKwkgKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBpdHNlbGYgYXMgd2VsbC4gV2UgZG8gdGhpcyBpbiB0d28KKwkgKiBzdGVwcyAoZmlyc3Qgc3RlcCB3YXMgaW5pdF9ib290bWVtKCkpIGJlY2F1c2UgdGhpcyBjYXRjaGVzCisJICogdGhlICh2ZXJ5IHVubGlrZWx5KSBjYXNlIG9mIHVzIGFjY2lkZW50YWxseSBpbml0aWFsaXppbmcgdGhlCisJICogYm9vdG1lbSBhbGxvY2F0b3Igd2l0aCBhbiBpbnZhbGlkIFJBTSBhcmVhLgorCSAqLworCXJlc2VydmVfYm9vdG1lbShISUdIX01FTU9SWSwgKFBGTl9QSFlTKG1pbl9sb3dfcGZuKSArCisJCQkgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFLTEpIC0gKEhJR0hfTUVNT1JZKSk7CisKKwkvKgorCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCisJICogZW5hYmxpbmcgY2xlYW4gcmVib290cywgU01QIG9wZXJhdGlvbiwgbGFwdG9wIGZ1bmN0aW9ucy4KKwkgKi8KKwlyZXNlcnZlX2Jvb3RtZW0oMCwgUEFHRV9TSVpFKTsKKworCS8qIHJlc2VydmUgRUJEQSByZWdpb24sIGl0J3MgYSA0SyByZWdpb24gKi8KKwlyZXNlcnZlX2ViZGFfcmVnaW9uKCk7CisKKyAgICAvKiBjb3VsZCBiZSBhbiBBTUQgNzY4TVBYIGNoaXBzZXQuIFJlc2VydmUgYSBwYWdlICBiZWZvcmUgVkdBIHRvIHByZXZlbnQKKyAgICAgICBQQ0kgcHJlZmV0Y2ggaW50byBpdCAoZXJyYXRhICM1NikuIFVzdWFsbHkgdGhlIHBhZ2UgaXMgcmVzZXJ2ZWQgYW55d2F5cywKKyAgICAgICB1bmxlc3MgeW91IGhhdmUgbm8gUFMvMiBtb3VzZSBwbHVnZ2VkIGluLiAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPT0gNikKKwkgICAgIHJlc2VydmVfYm9vdG1lbSgweGEwMDAwIC0gNDA5NiwgNDA5Nik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBCdXQgZmlyc3QgcGluY2ggYSBmZXcgZm9yIHRoZSBzdGFjay90cmFtcG9saW5lIHN0dWZmCisJICogRklYTUU6IERvbid0IG5lZWQgdGhlIGV4dHJhIHBhZ2UgYXQgNEssIGJ1dCBuZWVkIHRvIGZpeAorCSAqIHRyYW1wb2xpbmUgYmVmb3JlIHJlbW92aW5nIGl0LiAoc2VlIHRoZSBHRFQgc3R1ZmYpCisJICovCisJcmVzZXJ2ZV9ib290bWVtKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJLyoKKwkgKiBSZXNlcnZlIGxvdyBtZW1vcnkgcmVnaW9uIGZvciBzbGVlcCBzdXBwb3J0LgorCSAqLworCWFjcGlfcmVzZXJ2ZV9ib290bWVtKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRworCS8qCisJICogRmluZCBhbmQgcmVzZXJ2ZSBwb3NzaWJsZSBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CisJICovCisJZmluZF9zbXBfY29uZmlnKCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQpIHsKKwkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSkgeworCQkJcmVzZXJ2ZV9ib290bWVtKElOSVRSRF9TVEFSVCwgSU5JVFJEX1NJWkUpOworCQkJaW5pdHJkX3N0YXJ0ID0KKwkJCQlJTklUUkRfU1RBUlQgPyBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVCA6IDA7CisJCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0K0lOSVRSRF9TSVpFOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpbml0cmQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIG1lbW9yeSAiCisJCQkgICAgIigweCUwOGx4ID4gMHglMDhseClcbmRpc2FibGluZyBpbml0cmRcbiIsCisJCQkgICAgSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUsCisJCQkgICAgbWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCk7CisJCQlpbml0cmRfc3RhcnQgPSAwOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUaGUgbm9kZSAwIHBnZGF0IGlzIGluaXRpYWxpemVkIGJlZm9yZSBhbGwgb2YgdGhlc2UgYmVjYXVzZQorICogaXQncyBuZWVkZWQgZm9yIGJvb3RtZW0uICBub2RlPjAgcGdkYXRzIGhhdmUgdGhlaXIgdmlydHVhbAorICogc3BhY2UgYWxsb2NhdGVkIGJlZm9yZSB0aGUgcGFnZXRhYmxlcyBhcmUgaW4gcGxhY2UgdG8gYWNjZXNzCisgKiB0aGVtLCBzbyB0aGV5IGNhbid0IGJlIGNsZWFyZWQgdGhlbi4KKyAqCisgKiBUaGlzIHNob3VsZCBhbGwgY29tcGlsZSBkb3duIHRvIG5vdGhpbmcgd2hlbiBOVU1BIGlzIG9mZi4KKyAqLwordm9pZCBfX2luaXQgcmVtYXBwZWRfcGdkYXRfaW5pdCh2b2lkKQoreworCWludCBuaWQ7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJaWYgKG5pZCAhPSAwKQorCQkJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJfQorfQorCisvKgorICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgUkFNIGFuZCBST00gcmVzb3VyY2VzCisgKiBhbmQgYWxzbyBmb3IgcmVnaW9ucyByZXBvcnRlZCBhcyByZXNlcnZlZCBieSB0aGUgZTgyMC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0CitsZWdhY3lfaW5pdF9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLCBzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UpCit7CisJaW50IGk7CisKKwlwcm9iZV9yb21zKCk7CisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXM7CisJCWlmIChlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKQorCQkJY29udGludWU7CisJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJc3dpdGNoIChlODIwLm1hcFtpXS50eXBlKSB7CisJCWNhc2UgRTgyMF9SQU06CXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsgYnJlYWs7CisJCWNhc2UgRTgyMF9BQ1BJOglyZXMtPm5hbWUgPSAiQUNQSSBUYWJsZXMiOyBicmVhazsKKwkJY2FzZSBFODIwX05WUzoJcmVzLT5uYW1lID0gIkFDUEkgTm9uLXZvbGF0aWxlIFN0b3JhZ2UiOyBicmVhazsKKwkJZGVmYXVsdDoJcmVzLT5uYW1lID0gInJlc2VydmVkIjsKKwkJfQorCQlyZXMtPnN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgZTgyMC5tYXBbaV0uc2l6ZSAtIDE7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisJCWlmIChlODIwLm1hcFtpXS50eXBlID09IEU4MjBfUkFNKSB7CisJCQkvKgorCQkJICogIFdlIGRvbid0IGtub3cgd2hpY2ggUkFNIHJlZ2lvbiBjb250YWlucyBrZXJuZWwgZGF0YSwKKwkJCSAqICBzbyB3ZSB0cnkgaXQgcmVwZWF0ZWRseSBhbmQgbGV0IHRoZSByZXNvdXJjZSBtYW5hZ2VyCisJCQkgKiAgdGVzdCBpdC4KKwkJCSAqLworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGNvZGVfcmVzb3VyY2UpOworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGRhdGFfcmVzb3VyY2UpOworCQl9CisJfQorfQorCisvKgorICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZWdpc3Rlcl9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0OworCWludAkgICAgICBpOworCisJaWYgKGVmaV9lbmFibGVkKQorCQllZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoJmNvZGVfcmVzb3VyY2UsICZkYXRhX3Jlc291cmNlKTsKKwllbHNlCisJCWxlZ2FjeV9pbml0X2lvbWVtX3Jlc291cmNlcygmY29kZV9yZXNvdXJjZSwgJmRhdGFfcmVzb3VyY2UpOworCisJLyogRUZJIHN5c3RlbXMgbWF5IHN0aWxsIGhhdmUgVkdBICovCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZ2aWRlb19yYW1fcmVzb3VyY2UpOworCisJLyogcmVxdWVzdCBJL08gc3BhY2UgZm9yIGRldmljZXMgdXNlZCBvbiBhbGwgaVszNDVdODYgUENzICovCisJZm9yIChpID0gMDsgaSA8IFNUQU5EQVJEX0lPX1JFU09VUkNFUzsgaSsrKQorCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZzdGFuZGFyZF9pb19yZXNvdXJjZXNbaV0pOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIHRoZSBiaWdlc3QgZ2FwIGluIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgZTgyMAorCSAqIG1lbW9yeSBzcGFjZS4KKwkgKi8KKwlsYXN0ID0gMHgxMDAwMDAwMDB1bGw7CisJZ2Fwc3RhcnQgPSAweDEwMDAwMDAwOworCWdhcHNpemUgPSAweDQwMDAwMDsKKwlpID0gZTgyMC5ucl9tYXA7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAubWFwW2ldLnNpemU7CisKKwkJLyoKKwkJICogU2luY2UgImxhc3QiIGlzIGF0IG1vc3QgNEdCLCB3ZSBrbm93IHdlJ2xsCisJCSAqIGZpdCBpbiAzMiBiaXRzIGlmIHRoaXMgY29uZGl0aW9uIGlzIHRydWUKKwkJICovCisJCWlmIChsYXN0ID4gZW5kKSB7CisJCQl1bnNpZ25lZCBsb25nIGdhcCA9IGxhc3QgLSBlbmQ7CisKKwkJCWlmIChnYXAgPiBnYXBzaXplKSB7CisJCQkJZ2Fwc2l6ZSA9IGdhcDsKKwkJCQlnYXBzdGFydCA9IGVuZDsKKwkJCX0KKwkJfQorCQlpZiAoc3RhcnQgPCBsYXN0KQorCQkJbGFzdCA9IHN0YXJ0OworCX0KKworCS8qCisJICogU3RhcnQgYWxsb2NhdGluZyBkeW5hbWljIFBDSSBtZW1vcnkgYSBiaXQgaW50byB0aGUgZ2FwLAorCSAqIGFsaWduZWQgdXAgdG8gdGhlIG5lYXJlc3QgbWVnYWJ5dGUuCisJICoKKwkgKiBRdWVzdGlvbjogc2hvdWxkIHdlIHRyeSB0byBwYWQgaXQgdXAgYSBiaXQgKGRvIHNvbWV0aGluZworCSAqIGxpa2UgIiArIChnYXBzaXplID4+IDMpIiBpbiB0aGVyZSB0b28/KS4gV2Ugbm93IGhhdmUgdGhlCisJICogdGVjaG5vbG9neS4KKwkgKi8KKwlwY2lfbWVtX3N0YXJ0ID0gKGdhcHN0YXJ0ICsgMHhmZmZmZikgJiB+MHhmZmZmZjsKKworCXByaW50aygiQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0YXJ0aW5nIGF0ICUwOGx4IChnYXA6ICUwOGx4OiUwOGx4KVxuIiwKKwkJcGNpX21lbV9zdGFydCwgZ2Fwc3RhcnQsIGdhcHNpemUpOworfQorCisvKiBVc2UgaW5saW5lIGFzc2VtYmx5IHRvIGRlZmluZSB0aGlzIGJlY2F1c2UgdGhlIG5vcHMgYXJlIGRlZmluZWQgCisgICBhcyBpbmxpbmUgYXNzZW1ibHkgc3RyaW5ncyBpbiB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgd2UgY2Fubm90IAorICAgZ2V0IHRoZW0gZWFzaWx5IGludG8gc3RyaW5ncy4gKi8KK2FzbSgiXHQuZGF0YVxuaW50ZWxub3BzOiAiIAorICAgIEdFTkVSSUNfTk9QMSBHRU5FUklDX05PUDIgR0VORVJJQ19OT1AzIEdFTkVSSUNfTk9QNCBHRU5FUklDX05PUDUgR0VORVJJQ19OT1A2CisgICAgR0VORVJJQ19OT1A3IEdFTkVSSUNfTk9QOCk7IAorYXNtKCJcdC5kYXRhXG5rOG5vcHM6ICIgCisgICAgSzhfTk9QMSBLOF9OT1AyIEs4X05PUDMgSzhfTk9QNCBLOF9OT1A1IEs4X05PUDYKKyAgICBLOF9OT1A3IEs4X05PUDgpOyAKK2FzbSgiXHQuZGF0YVxuazdub3BzOiAiIAorICAgIEs3X05PUDEgSzdfTk9QMiBLN19OT1AzIEs3X05PUDQgSzdfTk9QNSBLN19OT1A2CisgICAgSzdfTk9QNyBLN19OT1A4KTsgCisgICAgCitleHRlcm4gdW5zaWduZWQgY2hhciBpbnRlbG5vcHNbXSwgazhub3BzW10sIGs3bm9wc1tdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludGVsX25vcHNbQVNNX05PUF9NQVgrMV0gPSB7IAorICAgICBOVUxMLAorICAgICBpbnRlbG5vcHMsCisgICAgIGludGVsbm9wcyArIDEsCisgICAgIGludGVsbm9wcyArIDEgKyAyLAorICAgICBpbnRlbG5vcHMgKyAxICsgMiArIDMsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAorICAgICBpbnRlbG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCit9OyAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICprOF9ub3BzW0FTTV9OT1BfTUFYKzFdID0geyAKKyAgICAgTlVMTCwKKyAgICAgazhub3BzLAorICAgICBrOG5vcHMgKyAxLAorICAgICBrOG5vcHMgKyAxICsgMiwKKyAgICAgazhub3BzICsgMSArIDIgKyAzLAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0LAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSwKKyAgICAgazhub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2LAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorfTsgCitzdGF0aWMgdW5zaWduZWQgY2hhciAqazdfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsgCisgICAgIE5VTEwsCisgICAgIGs3bm9wcywKKyAgICAgazdub3BzICsgMSwKKyAgICAgazdub3BzICsgMSArIDIsCisgICAgIGs3bm9wcyArIDEgKyAyICsgMywKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCwKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCArIDUsCisgICAgIGs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywKK307IAorc3RhdGljIHN0cnVjdCBub3AgeyAKKyAgICAgaW50IGNwdWlkOyAKKyAgICAgdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlOyAKK30gbm9wdHlwZXNbXSA9IHsgCisgICAgIHsgWDg2X0ZFQVRVUkVfSzgsIGs4X25vcHMgfSwgCisgICAgIHsgWDg2X0ZFQVRVUkVfSzcsIGs3X25vcHMgfSwgCisgICAgIHsgLTEsIE5VTEwgfQorfTsgCisKKy8qIFJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggYmV0dGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcyBDUFUgdHlwZS4KKworICAgVGhpcyBydW5zIGJlZm9yZSBTTVAgaXMgaW5pdGlhbGl6ZWQgdG8gYXZvaWQgU01QIHByb2JsZW1zIHdpdGgKKyAgIHNlbGYgbW9kaWZ5aW5nIGNvZGUuIFRoaXMgaW1wbGllcyB0aGF0IGFzc3ltZXRyaWMgc3lzdGVtcyB3aGVyZQorICAgQVBzIGhhdmUgbGVzcyBjYXBhYmlsaXRpZXMgdGhhbiB0aGUgYm9vdCBwcm9jZXNzb3IgYXJlIG5vdCBoYW5kbGVkLiAKKyAgIEluIHRoaXMgY2FzZSBib290IHdpdGggIm5vcmVwbGFjZW1lbnQiLiAqLyAKK3ZvaWQgYXBwbHlfYWx0ZXJuYXRpdmVzKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpIAoreyAKKwlzdHJ1Y3QgYWx0X2luc3RyICphOyAKKwlpbnQgZGlmZiwgaSwgazsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlID0gaW50ZWxfbm9wczsgCisJZm9yIChpID0gMDsgbm9wdHlwZXNbaV0uY3B1aWQgPj0gMDsgaSsrKSB7IAorCQlpZiAoYm9vdF9jcHVfaGFzKG5vcHR5cGVzW2ldLmNwdWlkKSkgeyAKKwkJCW5vcHRhYmxlID0gbm9wdHlwZXNbaV0ubm9wdGFibGU7CisJCQlicmVhazsKKwkJfQorCX0gCisJZm9yIChhID0gc3RhcnQ7ICh2b2lkICopYSA8IGVuZDsgYSsrKSB7IAorCQlpZiAoIWJvb3RfY3B1X2hhcyhhLT5jcHVpZCkpCisJCQljb250aW51ZTsKKwkJQlVHX09OKGEtPnJlcGxhY2VtZW50bGVuID4gYS0+aW5zdHJsZW4pOyAKKwkJbWVtY3B5KGEtPmluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOyAKKwkJZGlmZiA9IGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW47IAorCQkvKiBQYWQgdGhlIHJlc3Qgd2l0aCBub3BzICovCisJCWZvciAoaSA9IGEtPnJlcGxhY2VtZW50bGVuOyBkaWZmID4gMDsgZGlmZiAtPSBrLCBpICs9IGspIHsKKwkJCWsgPSBkaWZmOworCQkJaWYgKGsgPiBBU01fTk9QX01BWCkKKwkJCQlrID0gQVNNX05PUF9NQVg7CisJCQltZW1jcHkoYS0+aW5zdHIgKyBpLCBub3B0YWJsZVtrXSwgayk7IAorCQl9IAorCX0KK30gCisKK3N0YXRpYyBpbnQgbm9fcmVwbGFjZW1lbnQgX19pbml0ZGF0YSA9IDA7IAorIAordm9pZCBfX2luaXQgYWx0ZXJuYXRpdmVfaW5zdHJ1Y3Rpb25zKHZvaWQpCit7CisJZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKKwlpZiAobm9fcmVwbGFjZW1lbnQpIAorCQlyZXR1cm47CisJYXBwbHlfYWx0ZXJuYXRpdmVzKF9fYWx0X2luc3RydWN0aW9ucywgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5vcmVwbGFjZW1lbnRfc2V0dXAoY2hhciAqcykKK3sgCisgICAgIG5vX3JlcGxhY2VtZW50ID0gMTsgCisgICAgIHJldHVybiAwOyAKK30gCisKK19fc2V0dXAoIm5vcmVwbGFjZW1lbnQiLCBub3JlcGxhY2VtZW50X3NldHVwKTsgCisKK3N0YXRpYyBjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpOworCisjaWZkZWYgQ09ORklHX01DQQorc3RhdGljIHZvaWQgc2V0X21jYV9idXMoaW50IHgpCit7CisJTUNBX2J1cyA9IHg7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc2V0X21jYV9idXMoaW50IHgpIHsgfQorI2VuZGlmCisKKy8qCisgKiBEZXRlcm1pbmUgaWYgd2Ugd2VyZSBsb2FkZWQgYnkgYW4gRUZJIGxvYWRlci4gIElmIHNvLCB0aGVuIHdlIGhhdmUgYWxzbyBiZWVuCisgKiBwYXNzZWQgdGhlIGVmaSBtZW1tYXAsIHN5c3RhYiwgZXRjLiwgc28gd2Ugc2hvdWxkIHVzZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMKKyAqIGZvciBpbml0aWFsaXphdGlvbi4gIE5vdGUsIHRoZSBlZmkgaW5pdCBjb2RlIHBhdGggaXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAqIGdsb2JhbCBlZmlfZW5hYmxlZC4gVGhpcyBhbGxvd3MgdGhlIHNhbWUga2VybmVsIGltYWdlIHRvIGJlIHVzZWQgb24gZXhpc3RpbmcKKyAqIHN5c3RlbXMgKHdpdGggYSB0cmFkaXRpb25hbCBCSU9TKSBhcyB3ZWxsIGFzIG9uIEVGSSBzeXN0ZW1zLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbjsKKworCW1lbWNweSgmYm9vdF9jcHVfZGF0YSwgJm5ld19jcHVfZGF0YSwgc2l6ZW9mKG5ld19jcHVfZGF0YSkpOworCXByZV9zZXR1cF9hcmNoX2hvb2soKTsKKwllYXJseV9jcHVfaW5pdCgpOworCisJLyoKKwkgKiBGSVhNRTogVGhpcyBpc24ndCBhbiBvZmZpY2lhbCBsb2FkZXJfdHlwZSByaWdodAorCSAqIG5vdyBidXQgZG9lcyBjdXJyZW50bHkgd29yayB3aXRoIGVsaWxvLgorCSAqIElmIHdlIHdlcmUgY29uZmlndXJlZCBhcyBhbiBFRkkga2VybmVsLCBjaGVjayB0byBtYWtlCisJICogc3VyZSB0aGF0IHdlIHdlcmUgbG9hZGVkIGNvcnJlY3RseSBmcm9tIGVsaWxvIGFuZCB0aGF0CisJICogdGhlIHN5c3RlbSB0YWJsZSBpcyB2YWxpZC4gIElmIG5vdCwgdGhlbiBpbml0aWFsaXplIG5vcm1hbGx5LgorCSAqLworI2lmZGVmIENPTkZJR19FRkkKKwlpZiAoKExPQURFUl9UWVBFID09IDB4NTApICYmIEVGSV9TWVNUQUIpCisJCWVmaV9lbmFibGVkID0gMTsKKyNlbmRpZgorCisgCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CisgCWRyaXZlX2luZm8gPSBEUklWRV9JTkZPOworIAlzY3JlZW5faW5mbyA9IFNDUkVFTl9JTkZPOworCWVkaWRfaW5mbyA9IEVESURfSU5GTzsKKwlhcG1faW5mby5iaW9zID0gQVBNX0JJT1NfSU5GTzsKKwlpc3RfaW5mbyA9IElTVF9JTkZPOworCXNhdmVkX3ZpZGVvbW9kZSA9IFZJREVPX01PREU7CisJaWYoIFNZU19ERVNDX1RBQkxFLmxlbmd0aCAhPSAwICkgeworCQlzZXRfbWNhX2J1cyhTWVNfREVTQ19UQUJMRS50YWJsZVszXSAmIDB4Mik7CisJCW1hY2hpbmVfaWQgPSBTWVNfREVTQ19UQUJMRS50YWJsZVswXTsKKwkJbWFjaGluZV9zdWJtb2RlbF9pZCA9IFNZU19ERVNDX1RBQkxFLnRhYmxlWzFdOworCQlCSU9TX3JldmlzaW9uID0gU1lTX0RFU0NfVEFCTEUudGFibGVbMl07CisJfQorCWJvb3Rsb2FkZXJfdHlwZSA9IExPQURFUl9UWVBFOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCisJcmRfaW1hZ2Vfc3RhcnQgPSBSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLOworCXJkX3Byb21wdCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfUFJPTVBUX0ZMQUcpICE9IDApOworCXJkX2RvbG9hZCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsKKyNlbmRpZgorCUFSQ0hfU0VUVVAKKwlpZiAoZWZpX2VuYWJsZWQpCisJCWVmaV9pbml0KCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCQlwcmludF9tZW1vcnlfbWFwKG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKCkpOworCX0KKworCWNvcHlfZWRkKCk7CisKKwlpZiAoIU1PVU5UX1JPT1RfUkRPTkxZKQorCQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKKwlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgX3RleHQ7CisJaW5pdF9tbS5lbmRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CisJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBfZWRhdGE7CisJaW5pdF9tbS5icmsgPSBpbml0X3BnX3RhYmxlc19lbmQgKyBQQUdFX09GRlNFVDsKKworCWNvZGVfcmVzb3VyY2Uuc3RhcnQgPSB2aXJ0X3RvX3BoeXMoX3RleHQpOworCWNvZGVfcmVzb3VyY2UuZW5kID0gdmlydF90b19waHlzKF9ldGV4dCktMTsKKwlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CisJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOworCisJcGFyc2VfY21kbGluZV9lYXJseShjbWRsaW5lX3ApOworCisJbWF4X2xvd19wZm4gPSBzZXR1cF9tZW1vcnkoKTsKKworCS8qCisJICogTk9URTogYmVmb3JlIHRoaXMgcG9pbnQgX25vYm9keV8gaXMgYWxsb3dlZCB0byBhbGxvY2F0ZQorCSAqIGFueSBtZW1vcnkgdXNpbmcgdGhlIGJvb3RtZW0gYWxsb2NhdG9yLiAgQWx0aG91Z2ggdGhlCisJICogYWxsb2N0b3IgaXMgbm93IGluaXRpYWxpc2VkIG9ubHkgdGhlIGZpcnN0IDhNYiBvZiB0aGUga2VybmVsCisJICogdmlydHVhbCBhZGRyZXNzIHNwYWNlIGhhcyBiZWVuIG1hcHBlZC4gIEFsbCBhbGxvY2F0aW9ucyBiZWZvcmUKKwkgKiBwYWdpbmdfaW5pdCgpIGhhcyBjb21wbGV0ZWQgbXVzdCB1c2UgdGhlIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKCkKKwkgKiB2YXJpYW50ICh3aGljaCBhbGxvY2F0ZXMgRE1BJ2FibGUgbWVtb3J5KSBhbmQgY2FyZSBtdXN0IGJlIHRha2VuCisJICogbm90IHRvIGV4Y2VlZCB0aGUgOE1iIGxpbWl0LgorCSAqLworCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9hbGxvY19tZW1vcnkoKTsgLyogQVAgcHJvY2Vzc29yIHJlYWxtb2RlIHN0YWNrcyBpbiBsb3cgbWVtb3J5Ki8KKyNlbmRpZgorCXBhZ2luZ19pbml0KCk7CisJcmVtYXBwZWRfcGdkYXRfaW5pdCgpOworCXpvbmVfc2l6ZXNfaW5pdCgpOworCisJLyoKKwkgKiBOT1RFOiBhdCB0aGlzIHBvaW50IHRoZSBib290bWVtIGFsbG9jYXRvciBpcyBmdWxseSBhdmFpbGFibGUuCisJICovCisKKyNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCisJeworCQljaGFyICpzID0gc3Ryc3RyKCpjbWRsaW5lX3AsICJlYXJseXByaW50az0iKTsKKwkJaWYgKHMpIHsKKwkJCWV4dGVybiB2b2lkIHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICopOworCisJCQlzZXR1cF9lYXJseV9wcmludGsocyk7CisJCQlwcmludGsoImVhcmx5IGNvbnNvbGUgZW5hYmxlZFxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCisJZG1pX3NjYW5fbWFjaGluZSgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAorCWdlbmVyaWNfYXBpY19wcm9iZSgqY21kbGluZV9wKTsKKyNlbmRpZgkKKwlpZiAoZWZpX2VuYWJsZWQpCisJCWVmaV9tYXBfbWVtbWFwKCk7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBBQ1BJIHRhYmxlcyBmb3IgcG9zc2libGUgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uLgorCSAqLworCWFjcGlfYm9vdF90YWJsZV9pbml0KCk7CisJYWNwaV9ib290X2luaXQoKTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWlmIChzbXBfZm91bmRfY29uZmlnKQorCQlnZXRfc21wX2NvbmZpZygpOworI2VuZGlmCisKKwlyZWdpc3Rlcl9tZW1vcnkoKTsKKworI2lmZGVmIENPTkZJR19WVAorI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQorCWlmICghZWZpX2VuYWJsZWQgfHwgKGVmaV9tZW1fdHlwZSgweGEwMDAwKSAhPSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkpCisJCWNvbnN3aXRjaHAgPSAmdmdhX2NvbjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCisJY29uc3dpdGNocCA9ICZkdW1teV9jb247CisjZW5kaWYKKyNlbmRpZgorfQorCisjaW5jbHVkZSAic2V0dXBfYXJjaF9wb3N0LmgiCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTpjCisgKiBjLWZpbGUtc3R5bGU6ImsmciIKKyAqIGMtYmFzaWMtb2Zmc2V0OjgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oIGIvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWIxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmgKQEAgLTAsMCArMSwyMSBAQAorc3RydWN0IHNpZ2ZyYW1lCit7CisJY2hhciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKKwljaGFyIHJldGNvZGVbOF07Cit9OworCitzdHJ1Y3QgcnRfc2lnZnJhbWUKK3sKKwljaGFyICpwcmV0Y29kZTsKKwlpbnQgc2lnOworCXN0cnVjdCBzaWdpbmZvICpwaW5mbzsKKwl2b2lkICpwdWM7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKwlzdHJ1Y3QgdWNvbnRleHQgdWM7CisJc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJY2hhciByZXRjb2RlWzhdOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzYwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsNjY1IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICAxOTk3LTExLTI4ICBNb2RpZmllZCBmb3IgUE9TSVguMWIgc2lnbmFscyBieSBSaWNoYXJkIEhlbmRlcnNvbgorICogIDIwMDAtMDYtMjAgIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0IGJ5IEdhcmV0aCBIdWdoZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlICJzaWdmcmFtZS5oIgorCisjZGVmaW5lIERFQlVHX1NJRyAwCisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKKy8qCisgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgorICovCithc21saW5rYWdlIGludAorc3lzX3NpZ3N1c3BlbmQoaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQoreworCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAmaGlzdG9yeTA7CisJc2lnc2V0X3Qgc2F2ZXNldDsKKworCW1hc2sgJj0gX0JMT0NLQUJMRTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlyZWdzLT5lYXggPSAtRUlOVFI7CisJd2hpbGUgKDEpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlKCk7CisJCWlmIChkb19zaWduYWwocmVncywgJnNhdmVzZXQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9Cit9CisKK2FzbWxpbmthZ2UgaW50CitzeXNfcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKKworCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLworCWlmIChyZWdzLmVjeCAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCAoc2lnc2V0X3QgX191c2VyICopcmVncy5lYngsIHNpemVvZihuZXdzZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXJlZ3MuZWF4ID0gLUVJTlRSOworCXdoaWxlICgxKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZSgpOworCQlpZiAoZG9fc2lnbmFsKCZyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBpbnQgCitzeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAorCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CisJaW50IHJldDsKKworCWlmIChhY3QpIHsKKwkJb2xkX3NpZ3NldF90IG1hc2s7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7CisJCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CisJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKKwl9CisKKwlyZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKKworCWlmICghcmV0ICYmIG9hY3QpIHsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKKwkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGludAorc3lzX3NpZ2FsdHN0YWNrKHVuc2lnbmVkIGxvbmcgZWJ4KQoreworCS8qIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgZ2NjIHJlYWxpemUgaXQgZG9lc24ndCBvd24gdGhlICJzdHJ1Y3QgcHRfcmVncyIgKi8KKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSZlYng7CisJY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcyA9IChjb25zdCBzdGFja190IF9fdXNlciAqKWVieDsKKwlzdGFja190IF9fdXNlciAqdW9zcyA9IChzdGFja190IF9fdXNlciAqKXJlZ3MtPmVjeDsKKworCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJlZ3MtPmVzcCk7Cit9CisKKworLyoKKyAqIERvIGEgc2lnbmFsIHJldHVybjsgdW5kbyB0aGUgc2lnbmFsIHN0YWNrLgorICovCisKK3N0YXRpYyBpbnQKK3Jlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywgaW50ICpwZWF4KQoreworCXVuc2lnbmVkIGludCBlcnIgPSAwOworCisJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisjZGVmaW5lIENPUFkoeCkJCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+eCkKKworI2RlZmluZSBDT1BZX1NFRyhzZWcpCQkJCQkJCVwKKwl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCisJICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAorCSAgcmVncy0+eCMjc2VnID0gdG1wOyB9CisKKyNkZWZpbmUgQ09QWV9TRUdfU1RSSUNUKHNlZykJCQkJCQlcCisJeyB1bnNpZ25lZCBzaG9ydCB0bXA7CQkJCQkJXAorCSAgZXJyIHw9IF9fZ2V0X3VzZXIodG1wLCAmc2MtPnNlZyk7CQkJCVwKKwkgIHJlZ3MtPngjI3NlZyA9IHRtcHwzOyB9CisKKyNkZWZpbmUgR0VUX1NFRyhzZWcpCQkJCQkJCVwKKwl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCisJICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAorCSAgbG9hZHNlZ21lbnQoc2VnLHRtcCk7IH0KKworI2RlZmluZQlGSVhfRUZMQUdTCShYODZfRUZMQUdTX0FDIHwgWDg2X0VGTEFHU19PRiB8IFg4Nl9FRkxBR1NfREYgfCBcCisJCQkgWDg2X0VGTEFHU19URiB8IFg4Nl9FRkxBR1NfU0YgfCBYODZfRUZMQUdTX1pGIHwgXAorCQkJIFg4Nl9FRkxBR1NfQUYgfCBYODZfRUZMQUdTX1BGIHwgWDg2X0VGTEFHU19DRikKKworCUdFVF9TRUcoZ3MpOworCUdFVF9TRUcoZnMpOworCUNPUFlfU0VHKGVzKTsKKwlDT1BZX1NFRyhkcyk7CisJQ09QWShlZGkpOworCUNPUFkoZXNpKTsKKwlDT1BZKGVicCk7CisJQ09QWShlc3ApOworCUNPUFkoZWJ4KTsKKwlDT1BZKGVkeCk7CisJQ09QWShlY3gpOworCUNPUFkoZWlwKTsKKwlDT1BZX1NFR19TVFJJQ1QoY3MpOworCUNPUFlfU0VHX1NUUklDVChzcyk7CisJCisJeworCQl1bnNpZ25lZCBpbnQgdG1wZmxhZ3M7CisJCWVyciB8PSBfX2dldF91c2VyKHRtcGZsYWdzLCAmc2MtPmVmbGFncyk7CisJCXJlZ3MtPmVmbGFncyA9IChyZWdzLT5lZmxhZ3MgJiB+RklYX0VGTEFHUykgfCAodG1wZmxhZ3MgJiBGSVhfRUZMQUdTKTsKKwkJcmVncy0+b3JpZ19lYXggPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwl9CisKKwl7CisJCXN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKiBidWY7CisJCWVyciB8PSBfX2dldF91c2VyKGJ1ZiwgJnNjLT5mcHN0YXRlKTsKKwkJaWYgKGJ1ZikgeworCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1Ziwgc2l6ZW9mKCpidWYpKSkKKwkJCQlnb3RvIGJhZGZyYW1lOworCQkJZXJyIHw9IHJlc3RvcmVfaTM4NyhidWYpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CisJCQlpZiAodXNlZF9tYXRoKCkpIHsKKwkJCQljbGVhcl9mcHUobWUpOworCQkJCWNsZWFyX3VzZWRfbWF0aCgpOworCQkJfQorCQl9CisJfQorCisJZXJyIHw9IF9fZ2V0X3VzZXIoKnBlYXgsICZzYy0+ZWF4KTsKKwlyZXR1cm4gZXJyOworCitiYWRmcmFtZToKKwlyZXR1cm4gMTsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZfX3VudXNlZDsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPmVzcCAtIDgpOworCXNpZ3NldF90IHNldDsKKwlpbnQgZWF4OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fZ2V0X3VzZXIoc2V0LnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKQorCSAgICB8fCAoX05TSUdfV09SRFMgPiAxCisJCSYmIF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sICZmcmFtZS0+ZXh0cmFtYXNrLAorCQkJCSAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT5zYywgJmVheCkpCisJCWdvdG8gYmFkZnJhbWU7CisJcmV0dXJuIGVheDsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQkKKworYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZfX3VudXNlZDsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPmVzcCAtIDQpOworCXNpZ3NldF90IHNldDsKKwlpbnQgZWF4OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZlYXgpKQorCQlnb3RvIGJhZGZyYW1lOworCisJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsIHJlZ3MtPmVzcCkgPT0gLUVGQVVMVCkKKwkJZ290byBiYWRmcmFtZTsKKworCXJldHVybiBlYXg7CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30JCisKKy8qCisgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUuCisgKi8KKworc3RhdGljIGludAorc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpmcHN0YXRlLAorCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgdG1wLCBlcnIgPSAwOworCisJdG1wID0gMDsKKwlfX2FzbV9fKCJtb3ZsICUlZ3MsJTAiIDogIj1yIih0bXApOiAiMCIodG1wKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+Z3MpOworCV9fYXNtX18oIm1vdmwgJSVmcywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5mcyk7CisKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54ZXMsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5lcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+eGRzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+ZHMpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVkaSwgJnNjLT5lZGkpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVzaSwgJnNjLT5lc2kpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVicCwgJnNjLT5lYnApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVzcCwgJnNjLT5lc3ApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVieCwgJnNjLT5lYngpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVkeCwgJnNjLT5lZHgpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVjeCwgJnNjLT5lY3gpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVheCwgJnNjLT5lYXgpOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCAmc2MtPnRyYXBubyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUsICZzYy0+ZXJyKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5laXAsICZzYy0+ZWlwKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54Y3MsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5jcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWZsYWdzLCAmc2MtPmVmbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZXNwLCAmc2MtPmVzcF9hdF9zaWduYWwpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnhzcywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPnNzKTsKKworCXRtcCA9IHNhdmVfaTM4NyhmcHN0YXRlKTsKKwlpZiAodG1wIDwgMCkKKwkgIGVyciA9IDE7CisJZWxzZQorCSAgZXJyIHw9IF9fcHV0X3VzZXIodG1wID8gZnBzdGF0ZSA6IE5VTEwsICZzYy0+ZnBzdGF0ZSk7CisKKwkvKiBub24taUJDUzIgZXh0ZW5zaW9ucy4uICovCisJZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnNjLT5vbGRtYXNrKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuY3IyLCAmc2MtPmNyMik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoaWNoIHN0YWNrIHRvIHVzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKgorZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc2l6ZV90IGZyYW1lX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBlc3A7CisKKwkvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworCWVzcCA9IHJlZ3MtPmVzcDsKKworCS8qIFRoaXMgaXMgdGhlIFgvT3BlbiBzYW5jdGlvbmVkIHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSB7CisJCWlmIChzYXNfc3NfZmxhZ3MoZXNwKSA9PSAwKQorCQkJZXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisJfQorCisJLyogVGhpcyBpcyB0aGUgbGVnYWN5IHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICovCisJZWxzZSBpZiAoKHJlZ3MtPnhzcyAmIDB4ZmZmZikgIT0gX19VU0VSX0RTICYmCisJCSAhKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSAmJgorCQkga2EtPnNhLnNhX3Jlc3RvcmVyKSB7CisJCWVzcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfcmVzdG9yZXI7CisJfQorCisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgoZXNwIC0gZnJhbWVfc2l6ZSkgJiAtOHVsKTsKK30KKworLyogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBhZGRyZXNzZXMgaW4gdGhlIHZzeXNjYWxsIHBhZ2UuCisgICBTZWUgdnN5c2NhbGwtc2lncmV0dXJuLlMuICAqLworZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3NpZ3JldHVybjsKK2V4dGVybiB2b2lkIF9fdXNlciBfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKK3N0YXRpYyB2b2lkIHNldHVwX2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdm9pZCBfX3VzZXIgKnJlc3RvcmVyOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCWludCBlcnIgPSAwOworCWludCB1c2lnOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwl1c2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgorCQkmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCisJCSYmIHNpZyA8IDMyCisJCT8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCisJCTogc2lnOworCisJZXJyID0gX19wdXRfdXNlcih1c2lnLCAmZnJhbWUtPnNpZyk7CisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwllcnIgPSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsICZmcmFtZS0+ZnBzdGF0ZSwgcmVncywgc2V0LT5zaWdbMF0pOworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJaWYgKF9OU0lHX1dPUkRTID4gMSkgeworCQllcnIgPSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPmV4dHJhbWFzaywgJnNldC0+c2lnWzFdLAorCQkJCSAgICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwl9CisKKwlyZXN0b3JlciA9ICZfX2tlcm5lbF9zaWdyZXR1cm47CisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQorCQlyZXN0b3JlciA9IGthLT5zYS5zYV9yZXN0b3JlcjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICAqLworCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwkgCisJLyoKKwkgKiBUaGlzIGlzIHBvcGwgJWVheCA7IG1vdmwgJCwlZWF4IDsgaW50ICQweDgwCisJICoKKwkgKiBXRSBETyBOT1QgVVNFIElUIEFOWSBNT1JFISBJdCdzIG9ubHkgbGVmdCBoZXJlIGZvciBoaXN0b3JpY2FsCisJICogcmVhc29ucyBhbmQgYmVjYXVzZSBnZGIgdXNlcyBpdCBhcyBhIHNpZ25hdHVyZSB0byBub3RpY2UKKwkgKiBzaWduYWwgaGFuZGxlciBzdGFjayBmcmFtZXMuCisJICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHhiODU4LCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzApKTsKKwllcnIgfD0gX19wdXRfdXNlcihfX05SX3NpZ3JldHVybiwgKGludCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMikpOworCWVyciB8PSBfX3B1dF91c2VyKDB4ODBjZCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSs2KSk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5lYXggPSAodW5zaWduZWQgbG9uZykgc2lnOworCXJlZ3MtPmVkeCA9ICh1bnNpZ25lZCBsb25nKSAwOworCXJlZ3MtPmVjeCA9ICh1bnNpZ25lZCBsb25nKSAwOworCisJc2V0X2ZzKFVTRVJfRFMpOworCXJlZ3MtPnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54ZXMgPSBfX1VTRVJfRFM7CisJcmVncy0+eHNzID0gX19VU0VSX0RTOworCXJlZ3MtPnhjcyA9IF9fVVNFUl9DUzsKKworCS8qCisJICogQ2xlYXIgVEYgd2hlbiBlbnRlcmluZyB0aGUgc2lnbmFsIGhhbmRsZXIsIGJ1dAorCSAqIG5vdGlmeSBhbnkgdHJhY2VyIHRoYXQgd2FzIHNpbmdsZS1zdGVwcGluZyBpdC4KKwkgKiBUaGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUKKwkgKiBoYW5kbGVyIHRvby4KKwkgKi8KKwlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCisjaWYgREVCVUdfU0lHCisJcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lcCByYT0lcFxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+ZWlwLCBmcmFtZS0+cHJldGNvZGUpOworI2VuZGlmCisKKwlyZXR1cm47CisKK2dpdmVfc2lnc2VndjoKKwlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKKwkJCSAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl2b2lkIF9fdXNlciAqcmVzdG9yZXI7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IGVyciA9IDA7CisJaW50IHVzaWc7CisKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkJJiYgc2lnIDwgMzIKKwkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KKwkJOiBzaWc7CisKKwllcnIgfD0gX19wdXRfdXNlcih1c2lnLCAmZnJhbWUtPnNpZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKKwllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7CisJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHJlZ3MtPmVzcCksCisJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOworCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZmcmFtZS0+ZnBzdGF0ZSwKKwkJCSAgICAgICAgcmVncywgc2V0LT5zaWdbMF0pOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICAqLworCXJlc3RvcmVyID0gJl9fa2VybmVsX3J0X3NpZ3JldHVybjsKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOworCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwkgCisJLyoKKwkgKiBUaGlzIGlzIG1vdmwgJCwlZWF4IDsgaW50ICQweDgwCisJICoKKwkgKiBXRSBETyBOT1QgVVNFIElUIEFOWSBNT1JFISBJdCdzIG9ubHkgbGVmdCBoZXJlIGZvciBoaXN0b3JpY2FsCisJICogcmVhc29ucyBhbmQgYmVjYXVzZSBnZGIgdXNlcyBpdCBhcyBhIHNpZ25hdHVyZSB0byBub3RpY2UKKwkgKiBzaWduYWwgaGFuZGxlciBzdGFjayBmcmFtZXMuCisJICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHhiOCwgKGNoYXIgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzApKTsKKwllcnIgfD0gX19wdXRfdXNlcihfX05SX3J0X3NpZ3JldHVybiwgKGludCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMSkpOworCWVyciB8PSBfX3B1dF91c2VyKDB4ODBjZCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSs1KSk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5lYXggPSAodW5zaWduZWQgbG9uZykgdXNpZzsKKwlyZWdzLT5lZHggPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOworCXJlZ3MtPmVjeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCisJc2V0X2ZzKFVTRVJfRFMpOworCXJlZ3MtPnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54ZXMgPSBfX1VTRVJfRFM7CisJcmVncy0+eHNzID0gX19VU0VSX0RTOworCXJlZ3MtPnhjcyA9IF9fVVNFUl9DUzsKKworCS8qCisJICogQ2xlYXIgVEYgd2hlbiBlbnRlcmluZyB0aGUgc2lnbmFsIGhhbmRsZXIsIGJ1dAorCSAqIG5vdGlmeSBhbnkgdHJhY2VyIHRoYXQgd2FzIHNpbmdsZS1zdGVwcGluZyBpdC4KKwkgKiBUaGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUKKwkgKiBoYW5kbGVyIHRvby4KKwkgKi8KKwlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCisjaWYgREVCVUdfU0lHCisJcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lcCByYT0lcFxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+ZWlwLCBmcmFtZS0+cHJldGNvZGUpOworI2VuZGlmCisKKwlyZXR1cm47CisKK2dpdmVfc2lnc2VndjoKKwlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Cit9CisKKy8qCisgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCisgKi8JCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJICAgICAgc2lnc2V0X3QgKm9sZHNldCwJc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCS8qIEFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCisJaWYgKHJlZ3MtPm9yaWdfZWF4ID49IDApIHsKKwkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLworCQlzd2l0Y2ggKHJlZ3MtPmVheCkgeworCQkgICAgICAgIGNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJCXJlZ3MtPmVheCA9IC1FSU5UUjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpIHsKKwkJCQkJcmVncy0+ZWF4ID0gLUVJTlRSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQkJcmVncy0+ZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJCQkJcmVncy0+ZWlwIC09IDI7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIFRGIGlzIHNldCBkdWUgdG8gYSBkZWJ1Z2dlciAoUFRfRFRSQUNFKSwgY2xlYXIgdGhlIFRGIGZsYWcgc28KKwkgKiB0aGF0IHJlZ2lzdGVyIGluZm9ybWF0aW9uIGluIHRoZSBzaWdjb250ZXh0IGlzIGNvcnJlY3QuCisJICovCisJaWYgKHVubGlrZWx5KHJlZ3MtPmVmbGFncyAmIFRGX01BU0spCisJICAgICYmIGxpa2VseShjdXJyZW50LT5wdHJhY2UgJiBQVF9EVFJBQ0UpKSB7CisJCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJfQorCisJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQorCQlzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCWVsc2UKKwkJc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKKwkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorfQorCisvKgorICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0CisgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKKyAqIG1pc3Rha2UuCisgKi8KK2ludCBmYXN0Y2FsbCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKworCS8qCisJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2gKKwkgKiBpcyB3aHkgd2UgbWF5IGluIGNlcnRhaW4gY2FzZXMgZ2V0IGhlcmUgZnJvbQorCSAqIGtlcm5lbCBtb2RlLiBKdXN0IHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nCisJICogaWYgc28uCisJICovCisJaWYgKChyZWdzLT54Y3MgJiAzKSAhPSAzKQorCQlyZXR1cm4gMTsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgeworCQlyZWZyaWdlcmF0b3IoMCk7CisJCWdvdG8gbm9fc2lnbmFsOworCX0KKworCWlmICghb2xkc2V0KQorCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOworCWlmIChzaWduciA+IDApIHsKKwkJLyogUmVlbmFibGUgYW55IHdhdGNocG9pbnRzIGJlZm9yZSBkZWxpdmVyaW5nIHRoZQorCQkgKiBzaWduYWwgdG8gdXNlciBzcGFjZS4gVGhlIHByb2Nlc3NvciByZWdpc3RlciB3aWxsCisJCSAqIGhhdmUgYmVlbiBjbGVhcmVkIGlmIHRoZSB3YXRjaHBvaW50IHRyaWdnZXJlZAorCQkgKiBpbnNpZGUgdGhlIGtlcm5lbC4KKwkJICovCisJCWlmICh1bmxpa2VseShjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKSB7CisJCQlfX2FzbV9fKCJtb3ZsICUwLCUlZGI3Igk6IDogInIiIChjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKTsKKwkJfQorCisJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLworCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAmaW5mbywgJmthLCBvbGRzZXQsIHJlZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKyBub19zaWduYWw6CisJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLworCWlmIChyZWdzLT5vcmlnX2VheCA+PSAwKSB7CisJCS8qIFJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsIC0gbm8gaGFuZGxlcnMgcHJlc2VudCAqLworCQlpZiAocmVncy0+ZWF4ID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkgICAgcmVncy0+ZWF4ID09IC1FUkVTVEFSVFNZUyB8fAorCQkgICAgcmVncy0+ZWF4ID09IC1FUkVTVEFSVE5PSU5UUikgeworCQkJcmVncy0+ZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJCQlyZWdzLT5laXAgLT0gMjsKKwkJfQorCQlpZiAocmVncy0+ZWF4ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0speworCQkJcmVncy0+ZWF4ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQlyZWdzLT5laXAgLT0gMjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5vdGlmaWNhdGlvbiBvZiB1c2Vyc3BhY2UgZXhlY3V0aW9uIHJlc3VtcHRpb24KKyAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsubm90aWZ5X3Jlc3VtZQorICovCitfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkKK3ZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCwKKwkJICAgICAgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCit7CisJLyogUGVuZGluZyBzaW5nbGUtc3RlcD8gKi8KKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX1NJTkdMRVNURVApIHsKKwkJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKTsKKwl9CisJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQlkb19zaWduYWwocmVncyxvbGRzZXQpOworCQorCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9JUkVUKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjNjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC0wLDAgKzEsNjEyIEBACisvKgorICoJSW50ZWwgU01QIHN1cHBvcnQgcm91dGluZXMuCisgKgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgMTk5OC05OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvcgorICoJbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorCisvKgorICoJU29tZSBub3RlcyBvbiB4ODYgcHJvY2Vzc29yIGJ1Z3MgYWZmZWN0aW5nIFNNUCBvcGVyYXRpb246CisgKgorICoJUGVudGl1bSwgUGVudGl1bSBQcm8sIElJLCBJSUkgKGFuZCBhbGwgQ1BVcykgaGF2ZSBidWdzLgorICoJVGhlIExpbnV4IGltcGxpY2F0aW9ucyBmb3IgU01QIGFyZSBoYW5kbGVkIGFzIGZvbGxvd3M6CisgKgorICoJUGVudGl1bSBJSUkgLyBbWGVvbl0KKyAqCQlOb25lIG9mIHRoZSBFMUFQLUUzQVAgZXJyYXRhIGFyZSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICoKKyAqCUUxQVAuCXNlZSBQSUkgQTFBUAorICoJRTJBUC4Jc2VlIFBJSSBBMkFQCisgKglFM0FQLglzZWUgUElJIEEzQVAKKyAqCisgKglQZW50aXVtIElJIC8gW1hlb25dCisgKgkJTm9uZSBvZiB0aGUgQTFBUC1BM0FQIGVycmF0YSBhcmUgdmlzaWJsZSB0byB0aGUgdXNlci4KKyAqCisgKglBMUFQLglzZWUgUFBybyAxQVAKKyAqCUEyQVAuCXNlZSBQUHJvIDJBUAorICoJQTNBUC4Jc2VlIFBQcm8gN0FQCisgKgorICoJUGVudGl1bSBQcm8KKyAqCQlOb25lIG9mIDFBUC05QVAgZXJyYXRhIGFyZSB2aXNpYmxlIHRvIHRoZSBub3JtYWwgdXNlciwKKyAqCWV4Y2VwdCBvY2Nhc2lvbmFsIGRlbGl2ZXJ5IG9mICdzcHVyaW91cyBpbnRlcnJ1cHQnIGFzIHRyYXAgIzE1LgorICoJVGhpcyBpcyB2ZXJ5IHJhcmUgYW5kIGEgbm9uLXByb2JsZW0uCisgKgorICoJMUFQLglMaW51eCBtYXBzIEFQSUMgYXMgbm9uLWNhY2hlYWJsZQorICoJMkFQLgl3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkzQVAuCWZpeGVkIGluIEMwIGFuZCBhYm92ZSBzdGVwcGluZ3MgbWljcm9jb2RlIHVwZGF0ZS4KKyAqCQlMaW51eCBkb2VzIG5vdCB1c2UgZXhjZXNzaXZlIFNUQVJUVVBfSVBJcy4KKyAqCTRBUC4Jd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJNUFQLglzeW1tZXRyaWMgSU8gbW9kZSAobm9ybWFsIExpbnV4IG9wZXJhdGlvbikgbm90IGFmZmVjdGVkLgorICoJCSdub2FwaWMnIG1vZGUgaGFzIHZlY3RvciAweGYgZmlsbGVkIG91dCBwcm9wZXJseS4KKyAqCTZBUC4JJ25vYXBpYycgbW9kZSBtaWdodCBiZSBhZmZlY3RlZCAtIGZpeGVkIGluIGxhdGVyIHN0ZXBwaW5ncworICoJN0FQLglXZSBkbyBub3QgYXNzdW1lIHdyaXRlcyB0byB0aGUgTFZUIGRlYXNzZXJpbmcgSVJRcworICoJOEFQLglXZSBkbyBub3QgZW5hYmxlIGxvdyBwb3dlciBtb2RlIChkZWVwIHNsZWVwKSBkdXJpbmcgTVAgYm9vdHVwCisgKgk5QVAuCVdlIGRvIG5vdCB1c2UgbWl4ZWQgbW9kZQorICoKKyAqCVBlbnRpdW0KKyAqCQlUaGVyZSBpcyBhIG1hcmdpbmFsIGNhc2Ugd2hlcmUgUkVQIE1PVlMgb24gMTAwTUh6IFNNUAorICoJbWFjaGluZXMgd2l0aCBCIHN0ZXBwaW5nIHByb2Nlc3NvcnMgY2FuIGZhaWwuIFhYWCBzaG91bGQgcHJvdmlkZQorICoJYW4gTDFjYWNoZT1Xcml0ZXRocm91Z2ggb3IgTDFjYWNoZT1vZmYgb3B0aW9uLgorICoKKyAqCQlCIHN0ZXBwaW5nIENQVXMgbWF5IGhhbmcuIFRoZXJlIGFyZSBoYXJkd2FyZSB3b3JrIGFyb3VuZHMKKyAqCWZvciB0aGlzLiBXZSB3YXJuIGFib3V0IGl0IGluIGNhc2UgeW91ciBib2FyZCBkb2Vzbid0IGhhdmUgdGhlIHdvcmsKKyAqCWFyb3VuZHMuIEJhc2ljYWxseSB0aGF0cyBzbyBJIGNhbiB0ZWxsIGFueW9uZSB3aXRoIGEgQiBzdGVwcGluZworICoJQ1BVIGFuZCBTTVAgcHJvYmxlbXMgInRvdWdoIi4KKyAqCisgKglTcGVjaWZpYyBpdGVtcyBbRnJvbSBQZW50aXVtIFByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIFVwZGF0ZV0KKyAqCisgKgkxQVAuCUxpbnV4IGRvZXNuJ3QgdXNlIHJlbW90ZSByZWFkCisgKgkyQVAuCUxpbnV4IGRvZXNuJ3QgdHJ1c3QgQVBJQyBlcnJvcnMKKyAqCTNBUC4JV2Ugd29yayBhcm91bmQgdGhpcworICoJNEFQLglMaW51eCBuZXZlciBnZW5lcmF0ZWQgMyBpbnRlcnJ1cHRzIG9mIHRoZSBzYW1lIHByaW9yaXR5CisgKgkJdG8gY2F1c2UgYSBsb3N0IGxvY2FsIGludGVycnVwdC4KKyAqCTVBUC4JUmVtb3RlIHJlYWQgaXMgbmV2ZXIgdXNlZAorICoJNkFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgk3QVAuCW5vdCBhZmZlY3RlZCAtIHdvcmtlZCBhcm91bmQgaW4gaGFyZHdhcmUKKyAqCThBUC4Jd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZSAtIHdlIGdldCBleHBsaWNpdCBDUyBlcnJvcnMgaWYgbm90CisgKgk5QVAuCW9ubHkgJ25vYXBpYycgbW9kZSBhZmZlY3RlZC4gTWlnaHQgZ2VuZXJhdGUgc3B1cmlvdXMKKyAqCQlpbnRlcnJ1cHRzLCB3ZSBsb2cgb25seSB0aGUgZmlyc3Qgb25lIGFuZCBjb3VudCB0aGUKKyAqCQlyZXN0IHNpbGVudGx5LgorICoJMTBBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTFBUC4JTGludXggcmVhZHMgdGhlIEFQSUMgYmV0d2VlbiB3cml0ZXMgdG8gYXZvaWQgdGhpcywgYXMgcGVyCisgKgkJdGhlIGRvY3VtZW50YXRpb24uIE1ha2Ugc3VyZSB5b3UgcHJlc2VydmUgdGhpcyBhcyBpdCBhZmZlY3RzCisgKgkJdGhlIEMgc3RlcHBpbmcgY2hpcHMgdG9vLgorICoJMTJBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTNBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTRBUC4Jd2UgYWx3YXlzIGRlYXNzZXJ0IElOSVQgZHVyaW5nIGJvb3R1cAorICoJMTVBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTZBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTdBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMThBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTlBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBCSU9TCisgKgorICoJSWYgdGhpcyBzb3VuZHMgd29ycnlpbmcgYmVsaWV2ZSBtZSB0aGVzZSBidWdzIGFyZSBlaXRoZXIgX19fUkFSRV9fXywKKyAqCW9yIGFyZSBzaWduYWwgdGltaW5nIGJ1Z3Mgd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZSBhbmQgdGhlcmUncworICoJYWJvdXQgbm90aGluZyBvZiBub3RlIHdpdGggQyBzdGVwcGluZyB1cHdhcmRzLgorICovCisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB0bGJfc3RhdGUsIGNwdV90bGJzdGF0ZSkgX19fX2NhY2hlbGluZV9hbGlnbmVkID0geyAmaW5pdF9tbSwgMCwgfTsKKworLyoKKyAqIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGRlYWwgd2l0aCBzZW5kaW5nIElQSXMgYmV0d2VlbiBDUFVzLgorICoKKyAqIFdlIHVzZSAnYnJvYWRjYXN0JywgQ1BVLT5DUFUgSVBJcyBhbmQgc2VsZi1JUElzIHRvby4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfX3ByZXBhcmVfSUNSICh1bnNpZ25lZCBpbnQgc2hvcnRjdXQsIGludCB2ZWN0b3IpCit7CisJcmV0dXJuIEFQSUNfRE1fRklYRUQgfCBzaG9ydGN1dCB8IHZlY3RvciB8IEFQSUNfREVTVF9MT0dJQ0FMOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3ByZXBhcmVfSUNSMiAodW5zaWduZWQgaW50IG1hc2spCit7CisJcmV0dXJuIFNFVF9BUElDX0RFU1RfRklFTEQobWFzayk7Cit9CisKK3ZvaWQgX19zZW5kX0lQSV9zaG9ydGN1dCh1bnNpZ25lZCBpbnQgc2hvcnRjdXQsIGludCB2ZWN0b3IpCit7CisJLyoKKwkgKiBTdWJ0bGUuIEluIHRoZSBjYXNlIG9mIHRoZSAnbmV2ZXIgZG8gZG91YmxlIHdyaXRlcycgd29ya2Fyb3VuZAorCSAqIHdlIGhhdmUgdG8gbG9jayBvdXQgaW50ZXJydXB0cyB0byBiZSBzYWZlLiAgQXMgd2UgZG9uJ3QgY2FyZQorCSAqIG9mIHRoZSB2YWx1ZSByZWFkIHdlIHVzZSBhbiBhdG9taWMgcm13IGFjY2VzcyB0byBhdm9pZCBjb3N0bHkKKwkgKiBjbGkvc3RpLiAgT3RoZXJ3aXNlIHdlIHVzZSBhbiBldmVuIGNoZWFwZXIgc2luZ2xlIGF0b21pYyB3cml0ZQorCSAqIHRvIHRoZSBBUElDLgorCSAqLworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFdhaXQgZm9yIGlkbGUuCisJICovCisJYXBpY193YWl0X2ljcl9pZGxlKCk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gdG91Y2ggdGhlIHRhcmdldCBjaGlwIGZpZWxkCisJICovCisJY2ZnID0gX19wcmVwYXJlX0lDUihzaG9ydGN1dCwgdmVjdG9yKTsKKworCS8qCisJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIGNmZyk7Cit9CisKK3ZvaWQgZmFzdGNhbGwgc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKQoreworCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX1NFTEYsIHZlY3Rvcik7Cit9CisKKy8qCisgKiBUaGlzIGlzIG9ubHkgdXNlZCBvbiBzbWFsbGVyIG1hY2hpbmVzLgorICovCit2b2lkIHNlbmRfSVBJX21hc2tfYml0bWFzayhjcHVtYXNrX3QgY3B1bWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBjcHVzX2FkZHIoY3B1bWFzaylbMF07CisJdW5zaWduZWQgbG9uZyBjZmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCisJLyoKKwkgKiBXYWl0IGZvciBpZGxlLgorCSAqLworCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCQkKKwkvKgorCSAqIHByZXBhcmUgdGFyZ2V0IGNoaXAgZmllbGQKKwkgKi8KKwljZmcgPSBfX3ByZXBhcmVfSUNSMihtYXNrKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIGNmZyk7CisJCQorCS8qCisJICogcHJvZ3JhbSB0aGUgSUNSIAorCSAqLworCWNmZyA9IF9fcHJlcGFyZV9JQ1IoMCwgdmVjdG9yKTsKKwkJCQorCS8qCisJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIGNmZyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgc2VuZF9JUElfbWFza19zZXF1ZW5jZShjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBsb25nIGNmZywgZmxhZ3M7CisJdW5zaWduZWQgaW50IHF1ZXJ5X2NwdTsKKworCS8qCisJICogSGFjay4gVGhlIGNsdXN0ZXJlZCBBUElDIGFkZHJlc3NpbmcgbW9kZSBkb2Vzbid0IGFsbG93IHVzIHRvIHNlbmQgCisJICogdG8gYW4gYXJiaXRyYXJ5IG1hc2ssIHNvIEkgZG8gYSB1bmljYXN0cyB0byBlYWNoIENQVSBpbnN0ZWFkLiBUaGlzIAorCSAqIHNob3VsZCBiZSBtb2RpZmllZCB0byBkbyAxIG1lc3NhZ2UgcGVyIGNsdXN0ZXIgSUQgLSBtYmxpZ2gKKwkgKi8gCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3IgKHF1ZXJ5X2NwdSA9IDA7IHF1ZXJ5X2NwdSA8IE5SX0NQVVM7ICsrcXVlcnlfY3B1KSB7CisJCWlmIChjcHVfaXNzZXQocXVlcnlfY3B1LCBtYXNrKSkgeworCQkKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBpZGxlLgorCQkJICovCisJCQlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKwkJCisJCQkvKgorCQkJICogcHJlcGFyZSB0YXJnZXQgY2hpcCBmaWVsZAorCQkJICovCisJCQljZmcgPSBfX3ByZXBhcmVfSUNSMihjcHVfdG9fbG9naWNhbF9hcGljaWQocXVlcnlfY3B1KSk7CisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIGNmZyk7CisJCQorCQkJLyoKKwkJCSAqIHByb2dyYW0gdGhlIElDUiAKKwkJCSAqLworCQkJY2ZnID0gX19wcmVwYXJlX0lDUigwLCB2ZWN0b3IpOworCQkJCisJCQkvKgorCQkJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJCQkgKi8KKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBjZmcpOworCQl9CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2luY2x1ZGUgPG1hY2hfaXBpLmg+IC8qIG11c3QgY29tZSBhZnRlciB0aGUgc2VuZF9JUEkgZnVuY3Rpb25zIGFib3ZlIGZvciBpbmxpbmluZyAqLworCisvKgorICoJU21hcnRlciBTTVAgZmx1c2hpbmcgbWFjcm9zLiAKKyAqCQljL28gTGludXMgVG9ydmFsZHMuCisgKgorICoJVGhlc2UgbWVhbiB5b3UgY2FuIHJlYWxseSBkZWZpbml0ZWx5IHV0dGVybHkgZm9yZ2V0IGFib3V0CisgKgl3cml0aW5nIHRvIHVzZXIgc3BhY2UgZnJvbSBpbnRlcnJ1cHRzLiAoSXRzIG5vdCBhbGxvd2VkIGFueXdheSkuCisgKgorICoJT3B0aW1pemF0aW9ucyBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorICovCisKK3N0YXRpYyBjcHVtYXNrX3QgZmx1c2hfY3B1bWFzazsKK3N0YXRpYyBzdHJ1Y3QgbW1fc3RydWN0ICogZmx1c2hfbW07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmbHVzaF92YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGxic3RhdGVfbG9jayk7CisjZGVmaW5lIEZMVVNIX0FMTAkweGZmZmZmZmZmCisKKy8qCisgKiBXZSBjYW5ub3QgY2FsbCBtbWRyb3AoKSBiZWNhdXNlIHdlIGFyZSBpbiBpbnRlcnJ1cHQgY29udGV4dCwgCisgKiBpbnN0ZWFkIHVwZGF0ZSBtbS0+Y3B1X3ZtX21hc2suCisgKgorICogV2UgbmVlZCB0byByZWxvYWQgJWNyMyBzaW5jZSB0aGUgcGFnZSB0YWJsZXMgbWF5IGJlIGdvaW5nCisgKiBhd2F5IGZyb20gdW5kZXIgdXMuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGVhdmVfbW0gKHVuc2lnbmVkIGxvbmcgY3B1KQoreworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9PSykKKwkJQlVHKCk7CisJY3B1X2NsZWFyKGNwdSwgcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tLT5jcHVfdm1fbWFzayk7CisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOworfQorCisvKgorICoKKyAqIFRoZSBmbHVzaCBJUEkgYXNzdW1lcyB0aGF0IGEgdGhyZWFkIHN3aXRjaCBoYXBwZW5zIGluIHRoaXMgb3JkZXI6CisgKiBbY3B1MDogdGhlIGNwdSB0aGF0IHN3aXRjaGVzXQorICogMSkgc3dpdGNoX21tKCkgZWl0aGVyIDFhKSBvciAxYikKKyAqIDFhKSB0aHJlYWQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IG1tCisgKiAxYTEpIGNwdV9jbGVhcihjcHUsIG9sZF9tbS0+Y3B1X3ZtX21hc2spOworICogCVN0b3AgaXBpIGRlbGl2ZXJ5IGZvciB0aGUgb2xkIG1tLiBUaGlzIGlzIG5vdCBzeW5jaHJvbml6ZWQgd2l0aAorICogCXRoZSBvdGhlciBjcHVzLCBidXQgc21wX2ludmFsaWRhdGVfaW50ZXJydXB0IGlnbm9yZSBmbHVzaCBpcGlzCisgKiAJZm9yIHRoZSB3cm9uZyBtbSwgYW5kIGluIHRoZSB3b3JzdCBjYXNlIHdlIHBlcmZvcm0gYSBzdXBlcmZsb3VzCisgKiAJdGxiIGZsdXNoLgorICogMWEyKSBzZXQgY3B1X3RsYnN0YXRlIHRvIFRMQlNUQVRFX09LCisgKiAJTm93IHRoZSBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQgd29uJ3QgY2FsbCBsZWF2ZV9tbSBpZiBjcHUwCisgKgl3YXMgaW4gbGF6eSB0bGIgbW9kZS4KKyAqIDFhMykgdXBkYXRlIGNwdV90bGJzdGF0ZVtdLmFjdGl2ZV9tbQorICogCU5vdyBjcHUwIGFjY2VwdHMgdGxiIGZsdXNoZXMgZm9yIHRoZSBuZXcgbW0uCisgKiAxYTQpIGNwdV9zZXQoY3B1LCBuZXdfbW0tPmNwdV92bV9tYXNrKTsKKyAqIAlOb3cgdGhlIG90aGVyIGNwdXMgd2lsbCBzZW5kIHRsYiBmbHVzaCBpcGlzLgorICogMWE0KSBjaGFuZ2UgY3IzLgorICogMWIpIHRocmVhZCBzd2l0Y2ggd2l0aG91dCBtbSBjaGFuZ2UKKyAqCWNwdV90bGJzdGF0ZVtdLmFjdGl2ZV9tbSBpcyBjb3JyZWN0LCBjcHUwIGFscmVhZHkgaGFuZGxlcworICoJZmx1c2ggaXBpcy4KKyAqIDFiMSkgc2V0IGNwdV90bGJzdGF0ZSB0byBUTEJTVEFURV9PSworICogMWIyKSB0ZXN0X2FuZF9zZXQgdGhlIGNwdSBiaXQgaW4gY3B1X3ZtX21hc2suCisgKiAJQXRvbWljYWxseSBzZXQgdGhlIGJpdCBbb3RoZXIgY3B1cyB3aWxsIHN0YXJ0IHNlbmRpbmcgZmx1c2ggaXBpc10sCisgKiAJYW5kIHRlc3QgdGhlIGJpdC4KKyAqIDFiMykgaWYgdGhlIGJpdCB3YXMgMDogbGVhdmVfbW0gd2FzIGNhbGxlZCwgZmx1c2ggdGhlIHRsYi4KKyAqIDIpIHN3aXRjaCAlJWVzcCwgaWUgY3VycmVudAorICoKKyAqIFRoZSBpbnRlcnJ1cHQgbXVzdCBoYW5kbGUgMiBzcGVjaWFsIGNhc2VzOgorICogLSBjcjMgaXMgY2hhbmdlZCBiZWZvcmUgJSVlc3AsIGllLiBpdCBjYW5ub3QgdXNlIGN1cnJlbnQtPnthY3RpdmVfLH1tbS4KKyAqIC0gdGhlIGNwdSBwZXJmb3JtcyBzcGVjdWxhdGl2ZSB0bGIgcmVhZHMsIGkuZS4gZXZlbiBpZiB0aGUgY3B1IG9ubHkKKyAqICAgcnVucyBpbiBrZXJuZWwgc3BhY2UsIHRoZSBjcHUgY291bGQgbG9hZCB0bGIgZW50cmllcyBmb3IgdXNlciBzcGFjZQorICogICBwYWdlcy4KKyAqCisgKiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgY3B1X3RsYnN0YXRlIGlzIGxvY2FsIHRvIGVhY2ggY3B1LCBubworICogd3JpdGUvcmVhZCBvcmRlcmluZyBwcm9ibGVtcy4KKyAqLworCisvKgorICogVExCIGZsdXNoIElQSToKKyAqCisgKiAxKSBGbHVzaCB0aGUgdGxiIGVudHJpZXMgaWYgdGhlIGNwdSB1c2VzIHRoZSBtbSB0aGF0J3MgYmVpbmcgZmx1c2hlZC4KKyAqIDIpIExlYXZlIHRoZSBtbSBpZiB3ZSBhcmUgaW4gdGhlIGxhenkgdGxiIG1vZGUuCisgKi8KKworZmFzdGNhbGwgdm9pZCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisKKwlpZiAoIWNwdV9pc3NldChjcHUsIGZsdXNoX2NwdW1hc2spKQorCQlnb3RvIG91dDsKKwkJLyogCisJCSAqIFRoaXMgd2FzIGEgQlVHKCkgYnV0IHVudGlsIHNvbWVvbmUgY2FuIHF1b3RlIG1lIHRoZQorCQkgKiBsaW5lIGZyb20gdGhlIGludGVsIG1hbnVhbCB0aGF0IGd1YXJhbnRlZXMgYW4gSVBJIHRvCisJCSAqIG11bHRpcGxlIENQVXMgaXMgcmV0cmllZCBfb25seV8gb24gdGhlIGVycm9yaW5nIENQVXMKKwkJICogaXRzIHN0YXlpbmcgYXMgYSByZXR1cm4KKwkJICoKKwkJICogQlVHKCk7CisJCSAqLworCQkgCisJaWYgKGZsdXNoX21tID09IHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLmFjdGl2ZV9tbSkgeworCQlpZiAocGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuc3RhdGUgPT0gVExCU1RBVEVfT0spIHsKKwkJCWlmIChmbHVzaF92YSA9PSBGTFVTSF9BTEwpCisJCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCQllbHNlCisJCQkJX19mbHVzaF90bGJfb25lKGZsdXNoX3ZhKTsKKwkJfSBlbHNlCisJCQlsZWF2ZV9tbShjcHUpOworCX0KKwlhY2tfQVBJQ19pcnEoKTsKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljcHVfY2xlYXIoY3B1LCBmbHVzaF9jcHVtYXNrKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworb3V0OgorCXB1dF9jcHVfbm9fcmVzY2hlZCgpOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF90bGJfb3RoZXJzKGNwdW1hc2tfdCBjcHVtYXNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdmEpCit7CisJY3B1bWFza190IHRtcDsKKwkvKgorCSAqIEEgY291cGxlIG9mICh0byBiZSByZW1vdmVkKSBzYW5pdHkgY2hlY2tzOgorCSAqCisJICogLSB3ZSBkbyBub3Qgc2VuZCBJUElzIHRvIG5vdC15ZXQgYm9vdGVkIENQVXMuCisJICogLSBjdXJyZW50IENQVSBtdXN0IG5vdCBiZSBpbiBtYXNrCisJICogLSBtYXNrIG11c3QgZXhpc3QgOikKKwkgKi8KKwlCVUdfT04oY3B1c19lbXB0eShjcHVtYXNrKSk7CisKKwljcHVzX2FuZCh0bXAsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKKwlCVUdfT04oIWNwdXNfZXF1YWwoY3B1bWFzaywgdG1wKSk7CisJQlVHX09OKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdW1hc2spKTsKKwlCVUdfT04oIW1tKTsKKworCS8qCisJICogaSdtIG5vdCBoYXBweSBhYm91dCB0aGlzIGdsb2JhbCBzaGFyZWQgc3BpbmxvY2sgaW4gdGhlCisJICogTU0gaG90IHBhdGgsIGJ1dCB3ZSdsbCBzZWUgaG93IGNvbnRlbmRlZCBpdCBpcy4KKwkgKiBUZW1wb3JhcmlseSB0aGlzIHR1cm5zIElSUXMgb2ZmLCBzbyB0aGF0IGxvY2t1cHMgYXJlCisJICogZGV0ZWN0ZWQgYnkgdGhlIE5NSSB3YXRjaGRvZy4KKwkgKi8KKwlzcGluX2xvY2soJnRsYnN0YXRlX2xvY2spOworCQorCWZsdXNoX21tID0gbW07CisJZmx1c2hfdmEgPSB2YTsKKyNpZiBOUl9DUFVTIDw9IEJJVFNfUEVSX0xPTkcKKwlhdG9taWNfc2V0X21hc2soY3B1bWFzaywgJmZsdXNoX2NwdW1hc2spOworI2Vsc2UKKwl7CisJCWludCBrOworCQl1bnNpZ25lZCBsb25nICpmbHVzaF9tYXNrID0gKHVuc2lnbmVkIGxvbmcgKikmZmx1c2hfY3B1bWFzazsKKwkJdW5zaWduZWQgbG9uZyAqY3B1X21hc2sgPSAodW5zaWduZWQgbG9uZyAqKSZjcHVtYXNrOworCQlmb3IgKGsgPSAwOyBrIDwgQklUU19UT19MT05HUyhOUl9DUFVTKTsgKytrKQorCQkJYXRvbWljX3NldF9tYXNrKGNwdV9tYXNrW2tdLCAmZmx1c2hfbWFza1trXSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBXZSBoYXZlIHRvIHNlbmQgdGhlIElQSSBvbmx5IHRvCisJICogQ1BVcyBhZmZlY3RlZC4KKwkgKi8KKwlzZW5kX0lQSV9tYXNrKGNwdW1hc2ssIElOVkFMSURBVEVfVExCX1ZFQ1RPUik7CisKKwl3aGlsZSAoIWNwdXNfZW1wdHkoZmx1c2hfY3B1bWFzaykpCisJCS8qIG5vdGhpbmcuIGxvY2t1cCBkZXRlY3Rpb24gZG9lcyBub3QgYmVsb25nIGhlcmUgKi8KKwkJbWIoKTsKKworCWZsdXNoX21tID0gTlVMTDsKKwlmbHVzaF92YSA9IDA7CisJc3Bpbl91bmxvY2soJnRsYnN0YXRlX2xvY2spOworfQorCQordm9pZCBmbHVzaF90bGJfY3VycmVudF90YXNrKHZvaWQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwljcHVtYXNrX3QgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwljcHVfbWFzayA9IG1tLT5jcHVfdm1fbWFzazsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfbWFzayk7CisKKwlsb2NhbF9mbHVzaF90bGIoKTsKKwlpZiAoIWNwdXNfZW1wdHkoY3B1X21hc2spKQorCQlmbHVzaF90bGJfb3RoZXJzKGNwdV9tYXNrLCBtbSwgRkxVU0hfQUxMKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCit2b2lkIGZsdXNoX3RsYl9tbSAoc3RydWN0IG1tX3N0cnVjdCAqIG1tKQoreworCWNwdW1hc2tfdCBjcHVfbWFzazsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9tYXNrKTsKKworCWlmIChjdXJyZW50LT5hY3RpdmVfbW0gPT0gbW0pIHsKKwkJaWYgKGN1cnJlbnQtPm1tKQorCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCWVsc2UKKwkJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQorCWlmICghY3B1c19lbXB0eShjcHVfbWFzaykpCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgdmEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCWNwdW1hc2tfdCBjcHVfbWFzazsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9tYXNrKTsKKworCWlmIChjdXJyZW50LT5hY3RpdmVfbW0gPT0gbW0pIHsKKwkJaWYoY3VycmVudC0+bW0pCisJCQlfX2ZsdXNoX3RsYl9vbmUodmEpOworCQkgZWxzZQorCQkgCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQorCisJaWYgKCFjcHVzX2VtcHR5KGNwdV9tYXNrKSkKKwkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIHZhKTsKKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2ZsdXNoX3RsYl9hbGwodm9pZCogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCV9fZmx1c2hfdGxiX2FsbCgpOworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9MQVpZKQorCQlsZWF2ZV9tbShjcHUpOworfQorCit2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCBOVUxMLCAxLCAxKTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gc2VuZHMgYSAncmVzY2hlZHVsZScgSVBJIHRvIGFub3RoZXIgQ1BVLgorICogaXQgZ29lcyBzdHJhaWdodCB0aHJvdWdoIGFuZCB3YXN0ZXMgbm8gdGltZSBzZXJpYWxpemluZworICogYW55dGhpbmcuIFdvcnN0IGNhc2UgaXMgdGhhdCB3ZSBsb3NlIGEgcmVzY2hlZHVsZSAuLi4KKyAqLwordm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCit7CisJc2VuZF9JUElfbWFzayhjcHVtYXNrX29mX2NwdShjcHUpLCBSRVNDSEVEVUxFX1ZFQ1RPUik7Cit9CisKKy8qCisgKiBTdHJ1Y3R1cmUgYW5kIGRhdGEgZm9yIHNtcF9jYWxsX2Z1bmN0aW9uKCkuIFRoaXMgaXMgZGVzaWduZWQgdG8gbWluaW1pc2UKKyAqIHN0YXRpYyBtZW1vcnkgcmVxdWlyZW1lbnRzLiBJdCBhbHNvIGxvb2tzIGNsZWFuZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FsbF9sb2NrKTsKKworc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgeworCXZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyk7CisJdm9pZCAqaW5mbzsKKwlhdG9taWNfdCBzdGFydGVkOworCWF0b21pY190IGZpbmlzaGVkOworCWludCB3YWl0OworfTsKKworc3RhdGljIHN0cnVjdCBjYWxsX2RhdGFfc3RydWN0ICogY2FsbF9kYXRhOworCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdnZW5lcmljIGNhbGwgZnVuY3Rpb24nIElQSSB0byBhbGwgb3RoZXIgQ1BVcworICogaW4gdGhlIHN5c3RlbS4KKyAqLworCitpbnQgc21wX2NhbGxfZnVuY3Rpb24gKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCBub25hdG9taWMsCisJCQlpbnQgd2FpdCkKKy8qCisgKiBbU1VNTUFSWV0gUnVuIGEgZnVuY3Rpb24gb24gYWxsIG90aGVyIENQVXMuCisgKiA8ZnVuYz4gVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KKyAqIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KKyAqIDxub25hdG9taWM+IGN1cnJlbnRseSB1bnVzZWQuCisgKiA8d2FpdD4gSWYgdHJ1ZSwgd2FpdCAoYXRvbWljYWxseSkgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzLgorICogW1JFVFVSTlNdIDAgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIHN0YXR1cyBjb2RlLiBEb2VzIG5vdCByZXR1cm4gdW50aWwKKyAqIHJlbW90ZSBDUFVzIGFyZSBuZWFybHkgcmVhZHkgdG8gZXhlY3V0ZSA8PGZ1bmM+PiBvciBhcmUgb3IgaGF2ZSBleGVjdXRlZC4KKyAqCisgKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyBvciBmcm9tIGEKKyAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIG9yIGZyb20gYSBib3R0b20gaGFsZiBoYW5kbGVyLgorICovCit7CisJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKKwlpbnQgY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpLTE7CisKKwlpZiAoIWNwdXMpCisJCXJldHVybiAwOworCisJLyogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKworCWRhdGEuZnVuYyA9IGZ1bmM7CisJZGF0YS5pbmZvID0gaW5mbzsKKwlhdG9taWNfc2V0KCZkYXRhLnN0YXJ0ZWQsIDApOworCWRhdGEud2FpdCA9IHdhaXQ7CisJaWYgKHdhaXQpCisJCWF0b21pY19zZXQoJmRhdGEuZmluaXNoZWQsIDApOworCisJc3Bpbl9sb2NrKCZjYWxsX2xvY2spOworCWNhbGxfZGF0YSA9ICZkYXRhOworCW1iKCk7CisJCisJLyogU2VuZCBhIG1lc3NhZ2UgdG8gYWxsIG90aGVyIENQVXMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gcmVzcG9uZCAqLworCXNlbmRfSVBJX2FsbGJ1dHNlbGYoQ0FMTF9GVU5DVElPTl9WRUNUT1IpOworCisJLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuc3RhcnRlZCkgIT0gY3B1cykKKwkJY3B1X3JlbGF4KCk7CisKKwlpZiAod2FpdCkKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZkYXRhLmZpbmlzaGVkKSAhPSBjcHVzKQorCQkJY3B1X3JlbGF4KCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcF90aGlzX2NwdSAodm9pZCAqIGR1bW15KQoreworCS8qCisJICogUmVtb3ZlIHRoaXMgQ1BVOgorCSAqLworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWlmIChjcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCldLmhsdF93b3Jrc19vaykKKwkJZm9yKDs7KSBfX2FzbV9fKCJobHQiKTsKKwlmb3IgKDs7KTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlICdzdG9wJyBmdW5jdGlvbiBvbiBhbGwgb3RoZXIgQ1BVcyBpbiB0aGUgc3lzdGVtLgorICovCisKK3ZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQoreworCXNtcF9jYWxsX2Z1bmN0aW9uKHN0b3BfdGhpc19jcHUsIE5VTEwsIDEsIDApOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBSZXNjaGVkdWxlIGNhbGwgYmFjay4gTm90aGluZyB0byBkbywKKyAqIGFsbCB0aGUgd29yayBpcyBkb25lIGF1dG9tYXRpY2FsbHkgd2hlbgorICogd2UgcmV0dXJuIGZyb20gdGhlIGludGVycnVwdC4KKyAqLworZmFzdGNhbGwgdm9pZCBzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWNrX0FQSUNfaXJxKCk7Cit9CisKK2Zhc3RjYWxsIHZvaWQgc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbykgPSBjYWxsX2RhdGEtPmZ1bmM7CisJdm9pZCAqaW5mbyA9IGNhbGxfZGF0YS0+aW5mbzsKKwlpbnQgd2FpdCA9IGNhbGxfZGF0YS0+d2FpdDsKKworCWFja19BUElDX2lycSgpOworCS8qCisJICogTm90aWZ5IGluaXRpYXRpbmcgQ1BVIHRoYXQgSSd2ZSBncmFiYmVkIHRoZSBkYXRhIGFuZCBhbQorCSAqIGFib3V0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCisJICovCisJbWIoKTsKKwlhdG9taWNfaW5jKCZjYWxsX2RhdGEtPnN0YXJ0ZWQpOworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGUgaW5mbyBzdHJ1Y3R1cmUgbWF5IGJlIG91dCBvZiBzY29wZSB1bmxlc3Mgd2FpdD09MQorCSAqLworCWlycV9lbnRlcigpOworCSgqZnVuYykoaW5mbyk7CisJaXJxX2V4aXQoKTsKKworCWlmICh3YWl0KSB7CisJCW1iKCk7CisJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzJlZTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTAsMCArMSwxMTQ1IEBACisvKgorICoJeDg2IFNNUCBib290aW5nIGZ1bmN0aW9ucworICoKKyAqCShjKSAxOTk1IEFsYW4gQ294LCBCdWlsZGluZyAjMyA8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIDE5OTgsIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICoJTXVjaCBvZiB0aGUgY29yZSBTTVAgd29yayBpcyBiYXNlZCBvbiBwcmV2aW91cyB3b3JrIGJ5IFRob21hcyBSYWRrZSwgdG8KKyAqCXdob20gYSBncmVhdCBtYW55IHRoYW5rcyBhcmUgZXh0ZW5kZWQuCisgKgorICoJVGhhbmtzIHRvIEludGVsIGZvciBtYWtpbmcgYXZhaWxhYmxlIHNldmVyYWwgZGlmZmVyZW50IFBlbnRpdW0sCisgKglQZW50aXVtIFBybyBhbmQgUGVudGl1bS1JSS9YZW9uIE1QIG1hY2hpbmVzLgorICoJT3JpZ2luYWwgZGV2ZWxvcG1lbnQgb2YgTGludXggU01QIGNvZGUgc3VwcG9ydGVkIGJ5IENhbGRlcmEuCisgKgorICoJVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IKKyAqCWxhdGVyLgorICoKKyAqCUZpeGVzCisgKgkJRmVsaXggS29vcAk6CU5SX0NQVVMgdXNlZCBwcm9wZXJseQorICoJCUpvc2UgUmVuYXUJOglIYW5kbGUgc2luZ2xlIENQVSBjYXNlLgorICoJCUFsYW4gQ294CToJQnkgcmVwZWF0ZWQgcmVxdWVzdCA4KSAtIFRvdGFsIEJvZ29NSVBTIHJlcG9ydC4KKyAqCQlHcmVnIFdyaWdodAk6CUZpeCBmb3Iga2VybmVsIHN0YWNrcyBwYW5pYy4KKyAqCQlFcmljaCBCb2xleW4JOglNUCB2MS40IGFuZCBhZGRpdGlvbmFsIGNoYW5nZXMuCisgKglNYXR0aGlhcyBTYXR0bGVyCToJQ2hhbmdlcyBmb3IgMi4xIGtlcm5lbCBtYXAuCisgKglNaWNoZWwgTGVzcGluYXNzZQk6CUNoYW5nZXMgZm9yIDIuMSBrZXJuZWwgbWFwLgorICoJTWljaGFlbCBDaGFzdGFpbgk6CUNoYW5nZSB0cmFtcG9saW5lLlMgdG8gZ251IGFzLgorICoJCUFsYW4gQ294CToJRHVtYiBidWc6ICdCJyBzdGVwIFBQcm8ncyBhcmUgZmluZQorICoJCUluZ28gTW9sbmFyCToJQWRkZWQgQVBJQyB0aW1lcnMsIGJhc2VkIG9uIGNvZGUKKyAqCQkJCQlmcm9tIEpvc2UgUmVuYXUKKyAqCQlJbmdvIE1vbG5hcgk6CXZhcmlvdXMgY2xlYW51cHMgYW5kIHJld3JpdGVzCisgKgkJVGlncmFuIEFpdmF6aWFuCToJZml4ZWQgIjAuMDAgaW4gL3Byb2MvdXB0aW1lIG9uIFNNUCIgYnVnLgorICoJTWFjaWVqIFcuIFJvenlja2kJOglCaXRzIGZvciBnZW51aW5lIDgyNDg5RFggQVBJQ3MKKyAqCQlNYXJ0aW4gSi4gQmxpZ2gJOiAJQWRkZWQgc3VwcG9ydCBmb3IgbXVsdGktcXVhZCBzeXN0ZW1zCisgKgkJRGF2ZSBKb25lcwk6CVJlcG9ydCBpbnZhbGlkIGNvbWJpbmF0aW9ucyBvZiBBdGhsb24gQ1BVcy4KKyoJCVJ1c3R5IFJ1c3NlbGwJOglIYWNrZWQgaW50byBzaGFwZSBmb3IgbmV3ICJob3RwbHVnIiBib290IHByb2Nlc3MuICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX3dha2VjcHUuaD4KKyNpbmNsdWRlIDxzbXBib290X2hvb2tzLmg+CisKKy8qIFNldCBpZiB3ZSBmaW5kIGEgQiBzdGVwcGluZyBDUFUgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKKworLyogTnVtYmVyIG9mIHNpYmxpbmdzIHBlciBDUFUgcGFja2FnZSAqLworaW50IHNtcF9udW1fc2libGluZ3MgPSAxOworaW50IHBoeXNfcHJvY19pZFtOUl9DUFVTXTsgLyogUGFja2FnZSBJRCBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCitFWFBPUlRfU1lNQk9MKHBoeXNfcHJvY19pZCk7CisKKy8qIGJpdG1hcCBvZiBvbmxpbmUgY3B1cyAqLworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworCitjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CitjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOworc3RhdGljIGNwdW1hc2tfdCBzbXBfY29tbWVuY2VkX21hc2s7CisKKy8qIFBlciBDUFUgYm9nb21pcHMgYW5kIG90aGVyIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCit1OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSA9CisJCQl7IFswIC4uLiBOUl9DUFVTLTFdID0gMHhmZiB9OworRVhQT1JUX1NZTUJPTCh4ODZfY3B1X3RvX2FwaWNpZCk7CisKKy8qCisgKiBUcmFtcG9saW5lIDgweDg2IHByb2dyYW0gYXMgYW4gYXJyYXkuCisgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZV9kYXRhIFtdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZV9lbmQgIFtdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRyYW1wb2xpbmVfYmFzZTsKK3N0YXRpYyBpbnQgdHJhbXBvbGluZV9leGVjOworCitzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKHZvaWQpOworCisvKgorICogQ3VycmVudGx5IHRyaXZpYWwuIFdyaXRlIHRoZSByZWFsLT5wcm90ZWN0ZWQgbW9kZQorICogYm9vdHN0cmFwIGludG8gdGhlIHBhZ2UgY29uY2VybmVkLiBUaGUgY2FsbGVyCisgKiBoYXMgbWFkZSBzdXJlIGl0J3Mgc3VpdGFibHkgYWxpZ25lZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgc2V0dXBfdHJhbXBvbGluZSh2b2lkKQoreworCW1lbWNweSh0cmFtcG9saW5lX2Jhc2UsIHRyYW1wb2xpbmVfZGF0YSwgdHJhbXBvbGluZV9lbmQgLSB0cmFtcG9saW5lX2RhdGEpOworCXJldHVybiB2aXJ0X3RvX3BoeXModHJhbXBvbGluZV9iYXNlKTsKK30KKworLyoKKyAqIFdlIGFyZSBjYWxsZWQgdmVyeSBlYXJseSB0byBnZXQgdGhlIGxvdyBtZW1vcnkgZm9yIHRoZQorICogU01QIGJvb3R1cCB0cmFtcG9saW5lIHBhZ2UuCisgKi8KK3ZvaWQgX19pbml0IHNtcF9hbGxvY19tZW1vcnkodm9pZCkKK3sKKwl0cmFtcG9saW5lX2Jhc2UgPSAodm9pZCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCS8qCisJICogSGFzIHRvIGJlIGluIHZlcnkgbG93IG1lbW9yeSBzbyB3ZSBjYW4gZXhlY3V0ZQorCSAqIHJlYWwtbW9kZSBBUCBjb2RlLgorCSAqLworCWlmIChfX3BhKHRyYW1wb2xpbmVfYmFzZSkgPj0gMHg5RjAwMCkKKwkJQlVHKCk7CisJLyoKKwkgKiBNYWtlIHRoZSBTTVAgdHJhbXBvbGluZSBleGVjdXRhYmxlOgorCSAqLworCXRyYW1wb2xpbmVfZXhlYyA9IHNldF9rZXJuZWxfZXhlYygodW5zaWduZWQgbG9uZyl0cmFtcG9saW5lX2Jhc2UsIDEpOworfQorCisvKgorICogVGhlIGJvb3RzdHJhcCBrZXJuZWwgZW50cnkgY29kZSBoYXMgc2V0IHRoZXNlIHVwLiBTYXZlIHRoZW0gZm9yCisgKiBhIGdpdmVuIENQVQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgaWQ7CisKKwkqYyA9IGJvb3RfY3B1X2RhdGE7CisJaWYgKGlkIT0wKQorCQlpZGVudGlmeV9jcHUoYyk7CisJLyoKKwkgKiBNYXNrIEIsIFBlbnRpdW0sIGJ1dCBub3QgUGVudGl1bSBNTVgKKwkgKi8KKwlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICYmCisJICAgIGMtPng4NiA9PSA1ICYmCisJICAgIGMtPng4Nl9tYXNrID49IDEgJiYgYy0+eDg2X21hc2sgPD0gNCAmJgorCSAgICBjLT54ODZfbW9kZWwgPD0gMykKKwkJLyoKKwkJICogUmVtZW1iZXIgd2UgaGF2ZSBCIHN0ZXAgUGVudGlhIHdpdGggYnVncworCQkgKi8KKwkJc21wX2Jfc3RlcHBpbmcgPSAxOworCisJLyoKKwkgKiBDZXJ0YWluIEF0aGxvbnMgbWlnaHQgd29yayAoZm9yIHZhcmlvdXMgdmFsdWVzIG9mICd3b3JrJykgaW4gU01QCisJICogYnV0IHRoZXkgYXJlIG5vdCBjZXJ0aWZpZWQgYXMgTVAgY2FwYWJsZS4KKwkgKi8KKwlpZiAoKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpICYmIChjLT54ODYgPT0gNikpIHsKKworCQkvKiBBdGhsb24gNjYwLzY2MSBpcyB2YWxpZC4gKi8JCisJCWlmICgoYy0+eDg2X21vZGVsPT02KSAmJiAoKGMtPng4Nl9tYXNrPT0wKSB8fCAoYy0+eDg2X21hc2s9PTEpKSkKKwkJCWdvdG8gdmFsaWRfazc7CisKKwkJLyogRHVyb24gNjcwIGlzIHZhbGlkICovCisJCWlmICgoYy0+eDg2X21vZGVsPT03KSAmJiAoYy0+eDg2X21hc2s9PTApKQorCQkJZ290byB2YWxpZF9rNzsKKworCQkvKgorCQkgKiBBdGhsb24gNjYyLCBEdXJvbiA2NzEsIGFuZCBBdGhsb24gPm1vZGVsIDcgaGF2ZSBjYXBhYmlsaXR5IGJpdC4KKwkJICogSXQncyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgQTUgc3RlcHBpbmcgKDY2Mikgb2Ygc29tZSBBdGhsb24gWFAncworCQkgKiBoYXZlIHRoZSBNUCBiaXQgc2V0LgorCQkgKiBTZWUgaHR0cDovL3d3dy5oZWlzZS5kZS9uZXdzdGlja2VyL2RhdGEvam93LTE4LjEwLjAxLTAwMCBmb3IgbW9yZS4KKwkJICovCisJCWlmICgoKGMtPng4Nl9tb2RlbD09NikgJiYgKGMtPng4Nl9tYXNrPj0yKSkgfHwKKwkJICAgICgoYy0+eDg2X21vZGVsPT03KSAmJiAoYy0+eDg2X21hc2s+PTEpKSB8fAorCQkgICAgIChjLT54ODZfbW9kZWw+IDcpKQorCQkJaWYgKGNwdV9oYXNfbXApCisJCQkJZ290byB2YWxpZF9rNzsKKworCQkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQncyBub3QgYSBjZXJ0aWZpZWQgU01QIGNhcGFibGUgQU1EIHN5c3RlbS4gKi8KKwkJdGFpbnRlZCB8PSBUQUlOVF9VTlNBRkVfU01QOworCX0KKwordmFsaWRfazc6CisJOworfQorCisvKgorICogVFNDIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBjaGVjayB3aGV0aGVyIGFsbCBDUFVzIGhhdmUgdGhlaXIgVFNDJ3Mgc3luY2hyb25pemVkLAorICogdGhlbiB3ZSBwcmludCBhIHdhcm5pbmcgaWYgbm90LCBhbmQgYWx3YXlzIHJlc3luYy4KKyAqLworCitzdGF0aWMgYXRvbWljX3QgdHNjX3N0YXJ0X2ZsYWcgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBhdG9taWNfdCB0c2NfY291bnRfc3RhcnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBhdG9taWNfdCB0c2NfY291bnRfc3RvcCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0c2NfdmFsdWVzW05SX0NQVVNdOworCisjZGVmaW5lIE5SX0xPT1BTIDUKKworc3RhdGljIHZvaWQgX19pbml0IHN5bmNocm9uaXplX3RzY19icCAodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHN1bSwgYXZnOworCWxvbmcgbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIG9uZV91c2VjOworCWludCBidWdneSA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJjaGVja2luZyBUU0Mgc3luY2hyb25pemF0aW9uIGFjcm9zcyAldSBDUFVzOiAiLCBudW1fYm9vdGluZ19jcHVzKCkpOworCisJLyogY29udmVydCBmcm9tIGtjeWMvc2VjIHRvIGN5Yy91c2VjICovCisJb25lX3VzZWMgPSBjcHVfa2h6IC8gMTAwMDsKKworCWF0b21pY19zZXQoJnRzY19zdGFydF9mbGFnLCAxKTsKKwl3bWIoKTsKKworCS8qCisJICogV2UgbG9vcCBhIGZldyB0aW1lcyB0byBnZXQgYSBwcmltZWQgaW5zdHJ1Y3Rpb24gY2FjaGUsCisJICogdGhlbiB0aGUgbGFzdCBwYXNzIGlzIG1vcmUgb3IgbGVzcyBzeW5jaHJvbml6ZWQgYW5kCisJICogdGhlIEJQIGFuZCBBUHMgc2V0IHRoZWlyIGN5Y2xlIGNvdW50ZXJzIHRvIHplcm8gYWxsIGF0CisJICogb25jZS4gVGhpcyByZWR1Y2VzIHRoZSBjaGFuY2Ugb2YgaGF2aW5nIHJhbmRvbSBvZmZzZXRzCisJICogYmV0d2VlbiB0aGUgcHJvY2Vzc29ycywgYW5kIGd1YXJhbnRlZXMgdGhhdCB0aGUgbWF4aW11bQorCSAqIGRlbGF5IGJldHdlZW4gdGhlIGN5Y2xlIGNvdW50ZXJzIGlzIG5ldmVyIGJpZ2dlciB0aGFuCisJICogdGhlIGxhdGVuY3kgb2YgaW5mb3JtYXRpb24tcGFzc2luZyAoY2FjaGVsaW5lcykgYmV0d2VlbgorCSAqIHR3byBDUFVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9MT09QUzsgaSsrKSB7CisJCS8qCisJCSAqIGFsbCBBUHMgc3luY2hyb25pemUgYnV0IHRoZXkgbG9vcCBvbiAnPT0gbnVtX2NwdXMnCisJCSAqLworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdGFydCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpLTEpCisJCQltYigpOworCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RvcCwgMCk7CisJCXdtYigpOworCQkvKgorCQkgKiB0aGlzIGxldHMgdGhlIEFQcyBzYXZlIHRoZWlyIGN1cnJlbnQgVFNDOgorCQkgKi8KKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0YXJ0KTsKKworCQlyZHRzY2xsKHRzY192YWx1ZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CisJCS8qCisJCSAqIFdlIGNsZWFyIHRoZSBUU0MgaW4gdGhlIGxhc3QgbG9vcDoKKwkJICovCisJCWlmIChpID09IE5SX0xPT1BTLTEpCisJCQl3cml0ZV90c2MoMCwgMCk7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgYWxsIEFQcyB0byBsZWF2ZSB0aGUgc3luY2hyb25pemF0aW9uIHBvaW50OgorCQkgKi8KKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RvcCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpLTEpCisJCQltYigpOworCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RhcnQsIDApOworCQl3bWIoKTsKKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0b3ApOworCX0KKworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpIHsKKwkJCXQwID0gdHNjX3ZhbHVlc1tpXTsKKwkJCXN1bSArPSB0MDsKKwkJfQorCX0KKwlhdmcgPSBzdW07CisJZG9fZGl2KGF2ZywgbnVtX2Jvb3RpbmdfY3B1cygpKTsKKworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQorCQkJY29udGludWU7CisJCWRlbHRhID0gdHNjX3ZhbHVlc1tpXSAtIGF2ZzsKKwkJaWYgKGRlbHRhIDwgMCkKKwkJCWRlbHRhID0gLWRlbHRhOworCQkvKgorCQkgKiBXZSByZXBvcnQgYmlnZ2VyIHRoYW4gMiBtaWNyb3NlY29uZHMgY2xvY2sgZGlmZmVyZW5jZXMuCisJCSAqLworCQlpZiAoZGVsdGEgPiAyKm9uZV91c2VjKSB7CisJCQlsb25nIHJlYWxkZWx0YTsKKwkJCWlmICghYnVnZ3kpIHsKKwkJCQlidWdneSA9IDE7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJcmVhbGRlbHRhID0gZGVsdGE7CisJCQlkb19kaXYocmVhbGRlbHRhLCBvbmVfdXNlYyk7CisJCQlpZiAodHNjX3ZhbHVlc1tpXSA8IGF2ZykKKwkJCQlyZWFsZGVsdGEgPSAtcmVhbGRlbHRhOworCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFUjJWQgaGFkICVsZCB1c2VjcyBUU0Mgc2tldywgZml4ZWQgaXQgdXAuXG4iLCBpLCByZWFsZGVsdGEpOworCQl9CisKKwkJc3VtICs9IGRlbHRhOworCX0KKwlpZiAoIWJ1Z2d5KQorCQlwcmludGsoInBhc3NlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3luY2hyb25pemVfdHNjX2FwICh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBOb3QgZXZlcnkgY3B1IGlzIG9ubGluZSBhdCB0aGUgdGltZQorCSAqIHRoaXMgZ2V0cyBjYWxsZWQsIHNvIHdlIGZpcnN0IHdhaXQgZm9yIHRoZSBCUCB0bworCSAqIGZpbmlzaCBTTVAgaW5pdGlhbGl6YXRpb246CisJICovCisJd2hpbGUgKCFhdG9taWNfcmVhZCgmdHNjX3N0YXJ0X2ZsYWcpKSBtYigpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0YXJ0KTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKKwkJCW1iKCk7CisKKwkJcmR0c2NsbCh0c2NfdmFsdWVzW3NtcF9wcm9jZXNzb3JfaWQoKV0pOworCQlpZiAoaSA9PSBOUl9MT09QUy0xKQorCQkJd3JpdGVfdHNjKDAsIDApOworCisJCWF0b21pY19pbmMoJnRzY19jb3VudF9zdG9wKTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RvcCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpKSBtYigpOworCX0KK30KKyN1bmRlZiBOUl9MT09QUworCitleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CisKK3N0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQ7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfY2FsbGluKHZvaWQpCit7CisJaW50IGNwdWlkLCBwaHlzX2lkOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qCisJICogSWYgd2FrZW4gdXAgYnkgYW4gSU5JVCBpbiBhbiA4MjQ4OURYIGNvbmZpZ3VyYXRpb24KKwkgKiB3ZSBtYXkgZ2V0IGhlcmUgYmVmb3JlIGFuIElOSVQtZGVhc3NlcnQgSVBJIHJlYWNoZXMKKwkgKiBvdXIgbG9jYWwgQVBJQy4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIElQSSBvciB3ZSdsbAorCSAqIGxvY2sgdXAgb24gYW4gQVBJQyBhY2Nlc3MuCisJICovCisJd2FpdF9mb3JfaW5pdF9kZWFzc2VydCgmaW5pdF9kZWFzc2VydGVkKTsKKworCS8qCisJICogKFRoaXMgd29ya3MgZXZlbiBpZiB0aGUgQVBJQyBpcyBub3QgZW5hYmxlZC4pCisJICovCisJcGh5c19pZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisJY3B1aWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKGNwdV9pc3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApKSB7CisJCXByaW50aygiaHVoLCBwaHlzIENQVSMlZCwgQ1BVIyVkIGFscmVhZHkgcHJlc2VudD8/XG4iLAorCQkJCQlwaHlzX2lkLCBjcHVpZCk7CisJCUJVRygpOworCX0KKwlEcHJpbnRrKCJDUFUjJWQgKHBoeXMgSUQ6ICVkKSB3YWl0aW5nIGZvciBDQUxMT1VUXG4iLCBjcHVpZCwgcGh5c19pZCk7CisKKwkvKgorCSAqIFNUQVJUVVAgSVBJcyBhcmUgZnJhZ2lsZSBiZWFzdHMgYXMgdGhleSBtaWdodCBzb21ldGltZXMKKwkgKiB0cmlnZ2VyIHNvbWUgZ2x1ZSBtb3RoZXJib2FyZCBsb2dpYy4gQ29tcGxldGUgQVBJQyBidXMKKwkgKiBzaWxlbmNlIGZvciAxIHNlY29uZCwgdGhpcyBvdmVyZXN0aW1hdGVzIHRoZSB0aW1lIHRoZQorCSAqIGJvb3QgQ1BVIGlzIHNwZW5kaW5nIHRvIHNlbmQgdGhlIHVwIHRvIDIgU1RBUlRVUCBJUElzCisJICogYnkgYSBmYWN0b3Igb2YgdHdvLiBUaGlzIHNob3VsZCBiZSBlbm91Z2guCisJICovCisKKwkvKgorCSAqIFdhaXRpbmcgMnMgdG90YWwgZm9yIHN0YXJ0dXAgKHVkZWxheSBpcyBub3QgeWV0IHdvcmtpbmcpCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyAyKkhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkvKgorCQkgKiBIYXMgdGhlIGJvb3QgQ1BVIGZpbmlzaGVkIGl0J3MgU1RBUlRVUCBzZXF1ZW5jZT8KKwkJICovCisJCWlmIChjcHVfaXNzZXQoY3B1aWQsIGNwdV9jYWxsb3V0X21hcCkpCisJCQlicmVhazsKKwkJcmVwX25vcCgpOworCX0KKworCWlmICghdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcHJpbnRrKCJCVUc6IENQVSVkIHN0YXJ0ZWQgdXAgYnV0IGRpZCBub3QgZ2V0IGEgY2FsbG91dCFcbiIsCisJCQljcHVpZCk7CisJCUJVRygpOworCX0KKworCS8qCisJICogdGhlIGJvb3QgQ1BVIGhhcyBmaW5pc2hlZCB0aGUgaW5pdCBzdGFnZSBhbmQgaXMgc3Bpbm5pbmcKKwkgKiBvbiBjYWxsaW5fbWFwIHVudGlsIHdlIGZpbmlzaC4gV2UgYXJlIGZyZWUgdG8gc2V0IHVwIHRoaXMKKwkgKiBDUFUsIGZpcnN0IHRoZSBBUElDLiAodGhpcyBpcyBwcm9iYWJseSByZWR1bmRhbnQgb24gbW9zdAorCSAqIGJvYXJkcykKKwkgKi8KKworCURwcmludGsoIkNBTExJTiwgYmVmb3JlIHNldHVwX2xvY2FsX0FQSUMoKS5cbiIpOworCXNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYygpOworCXNldHVwX2xvY2FsX0FQSUMoKTsKKwltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisKKwkvKgorCSAqIEdldCBvdXIgYm9nb21pcHMuCisJICovCisJY2FsaWJyYXRlX2RlbGF5KCk7CisJRHByaW50aygiU3RhY2sgYXQgYWJvdXQgJXBcbiIsJmNwdWlkKTsKKworCS8qCisJICogU2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMKKwkgKi8KKyAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKKworCWRpc2FibGVfQVBJQ190aW1lcigpOworCisJLyoKKwkgKiBBbGxvdyB0aGUgbWFzdGVyIHRvIGNvbnRpbnVlLgorCSAqLworCWNwdV9zZXQoY3B1aWQsIGNwdV9jYWxsaW5fbWFwKTsKKworCS8qCisJICogICAgICBTeW5jaHJvbml6ZSB0aGUgVFNDIHdpdGggdGhlIEJQCisJICovCisJaWYgKGNwdV9oYXNfdHNjICYmIGNwdV9raHopCisJCXN5bmNocm9uaXplX3RzY19hcCgpOworfQorCitzdGF0aWMgaW50IGNwdWNvdW50OworCisvKgorICogQWN0aXZhdGUgYSBzZWNvbmRhcnkgcHJvY2Vzc29yLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKnVudXNlZCkKK3sKKwkvKgorCSAqIERvbnQgcHV0IGFueXRoaW5nIGJlZm9yZSBzbXBfY2FsbGluKCksIFNNUAorCSAqIGJvb3RpbmcgaXMgdG9vIGZyYWdpbGUgdGhhdCB3ZSB3YW50IHRvIGxpbWl0IHRoZQorCSAqIHRoaW5ncyBkb25lIGhlcmUgdG8gdGhlIG1vc3QgbmVjZXNzYXJ5IHRoaW5ncy4KKwkgKi8KKwljcHVfaW5pdCgpOworCXNtcF9jYWxsaW4oKTsKKwl3aGlsZSAoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJlcF9ub3AoKTsKKwlzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jaygpOworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJCWVuYWJsZV9OTUlfdGhyb3VnaF9MVlQwKE5VTEwpOworCQllbmFibGVfODI1OUFfaXJxKDApOworCX0KKwllbmFibGVfQVBJQ190aW1lcigpOworCS8qCisJICogbG93LW1lbW9yeSBtYXBwaW5ncyBoYXZlIGJlZW4gY2xlYXJlZCwgZmx1c2ggdGhlbSBmcm9tCisJICogdGhlIGxvY2FsIFRMQnMgdG9vLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYigpOworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisKKwkvKiBXZSBjYW4gdGFrZSBpbnRlcnJ1cHRzIG5vdzogd2UncmUgb2ZmaWNpYWxseSAidXAiLiAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXdtYigpOworCWNwdV9pZGxlKCk7Cit9CisKKy8qCisgKiBFdmVyeXRoaW5nIGhhcyBiZWVuIHNldCB1cCBmb3IgdGhlIHNlY29uZGFyeQorICogQ1BVcyAtIHRoZXkganVzdCBuZWVkIHRvIHJlbG9hZCBldmVyeXRoaW5nCisgKiBmcm9tIHRoZSB0YXNrIHN0cnVjdHVyZQorICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCByZXR1cm4uCisgKi8KK3ZvaWQgX19pbml0IGluaXRpYWxpemVfc2Vjb25kYXJ5KHZvaWQpCit7CisJLyoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGxvYWQgdGhlIGZ1bGwgVFNTLAorCSAqIGJhc2ljYWxseSBqdXN0IHRoZSBzdGFjayBwb2ludGVyIGFuZCB0aGUgZWlwLgorCSAqLworCisJYXNtIHZvbGF0aWxlKAorCQkibW92bCAlMCwlJWVzcFxuXHQiCisJCSJqbXAgKiUxIgorCQk6CisJCToiciIgKGN1cnJlbnQtPnRocmVhZC5lc3ApLCJyIiAoY3VycmVudC0+dGhyZWFkLmVpcCkpOworfQorCitleHRlcm4gc3RydWN0IHsKKwl2b2lkICogZXNwOworCXVuc2lnbmVkIHNob3J0IHNzOworfSBzdGFja19zdGFydDsKKworI2lmZGVmIENPTkZJR19OVU1BCisKKy8qIHdoaWNoIGxvZ2ljYWwgQ1BVcyBhcmUgb24gd2hpY2ggbm9kZXMgKi8KK2NwdW1hc2tfdCBub2RlXzJfY3B1X21hc2tbTUFYX05VTU5PREVTXSA9CisJCQkJeyBbMCAuLi4gTUFYX05VTU5PREVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworLyogd2hpY2ggbm9kZSBlYWNoIGxvZ2ljYWwgQ1BVIGlzIG9uICovCitpbnQgY3B1XzJfbm9kZVtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSAwIH07CitFWFBPUlRfU1lNQk9MKGNwdV8yX25vZGUpOworCisvKiBzZXQgdXAgYSBtYXBwaW5nIGJldHdlZW4gY3B1IGFuZCBub2RlLiAqLworc3RhdGljIGlubGluZSB2b2lkIG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKK3sKKwlwcmludGsoIk1hcHBpbmcgY3B1ICVkIHRvIG5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CisJY3B1X3NldChjcHUsIG5vZGVfMl9jcHVfbWFza1tub2RlXSk7CisJY3B1XzJfbm9kZVtjcHVdID0gbm9kZTsKK30KKworLyogdW5kbyBhIG1hcHBpbmcgYmV0d2VlbiBjcHUgYW5kIG5vZGUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfY3B1X3RvX25vZGUoaW50IGNwdSkKK3sKKwlpbnQgbm9kZTsKKworCXByaW50aygiVW5tYXBwaW5nIGNwdSAlZCBmcm9tIGFsbCBub2Rlc1xuIiwgY3B1KTsKKwlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlICsrKQorCQljcHVfY2xlYXIoY3B1LCBub2RlXzJfY3B1X21hc2tbbm9kZV0pOworCWNwdV8yX25vZGVbY3B1XSA9IDA7Cit9CisjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KKworI2RlZmluZSBtYXBfY3B1X3RvX25vZGUoY3B1LCBub2RlKQkoe30pCisjZGVmaW5lIHVubWFwX2NwdV90b19ub2RlKGNwdSkJKHt9KQorCisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKwordTggY3B1XzJfbG9naWNhbF9hcGljaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OworCitzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgYXBpY2lkID0gbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdID0gYXBpY2lkOworCW1hcF9jcHVfdG9fbm9kZShjcHUsIGFwaWNpZF90b19ub2RlKGFwaWNpZCkpOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKK3sKKwljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdID0gQkFEX0FQSUNJRDsKKwl1bm1hcF9jcHVfdG9fbm9kZShjcHUpOworfQorCisjaWYgQVBJQ19ERUJVRworc3RhdGljIGlubGluZSB2b2lkIF9faW5xdWlyZV9yZW1vdGVfYXBpYyhpbnQgYXBpY2lkKQoreworCWludCBpLCByZWdzW10gPSB7IEFQSUNfSUQgPj4gNCwgQVBJQ19MVlIgPj4gNCwgQVBJQ19TUElWID4+IDQgfTsKKwljaGFyICpuYW1lc1tdID0geyAiSUQiLCAiVkVSU0lPTiIsICJTUElWIiB9OworCWludCB0aW1lb3V0LCBzdGF0dXM7CisKKwlwcmludGsoIklucXVpcmluZyByZW1vdGUgQVBJQyAjJWQuLi5cbiIsIGFwaWNpZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJlZ3MpIC8gc2l6ZW9mKCpyZWdzKTsgaSsrKSB7CisJCXByaW50aygiLi4uIEFQSUMgIyVkICVzOiAiLCBhcGljaWQsIG5hbWVzW2ldKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciBpZGxlLgorCQkgKi8KKwkJYXBpY193YWl0X2ljcl9pZGxlKCk7CisKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKGFwaWNpZCkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ETV9SRU1SRCB8IHJlZ3NbaV0pOworCisJCXRpbWVvdXQgPSAwOworCQlkbyB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCXN0YXR1cyA9IGFwaWNfcmVhZChBUElDX0lDUikgJiBBUElDX0lDUl9SUl9NQVNLOworCQl9IHdoaWxlIChzdGF0dXMgPT0gQVBJQ19JQ1JfUlJfSU5QUk9HICYmIHRpbWVvdXQrKyA8IDEwMDApOworCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgQVBJQ19JQ1JfUlJfVkFMSUQ6CisJCQlzdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19SUlIpOworCQkJcHJpbnRrKCIlMDh4XG4iLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoImZhaWxlZFxuIik7CisJCX0KKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIFdBS0VfU0VDT05EQVJZX1ZJQV9OTUkKKy8qIAorICogUG9rZSB0aGUgb3RoZXIgQ1BVIGluIHRoZSBleWUgdmlhIE5NSSB0byB3YWtlIGl0IHVwLiBSZW1lbWJlciB0aGF0IHRoZSBub3JtYWwKKyAqIElOSVQsIElOSVQsIFNUQVJUVVAgc2VxdWVuY2Ugd2lsbCByZXNldCB0aGUgY2hpcCBoYXJkIGZvciB1cywgYW5kIHRoaXMKKyAqIHdvbid0IC4uLiByZW1lbWJlciB0byBjbGVhciBkb3duIHRoZSBBUElDLCBldGMgbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0Cit3YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgbG9naWNhbF9hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMgPSAwLCBhY2NlcHRfc3RhdHVzID0gMDsKKwlpbnQgdGltZW91dCwgbWF4bHZ0OworCisJLyogVGFyZ2V0IGNoaXAgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIFNFVF9BUElDX0RFU1RfRklFTEQobG9naWNhbF9hcGljaWQpKTsKKworCS8qIEJvb3Qgb24gdGhlIHN0YWNrICovCisJLyogS2ljayB0aGUgc2Vjb25kICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIEFQSUNfRE1fTk1JIHwgQVBJQ19ERVNUX0xPR0lDQUwpOworCisJRHByaW50aygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJRHByaW50aygiKyIpOworCQl1ZGVsYXkoMTAwKTsKKwkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKKwl9IHdoaWxlIChzZW5kX3N0YXR1cyAmJiAodGltZW91dCsrIDwgMTAwMCkpOworCisJLyoKKwkgKiBHaXZlIHRoZSBvdGhlciBDUFUgc29tZSB0aW1lIHRvIGFjY2VwdCB0aGUgSVBJLgorCSAqLworCXVkZWxheSgyMDApOworCS8qCisJICogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLgorCSAqLworCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwlpZiAobWF4bHZ0ID4gMykgeworCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCX0KKwlhY2NlcHRfc3RhdHVzID0gKGFwaWNfcmVhZChBUElDX0VTUikgJiAweEVGKTsKKwlEcHJpbnRrKCJOTUkgc2VudC5cbiIpOworCisJaWYgKHNlbmRfc3RhdHVzKQorCQlwcmludGsoIkFQSUMgbmV2ZXIgZGVsaXZlcmVkPz8/XG4iKTsKKwlpZiAoYWNjZXB0X3N0YXR1cykKKwkJcHJpbnRrKCJBUElDIGRlbGl2ZXJ5IGVycm9yICglbHgpLlxuIiwgYWNjZXB0X3N0YXR1cyk7CisKKwlyZXR1cm4gKHNlbmRfc3RhdHVzIHwgYWNjZXB0X3N0YXR1cyk7Cit9CisjZW5kaWYJLyogV0FLRV9TRUNPTkRBUllfVklBX05NSSAqLworCisjaWZkZWYgV0FLRV9TRUNPTkRBUllfVklBX0lOSVQKK3N0YXRpYyBpbnQgX19pbml0Cit3YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMgPSAwLCBhY2NlcHRfc3RhdHVzID0gMDsKKwlpbnQgbWF4bHZ0LCB0aW1lb3V0LCBudW1fc3RhcnRzLCBqOworCisJLyoKKwkgKiBCZSBwYXJhbm9pZCBhYm91dCBjbGVhcmluZyBBUElDIGVycm9ycy4KKwkgKi8KKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltwaHlzX2FwaWNpZF0pKSB7CisJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfcmVhZChBUElDX0VTUik7CisJfQorCisJRHByaW50aygiQXNzZXJ0aW5nIElOSVQuXG4iKTsKKworCS8qCisJICogVHVybiBJTklUIG9uIHRhcmdldCBjaGlwCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKHBoeXNfYXBpY2lkKSk7CisKKwkvKgorCSAqIFNlbmQgSVBJCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIEFQSUNfSU5UX0xFVkVMVFJJRyB8IEFQSUNfSU5UX0FTU0VSVAorCQkJCXwgQVBJQ19ETV9JTklUKTsKKworCURwcmludGsoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCURwcmludGsoIisiKTsKKwkJdWRlbGF5KDEwMCk7CisJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKKworCW1kZWxheSgxMCk7CisKKwlEcHJpbnRrKCJEZWFzc2VydGluZyBJTklULlxuIik7CisKKwkvKiBUYXJnZXQgY2hpcCAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOworCisJLyogU2VuZCBJUEkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19ETV9JTklUKTsKKworCURwcmludGsoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCURwcmludGsoIisiKTsKKwkJdWRlbGF5KDEwMCk7CisJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKKworCWF0b21pY19zZXQoJmluaXRfZGVhc3NlcnRlZCwgMSk7CisKKwkvKgorCSAqIFNob3VsZCB3ZSBzZW5kIFNUQVJUVVAgSVBJcyA/CisJICoKKwkgKiBEZXRlcm1pbmUgdGhpcyBiYXNlZCBvbiB0aGUgQVBJQyB2ZXJzaW9uLgorCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gaW50ZWdyYXRlZCBBUElDLCBkb24ndCBzZW5kIHRoZSBTVEFSVFVQIElQSXMuCisJICovCisJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkKKwkJbnVtX3N0YXJ0cyA9IDI7CisJZWxzZQorCQludW1fc3RhcnRzID0gMDsKKworCS8qCisJICogUnVuIFNUQVJUVVAgSVBJIGxvb3AuCisJICovCisJRHByaW50aygiI3N0YXJ0dXAgbG9vcHM6ICVkLlxuIiwgbnVtX3N0YXJ0cyk7CisKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKKwlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgeworCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKKwkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwkJRHByaW50aygiQWZ0ZXIgYXBpY193cml0ZS5cbiIpOworCisJCS8qCisJCSAqIFNUQVJUVVAgSVBJCisJCSAqLworCisJCS8qIFRhcmdldCBjaGlwICovCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOworCisJCS8qIEJvb3Qgb24gdGhlIHN0YWNrICovCisJCS8qIEtpY2sgdGhlIHNlY29uZCAqLworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ETV9TVEFSVFVQCisJCQkJCXwgKHN0YXJ0X2VpcCA+PiAxMikpOworCisJCS8qCisJCSAqIEdpdmUgdGhlIG90aGVyIENQVSBzb21lIHRpbWUgdG8gYWNjZXB0IHRoZSBJUEkuCisJCSAqLworCQl1ZGVsYXkoMzAwKTsKKworCQlEcHJpbnRrKCJTdGFydHVwIHBvaW50IDEuXG4iKTsKKworCQlEcHJpbnRrKCJXYWl0aW5nIGZvciBzZW5kIHRvIGZpbmlzaC4uLlxuIik7CisJCXRpbWVvdXQgPSAwOworCQlkbyB7CisJCQlEcHJpbnRrKCIrIik7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJCX0gd2hpbGUgKHNlbmRfc3RhdHVzICYmICh0aW1lb3V0KysgPCAxMDAwKSk7CisKKwkJLyoKKwkJICogR2l2ZSB0aGUgb3RoZXIgQ1BVIHNvbWUgdGltZSB0byBhY2NlcHQgdGhlIElQSS4KKwkJICovCisJCXVkZWxheSgyMDApOworCQkvKgorCQkgKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuCisJCSAqLworCQlpZiAobWF4bHZ0ID4gMykgeworCQkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCX0KKwkJYWNjZXB0X3N0YXR1cyA9IChhcGljX3JlYWQoQVBJQ19FU1IpICYgMHhFRik7CisJCWlmIChzZW5kX3N0YXR1cyB8fCBhY2NlcHRfc3RhdHVzKQorCQkJYnJlYWs7CisJfQorCURwcmludGsoIkFmdGVyIFN0YXJ0dXAuXG4iKTsKKworCWlmIChzZW5kX3N0YXR1cykKKwkJcHJpbnRrKCJBUElDIG5ldmVyIGRlbGl2ZXJlZD8/P1xuIik7CisJaWYgKGFjY2VwdF9zdGF0dXMpCisJCXByaW50aygiQVBJQyBkZWxpdmVyeSBlcnJvciAoJWx4KS5cbiIsIGFjY2VwdF9zdGF0dXMpOworCisJcmV0dXJuIChzZW5kX3N0YXR1cyB8IGFjY2VwdF9zdGF0dXMpOworfQorI2VuZGlmCS8qIFdBS0VfU0VDT05EQVJZX1ZJQV9JTklUICovCisKK2V4dGVybiBjcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkOworCitzdGF0aWMgaW50IF9faW5pdCBkb19ib290X2NwdShpbnQgYXBpY2lkKQorLyoKKyAqIE5PVEUgLSBvbiBtb3N0IHN5c3RlbXMgdGhpcyBpcyBhIFBIWVNJQ0FMIGFwaWMgSUQsIGJ1dCBvbiBtdWx0aXF1YWQKKyAqIChpZSBjbHVzdGVyZWQgYXBpYyBhZGRyZXNzaW5nIG1vZGUpLCB0aGlzIGlzIGEgTE9HSUNBTCBhcGljIElELgorICogUmV0dXJucyB6ZXJvIGlmIENQVSBib290ZWQgT0ssIGVsc2UgZXJyb3IgY29kZSBmcm9tIHdha2V1cF9zZWNvbmRhcnlfY3B1LgorICovCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXVuc2lnbmVkIGxvbmcgYm9vdF9lcnJvcjsKKwlpbnQgdGltZW91dCwgY3B1OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwOworCXVuc2lnbmVkIHNob3J0IG5taV9oaWdoID0gMCwgbm1pX2xvdyA9IDA7CisKKwljcHUgPSArK2NwdWNvdW50OworCS8qCisJICogV2UgY2FuJ3QgdXNlIGtlcm5lbF90aHJlYWQgc2luY2Ugd2UgbXVzdCBhdm9pZCB0bworCSAqIHJlc2NoZWR1bGUgdGhlIGNoaWxkLgorCSAqLworCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKwlpZiAoSVNfRVJSKGlkbGUpKQorCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAlZCIsIGNwdSk7CisJaWRsZS0+dGhyZWFkLmVpcCA9ICh1bnNpZ25lZCBsb25nKSBzdGFydF9zZWNvbmRhcnk7CisJLyogc3RhcnRfZWlwIGhhZCBiZXR0ZXIgYmUgcGFnZS1hbGlnbmVkISAqLworCXN0YXJ0X2VpcCA9IHNldHVwX3RyYW1wb2xpbmUoKTsKKworCS8qIFNvIHdlIHNlZSB3aGF0J3MgdXAgICAqLworCXByaW50aygiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWQgZWlwICVseFxuIiwgY3B1LCBhcGljaWQsIHN0YXJ0X2VpcCk7CisJLyogU3RhY2sgZm9yIHN0YXJ0dXBfMzIgY2FuIGJlIGp1c3QgYXMgZm9yIHN0YXJ0X3NlY29uZGFyeSBvbndhcmRzICovCisJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKKworCWlycV9jdHhfaW5pdChjcHUpOworCisJLyoKKwkgKiBUaGlzIGdydW5nZSBydW5zIHRoZSBzdGFydHVwIHByb2Nlc3MgZm9yCisJICogdGhlIHRhcmdldGVkIHByb2Nlc3Nvci4KKwkgKi8KKworCWF0b21pY19zZXQoJmluaXRfZGVhc3NlcnRlZCwgMCk7CisKKwlEcHJpbnRrKCJTZXR0aW5nIHdhcm0gcmVzZXQgY29kZSBhbmQgdmVjdG9yLlxuIik7CisKKwlzdG9yZV9OTUlfdmVjdG9yKCZubWlfaGlnaCwgJm5taV9sb3cpOworCisJc21wYm9vdF9zZXR1cF93YXJtX3Jlc2V0X3ZlY3RvcihzdGFydF9laXApOworCisJLyoKKwkgKiBTdGFydGluZyBhY3R1YWwgSVBJIHNlcXVlbmNlLi4uCisJICovCisJYm9vdF9lcnJvciA9IHdha2V1cF9zZWNvbmRhcnlfY3B1KGFwaWNpZCwgc3RhcnRfZWlwKTsKKworCWlmICghYm9vdF9lcnJvcikgeworCQkvKgorCQkgKiBhbGxvdyBBUHMgdG8gc3RhcnQgaW5pdGlhbGl6aW5nLgorCQkgKi8KKwkJRHByaW50aygiQmVmb3JlIENhbGxvdXQgJWQuXG4iLCBjcHUpOworCQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKKwkJRHByaW50aygiQWZ0ZXIgQ2FsbG91dCAlZC5cbiIsIGNwdSk7CisKKwkJLyoKKwkJICogV2FpdCA1cyB0b3RhbCBmb3IgYSByZXNwb25zZQorCQkgKi8KKwkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwOyB0aW1lb3V0KyspIHsKKwkJCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCisJCQkJYnJlYWs7CS8qIEl0IGhhcyBib290ZWQgKi8KKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgeworCQkJLyogbnVtYmVyIENQVXMgbG9naWNhbGx5LCBzdGFydGluZyBmcm9tIDEgKEJTUCBpcyAwKSAqLworCQkJRHByaW50aygiT0suXG4iKTsKKwkJCXByaW50aygiQ1BVJWQ6ICIsIGNwdSk7CisJCQlwcmludF9jcHVfaW5mbygmY3B1X2RhdGFbY3B1XSk7CisJCQlEcHJpbnRrKCJDUFUgaGFzIGJvb3RlZC5cbiIpOworCQl9IGVsc2UgeworCQkJYm9vdF9lcnJvcj0gMTsKKwkJCWlmICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopdHJhbXBvbGluZV9iYXNlKQorCQkJCQk9PSAweEE1KQorCQkJCS8qIHRyYW1wb2xpbmUgc3RhcnRlZCBidXQuLi4/ICovCisJCQkJcHJpbnRrKCJTdHVjayA/P1xuIik7CisJCQllbHNlCisJCQkJLyogdHJhbXBvbGluZSBjb2RlIG5vdCBydW4gKi8KKwkJCQlwcmludGsoIk5vdCByZXNwb25kaW5nLlxuIik7CisJCQlpbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCk7CisJCX0KKwl9CisJeDg2X2NwdV90b19hcGljaWRbY3B1XSA9IGFwaWNpZDsKKwlpZiAoYm9vdF9lcnJvcikgeworCQkvKiBUcnkgdG8gcHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlIGJlZm9yZSAuLi4gKi8KKwkJdW5tYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7CisJCWNwdV9jbGVhcihjcHUsIGNwdV9jYWxsb3V0X21hcCk7IC8qIHdhcyBzZXQgaGVyZSAoZG9fYm9vdF9jcHUoKSkgKi8KKwkJY3B1X2NsZWFyKGNwdSwgY3B1X2luaXRpYWxpemVkKTsgLyogd2FzIHNldCBieSBjcHVfaW5pdCgpICovCisJCWNwdWNvdW50LS07CisJfQorCisJLyogbWFyayAic3R1Y2siIGFyZWEgYXMgbm90IHN0dWNrICovCisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXRyYW1wb2xpbmVfYmFzZSkgPSAwOworCisJcmV0dXJuIGJvb3RfZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNtcF90dW5lX3NjaGVkdWxpbmcgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZXNpemU7ICAgICAgIC8qIGtCICAgKi8KKwl1bnNpZ25lZCBsb25nIGJhbmR3aWR0aCA9IDM1MDsgLyogTUIvcyAqLworCS8qCisJICogUm91Z2ggZXN0aW1hdGlvbiBmb3IgU01QIHNjaGVkdWxpbmcsIHRoaXMgaXMgdGhlIG51bWJlciBvZgorCSAqIGN5Y2xlcyBpdCB0YWtlcyBmb3IgYSBmdWxseSBtZW1vcnktbGltaXRlZCBwcm9jZXNzIHRvIGZsdXNoCisJICogdGhlIFNNUC1sb2NhbCBjYWNoZS4KKwkgKgorCSAqIChGb3IgYSBQNSB0aGlzIHByZXR0eSBtdWNoIG1lYW5zIHdlIHdpbGwgY2hvb3NlIGFub3RoZXIgaWRsZQorCSAqICBDUFUgYWxtb3N0IGFsd2F5cyBhdCB3YWtldXAgdGltZSAodGhpcyBpcyBkdWUgdG8gdGhlIHNtYWxsCisJICogIEwxIGNhY2hlKSwgb24gUElJcyBpdCdzIGFyb3VuZCA1MC0xMDAgdXNlY3MsIGRlcGVuZGluZyBvbgorCSAqICB0aGUgY2FjaGUgc2l6ZSkKKwkgKi8KKworCWlmICghY3B1X2toeikgeworCQkvKgorCQkgKiB0aGlzIGJhc2ljYWxseSBkaXNhYmxlcyBwcm9jZXNzb3ItYWZmaW5pdHkKKwkJICogc2NoZWR1bGluZyBvbiBTTVAgd2l0aG91dCBhIFRTQy4KKwkJICovCisJCXJldHVybjsKKwl9IGVsc2UgeworCQljYWNoZXNpemUgPSBib290X2NwdV9kYXRhLng4Nl9jYWNoZV9zaXplOworCQlpZiAoY2FjaGVzaXplID09IC0xKSB7CisJCQljYWNoZXNpemUgPSAxNjsgLyogUGVudGl1bXMsIDJ4OGtCIGNhY2hlICovCisJCQliYW5kd2lkdGggPSAxMDA7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDeWNsZSB0aHJvdWdoIHRoZSBwcm9jZXNzb3JzIHNlbmRpbmcgQVBJQyBJUElzIHRvIGJvb3QgZWFjaC4KKyAqLworCitzdGF0aWMgaW50IGJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkOworLyogV2hlcmUgdGhlIElPIGFyZWEgd2FzIG1hcHBlZCBvbiBtdWx0aXF1YWQsIGFsd2F5cyAwIG90aGVyd2lzZSAqLwordm9pZCAqeHF1YWRfcG9ydGlvOworCitjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfYm9vdF9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbnQgYXBpY2lkLCBjcHUsIGJpdCwga2lja2VkOworCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisKKwkvKgorCSAqIFNldHVwIGJvb3QgQ1BVIGluZm9ybWF0aW9uCisJICovCisJc21wX3N0b3JlX2NwdV9pbmZvKDApOyAvKiBGaW5hbCBmdWxsIHZlcnNpb24gb2YgdGhlIGRhdGEgKi8KKwlwcmludGsoIkNQVSVkOiAiLCAwKTsKKwlwcmludF9jcHVfaW5mbygmY3B1X2RhdGFbMF0pOworCisJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKwlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGxvZ2ljYWxfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXg4Nl9jcHVfdG9fYXBpY2lkWzBdID0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOworCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUgPSAwOworCXNtcF90dW5lX3NjaGVkdWxpbmcoKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFswXSk7CisJY3B1X3NldCgwLCBjcHVfc2libGluZ19tYXBbMF0pOworCisJLyoKKwkgKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGFuIFNNUCBjb25maWd1cmF0aW9uIGF0IGJvb3QgdGltZSwKKwkgKiBnZXQgb3V0IG9mIGhlcmUgbm93IQorCSAqLworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhYWNwaV9sYXBpYykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNNUCBtb3RoZXJib2FyZCBub3QgZGV0ZWN0ZWQuXG4iKTsKKwkJc21wYm9vdF9jbGVhcl9pb19hcGljX2lycXMoKTsKKwkJcGh5c19jcHVfcHJlc2VudF9tYXAgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoMCk7CisJCWlmIChBUElDX2luaXRfdW5pcHJvY2Vzc29yKCkpCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkxvY2FsIEFQSUMgbm90IGRldGVjdGVkLiIKKwkJCQkJICAgIiBVc2luZyBkdW1teSBBUElDIGVtdWxhdGlvbi5cbiIpOworCQltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE1QIHRhYmxlIHNob3VsZCBsaXN0IHRoZSBib290CisJICogQ1BVIHRvbywgYnV0IHdlIGRvIGl0IGZvciB0aGUgc2FrZSBvZiByb2J1c3RuZXNzIGFueXdheS4KKwkgKiBNYWtlcyBubyBzZW5zZSB0byBkbyB0aGlzIGNoZWNrIGluIGNsdXN0ZXJlZCBhcGljIG1vZGUsIHNvIHNraXAgaXQKKwkgKi8KKwlpZiAoIWNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKSkgeworCQlwcmludGsoIndlaXJkLCBib290IENQVSAoIyVkKSBub3QgbGlzdGVkIGJ5IHRoZSBCSU9TLlxuIiwKKwkJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQlwaHlzaWRfc2V0KGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgbG9jYWwgQVBJQywgdGhlbiBnZXQgb3V0IG9mIGhlcmUgbm93IQorCSAqLworCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pICYmICFjcHVfaGFzX2FwaWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisJCXByaW50ayhLRVJOX0VSUiAiLi4uIGZvcmNpbmcgdXNlIG9mIGR1bW15IEFQSUMgZW11bGF0aW9uLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCQlzbXBib290X2NsZWFyX2lvX2FwaWNfaXJxcygpOworCQlwaHlzX2NwdV9wcmVzZW50X21hcCA9IHBoeXNpZF9tYXNrX29mX3BoeXNpZCgwKTsKKwkJcmV0dXJuOworCX0KKworCXZlcmlmeV9sb2NhbF9BUElDKCk7CisKKwkvKgorCSAqIElmIFNNUCBzaG91bGQgYmUgZGlzYWJsZWQsIHRoZW4gcmVhbGx5IGRpc2FibGUgaXQhCisJICovCisJaWYgKCFtYXhfY3B1cykgeworCQlzbXBfZm91bmRfY29uZmlnID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU01QIG1vZGUgZGVhY3RpdmF0ZWQsIGZvcmNpbmcgdXNlIG9mIGR1bW15IEFQSUMgZW11bGF0aW9uLlxuIik7CisJCXNtcGJvb3RfY2xlYXJfaW9fYXBpY19pcnFzKCk7CisJCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKDApOworCQlyZXR1cm47CisJfQorCisJY29ubmVjdF9ic3BfQVBJQygpOworCXNldHVwX2xvY2FsX0FQSUMoKTsKKwltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisKKworCXNldHVwX3BvcnRpb19yZW1hcCgpOworCisJLyoKKwkgKiBTY2FuIHRoZSBDUFUgcHJlc2VudCBtYXAgYW5kIGZpcmUgdXAgdGhlIG90aGVyIENQVXMgdmlhIGRvX2Jvb3RfY3B1CisJICoKKwkgKiBJbiBjbHVzdGVyZWQgYXBpYyBtb2RlLCBwaHlzX2NwdV9wcmVzZW50X21hcCBpcyBhIGNvbnN0cnVjdGVkIHRodXM6CisJICogYml0cyAwLTMgYXJlIHF1YWQwLCA0LTcgYXJlIHF1YWQxLCBldGMuIEEgcGVydmVyc2UgdHdpc3Qgb24gdGhlIAorCSAqIGNsdXN0ZXJlZCBhcGljIElELgorCSAqLworCURwcmludGsoIkNQVSBwcmVzZW50IG1hcDogJWx4XG4iLCBwaHlzaWRzX2NvZXJjZShwaHlzX2NwdV9wcmVzZW50X21hcCkpOworCisJa2lja2VkID0gMTsKKwlmb3IgKGJpdCA9IDA7IGtpY2tlZCA8IE5SX0NQVVMgJiYgYml0IDwgTUFYX0FQSUNTOyBiaXQrKykgeworCQlhcGljaWQgPSBjcHVfcHJlc2VudF90b19hcGljaWQoYml0KTsKKwkJLyoKKwkJICogRG9uJ3QgZXZlbiBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBib290IENQVSEKKwkJICovCisJCWlmICgoYXBpY2lkID09IGJvb3RfY3B1X2FwaWNpZCkgfHwgKGFwaWNpZCA9PSBCQURfQVBJQ0lEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY2hlY2tfYXBpY2lkX3ByZXNlbnQoYml0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF4X2NwdXMgPD0gY3B1Y291bnQrMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkb19ib290X2NwdShhcGljaWQpKQorCQkJcHJpbnRrKCJDUFUgIyVkIG5vdCByZXNwb25kaW5nIC0gY2Fubm90IHVzZSBpdC5cbiIsCisJCQkJCQkJCWFwaWNpZCk7CisJCWVsc2UKKwkJCSsra2lja2VkOworCX0KKworCS8qCisJICogQ2xlYW51cCBwb3NzaWJsZSBkYW5nbGluZyBlbmRzLi4uCisJICovCisJc21wYm9vdF9yZXN0b3JlX3dhcm1fcmVzZXRfdmVjdG9yKCk7CisKKwkvKgorCSAqIEFsbG93IHRoZSB1c2VyIHRvIGltcHJlc3MgZnJpZW5kcy4KKwkgKi8KKwlEcHJpbnRrKCJCZWZvcmUgYm9nb21pcHMuXG4iKTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKSkKKwkJCWJvZ29zdW0gKz0gY3B1X2RhdGFbY3B1XS5sb29wc19wZXJfamlmZnk7CisJcHJpbnRrKEtFUk5fSU5GTworCQkiVG90YWwgb2YgJWQgcHJvY2Vzc29ycyBhY3RpdmF0ZWQgKCVsdS4lMDJsdSBCb2dvTUlQUykuXG4iLAorCQljcHVjb3VudCsxLAorCQlib2dvc3VtLyg1MDAwMDAvSFopLAorCQkoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJCisJRHByaW50aygiQmVmb3JlIGJvZ29jb3VudCAtIHNldHRpbmcgYWN0aXZhdGVkPTEuXG4iKTsKKworCWlmIChzbXBfYl9zdGVwcGluZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV0FSTklORzogU01QIG9wZXJhdGlvbiBtYXkgYmUgdW5yZWxpYWJsZSB3aXRoIEIgc3RlcHBpbmcgcHJvY2Vzc29ycy5cbiIpOworCisJLyoKKwkgKiBEb24ndCB0YWludCBpZiB3ZSBhcmUgcnVubmluZyBTTVAga2VybmVsIG9uIGEgc2luZ2xlIG5vbi1NUAorCSAqIGFwcHJvdmVkIEF0aGxvbgorCSAqLworCWlmICh0YWludGVkICYgVEFJTlRfVU5TQUZFX1NNUCkgeworCQlpZiAoY3B1Y291bnQpCisJCQlwcmludGsgKEtFUk5fSU5GTyAiV0FSTklORzogVGhpcyBjb21iaW5hdGlvbiBvZiBBTUQgcHJvY2Vzc29ycyBpcyBub3Qgc3VpdGFibGUgZm9yIFNNUC5cbiIpOworCQllbHNlCisJCQl0YWludGVkICY9IH5UQUlOVF9VTlNBRkVfU01QOworCX0KKworCURwcmludGsoIkJvb3QgZG9uZS5cbiIpOworCisJLyoKKwkgKiBjb25zdHJ1Y3QgY3B1X3NpYmxpbmdfbWFwW10sIHNvIHRoYXQgd2UgY2FuIHRlbGwgc2libGluZyBDUFVzCisJICogZWZmaWNpZW50bHkuCisJICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbY3B1XSk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7CisJCWludCBzaWJsaW5ncyA9IDA7CisJCWludCBpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCkpCisJCQljb250aW51ZTsKKworCQlpZiAoc21wX251bV9zaWJsaW5ncyA+IDEpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocGh5c19wcm9jX2lkW2NwdV0gPT0gcGh5c19wcm9jX2lkW2ldKSB7CisJCQkJCXNpYmxpbmdzKys7CisJCQkJCWNwdV9zZXQoaSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNpYmxpbmdzKys7CisJCQljcHVfc2V0KGNwdSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCQl9CisKKwkJaWYgKHNpYmxpbmdzICE9IHNtcF9udW1fc2libGluZ3MpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiAlZCBzaWJsaW5ncyBmb3VuZCBmb3IgQ1BVJWQsIHNob3VsZCBiZSAlZFxuIiwgc2libGluZ3MsIGNwdSwgc21wX251bV9zaWJsaW5ncyk7CisJfQorCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CisKKwlzbXBib290X3NldHVwX2lvX2FwaWMoKTsKKworCXNldHVwX2Jvb3RfQVBJQ19jbG9jaygpOworCisJLyoKKwkgKiBTeW5jaHJvbml6ZSB0aGUgVFNDIHdpdGggdGhlIEFQCisJICovCisJaWYgKGNwdV9oYXNfdHNjICYmIGNwdWNvdW50ICYmIGNwdV9raHopCisJCXN5bmNocm9uaXplX3RzY19icCgpOworfQorCisvKiBUaGVzZSBhcmUgd3JhcHBlcnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBuZXcgYm9vdCBwcm9jZXNzLiAgU29tZW9uZQorICAgd2hvIHVuZGVyc3RhbmRzIGFsbCB0aGlzIHN0dWZmIHNob3VsZCByZXdyaXRlIGl0IHByb3Blcmx5LiAtLVJSIDE1L0p1bC8wMiAqLwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJc21wX2Jvb3RfY3B1cyhtYXhfY3B1cyk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCit7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2NhbGxvdXRfbWFwKTsKK30KKworaW50IF9fZGV2aW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIFRoaXMgb25seSB3b3JrcyBhdCBib290IGZvciB4ODYuICBTZWUgInJld3JpdGUiIGFib3ZlLiAqLworCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJLyogSW4gY2FzZSBvbmUgZGlkbid0IGNvbWUgdXAgKi8KKwlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwkvKiBVbmxlYXNoIHRoZSBDUFUhICovCisJY3B1X3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCisJCW1iKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCXNldHVwX2lvYXBpY19kZXN0KCk7CisjZW5kaWYKKwl6YXBfbG93X21hcHBpbmdzKCk7CisJLyoKKwkgKiBEaXNhYmxlIGV4ZWN1dGFiaWxpdHkgb2YgdGhlIFNNUCB0cmFtcG9saW5lOgorCSAqLworCXNldF9rZXJuZWxfZXhlYygodW5zaWduZWQgbG9uZyl0cmFtcG9saW5lX2Jhc2UsIHRyYW1wb2xpbmVfZXhlYyk7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9pbnRyX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIElSUTAgbXVzdCBiZSBnaXZlbiBhIGZpeGVkIGFzc2lnbm1lbnQgYW5kIGluaXRpYWxpemVkLAorCSAqIGJlY2F1c2UgaXQncyB1c2VkIGJlZm9yZSB0aGUgSU8tQVBJQyBpcyBzZXQgdXAuCisJICovCisJc2V0X2ludHJfZ2F0ZShGSVJTVF9ERVZJQ0VfVkVDVE9SLCBpbnRlcnJ1cHRbMF0pOworCisJLyoKKwkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCisJICogSVBJLCBkcml2ZW4gYnkgd2FrZXVwLgorCSAqLworCXNldF9pbnRyX2dhdGUoUkVTQ0hFRFVMRV9WRUNUT1IsIHJlc2NoZWR1bGVfaW50ZXJydXB0KTsKKworCS8qIElQSSBmb3IgaW52YWxpZGF0aW9uICovCisJc2V0X2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1IsIGludmFsaWRhdGVfaW50ZXJydXB0KTsKKworCS8qIElQSSBmb3IgZ2VuZXJpYyBmdW5jdGlvbiBjYWxsICovCisJc2V0X2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1ZFQ1RPUiwgY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMgYi9hcmNoL2kzODYva2VybmVsL3NyYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiMjdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBTb21lIG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBnbGVhbmVkIGZyb20gdGhlIDY0IGJpdCAKKyAqIGRpc2NvbnRpZ21lbSBzdXBwb3J0IGNvZGUgYmFzZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gUGF0IEdhdWdoZW4gPGdvbmVAdXMuaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGFzbS9zcmF0Lmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CisKKy8qCisgKiBwcm94aW1pdHkgbWFjcm9zIGFuZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE5PREVfQVJSQVlfSU5ERVgoeCkJKCh4KSAvIDgpCS8qIDggYml0cy9jaGFyICovCisjZGVmaW5lIE5PREVfQVJSQVlfT0ZGU0VUKHgpCSgoeCkgJSA4KQkvKiA4IGJpdHMvY2hhciAqLworI2RlZmluZSBCTUFQX1NFVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSB8PSAxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpCisjZGVmaW5lIEJNQVBfVEVTVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSAmICgxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpKQorI2RlZmluZSBNQVhfUFhNX0RPTUFJTlMJCTI1NgkvKiAxIGJ5dGUgYW5kIG5vIHByb21pc2VzIGFib3V0IHZhbHVlcyAqLworLyogYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAqLworI2RlZmluZSBQWE1fQklUTUFQX0xFTiAoTUFYX1BYTV9ET01BSU5TIC8gOCkgCitzdGF0aWMgdTggcHhtX2JpdG1hcFtQWE1fQklUTUFQX0xFTl07CS8qIGJpdG1hcCBvZiBwcm94aW1pdHkgZG9tYWlucyAqLworCisjZGVmaW5lIE1BWF9DSFVOS1NfUEVSX05PREUJNAorI2RlZmluZSBNQVhDSFVOS1MJCShNQVhfQ0hVTktTX1BFUl9OT0RFICogTUFYX05VTU5PREVTKQorc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgeworCXVuc2lnbmVkIGxvbmcJc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcJZW5kX3BmbjsKKwl1OAlweG07CQkvLyBwcm94aW1pdHkgZG9tYWluIG9mIG5vZGUKKwl1OAluaWQ7CQkvLyB3aGljaCBjbm9kZSBjb250YWlucyB0aGlzIGNodW5rPworCXU4CWJhbms7CQkvLyB3aGljaCBtZW0gYmFuayBvbiB0aGlzIG5vZGUKK307CitzdGF0aWMgc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3Mgbm9kZV9tZW1vcnlfY2h1bmtbTUFYQ0hVTktTXTsKKworc3RhdGljIGludCBudW1fbWVtb3J5X2NodW5rczsJCS8qIHRvdGFsIG51bWJlciBvZiBtZW1vcnkgY2h1bmtzICovCitzdGF0aWMgaW50IHpob2xlc19zaXplX2luaXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlVNTk9ERVMgKiBNQVhfTlJfWk9ORVNdOworCitleHRlcm4gdm9pZCAqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworLyogSWRlbnRpZnkgQ1BVIHByb3hpbWl0eSBkb21haW5zICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfY3B1X2FmZmluaXR5X3N0cnVjdHVyZShjaGFyICpwKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqY3B1X2FmZmluaXR5ID0gCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKSBwOworCisJaWYgKCFjcHVfYWZmaW5pdHktPmZsYWdzLmVuYWJsZWQpCisJCXJldHVybjsJCS8qIGVtcHR5IGVudHJ5ICovCisKKwkvKiBtYXJrIHRoaXMgbm9kZSBhcyAic2VlbiIgaW4gbm9kZSBiaXRtYXAgKi8KKwlCTUFQX1NFVChweG1fYml0bWFwLCBjcHVfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4pOworCisJcHJpbnRrKCJDUFUgMHglMDJYIGluIHByb3hpbWl0eSBkb21haW4gMHglMDJYXG4iLAorCQljcHVfYWZmaW5pdHktPmFwaWNfaWQsIGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbik7Cit9CisKKy8qCisgKiBJZGVudGlmeSBtZW1vcnkgcHJveGltaXR5IGRvbWFpbnMgYW5kIGhvdC1yZW1vdmUgY2FwYWJpbGl0aWVzLgorICogRmlsbCBub2RlIG1lbW9yeSBjaHVuayBsaXN0IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX21lbW9yeV9hZmZpbml0eV9zdHJ1Y3R1cmUgKGNoYXIgKnNyYXRwKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBwYWRkciwgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsgCisJdTggcHhtOworCXN0cnVjdCBub2RlX21lbW9yeV9jaHVua19zICpwLCAqcSwgKnBlbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptZW1vcnlfYWZmaW5pdHkgPQorCQkJKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqKSBzcmF0cDsKKworCWlmICghbWVtb3J5X2FmZmluaXR5LT5mbGFncy5lbmFibGVkKQorCQlyZXR1cm47CQkvKiBlbXB0eSBlbnRyeSAqLworCisJLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCisJQk1BUF9TRVQocHhtX2JpdG1hcCwgbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluKTsKKworCS8qIGNhbGN1bGF0ZSBpbmZvIGZvciBtZW1vcnkgY2h1bmsgc3RydWN0dXJlICovCisJcGFkZHIgPSBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcl9oaTsKKwlwYWRkciA9IChwYWRkciA8PCAzMikgfCBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcl9sbzsKKwlzaXplID0gbWVtb3J5X2FmZmluaXR5LT5sZW5ndGhfaGk7CisJc2l6ZSA9IChzaXplIDw8IDMyKSB8IG1lbW9yeV9hZmZpbml0eS0+bGVuZ3RoX2xvOworCQorCXN0YXJ0X3BmbiA9IHBhZGRyID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IChwYWRkciArIHNpemUpID4+IFBBR0VfU0hJRlQ7CisJCisJcHhtID0gbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluOworCisJaWYgKG51bV9tZW1vcnlfY2h1bmtzID49IE1BWENIVU5LUykgeworCQlwcmludGsoIlRvbyBtYW55IG1lbSBjaHVua3MgaW4gU1JBVC4gSWdub3JpbmcgJWxsZCBNQnl0ZXMgYXQgJWxseFxuIiwKKwkJCXNpemUvKDEwMjQqMTAyNCksIHBhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluc2VydGlvbiBzb3J0IGJhc2VkIG9uIGJhc2UgYWRkcmVzcyAqLworCXBlbmQgPSAmbm9kZV9tZW1vcnlfY2h1bmtbbnVtX21lbW9yeV9jaHVua3NdOworCWZvciAocCA9ICZub2RlX21lbW9yeV9jaHVua1swXTsgcCA8IHBlbmQ7IHArKykgeworCQlpZiAoc3RhcnRfcGZuIDwgcC0+c3RhcnRfcGZuKQorCQkJYnJlYWs7CisJfQorCWlmIChwIDwgcGVuZCkgeworCQlmb3IgKHEgPSBwZW5kOyBxID49IHA7IHEtLSkKKwkJCSoocSArIDEpID0gKnE7CisJfQorCXAtPnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwlwLT5lbmRfcGZuID0gZW5kX3BmbjsKKwlwLT5weG0gPSBweG07CisKKwludW1fbWVtb3J5X2NodW5rcysrOworCisJcHJpbnRrKCJNZW1vcnkgcmFuZ2UgMHglbFggdG8gMHglbFggKHR5cGUgMHglWCkgaW4gcHJveGltaXR5IGRvbWFpbiAweCUwMlggJXNcbiIsCisJCXN0YXJ0X3BmbiwgZW5kX3BmbiwKKwkJbWVtb3J5X2FmZmluaXR5LT5tZW1vcnlfdHlwZSwKKwkJbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluLAorCQkobWVtb3J5X2FmZmluaXR5LT5mbGFncy5ob3RfcGx1Z2dhYmxlID8KKwkJICJlbmFibGVkIGFuZCByZW1vdmFibGUiIDogImVuYWJsZWQiICkgKTsKK30KKworI2lmIE1BWF9OUl9aT05FUyAhPSAzCisjZXJyb3IgIk1BWF9OUl9aT05FUyAhPSAzLCBjaHVua190b196b25lIHJlcXVpcmVzIHJldmlldyIKKyNlbmRpZgorLyogVGFrZSBhIGNodW5rIG9mIHBhZ2VzIGZyb20gcGFnZSBmcmFtZSBjc3RhcnQgdG8gY2VuZCBhbmQgY291bnQgdGhlIG51bWJlcgorICogb2YgcGFnZXMgaW4gZWFjaCB6b25lLCByZXR1cm5lZCB2aWEgem9uZXNbXS4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIGNodW5rX3RvX3pvbmVzKHVuc2lnbmVkIGxvbmcgY3N0YXJ0LCB1bnNpZ25lZCBsb25nIGNlbmQsIAorCQl1bnNpZ25lZCBsb25nICp6b25lcykKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9kbWE7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm47CisKKwlpbnQgejsKKwl1bnNpZ25lZCBsb25nIHJlbmQ7CisKKwkvKiBGSVhNRTogTUFYX0RNQV9BRERSRVNTIGFuZCBtYXhfbG93X3BmbiBhcmUgdHJ5aW5nIHRvIHByb3ZpZGUKKwkgKiBzaW1pbGFybHkgc2NvcGVkIGluZm9ybWF0aW9uIGFuZCBzaG91bGQgYmUgaGFuZGxlZCBpbiBhIGNvbnNpc3RhbnQKKwkgKiBtYW5uZXIuCisJICovCisJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKKworCS8qIFNwbGl0IHRoZSBob2xlIGludG8gdGhlIHpvbmVzIGluIHdoaWNoIGl0IGZhbGxzLiAgUmVwZWF0ZWRseQorCSAqIHRha2UgdGhlIHNlZ21lbnQgaW4gd2hpY2ggdGhlIHJlbWFpbmluZyBob2xlIHN0YXJ0cywgcm91bmQgaXQKKwkgKiB0byB0aGUgZW5kIG9mIHRoYXQgem9uZS4KKwkgKi8KKwltZW1zZXQoem9uZXMsIDAsIE1BWF9OUl9aT05FUyAqIHNpemVvZihsb25nKSk7CisJd2hpbGUgKGNzdGFydCA8IGNlbmQpIHsKKwkJaWYgKGNzdGFydCA8IG1heF9kbWEpIHsKKwkJCXogPSBaT05FX0RNQTsKKwkJCXJlbmQgPSAoY2VuZCA8IG1heF9kbWEpPyBjZW5kIDogbWF4X2RtYTsKKworCQl9IGVsc2UgaWYgKGNzdGFydCA8IG1heF9sb3dfcGZuKSB7CisJCQl6ID0gWk9ORV9OT1JNQUw7CisJCQlyZW5kID0gKGNlbmQgPCBtYXhfbG93X3Bmbik/IGNlbmQgOiBtYXhfbG93X3BmbjsKKworCQl9IGVsc2UgeworCQkJeiA9IFpPTkVfSElHSE1FTTsKKwkJCXJlbmQgPSBjZW5kOworCQl9CisJCXpvbmVzW3pdICs9IHJlbmQgLSBjc3RhcnQ7CisJCWNzdGFydCA9IHJlbmQ7CisJfQorfQorCisvKgorICogVGhlIFNSQVQgdGFibGUgYWx3YXlzIGxpc3RzIGFzY2VuZGluZyBhZGRyZXNzZXMsIHNvIGNhbiBhbHdheXMKKyAqIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCAic3RhcnQiIGFkZHJlc3MgdGhhdCB5b3Ugc2VlIGlzIHRoZSByZWFsCisgKiBzdGFydCBvZiB0aGUgbm9kZSwgYW5kIHRoYXQgdGhlIGN1cnJlbnQgImVuZCIgYWRkcmVzcyBpcyBhZnRlcgorICogdGhlIHByZXZpb3VzIG9uZS4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIG5vZGVfcmVhZF9jaHVuayhpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyAqbWVtb3J5X2NodW5rKQoreworCS8qCisJICogT25seSBhZGQgcHJlc2VudCBtZW1vcnkgYXMgdG9sZCBieSB0aGUgZTgyMC4KKwkgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgZnJvbSB0aGUgU1JBVCB0aGF0IHRoZSBtZW1vcnkgaXQKKwkgKiBlbnVtZXJhdGVzIGlzIHByZXNlbnQgYXQgYm9vdCB0aW1lIGJlY2F1c2UgaXQgcmVwcmVzZW50cworCSAqICpwb3NzaWJsZSogbWVtb3J5IGhvdHBsdWcgYXJlYXMgdGhlIHNhbWUgYXMgbm9ybWFsIFJBTS4KKwkgKi8KKwlpZiAobWVtb3J5X2NodW5rLT5zdGFydF9wZm4gPj0gbWF4X3BmbikgeworCQlwcmludGsgKEtFUk5fSU5GTyAiSWdub3JpbmcgU1JBVCBwZm5zOiAweCUwOGx4IC0+ICUwOGx4XG4iLAorCQkJbWVtb3J5X2NodW5rLT5zdGFydF9wZm4sIG1lbW9yeV9jaHVuay0+ZW5kX3Bmbik7CisJCXJldHVybjsKKwl9CisJaWYgKG1lbW9yeV9jaHVuay0+bmlkICE9IG5pZCkKKwkJcmV0dXJuOworCisJaWYgKCFub2RlX2hhc19vbmxpbmVfbWVtKG5pZCkpCisJCW5vZGVfc3RhcnRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbjsKKworCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWVtb3J5X2NodW5rLT5zdGFydF9wZm4pCisJCW5vZGVfc3RhcnRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbjsKKworCWlmIChub2RlX2VuZF9wZm5bbmlkXSA8IG1lbW9yeV9jaHVuay0+ZW5kX3BmbikKKwkJbm9kZV9lbmRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPmVuZF9wZm47Cit9CisKKy8qIFBhcnNlIHRoZSBBQ1BJIFN0YXRpYyBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAqLworc3RhdGljIGludCBfX2luaXQgYWNwaTIwX3BhcnNlX3NyYXQoc3RydWN0IGFjcGlfdGFibGVfc3JhdCAqc3JhdHApCit7CisJdTggKnN0YXJ0LCAqZW5kLCAqcDsKKwlpbnQgaSwgaiwgbmlkOworCXU4IHB4bV90b19uaWRfbWFwW01BWF9QWE1fRE9NQUlOU107LyogX1BYTSB0byBsb2dpY2FsIG5vZGUgSUQgbWFwICovCisJdTggbmlkX3RvX3B4bV9tYXBbTUFYX05VTU5PREVTXTsvKiBsb2dpY2FsIG5vZGUgSUQgdG8gX1BYTSBtYXAgKi8KKworCXN0YXJ0ID0gKHU4ICopKCYoc3JhdHAtPnJlc2VydmVkKSArIDEpOwkvKiBza2lwIGhlYWRlciAqLworCXAgPSBzdGFydDsKKwllbmQgPSAodTggKilzcmF0cCArIHNyYXRwLT5oZWFkZXIubGVuZ3RoOworCisJbWVtc2V0KHB4bV9iaXRtYXAsIDAsIHNpemVvZihweG1fYml0bWFwKSk7CS8qIGluaXQgcHJveGltaXR5IGRvbWFpbiBiaXRtYXAgKi8KKwltZW1zZXQobm9kZV9tZW1vcnlfY2h1bmssIDAsIHNpemVvZihub2RlX21lbW9yeV9jaHVuaykpOworCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CisKKwkvKiAtMSBpbiB0aGVzZSBtYXBzIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KKwltZW1zZXQocHhtX3RvX25pZF9tYXAsIC0xLCBzaXplb2YocHhtX3RvX25pZF9tYXApKTsKKwltZW1zZXQobmlkX3RvX3B4bV9tYXAsIC0xLCBzaXplb2YobmlkX3RvX3B4bV9tYXApKTsKKworCW51bV9tZW1vcnlfY2h1bmtzID0gMDsKKwl3aGlsZSAocCA8IGVuZCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgQUNQSV9TUkFUX1BST0NFU1NPUl9BRkZJTklUWToKKwkJCXBhcnNlX2NwdV9hZmZpbml0eV9zdHJ1Y3R1cmUocCk7CisJCQlicmVhazsKKwkJY2FzZSBBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZOgorCQkJcGFyc2VfbWVtb3J5X2FmZmluaXR5X3N0cnVjdHVyZShwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBQ1BJIDIuMCBTUkFUOiB1bmtub3duIGVudHJ5IHNraXBwZWQ6IHR5cGU9MHglMDJYLCBsZW49JWRcbiIsIHBbMF0sIHBbMV0pOworCQkJYnJlYWs7CisJCX0KKwkJcCArPSBwWzFdOworCQlpZiAocFsxXSA9PSAwKSB7CisJCQlwcmludGsoImFjcGkyMF9wYXJzZV9zcmF0OiBFbnRyeSBsZW5ndGggdmFsdWUgaXMgemVybzsiCisJCQkJIiBjYW4ndCBwYXJzZSBhbnkgZnVydGhlciFcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobnVtX21lbW9yeV9jaHVua3MgPT0gMCkgeworCQlwcmludGsoImNvdWxkIG5vdCBmaW55IGFueSBBQ1BJIFNSQVQgbWVtb3J5IGFyZWFzLlxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJLyogQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiBzeXN0ZW0gZnJvbSBQWE0gYml0bWFwIGFuZCBjcmVhdGUKKwkgKiBhIHNldCBvZiBzZXF1ZW50aWFsIG5vZGUgSURzIHN0YXJ0aW5nIGF0IHplcm8uICAoQUNQSSBkb2Vzbid0IHNlZW0KKwkgKiB0byBzcGVjaWZ5IHRoZSByYW5nZSBvZiBfUFhNIHZhbHVlcy4pCisJICovCisJLyoKKwkgKiBNQ0QgLSB3ZSBubyBsb25nZXIgSEFWRSB0byBudW1iZXIgbm9kZXMgc2VxdWVudGlhbGx5LiAgUFhNIGRvbWFpbgorCSAqIG51bWJlcnMgY291bGQgZ28gYXMgaGlnaCBhcyAyNTYsIGFuZCBNQVhfTlVNTk9ERVMgZm9yIGkzODYgaXMgdHlwaWNhbGx5CisJICogMzIsIHNvIHdlIHdpbGwgY29udGludWUgbnVtYmVyaW5nIHRoZW0gaW4gdGhpcyBtYW5uZXIgdW50aWwgTUFYX05VTU5PREVTCisJICogYXBwcm9hY2hlcyBNQVhfUFhNX0RPTUFJTlMgZm9yIGkzODYuCisJICovCisJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BYTV9ET01BSU5TOyBpKyspIHsKKwkJaWYgKEJNQVBfVEVTVChweG1fYml0bWFwLCBpKSkgeworCQkJbmlkID0gbnVtX29ubGluZV9ub2RlcygpOworCQkJcHhtX3RvX25pZF9tYXBbaV0gPSBuaWQ7CisJCQluaWRfdG9fcHhtX21hcFtuaWRdID0gaTsKKwkJCW5vZGVfc2V0X29ubGluZShuaWQpOworCQl9CisJfQorCUJVR19PTihudW1fb25saW5lX25vZGVzKCkgPT0gMCk7CisKKwkvKiBzZXQgY25vZGUgaWQgaW4gbWVtb3J5IGNodW5rIHN0cnVjdHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVtb3J5X2NodW5rczsgaSsrKQorCQlub2RlX21lbW9yeV9jaHVua1tpXS5uaWQgPSBweG1fdG9fbmlkX21hcFtub2RlX21lbW9yeV9jaHVua1tpXS5weG1dOworCisJcHJpbnRrKCJweG0gYml0bWFwOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHB4bV9iaXRtYXApOyBpKyspIHsKKwkJcHJpbnRrKCIlMDJYICIsIHB4bV9iaXRtYXBbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJOdW1iZXIgb2YgbG9naWNhbCBub2RlcyBpbiBzeXN0ZW0gPSAlZFxuIiwgbnVtX29ubGluZV9ub2RlcygpKTsKKwlwcmludGsoIk51bWJlciBvZiBtZW1vcnkgY2h1bmtzIGluIHN5c3RlbSA9ICVkXG4iLCBudW1fbWVtb3J5X2NodW5rcyk7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtX21lbW9yeV9jaHVua3M7IGorKyl7CisJCXN0cnVjdCBub2RlX21lbW9yeV9jaHVua19zICogY2h1bmsgPSAmbm9kZV9tZW1vcnlfY2h1bmtbal07CisJCXByaW50aygiY2h1bmsgJWQgbmlkICVkIHN0YXJ0X3BmbiAlMDhseCBlbmRfcGZuICUwOGx4XG4iLAorCQkgICAgICAgaiwgY2h1bmstPm5pZCwgY2h1bmstPnN0YXJ0X3BmbiwgY2h1bmstPmVuZF9wZm4pOworCQlub2RlX3JlYWRfY2h1bmsoY2h1bmstPm5pZCwgY2h1bmspOworCX0KKyAKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IG5vZGVfc3RhcnRfcGZuW25pZF07CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gbm9kZV9lbmRfcGZuW25pZF07CisKKwkJbWVtb3J5X3ByZXNlbnQobmlkLCBzdGFydCwgZW5kKTsKKwkJbm9kZV9yZW1hcF9zaXplW25pZF0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5pZCwgc3RhcnQsIGVuZCk7CisJfQorCXJldHVybiAxOworb3V0X2ZhaWw6CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgZ2V0X21lbWNmZ19mcm9tX3NyYXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqcnNkdCA9IE5VTEw7CisJc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHNhdmVkX3JzZHQ7CisJaW50IHRhYmxlcyA9IDA7CisJaW50IGkgPSAwOworCisJYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihBQ1BJX1BIWVNJQ0FMX0FERFJFU1NJTkcsIHJzZHBfYWRkcmVzcyk7CisKKwlpZiAocnNkcF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPT0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSKSB7CisJCXByaW50aygiJXM6IGFzc2lnbmluZyBhZGRyZXNzIHRvIHJzZHBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKQorCQkJCSh1MzIpcnNkcF9hZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsOworCX0gZWxzZSB7CisJCXByaW50aygiJXM6IHJzZHBfYWRkcmVzcyBpcyBub3QgYSBwaHlzaWNhbCBwb2ludGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmICghcnNkcCkgeworCQlwcmludGsoIiVzOiBEaWRuJ3QgZmluZCBBQ1BJIHJvb3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJS44cyB2JWQgWyUuNnNdXG4iLCByc2RwLT5zaWduYXR1cmUsIHJzZHAtPnJldmlzaW9uLAorCQlyc2RwLT5vZW1faWQpOworCisJaWYgKHN0cm5jbXAocnNkcC0+c2lnbmF0dXJlLCBSU0RQX1NJRyxzdHJsZW4oUlNEUF9TSUcpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlNEUCB0YWJsZSBzaWduYXR1cmUgaW5jb3JyZWN0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCisJICAgIGJvb3RfaW9yZW1hcChyc2RwLT5yc2R0X2FkZHJlc3MsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0KSk7CisKKwlpZiAoIXJzZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBBQ1BJOiBJbnZhbGlkIHJvb3Qgc3lzdGVtIGRlc2NyaXB0aW9uIHRhYmxlcyAoUlNEVClcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaGVhZGVyID0gJiByc2R0LT5oZWFkZXI7CisKKwlpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgUlNEVF9TSUcsIHN0cmxlbihSU0RUX1NJRykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IFJTRFQgc2lnbmF0dXJlIGluY29ycmVjdFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiAKKwkgKiBUaGUgbnVtYmVyIG9mIHRhYmxlcyBpcyBjb21wdXRlZCBieSB0YWtpbmcgdGhlIAorCSAqIHNpemUgb2YgYWxsIGVudHJpZXMgKGhlYWRlciBzaXplIG1pbnVzIHRvdGFsIAorCSAqIHNpemUgb2YgUlNEVCkgZGl2aWRlZCBieSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5CisJICogKDQtYnl0ZSB0YWJsZSBwb2ludGVycykuCisJICovCisJdGFibGVzID0gKGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIC8gNDsKKworCWlmICghdGFibGVzKQorCQlnb3RvIG91dF9lcnI7CisKKwltZW1jcHkoJnNhdmVkX3JzZHQsIHJzZHQsIHNpemVvZihzYXZlZF9yc2R0KSk7CisKKwlpZiAoc2F2ZWRfcnNkdC5oZWFkZXIubGVuZ3RoID4gc2l6ZW9mKHNhdmVkX3JzZHQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IFRvbyBiaWcgbGVuZ3RoIGluIFJTRFQ6ICVkXG4iLAorCQkgICAgICAgc2F2ZWRfcnNkdC5oZWFkZXIubGVuZ3RoKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCXByaW50aygiQmVnaW4gU1JBVCB0YWJsZSBzY2FuLi4uLlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVzOyBpKyspIHsKKwkJLyogTWFwIGluIGhlYWRlciwgdGhlbiBtYXAgaW4gZnVsbCB0YWJsZSBsZW5ndGguICovCisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LmVudHJ5W2ldLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCWlmICghaGVhZGVyKQorCQkJYnJlYWs7CisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LmVudHJ5W2ldLCBoZWFkZXItPmxlbmd0aCk7CisJCWlmICghaGVhZGVyKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikgJmhlYWRlci0+c2lnbmF0dXJlLCAiU1JBVCIsIDQpKQorCQkJY29udGludWU7CisKKwkJLyogd2UndmUgZm91bmQgdGhlIHNyYXQgdGFibGUuIGRvbid0IG5lZWQgdG8gbG9vayBhdCBhbnkgbW9yZSB0YWJsZXMgKi8KKwkJcmV0dXJuIGFjcGkyMF9wYXJzZV9zcmF0KChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICopaGVhZGVyKTsKKwl9CitvdXRfZXJyOgorCXByaW50aygiZmFpbGVkIHRvIGdldCBOVU1BIG1lbW9yeSBpbmZvcm1hdGlvbiBmcm9tIFNSQVQgdGFibGVcbiIpOworCXJldHVybiAwOworfQorCisvKiBGb3IgZWFjaCBub2RlIHJ1biB0aGUgbWVtb3J5IGxpc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlCisgKiBhbnkgbWVtb3J5IGhvbGVzLiAgRm9yIGVhY2ggaG9sZSBkZXRlcm1pbmUgd2hpY2ggWk9ORSB0aGV5IGZhbGwKKyAqIGludG8uCisgKgorICogTk9URSMxOiB0aGlzIHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgem9uZSBib3VuZHJpZXMgYW5kIHNvCisgKiBfY2Fubm90XyBiZSBwZXJmb3JtZWQgYmVmb3JlIHRob3NlIGFyZSBjYWxjdWxhdGVkIGluIHNldHVwX21lbW9yeS4KKyAqIAorICogTk9URSMyOiB3ZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIG1lbW9yeSBjaHVua3MgYXJlIG9yZGVyZWQgYnkKKyAqIHN0YXJ0IHBmbiBudW1iZXIgZHVyaW5nIHNldHVwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZ2V0X3pob2xlc19pbml0KHZvaWQpCit7CisJaW50IG5pZDsKKwlpbnQgYzsKKwlpbnQgZmlyc3Q7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAwOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWZpcnN0ID0gMTsKKwkJZm9yIChjID0gMDsgYyA8IG51bV9tZW1vcnlfY2h1bmtzOyBjKyspeworCQkJaWYgKG5vZGVfbWVtb3J5X2NodW5rW2NdLm5pZCA9PSBuaWQpIHsKKwkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJZW5kID0gbm9kZV9tZW1vcnlfY2h1bmtbY10uZW5kX3BmbjsKKwkJCQkJZmlyc3QgPSAwOworCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogUmVjb3JkIGFueSBnYXAgYmV0d2VlbiB0aGlzIGNodW5rCisJCQkJCSAqIGFuZCB0aGUgcHJldmlvdXMgY2h1bmsgb24gdGhpcyBub2RlCisJCQkJCSAqIGFnYWluc3QgdGhlIHpvbmVzIGl0IHNwYW5zLgorCQkJCQkgKi8KKwkJCQkJY2h1bmtfdG9fem9uZXMoZW5kLAorCQkJCQkJbm9kZV9tZW1vcnlfY2h1bmtbY10uc3RhcnRfcGZuLAorCQkJCQkJJnpob2xlc19zaXplW25pZCAqIE1BWF9OUl9aT05FU10pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKwordW5zaWduZWQgbG9uZyAqIF9faW5pdCBnZXRfemhvbGVzX3NpemUoaW50IG5pZCkKK3sKKwlpZiAoIXpob2xlc19zaXplX2luaXQpIHsKKwkJemhvbGVzX3NpemVfaW5pdCsrOworCQlnZXRfemhvbGVzX2luaXQoKTsKKwl9CisJaWYgKG5pZCA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5pZCkpCisJCXByaW50aygiJXM6IG5pZCA9ICVkIGlzIGludmFsaWQvb2ZmbGluZS4gbnVtX29ubGluZV9ub2RlcyA9ICVkIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgbmlkLCBudW1fb25saW5lX25vZGVzKCkpOworCXJldHVybiAmemhvbGVzX3NpemVbbmlkICogTUFYX05SX1pPTkVTXTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3VtbWl0LmMgYi9hcmNoL2kzODYva2VybmVsL3N1bW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTAxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3N1bW1pdC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogYXJjaC9pMzg2L2tlcm5lbC9zdW1taXQuYyAtIElCTSBTdW1taXQtU3BlY2lmaWMgQ29kZQorICoKKyAqIFdyaXR0ZW4gQnk6IE1hdHRoZXcgRG9ic29uLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnAuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oPgorCitzdGF0aWMgc3RydWN0IHJpb190YWJsZV9oZHIgKnJpb190YWJsZV9oZHIgX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3Qgc2NhbF9kZXRhaWwgICAqc2NhbF9kZXZzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgcmlvX2RldGFpbCAgICAqcmlvX2RldnNbTUFYX05VTU5PREVTKjRdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3BjaV9ub2RlX21hcF9mb3Jfd3BlZyhpbnQgd3BlZ19udW0sIGludCBsYXN0X2J1cykKK3sKKwlpbnQgdHdpc3RlciA9IDAsIG5vZGUgPSAwOworCWludCBpLCBidXMsIG51bV9idXNlczsKKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspeworCQlpZiAocmlvX2RldnNbaV0tPm5vZGVfaWQgPT0gcmlvX2RldnNbd3BlZ19udW1dLT5vd25lcl9pZCl7CisJCQl0d2lzdGVyID0gcmlvX2RldnNbaV0tPm93bmVyX2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBmaW5kIG93bmVyIEN5Y2xvbmUgZm9yIFdpbm5pcGVnIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGxhc3RfYnVzOworCX0KKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrKXsKKwkJaWYgKHNjYWxfZGV2c1tpXS0+bm9kZV9pZCA9PSB0d2lzdGVyKXsKKwkJCW5vZGUgPSBzY2FsX2RldnNbaV0tPm5vZGVfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYpeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBmaW5kIG93bmVyIFR3aXN0ZXIgZm9yIEN5Y2xvbmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbGFzdF9idXM7CisJfQorCisJc3dpdGNoIChyaW9fZGV2c1t3cGVnX251bV0tPnR5cGUpeworCWNhc2UgQ29tcGF0V1BFRzoKKwkJLyogVGhlIENvbXBhdGFiaWxpdHkgV2lubmlwZWcgY29udHJvbHMgdGhlIDIgbGVnYWN5IGJ1c2VzLAorCQkgKiB0aGUgNjZNSHogUENJIGJ1cyBbMiBzbG90c10gYW5kIHRoZSAyICJleHRyYSIgYnVzZXMgaW4gY2FzZQorCQkgKiBhIFBDSS1QQ0kgYnJpZGdlIGNhcmQgaXMgdXNlZCBpbiBlaXRoZXIgc2xvdDogdG90YWwgNSBidXNlcy4KKwkJICovCisJCW51bV9idXNlcyA9IDU7CisJCWJyZWFrOworCWNhc2UgQWx0V1BFRzoKKwkJLyogVGhlIEFsdGVybmF0ZSBXaW5uaXBlZyBjb250cm9scyB0aGUgMiAxMzNNSHogYnVzZXMgWzEgc2xvdAorCQkgKiBlYWNoXSwgdGhlaXIgMiAiZXh0cmEiIGJ1c2VzLCB0aGUgMTAwTUh6IGJ1cyBbMiBzbG90c10gYW5kCisJCSAqIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA3IGJ1c2VzLgorCQkgKi8KKwkJbnVtX2J1c2VzID0gNzsKKwkJYnJlYWs7CisJY2FzZSBMb29rT3V0QVdQRUc6CisJY2FzZSBMb29rT3V0QldQRUc6CisJCS8qIEEgTG9va291dCBXaW5uaXBlZyBjb250cm9scyAzIDEwME1IeiBidXNlcyBbMiBzbG90cyBlYWNoXQorCQkgKiAmIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA5IGJ1c2VzLgorCQkgKi8KKwkJbnVtX2J1c2VzID0gOTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIFdpbm5pcGVnIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbGFzdF9idXM7CisJfQorCisJZm9yKGJ1cyA9IGxhc3RfYnVzOyBidXMgPCBsYXN0X2J1cyArIG51bV9idXNlczsgYnVzKyspCisJCW1wX2J1c19pZF90b19ub2RlW2J1c10gPSBub2RlOworCXJldHVybiBidXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJ1aWxkX2RldGFpbF9hcnJheXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlpbnQgaSwgc2NhbF9kZXRhaWxfc2l6ZSwgcmlvX2RldGFpbF9zaXplOworCisJaWYgKHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldiA+IE1BWF9OVU1OT0RFUyl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQVhfTlVNTk9ERVMgdG9vIGxvdyEgIERlZmluZWQgYXMgJWQsIGJ1dCBzeXN0ZW0gaGFzICVkIG5vZGVzLlxuIiwgX19GVU5DVElPTl9fLCBNQVhfTlVNTk9ERVMsIHJpb190YWJsZV9oZHItPm51bV9zY2FsX2Rldik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAocmlvX3RhYmxlX2hkci0+dmVyc2lvbil7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgUmlvIEdyYW5kZSBUYWJsZSBWZXJzaW9uOiAlZFxuIiwgX19GVU5DVElPTl9fLCByaW9fdGFibGVfaGRyLT52ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJY2FzZSAyOgorCQlzY2FsX2RldGFpbF9zaXplID0gMTE7CisJCXJpb19kZXRhaWxfc2l6ZSA9IDEzOworCQlicmVhazsKKwljYXNlIDM6CisJCXNjYWxfZGV0YWlsX3NpemUgPSAxMjsKKwkJcmlvX2RldGFpbF9zaXplID0gMTU7CisJCWJyZWFrOworCX0KKworCXB0ciA9ICh1bnNpZ25lZCBsb25nKXJpb190YWJsZV9oZHIgKyAzOworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrLCBwdHIgKz0gc2NhbF9kZXRhaWxfc2l6ZSkKKwkJc2NhbF9kZXZzW2ldID0gKHN0cnVjdCBzY2FsX2RldGFpbCAqKXB0cjsKKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyssIHB0ciArPSByaW9fZGV0YWlsX3NpemUpCisJCXJpb19kZXZzW2ldID0gKHN0cnVjdCByaW9fZGV0YWlsICopcHRyOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX3N1bW1pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcJCXB0cjsKKwl1bnNpZ25lZCBzaG9ydAkJb2Zmc2V0OworCWludAkJCWksIG5leHRfd3BlZywgbmV4dF9idXMgPSAwOworCisJLyogVGhlIHBvaW50ZXIgdG8gdGhlIEVCREEgaXMgc3RvcmVkIGluIHRoZSB3b3JkIEAgcGh5cyAweDQwRSg0MDowRSkgKi8KKwlwdHIgPSAqKHVuc2lnbmVkIHNob3J0ICopcGh5c190b192aXJ0KDB4NDBFdWwpOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwdHIgPDwgNCk7CisKKwlyaW9fdGFibGVfaGRyID0gTlVMTDsKKwlvZmZzZXQgPSAweDE4MDsKKwl3aGlsZSAob2Zmc2V0KXsKKwkJLyogVGhlIGJsb2NrIGlkIGlzIHN0b3JlZCBpbiB0aGUgMm5kIHdvcmQgKi8KKwkJaWYgKCooKHVuc2lnbmVkIHNob3J0ICopKHB0ciArIG9mZnNldCArIDIpKSA9PSAweDQ3NTIpeworCQkJLyogc2V0IHRoZSBwb2ludGVyIHBhc3QgdGhlIG9mZnNldCAmIGJsb2NrIGlkICovCisJCQlyaW9fdGFibGVfaGRyID0gKHN0cnVjdCByaW9fdGFibGVfaGRyICopKHB0ciArIG9mZnNldCArIDQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogVGhlIG5leHQgb2Zmc2V0IGlzIHN0b3JlZCBpbiB0aGUgMXN0IHdvcmQuICAwIG1lYW5zIG5vIG1vcmUgKi8KKwkJb2Zmc2V0ID0gKigodW5zaWduZWQgc2hvcnQgKikocHRyICsgb2Zmc2V0KSk7CisJfQorCWlmICghcmlvX3RhYmxlX2hkcil7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBsb2NhdGUgUmlvIEdyYW5kZSBUYWJsZSBpbiBFQkRBIC0gYmFpbGluZyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWJ1aWxkX2RldGFpbF9hcnJheXMoKSkKKwkJcmV0dXJuOworCisJLyogVGhlIGZpcnN0IFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yIGhhcyBhbiBpbmRleCBvZiAwICovCisJbmV4dF93cGVnID0gMDsKKwlkbyB7CisJCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspeworCQkJaWYgKGlzX1dQRUcocmlvX2RldnNbaV0pICYmIHJpb19kZXZzW2ldLT5XUF9pbmRleCA9PSBuZXh0X3dwZWcpeworCQkJCS8qIEl0J3MgdGhlIFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yISAqLworCQkJCW5leHRfYnVzID0gc2V0dXBfcGNpX25vZGVfbWFwX2Zvcl93cGVnKGksIG5leHRfYnVzKTsKKwkJCQluZXh0X3dwZWcrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBnbyB0aHJvdWdoIGFsbCBSaW8gZGV2aWNlcyBhbmQgZG9uJ3QgZmluZCBvbmUgd2l0aAorCQkgKiB0aGUgbmV4dCBpbmRleCwgaXQgbWVhbnMgd2UndmUgZm91bmQgYWxsIHRoZSBXaW5uaXBlZ3MsCisJCSAqIGFuZCB0aHVzIGFsbCB0aGUgUENJIGJ1c2VzLgorCQkgKi8KKwkJaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpCisJCQluZXh0X3dwZWcgPSAwOworCX0gd2hpbGUgKG5leHRfd3BlZyAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogbGludXgvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgcmFuZG9tIHN5c3RlbSBjYWxscyB0aGF0CisgKiBoYXZlIGEgbm9uLXN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2Ugb24gdGhlIExpbnV4L2kzODYKKyAqIHBsYXRmb3JtLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21zZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXBjLmg+CisKKy8qCisgKiBzeXNfcGlwZSgpIGlzIHRoZSBub3JtYWwgQyBjYWxsaW5nIHN0YW5kYXJkIGZvciBjcmVhdGluZworICogYSBwaXBlLiBJdCdzIG5vdCB0aGUgd2F5IFVuaXggdHJhZGl0aW9uYWxseSBkb2VzIHRoaXMsIHRob3VnaC4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyBfX3VzZXIgKiBmaWxkZXMpCit7CisJaW50IGZkWzJdOworCWludCBlcnJvcjsKKworCWVycm9yID0gZG9fcGlwZShmZCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoY29weV90b191c2VyKGZpbGRlcywgZmQsIDIqc2l6ZW9mKGludCkpKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLworc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAorCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJaW50IGVycm9yID0gLUVCQURGOworCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisJaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgeworCQlmaWxlID0gZmdldChmZCk7CisJCWlmICghZmlsZSkKKwkJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChmaWxlKQorCQlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKKwl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOworfQorCisvKgorICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCisgKiBjYWxscy4gTGludXgvaTM4NiBkaWRuJ3QgdXNlIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbgorICogNCBzeXN0ZW0gY2FsbCBwYXJhbWV0ZXJzLCBzbyB0aGVzZSBzeXN0ZW0gY2FsbHMgdXNlZCBhIG1lbW9yeQorICogYmxvY2sgZm9yIHBhcmFtZXRlciBwYXNzaW5nLi4KKyAqLworCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKK2FzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhOworCWludCBlcnIgPSAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQorCQlnb3RvIG91dDsKKworCWVyciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbjsKKwlmZF9zZXQgX191c2VyICppbnAsICpvdXRwLCAqZXhwOworCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHZwOworfTsKKworYXNtbGlua2FnZSBpbnQgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJc3RydWN0IHNlbF9hcmdfc3RydWN0IGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyogc3lzX3NlbGVjdCgpIGRvZXMgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBsb2NraW5nICovCisJcmV0dXJuIHN5c19zZWxlY3QoYS5uLCBhLmlucCwgYS5vdXRwLCBhLmV4cCwgYS50dnApOworfQorCisvKgorICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KKyAqCisgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgorICovCithc21saW5rYWdlIGludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwKKwkJCWludCB0aGlyZCwgdm9pZCBfX3VzZXIgKnB0ciwgbG9uZyBmaWZ0aCkKK3sKKwlpbnQgdmVyc2lvbiwgcmV0OworCisJdmVyc2lvbiA9IGNhbGwgPj4gMTY7IC8qIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwljYWxsICY9IDB4ZmZmZjsKKworCXN3aXRjaCAoY2FsbCkgeworCWNhc2UgU0VNT1A6CisJCXJldHVybiBzeXNfc2VtdGltZWRvcCAoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKXB0ciwgc2Vjb25kLCBOVUxMKTsKKwljYXNlIFNFTVRJTUVET1A6CisJCXJldHVybiBzeXNfc2VtdGltZWRvcChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLCBzZWNvbmQsCisJCQkJCShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopZmlmdGgpOworCisJY2FzZSBTRU1HRVQ6CisJCXJldHVybiBzeXNfc2VtZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBTRU1DVEw6IHsKKwkJdW5pb24gc2VtdW4gZm91cnRoOworCQlpZiAoIXB0cikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKikgcHRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gc3lzX3NlbWN0bCAoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvdXJ0aCk7CisJfQorCisJY2FzZSBNU0dTTkQ6CisJCXJldHVybiBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwgCisJCQkJICAgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBNU0dSQ1Y6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQljYXNlIDA6IHsKKwkJCXN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKKwkJCWlmICghcHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwKKwkJCQkJICAgKHN0cnVjdCBpcGNfa2x1ZGdlIF9fdXNlciAqKSBwdHIsIAorCQkJCQkgICBzaXplb2YgKHRtcCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIHN5c19tc2dyY3YgKGZpcnN0LCB0bXAubXNncCwgc2Vjb25kLAorCQkJCQkgICB0bXAubXNndHlwLCB0aGlyZCk7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwKKwkJCQkJICAgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwKKwkJCQkJICAgc2Vjb25kLCBmaWZ0aCwgdGhpcmQpOworCQl9CisJY2FzZSBNU0dHRVQ6CisJCXJldHVybiBzeXNfbXNnZ2V0ICgoa2V5X3QpIGZpcnN0LCBzZWNvbmQpOworCWNhc2UgTVNHQ1RMOgorCQlyZXR1cm4gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKikgcHRyKTsKKworCWNhc2UgU0hNQVQ6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQlkZWZhdWx0OiB7CisJCQl1bG9uZyByYWRkcjsKKwkJCXJldCA9IGRvX3NobWF0IChmaXJzdCwgKGNoYXIgX191c2VyICopIHB0ciwgc2Vjb25kLCAmcmFkZHIpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIHB1dF91c2VyIChyYWRkciwgKHVsb25nIF9fdXNlciAqKSB0aGlyZCk7CisJCX0KKwkJY2FzZSAxOgkvKiBpQkNTMiBlbXVsYXRvciBlbnRyeSBwb2ludCAqLworCQkJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBUaGUgIih1bG9uZyAqKSB0aGlyZCIgaXMgdmFsaWQgX29ubHlfIGJlY2F1c2Ugb2YgdGhlIGtlcm5lbCBzZWdtZW50IHRoaW5nICovCisJCQlyZXR1cm4gZG9fc2htYXQgKGZpcnN0LCAoY2hhciBfX3VzZXIgKikgcHRyLCBzZWNvbmQsICh1bG9uZyAqKSB0aGlyZCk7CisJCX0KKwljYXNlIFNITURUOiAKKwkJcmV0dXJuIHN5c19zaG1kdCAoKGNoYXIgX191c2VyICopcHRyKTsKKwljYXNlIFNITUdFVDoKKwkJcmV0dXJuIHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNITUNUTDoKKwkJcmV0dXJuIHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsCisJCQkJICAgKHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIgKikgcHRyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKKy8qCisgKiBPbGQgY3J1ZnQKKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3VuYW1lKHN0cnVjdCBvbGRfdXRzbmFtZSBfX3VzZXIgKiBuYW1lKQoreworCWludCBlcnI7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duX3JlYWQoJnV0c19zZW0pOworCWVycj1jb3B5X3RvX3VzZXIobmFtZSwgJnN5c3RlbV91dHNuYW1lLCBzaXplb2YgKCpuYW1lKSk7CisJdXBfcmVhZCgmdXRzX3NlbSk7CisJcmV0dXJuIGVycj8tRUZBVUxUOjA7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICogbmFtZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSxuYW1lLHNpemVvZihzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgIAorICAJZG93bl9yZWFkKCZ1dHNfc2VtKTsKKwkKKwllcnJvciA9IF9fY29weV90b191c2VyKCZuYW1lLT5zeXNuYW1lLCZzeXN0ZW1fdXRzbmFtZS5zeXNuYW1lLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5zeXNuYW1lK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5ub2RlbmFtZSwmc3lzdGVtX3V0c25hbWUubm9kZW5hbWUsX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPm5vZGVuYW1lK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5yZWxlYXNlLCZzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5yZWxlYXNlK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT52ZXJzaW9uLCZzeXN0ZW1fdXRzbmFtZS52ZXJzaW9uLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT52ZXJzaW9uK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5tYWNoaW5lLCZzeXN0ZW1fdXRzbmFtZS5tYWNoaW5lLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5tYWNoaW5lK19fT0xEX1VUU19MRU4pOworCQorCXVwX3JlYWQoJnV0c19zZW0pOworCQorCWVycm9yID0gZXJyb3IgPyAtRUZBVUxUIDogMDsKKworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBkOGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5lZWRlZCBpbml0aWFsaXphdGlvbnMgdG8gc3VwcG9ydCBzeXNlbnRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5c2VudGVyX2VudHJ5KHZvaWQpOworCit2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQgKmluZm8pCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwl0c3MtPnNzMSA9IF9fS0VSTkVMX0NTOworCXRzcy0+ZXNwMSA9IHNpemVvZihzdHJ1Y3QgdHNzX3N0cnVjdCkgKyAodW5zaWduZWQgbG9uZykgdHNzOworCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBfX0tFUk5FTF9DUywgMCk7CisJd3Jtc3IoTVNSX0lBMzJfU1lTRU5URVJfRVNQLCB0c3MtPmVzcDEsIDApOworCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgKHVuc2lnbmVkIGxvbmcpIHN5c2VudGVyX2VudHJ5LCAwKTsKKwlwdXRfY3B1KCk7CQorfQorCisvKgorICogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCBieSB2c3lzY2FsbC5vIHRvIG1hcmsgdGhlIGJvdW5kcworICogb2YgdGhlIEVMRiBEU08gaW1hZ2VzIGluY2x1ZGVkIHRoZXJlaW4uCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIHZzeXNjYWxsX2ludDgwX3N0YXJ0LCB2c3lzY2FsbF9pbnQ4MF9lbmQ7CitleHRlcm4gY29uc3QgY2hhciB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kOworCitzdGF0aWMgaW50IF9faW5pdCBzeXNlbnRlcl9zZXR1cCh2b2lkKQoreworCXZvaWQgKnBhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKworCV9fc2V0X2ZpeG1hcChGSVhfVlNZU0NBTEwsIF9fcGEocGFnZSksIFBBR0VfUkVBRE9OTFlfRVhFQyk7CisKKwlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKSB7CisJCW1lbWNweShwYWdlLAorCQkgICAgICAgJnZzeXNjYWxsX2ludDgwX3N0YXJ0LAorCQkgICAgICAgJnZzeXNjYWxsX2ludDgwX2VuZCAtICZ2c3lzY2FsbF9pbnQ4MF9zdGFydCk7CisJCXJldHVybiAwOworCX0KKworCW1lbWNweShwYWdlLAorCSAgICAgICAmdnN5c2NhbGxfc3lzZW50ZXJfc3RhcnQsCisJICAgICAgICZ2c3lzY2FsbF9zeXNlbnRlcl9lbmQgLSAmdnN5c2NhbGxfc3lzZW50ZXJfc3RhcnQpOworCisJb25fZWFjaF9jcHUoZW5hYmxlX3NlcF9jcHUsIE5VTEwsIDEsIDEpOworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKHN5c2VudGVyX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBDLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlsczoKKyAqIHJlYWRpbmcgdGhlIFJUQyBhdCBib290dXAsIGV0Yy4uCisgKiAxOTk0LTA3LTAyICAgIEFsYW4gTW9kcmEKKyAqCWZpeGVkIHNldF9ydGNfbW1zcywgZml4ZWQgdGltZS55ZWFyIGZvciA+PSAyMDAwLCBuZXcgbWt0aW1lCisgKiAxOTk1LTAzLTI2ICAgIE1hcmt1cyBLdWhuCisgKiAgICAgIGZpeGVkIDUwMCBtcyBidWcgYXQgY2FsbCB0byBzZXRfcnRjX21tc3MsIGZpeGVkIERTMTI4ODcKKyAqICAgICAgcHJlY2lzaW9uIENNT1MgY2xvY2sgdXBkYXRlCisgKiAxOTk2LTA1LTAzICAgIEluZ28gTW9sbmFyCisgKiAgICAgIGZpeGVkIHRpbWUgd2FycHMgaW4gZG9fW3Nsb3d8ZmFzdF1fZ2V0dGltZW9mZnNldCgpCisgKiAxOTk3LTA5LTEwCVVwZGF0ZWQgTlRQIGNvZGUgYWNjb3JkaW5nIHRvIHRlY2huaWNhbCBtZW1vcmFuZHVtIEphbiAnOTYKKyAqCQkiQSBLZXJuZWwgTW9kZWwgZm9yIFByZWNpc2lvbiBUaW1la2VlcGluZyIgYnkgRGF2ZSBNaWxscworICogMTk5OC0wOS0wNSAgICAoVmFyaW91cykKKyAqCU1vcmUgcm9idXN0IGRvX2Zhc3RfZ2V0dGltZW9mZnNldCgpIGFsZ29yaXRobSBpbXBsZW1lbnRlZAorICoJKHdvcmtzIHdpdGggQVBNLCBDeXJpeCA2eDg2TVggYW5kIENlbnRhdXIgQzYpLAorICoJbW9ub3RvbmljIGdldHRpbWVvZmRheSgpIHdpdGggZmFzdF9nZXRfdGltZW9mZnNldCgpLAorICoJZHJpZnQtcHJvb2YgcHJlY2lzaW9uIFRTQyBjYWxpYnJhdGlvbiBvbiBib290CisgKgkoQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+LCBBbmRyZXcgRC4KKyAqCUJhbHNhIDxhbmRyZWJhbHNhQGFsdGVybi5vcmc+LCBQaGlsaXAgR2xhZHN0b25lIDxwaGlsaXBAcmFwdG9yLmNvbT47CisgKglwb3J0ZWQgZnJvbSAyLjAuMzUgSnVtYm8tOSBieSBNaWNoYWVsIEtyYXVzZSA8bS5rcmF1c2VAdHUtaGFyYnVyZy5kZT4pLgorICogMTk5OC0xMi0xNiAgICBBbmRyZWEgQXJjYW5nZWxpCisgKglGaXhlZCBKdW1iby05IGNvZGUgaW4gMi4xLjEzMTogZG9fZ2V0dGltZW9mZGF5IHdhcyBtaXNzaW5nIDEgamlmZnkKKyAqCWJlY2F1c2Ugd2FzIG5vdCBhY2NvdW50aW5nIGxvc3RfdGlja3MuCisgKiAxOTk4LTEyLTI0IENvcHlyaWdodCAoQykgMTk5OCAgQW5kcmVhIEFyY2FuZ2VsaQorICoJRml4ZWQgYSB4dGltZSBTTVAgcmFjZSAod2UgbmVlZCB0aGUgeHRpbWVfbG9jayBydyBzcGlubG9jayB0bworICoJc2VyaWFsaXplIGFjY2Vzc2VzIHRvIHh0aW1lL2xvc3RfdGlja3MpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZS5oIgorCisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitpbnQgcGl0X2xhdGNoX2J1Z2d5OyAgICAgICAgICAgICAgLyogZXh0ZXJuICovCisKKyNpbmNsdWRlICJkb190aW1lci5oIgorCit1NjQgamlmZmllc182NCA9IElOSVRJQUxfSklGRklFUzsKKworRVhQT1JUX1NZTUJPTChqaWZmaWVzXzY0KTsKKwordW5zaWduZWQgbG9uZyBjcHVfa2h6OwkvKiBEZXRlY3RlZCBhcyB3ZSBjYWxpYnJhdGUgdGhlIFRTQyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CisKK0RFRklORV9TUElOTE9DSyhydGNfbG9jayk7CisKK0RFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKK0VYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CisKK3N0cnVjdCB0aW1lcl9vcHRzICpjdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKKworLyoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvY2sgdGhhdCBpcyBvd25lZCBieSB0aGUgQ1BVIGFuZCBob2xkcyB0aGUgaW5kZXgKKyAqIHJlZ2lzdGVyIHdlIGFyZSB3b3JraW5nIHdpdGguICBJdCBpcyByZXF1aXJlZCBmb3IgTk1JIGFjY2VzcyB0byB0aGUKKyAqIENNT1MvUlRDIHJlZ2lzdGVycy4gIFNlZSBpbmNsdWRlL2FzbS1pMzg2L21jMTQ2ODE4cnRjLmggZm9yIGRldGFpbHMuCisgKi8KK3ZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY21vc19sb2NrID0gMDsKK0VYUE9SVF9TWU1CT0woY21vc19sb2NrKTsKKworLyogUm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUgQ01PUyBSQU0vUlRDLiAqLwordW5zaWduZWQgY2hhciBydGNfY21vc19yZWFkKHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJdmFsID0gaW5iX3AoUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0wocnRjX2Ntb3NfcmVhZCk7CisKK3ZvaWQgcnRjX2Ntb3Nfd3JpdGUodW5zaWduZWQgY2hhciB2YWwsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJb3V0Yl9wKHZhbCwgUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y19jbW9zX3dyaXRlKTsKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBvZiBnZXR0aW1lb2ZkYXkgaGFzIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24KKyAqIGFuZCBiZXR0ZXIgdGhhbiBtaWNyb3NlY29uZCBwcmVjaXNpb24gb24gZmFzdCB4ODYgbWFjaGluZXMgd2l0aCBUU0MuCisgKi8KK3ZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIHNlcTsKKwl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYzsKKwl1bnNpZ25lZCBsb25nIG1heF9udHBfdGljazsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBsb3N0OworCisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCXVzZWMgPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKTsKKwkJbG9zdCA9IGppZmZpZXMgLSB3YWxsX2ppZmZpZXM7CisKKwkJLyoKKwkJICogSWYgdGltZV9hZGp1c3QgaXMgbmVnYXRpdmUgdGhlbiBOVFAgaXMgc2xvd2luZyB0aGUgY2xvY2sKKwkJICogc28gbWFrZSBzdXJlIG5vdCB0byBnbyBpbnRvIG5leHQgcG9zc2libGUgaW50ZXJ2YWwuCisJCSAqIEJldHRlciB0byBsb3NlIHNvbWUgYWNjdXJhY3kgdGhhbiBoYXZlIHRpbWUgZ28gYmFja3dhcmRzLi4KKwkJICovCisJCWlmICh1bmxpa2VseSh0aW1lX2FkanVzdCA8IDApKSB7CisJCQltYXhfbnRwX3RpY2sgPSAoVVNFQ19QRVJfU0VDIC8gSFopIC0gdGlja2FkajsKKwkJCXVzZWMgPSBtaW4odXNlYywgbWF4X250cF90aWNrKTsKKworCQkJaWYgKGxvc3QpCisJCQkJdXNlYyArPSBsb3N0ICogbWF4X250cF90aWNrOworCQl9CisJCWVsc2UgaWYgKHVubGlrZWx5KGxvc3QpKQorCQkJdXNlYyArPSBsb3N0ICogKFVTRUNfUEVSX1NFQyAvIEhaKTsKKworCQlzZWMgPSB4dGltZS50dl9zZWM7CisJCXVzZWMgKz0gKHh0aW1lLnR2X25zZWMgLyAxMDAwKTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCXdoaWxlICh1c2VjID49IDEwMDAwMDApIHsKKwkJdXNlYyAtPSAxMDAwMDAwOworCQlzZWMrKzsKKwl9CisKKwl0di0+dHZfc2VjID0gc2VjOworCXR2LT50dl91c2VjID0gdXNlYzsKK30KKworRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOworCitpbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCit7CisJdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7CisJbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOworCisJaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisJLyoKKwkgKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQorCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKKwkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQorCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCisJICovCisJbnNlYyAtPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7CisJbnNlYyAtPSAoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBUSUNLX05TRUM7CisKKwl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOworCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CisKKwl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KKwl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOworCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwljbG9ja193YXNfc2V0KCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKKworc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCWludCByZXR2YWw7CisKKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwkvKiBnZXRzIHJlY2FsbGVkIHdpdGggaXJxIGxvY2FsbHkgZGlzYWJsZWQgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfc2V0X3J0Y19tbXNzKG5vd3RpbWUpOworCWVsc2UKKwkJcmV0dmFsID0gbWFjaF9zZXRfcnRjX21tc3Mobm93dGltZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCB0aW1lcl9hY2s7CisKKy8qIG1vbm90b25pY19jbG9jaygpOiByZXR1cm5zICMgb2YgbmFub3NlY29uZHMgcGFzc2VkIHNpbmNlIHRpbWVfaW5pdCgpCisgKgkJTm90ZTogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byByZXR1cm4gYWNjdXJhdGUKKyAqCQl0aW1lIGV2ZW4gaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwbGUgdGltZXIgdGlja3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gY3VyX3RpbWVyLT5tb25vdG9uaWNfY2xvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobW9ub3RvbmljX2Nsb2NrKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKK3Vuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKworCWlmIChpbl9sb2NrX2Z1bmN0aW9ucyhwYykpCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikocmVncy0+ZWJwICsgNCk7CisKKwlyZXR1cm4gcGM7Cit9CitFWFBPUlRfU1lNQk9MKHByb2ZpbGVfcGMpOworI2VuZGlmCisKKy8qCisgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCisgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJaWYgKHRpbWVyX2FjaykgeworCQkvKgorCQkgKiBTdWJ0bGUsIHdoZW4gSS9PIEFQSUNzIGFyZSB1c2VkIHdlIGhhdmUgdG8gYWNrIHRpbWVyIElSUQorCQkgKiBtYW51YWxseSB0byByZXNldCB0aGUgSVJSIGJpdCBmb3IgZG9fc2xvd19nZXR0aW1lb2Zmc2V0KCkuCisJCSAqIFRoaXMgd2lsbCBhbHNvIGRlYXNzZXJ0IE5NSSBsaW5lcyBmb3IgdGhlIHdhdGNoZG9nIGlmIHJ1bgorCQkgKiBvbiBhbiA4MjQ4OURYLWJhc2VkIHN5c3RlbS4KKwkJICovCisJCXNwaW5fbG9jaygmaTgyNTlBX2xvY2spOworCQlvdXRiKDB4MGMsIFBJQ19NQVNURVJfT0NXMyk7CisJCS8qIEFjayB0aGUgSVJROyBBRU9JIHdpbGwgZW5kIGl0IGF1dG9tYXRpY2FsbHkuICovCisJCWluYihQSUNfTUFTVEVSX1BPTEwpOworCQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOworCX0KKyNlbmRpZgorCisJZG9fdGltZXJfaW50ZXJydXB0X2hvb2socmVncyk7CisKKworCWlmIChNQ0FfYnVzKSB7CisJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKKwkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bworCQllbmFibGUgZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0cyB1c3VhbGx5IGdldHMgaW50ZXJjZXB0ZWQgYnkgYQorCQlzcGVjaWFsIGhhcmR3YXJlIGNpcmN1aXQpLiAgSGVuY2Ugd2UgaGF2ZSB0byBhY2tub3dsZWRnZQorCQl0aGUgdGltZXIgaW50ZXJydXB0LiAgVGhyb3VnaCBzb21lIGluY3JlZGlibHkgc3R1cGlkCisJCWRlc2lnbiBpZGVhLCB0aGUgcmVzZXQgZm9yIElSUSAwIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUKKwkJaGlnaCBiaXQgb2YgdGhlIFBQSSBwb3J0IEIgKDB4NjEpLiAgTm90ZSB0aGF0IHNvbWUgUFMvMnMsCisJCW5vdGFibHkgdGhlIDU1U1gsIHdvcmsgZmluZSBpZiB0aGlzIGlzIHJlbW92ZWQuICAqLworCisJCWlycSA9IGluYl9wKCAweDYxICk7CS8qIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKwkJb3V0Yl9wKCBpcnF8MHg4MCwgMHg2MSApOwkvKiByZXNldCB0aGUgSVJRICovCisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUsIGV4Y2VwdCB3ZSBfYWxzb18gc2F2ZSB0aGUgY3VycmVudAorICogVGltZSBTdGFtcCBDb3VudGVyIHZhbHVlIGF0IHRoZSB0aW1lIG9mIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHNvIHRoYXQKKyAqIHdlIGxhdGVyIG9uIGNhbiBlc3RpbWF0ZSB0aGUgdGltZSBvZiBkYXkgbW9yZSBleGFjdGx5LgorICovCitpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UganVzdCBoYXZlIGlycXMgbG9jYWxseQorCSAqIGRpc2FibGVkIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nIG9uIHRoZSBvdGhlcgorCSAqIENQVS4gV2UgbmVlZCB0byBhdm9pZCB0byBTTVAgcmFjZSB3aXRoIGl0LiBOT1RFOiB3ZSBkb24nIHQgbmVlZAorCSAqIHRoZSBpcnEgdmVyc2lvbiBvZiB3cml0ZV9sb2NrIGJlY2F1c2UgYXMganVzdCBzYWlkIHdlIGhhdmUgaXJxCisJICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKKwkgKi8KKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCWN1cl90aW1lci0+bWFya19vZmZzZXQoKTsKKyAKKwlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCBOVUxMLCByZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCit1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfZ2V0X3RpbWUoKTsKKwllbHNlCisJCXJldHZhbCA9IG1hY2hfZ2V0X2Ntb3NfdGltZSgpOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzeW5jX2Ntb3NfdGltZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9JTklUSUFMSVpFUihzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOworCitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3csIG5leHQ7CisJaW50IGZhaWwgPSAxOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQorCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KKwkgKiBUaGlzIGNvZGUgaXMgcnVuIG9uIGEgdGltZXIuICBJZiB0aGUgY2xvY2sgaXMgc2V0LCB0aGF0IHRpbWVyCisJICogbWF5IG5vdCBleHBpcmUgYXQgdGhlIGNvcnJlY3QgdGltZS4gIFRodXMsIHdlIGFkanVzdC4uLgorCSAqLworCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSAhPSAwKQorCQkvKgorCQkgKiBOb3Qgc3luY2VkLCBleGl0LCBkbyBub3QgcmVzdGFydCBhIHRpbWVyIChpZiBvbmUgaXMKKwkJICogcnVubmluZywgbGV0IGl0IHJ1biBvdXQpLgorCQkgKi8KKwkJcmV0dXJuOworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWlmIChub3cudHZfdXNlYyA+PSBVU0VDX0FGVEVSIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKKwkgICAgbm93LnR2X3VzZWMgPD0gVVNFQ19CRUZPUkUgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikKKwkJZmFpbCA9IHNldF9ydGNfbW1zcyhub3cudHZfc2VjKTsKKworCW5leHQudHZfdXNlYyA9IFVTRUNfQUZURVIgLSBub3cudHZfdXNlYzsKKwlpZiAobmV4dC50dl91c2VjIDw9IDApCisJCW5leHQudHZfdXNlYyArPSBVU0VDX1BFUl9TRUM7CisKKwlpZiAoIWZhaWwpCisJCW5leHQudHZfc2VjID0gNjU5OworCWVsc2UKKwkJbmV4dC50dl9zZWMgPSAwOworCisJaWYgKG5leHQudHZfdXNlYyA+PSBVU0VDX1BFUl9TRUMpIHsKKwkJbmV4dC50dl9zZWMrKzsKKwkJbmV4dC50dl91c2VjIC09IFVTRUNfUEVSX1NFQzsKKwl9CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyB0aW1ldmFsX3RvX2ppZmZpZXMoJm5leHQpKTsKK30KKwordm9pZCBub3RpZnlfYXJjaF9jbW9zX3RpbWVyKHZvaWQpCit7CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyAxKTsKK30KKworc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmLCBzbGVlcF9zdGFydDsKKworc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwkvKgorCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCisJICovCisJY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKKwljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKKwlzbGVlcF9zdGFydCA9IGdldF9jbW9zX3RpbWUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGxvbmcgc2xlZXBfbGVuZ3RoOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwlpZiAoaXNfaHBldF9lbmFibGVkKCkpCisJCWhwZXRfcmVlbmFibGUoKTsKKyNlbmRpZgorCXNlYyA9IGdldF9jbW9zX3RpbWUoKSArIGNsb2NrX2Ntb3NfZGlmZjsKKwlzbGVlcF9sZW5ndGggPSAoZ2V0X2Ntb3NfdGltZSgpIC0gc2xlZXBfc3RhcnQpICogSFo7CisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJeHRpbWUudHZfc2VjID0gc2VjOworCXh0aW1lLnR2X25zZWMgPSAwOworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CisJd2FsbF9qaWZmaWVzICs9IHNsZWVwX2xlbmd0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJLnJlc3VtZSA9IHRpbWVyX3Jlc3VtZSwKKwkuc3VzcGVuZCA9IHRpbWVyX3N1c3BlbmQsCisJc2V0X2tzZXRfbmFtZSgidGltZXIiKSwKK307CisKKworLyogWFhYIHRoaXMgZHJpdmVyZnMgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGdvIGVsc2V3aGVyZSBsYXRlciAtam9obiAqLworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV90aW1lciA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmdGltZXJfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IHRpbWVfaW5pdF9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnRpbWVyX3N5c2NsYXNzKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX3RpbWVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbCh0aW1lX2luaXRfZGV2aWNlKTsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCitleHRlcm4gdm9pZCAoKmxhdGVfdGltZV9pbml0KSh2b2lkKTsKKy8qIER1cGxpY2F0ZSBvZiB0aW1lX2luaXQoKSBiZWxvdywgd2l0aCBocGV0X2VuYWJsZSBwYXJ0IGFkZGVkICovCitzdGF0aWMgdm9pZCBfX2luaXQgaHBldF90aW1lX2luaXQodm9pZCkKK3sKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJaWYgKGhwZXRfZW5hYmxlKCkgPj0gMCkgeworCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOworCX0KKworCWN1cl90aW1lciA9IHNlbGVjdF90aW1lcigpOworCXByaW50ayhLRVJOX0lORk8gIlVzaW5nICVzIGZvciBoaWdoLXJlcyB0aW1lc291cmNlXG4iLGN1cl90aW1lci0+bmFtZSk7CisKKwl0aW1lX2luaXRfaG9vaygpOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7CisJCS8qCisJCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAorCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KKwkJICovCisJCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJY3VyX3RpbWVyID0gc2VsZWN0X3RpbWVyKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgJXMgZm9yIGhpZ2gtcmVzIHRpbWVzb3VyY2VcbiIsY3VyX3RpbWVyLT5uYW1lKTsKKworCXRpbWVfaW5pdF9ob29rKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRhMzFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCisgKiAgVGhpcyBjb2RlIGxhcmdlbHkgY29waWVkIGZyb20gYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYworICogIFNlZSB0aGF0IGZpbGUgZm9yIGNyZWRpdHMuCisgKgorICogIDIwMDMtMDYtMzAgICAgVmVua2F0ZXNoIFBhbGxpcGFkaSAtIEFkZGl0aW9uYWwgY2hhbmdlcyBmb3IgSFBFVCBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CS8qIGZzZWNzIC8gSFBFVCBjbG9jayAqLwordW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CQkvKiBocGV0IGNsa3MgY291bnQgcGVyIHRpY2sgKi8KK3Vuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwkJLyogaHBldCBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworc3RhdGljIGludCB1c2VfaHBldDsgCQkvKiBjYW4gYmUgdXNlZCBmb3IgcnVudGltZSBjaGVjayBvZiBocGV0ICovCitzdGF0aWMgaW50IGJvb3RfaHBldF9kaXNhYmxlOyAJLyogYm9vdHRpbWUgb3ZlcnJpZGUgZm9yIEhQRVQgdGltZXIgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsJLyogaHBldCBrZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCisKKyNkZWZpbmUgRlNFQ19UT19VU0VDICgxMDAwMDAwMDAwVUwpCisKK2ludCBocGV0X3JlYWRsKHVuc2lnbmVkIGxvbmcgYSkKK3sKKwlyZXR1cm4gcmVhZGwoaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKK30KKworc3RhdGljIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKy8qCisgKiBIUEVUIGNvdW50ZXJzIGRvbnQgd3JhcCBhcm91bmQgb24gZXZlcnkgdGljay4gVGhleSBqdXN0IGNoYW5nZSB0aGUKKyAqIGNvbXBhcmF0b3IgdmFsdWUgYW5kIGNvbnRpbnVlLiBOZXh0IHRpY2sgY2FuIGJlIGNhdWdodCBieSBjaGVja2luZworICogZm9yIGEgY2hhbmdlIGluIHRoZSBjb21wYXJhdG9yIHZhbHVlLiBVc2VkIGluIGFwaWMuYy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHdhaXRfaHBldF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0X2NtcF92YWwsIGVuZF9jbXBfdmFsOworCisJc3RhcnRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOworCWRvIHsKKwkJZW5kX2NtcF92YWwgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKTsKKwl9IHdoaWxlIChzdGFydF9jbXBfdmFsID09IGVuZF9jbXBfdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFN0b3AgdGhlIHRpbWVycyBhbmQgcmVzZXQgdGhlIG1haW4gY291bnRlci4KKwkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgJj0gfkhQRVRfQ0ZHX0VOQUJMRTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIpOworCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUiArIDQpOworCisJLyoKKwkgKiBTZXQgdXAgdGltZXIgMCwgYXMgcGVyaW9kaWMgd2l0aCBmaXJzdCBpbnRlcnJ1cHQgdG8gaGFwcGVuIGF0CisJICogaHBldF90aWNrLCBhbmQgcGVyaW9kIGFsc28gaHBldF90aWNrLgorCSAqLworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fUEVSSU9ESUMgfAorCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKKwkgKiB0aGUgY291bnRlciB2YWx1ZSwgdGhlIHNlY29uZCB3cml0ZSBzZXRzIHRoZSB0aHJlc2hvbGQuCisJICovCisJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOworCWhwZXRfd3JpdGVsKHRpY2ssIEhQRVRfVDBfQ01QKTsKKworCS8qCisgCSAqIEdvIQorIAkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFIHwgSFBFVF9DRkdfTEVHQUNZOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIEhQRVQgd2FzIGZvdW5kIGJ5IEFDUEkgYm9vdCBwYXJzZS4gSWYgeWVzIHNldHVwIEhQRVQKKyAqIGNvdW50ZXIgMCBmb3Iga2VybmVsIGJhc2UgdGltZXIuCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgbG9uZyB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaDsgLyogdGljayBpbiBmZW10byBzZWMgKi8KKwl1bnNpZ25lZCBsb25nIGhwZXRfdGlja19yZW07CisKKwlpZiAoYm9vdF9ocGV0X2Rpc2FibGUpCisJCXJldHVybiAtMTsKKworCWlmICghaHBldF9hZGRyZXNzKSB7CisJCXJldHVybiAtMTsKKwl9CisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisJLyoKKwkgKiBSZWFkIHRoZSBwZXJpb2QsIGNvbXB1dGUgdGljayBhbmQgcXVvdGllbnQuCisJICovCisJaWQgPSBocGV0X3JlYWRsKEhQRVRfSUQpOworCisJLyoKKwkgKiBXZSBhcmUgY2hlY2tpbmcgZm9yIHZhbHVlICcxJyBvciBtb3JlIGluIG51bWJlciBmaWVsZCBpZgorCSAqIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDIGlzIHNldCBiZWNhdXNlIHdlIHdpbGwgbmVlZCBhbgorCSAqIGFkZGl0aW9uYWwgdGltZXIgZm9yIFJUQyBlbXVsYXRpb24uCisJICogSG93ZXZlciwgd2UgY2FuIGRvIHdpdGggb25lIHRpbWVyIG90aGVyd2lzZSB1c2luZyB0aGUKKwkgKiB0aGUgc2luZ2xlIEhQRVQgdGltZXIgZm9yIHN5c3RlbSB0aW1lLgorCSAqLworCWlmICgKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCQkhKGlkICYgSFBFVF9JRF9OVU1CRVIpIHx8CisjZW5kaWYKKwkgICAgIShpZCAmIEhQRVRfSURfTEVHU1VQKSkKKwkJcmV0dXJuIC0xOworCisJaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKKwlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIDY0IGJpdCBtYXRoCisJICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKKwkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKKwkgKi8KKwlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAorCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKKwlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKKwkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7CisKKwlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKKwkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpCisJCXJldHVybiAtMTsKKworCXVzZV9ocGV0ID0gMTsKKworI2lmZGVmCUNPTkZJR19IUEVUCisJeworCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOworCQl1bnNpZ25lZCBpbnQgCQludGltZXI7CisKKwkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCisJCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7CisJCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7CisJCW50aW1lcisrOworCisJCS8qCisJCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgorCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgorCQkgKi8KKwkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOworCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJCWhkLmhkX25pcnFzID0gbnRpbWVyOworCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7CisjaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKwkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKKwkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCQlpZiAobnRpbWVyID4gMikgeworCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKKwkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCQkJaW50CQkJaTsKKworCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOworCisJCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKKwkJCQl0aW1lcisrLCBpKyspCisJCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCisJCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KKwkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKKworCQl9CisKKwkJaHBldF9hbGxvYygmaGQpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJd2FpdF90aW1lcl90aWNrID0gd2FpdF9ocGV0X3RpY2s7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfcmVlbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOworfQorCitpbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIHVzZV9ocGV0OworfQorCitpbnQgaXNfaHBldF9jYXBhYmxlKHZvaWQpCit7CisJaWYgKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBocGV0X3NldHVwKGNoYXIqIHN0cikKK3sKKwlpZiAoc3RyKSB7CisJCWlmICghc3RybmNtcCgiZGlzYWJsZSIsIHN0ciwgNykpCisJCQlib290X2hwZXRfZGlzYWJsZSA9IDE7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCisjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKy8qIEhQRVQgaW4gTGVnYWN5UmVwbGFjZW1lbnQgTW9kZSBlYXRzIHVwIFJUQyBpbnRlcnJ1cHQgbGluZS4gV2hlbiwgSFBFVAorICogaXMgZW5hYmxlZCwgd2Ugc3VwcG9ydCBSVEMgaW50ZXJydXB0IGZ1bmN0aW9uYWxpdHkgaW4gc29mdHdhcmUuCisgKiBSVEMgaGFzIDMga2luZHMgb2YgaW50ZXJydXB0czoKKyAqIDEpIFVwZGF0ZSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQsIGV2ZXJ5IHNlYywgd2hlbiBSVEMgY2xvY2sKKyAqICAgIGlzIHVwZGF0ZWQKKyAqIDIpIEFsYXJtIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCBhdCBhIHNwZWNpZmljIHRpbWUgb2YgZGF5CisgKiAzKSBQZXJpb2RpYyBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIHdpdGggZnJlcXVlbmNpZXMKKyAqICAgIDJIei04MTkySHogKDJIei02NEh6IGZvciBub24tcm9vdCB1c2VyKSAoYWxsIGZyZXFzIGluIHBvd2VycyBvZiAyKQorICogKDEpIGFuZCAoMikgYWJvdmUgYXJlIGltcGxlbWVudGVkIHVzaW5nIHBvbGxpbmcgYXQgYSBmcmVxdWVuY3kgb2YKKyAqIDY0IEh6LiBUaGUgZXhhY3QgZnJlcXVlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW50ZXJydXB0CisgKiBvdmVyaGVhZC4gKERFRkFVTFRfUlRDX0lOVF9GUkVRKQorICogRm9yICgzKSwgd2UgdXNlIGludGVycnVwdHMgYXQgNjRIeiBvciB1c2VyIHNwZWNpZmllZCBwZXJpb2RpYworICogZnJlcXVlbmN5LCB3aGljaGV2ZXIgaXMgaGlnaGVyLgorICovCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworZXh0ZXJuIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0CisjZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgVUlFX29uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl91cGRhdGVfc2VjOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBBSUVfb247CitzdGF0aWMgc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RpbWU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9vbjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfY291bnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcnRjX2ludF9mcmVxOyAvKiBSVEMgaW50ZXJydXB0IGZyZXF1ZW5jeSAqLworCisvKgorICogVGltZXIgMSBmb3IgUlRDLCB3ZSBkbyBub3QgdXNlIHBlcmlvZGljIGludGVycnVwdCBmZWF0dXJlLAorICogZXZlbiBpZiBIUEVUIHN1cHBvcnRzIHBlcmlvZGljIGludGVycnVwdHMgb24gVGltZXIgMS4KKyAqIFRoZSByZWFzb24gYmVpbmcsIHRvIHNldCB1cCBhIHBlcmlvZGljIGludGVycnVwdCBpbiBIUEVULCB3ZSBuZWVkIHRvCisgKiBzdG9wIHRoZSBtYWluIGNvdW50ZXIuIEFuZCBpZiB3ZSBkbyB0aGF0IGV2ZXJ5dGltZSBzb21lb25lIGRpYWJsZXMvZW5hYmxlcworICogUlRDLCB3ZSB3aWxsIGhhdmUgYWR2ZXJzZSBlZmZlY3Qgb24gbWFpbiBrZXJuZWwgdGltZXIgcnVubmluZyBvbiBUaW1lciAwLgorICogU28sIGZvciB0aGUgdGltZSBiZWluZywgc2ltdWxhdGUgdGhlIHBlcmlvZGljIGludGVycnVwdCBpbiBzb2Z0d2FyZS4KKyAqCisgKiBocGV0X3J0Y190aW1lcl9pbml0KCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZHVyaW5nIHN1YnNlcXVlbnQKKyAqIGludGVydXBwdHMgcmVpbml0IGhhcHBlbnMgdGhyb3VnaCBocGV0X3J0Y190aW1lcl9yZWluaXQoKS4KKyAqLworaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCS8qCisJICogU2V0IHRoZSBjb3VudGVyIDEgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCWNudCArPSAoKGhwZXRfdGljaypIWikvaHBldF9ydGNfaW50X2ZyZXEpOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisKKwlpZiAoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKQorCQlyZXR1cm47CisKKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwkvKiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHVzZSB0aGUgY29tcGFyYXRvciB2YWx1ZSB0aGFuIGN1cnJlbnQgY291bnQuKi8KKwljbnQgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ01QKTsKKwljbnQgKz0gaHBldF90aWNrKkhaL2hwZXRfcnRjX2ludF9mcmVxOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCisJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9TRVRWQUwgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGZyb20gcnRjIGRyaXZlci4KKyAqIFJldHVybiAwIGlmIEhQRVQgaXMgbm90IGJlaW5nIHVzZWQuCisgKiBPdGhlcndpc2UgZG8gdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGFuZCByZXR1cm4gMS4KKyAqLworaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkKKwkJVUlFX29uID0gMDsKKwlpZiAoYml0X21hc2sgJiBSVENfUElFKQorCQlQSUVfb24gPSAwOworCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpCisJCUFJRV9vbiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaW50IHRpbWVyX2luaXRfcmVxZCA9IDA7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpCisJCXRpbWVyX2luaXRfcmVxZCA9IDE7CisKKwlpZiAoYml0X21hc2sgJiBSVENfVUlFKSB7CisJCVVJRV9vbiA9IDE7CisJfQorCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpIHsKKwkJUElFX29uID0gMTsKKwkJUElFX2NvdW50ID0gMDsKKwl9CisJaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkgeworCQlBSUVfb24gPSAxOworCX0KKworCWlmICh0aW1lcl9pbml0X3JlcWQpCisJCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfYWxhcm1fdGltZSh1bnNpZ25lZCBjaGFyIGhycywgdW5zaWduZWQgY2hhciBtaW4sIHVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJYWxhcm1fdGltZS50bV9ob3VyID0gaHJzOworCWFsYXJtX3RpbWUudG1fbWluID0gbWluOworCWFsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCVBJRV9mcmVxID0gZnJlcTsKKwlQSUVfY291bnQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydGNfdGltZSBjdXJyX3RpbWU7CisJdW5zaWduZWQgbG9uZyBydGNfaW50X2ZsYWcgPSAwOworCWludCBjYWxsX3J0Y19pbnRlcnJ1cHQgPSAwOworCisJaHBldF9ydGNfdGltZXJfcmVpbml0KCk7CisKKwlpZiAoVUlFX29uIHwgQUlFX29uKSB7CisJCXJ0Y19nZXRfcnRjX3RpbWUoJmN1cnJfdGltZSk7CisJfQorCWlmIChVSUVfb24pIHsKKwkJaWYgKGN1cnJfdGltZS50bV9zZWMgIT0gcHJldl91cGRhdGVfc2VjKSB7CisJCQkvKiBTZXQgdXBkYXRlIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnID0gUlRDX1VGOworCQkJcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwkJfQorCX0KKwlpZiAoUElFX29uKSB7CisJCVBJRV9jb3VudCsrOworCQlpZiAoUElFX2NvdW50ID49IGhwZXRfcnRjX2ludF9mcmVxL1BJRV9mcmVxKSB7CisJCQkvKiBTZXQgcGVyaW9kaWMgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgfD0gUlRDX1BGOworCQkJUElFX2NvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoQUlFX29uKSB7CisJCWlmICgoY3Vycl90aW1lLnRtX3NlYyA9PSBhbGFybV90aW1lLnRtX3NlYykgJiYKKwkJICAgIChjdXJyX3RpbWUudG1fbWluID09IGFsYXJtX3RpbWUudG1fbWluKSAmJgorCQkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGFsYXJtX3RpbWUudG1faG91cikpIHsKKwkJCS8qIFNldCBhbGFybSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisJCX0KKwl9CisJaWYgKGNhbGxfcnRjX2ludGVycnVwdCkgeworCQlydGNfaW50X2ZsYWcgfD0gKFJUQ19JUlFGIHwgKFJUQ19OVU1fSU5UUyA8PCA4KSk7CisJCXJ0Y19pbnRlcnJ1cHQocnRjX2ludF9mbGFnLCBkZXZfaWQsIHJlZ3MpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmExMmJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB4ODYgdGltZXJzCisjCisKK29iai15IDo9IHRpbWVyLm8gdGltZXJfbm9uZS5vIHRpbWVyX3RzYy5vIHRpbWVyX3BpdC5vIGNvbW1vbi5vCisKK29iai0kKENPTkZJR19YODZfQ1lDTE9ORV9USU1FUikJKz0gdGltZXJfY3ljbG9uZS5vCitvYmotJChDT05GSUdfSFBFVF9USU1FUikJKz0gdGltZXJfaHBldC5vCitvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSB0aW1lcl9wbS5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjkwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqCUNvbW1vbiBmdW5jdGlvbnMgdXNlZCBhY3Jvc3MgdGhlIHRpbWVycyBnbyBoZXJlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBkb19mYXN0X2dldHRpbWVvZmZzZXQoKS4KKyAqIFRvbyBtdWNoIDY0LWJpdCBhcml0aG1ldGljIGhlcmUgdG8gZG8gdGhpcyBjbGVhbmx5IGluIEMsIGFuZCBmb3IKKyAqIGFjY3VyYWN5J3Mgc2FrZSB3ZSB3YW50IHRvIGtlZXAgdGhlIG92ZXJoZWFkIG9uIHRoZSBDVEMgc3BlYWtlciAoY2hhbm5lbCAyKQorICogb3V0cHV0IGJ1c3kgbG9vcCBhcyBsb3cgYXMgcG9zc2libGUuIFdlIGF2b2lkIHJlYWRpbmcgdGhlIENUQyByZWdpc3RlcnMKKyAqIGRpcmVjdGx5IGJlY2F1c2Ugb2YgdGhlIGF3a3dhcmQgOC1iaXQgYWNjZXNzIG1lY2hhbmlzbSBvZiB0aGUgODJDNTQKKyAqIGRldmljZS4KKyAqLworCisjZGVmaW5lIENBTElCUkFURV9USU1FCSg1ICogMTAwMDAyMC9IWikKKwordW5zaWduZWQgbG9uZyBfX2luaXQgY2FsaWJyYXRlX3RzYyh2b2lkKQoreworCW1hY2hfcHJlcGFyZV9jb3VudGVyKCk7CisKKwl7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRsb3csIHN0YXJ0aGlnaDsKKwkJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCXVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwkJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwkJbWFjaF9jb3VudHVwKCZjb3VudCk7CisJCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCisJCS8qIEVycm9yOiBFQ1RDTkVWRVJTRVQgKi8KKwkJaWYgKGNvdW50IDw9IDEpCisJCQlnb3RvIGJhZF9jdGM7CisKKwkJLyogNjQtYml0IHN1YnRyYWN0IC0gZ2NjIGp1c3QgbWVzc2VzIHVwIHdpdGggbG9uZyBsb25ncyAqLworCQlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJCSJzYmJsICUzLCUxIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6ImciIChzdGFydGxvdyksICJnIiAoc3RhcnRoaWdoKSwKKwkJCSAiMCIgKGVuZGxvdyksICIxIiAoZW5kaGlnaCkpOworCisJCS8qIEVycm9yOiBFQ1BVVE9PRkFTVCAqLworCQlpZiAoZW5kaGlnaCkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQkvKiBFcnJvcjogRUNQVVRPT1NMT1cgKi8KKwkJaWYgKGVuZGxvdyA8PSBDQUxJQlJBVEVfVElNRSkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQlfX2FzbV9fKCJkaXZsICUyIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6InIiIChlbmRsb3cpLCAiMCIgKDApLCAiMSIgKENBTElCUkFURV9USU1FKSk7CisKKwkJcmV0dXJuIGVuZGxvdzsKKwl9CisKKwkvKgorCSAqIFRoZSBDVEMgd2Fzbid0IHJlbGlhYmxlOiB3ZSBnb3QgYSBoaXQgb24gdGhlIHZlcnkgZmlyc3QgcmVhZCwKKwkgKiBvciB0aGUgQ1BVIHdhcyBzbyBmYXN0L3Nsb3cgdGhhdCB0aGUgcXVvdGllbnQgd291bGRuJ3QgZml0IGluCisJICogMzIgYml0cy4uCisJICovCitiYWRfY3RjOgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKy8qIC0tLS0tLSBDYWxpYnJhdGUgdGhlIFRTQyB1c2luZyBIUEVUIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBnZXR0aW5nIHRoZSBDUFUgZnJlcS4KKyAqIFNlY29uZCBvdXRwdXQgaXMgcGFyYW1ldGVyIDEgKHdoZW4gbm9uIE5VTEwpCisgKiBTZXQgMl4zMiAqICgxIC8gKHRzYyBwZXIgSFBFVCBjbGspKSBmb3IgZGVsYXlfaHBldCgpLgorICogY2FsaWJyYXRlX3RzYygpIGNhbGlicmF0ZXMgdGhlIHByb2Nlc3NvciBUU0MgYnkgY29tcGFyaW5nCisgKiBpdCB0byB0aGUgSFBFVCB0aW1lciBvZiBrbm93biBmcmVxdWVuY3kuCisgKiBUb28gbXVjaCA2NC1iaXQgYXJpdGhtZXRpYyBoZXJlIHRvIGRvIHRoaXMgY2xlYW5seSBpbiBDCisgKi8KKyNkZWZpbmUgQ0FMSUJSQVRFX0NOVF9IUEVUIAkoNSAqIGhwZXRfdGljaykKKyNkZWZpbmUgQ0FMSUJSQVRFX1RJTUVfSFBFVCAJKDUgKiBLRVJORUxfVElDS19VU0VDKQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBjYWxpYnJhdGVfdHNjX2hwZXQodW5zaWduZWQgbG9uZyAqdHNjX2hwZXRfcXVvdGllbnRfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgdHNjX3N0YXJ0bG93LCB0c2Nfc3RhcnRoaWdoOworCXVuc2lnbmVkIGxvbmcgdHNjX2VuZGxvdywgdHNjX2VuZGhpZ2g7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJaHBldF9zdGFydCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlyZHRzYyh0c2Nfc3RhcnRsb3csIHRzY19zdGFydGhpZ2gpOworCWRvIHsKKwkJaHBldF9lbmQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJfSB3aGlsZSAoKGhwZXRfZW5kIC0gaHBldF9zdGFydCkgPCBDQUxJQlJBVEVfQ05UX0hQRVQpOworCXJkdHNjKHRzY19lbmRsb3csIHRzY19lbmRoaWdoKTsKKworCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJInNiYmwgJTMsJTEiCisJCToiPWEiICh0c2NfZW5kbG93KSwgIj1kIiAodHNjX2VuZGhpZ2gpCisJCToiZyIgKHRzY19zdGFydGxvdyksICJnIiAodHNjX3N0YXJ0aGlnaCksCisJCSAiMCIgKHRzY19lbmRsb3cpLCAiMSIgKHRzY19lbmRoaWdoKSk7CisKKwkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwlpZiAodHNjX2VuZGhpZ2gpCisJCWdvdG8gYmFkX2NhbGlicmF0aW9uOworCisJLyogRXJyb3I6IEVDUFVUT09TTE9XICovCisJaWYgKHRzY19lbmRsb3cgPD0gQ0FMSUJSQVRFX1RJTUVfSFBFVCkKKwkJZ290byBiYWRfY2FsaWJyYXRpb247CisKKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLCBDQUxJQlJBVEVfVElNRV9IUEVUKTsKKwlpZiAocmVtYWluID4gKHRzY19lbmRsb3cgPj4gMSkpCisJCXJlc3VsdCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCisKKwlpZiAodHNjX2hwZXRfcXVvdGllbnRfcHRyKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX2hwZXRfcXVvdGllbnQ7CisKKwkJQVNNX0RJVjY0X1JFRyh0c2NfaHBldF9xdW90aWVudCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLAorCQkJQ0FMSUJSQVRFX0NOVF9IUEVUKTsKKwkJaWYgKHJlbWFpbiA+ICh0c2NfZW5kbG93ID4+IDEpKQorCQkJdHNjX2hwZXRfcXVvdGllbnQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCQkqdHNjX2hwZXRfcXVvdGllbnRfcHRyID0gdHNjX2hwZXRfcXVvdGllbnQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK2JhZF9jYWxpYnJhdGlvbjoKKwkvKgorCSAqIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBjYWxjdWxhdGUgY3B1X2toeiAqLwordm9pZCBfX2luaXQgaW5pdF9jcHVfa2h6KHZvaWQpCit7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzYygpOworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQkvKiByZXBvcnQgQ1BVIGNsb2NrIHJhdGUgaW4gSHouCisJCQkgKiBUaGUgZm9ybXVsYSBpcyAoMTBeNiAqIDJeMzIpIC8gKDJeMzIgKiAxIC8gKGNsb2Nrcy91cykpID0KKwkJCSAqIGNsb2NrL3NlY29uZC4gT3VyIHByZWNpc2lvbiBpcyBhYm91dCAxMDAgcHBtLgorCQkJICovCisJCQl7CXVuc2lnbmVkIGxvbmcgZWF4PTAsIGVkeD0xMDAwOworCQkJCV9fYXNtX18oImRpdmwgJTIiCisJCSAgICAgICAJCToiPWEiIChjcHVfa2h6KSwgIj1kIiAoZWR4KQorICAgICAgICAJICAgICAgIAkJOiJyIiAodHNjX3F1b3RpZW50KSwKKwkgICAgICAgICAgICAgICAgCSIwIiAoZWF4KSwgIjEiIChlZHgpKTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwgY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDZhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorLyoKKyAqIEhQRVQgbWVtb3J5IHJlYWQgaXMgc2xvd2VyIHRoYW4gdHNjIHJlYWRzLCBidXQgaXMgbW9yZSBkZXBlbmRhYmxlIGFzIGl0CisgKiBhbHdheXMgcnVucyBhdCBjb25zdGFudCBmcmVxdWVuY3kgYW5kIHJlZHVjZXMgY29tcGxleGl0eSBkdWUgdG8KKyAqIGNwdWZyZXEuIFNvLCB3ZSBwcmVmZXIgSFBFVCB0aW1lciB0byB0c2MgYmFzZWQgb25lLiBBbHNvLCB3ZSBjYW5ub3QgdXNlCisgKiB0aW1lcl9waXQgd2hlbiBIUEVUIGlzIGFjdGl2ZS4gU28sIHdlIGRlZmF1bHQgdG8gdGltZXJfdHNjLgorICovCisjZW5kaWYKKy8qIGxpc3Qgb2YgdGltZXJzLCBvcmRlcmVkIGJ5IHByZWZlcmVuY2UsIE5VTEwgdGVybWluYXRlZCAqLworc3RhdGljIHN0cnVjdCBpbml0X3RpbWVyX29wdHMqIF9faW5pdGRhdGEgdGltZXJzW10gPSB7CisjaWZkZWYgQ09ORklHX1g4Nl9DWUNMT05FX1RJTUVSCisJJnRpbWVyX2N5Y2xvbmVfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJJnRpbWVyX2hwZXRfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkmdGltZXJfcG10bXJfaW5pdCwKKyNlbmRpZgorCSZ0aW1lcl90c2NfaW5pdCwKKwkmdGltZXJfcGl0X2luaXQsCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyIGNsb2NrX292ZXJyaWRlWzEwXSBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19zZXR1cChjaGFyKiBzdHIpCit7CisJaWYgKHN0cikKKwkJc3RybGNweShjbG9ja19vdmVycmlkZSwgc3RyLCBzaXplb2YoY2xvY2tfb3ZlcnJpZGUpKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNsb2NrPSIsIGNsb2NrX3NldHVwKTsKKworCisvKiBUaGUgY2hvc2VuIHRpbWVzb3VyY2UgaGFzIGJlZW4gZm91bmQgdG8gYmUgYmFkLgorICogRmFsbCBiYWNrIHRvIGEga25vd24gZ29vZCB0aW1lc291cmNlICh0aGUgUElUKQorICovCit2b2lkIGNsb2NrX2ZhbGxiYWNrKHZvaWQpCit7CisJY3VyX3RpbWVyID0gJnRpbWVyX3BpdDsKK30KKworLyogaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB0aW1lcnMsIHJldHVybmluZyB0aGUgZmlyc3QgCisgKiBvbmUgdGhhdCBpbml0aWFsaXplcyBzdWNjZXNzZnVsbHkuCisgKi8KK3N0cnVjdCB0aW1lcl9vcHRzKiBfX2luaXQgc2VsZWN0X3RpbWVyKHZvaWQpCit7CisJaW50IGkgPSAwOworCQorCS8qIGZpbmQgbW9zdCBwcmVmZXJyZWQgd29ya2luZyB0aW1lciAqLworCXdoaWxlICh0aW1lcnNbaV0pIHsKKwkJaWYgKHRpbWVyc1tpXS0+aW5pdCkKKwkJCWlmICh0aW1lcnNbaV0tPmluaXQoY2xvY2tfb3ZlcnJpZGUpID09IDApCisJCQkJcmV0dXJuIHRpbWVyc1tpXS0+b3B0czsKKwkJKytpOworCX0KKwkJCisJcGFuaWMoInNlbGVjdF90aW1lcjogQ2Fubm90IGZpbmQgYSBzdWl0YWJsZSB0aW1lclxuIik7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMTIwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoJQ3ljbG9uZS10aW1lcjogCisgKgkJVGhpcyBjb2RlIGltcGxlbWVudHMgdGltZXJfb3BzIGZvciB0aGUgY3ljbG9uZSBjb3VudGVyIGZvdW5kCisgKgkJb24gSUJNIHg0NDAsIHgzNjAsIGFuZCBvdGhlciBTdW1taXQgYmFzZWQgc3lzdGVtcy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgSUJNLCBKb2huIFN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworLyogTnVtYmVyIG9mIHVzZWNzIHRoYXQgdGhlIGxhc3QgaW50ZXJydXB0IHdhcyBkZWxheWVkICovCitzdGF0aWMgaW50IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisjZGVmaW5lIENZQ0xPTkVfQ0JBUl9BRERSIDB4RkVCMDBDRDAKKyNkZWZpbmUgQ1lDTE9ORV9QTUNDX09GRlNFVCAweDUxQTAKKyNkZWZpbmUgQ1lDTE9ORV9NUE1DX09GRlNFVCAweDUxRDAKKyNkZWZpbmUgQ1lDTE9ORV9NUENTX09GRlNFVCAweDUxQTgKKyNkZWZpbmUgQ1lDTE9ORV9USU1FUl9GUkVRIDEwMDAwMDAwMAorI2RlZmluZSBDWUNMT05FX1RJTUVSX01BU0sgKCgodTY0KTE8PDQwKS0xKSAvKiA0MCBiaXQgbWFzayAqLworaW50IHVzZV9jeWNsb25lID0gMDsKKworc3RhdGljIHUzMiogdm9sYXRpbGUgY3ljbG9uZV90aW1lcjsJLyogQ3ljbG9uZSBNUE1DMCByZWdpc3RlciAqLworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfbG93Oworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfaGlnaDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogaGVscGVyIG1hY3JvIHRvIGF0b21pY2FsbHkgcmVhZCBib3RoIGN5Y2xvbmUgY291bnRlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgcmVhZF9jeWNsb25lX2NvdW50ZXIobG93LGhpZ2gpIFwKKwlkb3sgXAorCQloaWdoID0gY3ljbG9uZV90aW1lclsxXTsgbG93ID0gY3ljbG9uZV90aW1lclswXTsgXAorCX0gd2hpbGUgKGhpZ2ggIT0gY3ljbG9uZV90aW1lclsxXSk7CisKKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCwgZGVsYXk7CisJdW5zaWduZWQgbG9uZyBkZWx0YSA9IGxhc3RfY3ljbG9uZV9sb3c7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldCwgbGFzdF9vZmZzZXQ7CisKKwl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7CisJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJCisJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwlyZWFkX2N5Y2xvbmVfY291bnRlcihsYXN0X2N5Y2xvbmVfbG93LGxhc3RfY3ljbG9uZV9oaWdoKTsKKworCS8qIHJlYWQgdmFsdWVzIGZvciBkZWxheV9hdF9sYXN0X2ludGVycnVwdCAqLworCW91dGJfcCgweDAwLCAweDQzKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKDB4NDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKDB4NDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisKKwkvKiBsb3N0IHRpY2sgY29tcGVuc2F0aW9uICovCisJZGVsdGEgPSBsYXN0X2N5Y2xvbmVfbG93IC0gZGVsdGE7CQorCWRlbHRhIC89IChDWUNMT05FX1RJTUVSX0ZSRVEvMTAwMDAwMCk7CisJZGVsdGEgKz0gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisJbG9zdCA9IGRlbHRhLygxMDAwMDAwL0haKTsKKwlkZWxheSA9IGRlbHRhJSgxMDAwMDAwL0haKTsKKwlpZiAobG9zdCA+PSAyKQorCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKwkKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpICYgQ1lDTE9ORV9USU1FUl9NQVNLOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworCisJLyogY2FsY3VsYXRlIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ICovCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkIAorCSAqIGJldHdlZW4gY3ljbG9uZSBhbmQgcGl0IHJlYWRzIChhcyBub3RlZCB3aGVuIAorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXUzMiBvZmZzZXQ7CisKKwlpZighY3ljbG9uZV90aW1lcikKKwkJcmV0dXJuIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisJLyogUmVhZCB0aGUgY3ljbG9uZSB0aW1lciAqLworCW9mZnNldCA9IGN5Y2xvbmVfdGltZXJbMF07CisKKwkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAqLworCW9mZnNldCA9IG9mZnNldCAtIGxhc3RfY3ljbG9uZV9sb3c7CisKKwkvKiBjb252ZXJ0IGN5Y2xvbmUgdGlja3MgdG8gbWljcm9zZWNvbmRzICovCQorCS8qIFhYWCBzbG93LCBjYW4gd2Ugc3BlZWQgdGhpcyB1cD8gKi8KKwlvZmZzZXQgPSBvZmZzZXQvKENZQ0xPTkVfVElNRVJfRlJFUS8xMDAwMDAwKTsKKworCS8qIG91ciBhZGp1c3RlZCB0aW1lIG9mZnNldCBpbiBtaWNyb3NlY29uZHMgKi8KKwlyZXR1cm4gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUodm9pZCkKK3sKKwl1MzIgbm93X2xvdywgbm93X2hpZ2g7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9jeWNsb25lX2hpZ2g8PDMyKXxsYXN0X2N5Y2xvbmVfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisKKwkvKiBSZWFkIHRoZSBjeWNsb25lIGNvdW50ZXIgKi8KKwlyZWFkX2N5Y2xvbmVfY291bnRlcihub3dfbG93LG5vd19oaWdoKTsKKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKW5vd19oaWdoPDwzMil8bm93X2xvdzsKKworCS8qIGNvbnZlcnQgdG8gbmFub3NlY29uZHMgKi8KKwlyZXQgPSBiYXNlICsgKCh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSZDWUNMT05FX1RJTUVSX01BU0spOworCXJldHVybiByZXQgKiAoMTAwMDAwMDAwMCAvIENZQ0xPTkVfVElNRVJfRlJFUSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3ljbG9uZShjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIqIHJlZzsJCisJdTMyIGJhc2U7CQkvKiBzYXZlZCBjeWNsb25lIGJhc2UgYWRkcmVzcyAqLworCXUzMiBwYWdlYWRkcjsJLyogcGFnZSB0aGF0IGNvbnRhaW5zIGN5Y2xvbmVfdGltZXIgcmVnaXN0ZXIgKi8KKwl1MzIgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gcGFnZWFkZHIgdG8gY3ljbG9uZV90aW1lciByZWdpc3RlciAqLworCWludCBpOworCQorCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsImN5Y2xvbmUiLDcpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKm1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHN1bW1pdCBib3gqLworCWlmKCF1c2VfY3ljbG9uZSkgcmV0dXJuIC1FTk9ERVY7IAorCQorCXByaW50ayhLRVJOX0lORk8gIlN1bW1pdCBjaGlwc2V0OiBTdGFydGluZyBDeWNsb25lIENvdW50ZXIuXG4iKTsKKworCS8qIGZpbmQgYmFzZSBhZGRyZXNzICovCisJcGFnZWFkZHIgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJYmFzZSA9ICpyZWc7CQorCWlmKCFiYXNlKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJLyogc2V0dXAgUE1DQyAqLworCXBhZ2VhZGRyID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSZQQUdFX01BU0s7CisJb2Zmc2V0ID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSYoflBBR0VfTUFTSyk7CisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9DWUNMT05FX1RJTUVSLCBwYWdlYWRkcik7CisJcmVnID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIXJlZyl7CisJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIFBNQ0MgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJlZ1swXSA9IDB4MDAwMDAwMDE7CisKKwkvKiBzZXR1cCBNUENTICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBDUyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmVnWzBdID0gMHgwMDAwMDAwMTsKKworCS8qIG1hcCBpbiBjeWNsb25lX3RpbWVyICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwljeWNsb25lX3RpbWVyID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIWN5Y2xvbmVfdGltZXIpeworCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUE1DIHJlZ2lzdGVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qcXVpY2sgdGVzdCB0byBtYWtlIHN1cmUgaXRzIHRpY2tpbmcqLworCWZvcihpPTA7IGk8MzsgaSsrKXsKKwkJdTMyIG9sZCA9IGN5Y2xvbmVfdGltZXJbMF07CisJCWludCBzdGFsbCA9IDEwMDsKKwkJd2hpbGUoc3RhbGwtLSkgYmFycmllcigpOworCQlpZihjeWNsb25lX3RpbWVyWzBdID09IG9sZCl7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VudGVyIG5vdCBjb3VudGluZyEgRElTQUJMRURcbiIpOworCQkJY3ljbG9uZV90aW1lciA9IDA7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWluaXRfY3B1X2toeigpOworCisJLyogRXZlcnl0aGluZyBsb29rcyBnb29kISAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRlbGF5X2N5Y2xvbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCWlmKCFjeWNsb25lX3RpbWVyKQorCQlyZXR1cm47CisJYmNsb2NrID0gY3ljbG9uZV90aW1lclswXTsKKwlkbyB7CisJCXJlcF9ub3AoKTsKKwkJbm93ID0gY3ljbG9uZV90aW1lclswXTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjeWNsb25lIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfY3ljbG9uZSA9IHsKKwkubmFtZSA9ICJjeWNsb25lIiwKKwkubWFya19vZmZzZXQgPSBtYXJrX29mZnNldF9jeWNsb25lLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfY3ljbG9uZSwKKwkubW9ub3RvbmljX2Nsb2NrID0JbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUsCisJLmRlbGF5ID0gZGVsYXlfY3ljbG9uZSwKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl9jeWNsb25lX2luaXQgPSB7CisJLmluaXQgPSBpbml0X2N5Y2xvbmUsCisJLm9wdHMgPSAmdGltZXJfY3ljbG9uZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMTM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIFRoaXMgY29kZSBsYXJnZWx5IG1vdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMuCisgKiBTZWUgY29tbWVudHMgdGhlcmUgZm9yIHByb3BlciBjcmVkaXRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKyNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF90c2NfaGlnaDsgCS8qIG1zYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKK3N0YXRpYyBzZXFsb2NrX3QgbW9ub3RvbmljX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOworCisvKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKKyAqICBiYXNpYyBlcXVhdGlvbjoKKyAqCQlucyA9IGN5Y2xlcyAvIChmcmVxIC8gbnNfcGVyX3NlYykKKyAqCQlucyA9IGN5Y2xlcyAqIChuc19wZXJfc2VjIC8gZnJlcSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF45IC8gKGNwdV9taHogKiAxMF42KSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zIC8gY3B1X21oeikKKyAqCisgKglUaGVuIHdlIHVzZSBzY2FsaW5nIG1hdGggKHN1Z2dlc3RlZCBieSBnZW9yZ2VAbXZpc3RhLmNvbSkgdG8gZ2V0OgorICoJCW5zID0gY3ljbGVzICogKDEwXjMgKiBTQyAvIGNwdV9taHopIC8gU0MKKyAqCQlucyA9IGN5Y2xlcyAqIGN5YzJuc19zY2FsZSAvIFNDCisgKgorICoJQW5kIHNpbmNlIFNDIGlzIGEgY29uc3RhbnQgcG93ZXIgb2YgdHdvLCB3ZSBjYW4gY29udmVydCB0aGUgZGl2CisgKiAgaW50byBhIHNoaWZ0LgorICoJCQktam9obnN0dWxAdXMuaWJtLmNvbSAibWF0aCBpcyBoYXJkLCBsZXRzIGdvIHNob3BwaW5nISIKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3ljMm5zX3NjYWxlOworI2RlZmluZSBDWUMyTlNfU0NBTEVfRkFDVE9SIDEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfbWh6KQoreworCWN5YzJuc19zY2FsZSA9ICgxMDAwIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpL2NwdV9taHo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCit7CisJcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IENZQzJOU19TQ0FMRV9GQUNUT1I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBiYXNlOworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIFRpbWUgU3RhbXAgQ291bnRlciAqLworCXJkdHNjbGwodGhpc19vZmZzZXQpOworCisJLyogcmV0dXJuIHRoZSB2YWx1ZSBpbiBucyAqLworCXJldHVybiBiYXNlICsgY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfaHBldCh2b2lkKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZWF4LCBlZHg7CisKKwllYXggPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZWF4IC09IGhwZXRfbGFzdDsJLyogaHBldCBkZWx0YSAqLworCisJLyoKKyAgICAgICAgICogVGltZSBvZmZzZXQgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciBIUEVUIGNsb2NrICkKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggdXNlY3MgcGVyIHRpY2sgLyBIUEVUIGNsb2NrcyBwZXIgdGljaykKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggaHBldF91c2VjX3F1b3RpZW50ICkgLyAoMl4zMikKKwkgKgorCSAqIFdoZXJlLAorCSAqIGhwZXRfdXNlY19xdW90aWVudCA9ICgyXjMyICogdXNlY3MgcGVyIHRpY2spL0hQRVQgY2xvY2tzIHBlciB0aWNrCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgc29tZSBjeWNsZXMgaW4gY3JpdGljYWwgcGF0aC4KKyAgICAgICAgICovCisJQVNNX01VTDY0X1JFRyhlYXgsIGVkeCwgaHBldF91c2VjX3F1b3RpZW50LCBlYXgpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBlZHg7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOworCisJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7CisJaWYgKHVubGlrZWx5KCgob2Zmc2V0IC0gaHBldF9sYXN0KSA+IGhwZXRfdGljaykgJiYgKGhwZXRfbGFzdCAhPSAwKSkpIHsKKwkJaW50IGxvc3RfdGlja3MgPSAob2Zmc2V0IC0gaHBldF9sYXN0KSAvIGhwZXRfdGljazsKKwkJamlmZmllc182NCArPSBsb3N0X3RpY2tzOworCX0KKwlocGV0X2xhc3QgPSBvZmZzZXQ7CisKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCW1vbm90b25pY19iYXNlICs9IGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBkZWxheV9ocGV0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIGVheDsKKworCS8qIGxvb3BzIGlzIHRoZSBudW1iZXIgb2YgY3B1IGN5Y2xlcy4gQ29udmVydCBpdCB0byBocGV0IGNsb2NrcyAqLworCUFTTV9NVUw2NF9SRUcoZWF4LCBsb29wcywgdHNjX2hwZXRfcXVvdGllbnQsIGxvb3BzKTsKKworCWhwZXRfc3RhcnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZG8geworCQlyZXBfbm9wKCk7CisJCWhwZXRfZW5kID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCX0gd2hpbGUgKChocGV0X2VuZCAtIGhwZXRfc3RhcnQpIDwgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldChjaGFyKiBvdmVycmlkZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwiaHBldCIsNCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGdldHRpbWVvZmRheVxuIik7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzY19ocGV0KCZ0c2NfaHBldF9xdW90aWVudCk7CisJCWlmICh0c2NfcXVvdGllbnQpIHsKKwkJCS8qIHJlcG9ydCBDUFUgY2xvY2sgcmF0ZSBpbiBIei4KKwkJCSAqIFRoZSBmb3JtdWxhIGlzICgxMF42ICogMl4zMikgLyAoMl4zMiAqIDEgLyAoY2xvY2tzL3VzKSkgPQorCQkJICogY2xvY2svc2Vjb25kLiBPdXIgcHJlY2lzaW9uIGlzIGFib3V0IDEwMCBwcG0uCisJCQkgKi8KKwkJCXsJdW5zaWduZWQgbG9uZyBlYXg9MCwgZWR4PTEwMDA7CisJCQkJQVNNX0RJVjY0X1JFRyhjcHVfa2h6LCBlZHgsIHRzY19xdW90aWVudCwKKwkJCQkJCWVheCwgZWR4KTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwKKwkJCQkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJCXNldF9jeWMybnNfc2NhbGUoY3B1X2toei8xMDAwKTsKKwkJfQorCX0KKworCS8qCisJICogTWF0aCB0byBjYWxjdWxhdGUgaHBldCB0byB1c2VjIG11bHRpcGxpZXIKKwkgKiBMb29rIGZvciB0aGUgY29tbWVudHMgYXQgZ2V0X29mZnNldF9ocGV0KCkKKwkgKi8KKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssIDAsIEtFUk5FTF9USUNLX1VTRUMpOworCWlmIChyZW1haW4gPiAoaHBldF90aWNrID4+IDEpKQorCQlyZXN1bHQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCWhwZXRfdXNlY19xdW90aWVudCA9IHJlc3VsdDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworCS5uYW1lID0gCQkiaHBldCIsCisJLm1hcmtfb2Zmc2V0ID0JCW1hcmtfb2Zmc2V0X2hwZXQsCisJLmdldF9vZmZzZXQgPQkJZ2V0X29mZnNldF9ocGV0LAorCS5tb25vdG9uaWNfY2xvY2sgPQltb25vdG9uaWNfY2xvY2tfaHBldCwKKwkuZGVsYXkgPSAJCWRlbGF5X2hwZXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfaHBldF9pbml0ID0geworCS5pbml0ID0JaW5pdF9ocGV0LAorCS5vcHRzID0gJnRpbWVyX2hwZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTJmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ub25lLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfbm9uZSh2b2lkKQoreworCS8qIG5vdGhpbmcgbmVlZGVkICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfbm9uZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19ub25lKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGF5X25vbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlpbnQgZDA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJcdGptcCAxZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIxOlx0am1wIDJmXG4iCisJCSIuYWxpZ24gMTZcbiIKKwkJIjI6XHRkZWNsICUwXG5cdGpucyAyYiIKKwkJOiI9JmEiIChkMCkKKwkJOiIwIiAobG9vcHMpKTsKK30KKworLyogbm9uZSB0aW1lcl9vcHRzIHN0cnVjdCAqLworc3RydWN0IHRpbWVyX29wdHMgdGltZXJfbm9uZSA9IHsKKwkubmFtZSA9IAkibm9uZSIsCisJLm1hcmtfb2Zmc2V0ID0JbWFya19vZmZzZXRfbm9uZSwgCisJLmdldF9vZmZzZXQgPQlnZXRfb2Zmc2V0X25vbmUsCisJLm1vbm90b25pY19jbG9jayA9CW1vbm90b25pY19jbG9ja19ub25lLAorCS5kZWxheSA9IGRlbGF5X25vbmUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdkNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworI2luY2x1ZGUgImRvX3RpbWVyLmgiCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworc3RhdGljIGludCBjb3VudF9wOyAvKiBjb3VudGVyIGluIGdldF9vZmZzZXRfcGl0KCkgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9waXQoY2hhciogb3ZlcnJpZGUpCit7CisgCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisgCWlmIChvdmVycmlkZVswXSAmJiBzdHJuY21wKG92ZXJyaWRlLCJwaXQiLDMpKQorIAkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIFBJVFxuIik7CisgCisJY291bnRfcCA9IExBVENIOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXJrX29mZnNldF9waXQodm9pZCkKK3sKKwkvKiBub3RoaW5nIG5lZWRlZCAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19waXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcGl0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJaW50IGQwOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiXHRqbXAgMWZcbiIKKwkJIi5hbGlnbiAxNlxuIgorCQkiMTpcdGptcCAyZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIyOlx0ZGVjbCAlMFxuXHRqbnMgMmIiCisJCToiPSZhIiAoZDApCisJCToiMCIgKGxvb3BzKSk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHh0aW1lX2xvY2sgaGVsZC4KKyAqIEl0IHdhcyBpbnNwaXJlZCBieSBTdGV2ZSBNY0Nhbm5lJ3MgbWljcm90aW1lLWkzODYgZm9yIEJTRC4gIC0tIGpycworICogCisgKiBIb3dldmVyLCB0aGUgcGMtYXVkaW8gc3BlYWtlciBkcml2ZXIgY2hhbmdlcyB0aGUgZGl2aXNvciBzbyB0aGF0CisgKiBpdCBnZXRzIGludGVycnVwdGVkIHJhdGhlciBtb3JlIG9mdGVuIC0gaXQgbG9hZHMgNjQgaW50byB0aGUKKyAqIGNvdW50ZXIgcmF0aGVyIHRoYW4gMTE5MzIhIFRoaXMgaGFzIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgKiBkb19nZXR0aW1lb2Zmc2V0KCkgLS0gaXQgc3RvcHMgd29ya2luZyEgV2hhdCBpcyBhbHNvIG5vdAorICogZ29vZCBpcyB0aGF0IHRoZSBpbnRlcnZhbCB0aGF0IG91ciB0aW1lciBmdW5jdGlvbiBnZXRzIGNhbGxlZAorICogaXMgbm8gbG9uZ2VyIDEwLjAwMDIgbXMsIGJ1dCA5Ljk3NjcgbXMuIFRvIGdldCBhcm91bmQgdGhpcworICogd291bGQgcmVxdWlyZSB1c2luZyBhIGRpZmZlcmVudCB0aW1pbmcgc291cmNlLiBNYXliZSBzb21lb25lCisgKiBjb3VsZCB1c2UgdGhlIFJUQyAtIEkga25vdyB0aGF0IHRoaXMgY2FuIGludGVycnVwdCBhdCBmcmVxdWVuY2llcworICogcmFuZ2luZyBmcm9tIDgxOTJIeiB0byAySHouIElmIEkgaGFkIHRoZSBlbmVyZ3ksIEknZCBzb21laG93IGZpeAorICogaXQgc28gdGhhdCBhdCBzdGFydHVwLCB0aGUgdGltZXIgY29kZSBpbiBzY2hlZC5jIHdvdWxkIHNlbGVjdAorICogdXNpbmcgZWl0aGVyIHRoZSBSVEMgb3IgdGhlIDgyNTMgdGltZXIuIFRoZSBkZWNpc2lvbiB3b3VsZCBiZQorICogYmFzZWQgb24gd2hldGhlciB0aGVyZSB3YXMgYW55IG90aGVyIGRldmljZSBhcm91bmQgdGhhdCBuZWVkZWQKKyAqIHRvIHRyYW1wbGUgb24gdGhlIDgyNTMuIEknZCBzZXQgdXAgdGhlIFJUQyB0byBpbnRlcnJ1cHQgYXQgMTAyNCBIeiwKKyAqIGFuZCB0aGVuIGRvIHNvbWUgamlnZ2VyeSB0byBoYXZlIGEgdmVyc2lvbiBvZiBkb190aW1lciB0aGF0IAorICogYWR2YW5jZWQgdGhlIGNsb2NrIGJ5IDEvMTAyNCBzLiBFdmVyeSB0aW1lIHRoYXQgcmVhY2hlZCBvdmVyIDEvMTAwCisgKiBvZiBhIHNlY29uZCwgdGhlbiBkbyBhbGwgdGhlIG9sZCBjb2RlLiBJZiB0aGUgdGltZSB3YXMga2VwdCBjb3JyZWN0CisgKiB0aGVuIGRvX2dldHRpbWVvZmZzZXQgY291bGQganVzdCByZXR1cm4gMCAtIHRoZXJlIGlzIG5vIGxvdyBvcmRlcgorICogZGl2aWRlciB0aGF0IGNhbiBiZSBhY2Nlc3NlZC4KKyAqCisgKiBJZGVhbGx5LCB5b3Ugd291bGQgYmUgYWJsZSB0byB1c2UgdGhlIFJUQyBmb3IgdGhlIHNwZWFrZXIgZHJpdmVyLAorICogYnV0IGl0IGFwcGVhcnMgdGhhdCB0aGUgc3BlYWtlciBkcml2ZXIgcmVhbGx5IG5lZWRzIGludGVycnVwdCBtb3JlCisgKiBvZnRlbiB0aGFuIGV2ZXJ5IDEyMCB1cyBvciBzby4KKyAqCisgKiBBbnl3YXksIHRoaXMgbmVlZHMgbW9yZSB0aG91Z2h0Li4uLgkJcGpzZyAoMTk5My0wOC0yOCkKKyAqIAorICogSWYgeW91IGFyZSByZWFsbHkgdGhhdCBpbnRlcmVzdGVkLCB5b3Ugc2hvdWxkIGJlIHJlYWRpbmcKKyAqIGNvbXAucHJvdG9jb2xzLnRpbWUubnRwIQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcGl0KHZvaWQpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKKworCS8qCisJICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSB4dGltZV9sb2NrLiAKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJLyogdGltZXIgY291bnQgbWF5IHVuZGVyZmxvdyByaWdodCBoZXJlICovCisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKworCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKworCS8qCisJICogV2UgZG8gdGhpcyBndWFyYW50ZWVkIGRvdWJsZSBtZW1vcnkgYWNjZXNzIGluc3RlYWQgb2YgYSBfcCAKKwkgKiBwb3N0Zml4IGluIHRoZSBwcmV2aW91cyBwb3J0IGFjY2Vzcy4gV2hlZWUsIGhhY2thZHkgaGFjaworCSAqLworIAlqaWZmaWVzX3QgPSBqaWZmaWVzOworCisJY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKKwkKKyAgICAgICAgLyogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMSAqLworICAgICAgICBpZiAoY291bnQgPiBMQVRDSCkgeworICAgICAgICAgICAgICAgIG91dGJfcCgweDM0LCBQSVRfTU9ERSk7CisgICAgICAgICAgICAgICAgb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisgICAgICAgICAgICAgICAgb3V0YihMQVRDSCA+PiA4LCBQSVRfQ0gwKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IExBVENIIC0gMTsKKyAgICAgICAgfQorCQorCS8qCisJICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCisJICogdGhlcmUgYXJlIHR3byBraW5kcyBvZiBwcm9ibGVtcyB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgorCSAqICAxLiB0aGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzCisJICogIDIuIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB0aGUgdGltZXIsIG5vdCBnaXZpbmcgdXMgY29udGludW91cyB0aW1lLAorCSAqICAgICB0aGUgY291bnRlciBkb2VzIHNtYWxsICJqdW1wcyIgdXB3YXJkcyBvbiBzb21lIFBlbnRpdW0gc3lzdGVtcywKKwkgKiAgICAgKHNlZSBjJ3QgOTUvMTAgcGFnZSAzMzUgZm9yIE5lcHR1biBidWcuKQorCSAqLworCisJaWYoIGppZmZpZXNfdCA9PSBqaWZmaWVzX3AgKSB7CisJCWlmKCBjb3VudCA+IGNvdW50X3AgKSB7CisJCQkvKiB0aGUgbnV0Y2FzZSAqLworCQkJY291bnQgPSBkb190aW1lcl9vdmVyZmxvdyhjb3VudCk7CisJCX0KKwl9IGVsc2UKKwkJamlmZmllc19wID0gamlmZmllc190OworCisJY291bnRfcCA9IGNvdW50OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWNvdW50ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCXJldHVybiBjb3VudDsKK30KKworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3BpdCA9IHsKKwkubmFtZSA9ICJwaXQiLAorCS5tYXJrX29mZnNldCA9IG1hcmtfb2Zmc2V0X3BpdCwgCisJLmdldF9vZmZzZXQgPSBnZXRfb2Zmc2V0X3BpdCwKKwkubW9ub3RvbmljX2Nsb2NrID0gbW9ub3RvbmljX2Nsb2NrX3BpdCwKKwkuZGVsYXkgPSBkZWxheV9waXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcGl0X2luaXQgPSB7CisJLmluaXQgPSBpbml0X3BpdCwgCisJLm9wdHMgPSAmdGltZXJfcGl0LAorfTsKKwordm9pZCBzZXR1cF9waXRfdGltZXIodm9pZCkKK3sKKwlleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJdWRlbGF5KDEwKTsKKwlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCXVkZWxheSgxMCk7CisJb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzZXR1cF9waXRfdGltZXIoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgidGltZXJfcGl0IiksCisJLnJlc3VtZQk9IHRpbWVyX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9zeXNmcyh2b2lkKQoreworCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKGluaXRfdGltZXJfc3lzZnMpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9wbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdmMjIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIChDKSBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+IDIwMDMKKyAqCisgKiBEcml2ZXIgdG8gdXNlIHRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIChQTVRNUikgYXZhaWxhYmxlIGluIHNvbWUKKyAqIHNvdXRoYnJpZGdlcyBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQmFzZWQgb24gcGFydHMgb2YgbGludXgvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYywgdGltZXJfcGl0LmMsCisgKiB0aW1lcl9ocGV0LmMsIGFuZCBvbiBBcmphbiB2YW4gZGUgVmVuJ3MgaW1wbGVtZW50YXRpb24gZm9yIDIuNC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisjZGVmaW5lIFBNVE1SX0VYUEVDVEVEX1JBVEUgXAorICAoKENBTElCUkFURV9MQVRDSCAqIChQTVRNUl9USUNLU19QRVJfU0VDID4+IDEwKSkgLyAoQ0xPQ0tfVElDS19SQVRFPj4xMCkpCisKKworLyogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgorICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCisgKiBpbiBhcmNoL2kzODYvYWNwaS9ib290LmMgKi8KK3UzMiBwbXRtcl9pb3BvcnQgPSAwOworCisKKy8qIHZhbHVlIG9mIHRoZSBQb3dlciB0aW1lciBhdCBsYXN0IHRpbWVyIGludGVycnVwdCAqLworc3RhdGljIHUzMiBvZmZzZXRfdGljazsKK3N0YXRpYyB1MzIgb2Zmc2V0X2RlbGF5OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19iYXNlOworc3RhdGljIHNlcWxvY2tfdCBtb25vdG9uaWNfbG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQ7CisKKyNkZWZpbmUgQUNQSV9QTV9NQVNLIDB4RkZGRkZGIC8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKworLypoZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IHJlYWQgYWNwaSBwbSB0aW1lc291cmNlKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKK3sKKwl1MzIgdjE9MCx2Mj0wLHYzPTA7CisJLyogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCBiZWNhdXNlIG9mIHZhcmlvdXMgYnJva2VuCisJICogY2hpcHNldHMgKElDSDQsIFBJSVg0IGFuZCBQSUlYNEUpIHdoZXJlIHRoZSBBQ1BJIFBNIHRpbWUKKwkgKiBzb3VyY2UgaXMgbm90IGxhdGNoZWQsIHNvIHlvdSBtdXN0IHJlYWQgaXQgbXVsdGlwbGUKKwkgKiB0aW1lcyB0byBpbnN1cmUgYSBzYWZlIHZhbHVlIGlzIHJlYWQuCisJICovCisJZG8geworCQl2MSA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MiA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MyA9IGlubChwbXRtcl9pb3BvcnQpOworCX0gd2hpbGUgKCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCQl8fCAodjMgPiB2MSAmJiB2MyA8IHYyKSk7CisKKwkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLworCXJldHVybiB2MiAmIEFDUElfUE1fTUFTSzsKK30KKworCisvKgorICogU29tZSBib2FyZHMgaGF2ZSB0aGUgUE1UTVIgcnVubmluZyB3YXkgdG9vIGZhc3QuIFdlIGNoZWNrCisgKiB0aGUgUE1UTVIgcmF0ZSBhZ2FpbnN0IFBJVCBjaGFubmVsIDIgdG8gY2F0Y2ggdGhlc2UgY2FzZXMuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X3BtdG1yX3JhdGUodm9pZCkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgbG9uZyBjb3VudCwgZGVsdGE7CisKKwltYWNoX3ByZXBhcmVfY291bnRlcigpOworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwltYWNoX2NvdW50dXAoJmNvdW50KTsKKwl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJZGVsdGEgPSAodmFsdWUyIC0gdmFsdWUxKSAmIEFDUElfUE1fTUFTSzsKKworCS8qIENoZWNrIHRoYXQgdGhlIFBNVE1SIGRlbHRhIGlzIHdpdGhpbiA1JSBvZiB3aGF0IHdlIGV4cGVjdCAqLworCWlmIChkZWx0YSA8IChQTVRNUl9FWFBFQ1RFRF9SQVRFICogMTkpIC8gMjAgfHwKKwkgICAgZGVsdGEgPiAoUE1UTVJfRVhQRUNURURfUkFURSAqIDIxKSAvIDIwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIHJ1bm5pbmcgYXQgaW52YWxpZCByYXRlOiAlbHUlJSBvZiBub3JtYWwgLSBhYm9ydGluZy5cbiIsIDEwMFVMICogZGVsdGEgLyBQTVRNUl9FWFBFQ1RFRF9SQVRFKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9wbXRtcihjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgaW50IGk7CisKKyAJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsInBtdG1yIiw1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXBtdG1yX2lvcG9ydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiB3ZSB1c2UgdGhlIFRTQyBmb3IgZGVsYXlfcG10bXIsIHNvIG1ha2Ugc3VyZSBpdCBleGlzdHMgKi8KKwlpZiAoIWNwdV9oYXNfdHNjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qICJ2ZXJpZnkiIHRoaXMgdGltaW5nIHNvdXJjZSAqLworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJCWlmICh2YWx1ZTIgPT0gdmFsdWUxKQorCQkJY29udGludWU7CisJCWlmICh2YWx1ZTIgPiB2YWx1ZTEpCisJCQlnb3RvIHBtX2dvb2Q7CisJCWlmICgodmFsdWUyIDwgdmFsdWUxKSAmJiAoKHZhbHVlMikgPCAweEZGRikpCisJCQlnb3RvIHBtX2dvb2Q7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBpbmNvbnNpc3RlbnQgcmVzdWx0czogMHglI3gsIDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEsIHZhbHVlMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQTS1UaW1lciBoYWQgbm8gcmVhc29uYWJsZSByZXN1bHQ6IDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEpOworCXJldHVybiAtRU5PREVWOworCitwbV9nb29kOgorCWlmICh2ZXJpZnlfcG10bXJfcmF0ZSgpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJaW5pdF9jcHVfa2h6KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN5YzJ1cyh1MzIgY3ljbGVzKQoreworCS8qIFRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIHRpY2tzIGF0IDMuNTc5NTQ1IHRpY2tzIHBlciBtaWNyb3NlY29uZC4KKwkgKiAxIC8gUE1fVElNRVJfRlJFUVVFTkNZID09IDAuMjc5MzY1MTEgPX4gMjg2LzEwMjQgW2Vycm9yOiAwLjAyNCVdCisJICoKKwkgKiBFdmVuIHdpdGggSFogPSAxMDAsIGRlbHRhIGlzIGF0IG1heGltdW0gMzU3OTYgdGlja3MsIHNvIGl0IGNhbgorCSAqIGVhc2lseSBiZSBtdWx0aXBsaWVkIHdpdGggMjg2ICg9MHgxMUUpIHdpdGhvdXQgaGF2aW5nIHRvIGZlYXIKKwkgKiB1MzIgb3ZlcmZsb3dzLgorCSAqLworCWN5Y2xlcyAqPSAyODY7CisJcmV0dXJuIChjeWNsZXMgPj4gMTApOworfQorCisvKgorICogdGhpcyBnZXRzIGNhbGxlZCBkdXJpbmcgZWFjaCB0aW1lciBpbnRlcnJ1cHQKKyAqICAgLSBDYWxsZWQgd2hpbGUgaG9sZGluZyB0aGUgd3JpdGVyIHh0aW1lX2xvY2sKKyAqLworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbG9zdCwgZGVsdGEsIGxhc3Rfb2Zmc2V0OworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKKwlsYXN0X29mZnNldCA9IG9mZnNldF90aWNrOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCisJb2Zmc2V0X3RpY2sgPSByZWFkX3BtdG1yKCk7CisKKwkvKiBjYWxjdWxhdGUgdGljayBpbnRlcnZhbCAqLworCWRlbHRhID0gKG9mZnNldF90aWNrIC0gbGFzdF9vZmZzZXQpICYgQUNQSV9QTV9NQVNLOworCisJLyogY29udmVydCB0byB1c2VjcyAqLworCWRlbHRhID0gY3ljMnVzKGRlbHRhKTsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwltb25vdG9uaWNfYmFzZSArPSBkZWx0YSAqIE5TRUNfUEVSX1VTRUM7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjb252ZXJ0IHRvIHRpY2tzICovCisJZGVsdGEgKz0gb2Zmc2V0X2RlbGF5OworCWxvc3QgPSBkZWx0YSAvIChVU0VDX1BFUl9TRUMgLyBIWik7CisJb2Zmc2V0X2RlbGF5ID0gZGVsdGEgJSAoVVNFQ19QRVJfU0VDIC8gSFopOworCisKKwkvKiBjb21wZW5zYXRlIGZvciBsb3N0IHRpY2tzICovCisJaWYgKGxvc3QgPj0gMikKKwkJamlmZmllc182NCArPSBsb3N0IC0gMTsKKworCS8qIGRvbid0IGNhbGN1bGF0ZSBkZWxheSBmb3IgZmlyc3QgcnVuLAorCSAgIG9yIGlmIHdlJ3ZlIGdvdCBsZXNzIHRoZW4gYSB0aWNrICovCisJaWYgKGZpcnN0X3J1biB8fCAobG9zdCA8IDEpKSB7CisJCWZpcnN0X3J1biA9IDA7CisJCW9mZnNldF9kZWxheSA9IDA7CisJfQorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX3BtdG1yKHZvaWQpCit7CisJdTMyIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZSwgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSBvZmZzZXRfdGljazsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIHBtdG1yICovCisJdGhpc19vZmZzZXQgPSAgcmVhZF9wbXRtcigpOworCisJLyogY29udmVydCB0byBuYW5vc2Vjb25kcyAqLworCXJldCA9ICh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSAmIEFDUElfUE1fTUFTSzsKKwlyZXQgPSBiYXNlICsgKGN5YzJ1cyhyZXQpICogTlNFQ19QRVJfVVNFQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcG10bXIodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCisJcmR0c2NsKGJjbG9jayk7CisJZG8KKwl7CisJCXJlcF9ub3AoKTsKKwkJcmR0c2NsKG5vdyk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorCisKKy8qCisgKiBnZXQgdGhlIG9mZnNldCAoaW4gbWljcm9zZWNvbmRzKSBmcm9tIHRoZSBsYXN0IGNhbGwgdG8gbWFya19vZmZzZXQoKQorICoJLSBDYWxsZWQgaG9sZGluZyBhIHJlYWRlciB4dGltZV9sb2NrCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbm93LCBvZmZzZXQsIGRlbHRhID0gMDsKKworCW9mZnNldCA9IG9mZnNldF90aWNrOworCW5vdyA9IHJlYWRfcG10bXIoKTsKKwlkZWx0YSA9IChub3cgLSBvZmZzZXQpJkFDUElfUE1fTUFTSzsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgb2Zmc2V0X2RlbGF5ICsgY3ljMnVzKGRlbHRhKTsKK30KKworCisvKiBhY3BpIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfcG10bXIgPSB7CisJLm5hbWUJCQk9ICJwbXRtciIsCisJLm1hcmtfb2Zmc2V0CQk9IG1hcmtfb2Zmc2V0X3BtdG1yLAorCS5nZXRfb2Zmc2V0CQk9IGdldF9vZmZzZXRfcG10bXIsCisJLm1vbm90b25pY19jbG9jayAJPSBtb25vdG9uaWNfY2xvY2tfcG10bXIsCisJLmRlbGF5IAkJCT0gZGVsYXlfcG10bXIsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcG10bXJfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfcG10bXIsCisJLm9wdHMgPSAmdGltZXJfcG10bXIsCit9OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyIE1hbmFnZW1lbnQgVGltZXIgKFBNVE1SKSBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHg4NiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg1OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqCisgKiAyMDA0LTA2LTI1ICAgIEplc3BlciBKdWhsCisgKiAgICAgIG1vdmVkIG1hcmtfb2Zmc2V0X3RzYyBiZWxvdyBjcHVmcmVxX2RlbGF5ZWRfZ2V0IHRvIGF2b2lkIGdjYyAzLjQKKyAqICAgICAgZmFpbGluZyB0byBpbmxpbmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisvKiBwcm9jZXNzb3IuaCBmb3IgZGlzdGFibGVfdHNjIGZsYWcgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0Oworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3RzYzsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKKworaW50IHRzY19kaXNhYmxlIF9faW5pdGRhdGEgPSAwOworCitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCitzdGF0aWMgaW50IHVzZV90c2M7CisvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KK3N0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdHNjX2xvdzsgLyogbHNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19oaWdoOyAvKiBtc2IgMzIgYml0cyBvZiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCisgKiAgYmFzaWMgZXF1YXRpb246CisgKgkJbnMgPSBjeWNsZXMgLyAoZnJlcSAvIG5zX3Blcl9zZWMpCisgKgkJbnMgPSBjeWNsZXMgKiAobnNfcGVyX3NlYyAvIGZyZXEpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeOSAvIChjcHVfbWh6ICogMTBeNikpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeMyAvIGNwdV9taHopCisgKgorICoJVGhlbiB3ZSB1c2Ugc2NhbGluZyBtYXRoIChzdWdnZXN0ZWQgYnkgZ2VvcmdlQG12aXN0YS5jb20pIHRvIGdldDoKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zICogU0MgLyBjcHVfbWh6KSAvIFNDCisgKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQworICoKKyAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgorICogIGludG8gYSBzaGlmdC4gICAKKyAqCQkJLWpvaG5zdHVsQHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsgCisjZGVmaW5lIENZQzJOU19TQ0FMRV9GQUNUT1IgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGNwdV9taHopCit7CisJY3ljMm5zX3NjYWxlID0gKDEwMDAgPDwgQ1lDMk5TX1NDQUxFX0ZBQ1RPUikvY3B1X21oejsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKK3sKKwlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUjsKK30KKworc3RhdGljIGludCBjb3VudDI7IC8qIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKy8qIENhY2hlZCAqbXVsdGlwbGllciogdG8gY29udmVydCBUU0MgY291bnRzIHRvIG1pY3Jvc2Vjb25kcy4KKyAqIChzZWUgdGhlIGVxdWF0aW9uIGJlbG93KS4KKyAqIEVxdWFsIHRvIDJeMzIgKiAoMSAvIChjbG9ja3MgcGVyIHVzZWMpICkuCisgKiBJbml0aWFsaXplZCBpbiB0aW1lX2luaXQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF90c2Modm9pZCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGVheCwgZWR4OworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisKKwlyZHRzYyhlYXgsZWR4KTsKKworCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KKwllYXggLT0gbGFzdF90c2NfbG93OwkvKiB0c2NfbG93IGRlbHRhICovCisKKwkvKgorICAgICAgICAgKiBUaW1lIG9mZnNldCA9ICh0c2NfbG93IGRlbHRhKSAqIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudAorICAgICAgICAgKiAgICAgICAgICAgICA9ICh0c2NfbG93IGRlbHRhKSAqICh1c2Vjc19wZXJfY2xvY2spCisgICAgICAgICAqICAgICAgICAgICAgID0gKHRzY19sb3cgZGVsdGEpICogKHVzZWNzX3Blcl9qaWZmeSAvIGNsb2Nrc19wZXJfamlmZnkpCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgdXAgdG8gMzEgY2xvY2sgY3ljbGVzCisJICogaW4gdGhlIGNyaXRpY2FsIHBhdGguCisgICAgICAgICAqLworCisJX19hc21fXygibXVsbCAlMiIKKwkJOiI9YSIgKGVheCksICI9ZCIgKGVkeCkKKwkJOiJybSIgKGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCksCisJCSAiMCIgKGVheCkpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBkZWxheV9hdF9sYXN0X2ludGVycnVwdCArIGVkeDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfdHNjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBzZXE7CisJCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGJhc2UgKyBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKK30KKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldDsKKworCS8qCisJICogSW4gdGhlIE5VTUEgY2FzZSB3ZSBkb250IHVzZSB0aGUgVFNDIGFzIHRoZXkgYXJlIG5vdAorCSAqIHN5bmNocm9uaXplZCBhY3Jvc3MgYWxsIENQVXMuCisJICovCisjaWZuZGVmIENPTkZJR19OVU1BCisJaWYgKCF1c2VfdHNjKQorI2VuZGlmCisJCS8qIG5vIGxvY2tpbmcgYnV0IGEgcmFyZSB3cm9uZyB2YWx1ZSBpcyBub3QgYSBiaWcgZGVhbCAqLworCQlyZXR1cm4gamlmZmllc182NCAqICgxMDAwMDAwMDAwIC8gSFopOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfdHNjKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKwkKKwlyZHRzY2woYmNsb2NrKTsKKwlkbworCXsKKwkJcmVwX25vcCgpOworCQlyZHRzY2wobm93KTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHZvaWQgbWFya19vZmZzZXRfdHNjX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgdGVtcCwgaHBldF9jdXJyZW50OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisJLyoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBqdXN0IGRpc2FibGVkIGxvY2FsbHkgc2luY2UgdGhlIHRpbWVyIGlycQorCSAqIGhhcyB0aGUgU0FfSU5URVJSVVBUIGZsYWcgc2V0LiAtYXJjYQorCSAqLworCS8qIHJlYWQgUGVudGl1bSBjeWNsZSBjb3VudGVyICovCisKKwlocGV0X2N1cnJlbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlvZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKKwlpZiAodW5saWtlbHkoKChvZmZzZXQgLSBocGV0X2xhc3QpID4gaHBldF90aWNrKSAmJiAoaHBldF9sYXN0ICE9IDApKSkgeworCQlpbnQgbG9zdF90aWNrcyA9IChvZmZzZXQgLSBocGV0X2xhc3QpIC8gaHBldF90aWNrOworCQlqaWZmaWVzXzY0ICs9IGxvc3RfdGlja3M7CisJfQorCWhwZXRfbGFzdCA9IGhwZXRfY3VycmVudDsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwkvKgorCSAqIFRpbWUgb2Zmc2V0ID0gKGhwZXQgZGVsdGEpICogKCB1c2VjcyBwZXIgSFBFVCBjbG9jayApCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciB0aWNrIC8gSFBFVCBjbG9ja3MgcGVyIHRpY2spCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIGhwZXRfdXNlY19xdW90aWVudCApIC8gKDJeMzIpCisJICogV2hlcmUsCisJICogaHBldF91c2VjX3F1b3RpZW50ID0gKDJeMzIgKiB1c2VjcyBwZXIgdGljaykvSFBFVCBjbG9ja3MgcGVyIHRpY2sKKwkgKi8KKwlkZWxheV9hdF9sYXN0X2ludGVycnVwdCA9IGhwZXRfY3VycmVudCAtIG9mZnNldDsKKwlBU01fTVVMNjRfUkVHKHRlbXAsIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0LAorCQkJaHBldF91c2VjX3F1b3RpZW50LCBkZWxheV9hdF9sYXN0X2ludGVycnVwdCk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQgKnYpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljcHVmcmVxX2dldChjcHUpOworCX0KKwljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Cit9CisKKy8qIGlmIHdlIG5vdGljZSBsb3N0IHRpY2tzLCBzY2hlZHVsZSBhIGNhbGwgdG8gY3B1ZnJlcV9nZXQoKSBhcyBpdCB0cmllcworICogdG8gdmVyaWZ5IHRoZSBDUFUgZnJlcXVlbmN5IHRoZSB0aW1pbmcgY29yZSB0aGlua3MgdGhlIENQVSBpcyBydW5uaW5nCisgKiBhdCBpcyBzdGlsbCBjb3JyZWN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKSAKK3sKKwlpZiAoY3B1ZnJlcV9pbml0ICYmICFjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCkgeworCQljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDE7CisJCXByaW50ayhLRVJOX0RFQlVHICJMb3Npbmcgc29tZSB0aWNrcy4uLiBjaGVja2luZyBpZiBDUFUgZnJlcXVlbmN5IGNoYW5nZWQuXG4iKTsKKwkJc2NoZWR1bGVfd29yaygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrKTsKKwl9Cit9CisKKy8qIElmIHRoZSBDUFUgZnJlcXVlbmN5IGlzIHNjYWxlZCwgVFNDLWJhc2VkIGRlbGF5cyB3aWxsIG5lZWQgYSBkaWZmZXJlbnQKKyAqIGxvb3BzX3Blcl9qaWZmeSB2YWx1ZSB0byBmdW5jdGlvbiBwcm9wZXJseS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50ICByZWZfZnJlcSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnlfcmVmID0gMDsKKworI2lmbmRlZiBDT05GSUdfU01QCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYXN0X2dldHRpbWVvZmZzZXRfcmVmID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9raHpfcmVmID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50Cit0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKworCWlmICh2YWwgIT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpCisJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwlpZiAoIXJlZl9mcmVxKSB7CisJCXJlZl9mcmVxID0gZnJlcS0+b2xkOworCQlsb29wc19wZXJfamlmZnlfcmVmID0gY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiA9IGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKwkJY3B1X2toel9yZWYgPSBjcHVfa2h6OworI2VuZGlmCisJfQorCisJaWYgKCh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UgICYmIGZyZXEtPm9sZCA8IGZyZXEtPm5ldykgfHwKKwkgICAgKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB8fAorCSAgICAodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQorCQkJY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnkgPSBjcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworI2lmbmRlZiBDT05GSUdfU01QCisJCWlmIChjcHVfa2h6KQorCQkJY3B1X2toeiA9IGNwdWZyZXFfc2NhbGUoY3B1X2toel9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworCQlpZiAodXNlX3RzYykgeworCQkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkgeworCQkJCWZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCA9IGNwdWZyZXFfc2NhbGUoZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiwgZnJlcS0+bmV3LCByZWZfZnJlcSk7CisJCQkJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6LzEwMDApOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwlpZiAodmFsICE9IENQVUZSRVFfUkVTVU1FQ0hBTkdFKQorCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHRpbWVfY3B1ZnJlcV9ub3RpZmllcgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQoreworCWludCByZXQ7CisJSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0LCBOVUxMKTsKKwlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CisJaWYgKCFyZXQpCisJCWNwdWZyZXFfaW5pdCA9IDE7CisJcmV0dXJuIHJldDsKK30KK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOworCisjZWxzZSAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpIHsgcmV0dXJuOyB9CisjZW5kaWYgCisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X3RzYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCxkZWxheTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF90c2NfbG93OworCWludCBjb3VudDsKKwlpbnQgY291bnRtcDsKKwlzdGF0aWMgaW50IGNvdW50MSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0LCBsYXN0X29mZnNldDsKKwlzdGF0aWMgaW50IGxvc3RfY291bnQgPSAwOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisKKwkvKgorCSAqIEludGVycnVwdHMgYXJlIGp1c3QgZGlzYWJsZWQgbG9jYWxseSBzaW5jZSB0aGUgdGltZXIgaXJxCisJICogaGFzIHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIC1hcmNhCisJICovCisKKwkvKiByZWFkIFBlbnRpdW0gY3ljbGUgY291bnRlciAqLworCisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKFBJVF9DSDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKFBJVF9DSDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKKworCWlmIChwaXRfbGF0Y2hfYnVnZ3kpIHsKKwkJLyogZ2V0IGNlbnRlciB2YWx1ZSBvZiBsYXN0IDMgdGltZSBsdXRjaCAqLworCQlpZiAoKGNvdW50MiA+PSBjb3VudCAmJiBjb3VudCA+PSBjb3VudDEpCisJCSAgICB8fCAoY291bnQxID49IGNvdW50ICYmIGNvdW50ID49IGNvdW50MikpIHsKKwkJCWNvdW50MiA9IGNvdW50MTsgY291bnQxID0gY291bnQ7CisJCX0gZWxzZSBpZiAoKGNvdW50MSA+PSBjb3VudDIgJiYgY291bnQyID49IGNvdW50KQorCQkJICAgfHwgKGNvdW50ID49IGNvdW50MiAmJiBjb3VudDIgPj0gY291bnQxKSkgeworCQkJY291bnRtcCA9IGNvdW50O2NvdW50ID0gY291bnQyOworCQkJY291bnQyID0gY291bnQxO2NvdW50MSA9IGNvdW50bXA7CisJCX0gZWxzZSB7CisJCQljb3VudDIgPSBjb3VudDE7IGNvdW50MSA9IGNvdW50OyBjb3VudCA9IGNvdW50MTsKKwkJfQorCX0KKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlkZWx0YSA9IGxhc3RfdHNjX2xvdyAtIGRlbHRhOworCXsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBlYXgsIGVkeDsKKwkJZWF4ID0gZGVsdGE7CisJCV9fYXNtX18oIm11bGwgJTIiCisJCToiPWEiIChlYXgpLCAiPWQiIChlZHgpCisJCToicm0iIChmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQpLAorCQkgIjAiIChlYXgpKTsKKwkJZGVsdGEgPSBlZHg7CisJfQorCWRlbHRhICs9IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCWxvc3QgPSBkZWx0YS8oMTAwMDAwMC9IWik7CisJZGVsYXkgPSBkZWx0YSUoMTAwMDAwMC9IWik7CisJaWYgKGxvc3QgPj0gMikgeworCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKworCQkvKiBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHdlJ3JlIG5vdCBhbHdheXMgbG9zaW5nIHRpY2tzICovCisJCWlmIChsb3N0X2NvdW50KysgPiAxMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxvc2luZyB0b28gbWFueSB0aWNrcyFcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDIGNhbm5vdCBiZSB1c2VkIGFzIGEgdGltZXNvdXJjZS4gIFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQb3NzaWJsZSByZWFzb25zIGZvciB0aGlzIGFyZTpcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UncmUgcnVubmluZyB3aXRoIFNwZWVkc3RlcCxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UgZG9uJ3QgaGF2ZSBETUEgZW5hYmxlZCBmb3IgeW91ciBoYXJkIGRpc2sgKHNlZSBoZHBhcm0pLFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEluY29ycmVjdCBUU0Mgc3luY2hyb25pemF0aW9uIG9uIGFuIFNNUCBzeXN0ZW0gKHNlZSBkbWVzZykuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhbGxpbmcgYmFjayB0byBhIHNhbmUgdGltZXNvdXJjZSBub3cuXG4iKTsKKworCQkJY2xvY2tfZmFsbGJhY2soKTsKKwkJfQorCQkvKiAuLi4gYnV0IGdpdmUgdGhlIFRTQyBhIGZhaXIgY2hhbmNlICovCisJCWlmIChsb3N0X2NvdW50ID4gMjUpCisJCQljcHVmcmVxX2RlbGF5ZWRfZ2V0KCk7CisJfSBlbHNlCisJCWxvc3RfY291bnQgPSAwOworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7CisJZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkCisJICogYmV0d2VlbiB0c2MgYW5kIHBpdCByZWFkcyAoYXMgbm90ZWQgd2hlbgorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjKGNoYXIqIG92ZXJyaWRlKQoreworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwidHNjIiwzKSkgeworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIHRzY1xuIik7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIEFQTSBlbmFibGVkIG9yIHRoZSBDUFUgY2xvY2sgc3BlZWQgaXMgdmFyaWFibGUKKwkgKiAoQ1BVIHN0b3BzIGNsb2NrIG9uIEhMVCBvciBzbG93cyBjbG9jayB0byBzYXZlIHBvd2VyKQorCSAqIHRoZW4gdGhlIFRTQyB0aW1lc3RhbXBzIG1heSBkaXZlcmdlIGJ5IHVwIHRvIDEgamlmZnkgZnJvbQorCSAqICdyZWFsIHRpbWUnIGJ1dCBub3RoaW5nIHdpbGwgYnJlYWsuCisJICogVGhlIG1vc3QgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IHRoZSBDUFUgaXMgIndva2VuIiBmcm9tIGEgaGFsdAorCSAqIHN0YXRlIGJ5IHRoZSB0aW1lciBpbnRlcnJ1cHQgaXRzZWxmLCBzbyB3ZSBnZXQgMCBlcnJvci4gSW4gdGhlCisJICogcmFyZSBjYXNlcyB3aGVyZSBhIGRyaXZlciB3b3VsZCAid2FrZSIgdGhlIENQVSBhbmQgcmVxdWVzdCBhCisJICogdGltZXN0YW1wLCB0aGUgbWF4aW11bSBlcnJvciBpcyA8IDEgamlmZnkuIEJ1dCB0aW1lc3RhbXBzIGFyZQorCSAqIHN0aWxsIHBlcmZlY3RseSBvcmRlcmVkLgorCSAqIE5vdGUgdGhhdCB0aGUgVFNDIGNvdW50ZXIgd2lsbCBiZSByZXNldCBpZiBBUE0gc3VzcGVuZHMKKwkgKiB0byBkaXNrOyB0aGlzIHdvbid0IGJyZWFrIHRoZSBrZXJuZWwsIHRob3VnaCwgJ2N1eiB3ZSdyZQorCSAqIHNtYXJ0LiAgU2VlIGFyY2gvaTM4Ni9rZXJuZWwvYXBtLmMuCisJICovCisgCS8qCisgCSAqCUZpcnN0bHkgd2UgaGF2ZSB0byBkbyBhIENQVSBjaGVjayBmb3IgY2hpcHMgd2l0aAorIAkgKiAJYSBwb3RlbnRpYWxseSBidWdneSBUU0MuIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZW4ndCBydW4KKyAJICoJdGhlIGlkZW50L2J1Z3MgY2hlY2tzIHNvIHdlIG11c3QgcnVuIHRoaXMgaG9vayBhcyBpdAorIAkgKgltYXkgdHVybiBvZmYgdGhlIFRTQyBmbGFnLgorIAkgKgorIAkgKglOT1RFOiB0aGlzIGRvZXNuJ3QgeWV0IGhhbmRsZSBTTVAgNDg2IG1hY2hpbmVzIHdoZXJlIG9ubHkKKyAJICoJc29tZSBDUFUncyBoYXZlIGEgVFNDLiBUaGF0cyBuZXZlciB3b3JrZWQgYW5kIG5vYm9keSBoYXMKKyAJICoJbW9hbmVkIGlmIHlvdSBoYXZlIHRoZSBvbmx5IG9uZSBpbiB0aGUgd29ybGQgLSB5b3UgZml4IGl0IQorIAkgKi8KKworCWNvdW50MiA9IExBVENIOyAvKiBpbml0aWFsaXplIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJdW5zaWduZWQgbG9uZyB0c2NfcXVvdGllbnQ7CisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwkJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKXsKKwkJCXVuc2lnbmVkIGxvbmcgcmVzdWx0LCByZW1haW47CisJCQlwcmludGsoIlVzaW5nIFRTQyBmb3IgZ2V0dGltZW9mZGF5XG4iKTsKKwkJCXRzY19xdW90aWVudCA9IGNhbGlicmF0ZV90c2NfaHBldChOVUxMKTsKKwkJCXRpbWVyX3RzYy5tYXJrX29mZnNldCA9ICZtYXJrX29mZnNldF90c2NfaHBldDsKKwkJCS8qCisJCQkgKiBNYXRoIHRvIGNhbGN1bGF0ZSBocGV0IHRvIHVzZWMgbXVsdGlwbGllcgorCQkJICogTG9vayBmb3IgdGhlIGNvbW1lbnRzIGF0IGdldF9vZmZzZXRfdHNjX2hwZXQoKQorCQkJICovCisJCQlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssCisJCQkJCTAsIEtFUk5FTF9USUNLX1VTRUMpOworCQkJaWYgKHJlbWFpbiA+IChocGV0X3RpY2sgPj4gMSkpCisJCQkJcmVzdWx0Kys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCQkJaHBldF91c2VjX3F1b3RpZW50ID0gcmVzdWx0OworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQl0c2NfcXVvdGllbnQgPSBjYWxpYnJhdGVfdHNjKCk7CisJCX0KKworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQlmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQgPSB0c2NfcXVvdGllbnQ7CisJCQl1c2VfdHNjID0gMTsKKwkJCS8qCisJCQkgKglXZSBjb3VsZCBiZSBtb3JlIHNlbGVjdGl2ZSBoZXJlIEkgc3VzcGVjdAorCQkJICoJYW5kIGp1c3QgZW5hYmxlIHRoaXMgZm9yIHRoZSBuZXh0IGludGVsIGNoaXBzID8KKwkJCSAqLworCQkJLyogcmVwb3J0IENQVSBjbG9jayByYXRlIGluIEh6LgorCQkJICogVGhlIGZvcm11bGEgaXMgKDEwXjYgKiAyXjMyKSAvICgyXjMyICogMSAvIChjbG9ja3MvdXMpKSA9CisJCQkgKiBjbG9jay9zZWNvbmQuIE91ciBwcmVjaXNpb24gaXMgYWJvdXQgMTAwIHBwbS4KKwkJCSAqLworCQkJewl1bnNpZ25lZCBsb25nIGVheD0wLCBlZHg9MTAwMDsKKwkJCQlfX2FzbV9fKCJkaXZsICUyIgorCQkgICAgICAgCQk6Ij1hIiAoY3B1X2toeiksICI9ZCIgKGVkeCkKKyAgICAgICAgCSAgICAgICAJCToiciIgKHRzY19xdW90aWVudCksCisJICAgICAgICAgICAgICAgIAkiMCIgKGVheCksICIxIiAoZWR4KSk7CisJCQkJcHJpbnRrKCJEZXRlY3RlZCAlbHUuJTAzbHUgTUh6IHByb2Nlc3Nvci5cbiIsIGNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7CisJCQl9CisJCQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHovMTAwMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBDT05GSUdfWDg2X1RTQworLyogZGlzYWJsZSBmbGFnIGZvciB0c2MuICBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZworICogaW4gY3B1L2NvbW1vbi5jICovCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXRzY19kaXNhYmxlID0gMTsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vdHNjOiBLZXJuZWwgY29tcGlsZWQgd2l0aCBDT05GSUdfWDg2X1RTQywgIgorCQkJCSJjYW5ub3QgZGlzYWJsZSBUU0MuXG4iKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorX19zZXR1cCgibm90c2MiLCB0c2Nfc2V0dXApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfdHNjID0geworCS5uYW1lID0gInRzYyIsCisJLm1hcmtfb2Zmc2V0ID0gbWFya19vZmZzZXRfdHNjLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfdHNjLAorCS5tb25vdG9uaWNfY2xvY2sgPSBtb25vdG9uaWNfY2xvY2tfdHNjLAorCS5kZWxheSA9IGRlbGF5X3RzYywKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl90c2NfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfdHNjLAorCS5vcHRzID0gJnRpbWVyX3RzYywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhbXBvbGluZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjY2UwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICoKKyAqCVRyYW1wb2xpbmUuUwlEZXJpdmVkIGZyb20gU2V0dXAuUyBieSBMaW51cyBUb3J2YWxkcworICoKKyAqCTQgSmFuIDE5OTcgTWljaGFlbCBDaGFzdGFpbjogY2hhbmdlZCB0byBnbnUgYXMuCisgKgorICoJVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGJvb3Rpbmcgc2Vjb25kYXJ5IENQVXMgaW4gU01QIG1hY2hpbmUKKyAqCisgKglFbnRyeTogQ1M6SVAgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIG91ciBjb2RlLCB3ZSBhcmUgCisgKglpbiByZWFsIG1vZGUgd2l0aCBubyBzdGFjaywgYnV0IHRoZSByZXN0IG9mIHRoZSAKKyAqCXRyYW1wb2xpbmUgcGFnZSB0byBtYWtlIG91ciBzdGFjayBhbmQgZXZlcnl0aGluZyBlbHNlCisgKglpcyBhIG15c3RlcnkuCisgKgorICoJSW4gZmFjdCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgc3RhY2sgc28gd2UgZG9uJ3QKKyAqCXNldCBvbmUgdXAuCisgKgorICoJV2UganVtcCBpbnRvIHRoZSBib290L2NvbXByZXNzZWQvaGVhZC5TIGNvZGUuIFNvIHlvdSdkCisgKgliZXR0ZXIgYmUgcnVubmluZyBhIGNvbXByZXNzZWQga2VybmVsIGltYWdlIG9yIHlvdQorICoJd29uJ3QgZ2V0IHZlcnkgZmFyLgorICoKKyAqCU9uIGVudHJ5IHRvIHRyYW1wb2xpbmVfZGF0YSwgdGhlIHByb2Nlc3NvciBpcyBpbiByZWFsIG1vZGUKKyAqCXdpdGggMTYtYml0IGFkZHJlc3NpbmcgYW5kIDE2LWJpdCBkYXRhLiAgQ1MgaGFzIHNvbWUgdmFsdWUKKyAqCWFuZCBJUCBpcyB6ZXJvLiAgVGh1cywgZGF0YSBhZGRyZXNzZXMgbmVlZCB0byBiZSBhYnNvbHV0ZQorICoJKG5vIHJlbG9jYXRpb24pIGFuZCBhcmUgdGFrZW4gd2l0aCByZWdhcmQgdG8gcl9iYXNlLgorICoKKyAqCUlmIHlvdSB3b3JrIG9uIHRoaXMgZmlsZSwgY2hlY2sgdGhlIG9iamVjdCBtb2R1bGUgd2l0aAorICoJb2JqZHVtcCAtLXJlbG9jIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbgorICoJZW50cmllcyBleGNlcHQgZm9yOgorICoKKyAqCVRZUEUgICAgICAgICAgICAgIFZBTFVFCisgKglSXzM4Nl8zMiAgICAgICAgICBzdGFydHVwXzMyX3NtcAorICoJUl8zODZfMzIgICAgICAgICAgYm9vdF9nZHRfdGFibGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLmRhdGEKKworLmNvZGUxNgorCitFTlRSWSh0cmFtcG9saW5lX2RhdGEpCityX2Jhc2UgPSAuCisJd2JpbnZkCQkJIyBOZWVkZWQgZm9yIE5VTUEtUSBzaG91bGQgYmUgaGFybWxlc3MgZm9yIG90aGVycworCW1vdgklY3MsICVheAkjIENvZGUgYW5kIGRhdGEgaW4gdGhlIHNhbWUgcGxhY2UKKwltb3YJJWF4LCAlZHMKKworCWNsaQkJCSMgV2Ugc2hvdWxkIGJlIHNhZmUgYW55d2F5CisKKwltb3ZsCSQweEE1QTVBNUE1LCB0cmFtcG9saW5lX2RhdGEgLSByX2Jhc2UKKwkJCQkjIHdyaXRlIG1hcmtlciBmb3IgbWFzdGVyIGtub3dzIHdlJ3JlIHJ1bm5pbmcKKworCS8qIEdEVCB0YWJsZXMgaW4gbm9uIGRlZmF1bHQgbG9jYXRpb24ga2VybmVsIGNhbiBiZSBiZXlvbmQgMTZNQiBhbmQKKwkgKiBsZ2R0IHdpbGwgbm90IGJlIGFibGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBhcyBpbiByZWFsIG1vZGUgZGVmYXVsdAorCSAqIG9wZXJhbmQgc2l6ZSBpcyAxNmJpdC4gVXNlIGxnZHRsIGluc3RlYWQgdG8gZm9yY2Ugb3BlcmFuZCBzaXplCisJICogdG8gMzIgYml0LgorCSAqLworCisJbGlkdGwJYm9vdF9pZHQgLSByX2Jhc2UJIyBsb2FkIGlkdCB3aXRoIDAsIDAKKwlsZ2R0bAlib290X2dkdCAtIHJfYmFzZQkjIGxvYWQgZ2R0IHdpdGggd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUKKworCXhvcgklYXgsICVheAorCWluYwklYXgJCSMgcHJvdGVjdGVkIG1vZGUgKFBFKSBiaXQKKwlsbXN3CSVheAkJIyBpbnRvIHByb3RlY3RlZCBtb2RlCisJIyBmbHVzaCBwcmVmZXRjaCBhbmQganVtcCB0byBzdGFydHVwXzMyX3NtcCBpbiBhcmNoL2kzODYva2VybmVsL2hlYWQuUworCWxqbXBsCSRfX0JPT1RfQ1MsICQoc3RhcnR1cF8zMl9zbXAtX19QQUdFX09GRlNFVCkKKworCSMgVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSA2NEsgc2VnbWVudCBhcyB0aGUgYWJvdmU7CisJIyBoZW5jZSB3ZSBkb24ndCB1c2UgdGhlIGJvb3RfZ2R0X2Rlc2NyIGRlZmluZWQgaW4gaGVhZC5TCitib290X2dkdDoKKwkud29yZAlfX0JPT1RfRFMgKyA3CQkJIyBnZHQgbGltaXQKKwkubG9uZwlib290X2dkdF90YWJsZS1fX1BBR0VfT0ZGU0VUCSMgZ2R0IGJhc2UKKworYm9vdF9pZHQ6CisJLndvcmQJMAkJCQkjIGlkdCBsaW1pdCA9IDAKKwkubG9uZwkwCQkJCSMgaWR0IGJhc2UgPSAwTAorCisuZ2xvYmwgdHJhbXBvbGluZV9lbmQKK3RyYW1wb2xpbmVfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTAsMCArMSwxMDg0IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni90cmFwcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworLyoKKyAqICdUcmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIHRyYXBzIGFuZCBmYXVsdHMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lCisgKiBzdGF0ZSBpbiAnYXNtLnMnLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpZmRlZiBDT05GSUdfRUlTQQorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIm1hY2hfdHJhcHMuaCIKKworYXNtbGlua2FnZSBpbnQgc3lzdGVtX2NhbGwodm9pZCk7CisKK3N0cnVjdCBkZXNjX3N0cnVjdCBkZWZhdWx0X2xkdFtdID0geyB7IDAsIDAgfSwgeyAwLCAwIH0sIHsgMCwgMCB9LAorCQl7IDAsIDAgfSwgeyAwLCAwIH0gfTsKKworLyogRG8gd2UgaWdub3JlIEZQVSBpbnRlcnJ1cHRzID8gKi8KK2NoYXIgaWdub3JlX2ZwdV9pcnEgPSAwOworCisvKgorICogVGhlIElEVCBoYXMgdG8gYmUgcGFnZS1hbGlnbmVkIHRvIHNpbXBsaWZ5IHRoZSBQZW50aXVtCisgKiBGMCAwRiBidWcgd29ya2Fyb3VuZC4uIFdlIGhhdmUgYSBzcGVjaWFsIGxpbmsgc2VnbWVudAorICogZm9yIHRoaXMuCisgKi8KK3N0cnVjdCBkZXNjX3N0cnVjdCBpZHRfdGFibGVbMjU2XSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaWR0IikpKSA9IHsgezAsIDB9LCB9OworCithc21saW5rYWdlIHZvaWQgZGl2aWRlX2Vycm9yKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRlYnVnKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnQzKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG92ZXJmbG93KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGJvdW5kcyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX29wKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRldmljZV9ub3RfYXZhaWxhYmxlKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX1RTUyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBzZWdtZW50X25vdF9wcmVzZW50KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHN0YWNrX3NlZ21lbnQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgZ2VuZXJhbF9wcm90ZWN0aW9uKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHBhZ2VfZmF1bHQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgY29wcm9jZXNzb3JfZXJyb3Iodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOworCitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0Oworc3RydWN0IG5vdGlmaWVyX2Jsb2NrICppMzg2ZGllX2NoYWluOworc3RhdGljIERFRklORV9TUElOTE9DSyhkaWVfbm90aWZpZXJfbG9jayk7CisKK2ludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkaWVfbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCWVyciA9IG5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpMzg2ZGllX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdm9pZCAqcCkKK3sKKwlyZXR1cm4JcCA+ICh2b2lkICopdGluZm8gJiYKKwkJcCA8ICh2b2lkICopdGluZm8gKyBUSFJFQURfU0laRSAtIDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwcmludF9jb250ZXh0X3N0YWNrKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sCisJCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgZWJwKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworI2lmZGVmCUNPTkZJR19GUkFNRV9QT0lOVEVSCisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgKHZvaWQgKillYnApKSB7CisJCWFkZHIgPSAqKHVuc2lnbmVkIGxvbmcgKikoZWJwICsgNCk7CisJCXByaW50aygiIFs8JTA4bHg+XSAiLCBhZGRyKTsKKwkJcHJpbnRfc3ltYm9sKCIlcyIsIGFkZHIpOworCQlwcmludGsoIlxuIik7CisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwl9CisjZWxzZQorCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgeworCQlhZGRyID0gKnN0YWNrKys7CisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKwkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOworCQkJcHJpbnRfc3ltYm9sKCIgJXMiLCBhZGRyKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBlYnA7Cit9CisKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKiBzdGFjaykKK3sKKwl1bnNpZ25lZCBsb25nIGVicDsKKworCWlmICghdGFzaykKKwkJdGFzayA9IGN1cnJlbnQ7CisKKwlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCS8qIEdyYWIgZWJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KKwkJYXNtICgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoZWJwKSA6ICk7CisJfSBlbHNlIHsKKwkJLyogZWJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKSB0YXNrLT50aHJlYWQuZXNwOworCX0KKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKKwkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKKwkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKKwkJZWJwID0gcHJpbnRfY29udGV4dF9zdGFjayhjb250ZXh0LCBzdGFjaywgZWJwKTsKKwkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyopY29udGV4dC0+cHJldmlvdXNfZXNwOworCQlpZiAoIXN0YWNrKQorCQkJYnJlYWs7CisJCXByaW50aygiID09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwl9Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlpbnQgaTsKKworCWlmIChlc3AgPT0gTlVMTCkgeworCQlpZiAodGFzaykKKwkJCWVzcCA9ICh1bnNpZ25lZCBsb25nKil0YXNrLT50aHJlYWQuZXNwOworCQllbHNlCisJCQllc3AgPSAodW5zaWduZWQgbG9uZyAqKSZlc3A7CisJfQorCisJc3RhY2sgPSBlc3A7CisJZm9yKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKGtzdGFja19lbmQoc3RhY2spKQorCQkJYnJlYWs7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJcHJpbnRrKCIlMDhseCAiLCAqc3RhY2srKyk7CisJfQorCXByaW50aygiXG5DYWxsIFRyYWNlOlxuIik7CisJc2hvd190cmFjZSh0YXNrLCBlc3ApOworfQorCisvKgorICogVGhlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkdW1wX3N0YWNrIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc2hvd190cmFjZShjdXJyZW50LCAmc3RhY2spOworfQorCitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCWludCBpbl9rZXJuZWwgPSAxOworCXVuc2lnbmVkIGxvbmcgZXNwOworCXVuc2lnbmVkIHNob3J0IHNzOworCisJZXNwID0gKHVuc2lnbmVkIGxvbmcpICgmcmVncy0+ZXNwKTsKKwlzcyA9IF9fS0VSTkVMX0RTOworCWlmIChyZWdzLT54Y3MgJiAzKSB7CisJCWluX2tlcm5lbCA9IDA7CisJCWVzcCA9IHJlZ3MtPmVzcDsKKwkJc3MgPSByZWdzLT54c3MgJiAweGZmZmY7CisJfQorCXByaW50X21vZHVsZXMoKTsKKwlwcmludGsoIkNQVTogICAgJWRcbkVJUDogICAgJTA0eDpbPCUwOGx4Pl0gICAgJXMgVkxJXG5FRkxBR1M6ICUwOGx4IgorCQkJIiAgICglcykgXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIDB4ZmZmZiAmIHJlZ3MtPnhjcywgcmVncy0+ZWlwLAorCQlwcmludF90YWludGVkKCksIHJlZ3MtPmVmbGFncywgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJcHJpbnRfc3ltYm9sKCJFSVAgaXMgYXQgJXNcbiIsIHJlZ3MtPmVpcCk7CisJcHJpbnRrKCJlYXg6ICUwOGx4ICAgZWJ4OiAlMDhseCAgIGVjeDogJTA4bHggICBlZHg6ICUwOGx4XG4iLAorCQlyZWdzLT5lYXgsIHJlZ3MtPmVieCwgcmVncy0+ZWN4LCByZWdzLT5lZHgpOworCXByaW50aygiZXNpOiAlMDhseCAgIGVkaTogJTA4bHggICBlYnA6ICUwOGx4ICAgZXNwOiAlMDhseFxuIiwKKwkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCwgZXNwKTsKKwlwcmludGsoImRzOiAlMDR4ICAgZXM6ICUwNHggICBzczogJTA0eFxuIiwKKwkJcmVncy0+eGRzICYgMHhmZmZmLCByZWdzLT54ZXMgJiAweGZmZmYsIHNzKTsKKwlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm89JXAgdGFzaz0lcCkiLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCk7CisJLyoKKwkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fa2VybmVsKSB7CisJCXU4ICplaXA7CisKKwkJcHJpbnRrKCJcblN0YWNrOiAiKTsKKwkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyopZXNwKTsKKworCQlwcmludGsoIkNvZGU6ICIpOworCisJCWVpcCA9ICh1OCAqKXJlZ3MtPmVpcCAtIDQzOworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgZWlwKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJaWYgKGVpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8IF9fZ2V0X3VzZXIoYywgZWlwKSkgeworCQkJCXByaW50aygiIEJhZCBFSVAgdmFsdWUuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZWlwID09ICh1OCAqKXJlZ3MtPmVpcCkKKwkJCQlwcmludGsoIjwlMDJ4PiAiLCBjKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiUwMnggIiwgYyk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQkKKworc3RhdGljIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1ZDI7CisJdW5zaWduZWQgc2hvcnQgbGluZTsKKwljaGFyICpmaWxlOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGVpcDsKKworCWlmIChyZWdzLT54Y3MgJiAzKQorCQlnb3RvIG5vX2J1ZzsJCS8qIE5vdCBpbiBrZXJuZWwgKi8KKworCWVpcCA9IHJlZ3MtPmVpcDsKKworCWlmIChlaXAgPCBQQUdFX09GRlNFVCkKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIodWQyLCAodW5zaWduZWQgc2hvcnQgKillaXApKQorCQlnb3RvIG5vX2J1ZzsKKwlpZiAodWQyICE9IDB4MGIwZikKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIobGluZSwgKHVuc2lnbmVkIHNob3J0ICopKGVpcCArIDIpKSkKKwkJZ290byBidWc7CisJaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiopKGVpcCArIDQpKSB8fAorCQkodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKKwkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CisKKwlwcmludGsoIi0tLS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKKworbm9fYnVnOgorCXJldHVybjsKKworCS8qIEhlcmUgd2Uga25vdyBpdCB3YXMgYSBCVUcgYnV0IGZpbGUtbi1saW5lIGlzIHVuYXZhaWxhYmxlICovCitidWc6CisJcHJpbnRrKCJLZXJuZWwgQlVHXG4iKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQl1MzIgbG9ja19vd25lcjsKKwkJaW50IGxvY2tfb3duZXJfZGVwdGg7CisJfSBkaWUgPSB7CisJCS5sb2NrID0JCQlTUElOX0xPQ0tfVU5MT0NLRUQsCisJCS5sb2NrX293bmVyID0JCS0xLAorCQkubG9ja19vd25lcl9kZXB0aCA9CTAKKwl9OworCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisKKwlpZiAoZGllLmxvY2tfb3duZXIgIT0gX3NtcF9wcm9jZXNzb3JfaWQoKSkgeworCQljb25zb2xlX3ZlcmJvc2UoKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGllLmxvY2spOworCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOworCQlidXN0X3NwaW5sb2NrcygxKTsKKwl9CisKKwlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKKwkJaW50IG5sID0gMDsKKwkJaGFuZGxlX0JVRyhyZWdzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJCXByaW50aygiUFJFRU1QVCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCQlwcmludGsoIlNNUCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCQlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOworCQlubCA9IDE7CisjZW5kaWYKKwkJaWYgKG5sKQorCQkJcHJpbnRrKCJcbiIpOworCW5vdGlmeV9kaWUoRElFX09PUFMsIChjaGFyICopc3RyLCByZWdzLCBlcnIsIDI1NSwgU0lHU0VHVik7CisJCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworICAJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOworCWRpZS5sb2NrX293bmVyID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOworCisJaWYgKHBhbmljX29uX29vcHMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKKwkJc3NsZWVwKDUpOworCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJfQorCWRvX2V4aXQoU0lHU0VHVik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCit7CisJaWYgKCEocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgJiYgISgzICYgcmVncy0+eGNzKSkKKwkJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKworc3RhdGljIHZvaWQgZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgaW50IHZtODYsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQoreworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCWlmICh2bTg2KQorCQkJZ290byB2bTg2X3RyYXA7CisJCWdvdG8gdHJhcF9zaWduYWw7CisJfQorCisJaWYgKCEocmVncy0+eGNzICYgMykpCisJCWdvdG8ga2VybmVsX3RyYXA7CisKKwl0cmFwX3NpZ25hbDogeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQl0c2stPnRocmVhZC50cmFwX25vID0gdHJhcG5yOworCQlpZiAoaW5mbykKKwkJCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCBpbmZvLCB0c2spOworCQllbHNlCisJCQlmb3JjZV9zaWcoc2lnbnIsIHRzayk7CisJCXJldHVybjsKKwl9CisKKwlrZXJuZWxfdHJhcDogeworCQlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkKKwkJCWRpZShzdHIsIHJlZ3MsIGVycm9yX2NvZGUpOworCQlyZXR1cm47CisJfQorCisJdm04Nl90cmFwOiB7CisJCWludCByZXQgPSBoYW5kbGVfdm04Nl90cmFwKChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKSByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIpOworCQlpZiAocmV0KSBnb3RvIHRyYXBfc2lnbmFsOworCQlyZXR1cm47CisJfQorfQorCisjZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpIFwKKwkJCQkJCT09IE5PVElGWV9TVE9QKSBcCisJCXJldHVybjsgXAorCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCAwLCByZWdzLCBlcnJvcl9jb2RlLCBOVUxMKTsgXAorfQorCisjZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMCwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKKyNkZWZpbmUgRE9fVk04Nl9FUlJPUih0cmFwbnIsIHNpZ25yLCBzdHIsIG5hbWUpIFwKK2Zhc3RjYWxsIHZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKSBcCit7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7IFwKK30KKworI2RlZmluZSBET19WTTg2X0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKK0RPX1ZNODZfRVJST1JfSU5GTyggMCwgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsIGRpdmlkZV9lcnJvciwgRlBFX0lOVERJViwgcmVncy0+ZWlwKQorI2lmbmRlZiBDT05GSUdfS1BST0JFUworRE9fVk04Nl9FUlJPUiggMywgU0lHVFJBUCwgImludDMiLCBpbnQzKQorI2VuZGlmCitET19WTTg2X0VSUk9SKCA0LCBTSUdTRUdWLCAib3ZlcmZsb3ciLCBvdmVyZmxvdykKK0RPX1ZNODZfRVJST1IoIDUsIFNJR1NFR1YsICJib3VuZHMiLCBib3VuZHMpCitET19FUlJPUl9JTkZPKCA2LCBTSUdJTEwsICAiaW52YWxpZCBvcGVyYW5kIiwgaW52YWxpZF9vcCwgSUxMX0lMTE9QTiwgcmVncy0+ZWlwKQorRE9fRVJST1IoIDksIFNJR0ZQRSwgICJjb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLCBjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCitET19FUlJPUigxMCwgU0lHU0VHViwgImludmFsaWQgVFNTIiwgaW52YWxpZF9UU1MpCitET19FUlJPUigxMSwgU0lHQlVTLCAgInNlZ21lbnQgbm90IHByZXNlbnQiLCBzZWdtZW50X25vdF9wcmVzZW50KQorRE9fRVJST1IoMTIsIFNJR0JVUywgICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKK0RPX0VSUk9SX0lORk8oMTcsIFNJR0JVUywgImFsaWdubWVudCBjaGVjayIsIGFsaWdubWVudF9jaGVjaywgQlVTX0FEUkFMTiwgMCkKKworZmFzdGNhbGwgdm9pZCBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIGxhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBJZiB0aGUgVFNTIGhhcyBhbgorCSAqIGludmFsaWQgb2Zmc2V0IHNldCAodGhlIExBWlkgb25lKSBhbmQgdGhlIGZhdWx0aW5nIHRocmVhZCBoYXMKKwkgKiBhIHZhbGlkIEkvTyBiaXRtYXAgcG9pbnRlciwgd2UgY29weSB0aGUgSS9PIGJpdG1hcCBpbiB0aGUgVFNTCisJICogYW5kIHdlIHNldCB0aGUgb2Zmc2V0IGZpZWxkIGNvcnJlY3RseS4gVGhlbiB3ZSBsZXQgdGhlIENQVSB0bworCSAqIHJlc3RhcnQgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLgorCSAqLworCWlmICh0c3MtPmlvX2JpdG1hcF9iYXNlID09IElOVkFMSURfSU9fQklUTUFQX09GRlNFVF9MQVpZICYmCisJICAgIHRocmVhZC0+aW9fYml0bWFwX3B0cikgeworCQltZW1jcHkodHNzLT5pb19iaXRtYXAsIHRocmVhZC0+aW9fYml0bWFwX3B0ciwKKwkJICAgICAgIHRocmVhZC0+aW9fYml0bWFwX21heCk7CisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91c2x5IHNldCBtYXAgd2FzIGV4dGVuZGluZyB0byBoaWdoZXIgcG9ydHMKKwkJICogdGhhbiB0aGUgY3VycmVudCBvbmUsIHBhZCBleHRyYSBzcGFjZSB3aXRoIDB4ZmYgKG5vIGFjY2VzcykuCisJCSAqLworCQlpZiAodGhyZWFkLT5pb19iaXRtYXBfbWF4IDwgdHNzLT5pb19iaXRtYXBfbWF4KQorCQkJbWVtc2V0KChjaGFyICopIHRzcy0+aW9fYml0bWFwICsKKwkJCQl0aHJlYWQtPmlvX2JpdG1hcF9tYXgsIDB4ZmYsCisJCQkJdHNzLT5pb19iaXRtYXBfbWF4IC0gdGhyZWFkLT5pb19iaXRtYXBfbWF4KTsKKwkJdHNzLT5pb19iaXRtYXBfbWF4ID0gdGhyZWFkLT5pb19iaXRtYXBfbWF4OworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU9fQklUTUFQX09GRlNFVDsKKwkJcHV0X2NwdSgpOworCQlyZXR1cm47CisJfQorCXB1dF9jcHUoKTsKKworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKQorCQlnb3RvIGdwX2luX3ZtODY7CisKKwlpZiAoIShyZWdzLT54Y3MgJiAzKSkKKwkJZ290byBncF9pbl9rZXJuZWw7CisKKwljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxMzsKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuOworCitncF9pbl92bTg2OgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloYW5kbGVfdm04Nl9mYXVsdCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSk7CisJcmV0dXJuOworCitncF9pbl9rZXJuZWw6CisJaWYgKCFmaXh1cF9leGNlcHRpb24ocmVncykpIHsKKwkJaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCisJCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworCQlkaWUoImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWVtX3Bhcml0eV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXByaW50aygiVWhodWguIE5NSSByZWNlaXZlZC4gRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIllvdSBwcm9iYWJseSBoYXZlIGEgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHlvdXIgUkFNIGNoaXBzXG4iKTsKKworCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBtZW1vcnkgcGFyaXR5IGVycm9yIGxpbmUuICovCisJY2xlYXJfbWVtX2Vycm9yKHJlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2NoZWNrX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRrKCJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pXG4iKTsKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKworCS8qIFJlLWVuYWJsZSB0aGUgSU9DSyBsaW5lLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzICovCisJcmVhc29uID0gKHJlYXNvbiAmIDB4ZikgfCA4OworCW91dGIocmVhc29uLCAweDYxKTsKKwlpID0gMjAwMDsKKwl3aGlsZSAoLS1pKSB1ZGVsYXkoMTAwMCk7CisJcmVhc29uICY9IH44OworCW91dGIocmVhc29uLCAweDYxKTsKK30KKworc3RhdGljIHZvaWQgdW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyNpZmRlZiBDT05GSUdfTUNBCisJLyogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQorCSogaXMuICovCisJaWYoIE1DQV9idXMgKSB7CisJCW1jYV9oYW5kbGVfbm1pKCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gQ1BVICVkLlxuIiwKKwkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50aygiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm1pX3ByaW50X2xvY2spOworCit2b2lkIGRpZV9ubWkgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpCit7CisJc3Bpbl9sb2NrKCZubWlfcHJpbnRfbG9jayk7CisJLyoKKwkqIFdlIGFyZSBpbiB0cm91YmxlIGFueXdheSwgbGV0cyBhdCBsZWFzdCB0cnkKKwkqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0LgorCSovCisJYnVzdF9zcGlubG9ja3MoMSk7CisJcHJpbnRrKG1zZyk7CisJcHJpbnRrKCIgb24gQ1BVJWQsIGVpcCAlMDhseCwgcmVnaXN0ZXJzOlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzLT5laXApOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXByaW50aygiY29uc29sZSBzaHV0cyB1cCAuLi5cbiIpOworCWNvbnNvbGVfc2lsZW50KCk7CisJc3Bpbl91bmxvY2soJm5taV9wcmludF9sb2NrKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkb19leGl0KFNJR1NFR1YpOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgY2hhciByZWFzb24gPSAwOworCisJLyogT25seSB0aGUgQlNQIGdldHMgZXh0ZXJuYWwgTk1JcyBmcm9tIHRoZSBzeXN0ZW0uICAqLworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOworIAorCWlmICghKHJlYXNvbiAmIDB4YzApKSB7CisJCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKQorCQkJCQkJCT09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQkvKgorCQkgKiBPaywgc28gdGhpcyBpcyBub25lIG9mIHRoZSBkb2N1bWVudGVkIE5NSSBzb3VyY2VzLAorCQkgKiBzbyBpdCBtdXN0IGJlIHRoZSBOTUkgd2F0Y2hkb2cuCisJCSAqLworCQlpZiAobm1pX3dhdGNoZG9nKSB7CisJCQlubWlfd2F0Y2hkb2dfdGljayhyZWdzKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJCXJldHVybjsKKwl9CisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCWlmIChyZWFzb24gJiAweDgwKQorCQltZW1fcGFyaXR5X2Vycm9yKHJlYXNvbiwgcmVncyk7CisJaWYgKHJlYXNvbiAmIDB4NDApCisJCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJLyoKKwkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlIG1lYW53aGlsZQorCSAqIGFzIGl0J3MgZWRnZS10cmlnZ2VyZWQuCisJICovCisJcmVhc3NlcnRfbm1pKCk7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBubWlfY2FsbGJhY2tfdCBubWlfY2FsbGJhY2sgPSBkdW1teV9ubWlfY2FsbGJhY2s7CisgCitmYXN0Y2FsbCB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpbnQgY3B1OworCisJbm1pX2VudGVyKCk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJKytubWlfY291bnQoY3B1KTsKKworCWlmICghbm1pX2NhbGxiYWNrKHJlZ3MsIGNwdSkpCisJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCisJbm1pX2V4aXQoKTsKK30KKwordm9pZCBzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFja190IGNhbGxiYWNrKQoreworCW5taV9jYWxsYmFjayA9IGNhbGxiYWNrOworfQorCit2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQoreworCW5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKK30KKworI2lmZGVmIENPTkZJR19LUFJPQkVTCitmYXN0Y2FsbCBpbnQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApCisJCQk9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuIDE7CisJLyogVGhpcyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSwgYmVjYXVzZSBrcHJvYmVzIHdhbnRzIGludGVycnVwdHMKKwlkaXNhYmxlZC4gIE5vcm1hbCB0cmFwIGhhbmRsZXJzIGRvbid0LiAqLworCXJlc3RvcmVfaW50ZXJydXB0cyhyZWdzKTsKKwlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIE91ciBoYW5kbGluZyBvZiB0aGUgcHJvY2Vzc29yIGRlYnVnIHJlZ2lzdGVycyBpcyBub24tdHJpdmlhbC4KKyAqIFdlIGRvIG5vdCBjbGVhciB0aGVtIG9uIGVudHJ5IGFuZCBleGl0IGZyb20gdGhlIGtlcm5lbC4gVGhlcmVmb3JlCisgKiBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYSB3YXRjaHBvaW50IHRyYXAgaGVyZSBmcm9tIGluc2lkZSB0aGUga2VybmVsLgorICogSG93ZXZlciwgdGhlIGNvZGUgaW4gLi9wdHJhY2UuYyBoYXMgZW5zdXJlZCB0aGF0IHRoZSB1c2VyIGNhbgorICogb25seSBzZXQgd2F0Y2hwb2ludHMgb24gdXNlcnNwYWNlIGFkZHJlc3Nlcy4gVGhlcmVmb3JlIHRoZSBpbi1rZXJuZWwKKyAqIHdhdGNocG9pbnQgdHJhcCBjYW4gb25seSBvY2N1ciBpbiBjb2RlIHdoaWNoIGlzIHJlYWRpbmcvd3JpdGluZworICogZnJvbSB1c2VyIHNwYWNlLiBTdWNoIGNvZGUgbXVzdCBub3QgaG9sZCBrZXJuZWwgbG9ja3MgKHNpbmNlIGl0CisgKiBjYW4gZXF1YWxseSB0YWtlIGEgcGFnZSBmYXVsdCksIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGNhbGwKKyAqIGZvcmNlX3NpZ19pbmZvIGV2ZW4gdGhvdWdoIHRoYXQgY2xhaW1zIGFuZCByZWxlYXNlcyBsb2Nrcy4KKyAqIAorICogQ29kZSBpbiAuL3NpZ25hbC5jIGVuc3VyZXMgdGhhdCB0aGUgZGVidWcgY29udHJvbCByZWdpc3RlcgorICogaXMgcmVzdG9yZWQgYmVmb3JlIHdlIGRlbGl2ZXIgYW55IHNpZ25hbCwgYW5kIHRoZXJlZm9yZSB0aGF0CisgKiB1c2VyIGNvZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgZXZlbiB0aG91Z2gKKyAqIHdlIGNsZWFyIGl0IGhlcmUuCisgKgorICogQmVpbmcgY2FyZWZ1bCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBiZSBhcyBjYXJlZnVsIGluIGEKKyAqIGxvdCBvZiBtb3JlIGNvbXBsaWNhdGVkIHBsYWNlcyAodGFzayBzd2l0Y2hpbmcgY2FuIGJlIGEgYml0IGxhenkKKyAqIGFib3V0IHJlc3RvcmluZyBhbGwgdGhlIGRlYnVnIHN0YXRlLCBhbmQgcHRyYWNlIGRvZXNuJ3QgaGF2ZSB0bworICogZmluZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSBURiBiaXQgdGhhdCBjb3VsZCBiZSBzYXZlZCBhd2F5IGV2ZW4KKyAqIGJ5IHVzZXIgY29kZSkKKyAqLworZmFzdGNhbGwgdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgY29uZGl0aW9uOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZGI2LCUwIiA6ICI9ciIgKGNvbmRpdGlvbikpOworCisJaWYgKG5vdGlmeV9kaWUoRElFX0RFQlVHLCAiZGVidWciLCByZWdzLCBjb25kaXRpb24sIGVycm9yX2NvZGUsCisJCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJLyogSXQncyBzYWZlIHRvIGFsbG93IGlycSdzIGFmdGVyIERSNiBoYXMgYmVlbiBzYXZlZCAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKiBNYXNrIG91dCBzcHVyaW91cyBkZWJ1ZyB0cmFwcyBkdWUgdG8gbGF6eSBEUjcgc2V0dGluZyAqLworCWlmIChjb25kaXRpb24gJiAoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpKSB7CisJCWlmICghdHNrLT50aHJlYWQuZGVidWdyZWdbN10pCisJCQlnb3RvIGNsZWFyX2RyNzsKKwl9CisKKwlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykKKwkJZ290byBkZWJ1Z192bTg2OworCisJLyogU2F2ZSBkZWJ1ZyBzdGF0dXMgcmVnaXN0ZXIgd2hlcmUgcHRyYWNlIGNhbiBzZWUgaXQgKi8KKwl0c2stPnRocmVhZC5kZWJ1Z3JlZ1s2XSA9IGNvbmRpdGlvbjsKKworCS8qCisJICogU2luZ2xlLXN0ZXBwaW5nIHRocm91Z2ggVEY6IG1ha2Ugc3VyZSB3ZSBpZ25vcmUgYW55IGV2ZW50cyBpbgorCSAqIGtlcm5lbCBzcGFjZSAoYnV0IHJlLWVuYWJsZSBURiB3aGVuIHJldHVybmluZyB0byB1c2VyIG1vZGUpLgorCSAqLworCWlmIChjb25kaXRpb24gJiBEUl9TVEVQKSB7CisJCS8qCisJCSAqIFdlIGFscmVhZHkgY2hlY2tlZCB2ODYgbW9kZSBhYm92ZSwgc28gd2UgY2FuCisJCSAqIGNoZWNrIGZvciBrZXJuZWwgbW9kZSBieSBqdXN0IGNoZWNraW5nIHRoZSBDUEwKKwkJICogb2YgQ1MuCisJCSAqLworCQlpZiAoKHJlZ3MtPnhjcyAmIDMpID09IDApCisJCQlnb3RvIGNsZWFyX1RGX3JlZW5hYmxlOworCX0KKworCS8qIE9rLCBmaW5hbGx5IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlICovCisJc2VuZF9zaWd0cmFwKHRzaywgcmVncywgZXJyb3JfY29kZSk7CisKKwkvKiBEaXNhYmxlIGFkZGl0aW9uYWwgdHJhcHMuIFRoZXknbGwgYmUgcmUtZW5hYmxlZCB3aGVuCisJICogdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQuCisJICovCitjbGVhcl9kcjc6CisJX19hc21fXygibW92bCAlMCwlJWRiNyIKKwkJOiAvKiBubyBvdXRwdXQgKi8KKwkJOiAiciIgKDApKTsKKwlyZXR1cm47CisKK2RlYnVnX3ZtODY6CisJaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSwgMSk7CisJcmV0dXJuOworCitjbGVhcl9URl9yZWVuYWJsZToKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1NJTkdMRVNURVApOworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgd2UgcGxheSBhcm91bmQgd2l0aCB0aGUgJ1RTJyBiaXQgaW4gYW4gYXR0ZW1wdCB0byBnZXQKKyAqIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXN5bmNocm9ub3VzCisgKiBJUlExMyBiZWhhdmlvdXIKKyAqLwordm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICplaXApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICogdGFzazsKKwlzaWdpbmZvX3QgaW5mbzsKKwl1bnNpZ25lZCBzaG9ydCBjd2QsIHN3ZDsKKworCS8qCisJICogU2F2ZSB0aGUgaW5mbyBmb3IgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCBjbGVhciB0aGUgZXJyb3IuCisJICovCisJdGFzayA9IGN1cnJlbnQ7CisJc2F2ZV9pbml0X2ZwdSh0YXNrKTsKKwl0YXNrLT50aHJlYWQudHJhcF9ubyA9IDE2OworCXRhc2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKKwlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IF9fU0lfRkFVTFQ7CisJaW5mby5zaV9hZGRyID0gZWlwOworCS8qCisJICogKH5jd2QgJiBzd2QpIHdpbGwgbWFzayBvdXQgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3Qgc2V0IHRvIHVubWFza2VkCisJICogc3RhdHVzLiAgMHgzZiBpcyB0aGUgZXhjZXB0aW9uIGJpdHMgaW4gdGhlc2UgcmVncywgMHgyMDAgaXMgdGhlCisJICogQzEgcmVnIHlvdSBuZWVkIGluIGNhc2Ugb2YgYSBzdGFjayBmYXVsdCwgMHgwNDAgaXMgdGhlIHN0YWNrCisJICogZmF1bHQgYml0LiAgV2Ugc2hvdWxkIG9ubHkgYmUgdGFraW5nIG9uZSBleGNlcHRpb24gYXQgYSB0aW1lLAorCSAqIHNvIGlmIHRoaXMgY29tYmluYXRpb24gZG9lc24ndCBwcm9kdWNlIGFueSBzaW5nbGUgZXhjZXB0aW9uLAorCSAqIHRoZW4gd2UgaGF2ZSBhIGJhZCBwcm9ncmFtIHRoYXQgaXNuJ3Qgc3luY3Jvbml6aW5nIGl0cyBGUFUgdXNhZ2UKKwkgKiBhbmQgaXQgd2lsbCBzdWZmZXIgdGhlIGNvbnNlcXVlbmNlcyBzaW5jZSB3ZSB3b24ndCBiZSBhYmxlIHRvCisJICogZnVsbHkgcmVwcm9kdWNlIHRoZSBjb250ZXh0IG9mIHRoZSBleGNlcHRpb24KKwkgKi8KKwljd2QgPSBnZXRfZnB1X2N3ZCh0YXNrKTsKKwlzd2QgPSBnZXRfZnB1X3N3ZCh0YXNrKTsKKwlzd2l0Y2ggKCgofmN3ZCkgJiBzd2QgJiAweDNmKSB8IChzd2QgJiAweDI0MCkpIHsKKwkJY2FzZSAweDAwMDoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCisJCWNhc2UgMHgwNDE6IC8qIFN0YWNrIEZhdWx0ICovCisJCWNhc2UgMHgyNDE6IC8qIFN0YWNrIEZhdWx0IHwgRGlyZWN0aW9uICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQkJLyogU2hvdWxkIHdlIGNsZWFyIHRoZSBTRiBvciBsZXQgdXNlciBzcGFjZSBkbyBpdCA/Pz8/ICovCisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpZ25vcmVfZnB1X2lycSA9IDE7CisJbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5laXApOworfQorCitzdGF0aWMgdm9pZCBzaW1kX21hdGhfZXJyb3Iodm9pZCBfX3VzZXIgKmVpcCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOworCXNpZ2luZm9fdCBpbmZvOworCXVuc2lnbmVkIHNob3J0IG14Y3NyOworCisJLyoKKwkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KKwkgKi8KKwl0YXNrID0gY3VycmVudDsKKwlzYXZlX2luaXRfZnB1KHRhc2spOworCXRhc2stPnRocmVhZC50cmFwX25vID0gMTk7CisJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKKwlpbmZvLnNpX2FkZHIgPSBlaXA7CisJLyoKKwkgKiBUaGUgU0lNRCBGUFUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSwgYXMgdGhlcmUKKwkgKiBpcyBvbmx5IGEgc2luZ2xlIHN0YXR1cy9jb250cm9sIHJlZ2lzdGVyLiAgVGh1cywgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogdW5tYXNrZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2UgbXVzdCBtYXNrIHRoZSBleGNlcHRpb24gbWFzayBiaXRzCisJICogYXQgMHgxZjgwLCBhbmQgdGhlbiB1c2UgdGhlc2UgdG8gbWFzayB0aGUgZXhjZXB0aW9uIGJpdHMgYXQgMHgzZi4KKwkgKi8KKwlteGNzciA9IGdldF9mcHVfbXhjc3IodGFzayk7CisJc3dpdGNoICh+KChteGNzciAmIDB4MWY4MCkgPj4gNykgJiAobXhjc3IgJiAweDNmKSkgeworCQljYXNlIDB4MDAwOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCWNhc2UgMHgwMDE6IC8qIEludmFsaWQgT3AgKi8KKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJCQkJICBsb25nIGVycm9yX2NvZGUpCit7CisJaWYgKGNwdV9oYXNfeG1tKSB7CisJCS8qIEhhbmRsZSBTSU1EIEZQVSBleGNlcHRpb25zIG9uIFBJSUkrIHByb2Nlc3NvcnMuICovCisJCWlnbm9yZV9mcHVfaXJxID0gMTsKKwkJc2ltZF9tYXRoX2Vycm9yKCh2b2lkIF9fdXNlciAqKXJlZ3MtPmVpcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGFuZGxlIHN0cmFuZ2UgY2FjaGUgZmx1c2ggZnJvbSB1c2VyIHNwYWNlIGV4Y2VwdGlvbgorCQkgKiBpbiBhbGwgb3RoZXIgY2FzZXMuICBUaGlzIGlzIHVuZG9jdW1lbnRlZCBiZWhhdmlvdXIuCisJCSAqLworCQlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgeworCQkJaGFuZGxlX3ZtODZfZmF1bHQoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopcmVncywKKwkJCQkJICBlcnJvcl9jb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlkaWVfaWZfa2VybmVsKCJjYWNoZSBmbHVzaCBkZW5pZWQiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxOTsKKwkJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJfQorfQorCitmYXN0Y2FsbCB2b2lkIGRvX3NwdXJpb3VzX2ludGVycnVwdF9idWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCQkgIGxvbmcgZXJyb3JfY29kZSkKK3sKKyNpZiAwCisJLyogTm8gbmVlZCB0byB3YXJuIGFib3V0IHRoaXMgYW55IGxvbmdlci4gKi8KKwlwcmludGsoIklnbm9yaW5nIFA2IExvY2FsIEFQSUMgU3B1cmlvdXMgSW50ZXJydXB0IEJ1Zy4uLlxuIik7CisjZW5kaWYKK30KKworZmFzdGNhbGwgdm9pZCBzZXR1cF94ODZfYm9ndXNfc3RhY2sodW5zaWduZWQgY2hhciAqIHN0aykKK3sKKwl1bnNpZ25lZCBsb25nICpzd2l0Y2gxNl9wdHIsICpzd2l0Y2gzMl9wdHI7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0YWNrX2JvdDsKKwl1bnNpZ25lZCBzaG9ydCBpcmV0X2ZyYW1lMTZfb2ZmOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJLyogcmVzZXJ2ZSB0aGUgc3BhY2Ugb24gMzJiaXQgc3RhY2sgZm9yIHRoZSBtYWdpYyBzd2l0Y2gxNiBwb2ludGVyICovCisJbWVtbW92ZShzdGssIHN0ayArIDgsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXN3aXRjaDE2X3B0ciA9ICh1bnNpZ25lZCBsb25nICopKHN0ayArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilzdGs7CisJLyogbm93IHRoZSBzd2l0Y2gzMiBvbiAxNmJpdCBzdGFjayAqLworCXN0YWNrX2JvdCA9ICh1bnNpZ25lZCBsb25nKSZwZXJfY3B1KGNwdV8xNmJpdF9zdGFjaywgY3B1KTsKKwlzdGFja190b3AgPSBzdGFja19ib3QgKwlDUFVfMTZCSVRfU1RBQ0tfU0laRTsKKwlzd2l0Y2gzMl9wdHIgPSAodW5zaWduZWQgbG9uZyAqKShzdGFja190b3AgLSA4KTsKKwlpcmV0X2ZyYW1lMTZfb2ZmID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gMjA7CisJLyogY29weSBpcmV0IGZyYW1lIG9uIDE2Yml0IHN0YWNrICovCisJbWVtY3B5KCh2b2lkICopKHN0YWNrX2JvdCArIGlyZXRfZnJhbWUxNl9vZmYpLCAmcmVncy0+ZWlwLCAyMCk7CisJLyogZmlsbCBpbiB0aGUgc3dpdGNoIHBvaW50ZXJzICovCisJc3dpdGNoMTZfcHRyWzBdID0gKHJlZ3MtPmVzcCAmIDB4ZmZmZjAwMDApIHwgaXJldF9mcmFtZTE2X29mZjsKKwlzd2l0Y2gxNl9wdHJbMV0gPSBfX0VTUEZJWF9TUzsKKwlzd2l0Y2gzMl9wdHJbMF0gPSAodW5zaWduZWQgbG9uZylzdGsgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpICsKKwkJOCAtIENQVV8xNkJJVF9TVEFDS19TSVpFOworCXN3aXRjaDMyX3B0clsxXSA9IF9fS0VSTkVMX0RTOworfQorCitmYXN0Y2FsbCB1bnNpZ25lZCBjaGFyICogZml4dXBfeDg2X2JvZ3VzX3N0YWNrKHVuc2lnbmVkIHNob3J0IHNwKQoreworCXVuc2lnbmVkIGxvbmcgKnN3aXRjaDMyX3B0cjsKKwl1bnNpZ25lZCBjaGFyICpzdGFjazE2LCAqc3RhY2szMjsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RhY2tfYm90OworCWludCBsZW47CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdGFja19ib3QgPSAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfMTZiaXRfc3RhY2ssIGNwdSk7CisJc3RhY2tfdG9wID0gc3RhY2tfYm90ICsJQ1BVXzE2QklUX1NUQUNLX1NJWkU7CisJc3dpdGNoMzJfcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoc3RhY2tfdG9wIC0gOCk7CisJLyogY29weSB0aGUgZGF0YSBmcm9tIDE2Yml0IHN0YWNrIHRvIDMyYml0IHN0YWNrICovCisJbGVuID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gc3A7CisJc3RhY2sxNiA9ICh1bnNpZ25lZCBjaGFyICopKHN0YWNrX2JvdCArIHNwKTsKKwlzdGFjazMyID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJKHN3aXRjaDMyX3B0clswXSArIENQVV8xNkJJVF9TVEFDS19TSVpFIC0gOCAtIGxlbik7CisJbWVtY3B5KHN0YWNrMzIsIHN0YWNrMTYsIGxlbik7CisJcmV0dXJuIHN0YWNrMzI7Cit9CisKKy8qCisgKiAgJ21hdGhfc3RhdGVfcmVzdG9yZSgpJyBzYXZlcyB0aGUgY3VycmVudCBtYXRoIGluZm9ybWF0aW9uIGluIHRoZQorICogb2xkIG1hdGggc3RhdGUgYXJyYXksIGFuZCBnZXRzIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBjdXJyZW50IHRhc2sKKyAqCisgKiBDYXJlZnVsLi4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggSUJNLWRlc2lnbmVkIElSUTEzIGJlaGF2aW91ci4KKyAqIERvbid0IHRvdWNoIHVubGVzcyB5b3UgKnJlYWxseSoga25vdyBob3cgaXQgd29ya3MuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBrZXJuZWwgcHJlZW1wdGlvbiBkaXNhYmxlZCAoaW4gdGhpcyBjYXNlLAorICogbG9jYWwgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYXQgdGhlIGNhbGwtc2l0ZSBpbiBlbnRyeS5TKS4KKyAqLworYXNtbGlua2FnZSB2b2lkIG1hdGhfc3RhdGVfcmVzdG9yZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gdGhyZWFkLT50YXNrOworCisJY2x0cygpOwkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLworCWlmICghdHNrX3VzZWRfbWF0aCh0c2spKQorCQlpbml0X2ZwdSh0c2spOworCXJlc3RvcmVfZnB1KHRzayk7CisJdGhyZWFkLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsJLyogU28gd2UgZm5zYXZlIG9uIHN3aXRjaF90bygpICovCit9CisKKyNpZm5kZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCisKK2FzbWxpbmthZ2Ugdm9pZCBtYXRoX2VtdWxhdGUobG9uZyBhcmcpCit7CisJcHJpbnRrKCJtYXRoLWVtdWxhdGlvbiBub3QgZW5hYmxlZCBhbmQgbm8gY29wcm9jZXNzb3IgZm91bmQuXG4iKTsKKwlwcmludGsoImtpbGxpbmcgJXMuXG4iLGN1cnJlbnQtPmNvbW0pOworCWZvcmNlX3NpZyhTSUdGUEUsY3VycmVudCk7CisJc2NoZWR1bGUoKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19NQVRIX0VNVUxBVElPTiAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRwordm9pZCBfX2luaXQgdHJhcF9pbml0X2YwMGZfYnVnKHZvaWQpCit7CisJX19zZXRfZml4bWFwKEZJWF9GMDBGX0lEVCwgX19wYSgmaWR0X3RhYmxlKSwgUEFHRV9LRVJORUxfUk8pOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIElEVCBkZXNjcmlwdG9yIGFuZCByZWxvYWQgdGhlIElEVCBzbyB0aGF0CisJICogaXQgdXNlcyB0aGUgcmVhZC1vbmx5IG1hcHBlZCB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWR0X2Rlc2NyLmFkZHJlc3MgPSBmaXhfdG9fdmlydChGSVhfRjAwRl9JRFQpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWR0ICUwIiA6IDogIm0iIChpZHRfZGVzY3IpKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIF9zZXRfZ2F0ZShnYXRlX2FkZHIsdHlwZSxkcGwsYWRkcixzZWcpIFwKK2RvIHsgXAorICBpbnQgX19kMCwgX19kMTsgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdncgJSVkeCwlJWF4XG5cdCIgXAorCSJtb3Z3ICU0LCUlZHhcblx0IiBcCisJIm1vdmwgJSVlYXgsJTBcblx0IiBcCisJIm1vdmwgJSVlZHgsJTEiIFwKKwk6Ij1tIiAoKigobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCBcCisJICI9bSIgKCooMSsobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCAiPSZhIiAoX19kMCksICI9JmQiIChfX2QxKSBcCisJOiJpIiAoKHNob3J0KSAoMHg4MDAwKyhkcGw8PDEzKSsodHlwZTw8OCkpKSwgXAorCSAiMyIgKChjaGFyICopIChhZGRyKSksIjIiICgoc2VnKSA8PCAxNikpOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBUaGlzIG5lZWRzIHRvIHVzZSAnaWR0X3RhYmxlJyByYXRoZXIgdGhhbiAnaWR0JywgYW5kCisgKiB0aHVzIHVzZSB0aGUgX25vbm1hcHBlZF8gdmVyc2lvbiBvZiB0aGUgSURULCBhcyB0aGUKKyAqIFBlbnRpdW0gRjAgMEYgYnVnZml4IGNhbiBoYXZlIHJlc3VsdGVkIGluIHRoZSBtYXBwZWQKKyAqIElEVCBiZWluZyB3cml0ZS1wcm90ZWN0ZWQuCisgKi8KK3ZvaWQgc2V0X2ludHJfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdm9pZCAqYWRkcikKK3sKKwlfc2V0X2dhdGUoaWR0X3RhYmxlK24sMTQsMCxhZGRyLF9fS0VSTkVMX0NTKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHVwIGFuIGludGVycnVwdCBnYXRlIGF0IGRpcmVjdG9yeSBwcml2aWxlZ2UgbGV2ZWwgMy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9zeXN0ZW1faW50cl9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwgMTQsIDMsIGFkZHIsIF9fS0VSTkVMX0NTKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF90cmFwX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDAsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfc3lzdGVtX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDMsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfdGFza19nYXRlKHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgZ2R0X2VudHJ5KQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiw1LDAsMCwoZ2R0X2VudHJ5PDwzKSk7Cit9CisKKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0VJU0EKKwl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKDB4MEZGRkQ5LCA0KTsKKwlpZiAocmVhZGwocCkgPT0gJ0UnKygnSSc8PDgpKygnUyc8PDE2KSsoJ0EnPDwyNCkpIHsKKwkJRUlTQV9idXMgPSAxOworCX0KKwlpb3VubWFwKHApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwlpbml0X2FwaWNfbWFwcGluZ3MoKTsKKyNlbmRpZgorCisJc2V0X3RyYXBfZ2F0ZSgwLCZkaXZpZGVfZXJyb3IpOworCXNldF9pbnRyX2dhdGUoMSwmZGVidWcpOworCXNldF9pbnRyX2dhdGUoMiwmbm1pKTsKKwlzZXRfc3lzdGVtX2ludHJfZ2F0ZSgzLCAmaW50Myk7IC8qIGludDMtNSBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCisJc2V0X3N5c3RlbV9nYXRlKDQsJm92ZXJmbG93KTsKKwlzZXRfc3lzdGVtX2dhdGUoNSwmYm91bmRzKTsKKwlzZXRfdHJhcF9nYXRlKDYsJmludmFsaWRfb3ApOworCXNldF90cmFwX2dhdGUoNywmZGV2aWNlX25vdF9hdmFpbGFibGUpOworCXNldF90YXNrX2dhdGUoOCxHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKKwlzZXRfdHJhcF9nYXRlKDksJmNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bik7CisJc2V0X3RyYXBfZ2F0ZSgxMCwmaW52YWxpZF9UU1MpOworCXNldF90cmFwX2dhdGUoMTEsJnNlZ21lbnRfbm90X3ByZXNlbnQpOworCXNldF90cmFwX2dhdGUoMTIsJnN0YWNrX3NlZ21lbnQpOworCXNldF90cmFwX2dhdGUoMTMsJmdlbmVyYWxfcHJvdGVjdGlvbik7CisJc2V0X2ludHJfZ2F0ZSgxNCwmcGFnZV9mYXVsdCk7CisJc2V0X3RyYXBfZ2F0ZSgxNSwmc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyk7CisJc2V0X3RyYXBfZ2F0ZSgxNiwmY29wcm9jZXNzb3JfZXJyb3IpOworCXNldF90cmFwX2dhdGUoMTcsJmFsaWdubWVudF9jaGVjayk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwlzZXRfdHJhcF9nYXRlKDE4LCZtYWNoaW5lX2NoZWNrKTsKKyNlbmRpZgorCXNldF90cmFwX2dhdGUoMTksJnNpbWRfY29wcm9jZXNzb3JfZXJyb3IpOworCisJc2V0X3N5c3RlbV9nYXRlKFNZU0NBTExfVkVDVE9SLCZzeXN0ZW1fY2FsbCk7CisKKwkvKgorCSAqIFNob3VsZCBiZSBhIGJhcnJpZXIgZm9yIGFueSBleHRlcm5hbCBDUFUgc3RhdGUuCisJICovCisJY3B1X2luaXQoKTsKKworCXRyYXBfaW5pdF9ob29rKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtzdGFja19zZXR1cChjaGFyICpzKQoreworCWtzdGFja19kZXB0aF90b19wcmludCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOworCXJldHVybiAwOworfQorX19zZXR1cCgia3N0YWNrPSIsIGtzdGFja19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2Q1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3ZtODYuYwpAQCAtMCwwICsxLDgwNCBAQAorLyoKKyAqICBsaW51eC9rZXJuZWwvdm04Ni5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgMjkgZGVjIDIwMDEgLSBGaXhlZCBvb3BzZXMgY2F1c2VkIGJ5IHVuY2hlY2tlZCBhY2Nlc3MgdG8gdGhlIHZtODYKKyAqICAgICAgICAgICAgICAgIHN0YWNrIC0gTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKgorICogIDIyIG1hciAyMDAyIC0gTWFuZnJlZCBkZXRlY3RlZCB0aGUgc3RhY2tmYXVsdHMsIGJ1dCBkaWRuJ3QgaGFuZGxlCisgKiAgICAgICAgICAgICAgICB0aGVtIGNvcnJlY3RseS4gTm93IHRoZSBlbXVsYXRpb24gd2lsbCBiZSBpbiBhCisgKiAgICAgICAgICAgICAgICBjb25zaXN0ZW50IHN0YXRlIGFmdGVyIHN0YWNrZmF1bHRzIC0gS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogIDIyIG1hciAyMDAyIC0gQWRkZWQgbWlzc2luZyBjbGVhcl9JRiBpbiBzZXRfdmZsYWdzXyogS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogID8/ID8/PyAyMDAyIC0gRml4ZWQgcHJlbWF0dXJlIHJldHVybnMgZnJvbSBoYW5kbGVfdm04Nl9mYXVsdAorICogICAgICAgICAgICAgICAgY2F1c2VkIGJ5IEthc3BlciBEdXBvbnQncyBjaGFuZ2VzIC0gU3RhcyBTZXJnZWV2CisgKgorICogICA0IGFwciAyMDAyIC0gRml4ZWQgQ0hFQ0tfSUZfSU5fVFJBUCBicm9rZW4gYnkgU3RhcycgY2hhbmdlcy4KKyAqICAgICAgICAgICAgICAgIEthc3BlciBEdXBvbnQgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogICA5IGFwciAyMDAyIC0gQ2hhbmdlZCBzeW50YXggb2YgbWFjcm9zIGluIGhhbmRsZV92bTg2X2ZhdWx0LgorICogICAgICAgICAgICAgICAgS2FzcGVyIER1cG9udCA8a2FzcGVyZEBkYWltaS5hdS5kaz4KKyAqCisgKiAgIDkgYXByIDIwMDIgLSBDaGFuZ2VkIHN0YWNrIGFjY2VzcyBtYWNyb3MgdG8ganVtcCB0byBhIGxhYmVsCisgKiAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHJldHVybmluZyB0byB1c2Vyc3BhY2UuIFRoaXMgc2ltcGxpZmllcworICogICAgICAgICAgICAgICAgZG9faW50LCBhbmQgaXMgbmVlZGVkIGJ5IGhhbmRsZV92bTZfZmF1bHQuIEthc3BlcgorICogICAgICAgICAgICAgICAgRHVwb250IDxrYXNwZXJkQGRhaW1pLmF1LmRrPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyoKKyAqIEtub3duIHByb2JsZW1zOgorICoKKyAqIEludGVycnVwdCBoYW5kbGluZyBpcyBub3QgZ3VhcmFudGVlZDoKKyAqIC0gYSByZWFsIHg4NiB3aWxsIGRpc2FibGUgYWxsIGludGVycnVwdHMgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBhZnRlciBhICJtb3Ygc3MseHgiIHRvIG1ha2Ugc3RhY2sgaGFuZGxpbmcgYXRvbWljIGV2ZW4gd2l0aG91dAorICogICB0aGUgJ2xzcycgaW5zdHJ1Y3Rpb24uIFdlIGNhbid0IGd1YXJhbnRlZSB0aGlzIGluIHY4NiBtb2RlLAorICogICBhcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBtaWdodCByZXN1bHQgaW4gYSBwYWdlIGZhdWx0IG9yIHNpbWlsYXIuCisgKiAtIGEgcmVhbCB4ODYgd2lsbCBoYXZlIGludGVycnVwdHMgZGlzYWJsZWQgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBwYXN0IHRoZSAnc3RpJyB0aGF0IGVuYWJsZXMgdGhlbS4gV2UgZG9uJ3QgYm90aGVyIHdpdGggYWxsIHRoZQorICogICBkZXRhaWxzIHlldC4KKyAqCisgKiBMZXQncyBob3BlIHRoZXNlIHByb2JsZW1zIGRvIG5vdCBhY3R1YWxseSBtYXR0ZXIgZm9yIGFueXRoaW5nLgorICovCisKKworI2RlZmluZSBLVk04NgkoKHN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgKilyZWdzKQorI2RlZmluZSBWTVBJIAlLVk04Ni0+dm04NnBsdXMKKworCisvKgorICogOC0gYW5kIDE2LWJpdCByZWdpc3RlciBkZWZpbmVzLi4KKyAqLworI2RlZmluZSBBTChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzBdKQorI2RlZmluZSBBSChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzFdKQorI2RlZmluZSBJUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5laXApKQorI2RlZmluZSBTUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5lc3ApKQorCisvKgorICogdmlydHVhbCBmbGFncyAoMTYgYW5kIDMyLWJpdCB2ZXJzaW9ucykKKyAqLworI2RlZmluZSBWRkxBR1MJKCoodW5zaWduZWQgc2hvcnQgKikmKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykpCisjZGVmaW5lIFZFRkxBR1MJKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykKKworI2RlZmluZSBzZXRfZmxhZ3MoWCxuZXcsbWFzaykgXAorKChYKSA9ICgoWCkgJiB+KG1hc2spKSB8ICgobmV3KSAmIChtYXNrKSkpCisKKyNkZWZpbmUgU0FGRV9NQVNLCSgweERENSkKKyNkZWZpbmUgUkVUVVJOX01BU0sJKDB4REZGKQorCisjZGVmaW5lIFZNODZfUkVHU19QQVJUMiBvcmlnX2VheAorI2RlZmluZSBWTTg2X1JFR1NfU0laRTEgXAorICAgICAgICAoICh1bnNpZ25lZCkoICYgKCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikwKS0+Vk04Nl9SRUdTX1BBUlQyKSApICkKKyNkZWZpbmUgVk04Nl9SRUdTX1NJWkUyIChzaXplb2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MpIC0gVk04Nl9SRUdTX1NJWkUxKQorCitzdHJ1Y3QgcHRfcmVncyAqIEZBU1RDQUxMKHNhdmVfdjg2X3N0YXRlKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykpOworc3RydWN0IHB0X3JlZ3MgKiBmYXN0Y2FsbCBzYXZlX3Y4Nl9zdGF0ZShzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmV0OworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyoKKwkgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gZW50cnkuUyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGJ1dAorCSAqIGZyb20gcHJvY2VzcyBjb250ZXh0LiBFbmFibGUgaW50ZXJydXB0cyBoZXJlLCBiZWZvcmUgdHJ5aW5nCisJICogdG8gYWNjZXNzIHVzZXIgc3BhY2UuCisJICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKCFjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvKSB7CisJCXByaW50aygibm8gdm04Nl9pbmZvOiBCQURcbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBWRUZMQUdTLCBWSUZfTUFTSyB8IGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwl0bXAgPSBjb3B5X3RvX3VzZXIoJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnJlZ3MscmVncywgVk04Nl9SRUdTX1NJWkUxKTsKKwl0bXAgKz0gY29weV90b191c2VyKCZjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvLT5yZWdzLlZNODZfUkVHU19QQVJUMiwKKwkJJnJlZ3MtPlZNODZfUkVHU19QQVJUMiwgVk04Nl9SRUdTX1NJWkUyKTsKKwl0bXAgKz0gcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnNjcmVlbl9iaXRtYXAsJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnNjcmVlbl9iaXRtYXApOworCWlmICh0bXApIHsKKwkJcHJpbnRrKCJ2bTg2OiBjb3VsZCBub3QgYWNjZXNzIHVzZXJzcGFjZSB2bTg2X2luZm9cbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKworCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCWN1cnJlbnQtPnRocmVhZC5lc3AwID0gY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDA7CisJY3VycmVudC0+dGhyZWFkLnN5c2VudGVyX2NzID0gX19LRVJORUxfQ1M7CisJbG9hZF9lc3AwKHRzcywgJmN1cnJlbnQtPnRocmVhZCk7CisJY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDAgPSAwOworCXB1dF9jcHUoKTsKKworCWxvYWRzZWdtZW50KGZzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZnMpOworCWxvYWRzZWdtZW50KGdzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZ3MpOworCXJldCA9IEtWTTg2LT5yZWdzMzI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWFya19zY3JlZW5fcmRvbmx5KHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzaykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlLCAqbWFwcGVkOworCWludCBpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3Bpbl9sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXBnZCA9IHBnZF9vZmZzZXQodHNrLT5tbSwgMHhBMDAwMCk7CisJaWYgKHBnZF9ub25lX29yX2NsZWFyX2JhZChwZ2QpKQorCQlnb3RvIG91dDsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMHhBMDAwMCk7CisJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQorCQlnb3RvIG91dDsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMHhBMDAwMCk7CisJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQorCQlnb3RvIG91dDsKKwlwdGUgPSBtYXBwZWQgPSBwdGVfb2Zmc2V0X21hcChwbWQsIDB4QTAwMDApOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChwdGVfcHJlc2VudCgqcHRlKSkKKwkJCXNldF9wdGUocHRlLCBwdGVfd3Jwcm90ZWN0KCpwdGUpKTsKKwkJcHRlKys7CisJfQorCXB0ZV91bm1hcChtYXBwZWQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CisJZmx1c2hfdGxiKCk7Cit9CisKKworCitzdGF0aWMgaW50IGRvX3ZtODZfaXJxX2hhbmRsaW5nKGludCBzdWJmdW5jdGlvbiwgaW50IGlycW51bWJlcik7CitzdGF0aWMgdm9pZCBkb19zeXNfdm04NihzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0ICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKK2FzbWxpbmthZ2UgaW50IHN5c192bTg2b2xkKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqdjg2ID0gKHN0cnVjdCB2bTg2X3N0cnVjdCBfX3VzZXIgKilyZWdzLmVieDsKKwlzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0IGluZm87IC8qIGRlY2xhcmUgdGhpcyBfb24gdG9wXywKKwkJCQkJICogdGhpcyBhdm9pZHMgd2FzdGluZyBvZiBzdGFjayBzcGFjZS4KKwkJCQkJICogVGhpcyByZW1haW5zIG9uIHRoZSBzdGFjayB1bnRpbCB3ZQorCQkJCQkgKiByZXR1cm4gdG8gMzIgYml0IHVzZXIgc3BhY2UuCisJCQkJCSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCB0bXAsIHJldCA9IC1FUEVSTTsKKworCXRzayA9IGN1cnJlbnQ7CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnZtODZwbHVzIC0gKGxvbmcpJmluZm8ucmVncy5WTTg2X1JFR1NfUEFSVDIpOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKHRtcCkKKwkJZ290byBvdXQ7CisJbWVtc2V0KCZpbmZvLnZtODZwbHVzLCAwLCAoaW50KSZpbmZvLnJlZ3MzMiAtIChpbnQpJmluZm8udm04NnBsdXMpOworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJdHNrLT50aHJlYWQudm04Nl9pbmZvID0gdjg2OworCWRvX3N5c192bTg2KCZpbmZvLCB0c2spOworCXJldCA9IDA7CS8qIHdlIG5ldmVyIHJldHVybiBoZXJlICovCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCithc21saW5rYWdlIGludCBzeXNfdm04NihzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgaW5mbzsgLyogZGVjbGFyZSB0aGlzIF9vbiB0b3BfLAorCQkJCQkgKiB0aGlzIGF2b2lkcyB3YXN0aW5nIG9mIHN0YWNrIHNwYWNlLgorCQkJCQkgKiBUaGlzIHJlbWFpbnMgb24gdGhlIHN0YWNrIHVudGlsIHdlCisJCQkJCSAqIHJldHVybiB0byAzMiBiaXQgdXNlciBzcGFjZS4KKwkJCQkJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IHRtcCwgcmV0OworCXN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgX191c2VyICp2ODY7CisKKwl0c2sgPSBjdXJyZW50OworCXN3aXRjaCAocmVncy5lYngpIHsKKwkJY2FzZSBWTTg2X1JFUVVFU1RfSVJROgorCQljYXNlIFZNODZfRlJFRV9JUlE6CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6CisJCWNhc2UgVk04Nl9HRVRfQU5EX1JFU0VUX0lSUToKKwkJCXJldCA9IGRvX3ZtODZfaXJxX2hhbmRsaW5nKHJlZ3MuZWJ4LCAoaW50KXJlZ3MuZWN4KTsKKwkJCWdvdG8gb3V0OworCQljYXNlIFZNODZfUExVU19JTlNUQUxMX0NIRUNLOgorCQkJLyogTk9URTogb24gb2xkIHZtODYgc3R1ZmYgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IKKwkJCSAgIGZyb20gdmVyaWZ5X2FyZWEoKSwgYmVjYXVzZSB0aGUgc3ViZnVuY3Rpb24gaXMKKwkJCSAgIGludGVycHJldGVkIGFzIChpbnZhbGlkKSBhZGRyZXNzIHRvIHZtODZfc3RydWN0LgorCQkJICAgU28gdGhlIGluc3RhbGxhdGlvbiBjaGVjayB3b3Jrcy4KKwkJCSAqLworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBmdW5jdGlvbnMgVk04Nl9FTlRFUiwgVk04Nl9FTlRFUl9OT19CWVBBU1MgKi8KKwlyZXQgPSAtRVBFUk07CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXY4NiA9IChzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IF9fdXNlciAqKXJlZ3MuZWN4OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnJlZ3MzMiAtIChsb25nKSZpbmZvLnJlZ3MuVk04Nl9SRUdTX1BBUlQyKTsKKwlyZXQgPSAtRUZBVUxUOworCWlmICh0bXApCisJCWdvdG8gb3V0OworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJaW5mby52bTg2cGx1cy5pc192bTg2cHVzID0gMTsKKwl0c2stPnRocmVhZC52bTg2X2luZm8gPSAoc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqKXY4NjsKKwlkb19zeXNfdm04NigmaW5mbywgdHNrKTsKKwlyZXQgPSAwOwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgZG9fc3lzX3ZtODYoc3RydWN0IGtlcm5lbF92bTg2X3N0cnVjdCAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKy8qCisgKiBtYWtlIHN1cmUgdGhlIHZtODYoKSBzeXN0ZW0gY2FsbCBkb2Vzbid0IHRyeSB0byBkbyBhbnl0aGluZyBzaWxseQorICovCisJaW5mby0+cmVncy5fX251bGxfZHMgPSAwOworCWluZm8tPnJlZ3MuX19udWxsX2VzID0gMDsKKworLyogd2UgYXJlIGNsZWFyaW5nIGZzLGdzIGxhdGVyIGp1c3QgYmVmb3JlICJqbXAgcmVzdW1lX3VzZXJzcGFjZSIsCisgKiBiZWNhdXNlIHN0YXJ0aW5nIHdpdGggTGludXggMi4xLnggdGhleSBhcmVuJ3Qgbm8gbG9uZ2VyIHNhdmVkL3Jlc3RvcmVkCisgKi8KKworLyoKKyAqIFRoZSBlZmxhZ3MgcmVnaXN0ZXIgaXMgYWxzbyBzcGVjaWFsOiB3ZSBjYW5ub3QgdHJ1c3QgdGhhdCB0aGUgdXNlcgorICogaGFzIHNldCBpdCB1cCBzYWZlbHksIHNvIHRoaXMgbWFrZXMgc3VyZSBpbnRlcnJ1cHQgZXRjIGZsYWdzIGFyZQorICogaW5oZXJpdGVkIGZyb20gcHJvdGVjdGVkIG1vZGUuCisgKi8KKyAJVkVGTEFHUyA9IGluZm8tPnJlZ3MuZWZsYWdzOworCWluZm8tPnJlZ3MuZWZsYWdzICY9IFNBRkVfTUFTSzsKKwlpbmZvLT5yZWdzLmVmbGFncyB8PSBpbmZvLT5yZWdzMzItPmVmbGFncyAmIH5TQUZFX01BU0s7CisJaW5mby0+cmVncy5lZmxhZ3MgfD0gVk1fTUFTSzsKKworCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKKwkJY2FzZSBDUFVfMjg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfMzg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IE5UX01BU0sgfCBJT1BMX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfNDg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0c2stPnRocmVhZC52ODZtYXNrID0gSURfTUFTSyB8IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJfQorCisvKgorICogU2F2ZSBvbGQgc3RhdGUsIHNldCBkZWZhdWx0IHJldHVybiB2YWx1ZSAoJWVheCkgdG8gMAorICovCisJaW5mby0+cmVnczMyLT5lYXggPSAwOworCXRzay0+dGhyZWFkLnNhdmVkX2VzcDAgPSB0c2stPnRocmVhZC5lc3AwOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWZzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9mcykpOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWdzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9ncykpOworCisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisJdHNrLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAmaW5mby0+Vk04Nl9UU1NfRVNQMDsKKwlpZiAoY3B1X2hhc19zZXApCisJCXRzay0+dGhyZWFkLnN5c2VudGVyX2NzID0gMDsKKwlsb2FkX2VzcDAodHNzLCAmdHNrLT50aHJlYWQpOworCXB1dF9jcHUoKTsKKworCXRzay0+dGhyZWFkLnNjcmVlbl9iaXRtYXAgPSBpbmZvLT5zY3JlZW5fYml0bWFwOworCWlmIChpbmZvLT5mbGFncyAmIFZNODZfU0NSRUVOX0JJVE1BUCkKKwkJbWFya19zY3JlZW5fcmRvbmx5KHRzayk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJ4b3JsICUlZWF4LCUlZWF4OyBtb3ZsICUlZWF4LCUlZnM7IG1vdmwgJSVlYXgsJSVnc1xuXHQiCisJCSJtb3ZsICUwLCUlZXNwXG5cdCIKKwkJIm1vdmwgJTEsJSVlYnBcblx0IgorCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCisJCTogLyogbm8gb3V0cHV0cyAqLworCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodHNrLT50aHJlYWRfaW5mbykgOiAiYXgiKTsKKwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmV0dXJuX3RvXzMyYml0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVnczE2LCBpbnQgcmV0dmFsKQoreworCXN0cnVjdCBwdF9yZWdzICogcmVnczMyOworCisJcmVnczMyID0gc2F2ZV92ODZfc3RhdGUocmVnczE2KTsKKwlyZWdzMzItPmVheCA9IHJldHZhbDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlMCwlJWVzcFxuXHQiCisJCSJtb3ZsICUxLCUlZWJwXG5cdCIKKwkJImptcCByZXN1bWVfdXNlcnNwYWNlIgorCQk6IDogInIiIChyZWdzMzIpLCAiciIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0lGKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwlWRUZMQUdTIHw9IFZJRl9NQVNLOworCWlmIChWRUZMQUdTICYgVklQX01BU0spCisJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1NUSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9JRihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJVkVGTEFHUyAmPSB+VklGX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9URihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfQUMoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXJlZ3MtPmVmbGFncyAmPSB+QUNfTUFTSzsKK30KKworLyogSXQgaXMgY29ycmVjdCB0byBjYWxsIHNldF9JRihyZWdzKSBmcm9tIHRoZSBzZXRfdmZsYWdzXyoKKyAqIGZ1bmN0aW9ucy4gSG93ZXZlciBzb21lb25lIGZvcmdvdCB0byBjYWxsIGNsZWFyX0lGKHJlZ3MpCisgKiBpbiB0aGUgb3Bwb3NpdGUgY2FzZS4KKyAqIEFmdGVyIHRoZSBjb21tYW5kIHNlcXVlbmNlIENMSSBQVVNIRiBTVEkgUE9QRiB5b3Ugc2hvdWxkCisgKiBlbmQgdXAgd2l0aCBpbnRlcnJ1cHMgZGlzYWJsZWQsIGJ1dCB5b3UgZW5kZWQgdXAgd2l0aAorICogaW50ZXJydXB0cyBlbmFibGVkLgorICogICggSSB3YXMgdGVzdGluZyBteSBvd24gY2hhbmdlcywgYnV0IHRoZSBvbmx5IGJ1ZyBJCisgKiAgICBjb3VsZCBmaW5kIHdhcyBpbiBhIGZ1bmN0aW9uIEkgaGFkIG5vdCBjaGFuZ2VkLiApCisgKiBbS0RdCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF92ZmxhZ3NfbG9uZyh1bnNpZ25lZCBsb25nIGVmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRUZMQUdTLCBlZmxhZ3MsIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBlZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGVmbGFncyAmIElGX01BU0spCisJCXNldF9JRihyZWdzKTsKKwllbHNlCisJCWNsZWFyX0lGKHJlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3ZmbGFnc19zaG9ydCh1bnNpZ25lZCBzaG9ydCBmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRkxBR1MsIGZsYWdzLCBjdXJyZW50LT50aHJlYWQudjg2bWFzayk7CisJc2V0X2ZsYWdzKHJlZ3MtPmVmbGFncywgZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGZsYWdzICYgSUZfTUFTSykKKwkJc2V0X0lGKHJlZ3MpOworCWVsc2UKKwkJY2xlYXJfSUYocmVncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdmZsYWdzKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gcmVncy0+ZWZsYWdzICYgUkVUVVJOX01BU0s7CisKKwlpZiAoVkVGTEFHUyAmIFZJRl9NQVNLKQorCQlmbGFncyB8PSBJRl9NQVNLOworCWZsYWdzIHw9IElPUExfTUFTSzsKKwlyZXR1cm4gZmxhZ3MgfCAoVkVGTEFHUyAmIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcmV2ZWN0b3JlZChpbnQgbnIsIHN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCAqIGJpdG1hcCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnRsICUyLCUxXG5cdHNiYmwgJTAsJTAiCisJCToiPXIiIChucikKKwkJOiJtIiAoKmJpdG1hcCksInIiIChucikpOworCXJldHVybiBucjsKK30KKworI2RlZmluZSB2YWxfYnl0ZSh2YWwsIG4pICgoKF9fdTggKikmdmFsKVtuXSkKKworI2RlZmluZSBwdXNoYihiYXNlLCBwdHIsIHZhbCwgZXJyX2xhYmVsKSBcCisJZG8geyBcCisJCV9fdTggX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKF9fdmFsLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2h3KGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MTYgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAxKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2hsKGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MzIgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAzKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDIpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0ci0tOyBcCisJCWlmIChwdXRfdXNlcih2YWxfYnl0ZShfX3ZhbCwgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBwb3BiKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3U4IF9fcmVzOyBcCisJCWlmIChnZXRfdXNlcihfX3JlcywgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlfX3JlczsgXAorCX0pCisKKyNkZWZpbmUgcG9wdyhiYXNlLCBwdHIsIGVycl9sYWJlbCkgXAorCSh7IFwKKwkJX191MTYgX19yZXM7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDEpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworI2RlZmluZSBwb3BsKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3UzMiBfX3JlczsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCWlmIChnZXRfdXNlcih2YWxfYnl0ZShfX3JlcywgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyKys7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAyKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDMpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworLyogVGhlcmUgYXJlIHNvIG1hbnkgcG9zc2libGUgcmVhc29ucyBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4KKyAqIFZNODZfSU5UeCwgc28gYWRkaW5nIGFub3RoZXIgZG9lc24ndCBib3RoZXIgbWUuIFdlIGNhbiBleHBlY3QKKyAqIHVzZXJzcGFjZSBwcm9ncmFtcyB0byBiZSBhYmxlIHRvIGhhbmRsZSBpdC4gKEdldHRpbmcgYSBwcm9ibGVtCisgKiBpbiB1c2Vyc3BhY2UgaXMgYWx3YXlzIGJldHRlciB0aGFuIGFuIE9vcHMgYW55d2F5LikgW0tEXQorICovCitzdGF0aWMgdm9pZCBkb19pbnQoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKnJlZ3MsIGludCBpLAorICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICogc3NwLCB1bnNpZ25lZCBzaG9ydCBzcCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqaW50cl9wdHI7CisJdW5zaWduZWQgbG9uZyBzZWdvZmZzOworCisJaWYgKHJlZ3MtPmNzID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoaXNfcmV2ZWN0b3JlZChpLCAmS1ZNODYtPmludF9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWlmIChpPT0weDIxICYmIGlzX3JldmVjdG9yZWQoQUgocmVncyksJktWTTg2LT5pbnQyMV9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWludHJfcHRyID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopIChpIDw8IDIpOworCWlmIChnZXRfdXNlcihzZWdvZmZzLCBpbnRyX3B0cikpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoKHNlZ29mZnMgPj4gMTYpID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlwdXNodyhzc3AsIHNwLCBnZXRfdmZsYWdzKHJlZ3MpLCBjYW5ub3RfaGFuZGxlKTsKKwlwdXNodyhzc3AsIHNwLCByZWdzLT5jcywgY2Fubm90X2hhbmRsZSk7CisJcHVzaHcoc3NwLCBzcCwgSVAocmVncyksIGNhbm5vdF9oYW5kbGUpOworCXJlZ3MtPmNzID0gc2Vnb2ZmcyA+PiAxNjsKKwlTUChyZWdzKSAtPSA2OworCUlQKHJlZ3MpID0gc2Vnb2ZmcyAmIDB4ZmZmZjsKKwljbGVhcl9URihyZWdzKTsKKwljbGVhcl9JRihyZWdzKTsKKwljbGVhcl9BQyhyZWdzKTsKKwlyZXR1cm47CisKK2Nhbm5vdF9oYW5kbGU6CisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfSU5UeCArIChpIDw8IDgpKTsKK30KKworaW50IGhhbmRsZV92bTg2X3RyYXAoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIGludCB0cmFwbm8pCit7CisJaWYgKFZNUEkuaXNfdm04NnB1cykgeworCQlpZiAoICh0cmFwbm89PTMpIHx8ICh0cmFwbm89PTEpICkKKwkJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1RSQVAgKyAodHJhcG5vIDw8IDgpKTsKKwkJZG9faW50KHJlZ3MsIHRyYXBubywgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KSwgU1AocmVncykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRyYXBubyAhPTEpCisJCXJldHVybiAxOyAvKiB3ZSBsZXQgdGhpcyBoYW5kbGUgYnkgdGhlIGNhbGxpbmcgcm91dGluZSAqLworCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXNpZ2RlbHNldCgmY3VycmVudC0+YmxvY2tlZCwgU0lHVFJBUCk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl9CisJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMSk7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbm87CisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXJldHVybiAwOworfQorCit2b2lkIGhhbmRsZV92bTg2X2ZhdWx0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCXVuc2lnbmVkIGNoYXIgX191c2VyICpjc3A7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKnNzcDsKKwl1bnNpZ25lZCBzaG9ydCBpcCwgc3A7CisJaW50IGRhdGEzMiwgcHJlZl9kb25lOworCisjZGVmaW5lIENIRUNLX0lGX0lOX1RSQVAgXAorCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlICYmIFZNUEkudm04NmRiZ19URnBlbmRpZykgXAorCQluZXdmbGFncyB8PSBURl9NQVNLCisjZGVmaW5lIFZNODZfRkFVTFRfUkVUVVJOIGRvIHsgXAorCWlmIChWTVBJLmZvcmNlX3JldHVybl9mb3JfcGljICAmJiAoVkVGTEFHUyAmIChJRl9NQVNLIHwgVklGX01BU0spKSkgXAorCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9QSUNSRVRVUk4pOyBcCisJcmV0dXJuOyB9IHdoaWxlICgwKQorCisJY3NwID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5jcyA8PCA0KTsKKwlzc3AgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnNzIDw8IDQpOworCXNwID0gU1AocmVncyk7CisJaXAgPSBJUChyZWdzKTsKKworCWRhdGEzMiA9IDA7CisJcHJlZl9kb25lID0gMDsKKwlkbyB7CisJCXN3aXRjaCAob3Bjb2RlID0gcG9wYihjc3AsIGlwLCBzaW11bGF0ZV9zaWdzZWd2KSkgeworCQkJY2FzZSAweDY2OiAgICAgIC8qIDMyLWJpdCBkYXRhICovICAgICBkYXRhMzI9MTsgYnJlYWs7CisJCQljYXNlIDB4Njc6ICAgICAgLyogMzItYml0IGFkZHJlc3MgKi8gIGJyZWFrOworCQkJY2FzZSAweDJlOiAgICAgIC8qIENTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHgzZTogICAgICAvKiBEUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4MjY6ICAgICAgLyogRVMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweDM2OiAgICAgIC8qIFNTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHg2NTogICAgICAvKiBHUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4NjQ6ICAgICAgLyogRlMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYyOiAgICAgIC8qIHJlcG56ICovICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYzOiAgICAgIC8qIHJlcCAqLyAgICAgICAgICAgICBicmVhazsKKwkJCWRlZmF1bHQ6IHByZWZfZG9uZSA9IDE7CisJCX0KKwl9IHdoaWxlICghcHJlZl9kb25lKTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwkvKiBwdXNoZiAqLworCWNhc2UgMHg5YzoKKwkJaWYgKGRhdGEzMikgeworCQkJcHVzaGwoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSA0OworCQl9IGVsc2UgeworCQkJcHVzaHcoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSAyOworCQl9CisJCUlQKHJlZ3MpID0gaXA7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJLyogcG9wZiAqLworCWNhc2UgMHg5ZDoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdmbGFncz1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJU1AocmVncykgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDI7CisJCX0KKwkJSVAocmVncykgPSBpcDsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBpbnQgeHggKi8KKwljYXNlIDB4Y2Q6IHsKKwkJaW50IGludG5vPXBvcGIoY3NwLCBpcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCUlQKHJlZ3MpID0gaXA7CisJCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlKSB7CisJCQlpZiAoICgxIDw8IChpbnRubyAmNykpICYgVk1QSS52bTg2ZGJnX2ludHh4dGFiW2ludG5vID4+IDNdICkKKwkJCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9JTlR4ICsgKGludG5vIDw8IDgpKTsKKwkJfQorCQlkb19pbnQocmVncywgaW50bm8sIHNzcCwgc3ApOworCQlyZXR1cm47CisJfQorCisJLyogaXJldCAqLworCWNhc2UgMHhjZjoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2lwOworCQl1bnNpZ25lZCBsb25nIG5ld2NzOworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdpcD1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJbmV3Y3M9cG9wbChzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzPXBvcGwoc3NwLCBzcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSArPSAxMjsKKwkJfSBlbHNlIHsKKwkJCW5ld2lwID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2NzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDY7CisJCX0KKwkJSVAocmVncykgPSBuZXdpcDsKKwkJcmVncy0+Y3MgPSBuZXdjczsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBjbGkgKi8KKwljYXNlIDB4ZmE6CisJCUlQKHJlZ3MpID0gaXA7CisJCWNsZWFyX0lGKHJlZ3MpOworCQlWTTg2X0ZBVUxUX1JFVFVSTjsKKworCS8qIHN0aSAqLworCS8qCisJICogRGFtbi4gVGhpcyBpcyBpbmNvcnJlY3Q6IHRoZSAnc3RpJyBpbnN0cnVjdGlvbiBzaG91bGQgYWN0dWFsbHkKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBhZnRlciB0aGUgL25leHQvIGluc3RydWN0aW9uLiBOb3QgZ29vZC4KKwkgKgorCSAqIFByb2JhYmx5IG5lZWRzIHNvbWUgaG9yc2luZyBhcm91bmQgd2l0aCB0aGUgVEYgZmxhZy4gQWllZS4uCisJICovCisJY2FzZSAweGZiOgorCQlJUChyZWdzKSA9IGlwOworCQlzZXRfSUYocmVncyk7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7CisJfQorCisJcmV0dXJuOworCitzaW11bGF0ZV9zaWdzZWd2OgorCS8qIEZJWE1FOiBBZnRlciBhIGxvbmcgZGlzY3Vzc2lvbiB3aXRoIFN0YXMgd2UgZmluYWxseQorCSAqICAgICAgICBhZ3JlZWQsIHRoYXQgdGhpcyBpcyB3cm9uZy4gSGVyZSB3ZSBzaG91bGQKKwkgKiAgICAgICAgcmVhbGx5IHNlbmQgYSBTSUdTRUdWIHRvIHRoZSB1c2VyIHByb2dyYW0uCisJICogICAgICAgIEJ1dCBob3cgZG8gd2UgY3JlYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQ/IFdlCisJICogICAgICAgIGFyZSBpbnNpZGUgYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlcgorCSAqICAgICAgICBhbmQgaGFzIGp1c3QgcmV0dXJuZWQgZnJvbSBhIHBhZ2UgZmF1bHQgaGFuZGxlci4KKwkgKiAgICAgICAgVGhlIGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyCisJICogICAgICAgIHNob3VsZCBiZSBhIG1peHR1cmUgb2YgdGhlIHR3bywgYnV0IGhvdyBkbyB3ZQorCSAqICAgICAgICBnZXQgdGhlIGluZm9ybWF0aW9uPyBbS0RdCisJICovCisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gdm04NiBzcGVjaWFsIElSUSBwYXNzaW5nIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVk04Nl9JUlFOQU1FCQkidm04NmlycSIKKworc3RhdGljIHN0cnVjdCB2bTg2X2lycXMgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBzaWc7Cit9IHZtODZfaXJxc1sxNl07CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxYml0c19sb2NrKTsKK3N0YXRpYyBpbnQgaXJxYml0czsKKworI2RlZmluZSBBTExPV0VEX1NJR1MgKCAxIC8qIDAgPSBkb24ndCBzZW5kIGEgc2lnbmFsICovIFwKKwl8ICgxIDw8IFNJR1VTUjEpIHwgKDEgPDwgU0lHVVNSMikgfCAoMSA8PCBTSUdJTykgIHwgKDEgPDwgU0lHVVJHKSBcCisJfCAoMSA8PCBTSUdVTlVTRUQpICkKKwkKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaW50bm8sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpcnFfYml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycV9iaXQgPSAxIDw8IGludG5vOworCWlmICgoaXJxYml0cyAmIGlycV9iaXQpIHx8ICEgdm04Nl9pcnFzW2ludG5vXS50c2spCisJCWdvdG8gb3V0OworCWlycWJpdHMgfD0gaXJxX2JpdDsKKwlpZiAodm04Nl9pcnFzW2ludG5vXS5zaWcpCisJCXNlbmRfc2lnKHZtODZfaXJxc1tpbnRub10uc2lnLCB2bTg2X2lycXNbaW50bm9dLnRzaywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBJUlEgd2lsbCBiZSByZS1lbmFibGVkIHdoZW4gdXNlciBhc2tzIGZvciB0aGUgaXJxICh3aGV0aGVyCisJICogcG9sbGluZyBvciBhcyBhIHJlc3VsdCBvZiB0aGUgc2lnbmFsKQorCSAqLworCWRpc2FibGVfaXJxKGludG5vKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV92bTg2X2lycShpbnQgaXJxbnVtYmVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmcmVlX2lycShpcnFudW1iZXIsIE5VTEwpOworCXZtODZfaXJxc1tpcnFudW1iZXJdLnRzayA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycWJpdHMgJj0gfigxIDw8IGlycW51bWJlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorfQorCit2b2lkIHJlbGVhc2Vfdm04Nl9pcnFzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBGSVJTVF9WTTg2X0lSUSA7IGkgPD0gTEFTVF9WTTg2X0lSUTsgaSsrKQorCSAgICBpZiAodm04Nl9pcnFzW2ldLnRzayA9PSB0YXNrKQorCQlmcmVlX3ZtODZfaXJxKGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYW5kX3Jlc2V0X2lycShpbnQgaXJxbnVtYmVyKQoreworCWludCBiaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gMDsKKwlpZiAodm04Nl9pcnFzW2lycW51bWJlcl0udHNrICE9IGN1cnJlbnQpIHJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJYml0ID0gaXJxYml0cyAmICgxIDw8IGlycW51bWJlcik7CisJaXJxYml0cyAmPSB+Yml0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWJpdHNfbG9jaywgZmxhZ3MpOwkKKwlpZiAoIWJpdCkKKwkJcmV0dXJuIDA7CisJZW5hYmxlX2lycShpcnFudW1iZXIpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZG9fdm04Nl9pcnFfaGFuZGxpbmcoaW50IHN1YmZ1bmN0aW9uLCBpbnQgaXJxbnVtYmVyKQoreworCWludCByZXQ7CisJc3dpdGNoIChzdWJmdW5jdGlvbikgeworCQljYXNlIFZNODZfR0VUX0FORF9SRVNFVF9JUlE6IHsKKwkJCXJldHVybiBnZXRfYW5kX3Jlc2V0X2lycShpcnFudW1iZXIpOworCQl9CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6IHsKKwkJCXJldHVybiBpcnFiaXRzOworCQl9CisJCWNhc2UgVk04Nl9SRVFVRVNUX0lSUTogeworCQkJaW50IHNpZyA9IGlycW51bWJlciA+PiA4OworCQkJaW50IGlycSA9IGlycW51bWJlciAmIDI1NTsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghKCgxIDw8IHNpZykgJiBBTExPV0VEX1NJR1MpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKGludmFsaWRfdm04Nl9pcnEoaXJxKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICh2bTg2X2lycXNbaXJxXS50c2spIHJldHVybiAtRVBFUk07CisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsICZpcnFfaGFuZGxlciwgMCwgVk04Nl9JUlFOQU1FLCBOVUxMKTsKKwkJCWlmIChyZXQpIHJldHVybiByZXQ7CisJCQl2bTg2X2lycXNbaXJxXS5zaWcgPSBzaWc7CisJCQl2bTg2X2lycXNbaXJxXS50c2sgPSBjdXJyZW50OworCQkJcmV0dXJuIGlycTsKKwkJfQorCQljYXNlICBWTTg2X0ZSRUVfSVJROiB7CisJCQlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCF2bTg2X2lycXNbaXJxbnVtYmVyXS50c2spIHJldHVybiAwOworCQkJaWYgKHZtODZfaXJxc1tpcnFudW1iZXJdLnRzayAhPSBjdXJyZW50KSByZXR1cm4gLUVQRVJNOworCQkJZnJlZV92bTg2X2lycShpcnFudW1iZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsMTM0IEBACisvKiBsZCBzY3JpcHQgdG8gbWFrZSBpMzg2IExpbnV4IGtlcm5lbAorICogV3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej47CisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKHN0YXJ0dXBfMzIpCitqaWZmaWVzID0gamlmZmllc182NDsKK1NFQ1RJT05TCit7CisgIC4gPSBfX1BBR0VfT0ZGU0VUICsgMHgxMDAwMDA7CisgIC8qIHJlYWQtb25seSAqLworICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKyAgLnRleHQgOiB7CisJKigudGV4dCkKKwlTQ0hFRF9URVhUCisJTE9DS19URVhUCisJKiguZml4dXApCisJKiguZ251Lndhcm5pbmcpCisJfSA9IDB4OTA5MAorCisgIF9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICBST0RBVEEKKworICAvKiB3cml0ZWFibGUgKi8KKyAgLmRhdGEgOiB7CQkJLyogRGF0YSAqLworCSooLmRhdGEpCisJQ09OU1RSVUNUT1JTCisJfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfYmVnaW4gPSAuOworICAuZGF0YV9ub3NhdmUgOiB7ICooLmRhdGEubm9zYXZlKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfZW5kID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IHsgKiguZGF0YS5pZHQpIH0KKworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQorCisgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTihUSFJFQURfU0laRSk7CS8qIGluaXRfdGFzayAqLworICAuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9CisKKyAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCisgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLworICBfX2luaXRfYmVnaW4gPSAuOworICAuaW5pdC50ZXh0IDogeyAKKwlfc2luaXR0ZXh0ID0gLjsKKwkqKC5pbml0LnRleHQpCisJX2Vpbml0dGV4dCA9IC47CisgIH0KKyAgLmluaXQuZGF0YSA6IHsgKiguaW5pdC5kYXRhKSB9CisgIC4gPSBBTElHTigxNik7CisgIF9fc2V0dXBfc3RhcnQgPSAuOworICAuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQorICBfX3NldHVwX2VuZCA9IC47CisgIF9faW5pdGNhbGxfc3RhcnQgPSAuOworICAuaW5pdGNhbGwuaW5pdCA6IHsKKwkqKC5pbml0Y2FsbDEuaW5pdCkgCisJKiguaW5pdGNhbGwyLmluaXQpIAorCSooLmluaXRjYWxsMy5pbml0KSAKKwkqKC5pbml0Y2FsbDQuaW5pdCkgCisJKiguaW5pdGNhbGw1LmluaXQpIAorCSooLmluaXRjYWxsNi5pbml0KSAKKwkqKC5pbml0Y2FsbDcuaW5pdCkKKyAgfQorICBfX2luaXRjYWxsX2VuZCA9IC47CisgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKKyAgLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQorICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworICBTRUNVUklUWV9JTklUCisgIC4gPSBBTElHTig0KTsKKyAgX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKKyAgLmFsdGluc3RydWN0aW9ucyA6IHsgKiguYWx0aW5zdHJ1Y3Rpb25zKSB9IAorICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsgCisgLmFsdGluc3RyX3JlcGxhY2VtZW50IDogeyAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgfSAKKyAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCisgICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCisgIC5leGl0LnRleHQgOiB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogeyAqKC5leGl0LmRhdGEpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRyYW1mc19zdGFydCA9IC47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisgIC4gPSBBTElHTigzMik7CisgIF9fcGVyX2NwdV9zdGFydCA9IC47CisgIC5kYXRhLnBlcmNwdSAgOiB7ICooLmRhdGEucGVyY3B1KSB9CisgIF9fcGVyX2NwdV9lbmQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworICAvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLworCQorICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKyAgLmJzcyA6IHsKKwkqKC5ic3MucGFnZV9hbGlnbmVkKQorCSooLmJzcykKKyAgfQorICAuID0gQUxJR04oNCk7CisgIF9fYnNzX3N0b3AgPSAuOyAKKworICBfZW5kID0gLiA7CisKKyAgLyogVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNyZWF0ZXMgdGhlIGVhcmx5IGJvb3QgcGFnZSB0YWJsZXMgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICBwZzAgPSAuOworCisgIC8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLworICAvRElTQ0FSRC8gOiB7CisJKiguZXhpdGNhbGwuZXhpdCkKKwl9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtaW50ODAuUwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgb2xkIGludCAkMHg4MCBtZXRob2QuCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlpbnQgJDB4ODAKKwlyZXQKKy5MRU5EX3ZzeXNjYWxsOgorCS5zaXplIF9fa2VybmVsX3ZzeXNjYWxsLC4tLkxTVEFSVF92c3lzY2FsbAorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0k6CisJLmxvbmcgLkxFTkRDSUVETFNJLS5MU1RBUlRDSUVETFNJCisuTFNUQVJUQ0lFRExTSToKKwkubG9uZyAwCQkJLyogQ0lFIElEICovCisJLmJ5dGUgMQkJCS8qIFZlcnNpb24gbnVtYmVyICovCisJLnN0cmluZyAielIiCQkvKiBOVUwtdGVybWluYXRlZCBhdWdtZW50YXRpb24gc3RyaW5nICovCisJLnVsZWIxMjggMQkJLyogQ29kZSBhbGlnbm1lbnQgZmFjdG9yICovCisJLnNsZWIxMjggLTQJCS8qIERhdGEgYWxpZ25tZW50IGZhY3RvciAqLworCS5ieXRlIDgJCQkvKiBSZXR1cm4gYWRkcmVzcyByZWdpc3RlciBjb2x1bW4gKi8KKwkudWxlYjEyOCAxCQkvKiBBdWdtZW50YXRpb24gdmFsdWUgbGVuZ3RoICovCisJLmJ5dGUgMHgxYgkJLyogRFdfRUhfUEVfcGNyZWx8RFdfRUhfUEVfc2RhdGE0LiAqLworCS5ieXRlIDB4MGMJCS8qIERXX0NGQV9kZWZfY2ZhICovCisJLnVsZWIxMjggNAorCS51bGViMTI4IDQKKwkuYnl0ZSAweDg4CQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLnVsZWIxMjggMQorCS5hbGlnbiA0CisuTEVORENJRURMU0k6CisJLmxvbmcgLkxFTkRGREVETFNJLS5MU1RBUlRGREVETFNJIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJOgorCS5sb25nIC5MU1RBUlRGREVETFNJLS5MU1RBUlRGUkFNRURMU0kgLyogQ0lFIHBvaW50ZXIgKi8KKwkubG9uZyAuTFNUQVJUX3ZzeXNjYWxsLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3ZzeXNjYWxsLS5MU1RBUlRfdnN5c2NhbGwKKwkudWxlYjEyOCAwCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXNpZ3JldHVybi5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZjZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvbW1vbiBjb2RlIGZvciB0aGUgc2lncmV0dXJuIGVudHJ5IHBvaW50cyBvbiB0aGUgdnN5c2NhbGwgcGFnZS4KKyAqIFNvIGZhciB0aGlzIGNvZGUgaXMgdGhlIHNhbWUgZm9yIGJvdGggaW50ODAgYW5kIHN5c2VudGVyIHZlcnNpb25zLgorICogVGhpcyBmaWxlIGlzICNpbmNsdWRlJ2QgYnkgdnN5c2NhbGwtKi5TIHRvIGRlZmluZSB0aGVtIGFmdGVyIHRoZQorICogdnN5c2NhbGwgZW50cnkgcG9pbnQuICBUaGUga2VybmVsIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzc2VzIG9mIHRoZXNlCisgKiByb3V0aW5lcyBhcmUgY29uc3RhbnQgZm9yIGFsbCB2c3lzY2FsbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKworCisvKiBYWFgKKyAgIFNob3VsZCB0aGVzZSBiZSBuYW1lZCAiX3NpZ3RyYW1wIiBvciBzb21ldGhpbmc/CisqLworCisJLnRleHQKKwkub3JnCV9fa2VybmVsX3ZzeXNjYWxsKzMyCisJLmdsb2JsIF9fa2VybmVsX3NpZ3JldHVybgorCS50eXBlIF9fa2VybmVsX3NpZ3JldHVybixAZnVuY3Rpb24KK19fa2VybmVsX3NpZ3JldHVybjoKKy5MU1RBUlRfc2lncmV0dXJuOgorCXBvcGwgJWVheAkJLyogWFhYIGRvZXMgdGhpcyBtZWFuIGl0IG5lZWRzIHVud2luZCBpbmZvPyAqLworCW1vdmwgJF9fTlJfc2lncmV0dXJuLCAlZWF4CisJaW50ICQweDgwCisuTEVORF9zaWdyZXR1cm46CisJLnNpemUgX19rZXJuZWxfc2lncmV0dXJuLC4tLkxTVEFSVF9zaWdyZXR1cm4KKworCS5iYWxpZ24gMzIKKwkuZ2xvYmwgX19rZXJuZWxfcnRfc2lncmV0dXJuCisJLnR5cGUgX19rZXJuZWxfcnRfc2lncmV0dXJuLEBmdW5jdGlvbgorX19rZXJuZWxfcnRfc2lncmV0dXJuOgorLkxTVEFSVF9ydF9zaWdyZXR1cm46CisJbW92bCAkX19OUl9ydF9zaWdyZXR1cm4sICVlYXgKKwlpbnQgJDB4ODAKKy5MRU5EX3J0X3NpZ3JldHVybjoKKwkuc2l6ZSBfX2tlcm5lbF9ydF9zaWdyZXR1cm4sLi0uTFNUQVJUX3J0X3NpZ3JldHVybgorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0kxOgorCS5sb25nIC5MRU5EQ0lFRExTSTEtLkxTVEFSVENJRURMU0kxCisuTFNUQVJUQ0lFRExTSTE6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAwCQkJLyogRFdfQ0ZBX25vcCAqLworCS5hbGlnbiA0CisuTEVORENJRURMU0kxOgorCS5sb25nIC5MRU5ERkRFRExTSTEtLkxTVEFSVEZERURMU0kxIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMToKKwkubG9uZyAuTFNUQVJURkRFRExTSTEtLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBUaGUgZHdhcmYyIHVud2luZCByb3V0aW5lcyB3aWxsIHN1YnRyYWN0IDEgZnJvbSB0aGUKKwkgICByZXR1cm4gYWRkcmVzcyB0byBnZXQgYW4gYWRkcmVzcyBpbiB0aGUgbWlkZGxlIG9mIHRoZQorCSAgIHByZXN1bWVkIGNhbGwgaW5zdHJ1Y3Rpb24uICBTaW5jZSB3ZSBkaWRuJ3QgZ2V0IGhlcmUgdmlhCisJICAgYSBjYWxsLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG5vcCBiZWZvcmUgdGhlIHJlYWwgc3RhcnQKKwkgICB0byBtYWtlIHVwIGZvciBpdC4gICovCisJLmxvbmcgLkxTVEFSVF9zaWdyZXR1cm4tMS0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF9zaWdyZXR1cm4tLkxTVEFSVF9zaWdyZXR1cm4rMQorCS51bGViMTI4IDAJCQkvKiBBdWdtZW50YXRpb24gKi8KKwkvKiBXaGF0IGZvbGxvd3MgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0YWJsZSBnZW5lcmF0aW9uLgorCSAgIFdlIHJlY29yZCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggcmVnaXN0ZXIgc2F2ZWQuICBUaGlzIGlzCisJICAgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgIkNGQSIgaXMgYWx3YXlzIGFzc3VtZWQgdG8KKwkgICBiZSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIGNhbGxlci4gIFRoaXMgbWVhbnMKKwkgICB0aGF0IHdlIG11c3QgZGVmaW5lIHRoZSBDRkEgb2YgdGhpcyBib2R5IG9mIGNvZGUgdG8gYmUgdGhlCisJICAgc2F2ZWQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuICBXaGljaAorCSAgIGFsc28gbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBmaXhlZCByZWxhdGlvbiB0byB0aGUgb3RoZXIgCisJICAgc2F2ZWQgcmVnaXN0ZXJzLCB3aGljaCBtZWFucyB0aGF0IHdlIG11c3QgdXNlIERXX0NGQV9leHByZXNzaW9uCisJICAgdG8gY29tcHV0ZSB0aGVpciBhZGRyZXNzZXMuICBJdCBhbHNvIG1lYW5zIHRoYXQgd2hlbiB3ZSAKKwkgICBhZGp1c3QgdGhlIHN0YWNrIHdpdGggdGhlIHBvcGwsIHdlIGhhdmUgdG8gZG8gaXQgYWxsIG92ZXIgYWdhaW4uICAqLworCisjZGVmaW5lIGRvX2NmYV9leHByKG9mZnNldCkJCQkJCQlcCisJLmJ5dGUgMHgwZjsJCQkvKiBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uICovCVwKKwkudWxlYjEyOCAxZi0wZjsJCQkvKiAgIGxlbmd0aCAqLwkJCVwKKzA6CS5ieXRlIDB4NzQ7CQkJLyogICAgIERXX09QX2JyZWc0ICovCQlcCisJLnNsZWIxMjggb2Zmc2V0OwkJLyogICAgICBvZmZzZXQgKi8JCVwKKwkuYnl0ZSAweDA2OwkJCS8qICAgICBEV19PUF9kZXJlZiAqLwkJXAorMToKKworI2RlZmluZSBkb19leHByKHJlZ25vLCBvZmZzZXQpCQkJCQkJXAorCS5ieXRlIDB4MTA7CQkJLyogRFdfQ0ZBX2V4cHJlc3Npb24gKi8JCVwKKwkudWxlYjEyOCByZWdubzsJCQkvKiAgIHJlZ25vICovCQkJXAorCS51bGViMTI4IDFmLTBmOwkJCS8qICAgbGVuZ3RoICovCQkJXAorMDoJLmJ5dGUgMHg3NDsJCQkvKiAgICAgRFdfT1BfYnJlZzQgKi8JCVwKKwkuc2xlYjEyOCBvZmZzZXQ7CQkvKiAgICAgICBvZmZzZXQgKi8JCVwKKzE6CisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCs0KQorCWRvX2V4cHIoMCwgU0lHQ09OVEVYVF9lYXgrNCkKKwlkb19leHByKDEsIFNJR0NPTlRFWFRfZWN4KzQpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCs0KQorCWRvX2V4cHIoMywgU0lHQ09OVEVYVF9lYngrNCkKKwlkb19leHByKDUsIFNJR0NPTlRFWFRfZWJwKzQpCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSs0KQorCWRvX2V4cHIoNywgU0lHQ09OVEVYVF9lZGkrNCkKKwlkb19leHByKDgsIFNJR0NPTlRFWFRfZWlwKzQpCisKKwkuYnl0ZSAweDQyCS8qIERXX0NGQV9hZHZhbmNlX2xvYyAyIC0tIG5vcDsgcG9wbCBlYXguICovCisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMToKKworCS5sb25nIC5MRU5ERkRFRExTSTItLkxTVEFSVEZERURMU0kyIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMjoKKwkubG9uZyAuTFNUQVJURkRFRExTSTItLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBTZWUgYWJvdmUgd3J0IHVud2luZCBsaWJyYXJ5IGFzc3VtcHRpb25zLiAgKi8KKwkubG9uZyAuTFNUQVJUX3J0X3NpZ3JldHVybi0xLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3J0X3NpZ3JldHVybi0uTFNUQVJUX3J0X3NpZ3JldHVybisxCisJLnVsZWIxMjggMAkJCS8qIEF1Z21lbnRhdGlvbiAqLworCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgcmVjb3JkIHRoZSBsb2NhdGlvbnMgb2YgZWFjaCByZWdpc3RlciBzYXZlZC4gIFRoaXMgaXMKKwkgICBzbGlnaHRseSBsZXNzIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGFib3ZlLCBzaW5jZSB3ZSBkb24ndAorCSAgIG1vZGlmeSB0aGUgc3RhY2sgcG9pbnRlciBpbiB0aGUgcHJvY2Vzcy4gICovCisKKwlkb19jZmFfZXhwcihSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMjoKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFlZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zeXNlbnRlci5TCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgc3lzZW50ZXIgaW5zdHJ1Y3Rpb24uCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlwdXNoICVlY3gKKy5McHVzaF9lY3g6CisJcHVzaCAlZWR4CisuTHB1c2hfZWR4OgorCXB1c2ggJWVicAorLkxlbnRlcl9rZXJuZWw6CisJbW92bCAlZXNwLCVlYnAKKwlzeXNlbnRlcgorCisJLyogNzogYWxpZ24gcmV0dXJuIHBvaW50IHdpdGggbm9wJ3MgdG8gbWFrZSBkaXNhc3NlbWJseSBlYXNpZXIgKi8KKwkuc3BhY2UgNywweDkwCisKKwkvKiAxNDogU3lzdGVtIGNhbGwgcmVzdGFydCBwb2ludCBpcyBoZXJlISAoU1lTRU5URVJfUkVUVVJOIC0gMikgKi8KKwlqbXAgLkxlbnRlcl9rZXJuZWwKKwkvKiAxNjogU3lzdGVtIGNhbGwgbm9ybWFsIHJldHVybiBwb2ludCBpcyBoZXJlISAqLworCS5nbG9ibCBTWVNFTlRFUl9SRVRVUk4JLyogU3ltYm9sIHVzZWQgYnkgZW50cnkuUy4gICovCitTWVNFTlRFUl9SRVRVUk46CisJcG9wICVlYnAKKy5McG9wX2VicDoKKwlwb3AgJWVkeAorLkxwb3BfZWR4OgorCXBvcCAlZWN4CisuTHBvcF9lY3g6CisJcmV0CisuTEVORF92c3lzY2FsbDoKKwkuc2l6ZSBfX2tlcm5lbF92c3lzY2FsbCwuLS5MU1RBUlRfdnN5c2NhbGwKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIC5laF9mcmFtZSwiYSIsQHByb2diaXRzCisuTFNUQVJURlJBTUVETFNJOgorCS5sb25nIC5MRU5EQ0lFRExTSS0uTFNUQVJUQ0lFRExTSQorLkxTVEFSVENJRURMU0k6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAweDBjCQkvKiBEV19DRkFfZGVmX2NmYSAqLworCS51bGViMTI4IDQKKwkudWxlYjEyOCA0CisJLmJ5dGUgMHg4OAkJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OCAqLworCS51bGViMTI4IDEKKwkuYWxpZ24gNAorLkxFTkRDSUVETFNJOgorCS5sb25nIC5MRU5ERkRFRExTSS0uTFNUQVJURkRFRExTSSAvKiBMZW5ndGggRkRFICovCisuTFNUQVJURkRFRExTSToKKwkubG9uZyAuTFNUQVJURkRFRExTSS0uTFNUQVJURlJBTUVETFNJIC8qIENJRSBwb2ludGVyICovCisJLmxvbmcgLkxTVEFSVF92c3lzY2FsbC0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF92c3lzY2FsbC0uTFNUQVJUX3ZzeXNjYWxsCisJLnVsZWIxMjggMAorCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgaGF2ZSB0byByZWNvcmQgYWxsIGNoYW5nZXMgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHB1c2hfZWN4LS5MU1RBUlRfdnN5c2NhbGwKKwkuYnl0ZSAweDBlCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZSAweDA4CQkvKiBSQSBhdCBvZmZzZXQgOCBub3cgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwdXNoX2VkeC0uTHB1c2hfZWN4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTGVudGVyX2tlcm5lbC0uTHB1c2hfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgxMAkJLyogUkEgYXQgb2Zmc2V0IDE2IG5vdyAqLworCS5ieXRlIDB4ODUsIDB4MDQJLyogRFdfQ0ZBX29mZnNldCAlZWJwIC0xNiAqLworCS8qIEZpbmFsbHkgdGhlIGVwaWxvZ3VlLiAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWJwLS5MZW50ZXJfa2VybmVsCisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4YzUJCS8qIERXX0NGQV9yZXN0b3JlICVlYnAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWR4LS5McG9wX2VicAorCS5ieXRlIDB4MGUJCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlIDB4MDgJCS8qIFJBIGF0IG9mZnNldCA4IG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHBvcF9lY3gtLkxwb3BfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwNAkJLyogUkEgYXQgb2Zmc2V0IDQgbm93ICovCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwMzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwuUwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitfX0lOSVREQVRBCisKKwkuZ2xvYmwgdnN5c2NhbGxfaW50ODBfc3RhcnQsIHZzeXNjYWxsX2ludDgwX2VuZAordnN5c2NhbGxfaW50ODBfc3RhcnQ6CisJLmluY2JpbiAiYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1pbnQ4MC5zbyIKK3ZzeXNjYWxsX2ludDgwX2VuZDoKKworCS5nbG9ibCB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kCit2c3lzY2FsbF9zeXNlbnRlcl9zdGFydDoKKwkuaW5jYmluICJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5c2VudGVyLnNvIgordnN5c2NhbGxfc3lzZW50ZXJfZW5kOgorCitfX0ZJTklUCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgzMjlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgdnN5c2NhbGwgRFNPLiAgVGhlIHZzeXNjYWxsIHBhZ2UgaXMgYW4gRUxGIHNoYXJlZAorICogb2JqZWN0IHByZWxpbmtlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzLCBhbmQgd2l0aCBvbmx5IG9uZSByZWFkLW9ubHkKKyAqIHNlZ21lbnQgKHRoYXQgZml0cyBpbiBvbmUgcGFnZSkuICBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgorICovCisjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisKK1NFQ1RJT05TCit7CisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgU0laRU9GX0hFQURFUlM7CisKKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CQk6dGV4dAorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKworICAvKiBUaGlzIGxpbmtlciBzY3JpcHQgaXMgdXNlZCBib3RoIHdpdGggLXIgYW5kIHdpdGggLXNoYXJlZC4KKyAgICAgRm9yIHRoZSBsYXlvdXRzIHRvIG1hdGNoLCB3ZSBuZWVkIHRvIHNraXAgbW9yZSB0aGFuIGVub3VnaAorICAgICBzcGFjZSBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGV0IGFsLiAgSWYgdGhpcyBhbW91bnQKKyAgICAgaXMgaW5zdWZmaWNpZW50LCBsZCAtc2hhcmVkIHdpbGwgYmFyZi4gIEp1c3QgaW5jcmVhc2UgaXQgaGVyZS4gICovCisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgMHg0MDA7CisKKyAgLnRleHQgICAgICAgICAgIDogeyAqKC50ZXh0KSB9CQk6dGV4dCA9MHg5MDkwOTA5MAorCisgIC5laF9mcmFtZV9oZHIgICA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CTp0ZXh0IDplaF9mcmFtZV9oZHIKKyAgLmVoX2ZyYW1lICAgICAgIDogeyBLRUVQICgqKC5laF9mcmFtZSkpIH0JOnRleHQKKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CQk6dGV4dCA6ZHluYW1pYworICAudXNlbGVzcyAgICAgICAgOiB7CisgIAkqKC5nb3QucGx0KSAqKC5nb3QpCisJKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorCSooLmR5bmJzcykKKwkqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICB9CQkJCQkJOnRleHQKK30KKworLyoKKyAqIFdlIG11c3Qgc3VwcGx5IHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIGV4cGxpY2l0bHkgdG8gZ2V0IGp1c3Qgb25lCisgKiBQVF9MT0FEIHNlZ21lbnQsIGFuZCBzZXQgdGhlIGZsYWdzIGV4cGxpY2l0bHkgdG8gbWFrZSBzZWdtZW50cyByZWFkLW9ubHkuCisgKi8KK1BIRFJTCit7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIEZMQUdTKDUpOyAvKiBQRl9SfFBGX1ggKi8KKyAgZHluYW1pYyBQVF9EWU5BTUlDIEZMQUdTKDQpOyAvKiBQRl9SICovCisgIGVoX2ZyYW1lX2hkciAweDY0NzRlNTUwOyAvKiBQVF9HTlVfRUhfRlJBTUUsIGJ1dCBsZCBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lICovCit9CisKKy8qCisgKiBUaGlzIGNvbnRyb2xzIHdoYXQgc3ltYm9scyB3ZSBleHBvcnQgZnJvbSB0aGUgRFNPLgorICovCitWRVJTSU9OCit7CisgIExJTlVYXzIuNSB7CisgICAgZ2xvYmFsOgorICAgIAlfX2tlcm5lbF92c3lzY2FsbDsKKyAgICAJX19rZXJuZWxfc2lncmV0dXJuOworICAgIAlfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKKyAgICBsb2NhbDogKjsKKyAgfTsKK30KKworLyogVGhlIEVMRiBlbnRyeSBwb2ludCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIEFUX1NZU0lORk8gdmFsdWUuICAqLworRU5UUlkoX19rZXJuZWxfdnN5c2NhbGwpOwo=