LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGRyaXZlciBlbnRyeSBwb2ludHMgYW5kIG90aGVyIGFkYXB0ZXIKICogICBzcGVjaWZpYyByb3V0aW5lcy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGNvbnN0YW50IGRlZmluaXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIGFjY2VzcyBGL1cgaWFtZ2UgZmlsZSAqLwojZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBpbmNsdWRlIGZpbGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgovLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci8vICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgovLyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgovLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci8vICNpbmNsdWRlIDxhc20vaW8uaD4KLy8gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgovLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CgojZGVmaW5lIEJJTl9ETCAwCiNpZiBCSU5fREwKI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2VuZGlmIC8vIEJJTl9ETAoKCiNpbmNsdWRlIDxkZWJ1Zy5oPgoKI2luY2x1ZGUgPGhjZi5oPgojaW5jbHVkZSA8ZGhmLmg+Ci8vaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZDo6IHdsX21haW4uYzoyMjI5OiBgSFJFR19FVl9SRE1BRCcgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGluIHRoaXMgZnVuY3Rpb24pCiNpbmNsdWRlIDxoY2ZkZWYuaD4KCiNpbmNsdWRlIDx3bF9pZi5oPgojaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KI2luY2x1ZGUgPHdsX3V0aWwuaD4KI2luY2x1ZGUgPHdsX21haW4uaD4KI2luY2x1ZGUgPHdsX25ldGRldi5oPgojaW5jbHVkZSA8d2xfd2V4dC5oPgoKI2lmZGVmIFVTRV9QUk9GSUxFCiNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CiNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KCiNpZmRlZiBCVVNfUENNQ0lBCiNpbmNsdWRlIDx3bF9jcy5oPgojZW5kaWYgIC8qIEJVU19QQ01DSUEgKi8KCiNpZmRlZiBCVVNfUENJCiNpbmNsdWRlIDx3bF9wY2kuaD4KI2VuZGlmICAvKiBCVVNfUENJICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCW1hY3JvIGRlZmludGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBWQUxJRF9QQVJBTShDKSBcCgl7IFwKCQlpZiAoIShDKSkgXAoJCXsgXAoJCQlwcmludGsoS0VSTl9JTkZPICJXaXJlbGVzcywgcGFyYW1ldGVyIGVycm9yOiBcIiVzXCJcbiIsICNDKTsgXAoJCQlnb3RvIGZhaWxlZDsgXAoJCX0gXAoJfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglsb2NhbCBmdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9pc3JfaGFuZGxlciggdW5zaWduZWQgbG9uZyBwICk7CgojaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLwovL2ludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50IHVudXNlZCk7CmludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEgKTsKc3RhdGljIGludCB3cml0ZV9pbnQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CnN0YXRpYyB2b2lkIHByb2Nfd3JpdGUoY29uc3QgY2hhciAqbmFtZSwgd3JpdGVfcHJvY190ICp3LCB2b2lkICpkYXRhKTsKCiNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbW9kdWxlIHBhcmFtZXRlciBkZWZpbml0aW9ucyAtIHNldCB3aXRoICdpbnNtb2QnCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBwX3UxNiAgICBpcnFfbWFzayAgICAgICAgICAgICAgICA9IDB4ZGViODsgLy8gSVJRMyw0LDUsNyw5LDEwLDExLDEyLDE0LDE1CnN0YXRpYyBwX3M4ICAgICBpcnFfbGlzdFs0XSAgICAgICAgICAgICA9IHsgLTEgfTsKCiNpZiAwCk1PRFVMRV9QQVJNKGlycV9tYXNrLCAgICAgICAgICAgICAgICJoIik7Ck1PRFVMRV9QQVJNX0RFU0MoaXJxX21hc2ssICAgICAgICAgICAgICAgIklSUSBtYXNrIFsweGRlYjhdIik7Ck1PRFVMRV9QQVJNKGlycV9saXN0LCAgICAgICAgICAgICAgICIxLTRiIik7Ck1PRFVMRV9QQVJNX0RFU0MoaXJxX2xpc3QsICAgICAgICAgICAgICAgIklSUSBsaXN0IFs8aXJxX21hc2s+XSIpOwojZW5kaWYKCnN0YXRpYyBwX3U4ICAgICBQQVJNX0FVVEhFTlRJQ0FUSU9OICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQVVUSEVOVElDQVRJT047CnN0YXRpYyBwX3UxNiAgICBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgICAJPSBQQVJNX0RFRkFVTFRfQVVUSF9LRVlfTUdNVF9TVUlURTsKc3RhdGljIHBfdTE2ICAgIFBBUk1fQlJTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9CUlNDXzJHSFo7CnN0YXRpYyBwX3UxNiAgICBQQVJNX0JSU0NfNUdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQlJTQ181R0haOwpzdGF0aWMgcF91MTYgICAgUEFSTV9DT0VYSVNURU5DRSAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0NPRVhJU1RFTkNFOwpzdGF0aWMgcF91MTYgICAgUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgICAgCT0gUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTDsgIC8vOz9yZW5hbWUgYW5kIG1vdmUKc3RhdGljIHBfY2hhciAgKlBBUk1fQ1JFQVRFX0lCU1MgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTU19TVFI7CnN0YXRpYyBwX2NoYXIgICpQQVJNX0RFU0lSRURfU1NJRCAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1NJRDsKc3RhdGljIHBfY2hhciAgKlBBUk1fRE9XTkxPQURfRklSTVdBUkUgICAgICA9ICIiOwpzdGF0aWMgcF91MTYgICAgUEFSTV9FTkFCTEVfRU5DUllQVElPTiAgICAgCT0gUEFSTV9ERUZBVUxUX0VOQUJMRV9FTkNSWVBUSU9OOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9FWENMVURFX1VORU5DUllQVEVEICAgCT0gUEFSTV9ERUZBVUxUX0VYQ0xVREVfVU5FTkNSWVBURURfU1RSOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9JTlRSQV9CU1NfUkVMQVkgICAgICAgCT0gUEFSTV9ERUZBVUxUX0lOVFJBX0JTU19SRUxBWV9TVFI7CnN0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTEgICAgICAgICAgICAgICAgICAJPSAiIjsKc3RhdGljIHBfY2hhciAgKlBBUk1fS0VZMiAgICAgICAgICAgICAgICAgIAk9ICIiOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9LRVkzICAgICAgICAgICAgICAgICAgCT0gIiI7CnN0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTQgICAgICAgICAgICAgICAgICAJPSAiIjsKc3RhdGljIHBfY2hhciAgKlBBUk1fTE9BRF9CQUxBTkNJTkcgICAgICAgIAk9IFBBUk1fREVGQVVMVF9MT0FEX0JBTEFOQ0lOR19TVFI7CnN0YXRpYyBwX3UxNiAgICBQQVJNX01BWF9TTEVFUCAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfTUFYX1BNX1NMRUVQOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OICAgCT0gUEFSTV9ERUZBVUxUX01FRElVTV9ESVNUUklCVVRJT05fU1RSOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyAgCT0gUEFSTV9ERUZBVUxUX01JQ1JPV0FWRV9ST0JVU1RORVNTX1NUUjsKc3RhdGljIHBfY2hhciAgKlBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORwk9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HX1NUUjsKc3RhdGljIHBfdTE2ICAgIFBBUk1fTVVMVElDQVNUX1JBVEUgICAgICAgIAk9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9NVUxUSUNBU1RfUlggICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SWF9TVFI7CnN0YXRpYyBwX3U4ICAgICBQQVJNX05FVFdPUktfQUREUltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwpzdGF0aWMgcF91MTYgICAgUEFSTV9PV05fQVRJTV9XSU5ET1cgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9BVElNX1dJTkRPVzsKc3RhdGljIHBfdTE2ICAgIFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCAgIAk9IFBBUk1fREVGQVVMVF9PV05fQkVBQ09OX0lOVEVSVkFMOwpzdGF0aWMgcF91OCAgICAgUEFSTV9PV05fQ0hBTk5FTCAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9DSEFOTkVMOwpzdGF0aWMgcF91OCAgICAgUEFSTV9PV05fRFRJTV9QRVJJT0QgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9EVElNX1BFUklPRDsKc3RhdGljIHBfY2hhciAgKlBBUk1fT1dOX05BTUUgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9PV05fTkFNRTsKc3RhdGljIHBfY2hhciAgKlBBUk1fT1dOX1NTSUQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TU0lEOwpzdGF0aWMgcF91MTYJUEFSTV9QTV9FTkFCTEVEICAgICAgICAgICAgCT0gV1ZMQU5fUE1fU1RBVEVfRElTQUJMRUQ7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OICAJPSBQQVJNX0RFRkFVTFRfUE1fSE9MRE9WRVJfRFVSQVRJT047CnN0YXRpYyBwX3U4ICAgICBQQVJNX1BPUlRfVFlQRSAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUE9SVF9UWVBFOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9QUk9NSVNDVU9VU19NT0RFICAgICAgCT0gUEFSTV9ERUZBVUxUX1BST01JU0NVT1VTX01PREVfU1RSOwpzdGF0aWMgcF9jaGFyICAqUEFSTV9SRUpFQ1RfQU5ZICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JFSkVDVF9BTllfU1RSOwojaWZkZWYgVVNFX1dEUwpzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEMSAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQyICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDMgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwpzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xENCAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ1ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDYgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwojZW5kaWYgLy8gVVNFX1dEUwpzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1NSU0NfMkdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1JTQ18yR0haOwpzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfNUdIWjsKc3RhdGljIHBfdTggICAgIFBBUk1fU1lTVEVNX1NDQUxFICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TWVNURU1fU0NBTEU7CnN0YXRpYyBwX3U4ICAgICBQQVJNX1RYX0tFWSAgICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfS0VZOwpzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9QT1dfTEVWRUwgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1BPV19MRVZFTDsKI2lmZGVmIFVTRV9XRFMKc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTEgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUyICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwpzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFMyAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CnN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU1ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwpzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNiAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKI2VuZGlmIC8vIFVTRV9XRFMKc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURSAgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CiNpZmRlZiBVU0VfV0RTCnN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTMVtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwpzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzJbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1MzW0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CnN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNFtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwpzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzVbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M2W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CiNlbmRpZiAvLyBVU0VfV0RTCgoKI2lmIDAKTU9EVUxFX1BBUk0oUEFSTV9ERVNJUkVEX1NTSUQsICAgICAgICAgICJzIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9ERVNJUkVEX1NTSUQsICAgICAgICAgICAgICJOZXR3b3JrIE5hbWUgKDxzdHJpbmc+KSBbQU5ZXSIpOwpNT0RVTEVfUEFSTShQQVJNX09XTl9TU0lELCAgICAgICAgICAgICAgInMiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9TU0lELCAgICAgICAgICAgICAgICAgIk5ldHdvcmsgTmFtZSAoPHN0cmluZz4pIFtBTlldIik7Ck1PRFVMRV9QQVJNKFBBUk1fT1dOX0NIQU5ORUwsICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0NIQU5ORUwsICAgICAgICAgICAgICAiQ2hhbm5lbCAoMCAtIDE0KSBbMF0iKTsKTU9EVUxFX1BBUk0oUEFSTV9TWVNURU1fU0NBTEUsICAgICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9TWVNURU1fU0NBTEUsICAgICAgICAgICAgICJEaXN0YW5jZSBCZXR3ZWVuIEFQcyAoMSAtIDMpIFsxXSIpOwpNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEUsICAgICAgICAgICAgICAgImIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEUsICAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCIpOwpNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQsICAgICAgICAgImgiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQsICAgICAgICAgICAgIk1lZGl1bSBSZXNlcnZhdGlvbiAoUlRTL0NUUyBGcmFnbWVudCBMZW5ndGgpICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKTU9EVUxFX1BBUk0oUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUywgICJzIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUywgICAgICJNaWNyb3dhdmUgT3ZlbiBSb2J1c3RuZXNzIEVuYWJsZWQgKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7Ck1PRFVMRV9QQVJNKFBBUk1fT1dOX05BTUUsICAgICAgICAgICAgICAicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX05BTUUsICAgICAgICAgICAgICAgICAiU3RhdGlvbiBOYW1lICg8c3RyaW5nPikgW0xpbnV4XSIpOwoKTU9EVUxFX1BBUk0oUEFSTV9FTkFCTEVfRU5DUllQVElPTiwgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9FTkFCTEVfRU5DUllQVElPTiwgICAgICAgICJFbmNyeXB0aW9uIE1vZGUgKDAgLSA3KSBbMF0iKTsKCk1PRFVMRV9QQVJNKFBBUk1fS0VZMSwgICAgICAgICAgICAgICAgICAicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZMSwgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSAxICg8c3RyaW5nPikgW10iKTsKTU9EVUxFX1BBUk0oUEFSTV9LRVkyLCAgICAgICAgICAgICAgICAgICJzIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9LRVkyLCAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuY3J5cHRpb24gS2V5IDIgKDxzdHJpbmc+KSBbXSIpOwpNT0RVTEVfUEFSTShQQVJNX0tFWTMsICAgICAgICAgICAgICAgICAgInMiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX0tFWTMsICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5jcnlwdGlvbiBLZXkgMyAoPHN0cmluZz4pIFtdIik7Ck1PRFVMRV9QQVJNKFBBUk1fS0VZNCwgICAgICAgICAgICAgICAgICAicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZNCwgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSA0ICg8c3RyaW5nPikgW10iKTsKTU9EVUxFX1BBUk0oUEFSTV9UWF9LRVksICAgICAgICAgICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9LRVksICAgICAgICAgICAgICAgICAgICJUcmFuc21pdCBLZXkgSUQgKDEgLSA0KSBbMV0iKTsKTU9EVUxFX1BBUk0oUEFSTV9NVUxUSUNBU1RfUkFURSwgICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUkFURSwgICAgICAgICAgICJNdWx0aWNhc3QgUmF0ZSIpOwpNT0RVTEVfUEFSTShQQVJNX0RPV05MT0FEX0ZJUk1XQVJFLCAgICAgInMiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX0RPV05MT0FEX0ZJUk1XQVJFLCAgICAgICAgImZpbGVuYW1lIG9mIGZpcm13YXJlIGltYWdlIik7CgpNT0RVTEVfUEFSTShQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUsICAgImIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUsICAgICAgIkF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IHN1aXRlICgwLTQpIFswXSIpOwoKTU9EVUxFX1BBUk0oUEFSTV9MT0FEX0JBTEFOQ0lORywgICAgICAgICJzIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9MT0FEX0JBTEFOQ0lORywgICAgICAgICAgICJMb2FkIEJhbGFuY2luZyBFbmFibGVkICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOwpNT0RVTEVfUEFSTShQQVJNX01FRElVTV9ESVNUUklCVVRJT04sICAgInMiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX01FRElVTV9ESVNUUklCVVRJT04sICAgICAgIk1lZGl1bSBEaXN0cmlidXRpb24gRW5hYmxlZCAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKTU9EVUxFX1BBUk0oUEFSTV9UWF9QT1dfTEVWRUwsICAgICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9QT1dfTEVWRUwsICAgICAgICAgICAgICJUcmFuc21pdCBQb3dlciAoMCAtIDYpIFszXSIpOwpNT0RVTEVfUEFSTShQQVJNX1NSU0NfMkdIWiwgICAgICAgICAgICAgImIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1NSU0NfMkdIWiwgICAgICAgICAgICAgICAgIlN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sIDIuNCBHSHoiKTsKTU9EVUxFX1BBUk0oUEFSTV9TUlNDXzVHSFosICAgICAgICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9TUlNDXzVHSFosICAgICAgICAgICAgICAgICJTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbCA1LjAgR0h6Iik7Ck1PRFVMRV9QQVJNKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAyLjQgR0h6Iik7Ck1PRFVMRV9QQVJNKFBBUk1fQlJTQ181R0haLCAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ181R0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCA1LjAgR0h6Iik7CiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQovLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKTU9EVUxFX1BBUk0oUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICJoIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICAgICJQb3dlciBNYW5hZ2VtZW50IFN0YXRlICgwIC0gMiwgODAwMSAtIDgwMDIpIFswXSIpOwpNT0RVTEVfUEFSTShQQVJNX1BPUlRfVFlQRSwgICAgICAgICAgICAgImIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1BPUlRfVFlQRSwgICAgICAgICAgICAgICAgIlBvcnQgVHlwZSAoMSAtIDMpIFsxXSIpOwovLzs/TU9EVUxFX1BBUk0oUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICJzIik7Ci8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAgICAiQ3JlYXRlIElCU1MgKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7Ci8vOz9NT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgInMiKTsKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICAgICJNdWx0aWNhc3QgUmVjZWl2ZSBFbmFibGUgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7Ci8vOz9NT0RVTEVfUEFSTShQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgImgiKTsKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICAgICJNYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgU2xlZXAgRHVyYXRpb24gKDAgLSA2NTUzNSkgWzEwMF0iKTsKLy87P01PRFVMRV9QQVJNKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAiNmIiKTsKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9ORVRXT1JLX0FERFIsICAgICAgICAgICAgICJIYXJkd2FyZSBFdGhlcm5ldCBBZGRyZXNzIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgWzxmYWN0b3J5IHZhbHVlPl0iKTsKLy87P01PRFVMRV9QQVJNKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAiYiIpOwovLwovL3RyYWNrZXIgMTI0NDgKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgwLTIpIFswXSAwPU9wZW4gMT1TaGFyZWRLZXkgMj1MRUFQIik7Ci8vOz9NT0RVTEVfUEFSTV9ERVNDKGF1dGhlbnRpY2F0aW9uLCAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgxLTIpIFsxXSAxPU9wZW4gMj1TaGFyZWRLZXkiKTsKLy90cmFja2VyIDEyNDQ4Ci8vCi8vOz9NT0RVTEVfUEFSTShQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgImIiKTsKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICAgICJBVElNIFdpbmRvdyB0aW1lIGluIFRVIGZvciBJQlNTIGNyZWF0aW9uICgwLTEwMCkgWzBdIik7Ci8vOz9NT0RVTEVfUEFSTShQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgImIiKTsKLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICAgICJUaW1lIHN0YXRpb24gcmVtYWlucyBhd2FrZSBhZnRlciBNQUMgZnJhbWUgdHJhbnNmZXIgd2hlbiBQTSBpcyBvbiAoMC02NTUzNSkgWzEwMF0iKTsKLy87P01PRFVMRV9QQVJNKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAicyIpOwovLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgICAgIlByb21pc2N1b3VzIE1vZGUgRW5hYmxlICg8c3RyaW5nPiBZIG9yIE4gKSBbTl0iICk7Ci8vOz8KTU9EVUxFX1BBUk0oUEFSTV9DT05ORUNUSU9OX0NPTlRST0wsICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9DT05ORUNUSU9OX0NPTlRST0wsICAgICAgICJDb25uZWN0aW9uIENvbnRyb2wgKDAgLSAzKSBbMl0iKTsKI2VuZGlmIC8qIEhDRl9TVEEgKi8KI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKCQkJCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKTU9EVUxFX1BBUk0oUEFSTV9PV05fRFRJTV9QRVJJT0QsICAgICAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fRFRJTV9QRVJJT0QsICAgICAgICAgICJEVElNIFBlcmlvZCAoMCAtIDI1NSkgWzFdIik7Ck1PRFVMRV9QQVJNKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAgICAiQ2xvc2VkIFN5c3RlbSAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKTU9EVUxFX1BBUk0oUEFSTV9FWENMVURFX1VORU5DUllQVEVELCAgICJzIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9FWENMVURFX1VORU5DUllQVEVELCAgICAgICJEZW55IG5vbi1lbmNyeXB0ZWQgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7Ck1PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORywicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORywgICAiQnVmZmVyIE1BQyBmcmFtZXMgZm9yIFR4IGFmdGVyIERUSU0gKDxzdHJpbmc+IFkgb3IgTikgW1ldIik7Ck1PRFVMRV9QQVJNKFBBUk1fSU5UUkFfQlNTX1JFTEFZLCAgICAgICAicyIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fSU5UUkFfQlNTX1JFTEFZLCAgICAgICAgICAiSW50cmFCU1MgUmVsYXkgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDEsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDEsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMSAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDIsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDIsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMiAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDMsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDMsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMyAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDQsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDQsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNCAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDUsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDUsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNSAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDYsICAgICAgICAiaCIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDYsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNiAoMjU2IC0gMjM0NykgWzIzNDddIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTEsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTEsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAxICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTIsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTIsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAyICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTMsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTMsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAzICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTQsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTQsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA0ICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTUsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTUsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA1ICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTYsICAgICAgICAgICAgICAiYiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTYsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA2ICgxIC0gNykgWzNdIik7Ck1PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1MxLCAgICAgICAgICAiNmIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTMSwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCAxIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzIsICAgICAgICAgICI2YiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1MyLCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDIgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOwpNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTMywgICAgICAgICAgIjZiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzMsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgMyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7Ck1PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1M0LCAgICAgICAgICAiNmIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTNCwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCA0IChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzUsICAgICAgICAgICI2YiIpOwpNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1M1LCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDUgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOwpNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTNiwgICAgICAgICAgIjZiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzYsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgNiAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CgpNT0RVTEVfUEFSTShQQVJNX09XTl9CRUFDT05fSU5URVJWQUwsICAgImIiKTsKTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9CRUFDT05fSU5URVJWQUwsICAgICAgIk93biBCZWFjb24gSW50ZXJ2YWwgKDIwIC0gMjAwKSBbMTAwXSIpOwpNT0RVTEVfUEFSTShQQVJNX0NPRVhJU1RFTkNFLCAgICJiIik7Ck1PRFVMRV9QQVJNX0RFU0MoUEFSTV9DT0VYSVNURU5DRSwgICAgICAiQ29leGlzdGVuY2UgKDAtNykgWzBdIik7CgojZW5kaWYgLyogSENGX0FQICovCiNlbmRpZgoKLyogRU5EIE5FVyBQQVJBTUVURVJTICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGRlYnVnZ2luZyBzcGVjaWZpY3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIERCRwoKc3RhdGljIHBfdTMyICAgIHBjX2RlYnVnID0gREJHX0xWTDsKLy9NT0RVTEVfUEFSTShwY19kZWJ1ZywgImkiKTsKLypzdGF0aWMgOz9jb25mbGljdHMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIENMIHBhcmFtZXRlcnMgYW5kIGJyZWFrcyBub3cgSSBtb3ZlZAogKiB0aGUgY29ycmVzcG9uZGlnIGxvZ2ljIHRvIHdsX3Byb2ZpbGUKICovIHBfdTMyICAgIERlYnVnRmxhZyA9IH4wOyAvL3JlY29nbml6YWJsZSAidW5kZWZpbmVkIHZhbHVlIiByYXRoZXIgdGhlbiBEQkdfREVGQVVMVFM7Ci8vTU9EVUxFX1BBUk0oRGVidWdGbGFnLCAibCIpOwoKZGJnX2luZm9fdCAgIHdsX2luZm8gPSB7IERCR19NT0RfTkFNRSwgMCwgMCB9OwpkYmdfaW5mb190ICAqRGJnSW5mbyA9ICZ3bF9pbmZvOwoKI2VuZGlmIC8qIERCRyAqLwojaWZkZWYgVVNFX1JUUwoKc3RhdGljIHBfY2hhciAgKnVzZVJUUyA9ICJOIjsKTU9EVUxFX1BBUk0oIHVzZVJUUywgInMiICk7Ck1PRFVMRV9QQVJNX0RFU0MoIHVzZVJUUywgIlVzZSBSVFMgdGVzdCBpbnRlcmZhY2UgKDxzdHJpbmc+IE4gb3IgWSkgW05dIiApOwoKI2VuZGlmICAvKiBVU0VfUlRTICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGZpcm13YXJlIGRvd25sb2FkIHNwZWNpZmljcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpleHRlcm4gc3RydWN0IENGR19SQU5HRTJfU1RSQ1QgQkFTRUQKCWNmZ19kcnZfYWN0X3Jhbmdlc19wcmk7IAkgICAgLy8gZGVzY3JpYmVzIHByaW1hcnktYWN0b3IgcmFuZ2Ugb2YgSENGCgojaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUApleHRlcm4gbWVtaW1hZ2UgYXA7ICAgICAgICAgICAgICAgICAvLyBBUCBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCiNlbmRpZiAvKiBIQ0ZfQVAgKi8KCiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQovL2V4dGVybiBtZW1pbWFnZSBzdGF0aW9uOyAgICAgICAgICAgIC8vIFNUQSBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCmV4dGVybiBtZW1pbWFnZSBmd19pbWFnZTsgICAgICAgICAgICAvLyBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCiNlbmRpZiAvKiBIQ0ZfU1RBICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaW5zZXJ0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIHdsX2luc2VydCgpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcwogKiAgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQogKiAgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgb2YgdGhlIHdpcmVsZXNzIGRldmljZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUUlVFIG9yIEZBTFNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CglpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwoJaW50ICAgICAgICAgICAgICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwoJaW50ICAgICAgICAgICAgICAgICAgICAgaTsKCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzID0gMDsKCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfaW5zZXJ0IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBoYXJkd2FyZS4gKi8KCW1lbXNldCggJiggbHAtPmhjZkN0eCApLCAwLCBzaXplb2YoIElGQl9TVFJDVCApKTsKCgkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMuICovCglzcGluX2xvY2tfaW5pdCggJiggbHAtPnNsb2NrICkpOwoKCS8qIEludGlhbGl6ZSBzdGF0ZXMgKi8KCS8vbHAtPmxvY2tjb3VudCA9IDA7IC8vUEUxRE5OCiAgICAgICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7CglscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UOwoKCWxwLT5kZXYgPSBkZXY7CgoJREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX21hc2siLCAiMHglMDR4IiwgaXJxX21hc2sgJiAweDBGRkZGICk7CglEQkdfUEFSQU0oIERiZ0luZm8sICJpcnFfbGlzdCIsICIweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngiLAoJCQkgICBpcnFfbGlzdFswXSAmIDB4MEZGLCBpcnFfbGlzdFsxXSAmIDB4MEZGLAoJCQkgICBpcnFfbGlzdFsyXSAmIDB4MEZGLCBpcnFfbGlzdFszXSAmIDB4MEZGICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQsICJcIiVzXCIiLCBQQVJNX0RFU0lSRURfU1NJRCApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX1NTSUQsICJcIiVzXCIiLCBQQVJNX09XTl9TU0lEICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgIiVkIiwgUEFSTV9PV05fQ0hBTk5FTCk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFLCAiJWQiLCBQQVJNX1RYX1JBVEUgKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRCApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fTkFNRSwgIlwiJXNcIiIsIFBBUk1fT1dOX05BTUUgKTsKLy87PwkJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04sICJcIiVzXCIiLCBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkyLCAiXCIlc1wiIiwgUEFSTV9LRVkyICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkzLCAiXCIlc1wiIiwgUEFSTV9LRVkzICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0ICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9LRVksICIlZCIsIFBBUk1fVFhfS0VZICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSwgIiVkIiwgUEFSTV9NVUxUSUNBU1RfUkFURSApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFLCAiJWQiLCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKLy87PyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCgkJCQkJLy87P3Nob3VsZCB3ZSBtYWtlIHRoaXMgY29kZSBjb25kaXRpb25hbCBkZXBlbmRpbmcgb24gaW4gU1RBIG1vZGUKLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE9SVF9UWVBFLCAiJWQiLCBQQVJNX1BPUlRfVFlQRSApOwoJCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BNX0VOQUJMRUQsICIlMDR4IiwgUEFSTV9QTV9FTkFCTEVEICk7Ci8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCAiXCIlc1wiIiwgUEFSTV9DUkVBVEVfSUJTUyApOwovLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9SWCApOwovLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NQVhfU0xFRVAsICIlZCIsIFBBUk1fTUFYX1NMRUVQICk7Ci8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX05FVFdPUktfQUREUiwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9ORVRXT1JLX0FERFIgKSk7Ci8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OLCAiJWQiLCBQQVJNX0FVVEhFTlRJQ0FUSU9OICk7Ci8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVywgIiVkIiwgUEFSTV9PV05fQVRJTV9XSU5ET1cgKTsKLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04sICIlZCIsIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gKTsKLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSwgIlwiJXNcIiIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSApOwovLzs/I2VuZGlmIC8qIEhDRl9TVEEgKi8KI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKCQkvLzs/SSBndWVzczogbm8sIHNpbmNlIHRoaXMgaXMgRGVidWcgbW9kZSBvbmx5CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsICIlZCIsIFBBUk1fT1dOX0RUSU1fUEVSSU9EICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCAiXCIlc1wiIiwgUEFSTV9SRUpFQ1RfQU5ZICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVELCAiXCIlc1wiIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksICJcIiVzXCIiLCBQQVJNX0lOVFJBX0JTU19SRUxBWSApOwojaWZkZWYgVVNFX1dEUwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDEgKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMywgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMyApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDQgKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1ICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENiApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTEsICIlZCIsIFBBUk1fVFhfUkFURTEgKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMywgIiVkIiwgUEFSTV9UWF9SQVRFMyApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTQsICIlZCIsIFBBUk1fVFhfUkFURTQgKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1ICk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNiwgIiVkIiwgUEFSTV9UWF9SQVRFNiApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTMSApKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMiwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzIgKSk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1MzICkpOwoJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0LCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTNCApKTsKCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTNSwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzUgKSk7CglEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1M2ICkpOwojZW5kaWYgLyogVVNFX1dEUyAqLwojZW5kaWYgLyogSENGX0FQICovCgoJVkFMSURfUEFSQU0oICFQQVJNX0RFU0lSRURfU1NJRCB8fCAoIHN0cmxlbiggUEFSTV9ERVNJUkVEX1NTSUQgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKCVZBTElEX1BBUkFNKCAhUEFSTV9PV05fU1NJRCB8fCAoIHN0cmxlbiggUEFSTV9PV05fU1NJRCApIDw9IFBBUk1fTUFYX05BTUVfTEVOICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9DSEFOTkVMIDw9IFBBUk1fTUFYX09XTl9DSEFOTkVMICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX1NZU1RFTV9TQ0FMRSA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUgKSAmJiAoIFBBUk1fU1lTVEVNX1NDQUxFIDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSApKTsKCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIFBBUk1fVFhfUkFURSA8PSBQQVJNX01BWF9UWF9SQVRFICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKCVZBTElEX1BBUkFNKCAhUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSApICE9IE5VTEwgKTsKCVZBTElEX1BBUkFNKCAhUEFSTV9PV05fTkFNRSB8fCAoIHN0cmxlbiggUEFSTV9OQU1FX09XTl9OQU1FICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSk7CglWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkxICkpOwoJVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMiApKTsKCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTMgKSk7CglWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVk0ICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX1RYX0tFWSA+PSBQQVJNX01JTl9UWF9LRVkgKSAmJiAoIFBBUk1fVFhfS0VZIDw9IFBBUk1fTUFYX1RYX0tFWSApKTsKCglWQUxJRF9QQVJBTSgoIFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgKSAmJgoJCQkJCSggUEFSTV9NVUxUSUNBU1RfUkFURSA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSApKTsKCglWQUxJRF9QQVJBTSggIVBBUk1fRE9XTkxPQURfRklSTVdBUkUgfHwgKCBzdHJsZW4oIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKSA8PSAyNTUgLyo7PyovICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgPCBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFICkpOwoKCVZBTElEX1BBUkFNKCAhUEFSTV9MT0FEX0JBTEFOQ0lORyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9MT0FEX0JBTEFOQ0lOR1swXSApICE9IE5VTEwgKTsKCVZBTElEX1BBUkFNKCAhUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUE9XX0xFVkVMIDw9IFBBUk1fTUFYX1RYX1BPV19MRVZFTCApKTsKCiAJVkFMSURfUEFSQU0oKCBQQVJNX1BPUlRfVFlQRSA+PSBQQVJNX01JTl9QT1JUX1RZUEUgKSAmJiAoIFBBUk1fUE9SVF9UWVBFIDw9IFBBUk1fTUFYX1BPUlRfVFlQRSApKTsKCVZBTElEX1BBUkFNKCBQQVJNX1BNX0VOQUJMRUQgPD0gV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQgfHwKCQkJCSAoIFBBUk1fUE1fRU5BQkxFRCAmIDB4N0ZGRiApIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEICk7CiAJVkFMSURfUEFSQU0oICFQQVJNX0NSRUFURV9JQlNTIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApOwogCVZBTElEX1BBUkFNKCAhUEFSTV9NVUxUSUNBU1RfUlggfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTVVMVElDQVNUX1JYWzBdICkgIT0gTlVMTCApOwogCVZBTElEX1BBUkFNKCggUEFSTV9NQVhfU0xFRVAgPD0gUEFSTV9NQVhfTUFYX1BNX1NMRUVQICkpOwogCVZBTElEX1BBUkFNKCggUEFSTV9BVVRIRU5USUNBVElPTiA8PSBQQVJNX01BWF9BVVRIRU5USUNBVElPTiApKTsKIAlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0FUSU1fV0lORE9XIDw9IFBBUk1fTUFYX09XTl9BVElNX1dJTkRPVyApKTsKIAlWQUxJRF9QQVJBTSgoIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gPD0gUEFSTV9NQVhfUE1fSE9MRE9WRVJfRFVSQVRJT04gKSk7CiAJVkFMSURfUEFSQU0oICFQQVJNX1BST01JU0NVT1VTX01PREUgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKTsKCVZBTElEX1BBUkFNKCggUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgPD0gUEFSTV9NQVhfQ09OTkVDVElPTl9DT05UUk9MICkpOwoKCVZBTElEX1BBUkFNKCggUEFSTV9PV05fRFRJTV9QRVJJT0QgPj0gUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICkpOwoJVkFMSURfUEFSQU0oICFQQVJNX1JFSkVDVF9BTlkgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fUkVKRUNUX0FOWVswXSApICE9IE5VTEwgKTsKCVZBTElEX1BBUkFNKCAhUEFSTV9FWENMVURFX1VORU5DUllQVEVEIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURURbMF0gKSAhPSBOVUxMICk7CglWQUxJRF9QQVJBTSggIVBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HWzBdICkgIT0gTlVMTCApOwoJVkFMSURfUEFSQU0oICFQQVJNX0lOVFJBX0JTU19SRUxBWSB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICk7CiNpZmRlZiBVU0VfV0RTCglWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDEgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xEMiA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQzIDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xENSA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOwoJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQ2IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTEgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUxIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTIgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUyIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTMgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUzIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTUgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU1IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTYgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU2IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CiNlbmRpZiAvKiBVU0VfV0RTICovCgoJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9CRUFDT05fSU5URVJWQUwgPj0gUEFSTV9NSU5fT1dOX0JFQUNPTl9JTlRFUlZBTCApICYmICggUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMIDw9IFBBUk1fTUFYX09XTl9CRUFDT05fSU5URVJWQUwgKSk7CglWQUxJRF9QQVJBTSgoIFBBUk1fQ09FWElTVEVOQ0UgPD0gUEFSTV9DT0VYSVNURU5DRSApKTsKCgkvKiBTZXQgdGhlIGRyaXZlciBwYXJhbWV0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLiAqLwoKCS8qIFRIRVNFIE1PRFVMRSBQQVJBTUVURVJTIEFSRSBUTyBCRSBERVBSRUNBVEVEIElOIEZBVk9SIE9GIEEgTkFNSU5HIENPTlZFTlRJT04KCSAgIFdISUNIIElTIElOTElORSBXSVRIIFRIRSBGT1JUSENPTUlORyBXQVZFTEFOIEFQSSAqLwoKCS8qIFNUQVJUIE5FVyBQQVJBTUVURVJTICovCgoJbHAtPkNoYW5uZWwgICAgICAgICAgICAgPSBQQVJNX09XTl9DSEFOTkVMOwoJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyAgPSBQQVJNX1NZU1RFTV9TQ0FMRTsKCgkvKiBOZWVkIHRvIGRldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBuZXcgYmFuZHMgZm9yIDVHSHogKi8KCWxwLT5UeFJhdGVDb250cm9sWzBdICAgID0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKCWxwLT5UeFJhdGVDb250cm9sWzFdICAgID0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfNUdIWjsKCglscC0+UlRTVGhyZXNob2xkICAgICAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDsKCgkvKiBOZWVkIHRvIGRldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBuZXcgYmFuZHMgZm9yIDVHSHogKi8KCWxwLT5NdWx0aWNhc3RSYXRlWzBdICAgID0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzJHSFo7CglscC0+TXVsdGljYXN0UmF0ZVsxXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haOwoKCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTWzBdICkgIT0gTlVMTCApIHsKCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IDE7Cgl9IGVsc2UgewoJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gMDsKCX0KCWlmICggUEFSTV9ERVNJUkVEX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CgkJc3RyY3B5KCBscC0+TmV0d29ya05hbWUsIFBBUk1fREVTSVJFRF9TU0lEICk7Cgl9CglpZiAoIFBBUk1fT1dOX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9PV05fU1NJRCApOwoJfQoJaWYgKCBQQVJNX09XTl9OQU1FICYmICggc3RybGVuKCBQQVJNX09XTl9OQU1FICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CgkJc3RyY3B5KCBscC0+U3RhdGlvbk5hbWUsIFBBUk1fT1dOX05BTUUgKTsKCX0KCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gUEFSTV9FTkFCTEVfRU5DUllQVElPTjsKCWlmICggUEFSTV9LRVkxICYmICggc3RybGVuKCBQQVJNX0tFWTEgKSA8PSBNQVhfS0VZX0xFTiApKSB7CgkJc3RyY3B5KCBscC0+S2V5MSwgUEFSTV9LRVkxICk7Cgl9CglpZiAoIFBBUk1fS0VZMiAmJiAoIHN0cmxlbiggUEFSTV9LRVkyICkgPD0gTUFYX0tFWV9MRU4gKSkgewoJCXN0cmNweSggbHAtPktleTIsIFBBUk1fS0VZMiApOwoJfQoJaWYgKCBQQVJNX0tFWTMgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMyApIDw9IE1BWF9LRVlfTEVOICkpIHsKCQlzdHJjcHkoIGxwLT5LZXkzLCBQQVJNX0tFWTMgKTsKCX0KCWlmICggUEFSTV9LRVk0ICYmICggc3RybGVuKCBQQVJNX0tFWTQgKSA8PSBNQVhfS0VZX0xFTiApKSB7CgkJc3RyY3B5KCBscC0+S2V5NCwgUEFSTV9LRVk0ICk7Cgl9CgoJbHAtPlRyYW5zbWl0S2V5SUQgPSBQQVJNX1RYX0tFWTsKCglrZXlfc3RyaW5nMmtleSggbHAtPktleTEsICYobHAtPkRlZmF1bHRLZXlzLmtleVswXSApKTsKCWtleV9zdHJpbmcya2V5KCBscC0+S2V5MiwgJihscC0+RGVmYXVsdEtleXMua2V5WzFdICkpOwoJa2V5X3N0cmluZzJrZXkoIGxwLT5LZXkzLCAmKGxwLT5EZWZhdWx0S2V5cy5rZXlbMl0gKSk7CglrZXlfc3RyaW5nMmtleSggbHAtPktleTQsICYobHAtPkRlZmF1bHRLZXlzLmtleVszXSApKTsKCglscC0+RG93bmxvYWRGaXJtd2FyZSA9IDEgOyAvLzs/dG8gYmUgdXBncmFkZWQgUEFSTV9ET1dOTE9BRF9GSVJNV0FSRTsKCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFOwoKCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApIHsKCQlscC0+bG9hZEJhbGFuY2luZyA9IDE7Cgl9IGVsc2UgewoJCWxwLT5sb2FkQmFsYW5jaW5nID0gMDsKCX0KCglpZiAoIHN0cmNociggIll5IiwgUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OWzBdICkgIT0gTlVMTCApIHsKCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gMTsKCX0gZWxzZSB7CgkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDA7Cgl9CgoJbHAtPnR4UG93TGV2ZWwgPSBQQVJNX1RYX1BPV19MRVZFTDsKCglscC0+c3JzY1swXSA9IFBBUk1fU1JTQ18yR0haOwoJbHAtPnNyc2NbMV0gPSBQQVJNX1NSU0NfNUdIWjsKCWxwLT5icnNjWzBdID0gUEFSTV9CUlNDXzJHSFo7CglscC0+YnJzY1sxXSA9IFBBUk1fQlJTQ181R0haOwojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CglscC0+UG9ydFR5cGUgICAgICAgICAgICA9IFBBUk1fUE9SVF9UWVBFOwoJbHAtPk1heFNsZWVwRHVyYXRpb24gICAgPSBQQVJNX01BWF9TTEVFUDsKCWxwLT5hdXRoZW50aWNhdGlvbiAgICAgID0gUEFSTV9BVVRIRU5USUNBVElPTjsKCWxwLT5hdGltV2luZG93ICAgICAgICAgID0gUEFSTV9PV05fQVRJTV9XSU5ET1c7CglscC0+aG9sZG92ZXJEdXJhdGlvbiAgICA9IFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT047CglscC0+UE1FbmFibGVkICAgICAgICAgICA9IFBBUk1fUE1fRU5BQkxFRDsgIC8vOz8KCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApIHsKCQlscC0+Q3JlYXRlSUJTUyA9IDE7Cgl9IGVsc2UgewoJCWxwLT5DcmVhdGVJQlNTID0gMDsKCX0KCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKSB7CgkJbHAtPk11bHRpY2FzdFJlY2VpdmUgPSAwOwoJfSBlbHNlIHsKCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IDE7Cgl9CglpZiAoIHN0cmNociggIll5IiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFWzBdICkgIT0gTlVMTCApIHsKCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMTsKCX0gZWxzZSB7CgkJbHAtPnByb21pc2N1b3VzTW9kZSA9IDA7Cgl9Cglmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKCSAgIGxwLT5NQUNBZGRyZXNzW2ldID0gUEFSTV9ORVRXT1JLX0FERFJbaV07Cgl9CgoJbHAtPmNvbm5lY3Rpb25Db250cm9sID0gUEFSTV9DT05ORUNUSU9OX0NPTlRST0w7CgojZW5kaWYgLyogSENGX1NUQSAqLwojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAoJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CglscC0+RFRJTVBlcmlvZCA9IFBBUk1fT1dOX0RUSU1fUEVSSU9EOwoKCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX1JFSkVDVF9BTllbMF0gKSAhPSBOVUxMICkgewoJCWxwLT5SZWplY3RBbnkgPSAxOwoJfSBlbHNlIHsKCQlscC0+UmVqZWN0QW55ID0gMDsKCX0KCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURURbMF0gKSAhPSBOVUxMICkgewoJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSAwOwoJfSBlbHNlIHsKCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMTsKCX0KCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkgewoJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyA9IDE7Cgl9IGVsc2UgewoJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyA9IDA7Cgl9CglpZiAoIHN0cmNociggIll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICkgewoJCWxwLT5pbnRyYUJTU1JlbGF5ID0gMTsKCX0gZWxzZSB7CgkJbHAtPmludHJhQlNTUmVsYXkgPSAwOwoJfQoKCWxwLT5vd25CZWFjb25JbnRlcnZhbCA9IFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTDsKCWxwLT5jb2V4aXN0ZW5jZSAgICAgICA9IFBBUk1fQ09FWElTVEVOQ0U7CgojaWZkZWYgVVNFX1dEUwoJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDE7CglscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xEMjsKCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQzOwoJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDQ7CglscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xENTsKCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQ2OwoJbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTE7CglscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFMjsKCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEUzOwoJbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTQ7CglscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFNTsKCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEU2OwoKCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgewoJCWxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzFbaV07Cgl9Cglmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKCQlscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1MyW2ldOwoJfQoJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CgkJbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTM1tpXTsKCX0KCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgewoJCWxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzRbaV07Cgl9Cglmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKCQlscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1M1W2ldOwoJfQoJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CgkJbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTNltpXTsKCX0KI2VuZGlmICAvKiBVU0VfV0RTICovCiNlbmRpZiAgLyogSENGX0FQICovCiNpZmRlZiBVU0VfUlRTCglpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApIHsKCQlscC0+dXNlUlRTID0gMTsKCX0gZWxzZSB7CgkJbHAtPnVzZVJUUyA9IDA7Cgl9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKCgkvKiBFTkQgTkVXIFBBUkFNRVRFUlMgKi8KCgoJd2xfbG9jayggbHAsICZmbGFncyApOwoKCS8qIEluaXRpYWxpemUgdGhlIHBvcnRTdGF0ZSB2YXJpYWJsZSAqLwoJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CgoJLyogSW5pdGlhbGl6ZSB0aGUgU2NhblJlc3VsdCBzdHJ1Y3QgKi8KCW1lbXNldCggJiggbHAtPnNjYW5fcmVzdWx0cyApLCAwLCBzaXplb2YoIGxwLT5zY2FuX3Jlc3VsdHMgKSk7CglscC0+c2Nhbl9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKCgkvKiBJbml0aWFsaXplIHRoZSBQcm9iZVJlc3VsdCBzdHJ1Y3QgKi8KCW1lbXNldCggJiggbHAtPnByb2JlX3Jlc3VsdHMgKSwgMCwgc2l6ZW9mKCBscC0+cHJvYmVfcmVzdWx0cyApKTsKCWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKCWxwLT5wcm9iZV9udW1fYXBzID0gMDsKCgoJLyogSW5pdGlhbGl6ZSBUeCBxdWV1ZSBzdHVmZiAqLwoJbWVtc2V0KCBscC0+dHhMaXN0LCAwLCBzaXplb2YoIGxwLT50eExpc3QgKSk7CgoJSU5JVF9MSVNUX0hFQUQoICYoIGxwLT50eEZyZWUgKSk7CgoJbHAtPnR4Ri5za2IgID0gTlVMTDsKCWxwLT50eEYucG9ydCA9IDA7CgoKCWZvciggaSA9IDA7IGkgPCBERUZBVUxUX05VTV9UWF9GUkFNRVM7IGkrKyApIHsKCQlsaXN0X2FkZF90YWlsKCAmKCBscC0+dHhMaXN0W2ldLm5vZGUgKSwgJiggbHAtPnR4RnJlZSApKTsKCX0KCgoJZm9yKCBpID0gMDsgaSA8IFdWTEFOX01BWF9UWF9RVUVVRVM7IGkrKyApIHsKCQlJTklUX0xJU1RfSEVBRCggJiggbHAtPnR4UVtpXSApKTsKCX0KCglscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOwoJbHAtPnR4UV9jb3VudCA9IDA7CgkvKiBJbml0aWFsaXplIHRoZSB1c2VfZG1hIGVsZW1lbnQgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLiBOb3Qgc3VyZSBpZgoJICAgdGhpcyBzaG91bGQgYmUgYSBjb21waWxlLXRpbWUgb3IgcnVuLXRpbWUgY29uZmlndXJhYmxlLiBTbyBmb3Igbm93LAoJICAgaW1wbGVtZW50IGFzIHJ1bi10aW1lIGFuZCBqdXN0IGRlZmluZSBoZXJlICovCiNpZmRlZiBXQVJQCiNpZmRlZiBFTkFCTEVfRE1BCglEQkdfVFJBQ0UoIERiZ0luZm8sICJIRVJNRVMgMi41IEJVU01BU1RFUiBETUEgTU9ERVxuIiApOwoJbHAtPnVzZV9kbWEgPSAxOwojZWxzZQoJREJHX1RSQUNFKCBEYmdJbmZvLCAiSEVSTUVTIDIuNSBQT1JUIEkvTyBNT0RFXG4iICk7CglscC0+dXNlX2RtYSA9IDA7CiNlbmRpZiAvLyBFTkFCTEVfRE1BCiNlbmRpZiAvLyBXQVJQCgoJLyogUmVnaXN0ZXIgdGhlIElTUiBoYW5kbGVyIGluZm9ybWF0aW9uIGhlcmUsIHNvIHRoYXQgaXQncyBub3QgZG9uZQoJICAgcmVwZWF0ZWRseSBpbiB0aGUgSVNSICovCiAgICAgICAgdGFza2xldF9pbml0KCZscC0+dGFzaywgd2xfaXNyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKWxwKTsKCiAgICAgICAgLyogQ29ubmVjdCB0byB0aGUgYWRhcHRlciAqLwogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkNhbGxpbmcgaGNmX2Nvbm5lY3QoKS4uLlxuIiApOwogICAgICAgIGhjZl9zdGF0dXMgPSBoY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIGRldi0+YmFzZV9hZGRyICk7CgkvL0hDRl9FUlJfSU5DT01QX0ZXIGlzIGFjY2VwdGFibGUsIGJlY2F1c2UgZG93bmxvYWQgbXVzdCBzdGlsbCB0YWtlIHBsYWNlCgkvL0hDRl9FUlJfSU5DT01QX1BSSSBpcyBub3QgYWNjZXB0YWJsZQoJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICYmIGhjZl9zdGF0dXMgIT0gSENGX0VSUl9JTkNPTVBfRlcgKSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiaGNmX2Nvbm5lY3QoKSBmYWlsZWQsIHN0YXR1czogMHgleFxuIiwgaGNmX3N0YXR1cyApOwoJCXdsX3VubG9jayggbHAsICZmbGFncyApOwoJCWdvdG8gaGNmX2ZhaWxlZDsKCX0KCgkvLzs/c2hvdWxkIHNldCBIQ0ZfdmVyc2lvbiBhbmQgaG93IGFib3V0IGRyaXZlcl9zdGF0CglscC0+ZHJpdmVySW5mby5JT19hZGRyZXNzICAgICAgID0gZGV2LT5iYXNlX2FkZHI7CglscC0+ZHJpdmVySW5mby5JT19yYW5nZSAgICAgICAgID0gSENGX05VTV9JT19QT1JUUzsJLy87P2NvbmRpdGlvbmFsbHkgMHg0MCBvciAweDgwIHNlZW1zIGJldHRlcgoJbHAtPmRyaXZlckluZm8uSVJRX251bWJlciAgICAgICA9IGRldi0+aXJxOwoJbHAtPmRyaXZlckluZm8uY2FyZF9zdGF0ICAgICAgICA9IGxwLT5oY2ZDdHguSUZCX0NhcmRTdGF0OwoJLy87PyB3aGF0IGhhcHBlbmVkIHRvIGZyYW1lX3R5cGUKCgkvKiBGaWxsIGluIHRoZSBkcml2ZXIgaWRlbnRpdHkgc3RydWN0dXJlICovCglscC0+ZHJpdmVySWRlbnRpdHkubGVuICAgICAgICAgICAgICA9ICggc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSAvIHNpemVvZiggaGNmXzE2ICkpIC0gMTsKCWxwLT5kcml2ZXJJZGVudGl0eS50eXAgICAgICAgICAgICAgID0gQ0ZHX0RSVl9JREVOVElUWTsKCWxwLT5kcml2ZXJJZGVudGl0eS5jb21wX2lkICAgICAgICAgID0gRFJWX0lERU5USVRZOwoJbHAtPmRyaXZlcklkZW50aXR5LnZhcmlhbnQgICAgICAgICAgPSBEUlZfVkFSSUFOVDsKCWxwLT5kcml2ZXJJZGVudGl0eS52ZXJzaW9uX21ham9yICAgID0gRFJWX01BSk9SX1ZFUlNJT047CglscC0+ZHJpdmVySWRlbnRpdHkudmVyc2lvbl9taW5vciAgICA9IERSVl9NSU5PUl9WRVJTSU9OOwoKCgkvKiBTdGFydCB0aGUgY2FyZCBoZXJlIC0gVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIG9yZGVyIHRvIGdldCB0aGUKCSAgIE1BQyBhZGRyZXNzIGZvciB0aGUgbmV0d29yayBsYXllciAqLwoJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FsbGluZyB3dmxhbl9nbygpIHRvIHBlcmZvcm0gYSBjYXJkIHJlc2V0Li4uXG4iICk7CgloY2Zfc3RhdHVzID0gd2xfZ28oIGxwICk7CgoJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgIndsX2dvKCkgZmFpbGVkXG4iICk7CgkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgkJZ290byBoY2ZfZmFpbGVkOwoJfQoKCS8qIENlcnRhaW4gUklEcyBtdXN0IGJlIHNldCBiZWZvcmUgZW5hYmxpbmcgdGhlIHBvcnRzICovCgl3bF9wdXRfbHR2X2luaXQoIGxwICk7CgojaWYgMCAvLzs/d2h5IHdhcyB0aGlzIGFscmVhZHkgY29tbWVudGVkIG91dCBpbiB3bF9sa21fNzIwCgkvKiBFbmFibGUgdGhlIHBvcnRzICovCglpZiAoIHdsX2FkYXB0ZXJfaXNfb3BlbiggbHAtPmRldiApKSB7CgkJLyogRW5hYmxlIHRoZSBwb3J0cyAqLwoJCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOwoJCWhjZl9zdGF0dXMgPSB3bF9lbmFibGUoIGxwICk7CgoJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKCQl9CgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxpbmcgV0RTIFBvcnRzXG4iICk7CgkJLy93bF9lbmFibGVfd2RzX3BvcnRzKCBscCApOwojZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLwoKCX0KI2VuZGlmCgoJLyogRmlsbCBvdXQgdGhlIE1BQyBhZGRyZXNzIGluZm9ybWF0aW9uIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLwoJbWVtY3B5KCBscC0+ZGV2LT5kZXZfYWRkciwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7CglkZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CgoJbHAtPmlzX3JlZ2lzdGVyZWQgPSBUUlVFOwoKI2lmZGVmIFVTRV9QUk9GSUxFCgkvKiBQYXJzZSB0aGUgY29uZmlnIGZpbGUgZm9yIHRoZSBzYWtlIG9mIGNyZWF0aW5nIFdEUyBwb3J0cyBpZiBXRFMgaXMKCSAgIGNvbmZpZ3VyZWQgdGhlcmUgYnV0IG5vdCBpbiB0aGUgbW9kdWxlIG9wdGlvbnMgKi8KCXBhcnNlX2NvbmZpZyggZGV2ICk7CiNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KCgkvKiBJZiB3ZSdyZSBnb2luZyBpbnRvIEFQIE1vZGUsIHJlZ2lzdGVyIHRoZSAidmlydHVhbCIgZXRoZXJuZXQgZGV2aWNlcwoJICAgbmVlZGVkIGZvciBXRFMgKi8KCVdMX1dEU19ORVRERVZfUkVHSVNURVIoIGxwICk7CgoJLyogUmVzZXQgdGhlIERvd25sb2FkRmlybXdhcmUgdmFyaWFibGUgaW4gdGhlIHByaXZhdGUgc3RydWN0LiBJZiB0aGUKCSAgIGNvbmZpZyBmaWxlIGlzIG5vdCB1c2VkLCB0aGlzIHdpbGwgbm90IG1hdHRlcjsgaWYgaXQgaXMgdXNlZCwgaXQKCSAgIHdpbGwgYmUgcmVwYXJzZWQgaW4gd2xfb3BlbigpLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSBsb2dpYyBpbiB3bF9vcGVuCgkgICB1c2VkIHRvIGNoZWNrIGlmIGEgZmlybXdhcmUgZG93bmxvYWQgaXMgbmVlZGVkIGlzIGJyb2tlbiBieSBwYXJzaW5nCgkgICB0aGUgZmlsZSBoZXJlOyBob3dldmVyLCB0aGlzIHBhcnNpbmcgaXMgbmVlZGVkIHRvIHJlZ2lzdGVyIFdEUyBwb3J0cwoJICAgaW4gQVAgbW9kZSwgaWYgdGhleSBhcmUgY29uZmlndXJlZCAqLwoJbHAtPkRvd25sb2FkRmlybXdhcmUgPSBXVkxBTl9EUlZfTU9ERV9TVEE7IC8vOz9kb3dubG9hZF9maXJtd2FyZTsKCiNpZmRlZiBVU0VfUlRTCglpZiAoIGxwLT51c2VSVFMgPT0gMSApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJFTlRFUklORyBSVFMgTU9ERS4uLlxuIiApOwogICAgICAgICAgICAgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CiAgICAgICAgICAgICAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsgLy8gTm90IGhhbmRsaW5nIGludGVycnVwdHMgYW55bW9yZQoKCQl3bF9kaXNhYmxlKCBscCApOwoKICAgICAgICAJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCk7Cgl9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoKCURCR19UUkFDRSggRGJnSW5mbywgIiVzOiBXaXJlbGVzcywgaW9fYWRkciAlIzAzbHgsIGlycSAlZCwgIiJtYWNfYWRkcmVzcyAiLAoJCQkgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSApOwoKCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgewoJCXByaW50ayggIiUwMlglYyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoIGkgPCAoIEVUSF9BTEVOLTEgKSkgPyAnOicgOiAnXG4nICkpOwoJfQoKI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoICJ3bGFncyIsIDAsIE5VTEwsIHNjdWxsX3JlYWRfcHJvY21lbSwgZGV2ICk7Cglwcm9jX21rZGlyKCJkcml2ZXIvd2xhZ3M0OSIsIDApOwoJcHJvY193cml0ZSgiZHJpdmVyL3dsYWdzNDkvd2xhZ3M0OV90eXBlIiwgd3JpdGVfaW50LCAmbHAtPndsYWdzNDlfdHlwZSk7CiNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKCmhjZl9mYWlsZWQ6Cgl3bF9oY2ZfZXJyb3IoIGRldiwgaGNmX3N0YXR1cyApOwoKZmFpbGVkOgoKCURCR19FUlJPUiggRGJnSW5mbywgIndsX2luc2VydCgpIEZBSUxFRFxuIiApOwoKCWlmICggbHAtPmlzX3JlZ2lzdGVyZWQgPT0gVFJVRSApIHsKCQlscC0+aXNfcmVnaXN0ZXJlZCA9IEZBTFNFOwoJfQoKCVdMX1dEU19ORVRERVZfREVSRUdJU1RFUiggbHAgKTsKCglyZXN1bHQgPSAtRUZBVUxUOwoKCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiByZXN1bHQ7Cn0gLy8gd2xfaW5zZXJ0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcmVzZXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmVzZXQgdGhlIGFkYXB0ZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgb2YgdGhlIHdpcmVsZXNzIGRldmljZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CglpbnQgICAgICAgICAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfcmVzZXQiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwoJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2LT5iYXNlX2FkZHIiLCAiKCUjMDNseCkiLCBkZXYtPmJhc2VfYWRkciApOwoKCS8qCiAgICAgICAgICogVGhlIGNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGEgbG9jayBhbmQKICAgICAgICAgKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzLCB3ZSBkbyBub3QgbG9jayBoZXJlLAogICAgICAgICAqIG5vciBkbyB3ZSBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzIQogICAgICAgICAqLwoKCURCR19UUkFDRSggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3M6ICUjMDNseFxuIiwgZGV2LT5iYXNlX2FkZHIgKTsKCWlmICggZGV2LT5iYXNlX2FkZHIgKSB7CgkJLyogU2h1dGRvd24gdGhlIGFkYXB0ZXIuICovCgkJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCApOwoKCQkvKiBSZXNldCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uLiAqLwoJCWxwLT50eEJ5dGVzID0gMDsKCgkJLyogQ29ubmVjdCB0byB0aGUgYWRhcHRlci4gKi8KICAgICAgICAJaGNmX3N0YXR1cyA9IGhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgZGV2LT5iYXNlX2FkZHIgKTsKCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgJiYgaGNmX3N0YXR1cyAhPSBIQ0ZfRVJSX0lOQ09NUF9GVyApIHsKCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiaGNmX2Nvbm5lY3QoKSBmYWlsZWQsIHN0YXR1czogMHgleFxuIiwgaGNmX3N0YXR1cyApOwoJCQlnb3RvIG91dDsKCQl9CgoJCS8qIENoZWNrIGlmIGZpcm13YXJlIGlzIHByZXNlbnQsIGlmIG5vdCBjaGFuZ2Ugc3RhdGUgKi8KCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX0VSUl9JTkNPTVBfRlcgKSB7CgkJCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7CgkJfQoKCQkvKiBJbml0aWFsaXplIHRoZSBwb3J0U3RhdGUgdmFyaWFibGUgKi8KCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKCgkJLyogUmVzdGFydCB0aGUgYWRhcHRlci4gKi8KCQloY2Zfc3RhdHVzID0gd2xfZ28oIGxwICk7CgkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewoJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9nbygpIGZhaWxlZCwgc3RhdHVzOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CgkJCWdvdG8gb3V0OwoJCX0KCgkJLyogQ2VydGFpbiBSSURzIG11c3QgYmUgc2V0IGJlZm9yZSBlbmFibGluZyB0aGUgcG9ydHMgKi8KCQl3bF9wdXRfbHR2X2luaXQoIGxwICk7Cgl9IGVsc2UgewoJCURCR19FUlJPUiggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3MgSU5WQUxJRCEhIVxuIiApOwoJfQoKb3V0OgoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gaGNmX3N0YXR1czsKfSAvLyB3bF9yZXNldAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2dvKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlc2V0IHRoZSBhZGFwdGVyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0IG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9nbyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50ICAJaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwoJY2hhcgkqY3AgPSBOVUxMOwkJCS8vZndfaW1hZ2UKCWludAlyZXRyaWVzID0gMDsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfZ28iICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCgloY2Zfc3RhdHVzID0gd2xfZGlzYWJsZSggbHAgKTsKCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEaXNhYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKCgkJd2hpbGUgKCggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApICYmIChyZXRyaWVzIDwgMTApKSB7CgkJCXJldHJpZXMrKzsKCQkJaGNmX3N0YXR1cyA9IHdsX2Rpc2FibGUoIGxwICk7CgkJfQoJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGlzYWJsZSBwb3J0IDAgc3VjY2VzIDogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOwoJCX0gZWxzZSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGUgcG9ydCAwIGZhaWxlZCBhZnRlcjogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOwoJCX0KCX0KCiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkvL0RCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGluZyBXRFMgUG9ydHNcbiIgKTsKCS8vd2xfZGlzYWJsZV93ZHNfcG9ydHMoIGxwICk7CiNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCgovLzs/d2hhdCB3YXMgdGhlIHB1cnBvc2Ugb2YgdGhpcwovLyAJLyogbG9hZCB0aGUgYXBwcm9wcmlhdGUgZmlybXdhcmUgaW1hZ2UsIGRlcGVuZGluZyBvbiBkcml2ZXIgbW9kZSAqLwovLyAJbHAtPmx0dlJlY29yZC5sZW4gICA9ICggc2l6ZW9mKCBDRkdfUkFOR0UyMF9TVFJDVCApIC8gc2l6ZW9mKCBoY2ZfMTYgKSkgLSAxOwovLyAJbHAtPmx0dlJlY29yZC50eXAgICA9IENGR19EUlZfQUNUX1JBTkdFU19QUkk7Ci8vIAloY2ZfZ2V0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKI2lmIEJJTl9ETAoJaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgewptbV9zZWdtZW50X3QJZnM7CmludAkJICAgIAlmaWxlX2Rlc2M7CmludCAJCQlyYzsKCgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRi9XIGltYWdlOiVzOlxuIiwgbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lICk7CgkJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KCQlmcyA9IGdldF9mcyggKTsKCQlzZXRfZnMoIGdldF9kcyggKSk7CgkJZmlsZV9kZXNjID0gb3BlbiggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCBPX1JET05MWSwgMCApOwoJCWlmICggZmlsZV9kZXNjID09IC0xICkgewoJCQlEQkdfRVJST1IoIERiZ0luZm8sICJObyBpbWFnZSBmaWxlIGZvdW5kXG4iICk7CgkJfSBlbHNlIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKI2RlZmluZSBESEZfQUxMT0NfU0laRSA5NjAwMAkJCS8vanVzdCBiZWxvdyA5NkssIGxldCdzIGhvcGUgaXQgc3VmZmljZXMgZm9yIG5vdyBhbmQgZm9yIHRoZSBmdXR1cmUKCQkJY3AgPSAoY2hhciopdm1hbGxvYyggREhGX0FMTE9DX1NJWkUgKTsKCQkJaWYgKCBjcCA9PSBOVUxMICkgewoJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZXJyb3IgaW4gdm1hbGxvY1xuIiApOwoJCQl9IGVsc2UgewoJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsIGNwLCBESEZfQUxMT0NfU0laRSApOwoJCQkJaWYgKCByYyA9PSBESEZfQUxMT0NfU0laRSApIHsKCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJidWZmZXIgdG9vIHNtYWxsLCAlZFxuIiwgREhGX0FMTE9DX1NJWkUgKTsKCQkJCX0gZWxzZSBpZiAoIHJjID4gMCApIHsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJyZWFkIE8uSy46ICVkIGJ5dGVzICAlLjEyc1xuIiwgcmMsIGNwICk7CgkJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsICZjcFtyY10sIDEgKTsKCQkJCQlpZiAoIHJjID09IDAgKSB7IC8vOy9jaGFuZ2UgdG8gYW4gdW50aWwtbG9vcCBhdCByYzw9MAoJCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJubyBtb3JlIHRvIHJlYWRcbiIgKTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIHJjICE9IDAgKSB7CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZmlsZSBub3QgcmVhZCBpbiBvbmUgc3dvb3Agb3Igb3RoZXIgZXJyb3IiXAoJCQkJCQkJCQkJIiwgZ2l2ZSB1cCwgdG9vIGNvbXBsaWNhdGVkLCByYyA9ICUwWFxuIiwgcmMgKTsKCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJzdGlsbCBoYXZlIHRvIGNoYW5nZSBjb2RlIHRvIGdldCBhIHJlYWwgZG93bmxvYWQgbm93ICEhISEhISEhXG4iICk7CgkJCQl9IGVsc2UgewoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgImJlZm9yZSBkaGZfZG93bmxvYWRfYmluYXJ5XG4iICk7CgkJCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9iaW5hcnkoIChtZW1pbWFnZSAqKWNwICk7CgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiYWZ0ZXIgZGhmX2Rvd25sb2FkX2JpbmFyeSwgYmVmb3JlIGRoZl9kb3dubG9hZF9md1xuIiApOwoJCQkJCS8vOz9pbXByb3ZlIGVycm9yIGZsb3cvaGFuZGxpbmcKCQkJCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2Z3KCAmbHAtPmhjZkN0eCwgKG1lbWltYWdlICopY3AgKTsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJhZnRlciBkaGZfZG93bmxvYWRfZndcbiIgKTsKCQkJCX0KCQkJCXZmcmVlKCBjcCApOwoJCQl9CgkJCWNsb3NlKCBmaWxlX2Rlc2MgKTsKCQl9CgkJc2V0X2ZzKCBmcyApOwkJCS8qIFJldHVybiB0byB0aGUgb3JpZ2luYWwgY29udGV4dCAqLwoJfQojZW5kaWYgLy8gQklOX0RMCgoJLyogSWYgZmlybXdhcmUgaXMgcHJlc2VudCBidXQgdGhlIHR5cGUgaXMgdW5rbm93biB0aGVuIGRvd25sb2FkIGFueXdheSAqLwoJaWYgKCAobHAtPmZpcm13YXJlX3ByZXNlbnQgPT0gV0xfRlJJTVdBUkVfUFJFU0VOVCkKCSAgICAgJiYKCSAgICAgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgIT0gQ09NUF9JRF9GV19TVEEgKQoJICAgICAmJgoJICAgICAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSAhPSBDT01QX0lEX0ZXX0FQICkgKSB7CgkJLyogVW5rbm93biB0eXBlLCBkb3dubG9hZCBuZWVkZWQuICAqLwoJCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7Cgl9CgoJaWYobHAtPmZpcm13YXJlX3ByZXNlbnQgPT0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQpCgl7CgkJaWYgKCBjcCA9PSBOVUxMICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEb3dubG9hZGluZyBTVEEgZmlybXdhcmUuLi5cbiIgKTsKLy8JCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2Z3KCAmbHAtPmhjZkN0eCwgJnN0YXRpb24gKTsKCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9mdyggJmxwLT5oY2ZDdHgsICZmd19pbWFnZSApOwoJCX0KCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CgkJCURCR19FUlJPUiggRGJnSW5mbywgIkZpcm13YXJlIERvd25sb2FkIGZhaWxlZFxuIiApOwoJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJcmV0dXJuIGhjZl9zdGF0dXM7CgkJfQoJfQoJLyogUmVwb3J0IHRoZSBGVyB2ZXJzaW9ucyAqLwoJLy87P29ic29sZXRlLCB1c2UgdGhlIGF2YWlsYWJsZSBJRkIgaW5mbzo6IHdsX2dldF9wcmlfcmVjb3JkcyggbHAgKTsKCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJkb3dubG9hZGVkIHN0YXRpb24gRi9XXG4iICk7Cgl9IGVsc2UgaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiZG93bmxvYWRlZCBBUCBGL1dcbiIgKTsKCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAidW5rbm93biBGL1cgdHlwZVxuIiApOwoJfQoKCS8qCiAgICAgICAgICogRG93bmxvYWRlZCwgbm8gbmVlZCB0byByZXBlYXQgdGhpcyBuZXh0IHRpbWUsIGFzc3VtZSB0aGUKICAgICAgICAgKiBjb250ZW50cyBzdGF5cyBpbiB0aGUgY2FyZCB1bnRpbCBpdCBpcyBwb3dlcmVkIG9mZi4gTm90ZSB3ZQogICAgICAgICAqIGRvIG5vdCBzd2l0Y2ggZmlybXdhcmUgb24gdGhlIGZseSwgdGhlIGZpcm13YXJlIGlzIGZpeGVkIGluCiAgICAgICAgICogdGhlIGRyaXZlciBmb3Igbm93LgogICAgICAgICAqLwoJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9QUkVTRU5UOwoKCURCR19UUkFDRSggRGJnSW5mbywgIkNvbXBvbmVudElEOiUwNHggdmFyaWFudDolMDR4IG1ham9yOiUwNHggbWlub3I6JTA0eFxuIiwKCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSwKCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZhcmlhbnQgKSwKCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKSwKCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgKSk7CgoJLyogbm93IHdlIHdpbCBnZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkICovCglscC0+bHR2UmVjb3JkLmxlbiA9IDQ7CglpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19OSUNfTUFDX0FERFI7Cgl9IGVsc2UKCXsKCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX01BQ19BRERSOwoJfQoJaGNmX3N0YXR1cyA9IGhjZl9nZXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CglpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJldHJpZXZlIE1BQyBhZGRyZXNzXG4iICk7CgkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJcmV0dXJuIGhjZl9zdGF0dXM7Cgl9CgltZW1jcHkoIGxwLT5NQUNBZGRyZXNzLCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBFVEhfQUxFTiApOwoJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FyZCBNQUMgQWRkcmVzczogJXNcbiIsIERiZ0h3QWRkciggbHAtPk1BQ0FkZHJlc3MgKSk7CgoJLyogV3JpdGUgb3V0IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRldmljZSwgZW5hYmxlLCBhbmQgcmVjb25uZWN0LiBIb3dldmVyLAoJICAgb25seSByZWNvbm5lY3QgaWYgaW4gQVAgbW9kZS4gRm9yIFNUQSBtb2RlLCBuZWVkIHRvIHdhaXQgZm9yIHBhc3NpdmUgc2NhbgoJICAgY29tcGxldGlvbiBiZWZvcmUgYSBjb25uZWN0IGNhbiBiZSBpc3N1ZWQgKi8KCXdsX3B1dF9sdHYoIGxwICk7CgkvKiBFbmFibGUgdGhlIHBvcnRzICovCgloY2Zfc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOwoKCWlmICggbHAtPkRvd25sb2FkRmlybXdhcmUgPT0gV1ZMQU5fRFJWX01PREVfQVAgKSB7CiNpZmRlZiBVU0VfV0RTCgkJd2xfZW5hYmxlX3dkc19wb3J0cyggbHAgKTsKI2VuZGlmIC8vIFVTRV9XRFMKCQloY2Zfc3RhdHVzID0gd2xfY29ubmVjdCggbHAgKTsKCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGhjZl9zdGF0dXM7Cn0gLy8gd2xfZ28KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zZXRfd2VwX2tleXMoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgV3JpdGUgVHhLZXlJRCBhbmQgV0VQIGtleXMgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20KICogIHdsX2FwcGx5KCkgdG8gYWxsb3cgZHluYW1pYyBXRVAga2V5IHVwZGF0ZXMgdGhyb3VnaCB0aGUgd2lyZWxlc3MKICogIGV4dGVuc2lvbnMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3NldF93ZXBfa2V5cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGNvdW50ID0gMDsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfc2V0X3dlcF9rZXlzIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CglEQkdfUEFSQU0oIERiZ0luZm8sICJscCIsICIlcyAoMHglcCkiLCBscC0+ZGV2LT5uYW1lLCBscCApOwoJaWYgKCBscC0+RW5hYmxlRW5jcnlwdGlvbiApIHsKCQkvKiBOT1RFOiBDRkdfQ05GX0VOQ1JZUFRJT04gaXMgc2V0IGluIHdsX3B1dF9sdHYoKSBhcyBpdCdzIGEgc3RhdGljCgkJCQkgUklEICovCgoJCS8qIHNldCBUeEtleUlEICovCgkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX0tFWV9JRDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKGxwLT5UcmFuc21pdEtleUlEIC0gMSk7CgoJCWhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCURCR19UUkFDRSggRGJnSW5mbywgIktleSAxIGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbMF0ubGVuICk7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiS2V5IDIgbGVuOiAlZFxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVsxXS5sZW4gKTsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJLZXkgMyBsZW46ICVkXG4iLCBscC0+RGVmYXVsdEtleXMua2V5WzJdLmxlbiApOwoJCURCR19UUkFDRSggRGJnSW5mbywgIktleSA0IGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbM10ubGVuICk7CgoJCS8qIHdyaXRlIGtleXMgKi8KCQlscC0+RGVmYXVsdEtleXMubGVuID0gc2l6ZW9mKCBscC0+RGVmYXVsdEtleXMgKSAvIHNpemVvZiggaGNmXzE2ICkgLSAxOwoJCWxwLT5EZWZhdWx0S2V5cy50eXAgPSBDRkdfREVGQVVMVF9LRVlTOwoKCQkvKiBlbmRpYW4gdHJhbnNsYXRlIHRoZSBhcHByb3ByaWF0ZSBrZXkgaW5mb3JtYXRpb24gKi8KCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBNQVhfS0VZUzsgY291bnQrKyApIHsKCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtjb3VudF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiApOwoJCX0KCgkJaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPkRlZmF1bHRLZXlzICkpOwoKCQkvKiBSZXZlcnNlIHRoZSBhYm92ZSBlbmRpYW4gdHJhbnNsYXRpb24sIHNpbmNlIHRoZXNlIGtleXMgYXJlIGFjY2Vzc2VkCgkJICAgZWxzZXdoZXJlICovCgkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTUFYX0tFWVM7IGNvdW50KysgKSB7CgkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RGVmYXVsdEtleXMua2V5W2NvdW50XS5sZW4gKTsKCQl9CgoJCURCR19OT1RJQ0UoIERiZ0luZm8sICJlbmNyeXB0OiAlZCwgSUQ6ICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiwgbHAtPlRyYW5zbWl0S2V5SUQgKTsKCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAic2V0IGtleTogJXMoJWQpIFslZF1cbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbbHAtPlRyYW5zbWl0S2V5SUQtMV0ua2V5LCBscC0+RGVmYXVsdEtleXMua2V5W2xwLT5UcmFuc21pdEtleUlELTFdLmxlbiwgbHAtPlRyYW5zbWl0S2V5SUQtMSApOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwp9IC8vIHdsX3NldF93ZXBfa2V5cwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FwcGx5KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFdyaXRlIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBhZGFwdGVyLiAocmUtKWVuYWJsZXMgdGhlIGNhcmQgaWYgZGV2aWNlIGlzCiAqICBvcGVuLiBSZXR1cm5zIGhjZl9zdGF0dXMgb2YgaGNmX2VuYWJsZSgpLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FwcGx5KHN0cnVjdCB3bF9wcml2YXRlICpscCkKewoJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfYXBwbHkiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCURCR19BU1NFUlQoIGxwICE9IE5VTEwpOwoJREJHX1BBUkFNKCBEYmdJbmZvLCAibHAiLCAiJXMgKDB4JXApIiwgbHAtPmRldi0+bmFtZSwgbHAgKTsKCglpZiAoICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgkJLyogVGhlIGFkYXB0ZXIgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQ6CgkJCQlkaXNhYmxlIGNhcmQKCQkJCXJlbG9hZCBwYXJhbWV0ZXJzCgkJCQllbmFibGUgY2FyZAoJCSovCgoJCWlmICggd2xfYWRhcHRlcl9pc19vcGVuKCBscC0+ZGV2ICkpIHsKCQkJLyogRGlzY29ubmVjdCBhbmQgZGlzYWJsZSBpZiBuZWNlc3NhcnkgKi8KCQkJaGNmX3N0YXR1cyA9IHdsX2Rpc2Nvbm5lY3QoIGxwICk7CgkJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkRpc2Nvbm5lY3QgZmFpbGVkXG4iICk7CgkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQloY2Zfc3RhdHVzID0gd2xfZGlzYWJsZSggbHAgKTsKCQkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewoJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRGlzYWJsZSBmYWlsZWRcbiIgKTsKCQkJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCQkJcmV0dXJuIC0xOwoJCQl9IGVsc2UgewoJCQkJLyogV3JpdGUgb3V0IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRldmljZSwgZW5hYmxlLCBhbmQgcmVjb25uZWN0LgoJCQkJICAgSG93ZXZlciwgb25seSByZWNvbm5lY3QgaWYgaW4gQVAgbW9kZS4gRm9yIFNUQSBtb2RlLCBuZWVkIHRvCgkJCQkgICB3YWl0IGZvciBwYXNzaXZlIHNjYW4gY29tcGxldGlvbiBiZWZvcmUgYSBjb25uZWN0IGNhbiBiZQoJCQkJICAgaXNzdWVkICovCgkJCQloY2Zfc3RhdHVzID0gd2xfcHV0X2x0diggbHAgKTsKCgkJCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCQkJaGNmX3N0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKCgkJCQkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CgkJCQkJCWhjZl9zdGF0dXMgPSB3bF9jb25uZWN0KCBscCApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJ3bF9wdXRfbHR2KCkgZmFpbGVkXG4iICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gaGNmX3N0YXR1czsKfSAvLyB3bF9hcHBseQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3B1dF9sdHZfaW5pdCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHNldCBiYXNpYyBwYXJhbWV0ZXJzIGZvciBjYXJkIGluaXRpYWxpemF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3B1dF9sdHZfaW5pdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGk7CglpbnQgaGNmX3N0YXR1czsKCUNGR19SSURfTE9HX1NUUkNUICpSaWRMb2c7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglEQkdfRlVOQyggIndsX3B1dF9sdHZfaW5pdCIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoJaWYgKCBscCA9PSBOVUxMICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgImxwIHBvaW50ZXIgaXMgTlVMTFxuIiApOwoJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCXJldHVybiAtMTsKCX0KCS8qIERNQS9JTyAqLwoJbHAtPmx0dlJlY29yZC5sZW4gPSAyOwoJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05UTF9PUFQ7CgoJLyogVGhlIENhcmQgU2VydmljZXMgYnVpbGQgbXVzdCBBTFdBWVMgY29uZmlndXJlIGZvciAxNi1iaXQgSS9PLiBQQ0kgb3IKCSAgIENhcmRCdXMgY2FuIGJlIHNldCB0byBlaXRoZXIgMTYvMzIgYml0IEkvTywgb3IgQnVzIE1hc3RlciBETUEsIGJ1dCBvbmx5CgkgICBmb3IgSGVybWVzLTIuNSAqLwojaWZkZWYgQlVTX1BDTUNJQQoJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBVU0VfMTZCSVQgKTsKI2Vsc2UKCWlmICggbHAtPnVzZV9kbWEgKSB7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBVU0VfRE1BICk7Cgl9IGVsc2UgewoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOwoJfQoKI2VuZGlmCgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTlRMX09QVCAgICAgICAgICAgICAgICAgICAgICA6IDB4JTA0eFxuIiwKCQkJICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwoJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NOVExfT1BUIHJlc3VsdCAgICAgICAgICAgICAgIDogMHglMDR4XG4iLAoJCQkgICBoY2Zfc3RhdHVzICk7CgoJLyogUmVnaXN0ZXIgdGhlIGxpc3Qgb2YgUklEcyBvbiB3aGljaCBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIGlzCgkgICByZXF1aXJlZC4gTm90ZSB0aGF0IHRoaXMgbWVjaGFuaXNtIHJlcGxhY2VzIHRoZSBtYWlsYm94LCBzbyB0aGUgbWFpbGJveAoJICAgY2FuIGJlIHF1ZXJpZWQgYnkgdGhlIGhvc3QgKGlmIGRlc2lyZWQpIHdpdGhvdXQgY29udGVudGlvbiBmcm9tIHVzICovCglpPTA7CgoJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IHNpemVvZiggbHAtPlByb2JlUmVzcCApOwoJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IENGR19BQ1NfU0NBTjsKCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5Qcm9iZVJlc3A7CgkvL2xwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgPSAweEZGRkY7CglpKys7CgoJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IHNpemVvZiggbHAtPmFzc29jX3N0YXQgKTsKCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfQVNTT0NfU1RBVDsKCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5hc3NvY19zdGF0OwoJbHAtPmFzc29jX3N0YXQubGVuICAgICA9IDB4RkZGRjsKCWkrKzsKCglscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gNDsKCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfVVBEQVRFRF9JTkZPX1JFQ09SRDsKCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT51cGRhdGVkUmVjb3JkOwoJbHAtPnVwZGF0ZWRSZWNvcmQubGVuICA9IDB4RkZGRjsKCWkrKzsKCglscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gc2l6ZW9mKCBscC0+c2VjX3N0YXQgKTsKCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfU0VDVVJJVFlfU1RBVDsKCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5zZWNfc3RhdDsKCWxwLT5zZWNfc3RhdC5sZW4gICAgICAgPSAweEZGRkY7CglpKys7CgoJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IDA7ICAgIC8vIFRlcm1pbmF0ZSBMaXN0CgoJUmlkTG9nID0gKENGR19SSURfTE9HX1NUUkNUICopJmxwLT5sdHZSZWNvcmQ7CglSaWRMb2ctPmxlbiAgICAgPSAzOwoJUmlkTG9nLT50eXAgICAgID0gQ0ZHX1JFR19JTkZPX0xPRzsKCVJpZExvZy0+cmVjb3JkcCA9IChSSURfTE9HUCkmbHAtPlJpZExpc3RbMF07CgoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUkVHX0lORk9fTE9HXG4iICk7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUkVHX0lORk9fTE9HIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCgkJCSAgIGhjZl9zdGF0dXMgKTsKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGhjZl9zdGF0dXM7Cn0gLy8gd2xfcHV0X2x0dl9pbml0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcHV0X2x0digpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIGJ5IHd2bGFuX2FwcGx5KCkgYW5kIHd2bGFuX2dvIHRvIHNldCB0aGUgY2FyZCdzIGNvbmZpZ3VyYXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcHV0X2x0diggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGxlbjsKCWludCBoY2Zfc3RhdHVzOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJREJHX0ZVTkMoICJ3bF9wdXRfbHR2IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYgKCBscCA9PSBOVUxMICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgImxwIHBvaW50ZXIgaXMgTlVMTFxuIiApOwoJCXJldHVybiAtMTsKCX0KCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgewoJCWxwLT5tYXhQb3J0ID0gNjsJCQkvLzs/d2h5IHNldCB0aGlzIGhlcmUgYW5kIG5vdCBhcyBwYXJ0IG9mIGRvd25sb2FkIHByb2Nlc3MKCX0gZWxzZSB7CgkJbHAtPm1heFBvcnQgPSAwOwoJfQoKCS8qIFNlbmQgb3VyIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGNhcmQuIFBlcmZvcm0gYW55IGVuZGlhbiB0cmFuc2xhdGlvbgoJICAgbmVjZXNzYXJ5ICovCgkvKiBSZWdpc3RlciB0aGUgTWFpbGJveDsgVnhXb3JrcyBkb2VzIHRoaXMgZWxzZXdoZXJlOyB3aHk7PyAqLwoJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSA0OwoJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUkVHX01COwoJbHAtPmx0dlJlY29yZC51LnUzMlswXSAgPSAodV9sb25nKSYoIGxwLT5tYWlsYm94ICk7CglscC0+bHR2UmVjb3JkLnUudTE2WzJdICA9ICggTUJfU0laRSAvIHNpemVvZiggaGNmXzE2ICkpOwoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJLyogTWF4IERhdGEgTGVuZ3RoICovCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUFYX0RBVEFfTEVOOwoJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggSENGX01BWF9QQUNLRVRfU0laRSApOwoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJLyogU3lzdGVtIFNjYWxlIC8gRGlzdGFuY2UgYmV0d2VlbiBBUHMgKi8KCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9TWVNURU1fU0NBTEU7CglscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RGlzdGFuY2VCZXR3ZWVuQVBzICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBDaGFubmVsICovCglpZiAoIGxwLT5DcmVhdGVJQlNTICYmICggbHAtPkNoYW5uZWwgPT0gMCApKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ3JlYXRlIElCU1MiICk7CgkJbHAtPkNoYW5uZWwgPSAxMDsKCX0KCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fQ0hBTk5FTDsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5DaGFubmVsICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBNaWNyb3dhdmUgUm9idXN0bmVzcyAqLwoJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01JQ1JPX1dBVkU7CglscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TWljcm93YXZlUm9idXN0bmVzcyApOwoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJLyogTG9hZCBCYWxhbmNpbmcgKi8KCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sb2FkQmFsYW5jaW5nICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBNZWRpdW0gRGlzdHJpYnV0aW9uICovCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5tZWRpdW1EaXN0cmlidXRpb24gKTsKCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoJLyogQ291bnRyeSBDb2RlICovCgojaWZkZWYgV0FSUAoJLyogVHggUG93ZXIgTGV2ZWwgKGZvciBzdXBwb3J0ZWQgY2FyZHMpICovCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfVFhfUE9XX0xWTDsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT50eFBvd0xldmVsICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBTaG9ydCBSZXRyeSBMaW1pdCAqLwoJLypscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkMzMjsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5zaG9ydFJldHJ5TGltaXQgKTsKCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoJKi8KCgkvKiBMb25nIFJldHJ5IExpbWl0ICovCgkvKmxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gMHhGQzMzOwoJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmxvbmdSZXRyeUxpbWl0ICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCSovCgoJLyogU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wgKi8KCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOyAvLzB4RkM4ODsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5zcnNjWzBdICk7CglscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+c3JzY1sxXSApOwoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJLyogQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAqLwoJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOwoJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTDsgLy8weEZDODk7CglscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YnJzY1swXSApOwoJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmJyc2NbMV0gKTsKCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCS8qIEZyYW1lIEJ1cnN0IExpbWl0ICovCgkvKiBEZWZpbmVkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgaW4gRmlybXdhcmUgKi8KCiNlbmRpZiAvLyBXQVJQCgojaWZkZWYgV0FSUAoJLyogTXVsdGljYXN0IFJhdGUgKi8KCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQ0FTVF9SQVRFOwoJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJhdGVbMF0gKTsKCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSYXRlWzFdICk7CiNlbHNlCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUkFURTsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSYXRlWzBdICk7CiNlbmRpZiAvLyBXQVJQCgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBPd24gTmFtZSAoU3RhdGlvbiBOaWNrbmFtZSkgKi8KCWlmICgoIGxlbiA9ICggc3RybGVuKCBscC0+U3RhdGlvbk5hbWUgKSArIDEgKSAmIH4weDAxICkgIT0gMCApIHsKCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX05BTUUgICAgICAgICAgICAgICAgICA6ICVzXG4iLAoJCS8vICAgICAgICAgICBscC0+U3RhdGlvbk5hbWUgKTsKCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyICsgKCBsZW4gLyBzaXplb2YoIGhjZl8xNiApKTsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX05BTUU7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggc3RybGVuKCBscC0+U3RhdGlvbk5hbWUgKSk7CgoJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzJdICksIGxwLT5TdGF0aW9uTmFtZSwgbGVuICk7Cgl9IGVsc2UgewoJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSAgICAgICAgICAgICAgICAgIDogRU1QVFlcbiIgKTsKCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fTkFNRTsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7Cgl9CgoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9OQU1FIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCgkvLyAgICAgICAgICAgaGNmX3N0YXR1cyApOwoKCS8qIFRoZSBmb2xsb3dpbmcgYXJlIHNldCBpbiBTVEEgbW9kZSBvbmx5ICovCglpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CgoJCS8qIFJUUyBUaHJlc2hvbGQgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlJUU1RocmVzaG9sZCApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBQb3J0IFR5cGUgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1BPUlRfVFlQRTsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UG9ydFR5cGUgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogVHggUmF0ZSBDb250cm9sICovCiNpZmRlZiBXQVJQCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CiNlbHNlCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOwojZW5kaWYgIC8vIFdBUlAKCi8vOz9za2lwIHRlbXBvcmFyaWx5IHRvIHNlZSB3aGV0aGVyIHRoZSBSSUQgb3Igc29tZXRoaW5nIGVsc2UgaXMgdGhlIHByb2JlbG0gaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19UWF9SQVRFX0NOVEwgMi40R0h6ICAgICAgICAgICA6IDB4JTA0eFxuIiwKCQkJCSAgIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1RYX1JBVEVfQ05UTCA1LjBHSHogICAgICAgICAgIDogMHglMDR4XG4iLAoJCQkJICAgbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVFhfUkFURV9DTlRMIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCgkJCQkgICBoY2Zfc3RhdHVzICk7CgkJLyogUG93ZXIgTWFuYWdlbWVudCAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUE1fRU5BQkxFRDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UE1FbmFibGVkICk7Ci8vCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDgwMDEgKTsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX1BNX0VOQUJMRUQgICAgICAgICAgICAgICAgOiAweCUwNHhcbiIsIGxwLT5QTUVuYWJsZWQgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCQkvKiBNdWx0aWNhc3QgUmVjZWl2ZSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUlg7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJlY2VpdmUgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogTWF4IFNsZWVwIER1cmF0aW9uICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT047CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk1heFNsZWVwRHVyYXRpb24gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogQ3JlYXRlIElCU1MgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ1JFQVRFX0lCU1M7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkNyZWF0ZUlCU1MgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogRGVzaXJlZCBTU0lEICovCgkJaWYgKCgoIGxlbiA9ICggc3RybGVuKCBscC0+TmV0d29ya05hbWUgKSArIDEgKSAmIH4weDAxICkgIT0gMCApICYmCgkJCSAoIHN0cmNtcCggbHAtPk5ldHdvcmtOYW1lLCAiQU5ZIiApICE9IDAgKSAmJgoJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgImFueSIgKSAhPSAwICkpIHsKCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKCQkJLy8gICAgICAgICAgIGxwLT5OZXR3b3JrTmFtZSApOwoKCQkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyICsgKGxlbiAvIHNpemVvZihoY2ZfMTYpKTsKCQkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfREVTSVJFRF9TU0lEOwoJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApKTsKCgkJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzJdICksIGxwLT5OZXR3b3JrTmFtZSwgbGVuICk7CgkJfSBlbHNlIHsKCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgOiBBTllcbiIgKTsKCgkJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfREVTSVJFRF9TU0lEOwoJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CgkJfQoKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCgkJLy8gICAgICAgICAgIGhjZl9zdGF0dXMgKTsKCQkvKiBPd24gQVRJTSB3aW5kb3cgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YXRpbVdpbmRvdyApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCgkJLyogSG9sZG92ZXIgRHVyYXRpb24gKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5ob2xkb3ZlckR1cmF0aW9uICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+cHJvbWlzY3VvdXNNb2RlICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIEF1dGhlbnRpY2F0aW9uICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9BVVRIRU5USUNBVElPTjsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YXV0aGVudGljYXRpb24gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKI2lmZGVmIFdBUlAKCQkvKiBDb25uZWN0aW9uIENvbnRyb2wgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Y29ubmVjdGlvbkNvbnRyb2wgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgoKCQkvKiBQcm9iZSBkYXRhIHJhdGUgKi8KCQkvKmxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9CRV9EQVRBX1JBVEU7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnByb2JlRGF0YVJhdGVzWzBdICk7CgkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnByb2JlRGF0YVJhdGVzWzFdICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgMi40R0h6ICAgICAgICA6IDB4JTA0eFxuIiwKCQkJCSAgIGxwLT5wcm9iZURhdGFSYXRlc1swXSApOwoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgNS4wR0h6ICAgICAgICA6IDB4JTA0eFxuIiwKCQkJCSAgIGxwLT5wcm9iZURhdGFSYXRlc1sxXSApOwoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgcmVzdWx0ICAgICAgICA6IDB4JTA0eFxuIiwKCQkJCSAgIGhjZl9zdGF0dXMgKTsqLwojZW5kaWYgLy8gV0FSUAoJfSBlbHNlIHsKCQkvKiBUaGUgZm9sbG93aW5nIGFyZSBzZXQgaW4gQVAgbW9kZSBvbmx5ICovCiNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CgoJCS8qIERUSU0gUGVyaW9kICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkRUSU1QZXJpb2QgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogTXVsdGljYXN0IFBNIEJ1ZmZlcmluZyAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUE1fQlVGOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBSZWplY3QgQU5ZIC0gQ2xvc2VkIFN5c3RlbSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUkVKRUNUX0FOWTsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UmVqZWN0QW55ICk7CgoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBFeGNsdWRlIFVuZW5jcnlwdGVkICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9FWENMX1VORU5DUllQVEVEOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgKTsKCgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIEludHJhQlNTIFJlbGF5ICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmludHJhQlNTUmVsYXkgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogUlRTIFRocmVzaG9sZCAwICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIMDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UlRTVGhyZXNob2xkICk7CgoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBUeCBSYXRlIENvbnRyb2wgMCAqLwojaWZkZWYgV0FSUAoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwwOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CgkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKI2Vsc2UKCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOwojZW5kaWYgIC8vIFdBUlAKCgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIE93biBCZWFjb24gSW50ZXJ2YWwgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSAweEZDMzE7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPm93bkJlYWNvbkludGVydmFsICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIENvLUV4aXN0ZW5jZSBCZWhhdmlvciAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkNDNzsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Y29leGlzdGVuY2UgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCiNpZmRlZiBVU0VfV0RTCgoJCS8qIFJUUyBUaHJlc2hvbGQgMSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDE7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBSVFMgVGhyZXNob2xkIDIgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkgyOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgoJCS8qIFJUUyBUaHJlc2hvbGQgMyAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDM7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCgkJLyogUlRTIFRocmVzaG9sZCA0ICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJINDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbM10ucnRzVGhyZXNob2xkICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoKCQkvKiBSVFMgVGhyZXNob2xkIDUgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg1OwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogUlRTIFRocmVzaG9sZCA2ICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJINjsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiNpZiAwCgkJLyogVFggUmF0ZSBDb250cm9sIDEgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMTsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMF0udHhSYXRlQ250bCApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBUWCBSYXRlIENvbnRyb2wgMiAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwyOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIFRYIFJhdGUgQ29udHJvbCAzICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDM7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogVFggUmF0ZSBDb250cm9sIDQgKi8KCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMNDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbM10udHhSYXRlQ250bCApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKCQkvKiBUWCBSYXRlIENvbnRyb2wgNSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw1OwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsICk7CgkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJCS8qIFRYIFJhdGUgQ29udHJvbCA2ICovCgkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDY7CgkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCiNlbmRpZgoKCQkvKiBXRFMgYWRkcmVzc2VzLiAgSXQncyBva2F5IHRvIGJsaW5kbHkgc2VuZCB0aGVzZSBwYXJhbWV0ZXJzLCBiZWNhdXNlCgkJICAgdGhlIHBvcnQgbmVlZHMgdG8gYmUgZW5hYmxlZCwgYmVmb3JlIGFueXRoaW5nIGlzIGRvbmUgd2l0aCBpdC4gKi8KCgkJLyogV0RTIEFkZHJlc3MgMSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMTsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogV0RTIEFkZHJlc3MgMiAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMjsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogV0RTIEFkZHJlc3MgMyAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMzsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogV0RTIEFkZHJlc3MgNCAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNDsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogV0RTIEFkZHJlc3MgNSAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNTsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkJLyogV0RTIEFkZHJlc3MgNiAqLwoJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNjsKCgkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKI2VuZGlmICAvKiBVU0VfV0RTICovCiNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCgl9CgoJLyogT3duIE1BQyBBZGRyZXNzICovCgkvL0RCR19UUkFDRSggRGJnSW5mbywgIk1BQyBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICA6ICVzXG4iLAoJLy8gICAgICAgICAgIERiZ0h3QWRkciggbHAtPk1BQ0FkZHJlc3MgKSk7CgoJaWYgKCBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggbHAtPk1BQ0FkZHJlc3MgKSkgewoJCS8qIE1ha2UgdGhlIE1BQyBhZGRyZXNzIHZhbGlkIGJ5OgoJCQkJQ2xlYXJpbmcgdGhlIG11bHRpY2FzdCBiaXQKCQkJCVNldHRpbmcgdGhlIGxvY2FsIE1BQyBhZGRyZXNzIGJpdAoJCSovCgkJLy9scC0+TUFDQWRkcmVzc1swXSAmPSB+MHgwMzsgIC8vOz93aHkgaXMgdGhpcyBjb21tZW50ZWQgb3V0IGFscmVhZHkgaW4gNzIwCgkJLy9scC0+TUFDQWRkcmVzc1swXSB8PSAweDAyOwoKCQlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIEVUSF9BTEVOIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CgkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CgkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX05JQ19NQUNfQUREUlxuIiApOwoJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19OSUNfTUFDX0FERFI7CgkJfSBlbHNlIHsKCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9NQUNfQUREUlxuIiApOwoJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX01BQ19BRERSOwoJCX0KCQkvKiBNQUMgYWRkcmVzcyBpcyBieXRlIGFsaWduZWQsIG5vIGVuZGlhbiBjb252ZXJzaW9uIG5lZWRlZCAqLwoJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzBdICksIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOwoJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1hYWF9NQUNfQUREUiByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAoJCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CgoJCS8qIFVwZGF0ZSB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIG5ldGRldmljZSBzdHJ1Y3QgKi8KCQltZW1jcHkoIGxwLT5kZXYtPmRldl9hZGRyLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsgLy87P3doYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWVtaW5nbHkgY29tcGxleCBsb2dpYwoJfQoJLyogT3duIFNTSUQgKi8KCWlmICgoKCBsZW4gPSAoIHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICkgKyAxICkgJiB+MHgwMSApICE9IDAgKSAmJgoJCQkJICggc3RyY21wKCBscC0+TmV0d29ya05hbWUsICJBTlkiICkgIT0gMCApICYmCgkJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgImFueSIgKSAhPSAwICkpIHsKCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX1NTSUQgICAgICAgICAgICAgICAgICA6ICVzXG4iLAoJCS8vICAgICAgICAgICBscC0+TmV0d29ya05hbWUgKTsKCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDIgKyAobGVuIC8gc2l6ZW9mKGhjZl8xNikpOwoJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fU1NJRDsKCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApKTsKCgkJbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbMl0gKSwgbHAtPk5ldHdvcmtOYW1lLCBsZW4gKTsKCX0gZWxzZSB7CgkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9TU0lEICAgICAgICAgICAgICAgICAgOiBBTllcbiIgKTsKCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CgkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9TU0lEOwoJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKCX0KCgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX1NTSUQgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CgkvKiBlbmFibGUvZGlzYWJsZSBlbmNyeXB0aW9uICovCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfRU5DUllQVElPTjsKCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5FbmFibGVFbmNyeXB0aW9uICk7CgloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCgkvKiBTZXQgdGhlIEF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IFN1aXRlICovCglscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CglscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TRVRfV1BBX0FVVEhfS0VZX01HTVRfU1VJVEU7CglscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+QXV0aEtleU1nbXRTdWl0ZSApOwoJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgkvKiBXRVAgS2V5cyAqLwoJd2xfc2V0X3dlcF9rZXlzKCBscCApOwoKCS8qIENvdW50cnkgQ29kZSAqLwoJLyogY291bnRyeUluZm8sIGx0dkNvdW50cnlJbmZvLCBDRkdfQ05GX0NPVU5UUllfSU5GTyAqLwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGhjZl9zdGF0dXM7Cn0gLy8gd2xfcHV0X2x0dgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCWluaXRfbW9kdWxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIExvYWQgdGhlIGtlcm5lbCBtb2R1bGUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBhbiBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludCBfX2luaXQgd2xfbW9kdWxlX2luaXQoIHZvaWQgKQp7CglpbnQgcmVzdWx0OwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAid2xfbW9kdWxlX2luaXQiICk7CgojaWYgREJHCgkvKiBDb252ZXJ0ICJzdGFuZGFyZCIgUENNQ0lBIHBhcmFtZXRlciBwY19kZWJ1ZyB0byBhIHJlYXNvbmFibGUgRGVidWdGbGFnIHZhbHVlLgoJICogTk9URTogVGhlIHZhbHVlcyBhbGwgZmFsbCB0aHJvdWdoIHRvIHRoZSBsb3dlciB2YWx1ZXMuICovCglEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSAwOwoJRGJnSW5mby0+RGVidWdGbGFnID0gREJHX1RSQUNFX09OOwkJLy87P2dldCB0aGlzIG1lc3MgcmVzb2x2ZWQgb25lIGRheQoJaWYgKCBwY19kZWJ1ZyApIHN3aXRjaCggcGNfZGVidWcgKSB7CgkgIGNhc2UgODoKCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX0RTX09OOwoJICBjYXNlIDc6CgkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19SWF9PTiB8IERCR19UWF9PTjsKCSAgY2FzZSA2OgoJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfUEFSQU1fT047CgkgIGNhc2UgNToKCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX1RSQUNFX09OOwoJICBjYXNlIDQ6CgkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19WRVJCT1NFX09OOwoJICBjYXNlIDE6CgkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19ERUZBVUxUUzsKCSAgZGVmYXVsdDoKCQlicmVhazsKCX0KI2VuZGlmIC8qIERCRyAqLwoKCURCR19FTlRFUiggRGJnSW5mbyApOwoJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIFZFUlNJT05fSU5GTyk7CiAgICAJcHJpbnRrKEtFUk5fSU5GTyAiKioqIE1vZGlmaWVkIGZvciBrZXJuZWwgMi42IGJ5IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+XG4iKTsKICAgICAgICBwcmludGsoS0VSTl9JTkZPICIqKiogQmFzZWQgb24gNy4xOCB2ZXJzaW9uIGJ5IEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAkUmV2aXNpb246IDM5ICRcbiIpOwoKCi8vIDs/I2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAovLyAJREJHX1BSSU5UKCAiQWNjZXNzIFBvaW50IE1vZGUgKEFQKSBTdXBwb3J0OiBZRVNcbiIgKTsKLy8gI2Vsc2UKLy8gCURCR19QUklOVCggIkFjY2VzcyBQb2ludCBNb2RlIChBUCkgU3VwcG9ydDogTk9cbiIgKTsKLy8gI2VuZGlmIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLwoKCXJlc3VsdCA9IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoICk7CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiByZXN1bHQ7Cn0gLy8gaW5pdF9tb2R1bGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgljbGVhbnVwX21vZHVsZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVbmxvYWQgdGhlIGtlcm5lbCBtb2R1bGUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgX19leGl0IHdsX21vZHVsZV9leGl0KCB2b2lkICkKewoJREJHX0ZVTkMoICJ3bF9tb2R1bGVfZXhpdCIgKTsKCURCR19FTlRFUihEYmdJbmZvKTsKCgl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCApOwojaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLwoJcmVtb3ZlX3Byb2NfZW50cnkoICJ3bGFncyIsIE5VTEwgKTsJCS8vOz93aHkgc28gYS1zeW1tZXRyaWMgY29tcGFyZWQgdG8gbG9jYXRpb24gb2YgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeQojZW5kaWYKCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybjsKfSAvLyBjbGVhbnVwX21vZHVsZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKbW9kdWxlX2luaXQod2xfbW9kdWxlX2luaXQpOwptb2R1bGVfZXhpdCh3bF9tb2R1bGVfZXhpdCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9pc3IoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGlycSAgICAgLSAgIHRoZSBpcnEgdGhlIGludGVycnVwdCBjYW1lIGluIG9uCiAqICAgICAgZGV2X2lkICAtICAgYSBidWZmZXIgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdAogKiAgICAgIHJlZ3MgICAgLQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaXJxcmV0dXJuX3Qgd2xfaXNyKCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzICkKewoJaW50ICAgICAgICAgICAgICAgICBldmVudHM7CglzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOwoJc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSBOVUxMOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJaWYgKCggZGV2ID09IE5VTEwgKSB8fCAoICFuZXRpZl9kZXZpY2VfcHJlc2VudCggZGV2ICkpKSB7CgkJcmV0dXJuIElSUV9OT05FOwoJfQoKCS8qIFNldCB0aGUgd2xfcHJpdmF0ZSBwb2ludGVyIChscCksIG5vdyB0aGF0IHdlIGtub3cgdGhhdCBkZXYgaXMgbm9uLW51bGwgKi8KCWxwID0gd2xfcHJpdihkZXYpOwoKI2lmZGVmIFVTRV9SVFMKCWlmICggbHAtPnVzZVJUUyA9PSAxICkgewoJCURCR19QUklOVCggIkVYSVRJTkcgSVNSLCBJTiBSVFMgTU9ERS4uLlxuIiApOwoJCXJldHVybjsKCQl9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKCS8qIElmIHdlIGhhdmUgaW50ZXJydXB0cyBwZW5kaW5nLCB0aGVuIHB1dCB0aGVtIG9uIGEgc3lzdGVtIHRhc2sKCSAgIHF1ZXVlLiBPdGhlcndpc2UgdHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gKi8KCWV2ZW50cyA9IGhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PRkYgKTsKCglpZiAoIGV2ZW50cyA9PSBIQ0ZfSU5UX1BFTkRJTkcgKSB7CgkJLyogU2NoZWR1bGUgdGhlIElTUiBoYW5kbGVyIGFzIGEgYm90dG9tLWhhbGYgdGFzayBpbiB0aGUKCQkgICB0cV9pbW1lZGlhdGUgcXVldWUgKi8KCQl0YXNrbGV0X3NjaGVkdWxlKCZscC0+dGFzayk7Cgl9IGVsc2UgewoJCS8vREJHX1BSSU5UKCAiTk9UIE9VUiBJTlRFUlJVUFRcbiIgKTsKCQloY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT04gKTsKCX0KCglyZXR1cm4gSVJRX1JFVFZBTChldmVudHMgPT0gSENGX0lOVF9QRU5ESU5HKTsKfSAvLyB3bF9pc3IKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9pc3JfaGFuZGxlcigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgSVNSIGhhbmRsZXIsIHNjaGVkdWxlZCB0byBydW4gaW4gYSBkZWZlcnJlZCBjb250ZXh0IGJ5IHRoZSBJU1IuIFRoaXMKICogICAgICBpcyB3aGVyZSB0aGUgSVNSJ3Mgd29yayBhY3R1YWxseSBnZXRzIGRvbmUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBXVkxBTl9NQVhfSU5UX1NFUlZJQ0VTICA1MAoKdm9pZCB3bF9pc3JfaGFuZGxlciggdW5zaWduZWQgbG9uZyBwICkKewoJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwoJYm9vbF90ICAgICAgICAgICAgICAgICAgc3RvcCA9IFRSVUU7CglpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsKCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilwOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCWlmICggbHAgPT0gTlVMTCApIHsKCQlEQkdfUFJJTlQoICJ3bF9pc3JfaGFuZGxlciAgbHAgYWRhcHRlciBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKCX0gZWxzZSB7CgkJd2xfbG9jayggbHAsICZmbGFncyApOwoKCQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilscC0+ZGV2OwoJCWlmICggZGV2ICE9IE5VTEwgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQoIGRldiApICkgc3RvcCA9IEZBTFNFOwoJCWZvciggY291bnQgPSAwOyBzdG9wID09IEZBTFNFICYmIGNvdW50IDwgV1ZMQU5fTUFYX0lOVF9TRVJWSUNFUzsgY291bnQrKyApIHsKCQkJc3RvcCA9IFRSVUU7CgkJCXJlc3VsdCA9IGhjZl9zZXJ2aWNlX25pYyggJmxwLT5oY2ZDdHgsCgkJCQkJCQkJCSAgKHdjaV9idWZwKWxwLT5sb29rQWhlYWRCdWYsCgkJCQkJCQkJCSAgc2l6ZW9mKCBscC0+bG9va0FoZWFkQnVmICkpOwoJCQlpZiAoIHJlc3VsdCA9PSBIQ0ZfRVJSX01JQyApIHsKCQkJCXdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZCggZGV2ICk7IAkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgTUlDIGZhaWxlZCAqLwoJCQkJLy87P3RoaXMgc2VlbXMgd3JvbmcgaWYgSENGX0VSUl9NSUMgY29pbmNpZGVzIHdpdGggYW5vdGhlciBldmVudCwgc3RvcCBnZXRzIEZBTFNFCgkJCQkvL3NvIHdoeSBub3QgZG8gaXQgYWx3YXlzIDs/CgkJCX0KCiNpZm5kZWYgVVNFX01CT1hfU1lOQwoJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX01CSW5mb0xlbiAhPSAwICkgewkvKiBhbnl0aGluZyBpbiB0aGUgbWFpbGJveCAqLwoJCQkJd2xfbWJ4KCBscCApOwoJCQkJc3RvcCA9IEZBTFNFOwoJCQl9CiNlbmRpZgoJCQkvKiBDaGVjayBmb3IgYSBMaW5rIHN0YXR1cyBldmVudCAqLwoJCQlpZiAoICggbHAtPmhjZkN0eC5JRkJfTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXICkgIT0gMCApIHsKCQkJCXdsX3Byb2Nlc3NfbGlua19zdGF0dXMoIGxwICk7CgkJCQlzdG9wID0gRkFMU0U7CgkJCX0KCQkJLyogQ2hlY2sgZm9yIHByb2JlIHJlc3BvbnNlIGV2ZW50cyAqLwoJCQlpZiAoIGxwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgIT0gMCAmJgoJCQkJbHAtPlByb2JlUmVzcC5pbmZvVHlwZSAhPSAweEZGRkYgKSB7CgkJCQl3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCBscCApOwoJCQkJbWVtc2V0KCAmbHAtPlByb2JlUmVzcCwgMCwgc2l6ZW9mKCBscC0+UHJvYmVSZXNwICkpOwoJCQkJbHAtPlByb2JlUmVzcC5pbmZvVHlwZSA9IDB4RkZGRjsKCQkJCXN0b3AgPSBGQUxTRTsKCQkJfQoJCQkvKiBDaGVjayBmb3IgdXBkYXRlZCByZWNvcmQgZXZlbnRzICovCgkJCWlmICggbHAtPnVwZGF0ZWRSZWNvcmQubGVuICE9IDB4RkZGRiApIHsKCQkJCXdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoIGxwICk7CgkJCQlscC0+dXBkYXRlZFJlY29yZC5sZW4gPSAweEZGRkY7CgkJCQlzdG9wID0gRkFMU0U7CgkJCX0KCQkJLyogQ2hlY2sgZm9yIGFzc29jaWF0aW9uIHN0YXR1cyBldmVudHMgKi8KCQkJaWYgKCBscC0+YXNzb2Nfc3RhdC5sZW4gIT0gMHhGRkZGICkgewoJCQkJd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoIGxwICk7CgkJCQlscC0+YXNzb2Nfc3RhdC5sZW4gPSAweEZGRkY7CgkJCQlzdG9wID0gRkFMU0U7CgkJCX0KCQkJLyogQ2hlY2sgZm9yIHNlY3VyaXR5IHN0YXR1cyBldmVudHMgKi8KCQkJaWYgKCBscC0+c2VjX3N0YXQubGVuICE9IDB4RkZGRiApIHsKCQkJCXdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCBscCApOwoJCQkJbHAtPnNlY19zdGF0LmxlbiA9IDB4RkZGRjsKCQkJCXN0b3AgPSBGQUxTRTsKCQkJfQoKI2lmZGVmIEVOQUJMRV9ETUEKCQkJaWYgKCBscC0+dXNlX2RtYSApIHsKCQkJCS8qIENoZWNrIGZvciBETUEgUnggcGFja2V0cyAqLwoJCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9EbWFQYWNrZXRzICYgSFJFR19FVl9SRE1BRCApIHsKCQkJCQl3bF9yeF9kbWEoIGRldiApOwoJCQkJCXN0b3AgPSBGQUxTRTsKCQkJCX0KCQkJCS8qIFJldHVybiBUeCBETUEgZGVzY3JpcHRvcnMgdG8gaG9zdCAqLwoJCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9EbWFQYWNrZXRzICYgSFJFR19FVl9URE1BRCApIHsKCQkJCQl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBscCApOwoJCQkJCXN0b3AgPSBGQUxTRTsKCQkJCX0KCQkJfQoJCQllbHNlCiNlbmRpZiAvLyBFTkFCTEVfRE1BCgkJCXsKCQkJCS8qIENoZWNrIGZvciBSeCBwYWNrZXRzICovCgkJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX1J4TGVuICE9IDAgKSB7CgkJCQkJd2xfcngoIGRldiApOwoJCQkJCXN0b3AgPSBGQUxTRTsKCQkJCX0KCQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHF1ZXVlZCBmcmFtZXMgZ2V0IHNlbnQgKi8KCQkJCWlmICggd2xfc2VuZCggbHAgKSkgewoJCQkJCXN0b3AgPSBGQUxTRTsKCQkJCX0KCQkJfQoJCX0KCQkvKiBXZSdyZSBkb25lLCBzbyB0dXJuIGludGVycnVwdHMgd2hpY2ggd2VyZSB0dXJuZWQgb2ZmIGluIHdsX2lzciwgYmFjayBvbiAqLwoJCWhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PTiApOwoJCXdsX3VubG9jayggbHAsICZmbGFncyApOwoJfQoJcmV0dXJuOwp9IC8vIHdsX2lzcl9oYW5kbGVyCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcmVtb3ZlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIE5vdGlmeSB0aGUgYWRhcHRlciB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQuIFNpbmNlIHRoZSBhZGFwdGVyIGlzIGdvbmUsCiAqICB3ZSBzaG91bGQgbm8gbG9uZ2VyIHRyeSB0byB0YWxrIHRvIGl0LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3JlbW92ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKCXN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwoJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJREJHX0ZVTkMoICJ3bF9yZW1vdmUiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCgl3bF9sb2NrKCBscCwgJmZsYWdzICk7CgoJLyogc3RvcCBoYW5kbGluZyBpbnRlcnJ1cHRzICovCgl3bF9hY3RfaW50X29mZiggbHAgKTsKICAgICAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsKCgkvKgogICAgICAgICAqIERpc2FibGUgdGhlIHBvcnRzOiBqdXN0IGNoYW5nZSBzdGF0ZTogc2luY2UgdGhlCiAgICAgICAgICogY2FyZCBpcyBnb25lIGl0IGlzIHVzZWxlc3MgdG8gdGFsayB0byBpdCBhbmQgYXQKICAgICAgICAgKiBkaXNjb25uZWN0IGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBsb3N0IGFueXdheS4KICAgICAgICAgKi8KCS8qIFJlc2V0IHBvcnRTdGF0ZSAqLwoJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CgojaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAojaWZkZWYgVVNFX1dEUwoJLy93bF9kaXNhYmxlX3dkc19wb3J0cyggbHAgKTsKI2VuZGlmIC8vIFVTRV9XRFMKI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KCgkvKiBNYXJrIHRoZSBkZXZpY2UgYXMgdW5yZWdpc3RlcmVkICovCglscC0+aXNfcmVnaXN0ZXJlZCA9IEZBTFNFOwoKCS8qIERlcmVnaXN0ZXIgdGhlIFdEUyBwb3J0cyBhcyB3ZWxsICovCglXTF9XRFNfTkVUREVWX0RFUkVHSVNURVIoIGxwICk7CiNpZmRlZiBVU0VfUlRTCglpZiAoIGxwLT51c2VSVFMgPT0gMSApIHsKCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCgkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJcmV0dXJuOwoJfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCgkvKiBJbmZvcm0gdGhlIEhDRiB0aGF0IHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQgKi8KCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QgKTsKCgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybjsKfSAvLyB3bF9yZW1vdmUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zdXNwZW5kKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFBvd2VyLWRvd24gYW5kIGhhbHQgdGhlIGFkYXB0ZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfc3VzcGVuZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7Cgl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglEQkdfRlVOQyggIndsX3N1c3BlbmQiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCgkvKiBUaGUgYWRhcHRlciBpcyBzdXNwZW5kZWQ6CgkJCVN0b3AgdGhlIGFkYXB0ZXIKCQkJUG93ZXIgZG93bgoJKi8KCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCgkvKiBEaXNhYmxlIGludGVycnVwdCBoYW5kbGluZyAqLwoJd2xfYWN0X2ludF9vZmYoIGxwICk7CgoJLyogRGlzY29ubmVjdCAqLwoJd2xfZGlzY29ubmVjdCggbHAgKTsKCgkvKiBEaXNhYmxlICovCgl3bF9kaXNhYmxlKCBscCApOwoKICAgICAgICAvKiBEaXNjb25uZWN0IGZyb20gdGhlIGFkYXB0ZXIgKi8KCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QgKTsKCgkvKiBSZXNldCBwb3J0U3RhdGUgdG8gYmUgc3VyZSAoc2hvdWxkIGhhdmUgYmVlbiBkb25lIGJ5IHdsX2Rpc2FibGUgKi8KCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOwoKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwp9IC8vIHdsX3N1c3BlbmQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9yZXN1bWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmVzdW1lIGEgcHJldmlvdXNseSBzdXNwZW5kZWQgYWRhcHRlci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfcmVzdW1lIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CgoJd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgICAgICAvKiBDb25uZWN0IHRvIHRoZSBhZGFwdGVyICovCgloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIGRldi0+YmFzZV9hZGRyICk7CgoJLyogUmVzZXQgcG9ydFN0YXRlICovCglscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKCgkvKiBQb3dlciBtaWdodCBoYXZlIGJlZW4gb2ZmLCBhc3N1bWUgdGhlIGNhcmQgbG9zdCB0aGUgZmlybXdhcmUqLwoJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVDsKCgkvKiBSZWxvYWQgdGhlIGZpcm13YXJlIGFuZCByZXN0YXJ0ICovCgl3bF9yZXNldCggZGV2ICk7CgoJLyogUmVzdW1lIGludGVycnVwdCBoYW5kbGluZyAqLwoJd2xfYWN0X2ludF9vbiggbHAgKTsKCgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybjsKfSAvLyB3bF9yZXN1bWUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9yZWxlYXNlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZnJvbXMgYSBjaGVjayBvbiB0aGUgZGV2aWNlIGFuZCBjYWxscyB3bF9yZW1vdmUoKSBpZgogKiAgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgYnVzIHR5cGVzLCBidXQgZXhpc3RzIG1vc3RseQogKiAgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBDYXJkIFNlcnZpY2VzIGRyaXZlciwgYXMgdGhlcmUgYXJlIHRpbWVzIHdoZW4KICogIHdsX3JlbW92ZSgpIGRvZXMgbm90IGdldCBjYWxsZWQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcmVsZWFzZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglEQkdfRlVOQyggIndsX3JlbGVhc2UiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCS8qIElmIHdsX3JlbW92ZSgpIGhhc24ndCBiZWVuIGNhbGxlZCAoaS5lLiB3aGVuIENhcmQgU2VydmljZXMgaXMgc2h1dAoJICAgZG93biB3aXRoIHRoZSBjYXJkIGluIHRoZSBzbG90KSwgdGhlbiBjYWxsIGl0ICovCglpZiAoIGxwLT5pc19yZWdpc3RlcmVkID09IFRSVUUgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FsbGluZyB1bnJlZ2lzdGVyX25ldGRldigpLCBhcyBpdCB3YXNuJ3QgY2FsbGVkIHlldFxuIiApOwoJCXdsX3JlbW92ZSggZGV2ICk7CgoJCWxwLT5pc19yZWdpc3RlcmVkID0gRkFMU0U7Cgl9CgoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm47Cn0gLy8gd2xfcmVsZWFzZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2dldF9pcnFfbWFzaygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBY2Nlc3NvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaXJxX21hc2sgbW9kdWxlIHBhcmFtZXRlcgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIGlycV9tYXNrIG1vZHVsZSBwYXJhbWV0ZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcF91MTYgd2xfZ2V0X2lycV9tYXNrKCB2b2lkICkKewoJcmV0dXJuIGlycV9tYXNrOwp9IC8vIHdsX2dldF9pcnFfbWFzawovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2dldF9pcnFfbGlzdCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBY2Nlc3NvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaXJxX2xpc3QgbW9kdWxlIHBhcmFtZXRlcgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIGlycV9saXN0IG1vZHVsZSBwYXJhbWV0ZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcF9zOCAqIHdsX2dldF9pcnFfbGlzdCggdm9pZCApCnsKCXJldHVybiBpcnFfbGlzdDsKfSAvLyB3bF9nZXRfaXJxX2xpc3QKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZW5hYmxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gZW5hYmxlIE1BQyBwb3J0cwogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2VuYWJsZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfZW5hYmxlIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IENhcmQgYWxyZWFkeSBlbmFibGVkXG4iICk7Cgl9IGVsc2UgaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfQ09OTkVDVEVEICkgewoJCS8vOz9zdXNwaWN1b3VzIGxvZ2ljLCBob3cgY2FuIHlvdSBiZSBjb25uZWN0ZWQgd2l0aG91dCBiZWluZyBlbmFibGVkIHNvIHRoaXMgaXMgcHJvYmFibHkgZGVhZCBjb2RlCgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBDYXJkIGFscmVhZHkgY29ubmVjdGVkXG4iICk7Cgl9IGVsc2UgewoJCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0VOQUJMRSApOwoJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJLyogU2V0IHRoZSBzdGF0dXMgb2YgdGhlIE5JQyB0byBlbmFibGVkICovCgkJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQ7ICAgLy87P2JhZCBtbmVtb25pYywgTklDIGlzbyBQT1JUCiNpZmRlZiBFTkFCTEVfRE1BCgkJCWlmICggbHAtPnVzZV9kbWEgKSB7CgkJCQl3bF9wY2lfZG1hX2hjZl9zdXBwbHkoIGxwICk7ICAvLzs/YWx3YXlzIHN1Y2Nlcz8KCQkJfQojZW5kaWYKCQl9Cgl9CglpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7ICAvLzs/bWFrZSB0aGlzIGFuIGFzc2VydAoJCURCR19UUkFDRSggRGJnSW5mbywgImZhaWxlZDogMHgleFxuIiwgaGNmX3N0YXR1cyApOwoJfQoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gaGNmX3N0YXR1czsKfSAvLyB3bF9lbmFibGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgojaWZkZWYgVVNFX1dEUwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9lbmFibGVfd2RzX3BvcnRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gZW5hYmxlIHRoZSBXRFMgTUFDIHBvcnRzIDEtNgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9lbmFibGVfd2RzX3BvcnRzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqIGxwICkKewoKCURCR19GVU5DKCAid2xfZW5hYmxlX3dkc19wb3J0cyIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKXsKCQlEQkdfRVJST1IoIERiZ0luZm8sICIhISEhOz8gc29tZW9uZSBtaXN1bmRlcnN0b29kIHNvbWV0aGluZyAhISEhIVxuIiApOwoJfQoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm47Cn0gLy8gd2xfZW5hYmxlX3dkc19wb3J0cwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9jb25uZWN0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gY29ubmVjdCBhIE1BQyBwb3J0CiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfY29ubmVjdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGhjZl9zdGF0dXM7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoICJ3bF9jb25uZWN0IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYgKCBscC0+cG9ydFN0YXRlICE9IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IE5vdCBpbiBlbmFibGVkIHN0YXRlXG4iICk7CgkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJcmV0dXJuIEhDRl9TVUNDRVNTOwoJfQoJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfQ09OTkVDVCApOwoJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0NPTk5FQ1RFRDsKCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGhjZl9zdGF0dXM7Cn0gLy8gd2xfY29ubmVjdAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2Rpc2Nvbm5lY3QoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBkaXNjb25uZWN0IGEgTUFDIHBvcnQKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9kaXNjb25uZWN0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CglpbnQgaGNmX3N0YXR1czsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCglEQkdfRlVOQyggIndsX2Rpc2Nvbm5lY3QiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglpZiAoIGxwLT5wb3J0U3RhdGUgIT0gV1ZMQU5fUE9SVF9TVEFURV9DT05ORUNURUQgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBOb3QgaW4gY29ubmVjdGVkIHN0YXRlXG4iICk7CgkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJcmV0dXJuIEhDRl9TVUNDRVNTOwoJfQoJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfRElTQ09OTkVDVCApOwoJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQ7Cgl9CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiBoY2Zfc3RhdHVzOwp9IC8vIHdsX2Rpc2Nvbm5lY3QKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9kaXNhYmxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gZGlzYWJsZSBNQUMgcG9ydHMKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogICAgICBwb3J0ICAgIC0gdGhlIE1BQyBwb3J0IHRvIGRpc2FibGUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9kaXNhYmxlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CglpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJREJHX0ZVTkMoICJ3bF9kaXNhYmxlIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBQb3J0IHN0YXRlIGlzIGRpc2FibGVkXG4iICk7Cgl9IGVsc2UgewoJCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0RJU0FCTEUgKTsKCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCS8qIFNldCB0aGUgc3RhdHVzIG9mIHRoZSBwb3J0IHRvIGRpc2FibGVkICovIC8vOz9iYWQgbW5lbW9uaWMgdXNlIE5JQyBpc28gUE9SVAoJCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKCiNpZmRlZiBFTkFCTEVfRE1BCgkJCWlmICggbHAtPnVzZV9kbWEgKSB7CgkJCQl3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBscCApOwoJCQl9CiNlbmRpZgoJCX0KCX0KCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGhjZl9zdGF0dXM7Cn0gLy8gd2xfZGlzYWJsZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCiNpZmRlZiBVU0VfV0RTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2Rpc2FibGVfd2RzX3BvcnRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gZGlzYWJsZSB0aGUgV0RTIE1BQyBwb3J0cyAxLTYKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfZGlzYWJsZV93ZHNfcG9ydHMoIHN0cnVjdCB3bF9wcml2YXRlICogbHAgKQp7CgoJREJHX0ZVTkMoICJ3bF9kaXNhYmxlX3dkc19wb3J0cyIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoKCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICl7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiISEhITs/IHNvbWVvbmUgbWlzdW5kZXJzdG9vZCBzb21ldGhpbmcgISEhISFcbiIgKTsKCX0KLy8gCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgewovLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF8xICk7Ci8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzIgKTsKLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfMyApOwovLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF80ICk7Ci8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzUgKTsKLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfNiApOwovLyAJfQoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm47Cn0gLy8gd2xfZGlzYWJsZV93ZHNfcG9ydHMKI2VuZGlmIC8vIFVTRV9XRFMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgojaWZuZGVmIFVTRV9NQk9YX1NZTkMKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfbWJ4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGFuZCBwcm9jZXNzIGEgbWFpbGJveCBtZXNzYWdlLgogKgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX21ieCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfbWJ4IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJNYWlsYm94IEluZm86IElGQl9NQkluZm9MZW46ICVkXG4iLAoJCQkgICBscC0+aGNmQ3R4LklGQl9NQkluZm9MZW4gKTsKCgltZW1zZXQoICYoIGxwLT5sdHZSZWNvcmQgKSwgMCwgc2l6ZW9mKCBsdHZfdCApKTsKCglscC0+bHR2UmVjb3JkLmxlbiA9IE1CX1NJWkU7CglscC0+bHR2UmVjb3JkLnR5cCA9IENGR19NQl9JTkZPOwoJaGNmX3N0YXR1cyA9IGhjZl9nZXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgoJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgImhjZl9nZXRfaW5mbyByZXR1cm5lZCAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CgoJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCXJldHVybiBoY2Zfc3RhdHVzOwoJfQoKCWlmICggbHAtPmx0dlJlY29yZC50eXAgPT0gQ0ZHX01CX0lORk8gKSB7CgkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJcmV0dXJuIGhjZl9zdGF0dXM7Cgl9CgkvKiBFbmRpYW4gdHJhbnNsYXRlIHRoZSBtYWlsYm94IGRhdGEsIHRoZW4gcHJvY2VzcyB0aGUgbWVzc2FnZSAqLwoJd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCAmKCBscC0+bHR2UmVjb3JkICkpOwoJd2xfcHJvY2Vzc19tYWlsYm94KCBscCApOwoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gaGNmX3N0YXR1czsKfSAvLyB3bF9tYngKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3goKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIHRlZGlvdXMgdGFzayBvZiBlbmRpYW4gdHJhbnNsYXRpbmcgYWxsCiAqICBmaWVsZHMgd2l0aHRpbiBhIG1haWxib3ggbWVzc2FnZSB3aGljaCBuZWVkIHRyYW5zbGF0aW5nLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBsdHYgLSBwb2ludGVyIHRvIHRoZSBMVFYgdG8gZW5kaWFuIHRyYW5zbGF0ZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCBsdHZfdCAqbHR2ICkKewoKCURCR19GVU5DKCAid2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7Cglzd2l0Y2goIGx0di0+dHlwICkgewoJICBjYXNlIENGR19UQUxMSUVTOgoJCWJyZWFrOwoKCSAgY2FzZSBDRkdfU0NBTjoKCQl7CgkJCWludCBudW1fYXBzOwoJCQlTQ0FOX1JTX1NUUkNUICphcHMgPSAoU0NBTl9SU19TVFJDVCAqKSZsdHYtPnUudThbMF07CgoJCQludW1fYXBzID0gKGhjZl8xNikoKCAoc2l6ZV90KShsdHYtPmxlbiAtIDEgKSAqIDIgKSAvCgkJCQkJCQkJICggc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpKTsKCgkJCXdoaWxlKCBudW1fYXBzID49IDEgKSB7CgkJCQludW1fYXBzLS07CgoJCQkJYXBzW251bV9hcHNdLmNoYW5uZWxfaWQgPQoJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uY2hhbm5lbF9pZCApOwoKCQkJCWFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCA9CgkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCApOwoKCQkJCWFwc1tudW1fYXBzXS5zaWduYWxfbGV2ZWwgPQoJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uc2lnbmFsX2xldmVsICk7CgoJCQkJYXBzW251bV9hcHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lID0KCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lICk7CgoJCQkJYXBzW251bV9hcHNdLmNhcGFiaWxpdHkgPQoJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uY2FwYWJpbGl0eSApOwoKCQkJCWFwc1tudW1fYXBzXS5zc2lkX2xlbiA9CgkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5zc2lkX2xlbiApOwoKCQkJCWFwc1tudW1fYXBzXS5zc2lkX3ZhbFthcHNbbnVtX2Fwc10uc3NpZF9sZW5dID0gMDsKCQkJfQoJCX0KCQlicmVhazsKCgkgIGNhc2UgQ0ZHX0FDU19TQ0FOOgoJCXsKCQkJUFJPQkVfUkVTUCAqcHJvYmVfcmVzcCA9IChQUk9CRV9SRVNQICopbHR2OwoKCQkJcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICk7CgkJCXByb2JlX3Jlc3AtPmR1cklEICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmR1cklEICk7CgkJCXByb2JlX3Jlc3AtPnNlcXVlbmNlICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPnNlcXVlbmNlICk7CgkJCXByb2JlX3Jlc3AtPmRhdGFMZW5ndGggICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggKTsKI2lmbmRlZiBXQVJQCgkJCXByb2JlX3Jlc3AtPmxlblR5cGUgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmxlblR5cGUgKTsKI2VuZGlmIC8vIFdBUlAKCQkJcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgKTsKCQkJcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSApOwoJCQlwcm9iZV9yZXNwLT5mbGFncyAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mbGFncyApOwoJCX0KCQlicmVhazsKCgkgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopbHR2KQoJCQlscy0+bGlua1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBscy0+bGlua1N0YXR1cyApOwoJCWJyZWFrOwojdW5kZWYgbHMKCgkgIGNhc2UgQ0ZHX0FTU09DX1NUQVQ6CgkJewoJCQlBU1NPQ19TVEFUVVNfU1RSQ1QgKmFzID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKWx0djsKCgkJCWFzLT5hc3NvY1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBhcy0+YXNzb2NTdGF0dXMgKTsKCQl9CgkJYnJlYWs7CgoJICBjYXNlIENGR19TRUNVUklUWV9TVEFUOgoJCXsKCQkJU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpzcyA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKilsdHY7CgoJCQlzcy0+c2VjdXJpdHlTdGF0dXMgID0gQ05WX0xJVFRMRV9UT19JTlQoIHNzLT5zZWN1cml0eVN0YXR1cyApOwoJCQlzcy0+cmVhc29uICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHNzLT5yZWFzb24gKTsKCQl9CgkJYnJlYWs7CgoJICBjYXNlIENGR19XTVA6CgkJYnJlYWs7CgoJICBjYXNlIENGR19OVUxMOgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm47Cn0gLy8gd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wcm9jZXNzX21haWxib3goKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb2Nlc3MgdGhlIG1haWxib3ggZGF0YS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHR2IC0gcG9pbnRlciB0byB0aGUgTFRWIHRvIGJlIHByb2Nlc3NlZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgbm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3Byb2Nlc3NfbWFpbGJveCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJbHR2X3QgICAqbHR2OwoJaGNmXzE2ICBsdHZfdmFsID0gMHhGRkZGOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJREJHX0ZVTkMoICJ3bF9wcm9jZXNzX21haWxib3giICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCWx0diA9ICYoIGxwLT5sdHZSZWNvcmQgKTsKCglzd2l0Y2goIGx0di0+dHlwICkgewoKCSAgY2FzZSBDRkdfVEFMTElFUzoKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVEFMTElFU1xuIiApOwoJCWJyZWFrOwoJICBjYXNlIENGR19TQ0FOOgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOXG4iICk7CgoJCXsKCQkJaW50IG51bV9hcHM7CgkJCVNDQU5fUlNfU1RSQ1QgKmFwcyA9IChTQ0FOX1JTX1NUUkNUICopJmx0di0+dS51OFswXTsKCgkJCW51bV9hcHMgPSAoaGNmXzE2KSgoIChzaXplX3QpKGx0di0+bGVuIC0gMSApICogMiApIC8KCQkJCQkJCQkgKCBzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSkpOwoKCQkJbHAtPnNjYW5fcmVzdWx0cy5udW1fYXBzID0gbnVtX2FwczsKCgkJCURCR19UUkFDRSggRGJnSW5mbywgIk51bWJlciBvZiBBUHM6ICVkXG4iLCBudW1fYXBzICk7CgoJCQl3aGlsZSggbnVtX2FwcyA+PSAxICkgewoJCQkJbnVtX2Fwcy0tOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFQICAgICAgICAgICAgICA6ICVkXG4iLCBudW1fYXBzICk7CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICI9PT09PT09PT09PT09PT09PT09PT09PT09XG4iICk7CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDaGFubmVsIElEICAgICAgOiAweCUwNHhcbiIsCgkJCQkJCSAgIGFwc1tudW1fYXBzXS5jaGFubmVsX2lkICk7CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOb2lzZSBMZXZlbCAgICAgOiAweCUwNHhcbiIsCgkJCQkJCSAgIGFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCApOwoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2lnbmFsIExldmVsICAgIDogMHglMDR4XG4iLAoJCQkJCQkgICBhcHNbbnVtX2Fwc10uc2lnbmFsX2xldmVsICk7CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJCZWFjb24gSW50ZXJ2YWwgOiAweCUwNHhcbiIsCgkJCQkJCSAgIGFwc1tudW1fYXBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSApOwoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FwYWJpbGl0eSAgICAgIDogMHglMDR4XG4iLAoJCQkJCQkgICBhcHNbbnVtX2Fwc10uY2FwYWJpbGl0eSApOwoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1NJRCBMZW5ndGggICAgIDogMHglMDR4XG4iLAoJCQkJCQkgICBhcHNbbnVtX2Fwc10uc3NpZF9sZW4gKTsKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkJTU0lEICAgICAgICAgICA6ICVzXG4iLAoJCQkJCQkgICBEYmdId0FkZHIoIGFwc1tudW1fYXBzXS5ic3NpZCApKTsKCgkJCQlpZiAoIGFwc1tudW1fYXBzXS5zc2lkX2xlbiAhPSAwICkgewoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQgICAgICAgICAgICA6ICVzLlxuIiwKCQkJCQkJCSAgIGFwc1tudW1fYXBzXS5zc2lkX3ZhbCApOwoJCQkJfSBlbHNlIHsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lEICAgICAgICAgICAgOiAlcy5cbiIsICJBTlkiICk7CgkJCQl9CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiXG4iICk7CgoJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKCQkJCSAgIGFkYXB0ZXIgc3RydWN0ICovCgkJCQltZW1jcHkoICYoIGxwLT5zY2FuX3Jlc3VsdHMuQVBUYWJsZVtudW1fYXBzXSksICYoIGFwc1tudW1fYXBzXSApLAoJCQkJCQlzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSk7CgkJCX0KCgkJCS8qIFNldCBzY2FuIHJlc3VsdCB0byB0cnVlIHNvIHRoYXQgYW55IHNjYW4gcmVxdWVzdHMgd2lsbAoJCQkgICBjb21wbGV0ZSAqLwoJCQlscC0+c2Nhbl9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBUUlVFOwoJCX0KCgkJYnJlYWs7CgkgIGNhc2UgQ0ZHX0FDU19TQ0FOOgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19BQ1NfU0NBTlxuIiApOwoKCQl7CgkJCVBST0JFX1JFU1AgICpwcm9iZV9yc3AgPSAoUFJPQkVfUkVTUCAqKWx0djsKCQkJaGNmXzggICAgICAgKndwYV9pZSA9IE5VTEw7CgkJCWhjZl8xNiAgICAgIHdwYV9pZV9sZW4gPSAwOwoKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4iLAoJCQkJCSAgIGxwLT5kZXYtPm5hbWUgKTsKCgkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuZ3RoICAgICAgOiAweCUwNHguXG4iLAoJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+bGVuZ3RoICk7CgoJCQlpZiAoIHByb2JlX3JzcC0+bGVuZ3RoID4gMSApIHsKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgaW5mb1R5cGUgICAgOiAweCUwNHguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmluZm9UeXBlICk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWduYWwgICAgICA6IDB4JTAyeC5cbiIsCgkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+c2lnbmFsICk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWxlbmNlICAgICA6IDB4JTAyeC5cbiIsCgkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+c2lsZW5jZSApOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgcnhGbG93ICAgICAgOiAweCUwMnguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJ4RmxvdyApOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgcmF0ZSAgICAgICAgOiAweCUwMnguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJhdGUgKTsKCgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZyYW1lIGNudGwgIDogMHglMDR4LlxuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5mcmFtZUNvbnRyb2wgKTsKCgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGR1cklEICAgICAgIDogMHglMDR4LlxuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5kdXJJRCApOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczEgICAgOiAlc1xuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MxICkpOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczIgICAgOiAlc1xuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MyICkpOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgQlNTSUQgICAgICAgOiAlc1xuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkJTU0lEICkpOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2VxdWVuY2UgICAgOiAweCUwNHguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnNlcXVlbmNlICk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzNCAgICA6ICVzXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczQgKSk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkYXRhbGVuZ3RoICA6IDB4JTA0eC5cbiIsCgkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZGF0YUxlbmd0aCApOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgREEgICAgICAgICAgOiAlc1xuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkRBICkpOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgU0EgICAgICAgICAgOiAlc1xuIiwKCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPlNBICkpOwoKCQkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBsZW5UeXBlICAgICA6IDB4JTA0eC5cbiIsCgkJCQkvLyAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5sZW5UeXBlICk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSB0aW1lU3RhbXAgICA6ICVzXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+dGltZVN0YW1wICkpOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYmVhY29uSW50ICAgOiAweCUwNHguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmJlYWNvbkludGVydmFsICk7CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBjYXBhYmlsaXR5ICA6IDB4JTA0eC5cbiIsCgkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+Y2FwYWJpbGl0eSApOwoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCBsZW4gICAgOiAweCUwNHguXG4iLAoJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gKTsKCgkJCQlpZiAoIHByb2JlX3JzcC0+cmF3RGF0YVsxXSA+IDAgKSB7CgkJCQkJY2hhciBzc2lkW0hDRl9NQVhfTkFNRV9MRU5dOwoKCQkJCQltZW1zZXQoIHNzaWQsIDAsIHNpemVvZiggc3NpZCApKTsKCQkJCQlzdHJuY3B5KCBzc2lkLCAmcHJvYmVfcnNwLT5yYXdEYXRhWzJdLAoJCQkJCQkJIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOwoKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNTSUQgICAgICAgIDogJXNcbiIsCgkJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBzc2lkICk7CgkJCQl9CgoJCQkJLyogUGFyc2Ugb3V0IHRoZSBXUEEtSUUsIGlmIG9uZSBleGlzdHMgKi8KCQkJCXdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggcHJvYmVfcnNwLCAmd3BhX2llX2xlbiApOwoJCQkJaWYgKCB3cGFfaWUgIT0gTlVMTCApIHsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFdQQS1JRSAgICAgIDogJXNcbiIsCgkJCQkJbHAtPmRldi0+bmFtZSwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIHdwYV9pZV9sZW4gKSk7CgkJCQl9CgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmbGFncyAgICAgICA6IDB4JTA0eC5cbiIsCgkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZmxhZ3MgKTsKCQkJfQoKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiXG5cbiIgKTsKCQkJLyogSWYgcHJvYmUgcmVzcG9uc2UgbGVuZ3RoIGlzIDEsIHRoZW4gdGhlIHNjYW4gaXMgY29tcGxldGUgKi8KCQkJaWYgKCBwcm9iZV9yc3AtPmxlbmd0aCA9PSAxICkgewoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU0NBTiBDT01QTEVURVxuIiApOwoJCQkJbHAtPnByb2JlX3Jlc3VsdHMubnVtX2FwcyA9IGxwLT5wcm9iZV9udW1fYXBzOwoJCQkJbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IFRSVUU7CgoJCQkJLyogUmVzZXQgdGhlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IHNjYW4gcmVxdWVzdCAqLwoJCQkJbHAtPnByb2JlX251bV9hcHMgPSAwOwoKCQkJCS8qIFNlbmQgYSB3aXJlbGVzcyBleHRlbnNpb25zIGV2ZW50IHRoYXQgdGhlIHNjYW4gY29tcGxldGVkICovCgkJCQl3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIGxwLT5kZXYgKTsKCQkJfSBlbHNlIHsKCQkJCS8qIE9ubHkgY29weSB0byB0aGUgdGFibGUgaWYgdGhlIGVudHJ5IGlzIHVuaXF1ZTsgQVBzIHNvbWV0aW1lcwoJCQkJICAgcmVzcG9uZCBtb3JlIHRoYW4gb25jZSB0byBhIHByb2JlICovCgkJCQlpZiAoIGxwLT5wcm9iZV9udW1fYXBzID09IDAgKSB7CgkJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKCQkJCQlhZGFwdGVyIHN0cnVjdCAqLwoJCQkJCW1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKCQkJCQkJCXByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOwoKCQkJCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQgKi8KCQkJCQlscC0+cHJvYmVfbnVtX2FwcysrOwoJCQkJfSBlbHNlIHsKCQkJCQlpbnQgY291bnQ7CgkJCQkJaW50IHVuaXF1ZSA9IDE7CgoJCQkJCWZvciggY291bnQgPSAwOyBjb3VudCA8IGxwLT5wcm9iZV9udW1fYXBzOyBjb3VudCsrICkgewoJCQkJCQlpZiAoIG1lbWNtcCggJiggcHJvYmVfcnNwLT5CU1NJRCApLAoJCQkJCQkJbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQsCgkJCQkJCQlFVEhfQUxFTiApID09IDAgKSB7CgkJCQkJCQl1bmlxdWUgPSAwOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIHVuaXF1ZSApIHsKCQkJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlCgkJCQkJCXByaXZhdGUgYWRhcHRlciBzdHJ1Y3QuIE9ubHkgY29weSBpZiB0aGVyZSdzIHJvb20gaW4gdGhlCgkJCQkJCXRhYmxlICovCgkJCQkJCWlmICggbHAtPnByb2JlX251bV9hcHMgPCBNQVhfTkFQUyApCgkJCQkJCXsKCQkJCQkJCW1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKCQkJCQkJCQkJcHJvYmVfcnNwLCBzaXplb2YoIFBST0JFX1JFU1AgKSk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIk51bSBvZiBzY2FuIHJlc3VsdHMgZXhjZWVkcyBzdG9yYWdlLCB0cnVuY2F0aW5nXG4iICk7CgkJCQkJCX0KCgkJCQkJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZC4gTm90ZSBJIGRvIHRoaXMKCQkJCQkJICAgaGVyZSBldmVuIHdoZW4gSSBkb24ndCBjb3B5IHRoZSBwcm9iZSByZXNwb25zZSB0byB0aGUKCQkJCQkJICAgYnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uICovCgkJCQkJCWxwLT5wcm9iZV9udW1fYXBzKys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlicmVhazsKCgkgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopbHR2KQoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19MSU5LX1NUQVRcbiIgKTsKCgkJc3dpdGNoKCBscy0+bGlua1N0YXR1cyApIHsKCQkgIGNhc2UgMToKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBDb25uZWN0ZWRcbiIgKTsKCQkJd2xfd2V4dF9ldmVudF9hcCggbHAtPmRldiApOwoJCQlicmVhazsKCgkJICBjYXNlIDI6CgkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogRGlzY29ubmVjdGVkXG4iICApOwoJCQlicmVhazsKCgkJICBjYXNlIDM6CgkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IENoYW5nZVxuIiApOwoJCQlicmVhazsKCgkJICBjYXNlIDQ6CgkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IE91dCBvZiBSYW5nZVxuIiApOwoJCQlicmVhazsKCgkJICBjYXNlIDU6CgkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IEluIFJhbmdlXG4iICk7CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCgkJCQkJICAgbHMtPmxpbmtTdGF0dXMgKTsKCQkJYnJlYWs7CgkJfQoKCQlicmVhazsKI3VuZGVmIGxzCgoJICBjYXNlIENGR19BU1NPQ19TVEFUOgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19BU1NPQ19TVEFUXG4iICk7CgoJCXsKCQkJQVNTT0NfU1RBVFVTX1NUUkNUICphcyA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKilsdHY7CgoJCQlzd2l0Y2goIGFzLT5hc3NvY1N0YXR1cyApIHsKCQkJICBjYXNlIDE6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgQXNzb2NpYXRlZFxuIiApOwoJCQkJYnJlYWs7CgoJCQkgIGNhc2UgMjoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBSZWFzc29jaWF0ZWRcbiIgKTsKCQkJCWJyZWFrOwoKCQkJICBjYXNlIDM6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgRGlzYXNzb2NpYXRlZFxuIiApOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKCQkJCQkJICAgYXMtPmFzc29jU3RhdHVzICk7CgkJCQlicmVhazsKCQkJfQoKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgICAgIDogJXNcbiIsCgkJCQkJICAgRGJnSHdBZGRyKCBhcy0+c3RhQWRkciApKTsKCgkJCWlmICgoIGFzLT5hc3NvY1N0YXR1cyA9PSAyICkgICYmICggYXMtPmxlbiA9PSA4ICkpIHsKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk9sZCBBUCBBZGRyZXNzICAgICA6ICVzXG4iLAoJCQkJCQkgICBEYmdId0FkZHIoIGFzLT5vbGRBcEFkZHIgKSk7CgkJCX0KCQl9CgoJCWJyZWFrOwoKCSAgY2FzZSBDRkdfU0VDVVJJVFlfU1RBVDoKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0VDVVJJVFlfU1RBVFxuIiApOwoKCQl7CgkJCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqc3MgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopbHR2OwoKCQkJc3dpdGNoKCBzcy0+c2VjdXJpdHlTdGF0dXMgKSB7CgkJCSAgY2FzZSAxOgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGlzc2Fzc29jaWF0ZSBbQVBdXG4iICk7CgkJCQlicmVhazsKCgkJCSAgY2FzZSAyOgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGVhdXRoZW50aWNhdGUgW0FQXVxuIiApOwoJCQkJYnJlYWs7CgoJCQkgIGNhc2UgMzoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEF1dGhlbnRpY2F0ZSBGYWlsIFtTVEFdIG9yIFtBUF1cbiIgKTsKCQkJCWJyZWFrOwoKCQkJICBjYXNlIDQ6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBNSUMgRmFpbFxuIiApOwoJCQkJYnJlYWs7CgoJCQkgIGNhc2UgNToKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEFzc29jaWF0ZSBGYWlsXG4iICk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBVTktOT1dOICVkXG4iLAoJCQkJCQkgICBzcy0+c2VjdXJpdHlTdGF0dXMgKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgOiAlc1xuIiwgRGJnSHdBZGRyKCBzcy0+c3RhQWRkciApKTsKCgkJCURCR19UUkFDRSggRGJnSW5mbywgIlJlYXNvbiAgICAgICAgICA6IDB4JTA0eCBcbiIsIHNzLT5yZWFzb24gKTsKCQl9CgoJCWJyZWFrOwoKCSAgY2FzZSBDRkdfV01QOgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19XTVAsIHNpemUgaXMgJWQgYnl0ZXNcbiIsIGx0di0+bGVuICk7CgkJewoJCQlXTVBfUlNQX1NUUkNUICp3bXBfcnNwID0gKFdNUF9SU1BfU1RSQ1QgKilsdHY7CgoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfV01QLCBwZHUgdHlwZSBpcyAweCV4XG4iLAoJCQkJCSAgIHdtcF9yc3AtPndtcFJzcC53bXBIZHIudHlwZSApOwoKCQkJc3dpdGNoKCB3bXBfcnNwLT53bXBSc3Aud21wSGRyLnR5cGUgKSB7CgkJCSAgY2FzZSBXVkxBTl9XTVBfUERVX1RZUEVfTFRfUlNQOgoJCQkJewojaWYgREJHCgkJCQkJTElOS1RFU1RfUlNQX1NUUkNUICAqbHRfcnNwID0gKExJTktURVNUX1JTUF9TVFJDVCAqKWx0djsKI2VuZGlmIC8vIERCRwoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkxJTksgVEVTVCBSRVNVTFRcbiIgKTsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICI9PT09PT09PT09PT09PT09XG4iICk7CgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGVuZ3RoICAgICAgICA6ICVkLlxuIiwgICAgIGx0X3JzcC0+bGVuICk7CgoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk5hbWUgICAgICAgICAgOiAlcy5cbiIsICAgICBsdF9yc3AtPmx0UnNwLmx0UnNwLm5hbWUgKTsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTaWduYWwgTGV2ZWwgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5zaWduYWwgKTsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOb2lzZSAgTGV2ZWwgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5ub2lzZSApOwoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlJlY2VpdmUgRmxvdyAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnJ4RmxvdyApOwoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkRhdGEgUmF0ZSAgICAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLmRhdGFSYXRlICk7CgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHJvdG9jb2wgICAgICA6IDB4JTA0eC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AucHJvdG9jb2wgKTsKCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTdGF0aW9uICAgICAgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5zdGF0aW9uICk7CgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGF0YSBSYXRlIENhcCA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AuZGF0YVJhdGVDYXAgKTsKCgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUG93ZXIgTWdtdCAgICA6IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeC5cbiIsCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMF0sCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMV0sCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMl0sCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbM10gKTsKCgkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUm9idXN0bmVzcyAgICA6IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeC5cbiIsCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzBdLAoJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3Aucm9idXN0bmVzc1sxXSwKCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnJvYnVzdG5lc3NbMl0sCgkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzNdICk7CgoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNjYWxpbmcgICAgICAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnNjYWxpbmcgKTsKCQkJCX0KCgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJYnJlYWs7CgoJICBjYXNlIENGR19OVUxMOgoJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19OVUxMXG4iICk7CgkJYnJlYWs7CgoJICBjYXNlIENGR19VUERBVEVEX0lORk9fUkVDT1JEOiAgICAgICAgLy8gVXBkYXRlZCBJbmZvcm1hdGlvbiBSZWNvcmQKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVUERBVEVEIElORk9STUFUSU9OIFJFQ09SRFxuIiApOwoKCQlsdHZfdmFsID0gQ05WX0lOVF9UT19MSVRUTEUoIGx0di0+dS51MTZbMF0gKTsKCgkJLyogQ2hlY2sgYW5kIHNlZSB3aGljaCBSSUQgd2FzIHVwZGF0ZWQgKi8KCQlzd2l0Y2goIGx0dl92YWwgKSB7CgkJICBjYXNlIENGR19DVVJfQ09VTlRSWV9JTkZPOiAgLy8gSW5kaWNhdGUgUGFzc2l2ZSBTY2FuIENvbXBsZXRpb24KCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBjb3VudHJ5IGluZm9cbiIgKTsKCgkJCS8qIERvIEkgbmVlZCB0byBob2xkIG9mZiBvbiB1cGRhdGluZyBSSURzIHVudGlsIHRoZSBwcm9jZXNzIGlzCgkJCSAgIGNvbXBsZXRlPyAqLwoJCQl3bF9jb25uZWN0KCBscCApOwoJCQlicmVhazsKCgkJICBjYXNlIENGR19QT1JUX1NUQVQ6ICAgIC8vIFdhaXQgZm9yIENvbm5lY3QgRXZlbnQKCQkJLy93bF9jb25uZWN0KCBscCApOwoKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiVW5rbm93biBSSUQ6IDB4JTA0eFxuIiwgbHR2X3ZhbCApOwoJCX0KCgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVTktOT1dOIE1FU1NBR0U6IDB4JTA0eFxuIiwgbHR2LT50eXAgKTsKCQlicmVhazsKCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwp9IC8vIHdsX3Byb2Nlc3NfbWFpbGJveAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojZW5kaWYgIC8qIGlmbmRlZiBVU0VfTUJPWF9TWU5DICovCgojaWZkZWYgVVNFX1dEUwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyB3aXRoIHRoZSBzeXN0ZW0ncyBuZXR3b3JrCiAqICAgICAgbGF5ZXIgZm9yIHVzZSB3aXRoIHRoZSBXRFMgcG9ydHMuCiAqCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRkZXZfcmVnaXN0ZXIoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKCWludCBjb3VudDsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCURCR19GVU5DKCAid2xfd2RzX25ldGRldl9yZWdpc3RlciIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoJLy87P3doeSBpcyB0aGVyZSBubyBVU0VfV0RTIGNsYXVzZSBsaWtlIGluIHdsX2VuYWJsZV93ZHNfcG9ydHMKCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgewoJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CgkJCWlmICggV1ZMQU5fVkFMSURfTUFDX0FERFJFU1MoIGxwLT53ZHNfcG9ydFtjb3VudF0ud2RzQWRkcmVzcyApKSB7CgkJCQlpZiAoIHJlZ2lzdGVyX25ldGRldiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSAhPSAwICkgewoJCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAibmV0IGRldmljZSBmb3IgV0RTIHBvcnQgJWQgY291bGQgbm90IGJlIHJlZ2lzdGVyZWRcbiIsCgkJCQkJCQkJKCBjb3VudCArIDEgKSk7CgkJCQl9CgkJCQlscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgPSBUUlVFOwoKCQkJCS8qIEZpbGwgb3V0IHRoZSBuZXRfZGV2aWNlIHN0cnVjdHMgd2l0aCB0aGUgTUFDIGFkZHIgKi8KCQkJCW1lbWNweSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmRldl9hZGRyLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKCQkJCWxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOwoJCQl9CgkJfQoJfQoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm47Cn0gLy8gd2xfd2RzX25ldGRldl9yZWdpc3RlcgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRkZXZfZGVyZWdpc3RlcigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIGRlcmVnaXN0ZXJzIHRoZSBXRFMgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlCiAqICAgICAgc3lzdGVtJ3MgbmV0d29yayBsYXllci4KICoKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CglpbnQgY291bnQ7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglEQkdfRlVOQyggIndsX3dkc19uZXRkZXZfZGVyZWdpc3RlciIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CgkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKCQkJaWYgKCBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggbHAtPndkc19wb3J0W2NvdW50XS53ZHNBZGRyZXNzICkpIHsKCQkJCXVucmVnaXN0ZXJfbmV0ZGV2KCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwoJCQl9CgkJCWxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCA9IEZBTFNFOwoJCX0KCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRkZXZfZGVyZWdpc3RlcgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCgojaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLwovKgogKiBUaGUgcHJvYyBmaWxlc3lzdGVtOiBmdW5jdGlvbiB0byByZWFkIGFuZCBlbnRyeQogKi8KaW50IHByaW50Zl9oY2ZfMTYoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzE2KiBwLCBpbnQgbiApOwppbnQgcHJpbnRmX2hjZl8xNiggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfMTYqIHAsIGludCBuICkgewoKaW50IGksIGxlbjsKCglsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzIiwgcyApOwoJd2hpbGUgKCBsZW4gPCAyMCApIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIiApOwoJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiOiAiICk7Cglmb3IgKCBpID0gMDsgaSA8IG47IGkrKyApIHsKCQlpZiAoIGxlbiAlIDgwID4gNzUgKSB7CgkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOwoJCX0KCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIlMDRYICIsIHBbaV0gKTsKCX0KCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOwoJcmV0dXJuIGxlbjsKfSAvLyBwcmludGZfaGNmXzE2CgppbnQgcHJpbnRmX2hjZl84KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl84KiBwLCBpbnQgbiApOwppbnQgcHJpbnRmX2hjZl84KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl84KiBwLCBpbnQgbiApIHsKCmludCBpLCBsZW47CgoJbGVuID0gc3ByaW50ZihidWYsICIlcyIsIHMgKTsKCXdoaWxlICggbGVuIDwgMjAgKSBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICIgKTsKCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjogIiApOwoJZm9yICggaSA9IDA7IGkgPD0gbjsgaSsrICkgewoJCWlmICggbGVuICUgODAgPiA3NyApIHsKCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CgkJfQoJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIiUwMlggIiwgcFtpXSApOwoJfQoJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CglyZXR1cm4gbGVuOwp9IC8vIHByaW50Zl9oY2Y4CgppbnQgcHJpbnRmX3N0cmN0KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCApOwppbnQgcHJpbnRmX3N0cmN0KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCApIHsKCmludCBpLCBsZW47CgoJbGVuID0gc3ByaW50ZihidWYsICIlcyIsIHMgKTsKCXdoaWxlICggbGVuIDwgMjAgKSBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICIgKTsKCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjogIiApOwoJZm9yICggaSA9IDA7IGkgPD0gKnA7IGkrKyApIHsKCQlpZiAoIGxlbiAlIDgwID4gNzUgKSB7CgkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOwoJCX0KCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIlMDRYICIsIHBbaV0gKTsKCX0KCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOwoJcmV0dXJuIGxlbjsKfSAvLyBwcmludGZfc3RyY3QKCmludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEgKQp7CglzdHJ1Y3Qgd2xfcHJpdmF0ZQkqbHAgPSBOVUxMOwoJSUZCUAkJCQlpZmJwOwogICAJQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICpwOwoKICAgICNkZWZpbmUgTElNSVQgKFBBR0VfU0laRS04MCkgLyogZG9uJ3QgcHJpbnQgYW55IG1vcmUgYWZ0ZXIgdGhpcyBzaXplICovCgogICAgbGVuPTA7CgoJbHAgPSAoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSktPnByaXY7CglpZiAobHAgPT0gTlVMTCkgewogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk5vIHdsX3ByaXZhdGUgaW4gc2N1bGxfcmVhZF9wcm9jbWVtXG4iICk7Cgl9IGVsc2UgaWYgKCBscC0+d2xhZ3M0OV90eXBlID09IDAgKXsKICAgCSAgICBpZmJwID0gJmxwLT5oY2ZDdHg7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTWFnaWM6ICAgICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfTWFnaWMgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJJT0Jhc2U6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9JT0Jhc2UgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJMaW5rU3RhdDogICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9MaW5rU3RhdCApOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRTTGlua1N0YXQ6ICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0RTTGlua1N0YXQgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUaWNrSW5pOiAgICAgICAgIDB4JTA4bFhcbiIsIGlmYnAtPklGQl9UaWNrSW5pICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVGlja0NudDogICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfVGlja0NudCApOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkludE9mZkNudDogICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0ludE9mZkNudCApOwoJCWxlbiArPSBwcmludGZfaGNmXzE2KCAiSUZCX0ZXSWRlbnRpdHkiLCAmYnVmW2xlbl0sCgkJCQkJCQkgICZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4sIGlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiArIDEgKTsKCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgPT0gMSApIHsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJDaGFubmVsOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+Q2hhbm5lbCApOwovKioqKioqIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInNsb2NrOiAgICAgICAgICAgICAgICAgICVkXG4iLCBscC0+c2xvY2sgKTsJCSovCi8veAkJc3RydWN0IHRxX3N0cnVjdCAgICAgICAgICAgICJ0YXNrOiAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnRhc2sgKTsKLy94CQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgInN0YXRzOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+c3RhdHMgKTsKI2lmZGVmIFdJUkVMRVNTX0VYVAovL3gJCXN0cnVjdCBpd19zdGF0aXN0aWNzICAgICAgICAid3N0YXRzOiAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT53c3RhdHMgKTsKLy94ICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJzcHlfbnVtYmVyOiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+c3B5X251bWJlciApOwovL3gJCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07Ci8veAkJc3RydWN0IGl3X3F1YWxpdHkgICAgICAgICAgIHNweV9zdGF0W0lXX01BWF9TUFldOwojZW5kaWYgLy8gV0lSRUxFU1NfRVhUCiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiSUZCOiAgICAgICAgICAgICAgICAgIDB4JXBcbiIsICZscC0+aGNmQ3R4ICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiZmxhZ3M6ICAgICAgICAgICAgICAgICUjLjhsWFxuIiwgbHAtPmZsYWdzICk7ICAvLzs/dXNlIHRoaXMgZm9ybWF0IGZyb20gbm93IG9uCiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGVidWdGbGFnKHdsX3ByaXZhdGUpIDB4JTA0WFxuIiwgbHAtPkRlYnVnRmxhZyApOwojaWYgREJHCiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGVidWdGbGFnIChEYmdJbmZvKTogICAweCUwOGxYXG4iLCBEYmdJbmZvLT5EZWJ1Z0ZsYWcgKTsKI2VuZGlmIC8vIERCRwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImlzX3JlZ2lzdGVyZWQ6ICAgICAgICAweCUwNFhcbiIsIGxwLT5pc19yZWdpc3RlcmVkICk7Ci8veAkJQ0ZHX0RSVl9JTkZPX1NUUkNUICAgICAgICAgICJkcml2ZXJJbmZvOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlckluZm8gKTsKCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiZHJpdmVySW5mbyIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5kcml2ZXJJbmZvICk7Ci8veAkJQ0ZHX0lERU5USVRZX1NUUkNUICAgICAgICAgICJkcml2ZXJJZGVudGl0eTogICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlcklkZW50aXR5ICk7CgkJbGVuICs9IHByaW50Zl9zdHJjdCggImRyaXZlcklkZW50aXR5IiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPmRyaXZlcklkZW50aXR5ICk7Ci8veAkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNUICAgICAgICJTdGF0aW9uSWRlbnRpdHk6ICAgIDB4JTA0WFxuIiwgbHAtPlN0YXRpb25JZGVudGl0eSApOwoJCWxlbiArPSBwcmludGZfc3RyY3QoICJTdGF0aW9uSWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+U3RhdGlvbklkZW50aXR5ICk7Ci8veAkJQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCAgICAgICJQcmltYXJ5SWRlbnRpdHk6ICAgIDB4JTA0WFxuIiwgbHAtPlByaW1hcnlJZGVudGl0eSApOwoJCWxlbiArPSBwcmludGZfc3RyY3QoICJQcmltYXJ5SWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+aGNmQ3R4LklGQl9QUklJZGVudGl0eSApOwoJCWxlbiArPSBwcmludGZfc3RyY3QoICJQcmltYXJ5U3VwcGxpZXIiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+aGNmQ3R4LklGQl9QUklTdXAgKTsKLy94CQlDRkdfUFJJX0lERU5USVRZX1NUUkNUICAgICAgIk5JQ0lkZW50aXR5OiAgICAgICAgMHglMDRYXG4iLCBscC0+TklDSWRlbnRpdHkgKTsKCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiTklDSWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+TklDSWRlbnRpdHkgKTsKLy94CQlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgImx0dlJlY29yZDogICAgICAgICAgMHglMDRYXG4iLCBscC0+bHR2UmVjb3JkICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidHhCeXRlczogICAgICAgICAgICAgIDB4JTA4bFhcbiIsIGxwLT50eEJ5dGVzICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibWF4UG9ydDogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPm1heFBvcnQgKTsgICAgICAgIC8qIDAgZm9yIFNUQSwgNiBmb3IgQVAgKi8KCS8qIEVsZW1lbnRzIHVzZWQgZm9yIGFzeW5jIG5vdGlmaWNhdGlvbiBmcm9tIGhhcmR3YXJlICovCi8veAkJUklEX0xPR19TVFJDVAkJCQlSaWRMaXN0WzEwXTsKLy94CQlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRSZWNvcmQ6ICAgICAgMHglMDRYXG4iLCBscC0+dXBkYXRlZFJlY29yZCApOwovL3gJCVBST0JFX1JFU1AJCQkJICAgICJQcm9iZVJlc3A6ICAgICAgICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5Qcm9iZVJlc3AgKTsKLy94CQlBU1NPQ19TVEFUVVNfU1RSQ1QgICAgICAgICAgImFzc29jX3N0YXQ6ICAgICAgICAgMHglMDRYXG4iLCBscC0+YXNzb2Nfc3RhdCApOwovL3gJCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAgICAgICAic2VjX3N0YXQ6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5zZWNfc3RhdCApOwovL3gJCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWRCdWZbV1ZMQU5fTUFYX0xPT0tBSEVBRF07CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUG9ydFR5cGU6ICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlBvcnRUeXBlICk7ICAgICAgICAgICAvLyAxIC0gMyAoMSBbTm9ybWFsXSB8IDMgW0FkSG9jXSkKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJDaGFubmVsOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+Q2hhbm5lbCApOyAgICAgICAgICAgIC8vIDAgLSAxNCAoMCkKLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbFsyXTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFJhdGVDb250cm9sWzJdOiAgICAgMHglMDRYIDB4JTA0WFxuIiwKCQkJCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0sIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGlzdGFuY2VCZXR3ZWVuQVBzOiAgIDB4JTA0WFxuIiwgbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyApOyAvLyAxIC0gMyAoMSkKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSVFNUaHJlc2hvbGQ6ICAgICAgICAgMHglMDRYXG4iLCBscC0+UlRTVGhyZXNob2xkICk7ICAgICAgIC8vIDAgLSAyMzQ3ICgyMzQ3KQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlBNRW5hYmxlZDogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5QTUVuYWJsZWQgKTsgICAgICAgICAgLy8gMCAtIDIsIDgwMDEgLSA4MDAyICgwKQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk1pY3Jvd2F2ZVJvYnVzdG5lc3M6ICAweCUwNFhcbiIsIGxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzICk7Ly8gMCAtIDEgKDApCiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiQ3JlYXRlSUJTUzogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkNyZWF0ZUlCU1MgKTsgICAgICAgICAvLyAwIC0gMSAoMCkKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJNdWx0aWNhc3RSZWNlaXZlOiAgICAgMHglMDRYXG4iLCBscC0+TXVsdGljYXN0UmVjZWl2ZSApOyAgIC8vIDAgLSAxICgxKQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk1heFNsZWVwRHVyYXRpb246ICAgICAweCUwNFhcbiIsIGxwLT5NYXhTbGVlcER1cmF0aW9uICk7ICAgLy8gMCAtIDY1NTM1ICgxMDApCi8veAkJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIE1BQ0FkZHJlc3NbRVRIX0FMRU5dOwoJCWxlbiArPSBwcmludGZfaGNmXzgoICJNQUNBZGRyZXNzIiwgJmJ1ZltsZW5dLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya05hbWVbSENGX01BWF9OQU1FX0xFTisxXTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJOZXR3b3JrTmFtZTogICAgICAgICAgJS4zMnNcbiIsIGxwLT5OZXR3b3JrTmFtZSApOwovL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aW9uTmFtZVtIQ0ZfTUFYX05BTUVfTEVOKzFdOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkVuYWJsZUVuY3J5cHRpb246ICAgICAweCUwNFhcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uICk7ICAgLy8gMCAtIDEgKDApCi8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTFbTUFYX0tFWV9MRU4rMV07CgkJbGVuICs9IHByaW50Zl9oY2ZfOCggIktleTEiLCAmYnVmW2xlbl0sIGxwLT5LZXkxLCBNQVhfS0VZX0xFTiApOwovL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkyW01BWF9LRVlfTEVOKzFdOwovL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkzW01BWF9LRVlfTEVOKzFdOwovL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXk0W01BWF9LRVlfTEVOKzFdOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRyYW5zbWl0S2V5SUQ6ICAgICAgICAweCUwNFhcbiIsIGxwLT5UcmFuc21pdEtleUlEICk7ICAgICAgLy8gMSAtIDQgKDEpCi8veAkJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVAkgICAgIkRlZmF1bHRLZXlzOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkRlZmF1bHRLZXlzICk7Ci8veAkJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIG1haWxib3hbTUJfU0laRV07Ci8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIHN6RW5jcnlwdGlvbltNQVhfRU5DX0xFTl07CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiZHJpdmVyRW5hYmxlOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlckVuYWJsZSApOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIndvbGFzRW5hYmxlOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT53b2xhc0VuYWJsZSApOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImF0aW1XaW5kb3c6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5hdGltV2luZG93ICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiaG9sZG92ZXJEdXJhdGlvbjogICAgIDB4JTA0WFxuIiwgbHAtPmhvbGRvdmVyRHVyYXRpb24gKTsKLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmF0ZVsyXTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJhdXRoZW50aWNhdGlvbjogICAgICAgMHglMDRYXG4iLCBscC0+YXV0aGVudGljYXRpb24gKTsgLy8gaXMgdGhpcyBBUCBzcGVjaWZpYz8KICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJwcm9taXNjdW91c01vZGU6ICAgICAgMHglMDRYXG4iLCBscC0+cHJvbWlzY3VvdXNNb2RlICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRG93bmxvYWRGaXJtd2FyZTogICAgIDB4JTA0WFxuIiwgbHAtPkRvd25sb2FkRmlybXdhcmUgKTsgICAvLyAwIC0gMiAoMCBbTm9uZV0gfCAxIFtTVEFdIHwgMiBbQVBdKQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkF1dGhLZXlNZ210U3VpdGU6ICAgICAweCUwNFhcbiIsIGxwLT5BdXRoS2V5TWdtdFN1aXRlICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibG9hZEJhbGFuY2luZzogICAgICAgIDB4JTA0WFxuIiwgbHAtPmxvYWRCYWxhbmNpbmcgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJtZWRpdW1EaXN0cmlidXRpb246ICAgMHglMDRYXG4iLCBscC0+bWVkaXVtRGlzdHJpYnV0aW9uICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidHhQb3dMZXZlbDogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4UG93TGV2ZWwgKTsKLy8gICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInNob3J0UmV0cnlMaW1pdDogICAgMHglMDRYXG4iLCBscC0+c2hvcnRSZXRyeUxpbWl0ICk7Ci8vICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJsb25nUmV0cnlMaW1pdDogICAgIDB4JTA0WFxuIiwgbHAtPmxvbmdSZXRyeUxpbWl0ICk7Ci8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHNyc2NbMl07Ci8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGJyc2NbMl07CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiY29ubmVjdGlvbkNvbnRyb2w6ICAgIDB4JTA0WFxuIiwgbHAtPmNvbm5lY3Rpb25Db250cm9sICk7Ci8veAkJLy9oY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgcHJvYmVEYXRhUmF0ZXNbMl07CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwib3duQmVhY29uSW50ZXJ2YWw6ICAgIDB4JTA0WFxuIiwgbHAtPm93bkJlYWNvbkludGVydmFsICk7CiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiY29leGlzdGVuY2U6ICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmNvZXhpc3RlbmNlICk7Ci8veAkJV1ZMQU5fRlJBTUUgICAgICAgICAgICAgICAgICJ0eEY6ICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4RiApOwovL3gJCVdWTEFOX0xGUkFNRSAgICAgICAgICAgICAgICB0eExpc3RbREVGQVVMVF9OVU1fVFhfRlJBTUVTXTsKLy94CQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgInR4RnJlZTogICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhGcmVlICk7Ci8veAkJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIHR4UVtXVkxBTl9NQVhfVFhfUVVFVUVTXTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJuZXRpZl9xdWV1ZV9vbjogICAgICAgMHglMDRYXG4iLCBscC0+bmV0aWZfcXVldWVfb24gKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ0eFFfY291bnQ6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhRX2NvdW50ICk7Ci8veAkJREVTQ19TVFJDVCAgICAgICAgICAgICAgICAgICJkZXNjX3J4OiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRlc2NfcnggKTsKLy94CQlERVNDX1NUUkNUICAgICAgICAgICAgICAgICAgImRlc2NfdHg6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+ZGVzY190eCApOwovL3gJCVdWTEFOX1BPUlRfU1RBVEUgICAgICAgICAgICAicG9ydFN0YXRlOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT5wb3J0U3RhdGUgKTsKLy94CQlTY2FuUmVzdWx0ICAgICAgICAgICAgICAgICAgInNjYW5fcmVzdWx0czogICAgICAgMHglMDRYXG4iLCBscC0+c2Nhbl9yZXN1bHRzICk7Ci8veAkJUHJvYmVSZXN1bHQgICAgICAgICAgICAgICAgICJwcm9iZV9yZXN1bHRzOiAgICAgIDB4JTA0WFxuIiwgbHAtPnByb2JlX3Jlc3VsdHMgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJwcm9iZV9udW1fYXBzOiAgICAgICAgMHglMDRYXG4iLCBscC0+cHJvYmVfbnVtX2FwcyApOwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInVzZV9kbWE6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT51c2VfZG1hICk7Ci8veAkJRE1BX1NUUkNUICAgICAgICAgICAgICAgICAgICJkbWE6ICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRtYSApOwojaWZkZWYgVVNFX1JUUwogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInVzZVJUUzogICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT51c2VSVFMgKTsKI2VuZGlmICAvLyBVU0VfUlRTCiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CgkJLy87P0kgZ3Vlc3Mgbm90LiBUaGlzIHNob3VsZCBiZSBicm91Z2h0IHVuZGVyIERlYnVnIG1vZGUgb25seQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRUSU1QZXJpb2Q6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5EVElNUGVyaW9kICk7ICAgICAgICAgLy8gMSAtIDI1NSAoMSkKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJtdWx0aWNhc3RQTUJ1ZmZlcmluZzogMHglMDRYXG4iLCBscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSZWplY3RBbnk6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+UmVqZWN0QW55ICk7ICAgICAgICAgIC8vIDAgLSAxICgwKQogICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkV4Y2x1ZGVVbmVuY3J5cHRlZDogICAweCUwNFhcbiIsIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgKTsgLy8gMCAtIDEgKDEpCiAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiaW50cmFCU1NSZWxheTogICAgICAgIDB4JTA0WFxuIiwgbHAtPmludHJhQlNTUmVsYXkgKTsKICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ3bGFnczQ5X3R5cGU6ICAgICAgICAgICAgIDB4JTA4bFhcbiIsIGxwLT53bGFnczQ5X3R5cGUgKTsKI2lmZGVmIFVTRV9XRFMKLy94CQlXVkxBTl9XRFNfSUYgICAgICAgICAgICAgICAgd2RzX3BvcnRbTlVNX1dEU19QT1JUU107CiNlbmRpZiAvLyBVU0VfV0RTCiNlbmRpZiAvLyBIQ0ZfQVAKCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgPT0gMiApewogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInRhbGxpZXMgdG8gYmUgYWRkZWRcbiIgKTsKLy9IZXJtZXMgVGFsbGllcyAoSUZCIHN1YnN0cnVjdHVyZSkgewogICAJICAgIHAgPSAmbHAtPmhjZkN0eC5JRkJfTklDX1RhbGxpZXM7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhVbmljYXN0RnJhbWVzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+VHhVbmljYXN0RnJhbWVzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAlMDhsWFxuIiwgcC0+VHhNdWx0aWNhc3RGcmFtZXMgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeEZyYWdtZW50czogICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5UeEZyYWdtZW50cyApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4VW5pY2FzdE9jdGV0czogICAgICAgICAgJTA4bFhcbiIsIHAtPlR4VW5pY2FzdE9jdGV0cyApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgJTA4bFhcbiIsIHAtPlR4TXVsdGljYXN0T2N0ZXRzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM6ICAlMDhsWFxuIiwgcC0+VHhEZWZlcnJlZFRyYW5zbWlzc2lvbnMgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFNpbmdsZVJldHJ5RnJhbWVzOiAgICAgICUwOGxYXG4iLCBwLT5UeFNpbmdsZVJldHJ5RnJhbWVzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhNdWx0aXBsZVJldHJ5RnJhbWVzOiAgICAlMDhsWFxuIiwgcC0+VHhNdWx0aXBsZVJldHJ5RnJhbWVzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhSZXRyeUxpbWl0RXhjZWVkZWQ6ICAgICAlMDhsWFxuIiwgcC0+VHhSZXRyeUxpbWl0RXhjZWVkZWQgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeERpc2NhcmRzOiAgICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5UeERpc2NhcmRzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhVbmljYXN0RnJhbWVzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhVbmljYXN0RnJhbWVzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAlMDhsWFxuIiwgcC0+UnhNdWx0aWNhc3RGcmFtZXMgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeEZyYWdtZW50czogICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5SeEZyYWdtZW50cyApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4VW5pY2FzdE9jdGV0czogICAgICAgICAgJTA4bFhcbiIsIHAtPlJ4VW5pY2FzdE9jdGV0cyApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgJTA4bFhcbiIsIHAtPlJ4TXVsdGljYXN0T2N0ZXRzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhGQ1NFcnJvcnM6ICAgICAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhGQ1NFcnJvcnMgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeERpc2NhcmRzTm9CdWZmZXI6ICAgICAgICUwOGxYXG4iLCBwLT5SeERpc2NhcmRzTm9CdWZmZXIgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeERpc2NhcmRzV3JvbmdTQTogICAgICAgICUwOGxYXG4iLCBwLT5UeERpc2NhcmRzV3JvbmdTQSApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4V0VQVW5kZWNyeXB0YWJsZTogICAgICAgJTA4bFhcbiIsIHAtPlJ4V0VQVW5kZWNyeXB0YWJsZSApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXNnSW5Nc2dGcmFnbWVudHM6ICAgICAgJTA4bFhcbiIsIHAtPlJ4TXNnSW5Nc2dGcmFnbWVudHMgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOiAgICUwOGxYXG4iLCBwLT5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhEaXNjYXJkc1dFUElDVkVycm9yOiAgICAlMDhsWFxuIiwgcC0+UnhEaXNjYXJkc1dFUElDVkVycm9yICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkOiAgICAlMDhsWFxuIiwgcC0+UnhEaXNjYXJkc1dFUEV4Y2x1ZGVkICk7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX1RBTExJRVNfRlcKICAgICAgICAvL3RvIGJlIGFkZGVkIDs/CiNlbmRpZiAvLyBIQ0ZfRVhUX1RBTExJRVNfRlcKCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgJiAweDgwMDAgKSB7CS8vOz9rbHVkZ3kgYnV0IGl0IGlzIHVuY2xlYXIgdG8gbWUgd2VyZSBlbHNlIHRvIHBsYWNlIHRoaXMKI2lmIERCRwoJCURiZ0luZm8tPkRlYnVnRmxhZyA9IGxwLT53bGFnczQ5X3R5cGUgJiAweDdGRkY7CiNlbmRpZiAvLyBEQkcKCQlscC0+d2xhZ3M0OV90eXBlID0gMDsJCQkJLy9kZWZhdWx0IHRvIElGQiBhZ2FpbiA7PwoJfSBlbHNlIHsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ1bmtub3duIHZhbHVlIGZvciB3bGFnczQ5X3R5cGU6IDB4JTA4bFhcbiIsIGxwLT53bGFnczQ5X3R5cGUgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDAwMDAgLSBJRkJcbiIgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDAwMDEgLSB3bF9wcml2YXRlXG4iICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiMHgwMDAyIC0gVGFsbGllc1xuIiApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjB4OHh4eCAtIENoYW5nZSBkZWJ1ZmZsYWdcbiIgKTsKICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJFUlJPUiAgICAwMDAxXG5XQVJOSU5HICAwMDAyXG5OT1RJQ0UgICAwMDA0XG5UUkFDRSAgICAwMDA4XG4iICk7CiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVkVSQk9TRSAgMDAxMFxuUEFSQU0gICAgMDAyMFxuQlJFQUsgICAgMDA0MFxuUlggICAgICAgMDEwMFxuIiApOwogICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRYICAgICAgIDAyMDBcbkRTICAgICAgIDA0MDBcbiIgKTsKCX0KICAgIHJldHVybiBsZW47Cn0gLy8gc2N1bGxfcmVhZF9wcm9jbWVtCgpzdGF0aWMgdm9pZCBwcm9jX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSkKewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lGUkVHIHwgU19JV1VTUiwgTlVMTCk7CglpZiAoZW50cnkpIHsKCQllbnRyeS0+d3JpdGVfcHJvYyA9IHc7CgkJZW50cnktPmRhdGEgPSBkYXRhOwoJfQp9IC8vIHByb2Nfd3JpdGUKCnN0YXRpYyBpbnQgd3JpdGVfaW50KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCXN0YXRpYyBjaGFyCQlwcm9jX251bWJlclsxMV07Cgl1bnNpZ25lZCBpbnQJbnIgPSAwOwoKCURCR19GVU5DKCAid3JpdGVfaW50IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYgKGNvdW50ID4gOSkgewoJCWNvdW50ID0gLUVJTlZBTDsKCX0gZWxzZSBpZiAoIGNvcHlfZnJvbV91c2VyKHByb2NfbnVtYmVyLCBidWZmZXIsIGNvdW50KSApIHsKCQljb3VudCA9IC1FRkFVTFQ7Cgl9CglpZiAgKGNvdW50ID4gMCApIHsKCQlwcm9jX251bWJlcltjb3VudF0gPSAwOwoJCW5yID0gc2ltcGxlX3N0cnRvdWwocHJvY19udW1iZXIgLCBOVUxMLCAwKTsKIAkJKih1bnNpZ25lZCBpbnQgKilkYXRhID0gbnI7CgkJaWYgKCBuciAmIDB4ODAwMCApIHsJLy87P2tsdWRneSBidXQgaXQgaXMgdW5jbGVhciB0byBtZSB3ZXJlIGVsc2UgdG8gcGxhY2UgdGhpcwojaWYgREJHCgkJCURiZ0luZm8tPkRlYnVnRmxhZyA9IG5yICYgMHg3RkZGOwojZW5kaWYgLy8gREJHCgkJfQoJfQoJREJHX1BSSU5UKCAidmFsdWU6ICUwOFhcbiIsIG5yICk7CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiBjb3VudDsKfSAvLyB3cml0ZV9pbnQKCiNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLwoKI2lmZGVmIERONTU0CiNkZWZpbmUgUlVOX0FUKHgpCQkoamlmZmllcysoeCkpCQkvLyJib3Jyb3dlZCIgZnJvbSBpbmNsdWRlL3BjbWNpYS9rX2NvbXBhdC5oCiNkZWZpbmUgRFNfT09SCTB4ODAwMAkJLy9EZWVwc2xlZXAgT3V0T2ZSYW5nZSBTdGF0dXMKCgkJbHAtPnRpbWVyX29vcl9jbnQgPSBEU19PT1I7CgkJaW5pdF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKCQlscC0+dGltZXJfb29yLmZ1bmN0aW9uID0gdGltZXJfb29yOwoJCWxwLT50aW1lcl9vb3IuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWxwOwoJCWxwLT50aW1lcl9vb3IuZXhwaXJlcyA9IFJVTl9BVCggMyAqIEhaICk7CgkJYWRkX3RpbWVyKCAmbHAtPnRpbWVyX29vciApOwoJCXByaW50ayggIjw1PndsX2VuYWJsZTogJWxkXG4iLCBqaWZmaWVzICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CiNlbmRpZiAvL0RONTU0CiNpZmRlZiBETjU1NAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl0aW1lcl9vb3IoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGFyZyAtIGEgdV9sb25nIHJlcHJlc2VudGluZyBhIHBvaW50ZXIgdG8gYSBkZXZfbGlua190IHN0cnVjdHVyZSBmb3IgdGhlCiAqICAgICAgICAgICAgZGV2aWNlIHRvIGJlIHJlbGVhc2VkLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB0aW1lcl9vb3IoIHVfbG9uZyBhcmcgKQp7CglzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilhcmc7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAidGltZXJfb29yIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJhcmciLCAiMHglMDhseCIsIGFyZyApOwoKCXByaW50ayggIjw1PnRpbWVyX29vcjogJWxkIDB4JTA0WFxuIiwgamlmZmllcywgbHAtPnRpbWVyX29vcl9jbnQgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKCWxwLT50aW1lcl9vb3JfY250ICs9IDEwOwogICAgaWYgKCAobHAtPnRpbWVyX29vcl9jbnQgJiB+RFNfT09SKSA+IDMwMCApIHsKCQlscC0+dGltZXJfb29yX2NudCA9IDMwMDsKCX0KCWxwLT50aW1lcl9vb3JfY250IHw9IERTX09PUjsKCWluaXRfdGltZXIoICZscC0+dGltZXJfb29yICk7CglscC0+dGltZXJfb29yLmZ1bmN0aW9uID0gdGltZXJfb29yOwoJbHAtPnRpbWVyX29vci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbHA7CglscC0+dGltZXJfb29yLmV4cGlyZXMgPSBSVU5fQVQoIChscC0+dGltZXJfb29yX2NudCAmIH5EU19PT1IpICogSFogKTsKCWFkZF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyB0aW1lcl9vb3IKI2VuZGlmIC8vRE41NTQKCk1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsK