LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfZHJpdmVyLmMgJAogKiAkUmV2aXNpb246ICM5MSAkCiAqICREYXRlOiAyMDExLzEwLzI0ICQKICogJENoYW5nZTogMTg3MTE1OSAkCiAqCiAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAogKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcwogKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KICoKICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAogKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCiAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQogKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgogKgogKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKiBAZmlsZQogKiBUaGUgZHdjX290Z19kcml2ZXIgbW9kdWxlIHByb3ZpZGVzIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBlbnRyeQogKiBwb2ludHMgZm9yIHRoZSBEV0Nfb3RnIGRyaXZlci4gVGhpcyBtb2R1bGUgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YWxsZWQKICogYWZ0ZXIgTGludXggaXMgYm9vdGVkIHVzaW5nIHRoZSBpbnNtb2QgY29tbWFuZC4gV2hlbiB0aGUgbW9kdWxlIGlzCiAqIGluc3RhbGxlZCwgdGhlIGR3Y19vdGdfZHJpdmVyX2luaXQgZnVuY3Rpb24gaXMgY2FsbGVkLiBXaGVuIHRoZSBtb2R1bGUgaXMKICogcmVtb3ZlZCAodXNpbmcgcm1tb2QpLCB0aGUgZHdjX290Z19kcml2ZXJfY2xlYW51cCBmdW5jdGlvbiBpcyBjYWxsZWQuCiAqCiAqIFRoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyBhIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgZHdjX290Z19kcml2ZXIsIHdoaWNoIGlzCiAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgQVJNIGxtX2RldmljZSBzdHJ1Y3R1cmUuIFRoZXNlCiAqIHN0cnVjdHVyZXMgYWxsb3cgdGhlIE9URyBkcml2ZXIgdG8gY29tcGx5IHdpdGggdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlcgogKiBtb2RlbCBpbiB3aGljaCBkZXZpY2VzIGFuZCBkcml2ZXJzIGFyZSByZWdpc3RlcmVkIHdpdGggYSBidXMgZHJpdmVyLiBUaGlzCiAqIGhhcyB0aGUgYmVuZWZpdCB0aGF0IExpbnV4IGNhbiBleHBvc2UgYXR0cmlidXRlcyBvZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UKICogaW4gaXRzIHNwZWNpYWwgc3lzZnMgZmlsZSBzeXN0ZW0uIFVzZXJzIGNhbiB0aGVuIHJlYWQgb3Igd3JpdGUgZmlsZXMgaW4KICogdGhpcyBmaWxlIHN5c3RlbSB0byBwZXJmb3JtIGRpYWdub3N0aWNzIG9uIHRoZSBkcml2ZXIgY29tcG9uZW50cyBvciB0aGUKICogZGV2aWNlLgogKi8KCiNpbmNsdWRlICJkd2Nfb3RnX29zX2RlcC5oIgojaW5jbHVkZSAiZHdjX29zLmgiCiNpbmNsdWRlICJkd2Nfb3RnX2RiZy5oIgojaW5jbHVkZSAiZHdjX290Z19kcml2ZXIuaCIKI2luY2x1ZGUgImR3Y19vdGdfYXR0ci5oIgojaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCiNpbmNsdWRlICJkd2Nfb3RnX3BjZF9pZi5oIgojaW5jbHVkZSAiZHdjX290Z19oY2RfaWYuaCIKI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KCiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KCi8qIFVTQiAzLjAgY2xvY2sgKi8Kc3RhdGljIHN0cnVjdCBjbGsgKnVzYjJfY2xrOwoKZXh0ZXJuIHZvaWQgZHdjX290Z19ob3N0X3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKZXh0ZXJuIHZvaWQgZHdjX290Z19ob3N0X3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpOwoKCiNkZWZpbmUgRFdDX0RSSVZFUl9WRVJTSU9OCSIyLjk0YSAyNy1PQ1QtMjAxMSIKI2RlZmluZSBEV0NfRFJJVkVSX0RFU0MJCSJIUyBPVEcgVVNCIENvbnRyb2xsZXIgZHJpdmVyIgoKc3RhdGljIGNvbnN0IGNoYXIgZHdjX2RyaXZlcl9uYW1lW10gPSAiZHdjX290ZyI7CgpleHRlcm4gaW50IHBjZF9pbml0KAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCSAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCQkJICAgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApOwpleHRlcm4gaW50IGhjZF9pbml0KAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCSAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCQkJICAgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApOwoKZXh0ZXJuIGludCBwY2RfcmVtb3ZlKAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCSAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CiNlbHNlCgkJCQkgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICk7CgpleHRlcm4gdm9pZCBoY2RfcmVtb3ZlKAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCSAgICAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CiNlbmRpZgogICAgKTsKCmV4dGVybiB2b2lkIGR3Y19vdGdfYWRwX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDhfdCBpc19ob3N0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIEVuY2Fwc3VsYXRlIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdzICovCgpzdHJ1Y3QgZHdjX290Z19kcml2ZXJfbW9kdWxlX3BhcmFtcyB7CglpbnQzMl90IG9wdDsKCWludDMyX3Qgb3RnX2NhcDsKCWludDMyX3QgZG1hX2VuYWJsZTsKCWludDMyX3QgZG1hX2Rlc2NfZW5hYmxlOwoJaW50MzJfdCBkbWFfYnVyc3Rfc2l6ZTsKCWludDMyX3Qgc3BlZWQ7CglpbnQzMl90IGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXI7CglpbnQzMl90IGhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGs7CglpbnQzMl90IGVuYWJsZV9keW5hbWljX2ZpZm87CglpbnQzMl90IGRhdGFfZmlmb19zaXplOwoJaW50MzJfdCBkZXZfcnhfZmlmb19zaXplOwoJaW50MzJfdCBkZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKCXVpbnQzMl90IGRldl9wZXJpb190eF9maWZvX3NpemVbTUFYX1BFUklPX0ZJRk9TXTsKCWludDMyX3QgaG9zdF9yeF9maWZvX3NpemU7CglpbnQzMl90IGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKCWludDMyX3QgaG9zdF9wZXJpb190eF9maWZvX3NpemU7CglpbnQzMl90IG1heF90cmFuc2Zlcl9zaXplOwoJaW50MzJfdCBtYXhfcGFja2V0X2NvdW50OwoJaW50MzJfdCBob3N0X2NoYW5uZWxzOwoJaW50MzJfdCBkZXZfZW5kcG9pbnRzOwoJaW50MzJfdCBwaHlfdHlwZTsKCWludDMyX3QgcGh5X3V0bWlfd2lkdGg7CglpbnQzMl90IHBoeV91bHBpX2RkcjsKCWludDMyX3QgcGh5X3VscGlfZXh0X3ZidXM7CglpbnQzMl90IGkyY19lbmFibGU7CglpbnQzMl90IHVscGlfZnNfbHM7CglpbnQzMl90IHRzX2RsaW5lOwoJaW50MzJfdCBlbl9tdWx0aXBsZV90eF9maWZvOwoJdWludDMyX3QgZGV2X3R4X2ZpZm9fc2l6ZVtNQVhfVFhfRklGT1NdOwoJdWludDMyX3QgdGhyX2N0bDsKCXVpbnQzMl90IHR4X3Rocl9sZW5ndGg7Cgl1aW50MzJfdCByeF90aHJfbGVuZ3RoOwoJaW50MzJfdCBwdGlfZW5hYmxlOwoJaW50MzJfdCBtcGlfZW5hYmxlOwoJaW50MzJfdCBscG1fZW5hYmxlOwoJaW50MzJfdCBpY191c2JfY2FwOwoJaW50MzJfdCBhaGJfdGhyX3JhdGlvOwoJaW50MzJfdCBwb3dlcl9kb3duOwoJaW50MzJfdCByZWxvYWRfY3RsOwoJaW50MzJfdCBkZXZfb3V0X25hazsKCWludDMyX3QgY29udF9vbl9ibmE7CglpbnQzMl90IGFoYl9zaW5nbGU7CglpbnQzMl90IG90Z192ZXI7CglpbnQzMl90IGFkcF9lbmFibGU7Cn07CgpzdGF0aWMgc3RydWN0IGR3Y19vdGdfZHJpdmVyX21vZHVsZV9wYXJhbXMgZHdjX290Z19tb2R1bGVfcGFyYW1zID0gewoJLm9wdCA9IC0xLAoJLm90Z19jYXAgPSAtMSwKCS5kbWFfZW5hYmxlID0gLTEsCgkuZG1hX2Rlc2NfZW5hYmxlID0gLTEsCgkuZG1hX2J1cnN0X3NpemUgPSAtMSwKCS5zcGVlZCA9IC0xLAoJLmhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIgPSAtMSwKCS5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrID0gLTEsCgkuZW5hYmxlX2R5bmFtaWNfZmlmbyA9IC0xLAoJLmRhdGFfZmlmb19zaXplID0gLTEsCgkuZGV2X3J4X2ZpZm9fc2l6ZSA9IC0xLAoJLmRldl9ucGVyaW9fdHhfZmlmb19zaXplID0gLTEsCgkuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZSA9IHsKCQkJCSAgIC8qIGRldl9wZXJpb190eF9maWZvX3NpemVfMSAqLwoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xCgkJCQkgICAvKiAxNSAqLwoJCQkJICAgfSwKCS5ob3N0X3J4X2ZpZm9fc2l6ZSA9IC0xLAoJLmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSA9IC0xLAoJLmhvc3RfcGVyaW9fdHhfZmlmb19zaXplID0gLTEsCgkubWF4X3RyYW5zZmVyX3NpemUgPSAtMSwKCS5tYXhfcGFja2V0X2NvdW50ID0gLTEsCgkuaG9zdF9jaGFubmVscyA9IC0xLAoJLmRldl9lbmRwb2ludHMgPSAtMSwKCS5waHlfdHlwZSA9IC0xLAoJLnBoeV91dG1pX3dpZHRoID0gLTEsCgkucGh5X3VscGlfZGRyID0gLTEsCgkucGh5X3VscGlfZXh0X3ZidXMgPSAtMSwKCS5pMmNfZW5hYmxlID0gLTEsCgkudWxwaV9mc19scyA9IC0xLAoJLnRzX2RsaW5lID0gLTEsCgkuZW5fbXVsdGlwbGVfdHhfZmlmbyA9IC0xLAoJLmRldl90eF9maWZvX3NpemUgPSB7CgkJCSAgICAgLyogZGV2X3R4X2ZpZm9fc2l6ZSAqLwoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xCgkJCSAgICAgLyogMTUgKi8KCQkJICAgICB9LAoJLnRocl9jdGwgPSAtMSwKCS50eF90aHJfbGVuZ3RoID0gLTEsCgkucnhfdGhyX2xlbmd0aCA9IC0xLAoJLnB0aV9lbmFibGUgPSAtMSwKCS5tcGlfZW5hYmxlID0gLTEsCgkubHBtX2VuYWJsZSA9IC0xLAoJLmljX3VzYl9jYXAgPSAtMSwKCS5haGJfdGhyX3JhdGlvID0gLTEsCgkucG93ZXJfZG93biA9IC0xLAoJLnJlbG9hZF9jdGwgPSAtMSwKCS5kZXZfb3V0X25hayA9IC0xLAoJLmNvbnRfb25fYm5hID0gLTEsCgkuYWhiX3NpbmdsZSA9IC0xLAoJLm90Z192ZXIgPSAtMSwKCS5hZHBfZW5hYmxlID0gLTEsCn07CgovKioKICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgRHJpdmVyIFZlcnNpb24uCiAqLwpzdGF0aWMgc3NpemVfdCB2ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRldiwgY2hhciAqYnVmKQp7CglyZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoRFdDX0RSSVZFUl9WRVJTSU9OKSArIDIsICIlc1xuIiwKCQkJRFdDX0RSSVZFUl9WRVJTSU9OKTsKfQoKc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVR08sIHZlcnNpb25fc2hvdywgTlVMTCk7CgovKioKICogR2xvYmFsIERlYnVnIExldmVsIE1hc2suCiAqLwp1aW50MzJfdCBnX2RiZ19sdmwgPSAwOwkJLyogT0ZGICovCgovKioKICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgZHJpdmVyIERlYnVnIExldmVsLgogKi8Kc3RhdGljIHNzaXplX3QgZGJnX2xldmVsX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY2hhciAqYnVmKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIweCUweFxuIiwgZ19kYmdfbHZsKTsKfQoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHRoZSBkcml2ZXIgRGVidWcgTGV2ZWwuCiAqLwpzdGF0aWMgc3NpemVfdCBkYmdfbGV2ZWxfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqYnVmLAoJCQkgICAgICAgc2l6ZV90IGNvdW50KQp7CglnX2RiZ19sdmwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERSSVZFUl9BVFRSKGRlYnVnbGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLCBkYmdfbGV2ZWxfc2hvdywKCQkgICBkYmdfbGV2ZWxfc3RvcmUpOwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBtb2R1bGUgaW50aWFsaXphdGlvbgogKiB0byBwYXNzIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIHRoZSBEV0NfT1RHIENPUkUuCiAqLwpzdGF0aWMgaW50IHNldF9wYXJhbWV0ZXJzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKewoJaW50IHJldHZhbCA9IDA7CglpbnQgaTsKCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXAgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fb3RnX2NhcChjb3JlX2lmLAoJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfY2FwKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kbWFfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBkbWFfZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2Rlc2NfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9kZXNjX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICAgIGRtYV9kZXNjX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9vcHQoY29yZV9pZiwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRtYV9idXJzdF9zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9idXJzdF9zaXplKGNvcmVfaWYsCgkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgIGRtYV9idXJzdF9zaXplKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyKGNvcmVfaWYsCgkJCQkJCQkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJCSAgIGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5lbmFibGVfZHluYW1pY19maWZvICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm8oY29yZV9pZiwKCQkJCQkJCSAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICBlbmFibGVfZHluYW1pY19maWZvKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGF0YV9maWZvX3NpemUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGF0YV9maWZvX3NpemUoY29yZV9pZiwKCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICAgZGF0YV9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcnhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9yeF9maWZvX3NpemUoY29yZV9pZiwKCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICAgIGRldl9yeF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICAgICAgZGV2X25wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3J4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3J4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJCSAgICAgICBob3N0X25wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICAgICAgaG9zdF9wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfdHJhbnNmZXJfc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZShjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJbWF4X3RyYW5zZmVyX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfcGFja2V0X2NvdW50ICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoY29yZV9pZiwKCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICAgIG1heF9wYWNrZXRfY291bnQpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X2NoYW5uZWxzICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgIGhvc3RfY2hhbm5lbHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfZW5kcG9pbnRzICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9lbmRwb2ludHMoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgIGRldl9lbmRwb2ludHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdHlwZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmLAoJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3R5cGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5zcGVlZCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9zcGVlZChjb3JlX2lmLAoJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuc3BlZWQpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsoY29yZV9pZiwKCQkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkJaG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsayk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2RkciAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9kZHIoY29yZV9pZiwKCQkJCQkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICBwaHlfdWxwaV9kZHIpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdWxwaV9leHRfdmJ1cyAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9leHRfdmJ1cyhjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJcGh5X3VscGlfZXh0X3ZidXMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdXRtaV93aWR0aCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdXRtaV93aWR0aChjb3JlX2lmLAoJCQkJCQkgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICBwaHlfdXRtaV93aWR0aCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnVscGlfZnNfbHMgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fdWxwaV9mc19scyhjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLnVscGlfZnNfbHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50c19kbGluZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV90c19kbGluZShjb3JlX2lmLAoJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5pMmNfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2kyY19lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIGkyY19lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5lbl9tdWx0aXBsZV90eF9maWZvICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oY29yZV9pZiwKCQkJCQkJCSAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICBlbl9tdWx0aXBsZV90eF9maWZvKTsKCX0KCglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplW2ldICE9IC0xKSB7CgkJCXJldHZhbCArPQoJCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJCSAgICAgZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZQoJCQkJCQkJCSAgICAgW2ldLCBpKTsKCQl9Cgl9CgoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewoJCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVtpXSAhPSAtMSkgewoJCQlyZXR2YWwgKz0gZHdjX290Z19zZXRfcGFyYW1fZGV2X3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJCSAgICAgZGV2X3R4X2ZpZm9fc2l6ZQoJCQkJCQkJCSAgICAgW2ldLCBpKTsKCQl9Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnRocl9jdGwgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fdGhyX2N0bChjb3JlX2lmLAoJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50aHJfY3RsKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubXBpX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9tcGlfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBtcGlfZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucHRpX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9wdGlfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBwdGlfZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubHBtX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9scG1fZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBscG1fZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaWNfdXNiX2NhcCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9pY191c2JfY2FwKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBpY191c2JfY2FwKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHhfdGhyX2xlbmd0aCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV90eF90aHJfbGVuZ3RoKGNvcmVfaWYsCgkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHhfdGhyX2xlbmd0aCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnJ4X3Rocl9sZW5ndGggIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcnhfdGhyX2xlbmd0aChjb3JlX2lmLAoJCQkJCQkgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgcnhfdGhyX2xlbmd0aCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl90aHJfcmF0aW8gIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fYWhiX3Rocl9yYXRpbyhjb3JlX2lmLAoJCQkJCQkgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl90aHJfcmF0aW8pOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wb3dlcl9kb3duICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3Bvd2VyX2Rvd24oY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wb3dlcl9kb3duKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucmVsb2FkX2N0bCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9yZWxvYWRfY3RsKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucmVsb2FkX2N0bCk7Cgl9CgoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfb3V0X25hayAhPSAtMSkgewoJCXJldHZhbCArPQoJCQlkd2Nfb3RnX3NldF9wYXJhbV9kZXZfb3V0X25hayhjb3JlX2lmLAoJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X291dF9uYWspOwoJfQoKCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuY29udF9vbl9ibmEgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkJZHdjX290Z19zZXRfcGFyYW1fY29udF9vbl9ibmEoY29yZV9pZiwKCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLmNvbnRfb25fYm5hKTsKCX0KCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl9zaW5nbGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkJZHdjX290Z19zZXRfcGFyYW1fYWhiX3NpbmdsZShjb3JlX2lmLAoJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3NpbmdsZSk7Cgl9CgoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfdmVyICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX290Z192ZXIoY29yZV9pZiwKCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX3Zlcik7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmFkcF9lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fYWRwX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgYWRwX2VuYWJsZSk7Cgl9CglyZXR1cm4gcmV0dmFsOwp9CgoKLyoqCiAqIFBsYXRmb3JtIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciBVU0IgMiBQSFkKICovCnN0YXRpYyB2b2lkIGNvbWNlcnRvX3VzYjJfcGh5X2luaXQodm9pZCkKewoJCXVpbnQzMl90IHJkX2RhdGE7CgojZGVmaW5lIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCAJKENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UgKyAweDAwMCkKI2RlZmluZSBDT01DRVJUT19VU0IwX0RXQ19DRkdfUkVHRiAJCShVU0IyX1BIWV9CQVNFICsgMHgwM0MpCgoKCQkvKiB0YWtlIGRldmljZSBvdXQgb2YgcmVzZXQgLCBlbmFibGUgY2xvY2suICovCgkJLyogUHJvZ3JhbW1pbmcgdGhlIFVTQjAgUEhZIENPTlRST0wgUkVHSVNURVIgKi8KCQkvKglCaXRbMl06dXNiMF92YnVzdmxkZXh0c2VsIC0gVGhlIGludGVybmFsIFNlc3Npb24gVmFsaWQgY29tcGFyYXRvciBpcyB1c2VkLgoJCSAqIEJpdFszXTp1c2IwX3ZidXN2bGRleHQgLSBUaGUgVkJVUyBzaWduYWwgaXMgbm90IHZhbGlkLCBhbmQgdGhlIHB1bGwtdXAgcmVzaXN0b3Igb24gRCsgaXMgZGlzYWJsZWQuCgkJICogQml0WzRdOnVzYjBfb3RnZGlzYWJsZSAgLSBUVGhlIE9URyBibG9jayBpcyBwb3dlcmVkIHVwLgoJCSAqIEJpdFsxNzoxNl06dXNiMF9yZWZjbGtkaXYgLSBSZWZlcmVuY2UgQ2xvY2sgRnJlcXVlbmN5IFNlbGVjdCwgNDggTUh6CgkJICogQml0WzIxOjIwXTp1c2IwX3JlZmNsa3NlbCAtIFRoZSBYTyBibG9jayB1c2VzIGFuIGV4dGVybmFsLCAyLjUgViBjbG9jayBzdXBwbGllZCBvbiB0aGUgWE8gcGluLgoJCSAqLwoJCWlmKEhBTF9nZXRfcmVmX2NsaygpID09IFJFRl9DTEtfMjRNSFopCgkJCXdyaXRlbCgweDAwMjEwMDAwLCBDT01DRVJUT19VU0IwX1BIWV9DVFJMX1JFRzApOyAgLy8yNE1IeiByZWYgY2xrCgkJZWxzZQoJCQl3cml0ZWwoMHgwMDIyMDAwMCwgQ09NQ0VSVE9fVVNCMF9QSFlfQ1RSTF9SRUcwKTsgIC8vNDhNSHogcmVmIGNsawoKCQkvKiBQcm9ncmFtbWluZyB0aGUgSURTRUwgdmFsdWVzIHRvIFVTQiAyLjAgQ29udHJvbGxlciBAIERXQ19DRkdfUkVHRiByZWdpc3RlciAqLwoJCS8qIENvbmZpZ3VyaW5nIHRoZSB1c2IyIGNvbnRyb2xsZXIgdG8gc2VsZWN0IHRoZSBJRCB2YWx1ZSBmcm9tIHJlZ2lzdGVyICovCgkJcmRfZGF0YSA9IHJlYWRsKENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKCgkJLyoJQml0WzhdOnVzYjBfaWRfc2VsIC0gU2VsZWN0cyBmcm9tIHRoZSByZWdpc3RlciBiaXQKCQkgKglCaXRbOV06dXNiMV9pZF9zZWwgLSBTZWxlY3RzIGZyb20gdGhlIHJlZ2lzdGVyIGJpdAoJCSAqLwoJCXJkX2RhdGEgPSAoKHJkX2RhdGEgJiAweEZGRkYxMUZGKXwgMHgwMDAwMTEwMCk7ICAvL0ZvciBIb3N0IG1vZGUuCgkJd3JpdGVsIChyZF9kYXRhLCBDT01DRVJUT19VU0IwX0RXQ19DRkdfUkVHRik7CgoKCQkvKiBQcm9ncmFtbWluZyBVU0IyLjAgY29udHJvbGxlciB3aXRoIHNjYWxlIGRvd24gdmFsdWUuICovCgkJLyogQ29uZmlndXJpbmcgdGhlIHVzYjIgY29udHJvbGxlciBpbiBzY2FsZWRvd24gZGlzYWJsZSBtb2RlICovCgkJcmRfZGF0YSA9IHJlYWRsKENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKCQlyZF9kYXRhID0gKChyZF9kYXRhICYgMHhGRkZGRkZGMCl8IDB4MCk7CgkJd3JpdGVsIChyZF9kYXRhLCBDT01DRVJUT19VU0IwX0RXQ19DRkdfUkVHRik7Cn0KCgoKLyoqCiAqIFBsYXRmb3JtIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciBEd2MgT1RHIENvbnRyb2xsZXIKICovCnN0YXRpYyB2b2lkIGNvbWNlcnRvX3N0YXJ0X2R3Y19vdGcodm9pZCkKewoJLyogR2V0IHRoZSBGQVNULVVBUlQgY2xrIHN0cnVjdHVyZSBmcm9tIERVUyAsVG8gYmUgdXNlZCBmb3IgVUFSVDAvVUFSVDEgaW5pdGlsaXphdGlvbiAqLwoJdXNiMl9jbGsgPSBjbGtfZ2V0KE5VTEwsInVzYjAiKTsKCgkvKiBFbmFibGUgdGhlIENsb2NrICovCglpZiAoY2xrX2VuYWJsZSh1c2IyX2NsaykpewoJCXByX2VycigiY29tY2VydG9fc3RhcnRfZHdjX290ZzpVbmFibGUgdG8gZW5hYmxlIHRoZSB1c2IyIGNsb2NrIFxuIik7Cgl9CgoJLyogVVNCIDIuMCBQSFkgSW5pdGlhbGl6YXRpb24gKi8KCWNvbWNlcnRvX3VzYjJfcGh5X2luaXQoKTsKCgkvKiBDb250aW51aW5nIHJlc2V0cyBvbiB1c2IyIGNvbnRyb2xsZXIrcGh5IGJsb2NrcyAqLwoKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFVUTUkgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VVE1JX1VTQjAsIDEpOwoKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFBIWSAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAxKTsKCgkvKiBBUExMWUlORyBSRVNFVCBUTyBVU0IyIEFYSSBSRVNFVCAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9VU0IwLCAxKTsKCgkvKiBSZWxlYXNpbmcgdGhlIChQT1IpIFBvd2VyIG9uIFJlc2V0IHRvIHVzYjIgbmFubyBwaHkgYmxvY2sgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IwX1BIWSwgMCk7CgoJLyogUmVsZWFzaW5nIHRoZSBVVE1JIFJlc2V0IHRvIHVzYjIgY29udHJvbGxlciBibG9jayAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMCwgMCk7CgoJLyogUmVsZWFzaW5nIHRoZSBBSEIgUmVzZXQgdG8gdXNiMiBjb250cm9sbGVyIGJsb2NrIC0tIEJpdFs0XS1VU0IzLEJpdFszXS1VU0IyICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjAsIDApOwp9CgoKLyoqCiAqIFBsYXRmb3JtIHNwZWNpZmljIFNodXRkb3duIGZvciBEd2MgT1RHIENvbnRyb2xsZXIKICovCnN0YXRpYyB2b2lkIGNvbWNlcnRvX3N0b3BfZHdjX290Zyh2b2lkKQp7CgkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMiBVVE1JICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVRNSV9VU0IwLCAxKTsKCgkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMiBQSFkgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IwX1BIWSwgMSk7CgoJLyogQVBMTFlJTkcgUkVTRVQgVE8gVVNCMiBBWEkgUkVTRVQgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfVVNCMCwgMSk7CgoJLyogRGlzYWJsZSB0aGUgQ2xvY2sgKi8KCWNsa19kaXNhYmxlKHVzYjJfY2xrKTsKCgkvKiBSZWxlYXNlIHRoZSBjbG9jayAqLwoJY2xrX3B1dCh1c2IyX2Nsayk7Cn0KCgovKioKICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ29tbW9uCiAqIChEZXZpY2UgYW5kIGhvc3QgbW9kZXMpIGludGVycnVwdHMuCiAqLwpzdGF0aWMgaXJxcmV0dXJuX3QgZHdjX290Z19jb21tb25faXJxKGludCBpcnEsIHZvaWQgKmRldikKewoJaW50MzJfdCByZXR2YWwgPSBJUlFfTk9ORTsKCglyZXR2YWwgPSBkd2Nfb3RnX2hhbmRsZV9jb21tb25faW50cihkZXYpOwoJaWYgKHJldHZhbCAhPSAwKSB7CgkJUzNDMjQxMFhfQ0xFQVJfRUlOVFBFTkQoKTsKCX0KCXJldHVybiBJUlFfUkVUVkFMKHJldHZhbCk7Cn0KCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbG1fZGV2aWNlIGlzIHVucmVnaXN0ZXJlZCB3aXRoIHRoZQogKiBkd2Nfb3RnX2RyaXZlci4gVGhpcyBoYXBwZW5zLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgcm1tb2QgY29tbWFuZCBpcwogKiBleGVjdXRlZC4gVGhlIGRldmljZSBtYXkgb3IgbWF5IG5vdCBiZSBlbGVjdHJpY2FsbHkgcHJlc2VudC4gSWYgaXQgaXMKICogcHJlc2VudCwgdGhlIGRyaXZlciBzdG9wcyBkZXZpY2UgcHJvY2Vzc2luZy4gQW55IHJlc291cmNlcyB1c2VkIG9uIGJlaGFsZgogKiBvZiB0aGlzIGRldmljZSBhcmUgZnJlZWQuCiAqCiAqIEBwYXJhbSBfZGV2CiAqLwpzdGF0aWMgdm9pZCBkd2Nfb3RnX2RyaXZlcl9yZW1vdmUoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJCQkgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCQkJIHN0cnVjdCBwY2lfZGV2ICpfZGV2CiNlbHNlCgkJCQkJIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApCnsKI2lmZGVmIExNX0lOVEVSRkFDRQoJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKF9kZXYpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gcGNpX2dldF9kcnZkYXRhKF9kZXYpOwojZWxzZQoJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKF9kZXYpOwojZW5kaWYKCglEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgX2Rldik7CgoJaWYgKCFvdGdfZGV2KSB7CgkJLyogTWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBkd2Nfb3RnX2RldmljZSBmYWlsZWQuICovCgkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2IE5VTEwhXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQojaWZuZGVmIERXQ19ERVZJQ0VfT05MWQoJaWYgKG90Z19kZXYtPmhjZCkgewoJCWhjZF9yZW1vdmUoX2Rldik7Cgl9IGVsc2UgewoJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2Rldi0+aGNkIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQojZW5kaWYKCiNpZm5kZWYgRFdDX0hPU1RfT05MWQoJaWYgKG90Z19kZXYtPnBjZCkgewoJCXBjZF9yZW1vdmUoX2Rldik7Cgl9IGVsc2UgewoJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2Rldi0+cGNkIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQojZW5kaWYKCS8qCgkgKiBGcmVlIHRoZSBJUlEKCSAqLwoJaWYgKG90Z19kZXYtPmNvbW1vbl9pcnFfaW5zdGFsbGVkKSB7CgkJZnJlZV9pcnEob3RnX2Rldi0+aXJxLCBvdGdfZGV2KTsKCX0gZWxzZSB7CgkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBUaGVyZSBpcyBubyBpbnN0YWxsZWQgaXJxIVxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KCglpZiAob3RnX2Rldi0+Y29yZV9pZikgewoJCWR3Y19vdGdfY2lsX3JlbW92ZShvdGdfZGV2LT5jb3JlX2lmKTsKCX0gZWxzZSB7CgkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2LT5jb3JlX2lmIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBSZW1vdmUgdGhlIGRldmljZSBhdHRyaWJ1dGVzCgkgKi8KCWR3Y19vdGdfYXR0cl9yZW1vdmUoX2Rldik7CgoJLyoKCSAqIFJldHVybiB0aGUgbWVtb3J5LgoJICovCglpZiAob3RnX2Rldi0+b3NfZGVwLmJhc2UpIHsKCQlpb3VubWFwKG90Z19kZXYtPm9zX2RlcC5iYXNlKTsKCX0KCgkvKiBEbyB0aGUgUGxhdGZvcm0gc3BlY2lmaWMgc2h1dGRvd24gKi8KCWNvbWNlcnRvX3N0b3BfZHdjX290ZygpOwoKCURXQ19GUkVFKG90Z19kZXYpOwoKCS8qCgkgKiBDbGVhciB0aGUgZHJ2ZGF0YSBwb2ludGVyLgoJICovCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCWxtX3NldF9kcnZkYXRhKF9kZXYsIDApOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCiAgICByZWxlYXNlX21lbV9yZWdpb24ob3RnX2Rldi0+b3NfZGVwLnJzcmNfc3RhcnQsIG90Z19kZXYtPm9zX2RlcC5yc3JjX2xlbik7CglwY2lfc2V0X2RydmRhdGEoX2RldiwgMCk7CiNlbHNlCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShfZGV2LCAwKTsKI2VuZGlmCn0KCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGxtX2RldmljZSBpcyBib3VuZCB0byBhCiAqIGR3Y19vdGdfZHJpdmVyLiBJdCBjcmVhdGVzIHRoZSBkcml2ZXIgY29tcG9uZW50cyByZXF1aXJlZCB0bwogKiBjb250cm9sIHRoZSBkZXZpY2UgKENJTCwgSENELCBhbmQgUENEKSBhbmQgaXQgaW5pdGlhbGl6ZXMgdGhlCiAqIGRldmljZS4gVGhlIGRyaXZlciBjb21wb25lbnRzIGFyZSBzdG9yZWQgaW4gYSBkd2Nfb3RnX2RldmljZQogKiBzdHJ1Y3R1cmUuIEEgcmVmZXJlbmNlIHRvIHRoZSBkd2Nfb3RnX2RldmljZSBpcyBzYXZlZCBpbiB0aGUKICogbG1fZGV2aWNlLiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGFjY2VzcyB0aGUgZHdjX290Z19kZXZpY2UKICogc3RydWN0dXJlIG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8gZHJpdmVyIG1ldGhvZHMgZm9yIHRoaXMgZGV2aWNlLgogKgogKiBAcGFyYW0gX2RldiBCdXMgZGV2aWNlCiAqLwpzdGF0aWMgaW50IGR3Y19vdGdfZHJpdmVyX3Byb2JlKAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCQkgICAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKl9kZXYsCgkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkCiNlbHNlCgkJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApCnsKCWludCByZXR2YWwgPSAwOwoJZHdjX290Z19kZXZpY2VfdCAqZHdjX290Z19kZXZpY2U7CgoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZHdjX290Z19kcml2ZXJfcHJvYmUoJXApXG4iLCBfZGV2KTsKI2lmZGVmIExNX0lOVEVSRkFDRQoJZGV2X2RiZygmX2Rldi0+ZGV2LCAic3RhcnQ9MHglMDh4XG4iLCAodW5zaWduZWQpX2Rldi0+cmVzb3VyY2Uuc3RhcnQpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglpZiAoIWlkKSB7CgkJRFdDX0VSUk9SKCJJbnZhbGlkIHBjaV9kZXZpY2VfaWQgJXAiLCBpZCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJaWYgKCFfZGV2IHx8IChwY2lfZW5hYmxlX2RldmljZShfZGV2KSA8IDApKSB7CgkJRFdDX0VSUk9SKCJJbnZhbGlkIHBjaV9kZXZpY2UgJXAiLCBfZGV2KTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgInN0YXJ0PTB4JTA4eFxuIiwgKHVuc2lnbmVkKXBjaV9yZXNvdXJjZV9zdGFydChfZGV2LDApKTsKCS8qIG90aGVyIHN0dWZmIG5lZWRlZCBhcyB3ZWxsPyAqLwojZWxzZQoJZGV2X2RiZygmX2Rldi0+ZGV2LCAic3RhcnQ9MHglMDh4XG4iLCAodW5zaWduZWQpX2Rldi0+cmVzb3VyY2UtPnN0YXJ0KTsKI2VuZGlmCgoJZHdjX290Z19kZXZpY2UgPSBEV0NfQUxMT0Moc2l6ZW9mKGR3Y19vdGdfZGV2aWNlX3QpKTsKCglpZiAoIWR3Y19vdGdfZGV2aWNlKSB7CgkJZGV2X2VycigmX2Rldi0+ZGV2LCAia21hbGxvYyBvZiBkd2Nfb3RnX2RldmljZSBmYWlsZWRcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCW1lbXNldChkd2Nfb3RnX2RldmljZSwgMCwgc2l6ZW9mKCpkd2Nfb3RnX2RldmljZSkpOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yZWdfb2Zmc2V0ID0gMHhGRkZGRkZGRjsKCgkvKiBQbGF0Zm9ybSBTcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLwoJY29tY2VydG9fc3RhcnRfZHdjX290ZygpOwoKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucGFyZW50PSAmX2Rldi0+ZGV2OwoKCS8qCgkgKiBNYXAgdGhlIERXQ19vdGcgQ29yZSBtZW1vcnkgaW50byB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCgkgKi8KI2lmZGVmIExNX0lOVEVSRkFDRQoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID0gaW9yZW1hcChfZGV2LT5yZXNvdXJjZS5zdGFydCwgU1pfMjU2Syk7CgoJaWYgKCFkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJpb3JlbWFwKCkgZmFpbGVkXG4iKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JTA4eFxuIiwKCQkodW5zaWduZWQpZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJX2Rldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9EMDsKCV9kZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CgoJaWYgKCFfZGV2LT5pcnEpIHsKCQlEV0NfRVJST1IoIkZvdW5kIEhDIHdpdGggbm8gSVJRLiBDaGVjayBCSU9TL1BDSSAlcyBzZXR1cCEiLAoJCQkgIHBjaV9uYW1lKF9kZXYpKTsKCQlpb3VubWFwKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CgkJRFdDX0ZSRUUoZHdjX290Z19kZXZpY2UpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChfZGV2LCAwKTsKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKF9kZXYsIDApOwoJRFdDX0RFQlVHUEwoREJHX0FOWSwgIlBDSSByZXNvdXJjZTogc3RhcnQ9JTA4eCwgbGVuPSUwOHhcbiIsCgkJICAgICh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQsCgkJICAgICh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfbGVuKTsKCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uCgkgICAgKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwgZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbiwKCSAgICAgImR3Y19vdGciKSkgewoJCWRldl9kYmcoJl9kZXYtPmRldiwgImVycm9yIHJlcXVlc3RpbmcgbWVtb3J5XG4iKTsKCQlpb3VubWFwKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CgkJRFdDX0ZSRUUoZHdjX290Z19kZXZpY2UpOwoJCXJldHVybiAtRUZBVUxUOwoJfQoKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9CgkgICAgaW9yZW1hcF9ub2NhY2hlKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQkJICAgIGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOwoJaWYgKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9PSBOVUxMKSB7CgkJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZXJyb3IgbWFwcGluZyBtZW1vcnlcbiIpOwoJCXJlbGVhc2VfbWVtX3JlZ2lvbihkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQsCgkJCQkgICBkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfbGVuKTsKCQlpb3VubWFwKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CgkJRFdDX0ZSRUUoZHdjX290Z19kZXZpY2UpOwoJCXJldHVybiAtRUZBVUxUOwoJfQoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiYmFzZT0weCVwIChiZWZvcmUgYWRqdXN0KSBcbiIsCgkJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9IChjaGFyICopZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlOwoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiYmFzZT0weCVwIChhZnRlciBhZGp1c3QpIFxuIiwKCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiJXM6IG1hcHBlZCBQQSAweCV4IHRvIFZBIDB4JXBcbiIsIF9fZnVuY19fLAoJCSh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQsCgkJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCglwY2lfc2V0X21hc3RlcihfZGV2KTsKCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CiNlbHNlCglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UgPSBpb3JlbWFwKF9kZXYtPnJlc291cmNlLT5zdGFydCwgU1pfMjU2Syk7CgoJaWYgKCFkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJpb3JlbWFwKCkgZmFpbGVkXG4iKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JTA4eFxuIiwKCQkodW5zaWduZWQpZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKI2VuZGlmCgoJLyoKCSAqIFJldHJpZXZlIHRoZSBtZW1vcnkgYW5kIElSUSByZXNvdXJjZXMuCgkgKi8KCSBkd2Nfb3RnX2RldmljZS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShfZGV2LCAwKTsKCWlmIChkd2Nfb3RnX2RldmljZS0+aXJxIDw9IDApIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJubyBkZXZpY2UgaXJxXG4iKTsKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWdvdG8gZmFpbDsKCX0KCgkvKgoJICogSW5pdGlhbGl6ZSBkcml2ZXIgZGF0YSB0byBwb2ludCB0byB0aGUgZ2xvYmFsIERXQ19vdGcKCSAqIERldmljZSBzdHJ1Y3R1cmUuCgkgKi8KI2lmZGVmIExNX0lOVEVSRkFDRQoJbG1fc2V0X2RydmRhdGEoX2RldiwgZHdjX290Z19kZXZpY2UpOwojZWxzZQoJcGxhdGZvcm1fc2V0X2RydmRhdGEoX2RldiwgZHdjX290Z19kZXZpY2UpOwoJX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSBkd2Nfb3RnX2RldmljZTsKI2VuZGlmCglkZXZfZGJnKCZfZGV2LT5kZXYsICJkd2Nfb3RnX2RldmljZT0weCVwXG4iLCBkd2Nfb3RnX2RldmljZSk7CgoJZHdjX290Z19kZXZpY2UtPmNvcmVfaWYgPSBkd2Nfb3RnX2NpbF9pbml0KGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CglpZiAoIWR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSB7CgkJZGV2X2VycigmX2Rldi0+ZGV2LCAiQ0lMIGluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwoJCXJldHZhbCA9IC1FTk9NRU07CgkJZ290byBmYWlsOwoJfQoKCS8qCgkgKiBBdHRlbXB0IHRvIGVuc3VyZSB0aGlzIGRldmljZSBpcyByZWFsbHkgYSBEV0Nfb3RnIENvbnRyb2xsZXIuCgkgKiBSZWFkIGFuZCB2ZXJpZnkgdGhlIFNOUFNJRCByZWdpc3RlciBjb250ZW50cy4gVGhlIHZhbHVlIHNob3VsZCBiZQoJICogMHg0NUY0MlhYWCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gIk9UMiIsIGFzIGluICJPVEcgdmVyc2lvbiAyLlhYIi4KCSAqLwoKCWlmICgoZHdjX290Z19nZXRfZ3NucHNpZChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikgJiAweEZGRkZGMDAwKSAhPQoJICAgIDB4NEY1NDIwMDApIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJCYWQgdmFsdWUgZm9yIFNOUFNJRDogMHglMDh4XG4iLAoJCQlkd2Nfb3RnX2dldF9nc25wc2lkKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSk7CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlnb3RvIGZhaWw7Cgl9CgoJLyoKCSAqIFZhbGlkYXRlIHBhcmFtZXRlciB2YWx1ZXMuCgkgKi8KCWlmIChzZXRfcGFyYW1ldGVycyhkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikpIHsKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWdvdG8gZmFpbDsKCX0KCgkvKgoJICogQ3JlYXRlIERldmljZSBBdHRyaWJ1dGVzIGluIHN5c2ZzCgkgKi8KCWR3Y19vdGdfYXR0cl9jcmVhdGUoX2Rldik7CgoJLyoKCSAqIERpc2FibGUgdGhlIGdsb2JhbCBpbnRlcnJ1cHQgdW50aWwgYWxsIHRoZSBpbnRlcnJ1cHQKCSAqIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQuCgkgKi8KCWR3Y19vdGdfZGlzYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CgoJLyoKCSAqIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgY29tbW9uIGludGVycnVwdHMgYmVmb3JlCgkgKiBlbmFibGluZyBjb21tb24gaW50ZXJydXB0cyBpbiBjb3JlX2luaXQgYmVsb3cuCgkgKi8KCURXQ19ERUJVR1BMKERCR19DSUwsICJyZWdpc3RlcmluZyAoY29tbW9uKSBoYW5kbGVyIGZvciBpcnElZFxuIiwKCQkgICAgZHdjX290Z19kZXZpY2UtPmlycSk7CglyZXR2YWwgPSByZXF1ZXN0X2lycShkd2Nfb3RnX2RldmljZS0+aXJxLCBkd2Nfb3RnX2NvbW1vbl9pcnEsCgkJCSAgICAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVEIHwgSVJRX0xFVkVMLCAiZHdjX290ZyIsCgkJCSAgICAgZHdjX290Z19kZXZpY2UpOwoJaWYgKHJldHZhbCkgewoJCURXQ19FUlJPUigicmVxdWVzdCBvZiBpcnElZCBmYWlsZWRcbiIsIGR3Y19vdGdfZGV2aWNlLT5pcnEpOwoJCXJldHZhbCA9IC1FQlVTWTsKCQlnb3RvIGZhaWw7Cgl9IGVsc2UgewoJCWR3Y19vdGdfZGV2aWNlLT5jb21tb25faXJxX2luc3RhbGxlZCA9IDE7Cgl9CgojaWZkZWYgTE1fSU5URVJGQUNFCglzZXRfaXJxX3R5cGUoX2Rldi0+aXJxLCBJUlFUX0xPVyk7CiNlbmRpZgoJLyoKCSAqIEluaXRpYWxpemUgdGhlIERXQ19vdGcgY29yZS4KCSAqLwoJZHdjX290Z19jb3JlX2luaXQoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpOwoKI2lmbmRlZiBEV0NfSE9TVF9PTkxZCgkvKgoJICogSW5pdGlhbGl6ZSB0aGUgUENECgkgKi8KCXJldHZhbCA9IHBjZF9pbml0KF9kZXYpOwoJaWYgKHJldHZhbCAhPSAwKSB7CgkJRFdDX0VSUk9SKCJwY2RfaW5pdCBmYWlsZWRcbiIpOwoJCWR3Y19vdGdfZGV2aWNlLT5wY2QgPSBOVUxMOwoJCWdvdG8gZmFpbDsKCX0KI2VuZGlmCiNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCgkvKgoJICogSW5pdGlhbGl6ZSB0aGUgSENECgkgKi8KCXJldHZhbCA9IGhjZF9pbml0KF9kZXYpOwoJaWYgKHJldHZhbCAhPSAwKSB7CgkJRFdDX0VSUk9SKCJoY2RfaW5pdCBmYWlsZWRcbiIpOwoJCWR3Y19vdGdfZGV2aWNlLT5oY2QgPSBOVUxMOwoJCWdvdG8gZmFpbDsKCX0KI2VuZGlmCiNpZmRlZiBQQ0lfSU5URVJGQUNFCglwY2lfc2V0X2RydmRhdGEoX2RldiwgZHdjX290Z19kZXZpY2UpOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5wY2lkZXYgPSBfZGV2OwojZW5kaWYKCgkvKgoJICogRW5hYmxlIHRoZSBnbG9iYWwgaW50ZXJydXB0IGFmdGVyIGFsbCB0aGUgaW50ZXJydXB0CgkgKiBoYW5kbGVycyBhcmUgaW5zdGFsbGVkIGlmIHRoZXJlIGlzIG5vIEFEUCBzdXBwb3J0IGVsc2UKCSAqIHBlcmZvcm0gaW5pdGlhbCBhY3Rpb25zIHJlcXVpcmVkIGZvciBJbnRlcm5hbCBBRFAgbG9naWMuCgkgKi8KCWlmICghZHdjX290Z19nZXRfcGFyYW1fYWRwX2VuYWJsZShkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikpCgkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpOwoJZWxzZQoJCWR3Y19vdGdfYWRwX3N0YXJ0KGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmLAoJCQkJCQkJZHdjX290Z19pc19ob3N0X21vZGUoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpKTsKCglyZXR1cm4gMDsKCmZhaWw6Cglkd2Nfb3RnX2RyaXZlcl9yZW1vdmUoX2Rldik7CglyZXR1cm4gcmV0dmFsOwp9CgojaWYgMAovKioKICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBjYWxsZWQgYnkgYSBidXMgZHJpdmVyCiAqIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgZGV2aWNlIG9uIHRoYXQgYnVzLiBCb3RoIGRyaXZlcnMgYW5kCiAqIGRldmljZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBhIGJ1cyBkcml2ZXIuIFRoZSBidXMgZHJpdmVyIG1hdGNoZXMKICogZGV2aWNlcyB0byBkcml2ZXJzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkZXZpY2UgYW5kIGRyaXZlcgogKiBzdHJ1Y3R1cmVzLgogKgogKiBUaGUgcHJvYmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcyBhIGRldmljZQogKiB0byB0aGlzIGRyaXZlci4gVGhlIHJlbW92ZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGRldmljZSBpcwogKiB1bnJlZ2lzdGVyZWQgd2l0aCB0aGUgYnVzIGRyaXZlci4KICovCiNpZmRlZiBMTV9JTlRFUkZBQ0UKc3RhdGljIHN0cnVjdCBsbV9kcml2ZXIgZHdjX290Z19kcml2ZXIgPSB7CgkuZHJ2ID0gey5uYW1lID0gKGNoYXIgKilkd2NfZHJpdmVyX25hbWUsfSwKCS5wcm9iZSA9IGR3Y19vdGdfZHJpdmVyX3Byb2JlLAoJLnJlbW92ZSA9IGR3Y19vdGdfZHJpdmVyX3JlbW92ZSwKfTsKI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQpzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkc1tdID0geyB7CgkJCQkJCSBQQ0lfREVWSUNFKDB4MTZjMywgMHhhYmNkKSwKCQkJCQkJIC5kcml2ZXJfZGF0YSA9CgkJCQkJCSAodW5zaWduZWQgbG9uZykweGRlYWRiZWVmLAoJCQkJCQkgfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZHMpOwoKLyogcGNpIGRyaXZlciBnbHVlOyB0aGlzIGlzIGEgIm5ldyBzdHlsZSIgUENJIGRyaXZlciBtb2R1bGUgKi8Kc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGR3Y19vdGdfZHJpdmVyID0gewoJLm5hbWUgPSAiZHdjX290ZyIsCgkuaWRfdGFibGUgPSBwY2lfaWRzLAoKCS5wcm9iZSA9IGR3Y19vdGdfZHJpdmVyX3Byb2JlLAoJLnJlbW92ZSA9IGR3Y19vdGdfZHJpdmVyX3JlbW92ZSwKCgkuZHJpdmVyID0gewoJCSAgIC5uYW1lID0gKGNoYXIgKilkd2NfZHJpdmVyX25hbWUsCgkJICAgfSwKfTsKI2VuZGlmCgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZHdjX290Z19kcml2ZXIgaXMgaW5zdGFsbGVkIHdpdGggdGhlCiAqIGluc21vZCBjb21tYW5kLiBJdCByZWdpc3RlcnMgdGhlIGR3Y19vdGdfZHJpdmVyIHN0cnVjdHVyZSB3aXRoIHRoZQogKiBhcHByb3ByaWF0ZSBidXMgZHJpdmVyLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGR3Y19vdGdfZHJpdmVyX3Byb2JlIGZ1bmN0aW9uCiAqIHRvIGJlIGNhbGxlZC4gSW4gYWRkaXRpb24sIHRoZSBidXMgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBleHBvc2UKICogYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGUgZGV2aWNlIGFuZCBkcml2ZXIgaW4gdGhlIHNwZWNpYWwgc3lzZnMgZmlsZQogKiBzeXN0ZW0uCiAqCiAqIEByZXR1cm4KICovCnN0YXRpYyBpbnQgX19pbml0IGR3Y19vdGdfZHJpdmVyX2luaXQodm9pZCkKewoJaW50IHJldHZhbCA9IDA7CglpbnQgZXJyb3I7CglwcmludGsoS0VSTl9JTkZPICIlczogdmVyc2lvbiAlc1xuIiwgZHdjX2RyaXZlcl9uYW1lLAoJICAgICAgIERXQ19EUklWRVJfVkVSU0lPTik7CiNpZmRlZiBMTV9JTlRFUkZBQ0UKCXJldHZhbCA9IGxtX2RyaXZlcl9yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkd2Nfb3RnX2RyaXZlcik7CiNlbmRpZgoJaWYgKHJldHZhbCA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIgIiVzIHJldHZhbD0lZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CgkJcmV0dXJuIHJldHZhbDsKCX0KI2lmZGVmIExNX0lOVEVSRkFDRQoJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRydiwgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOwoJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRydiwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGVidWdsZXZlbCk7CiNlbmRpZgoJcmV0dXJuIHJldHZhbDsKfQoKbW9kdWxlX2luaXQoZHdjX290Z19kcml2ZXJfaW5pdCk7CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCiAqIHdpdGggdGhlIHJtbW9kIGNvbW1hbmQuIFRoZSBkcml2ZXIgdW5yZWdpc3RlcnMgaXRzZWxmIHdpdGggaXRzIGJ1cwogKiBkcml2ZXIuCiAqCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgZHdjX290Z19kcml2ZXJfY2xlYW51cCh2b2lkKQp7CglwcmludGsoS0VSTl9ERUJVRyAiZHdjX290Z19kcml2ZXJfY2xlYW51cCgpXG4iKTsKCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfZGVidWdsZXZlbCk7Cglkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRydiwgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOwoJbG1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3Y19vdGdfZHJpdmVyKTsKI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmR3Y19vdGdfZHJpdmVyKTsKI2VuZGlmCgoJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbW9kdWxlIHJlbW92ZWRcbiIsIGR3Y19kcml2ZXJfbmFtZSk7Cn0KCm1vZHVsZV9leGl0KGR3Y19vdGdfZHJpdmVyX2NsZWFudXApOwojZWxzZQoKLyoKICogUGxhdGZvcm0gU3BlY2lmaWMgQ29udHJvbGxlciBTdXNwZW5kIFJvdXRpZW5lLgogKiBJdCBkb2VzIGEgUG9ydCBzdXNwZW5kLCBhbmQgZ2F0ZSB0aGUgY2xvY2sgKFBvd2VyIE9mZiBMMSkuCiAqIENvbnRyb2xsZXIgYW5kIFBIWSByZXNldCAoUG93ZXIgT2ZmIEwyKSBmdW5jdGlvbmFsaXR5CiAqIGlzIG5vdCBzdXBwb3J0ZWQKICovCmludCBjb21jZXJ0b191c2IyX2J1c19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZCwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglpbnQgZXJyb3Jfc3RhdHVzID0gMCwgdmFsID0gMDsKCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBOVUxMOwoKCWhjZCA9IChzdHJ1Y3QgdXNiX2hjZCAqKSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZCk7CgoJLyogRG8gdGhlIHBvcnQgc3VzcGVuZCBmb3IgVVNCIDIuMCBDb250cm9sbGVyICovCglkd2Nfb3RnX2hvc3RfcG9ydF9zdXNwZW5kKGhjZCk7CgoJZm9yICh2YWwgPSAwIDsgdmFsIDwgNTAgOyB2YWwrKykKCQl1ZGVsYXkoMTAwMCk7CgoJLyogRGlzYWJsZSB0aGUgQ2xvY2sgKi8KCWNsa19kaXNhYmxlKHVzYjJfY2xrKTsKCglyZXR1cm4gZXJyb3Jfc3RhdHVzOwp9CgovKgogKiBQbGF0Zm9ybSBTcGVjaWZpYyBDb250cm9sbGVyIFJlc3VtZSBSb3V0aWVuZS4KICogSXQgZG9lcyBhIFBvcnQgcmVzdW1lLCBhbmQgZW5hYmxlIHRoZSBjbG9jayAoUG93ZXIgT2ZmIEwxKS4KICogUmVzdW1lIGZyb20gKFBvd2VyIE9mZiBMMikgaXMgbm90IHN1cHBvcnRlZAogKi8KaW50IGNvbWNlcnRvX3VzYjJfYnVzX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZCkKewoJaW50IGVycm9yX3N0YXR1cyA9IDA7CglzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gTlVMTDsKCgkvKiBFbmFibGUgdGhlIENsb2NrICovCglpZiAoY2xrX2VuYWJsZSh1c2IyX2NsaykpewoJCXByX2VycigiY29tY2VydG9fdXNiMl9idXNfcmVzdW1lX2R1bW15OlVuYWJsZSB0byBlbmFibGUgdGhlIHVzYjIgY2xvY2sgXG4iKTsKCX0KCgloY2QgPSAoc3RydWN0IHVzYl9oY2QgKikgcGxhdGZvcm1fZ2V0X2RydmRhdGEocGQpOwoKCWR3Y19vdGdfaG9zdF9wb3J0X3Jlc3VtZShoY2QpOwoKCXJldHVybiBlcnJvcl9zdGF0dXM7Cn0KCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGNhbGxlZCBieSBhIGJ1cyBkcml2ZXIKICogZHVyaW5nIHRoZSBsaWZlY3ljbGUgb2YgYSBkZXZpY2Ugb24gdGhhdCBidXMuIEJvdGggZHJpdmVycyBhbmQKICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcwogKiBkZXZpY2VzIHRvIGRyaXZlcnMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZSBhbmQgZHJpdmVyCiAqIHN0cnVjdHVyZXMuCiAqCiAqIFRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYnVzIGRyaXZlciBtYXRjaGVzIGEgZGV2aWNlCiAqIHRvIHRoaXMgZHJpdmVyLiBUaGUgcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzCiAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgogKi8Kc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdjX290Z19kcml2ZXIgPSB7CgkuZHJpdmVyID0gewoJCS5uYW1lCT0gKGNoYXIgKilkd2NfZHJpdmVyX25hbWUsCgl9LAoJLnByb2JlCQk9IGR3Y19vdGdfZHJpdmVyX3Byb2JlLAoJLnJlbW92ZQkJPSBkd2Nfb3RnX2RyaXZlcl9yZW1vdmUsCgoJLnN1c3BlbmQgPSBjb21jZXJ0b191c2IyX2J1c19zdXNwZW5kLAoJLnJlc3VtZSA9IGNvbWNlcnRvX3VzYjJfYnVzX3Jlc3VtZSwKfTsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkd2Nfb3RnX2RyaXZlciBpcyBpbnN0YWxsZWQgd2l0aCB0aGUKICogaW5zbW9kIGNvbW1hbmQuIEl0IHJlZ2lzdGVycyB0aGUgZHdjX290Z19kcml2ZXIgc3RydWN0dXJlIHdpdGggdGhlCiAqIGFwcHJvcHJpYXRlIGJ1cyBkcml2ZXIuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZHdjX290Z19kcml2ZXJfcHJvYmUgZnVuY3Rpb24KICogdG8gYmUgY2FsbGVkLiBJbiBhZGRpdGlvbiwgdGhlIGJ1cyBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9zZQogKiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UgYW5kIGRyaXZlciBpbiB0aGUgc3BlY2lhbCBzeXNmcyBmaWxlCiAqIHN5c3RlbS4KICoKICogQHJldHVybgogKi8Kc3RhdGljIGludCBfX2luaXQgZHdjX290Z19kcml2ZXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsID0gMDsKCWludCBlcnJvcjsKCglwcmludGsoS0VSTl9JTkZPICIlczogdmVyc2lvbiAlc1xuIiwgZHdjX2RyaXZlcl9uYW1lLCBEV0NfRFJJVkVSX1ZFUlNJT04pOwoKCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwoJaWYgKHJldHZhbCkgewoJCXByaW50ayhLRVJOX0VSUiAiJXMgcmV0dmFsPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKCQlyZXR1cm4gcmV0dmFsOwoJfQoKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCglyZXR1cm4gcmV0dmFsOwp9Cm1vZHVsZV9pbml0KGR3Y19vdGdfZHJpdmVyX2luaXQpOwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkIGZyb20gdGhlIGtlcm5lbAogKiB3aXRoIHRoZSBybW1vZCBjb21tYW5kLiBUaGUgZHJpdmVyIHVucmVnaXN0ZXJzIGl0c2VsZiB3aXRoIGl0cyBidXMKICogZHJpdmVyLgogKgogKi8Kc3RhdGljIHZvaWQgX19leGl0IGR3Y19vdGdfZHJpdmVyX2NsZWFudXAodm9pZCkKewoJcHJpbnRrKEtFUk5fREVCVUcgImR3Y19vdGdfZHJpdmVyX2NsZWFudXAoKVxuIik7CgoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CgoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3Y19vdGdfZHJpdmVyKTsKCglwcmludGsoS0VSTl9JTkZPICIlcyBtb2R1bGUgcmVtb3ZlZFxuIiwgZHdjX2RyaXZlcl9uYW1lKTsKfQptb2R1bGVfZXhpdChkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKTsKCiNlbmRpZgoKTU9EVUxFX0RFU0NSSVBUSU9OKERXQ19EUklWRVJfREVTQyk7Ck1PRFVMRV9BVVRIT1IoIlN5bm9wc3lzIEluYy4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKG90Z19jYXAsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfY2FwLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG90Z19jYXAsICJPVEcgQ2FwYWJpbGl0aWVzIDA9SE5QJlNSUCAxPVNSUCBPbmx5IDI9Tm9uZSIpOwptb2R1bGVfcGFyYW1fbmFtZWQob3B0LCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3B0LCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG9wdCwgIk9QVCBNb2RlIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkbWFfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkbWFfZW5hYmxlLCAiRE1BIE1vZGUgMD1TbGF2ZSAxPURNQSBlbmFibGVkIik7Cgptb2R1bGVfcGFyYW1fbmFtZWQoZG1hX2Rlc2NfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2Rlc2NfZW5hYmxlLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZG1hX2Rlc2NfZW5hYmxlLAoJCSAiRE1BIERlc2MgTW9kZSAwPUFkZHJlc3MgRE1BIDE9RE1BIERlc2NyaXB0b3IgZW5hYmxlZCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKGRtYV9idXJzdF9zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2J1cnN0X3NpemUsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkbWFfYnVyc3Rfc2l6ZSwKCQkgIkRNQSBCdXJzdCBTaXplIDEsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChzcGVlZCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnNwZWVkLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHNwZWVkLCAiU3BlZWQgMD1IaWdoIFNwZWVkIDE9RnVsbCBTcGVlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIsCgkJICJTdXBwb3J0IExvdyBQb3dlciB3L0ZTIG9yIExTIDA9U3VwcG9ydCAxPURvbid0IFN1cHBvcnQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGssCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGssIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywKCQkgIkxvdyBTcGVlZCBMb3cgUG93ZXIgQ2xvY2sgMD00OE1oeiAxPTZNaHoiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGVuYWJsZV9keW5hbWljX2ZpZm8sCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuYWJsZV9keW5hbWljX2ZpZm8sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2R5bmFtaWNfZmlmbywgIjA9Y0MgU2V0dGluZyAxPUFsbG93IER5bmFtaWMgU2l6aW5nIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkYXRhX2ZpZm9fc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRhdGFfZmlmb19zaXplLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGF0YV9maWZvX3NpemUsCgkJICJUb3RhbCBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGRhdGEgRklGTyBtZW1vcnkgMzItMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9yeF9maWZvX3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcnhfZmlmb19zaXplLAoJCSAgIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3J4X2ZpZm9fc2l6ZSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgUnggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X25wZXJpb190eF9maWZvX3NpemUsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9ucGVyaW9fdHhfZmlmb19zaXplLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9ucGVyaW9fdHhfZmlmb19zaXplLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzBdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8yLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzFdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMiwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8zLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzJdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMywKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV80LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzNdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNCwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV81LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzRdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV82LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzVdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNiwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV83LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzZdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNywKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV84LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzddLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfOCwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV85LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzhdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfOSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xMCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVs5XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEwLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzExLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEwXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzExLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEyLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzExXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEyLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEzLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEyXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEzLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE0LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEzXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE0LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE1LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzE0XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE1LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChob3N0X3J4X2ZpZm9fc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplLAoJCSAgIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9yeF9maWZvX3NpemUsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFJ4IEZJRk8gMTYtMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gMTYtMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfcGVyaW9fdHhfZmlmb19zaXplLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgaG9zdCBwZXJpb2RpYyBUeCBGSUZPIDE2LTMyNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChtYXhfdHJhbnNmZXJfc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm1heF90cmFuc2Zlcl9zaXplLAoJCSAgIGludCwgMDQ0NCk7Ci8qKiBAdG9kbyBTZXQgdGhlIG1heCB0byA1MTJLLCBtb2RpZnkgY2hlY2tzICovCk1PRFVMRV9QQVJNX0RFU0MobWF4X3RyYW5zZmVyX3NpemUsCgkJICJUaGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIHN1cHBvcnRlZCBpbiBieXRlcyAyMDQ3LTY1NTM1Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChtYXhfcGFja2V0X2NvdW50LCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMubWF4X3BhY2tldF9jb3VudCwKCQkgICBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG1heF9wYWNrZXRfY291bnQsCgkJICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyBpbiBhIHRyYW5zZmVyIDE1LTUxMSIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9jaGFubmVscywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfY2hhbm5lbHMsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X2NoYW5uZWxzLAoJCSAiVGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZSAxLTE2Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfZW5kcG9pbnRzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X2VuZHBvaW50cywgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9lbmRwb2ludHMsCgkJICJUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyBpbiBhZGRpdGlvbiB0byBFUDAgYXZhaWxhYmxlIGZvciBkZXZpY2UgbW9kZSAxLTE1Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChwaHlfdHlwZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV90eXBlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV90eXBlLCAiMD1SZXNlcnZlZCAxPVVUTUkrIDI9VUxQSSIpOwptb2R1bGVfcGFyYW1fbmFtZWQocGh5X3V0bWlfd2lkdGgsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdXRtaV93aWR0aCwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV91dG1pX3dpZHRoLCAiU3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoIDggb3IgMTYgYml0cyIpOwptb2R1bGVfcGFyYW1fbmFtZWQocGh5X3VscGlfZGRyLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZGRyLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV91bHBpX2RkciwKCQkgIlVMUEkgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUgMD1TaW5nbGUgMT1Eb3VibGUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHBoeV91bHBpX2V4dF92YnVzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZXh0X3ZidXMsCgkJICAgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhwaHlfdWxwaV9leHRfdmJ1cywKCQkgIlVMUEkgUEhZIHVzaW5nIGludGVybmFsIG9yIGV4dGVybmFsIHZidXMgMD1JbnRlcm5hbCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaTJjX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmkyY19lbmFibGUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaTJjX2VuYWJsZSwgIkZTIFBIWSBJbnRlcmZhY2UiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHVscGlfZnNfbHMsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy51bHBpX2ZzX2xzLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHVscGlfZnNfbHMsICJVTFBJIFBIWSBGUy9MUyBtb2RlIG9ubHkiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHRzX2RsaW5lLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModHNfZGxpbmUsICJUZXJtIHNlbGVjdCBEbGluZSBwdWxzaW5nIGZvciBhbGwgUEhZcyIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGdfZGJnX2x2bCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIiIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKGVuX211bHRpcGxlX3R4X2ZpZm8sCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuX211bHRpcGxlX3R4X2ZpZm8sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZW5fbXVsdGlwbGVfdHhfZmlmbywKCQkgIkRlZGljYXRlZCBOb24gUGVyaW9kaWMgVHggRklGT3MgMD1kaXNhYmxlZCAxPWVuYWJsZWQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVswXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzIsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsyXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzMsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVszXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzQsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs0XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzUsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs1XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzYsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs2XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzcsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs3XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzgsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs4XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzksICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMTAsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbOV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMl0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxM10sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xNCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxNF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xNSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKHRocl9jdGwsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50aHJfY3RsLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHRocl9jdGwsCgkJICJUaHJlc2hvbGRpbmcgZW5hYmxlIGZsYWcgYml0IDAgLSBub24gSVNPIFR4IHRoci4sIDEgLSBJU08gVHggdGhyLiwgMiAtIFJ4IHRoci4tIGJpdCAwPWRpc2FibGVkIDE9ZW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQodHhfdGhyX2xlbmd0aCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnR4X3Rocl9sZW5ndGgsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyh0eF90aHJfbGVuZ3RoLCAiVHggVGhyZXNob2xkIGxlbmd0aCBpbiAzMiBiaXQgRFdPUkRzIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChyeF90aHJfbGVuZ3RoLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucnhfdGhyX2xlbmd0aCwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHJ4X3Rocl9sZW5ndGgsICJSeCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBEV09SRHMiKTsKCm1vZHVsZV9wYXJhbV9uYW1lZChwdGlfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucHRpX2VuYWJsZSwgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtX25hbWVkKG1waV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tcGlfZW5hYmxlLCBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW1fbmFtZWQobHBtX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmxwbV9lbmFibGUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobHBtX2VuYWJsZSwgIkxQTSBFbmFibGUgMD1MUE0gRGlzYWJsZWQgMT1MUE0gRW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaWNfdXNiX2NhcCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmljX3VzYl9jYXAsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaWNfdXNiX2NhcCwKCQkgIklDX1VTQiBDYXBhYmlsaXR5IDA9SUNfVVNCIERpc2FibGVkIDE9SUNfVVNCIEVuYWJsZWQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGFoYl90aHJfcmF0aW8sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfdGhyX3JhdGlvLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoYWhiX3Rocl9yYXRpbywgIkFIQiBUaHJlc2hvbGQgUmF0aW8iKTsKbW9kdWxlX3BhcmFtX25hbWVkKHBvd2VyX2Rvd24sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wb3dlcl9kb3duLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX2Rvd24sICJQb3dlciBEb3duIE1vZGUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHJlbG9hZF9jdGwsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yZWxvYWRfY3RsLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHJlbG9hZF9jdGwsICJIRklSIFJlbG9hZCBDb250cm9sIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfb3V0X25haywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9vdXRfbmFrLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9vdXRfbmFrLCAiRW5hYmxlIERldmljZSBPVVQgTkFLIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChjb250X29uX2JuYSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmNvbnRfb25fYm5hLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGNvbnRfb25fYm5hLCAiRW5hYmxlIEVuYWJsZSBDb250aW51ZSBvbiBCTkEiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGFoYl9zaW5nbGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfc2luZ2xlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGFoYl9zaW5nbGUsICJFbmFibGUgQUhCIFNpbmdsZSBTdXBwb3J0Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChhZHBfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWRwX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhhZHBfZW5hYmxlLCAiQURQIEVuYWJsZSAwPUFEUCBEaXNhYmxlZCAxPUFEUCBFbmFibGVkIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChvdGdfdmVyLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX3ZlciwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhvdGdfdmVyLCAiT1RHIHJldmlzaW9uIHN1cHBvcnRlZCAwPU9URyAxLjMgMT1PVEcgMi4wIik7CgovKiogQHBhZ2UgIk1vZHVsZSBQYXJhbWV0ZXJzIgogKgogKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbWF5IGJlIHNwZWNpZmllZCB3aGVuIHN0YXJ0aW5nIHRoZSBtb2R1bGUuCiAqIFRoZXNlIHBhcmFtZXRlcnMgZGVmaW5lIGhvdyB0aGUgRFdDX290ZyBjb250cm9sbGVyIHNob3VsZCBiZQogKiBjb25maWd1cmVkLiBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIENJTCBpbml0aWFsaXphdGlvbgogKiBmdW5jdGlvbiBkd2Nfb3RnX2NpbF9pbml0CiAqCiAqIEV4YW1wbGU6IDxjb2RlPm1vZHByb2JlIGR3Y19vdGcgc3BlZWQ9MSBvdGdfY2FwPTE8L2NvZGU+CiAqCgogPHRhYmxlPgogPHRyPjx0ZD5QYXJhbWV0ZXIgTmFtZTwvdGQ+PHRkPk1lYW5pbmc8L3RkPjwvdHI+CgogPHRyPgogPHRkPm90Z19jYXA8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgT1RHIGNhcGFiaWxpdGllcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZQogdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMgc3BlY2lmaWVkLgogLSAwOiBITlAgYW5kIFNSUCBjYXBhYmxlIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiAtIDE6IFNSUCBPbmx5IGNhcGFibGUKIC0gMjogTm8gSE5QL1NSUCBjYXBhYmxlCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRtYV9lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzbGF2ZSBvciBETUEgbW9kZSBmb3IgYWNjZXNzaW5nIHRoZSBkYXRhIEZJRk9zLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBTbGF2ZQogLSAxOiBETUEgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZG1hX2J1cnN0X3NpemU8L3RkPgogPHRkPlRoZSBETUEgQnVyc3Qgc2l6ZSAoYXBwbGljYWJsZSBvbmx5IGZvciBFeHRlcm5hbCBETUEgTW9kZSkuCiAtIFZhbHVlczogMSwgNCwgOCAxNiwgMzIsIDY0LCAxMjgsIDI1NiAoZGVmYXVsdCAzMikKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+c3BlZWQ8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgbWF4aW11bSBzcGVlZCBvZiBvcGVyYXRpb24gaW4gaG9zdCBhbmQgZGV2aWNlIG1vZGUuIFRoZQogYWN0dWFsIHNwZWVkIGRlcGVuZHMgb24gdGhlIHNwZWVkIG9mIHRoZSBhdHRhY2hlZCBkZXZpY2UgYW5kIHRoZSB2YWx1ZSBvZgogcGh5X3R5cGUuCiAtIDA6IEhpZ2ggU3BlZWQgKGRlZmF1bHQpCiAtIDE6IEZ1bGwgU3BlZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgbG93IHBvd2VyIG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gYXR0YWNoZWQgdG8gYSBGdWxsCiBTcGVlZCBvciBMb3cgU3BlZWQgZGV2aWNlIGluIGhvc3QgbW9kZS4KIC0gMDogRG9uJ3Qgc3VwcG9ydCBsb3cgcG93ZXIgbW9kZSAoZGVmYXVsdCkKIC0gMTogU3VwcG9ydCBsb3cgcG93ZXIgbW9kZQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrPC90ZD4KIDx0ZD5TcGVjaWZpZXMgdGhlIFBIWSBjbG9jayByYXRlIGluIGxvdyBwb3dlciBtb2RlIHdoZW4gY29ubmVjdGVkIHRvIGEgTG93CiBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIG9ubHkgaWYKIEhPU1RfU1VQUE9SVF9GU19MU19MT1dfUE9XRVIgaXMgZW5hYmxlZC4KIC0gMDogNDggTUh6IChkZWZhdWx0KQogLSAxOiA2IE1IegogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5lbmFibGVfZHluYW1pY19maWZvPC90ZD4KIDx0ZD4gU3BlY2lmaWVzIHdoZXRoZXIgRklGT3MgbWF5IGJlIHJlc2l6ZWQgYnkgdGhlIGRyaXZlciBzb2Z0d2FyZS4KIC0gMDogVXNlIGNDIEZJRk8gc2l6ZSBwYXJhbWV0ZXJzCiAtIDE6IEFsbG93IGR5bmFtaWMgRklGTyBzaXppbmcgKGRlZmF1bHQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRhdGFfZmlmb19zaXplPC90ZD4KIDx0ZD5Ub3RhbCBudW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBkYXRhIEZJRk8gbWVtb3J5LiBUaGlzIG1lbW9yeQogaW5jbHVkZXMgdGhlIFJ4IEZJRk8sIG5vbi1wZXJpb2RpYyBUeCBGSUZPLCBhbmQgcGVyaW9kaWMgVHggRklGT3MuCiAtIFZhbHVlczogMzIgdG8gMzI3NjggKGRlZmF1bHQgODE5MikKCiBOb3RlOiBUaGUgdG90YWwgRklGTyBtZW1vcnkgZGVwdGggaW4gdGhlIEZQR0EgY29uZmlndXJhdGlvbiBpcyA4MTkyLgogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfcnhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGRldmljZSBtb2RlIHdoZW4gZHluYW1pYwogRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDY0KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTwvdGQ+CiA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaW4gZGV2aWNlIG1vZGUgd2hlbgogZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9wZXJpb190eF9maWZvX3NpemVfbiAobiA9IDEgdG8gMTUpPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIHBlcmlvZGljIFR4IEZJRk9zIGluIGRldmljZSBtb2RlCiB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiA0IHRvIDc2OCAoZGVmYXVsdCAyNTYpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmhvc3RfcnhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGhvc3QgbW9kZSB3aGVuIGR5bmFtaWMgRklGTwogc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9ucGVyaW9fdHhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpbiBob3N0IG1vZGUgd2hlbgogZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkIGluIHRoZSBjb3JlLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmhvc3RfcGVyaW9fdHhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gd2hlbiBkeW5hbWljIEZJRk8KIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPm1heF90cmFuc2Zlcl9zaXplPC90ZD4KIDx0ZD5UaGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIHN1cHBvcnRlZCBpbiBieXRlcy4KIC0gVmFsdWVzOiAyMDQ3IHRvIDY1LDUzNSAoZGVmYXVsdCA2NSw1MzUpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPm1heF9wYWNrZXRfY291bnQ8L3RkPgogPHRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIuCiAtIFZhbHVlczogMTUgdG8gNTExIChkZWZhdWx0IDUxMSkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9jaGFubmVsczwvdGQ+CiA8dGQ+VGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZS4KIC0gVmFsdWVzOiAxIHRvIDE2IChkZWZhdWx0IDEyKQoKIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDEyIGhvc3QgY2hhbm5lbHMuCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9lbmRwb2ludHM8L3RkPgogPHRkPlRoZSBudW1iZXIgb2YgZW5kcG9pbnRzIGluIGFkZGl0aW9uIHRvIEVQMCBhdmFpbGFibGUgZm9yIGRldmljZSBtb2RlCiBvcGVyYXRpb25zLgogLSBWYWx1ZXM6IDEgdG8gMTUgKGRlZmF1bHQgNiBJTiBhbmQgT1VUKQoKIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDYgSU4gYW5kIE9VVCBlbmRwb2ludHMgaW4KIGFkZGl0aW9uIHRvIEVQMC4KIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cGh5X3R5cGU8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBQSFkgaW50ZXJmYWNlIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlIGRyaXZlciB3aWxsCiBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgcGh5X3R5cGUuCiAtIDA6IEZ1bGwgU3BlZWQKIC0gMTogVVRNSSsgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIC0gMjogVUxQSQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5waHlfdXRtaV93aWR0aDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIGZvciBhCiBwaHlfdHlwZSBvZiBVVE1JKy4gQWxzbywgdGhpcyBwYXJhbWV0ZXIgaXMgYXBwbGljYWJsZSBvbmx5IGlmIHRoZQogT1RHX0hTUEhZX1dJRFRIIGNDIHBhcmFtZXRlciB3YXMgc2V0IHRvICI4IGFuZCAxNiBiaXRzIiwgbWVhbmluZyB0aGF0IHRoZQogY29yZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHdvcmsgYXQgZWl0aGVyIGRhdGEgcGF0aCB3aWR0aC4KIC0gVmFsdWVzOiA4IG9yIDE2IGJpdHMgKGRlZmF1bHQgMTYpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnBoeV91bHBpX2RkcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVMUEkgb3BlcmF0ZXMgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUuIFRoaXMKIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgcGh5X3R5cGUgaXMgVUxQSS4KIC0gMDogc2luZ2xlIGRhdGEgcmF0ZSBVTFBJIGludGVyZmFjZSB3aXRoIDggYml0IHdpZGUgZGF0YSBidXMgKGRlZmF1bHQpCiAtIDE6IGRvdWJsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA0IGJpdCB3aWRlIGRhdGEgYnVzCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmkyY19lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSB0aGUgSTJDIGludGVyZmFjZSBmb3IgZnVsbCBzcGVlZCBQSFkuIFRoaXMKIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgUEhZX1RZUEUgaXMgRlMuCiAtIDA6IERpc2FibGVkIChkZWZhdWx0KQogLSAxOiBFbmFibGVkCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnVscGlfZnNfbHM8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBVTFBJIEZTL0xTIG1vZGUgb25seS4KIC0gMDogRGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IEVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+dHNfZGxpbmU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRlcm0gc2VsZWN0IEQtTGluZSBwdWxzaW5nIGZvciBhbGwgUEhZcyBpcyBlbmFibGVkLgogLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogRW5hYmxlZAogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5lbl9tdWx0aXBsZV90eF9maWZvPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBkZWRpY2F0ZWR0byB0eCBmaWZvcyBhcmUgZW5hYmxlZCBmb3Igbm9uIHBlcmlvZGljIElOIEVQcy4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogRGlzYWJsZWQKIC0gMTogRW5hYmxlZCAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfdHhfZmlmb19zaXplX24gKG4gPSAxIHRvIDE1KTwvdGQ+CiA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiBlYWNoIG9mIHRoZSBUeCBGSUZPcyBpbiBkZXZpY2UgbW9kZQogd2hlbiBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogNCB0byA3NjggKGRlZmF1bHQgMjU2KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD50eF90aHJfbGVuZ3RoPC90ZD4KIDx0ZD5UcmFuc21pdCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBkb3VibGUgd29yZHMKIC0gVmFsdWVzOiA4IHRvIDEyOCAoZGVmYXVsdCA2NCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cnhfdGhyX2xlbmd0aDwvdGQ+CiA8dGQ+UmVjZWl2ZSBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBkb3VibGUgd29yZHMKIC0gVmFsdWVzOiA4IHRvIDEyOCAoZGVmYXVsdCA2NCkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD50aHJfY3RsPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgVGhyZXNob2xkaW5nIGZvciBEZXZpY2UgbW9kZS4gQml0cyAwLCAxLCAyIG9mCiB0aGlzIHBhcm1hdGVyIHNwZWNpZmllcyBpZiB0aHJlc2hvbGRpbmcgaXMgZW5hYmxlZCBmb3Igbm9uLUlzbyBUeCwgSXNvIFR4IGFuZAogUnggdHJhbnNmZXJzIGFjY29yZGluZ2x5LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSBWYWx1ZXM6IDAgdG8gNyAoZGVmYXVsdCAwKQogQml0IHZhbHVlcyBpbmRpY2F0ZToKIC0gMDogVGhyZXNob2xkaW5nIGRpc2FibGVkCiAtIDE6IFRocmVzaG9sZGluZyBlbmFibGVkCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+ZG1hX2Rlc2NfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgRGVzY3JpcHRvciBETUEgbW9kZS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogRGVzY3JpcHRvciBETUEgZGlzYWJsZWQKIC0gMTogRGVzY3JpcHRvciBETUEgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5tcGlfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTVBJIGVuaGFuY2VtZW50IG1vZGUuCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCiBzcGVjaWZpZWQuCiAtIDA6IE1QSSBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogTVBJIGVuYWJsZQogPC90ZD48L3RyPgoKPHRyPgogPHRkPnB0aV9lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBQVEkgZW5oYW5jZW1lbnQgc3VwcG9ydC4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogUFRJIGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBQVEkgZW5hYmxlCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+bHBtX2VuYWJsZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIExQTSBzdXBwb3J0LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBMUE0gZGlzYWJsZWQKIC0gMTogTFBNIGVuYWJsZSAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKPHRyPgogPHRkPmljX3VzYl9jYXA8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBJQ19VU0IgY2FwYWJpbGl0eS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogSUNfVVNCIGRpc2FibGVkIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiAtIDE6IElDX1VTQiBlbmFibGUKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5haGJfdGhyX3JhdGlvPC90ZD4KIDx0ZD5TcGVjaWZpZXMgQUhCIFRocmVzaG9sZCByYXRpby4KIC0gVmFsdWVzOiAwIHRvIDMgKGRlZmF1bHQgMCkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5wb3dlcl9kb3duPC90ZD4KIDx0ZD5TcGVjaWZpZXMgUG93ZXIgRG93bihIaWJlcm5hdGlvbikgTW9kZS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogUG93ZXIgRG93biBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMjogUG93ZXIgRG93biBlbmFibGVkCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnJlbG9hZF9jdGw8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIGR5bmFtaWMgcmVsb2FkaW5nIG9mIHRoZSBIRklSIHJlZ2lzdGVyIGlzIGFsbG93ZWQgZHVyaW5nCiBydW4gdGltZS4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYKIG5vbmUgaXMgc3BlY2lmaWVkLiBJbiBjYXNlIHRoZSBIRklSIHZhbHVlIGlzIHJlbG9hZGVkIHdoZW4gSEZJUi5SbGRDdHJsID09IDEnYjAKIHRoZSBjb3JlIG1pZ2h0IG1pc2JlaGF2ZS4KIC0gMDogUmVsb2FkIENvbnRyb2wgZGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IFJlbG9hZCBDb250cm9sIGVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZGV2X291dF9uYWs8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyICBEZXZpY2UgT1VUIE5BSyBlbmhhbmNlbWVudCBlbmFibGVkIG9yIG5vLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYKIG5vbmUgaXMgc3BlY2lmaWVkLiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IHdoZW4gT1RHX0VOX0RFU0NfRE1BID09IDGSYjEuCiAtIDA6IFRoZSBjb3JlIGRvZXMgbm90IHNldCBOQUsgYWZ0ZXIgQnVsayBPVVQgdHJhbnNmZXIgY29tcGxldGUgKGRlZmF1bHQpCiAtIDE6IFRoZSBjb3JlIHNldHMgTkFLIGFmdGVyIEJ1bGsgT1VUIHRyYW5zZmVyIGNvbXBsZXRlCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmNvbnRfb25fYm5hPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBFbmFibGUgQ29udGludWUgb24gQk5BIGVuYWJsZWQgb3Igbm8uCiBBZnRlciByZWNlaXZpbmcgQk5BIGludGVycnVwdCB0aGUgY29yZSBkaXNhYmxlcyB0aGUgZW5kcG9pbnQsd2hlbiB0aGUKIGVuZHBvaW50IGlzIHJlLWVuYWJsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRoZQogLSAwOiBDb3JlIHN0YXJ0cyBwcm9jZXNzaW5nIGZyb20gdGhlIERPRVBETUEgZGVzY3JpcHRvciAoZGVmYXVsdCkKIC0gMTogQ29yZSBzdGFydHMgcHJvY2Vzc2luZyBmcm9tIHRoZSBkZXNjcmlwdG9yIHdoaWNoIHJlY2VpdmVkIHRoZSBCTkEuCiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IHdoZW4gT1RHX0VOX0RFU0NfRE1BID09IDGSYjEuCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmFoYl9zaW5nbGU8L3RkPgogPHRkPlRoaXMgYml0IHdoZW4gcHJvZ3JhbW1lZCBzdXBwb3J0cyBTSU5HTEUgdHJhbnNmZXJzIGZvciByZW1haW5kZXIgZGF0YQogaW4gYSB0cmFuc2ZlciBmb3IgRE1BIG1vZGUgb2Ygb3BlcmF0aW9uLgogLSAwOiBUaGUgcmVtYWluZGVyIGRhdGEgd2lsbCBiZSBzZW50IHVzaW5nIElOQ1IgYnVyc3Qgc2l6ZSAoZGVmYXVsdCkKIC0gMTogVGhlIHJlbWFpbmRlciBkYXRhIHdpbGwgYmUgc2VudCB1c2luZyBTSU5HTEUgYnVyc3Qgc2l6ZS4KIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5hZHBfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBBRFAgZmVhdHVyZSBpcyBlbmFibGVkLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBBRFAgZmVhdHVyZSBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogQURQIGZlYXR1cmUgZW5hYmxlZAogPC90ZD48L3RyPgoKICA8dHI+CiA8dGQ+b3RnX3ZlcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgT1RHIGlzIHBlcmZvcm1pbmcgYXMgVVNCIE9URyBSZXZpc2lvbiAyLjAgb3IgUmV2aXNpb24gMS4zCiBVU0IgT1RHIGRldmljZS4KIC0gMDogT1RHIDIuMCBzdXBwb3J0IGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBPVEcgMi4wIHN1cHBvcnQgZW5hYmxlZAogPC90ZD48L3RyPgoKKi8K