Ly8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiNpbmNsdWRlICJEaXJlY3QzRDkuaHBwIgoKI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCiNpbmNsdWRlICJDYXBhYmlsaXRpZXMuaHBwIgojaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKI2luY2x1ZGUgIkRlYnVnLmhwcCIKI2luY2x1ZGUgIkNQVUlELmhwcCIKI2luY2x1ZGUgIlZlcnNpb24uaCIKI2luY2x1ZGUgIkNvbmZpZy5ocHAiCgojZGVmaW5lIENPTVBJTEVfTVVMVElNT05fU1RVQlMKI2luY2x1ZGUgPG11bHRpbW9uLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHBzYXBpLmg+CgpuYW1lc3BhY2UgRDNEOQp7CglEaXJlY3QzRDk6OkRpcmVjdDNEOShpbnQgdmVyc2lvbiwgY29uc3QgSElOU1RBTkNFIGluc3RhbmNlKSA6IHZlcnNpb24odmVyc2lvbiksIGluc3RhbmNlKGluc3RhbmNlKQoJewoJCWRpc3BsYXlNb2RlID0gMDsKCQludW1EaXNwbGF5TW9kZXMgPSAwOwoKCQlERVZNT0RFIGRldm1vZGU7CgkJZGV2bW9kZS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CgoJCS8vIENvdW50IG51bWJlciBvZiBkaXNwbGF5IG1vZGVzCgkJd2hpbGUoRW51bURpc3BsYXlTZXR0aW5ncygwLCBudW1EaXNwbGF5TW9kZXMsICZkZXZtb2RlKSkgICAvLyBGSVhNRTogT25seSBlbnVtYXJhdGUgaW50ZXJuYWwgbW9kZXMhCgkJewoJCQludW1EaXNwbGF5TW9kZXMrKzsKCQl9CgoJCWRpc3BsYXlNb2RlID0gbmV3IERFVk1PREVbbnVtRGlzcGxheU1vZGVzXTsKCgkJLy8gU3RvcmUgZGlzcGxheSBtb2RlcyBpbmZvcm1hdGlvbgoJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1EaXNwbGF5TW9kZXM7IGkrKykKCQl7CgkJCWRpc3BsYXlNb2RlW2ldLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKCQkJRW51bURpc3BsYXlTZXR0aW5ncygwLCBpLCAmZGlzcGxheU1vZGVbaV0pOwoJCX0KCgkJZDNkOUxpYiA9IDA7CgkJZDNkOSA9IDA7CgoJCXN3OjpDb25maWd1cmF0b3IgaW5pKCJTd2lmdFNoYWRlci5pbmkiKTsKCgkJZGlzYWJsZUFscGhhTW9kZSA9IGluaS5nZXRCb29sZWFuKCJUZXN0aW5nIiwgIkRpc2FibGVBbHBoYU1vZGUiLCBmYWxzZSk7CgkJZGlzYWJsZTEwQml0TW9kZSA9IGluaS5nZXRCb29sZWFuKCJUZXN0aW5nIiwgIkRpc2FibGUxMEJpdE1vZGUiLCBmYWxzZSk7CgoJCWludCBwcyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMzApOwoJCWludCB2cyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiVmVydGV4U2hhZGVyVmVyc2lvbiIsIDMwKTsKCgkJICAgICBpZihwcyA9PSAgMCkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMCwgMCk7CgkJZWxzZSBpZihwcyA8PSAxMSkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgMSk7CgkJZWxzZSBpZihwcyA8PSAxMikgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgMik7CgkJZWxzZSBpZihwcyA8PSAxMykgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgMyk7CgkJZWxzZSBpZihwcyA8PSAxNCkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgNCk7CgkJZWxzZSBpZihwcyA8PSAyMCkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMiwgMCk7CgkJZWxzZSBpZihwcyA8PSAyMSkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMiwgMSk7CgkJZWxzZSAgICAgICAgICAgICAgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMywgMCk7CgoJCSAgICAgaWYodnMgPT0gIDApIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigwLCAwKTsKCQllbHNlIGlmKHZzIDw9IDExKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMSwgMSk7CgkJZWxzZSBpZih2cyA8PSAyMCkgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDIsIDApOwoJCWVsc2UgaWYodnMgPD0gMjEpIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigyLCAxKTsKCQllbHNlICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMywgMCk7CgoJCXBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZSA9IDA7CgkJcGl4ZWxTaGFkZXJHcmFkaWVudEluc3RydWN0aW9ucyA9IDA7CgkJcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiA9IDA7CgkJcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCA9IDA7CgkJcGl4ZWxTaGFkZXJOb1RleEluc3RydWN0aW9uTGltaXQgPSAwOwoKCQlwaXhlbFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NSU5fRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEg7CgkJcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NSU5fU1RBVElDRkxPV0NPTlRST0xERVBUSDsKCgkJaWYocHMgPj0gMjEpCgkJewoJCQlwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgPSBEM0RQUzIwQ0FQU19BUkJJVFJBUllTV0laWkxFOwoJCQlwaXhlbFNoYWRlckdyYWRpZW50SW5zdHJ1Y3Rpb25zID0gRDNEUFMyMENBUFNfR1JBRElFTlRJTlNUUlVDVElPTlM7CgkJCXBpeGVsU2hhZGVyUHJlZGljYXRpb24gPSBEM0RQUzIwQ0FQU19QUkVESUNBVElPTjsKCQkJcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCA9IEQzRFBTMjBDQVBTX05PREVQRU5ERU5UUkVBRExJTUlUOwoJCQlwaXhlbFNoYWRlck5vVGV4SW5zdHJ1Y3Rpb25MaW1pdCA9IEQzRFBTMjBDQVBTX05PVEVYSU5TVFJVQ1RJT05MSU1JVDsKCgkJCXBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKCQkJcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSDsKCQl9CgoJCXZlcnRleFNoYWRlclByZWRpY2F0aW9uID0gMDsKCQl2ZXJ0ZXhTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IDA7CgoJCWlmKHZzID49IDIxKQoJCXsKCQkJdmVydGV4U2hhZGVyUHJlZGljYXRpb24gPSBEM0RWUzIwQ0FQU19QUkVESUNBVElPTjsKCQkJdmVydGV4U2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RWUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKCQl9CgoJCXRleHR1cmVNZW1vcnkgPSAxMDI0ICogMTAyNCAqIGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiVGV4dHVyZU1lbW9yeSIsIDI1Nik7CgoJCWludCBzaGFkb3dNYXBwaW5nID0gaW5pLmdldEludGVnZXIoIlRlc3RpbmciLCAiU2hhZG93TWFwcGluZyIsIDMpOwoKCQlpZihzaGFkb3dNYXBwaW5nICE9IDIgJiYgc2hhZG93TWFwcGluZyAhPSAzKSAgIC8vIE5vIERTVCBzdXBwb3J0CgkJewoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0WDggPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQxNiA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0RlM4ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFID0gZmFsc2U7CgoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMiA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFM4ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0WDggPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMTYgPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRGUzggPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzJGX0xPQ0tBQkxFID0gZmFsc2U7CgkJfQoKCQlpZihzaGFkb3dNYXBwaW5nICE9IDEgJiYgc2hhZG93TWFwcGluZyAhPSAzKSAgIC8vIE5vIEZldGNoNCBzdXBwb3J0CgkJewoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYyNCA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYxNiA9IGZhbHNlOwoKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjI0ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6REYxNiA9IGZhbHNlOwoJCX0KCX0KCglEaXJlY3QzRDk6On5EaXJlY3QzRDkoKQoJewoJCWRlbGV0ZVtdIGRpc3BsYXlNb2RlOwoJCWRpc3BsYXlNb2RlID0gMDsKCgkJaWYoZDNkOSkKCQl7CgkJCWQzZDktPlJlbGVhc2UoKTsKCQkJZDNkOSA9IDA7CgkJfQoKCQlpZihkM2Q5TGliKQoJCXsKCQkJRnJlZUxpYnJhcnkoZDNkOUxpYik7CgkJCWQzZDlMaWIgPSAwOwoJCX0KCX0KCglsb25nIERpcmVjdDNEOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCgl7CgkJVFJBQ0UoImNvbnN0IElJRCAmaWlkID0gMHglMC44cCwgdm9pZCAqKm9iamVjdCA9IDB4JTAuOHAiLCBpaWQsIG9iamVjdCk7CgoJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEOSB8fAoJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCgkJewoJCQlBZGRSZWYoKTsKCQkJKm9iamVjdCA9IHRoaXM7CgoJCQlyZXR1cm4gU19PSzsKCQl9CgoJCSpvYmplY3QgPSAwOwoKCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKCX0KCgl1bnNpZ25lZCBsb25nIERpcmVjdDNEOTo6QWRkUmVmKCkKCXsKCQlUUkFDRSgidm9pZCIpOwoKCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Cgl9CgoJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDk6OlJlbGVhc2UoKQoJewoJCVRSQUNFKCJ2b2lkIik7CgoJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2godW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0ID0gJWQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHJlbmRlclRhcmdldEZvcm1hdCwgZGVwdGhTdGVuY2lsRm9ybWF0KTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gRDNEX09LOyAgIC8vIEFueSBmb3JtYXQgY29tYmluYXRpb24gaXMgb2sKCX0KCglsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0ID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNEUkVTT1VSQ0VUWVBFIHJlc291cmNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7CgkJCX0KCQl9CgoJCWlmKHVzYWdlICYgRDNEVVNBR0VfUVVFUllfU1JHQlJFQUQpCgkJewoJCQlpZighQ2FwYWJpbGl0aWVzOjppc1NSR0JyZWFkYWJsZShjaGVja0Zvcm1hdCkpCgkJCXsKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCX0KCgkJaWYodXNhZ2UgJiBEM0RVU0FHRV9RVUVSWV9TUkdCV1JJVEUpCgkJewoJCQlpZighQ2FwYWJpbGl0aWVzOjppc1NSR0J3cml0YWJsZShjaGVja0Zvcm1hdCkpCgkJCXsKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCX0KCgkJLy8gQVRJIGhhY2sgdG8gaW5kaWNhdGUgaW5zdGFuY2luZyBzdXBwb3J0IG9uIFNNIDIuMCBoYXJkd2FyZQoJCWlmKGNoZWNrRm9ybWF0ID09IEQzREZNVF9JTlNUICYmIHBpeGVsU2hhZGVyVmVyc2lvblggPj0gRDNEUFNfVkVSU0lPTigyLCAwKSAmJiBwaXhlbFNoYWRlclZlcnNpb25YIDwgRDNEUFNfVkVSU0lPTigzLCAwKSkKCQl7CgkJCXJldHVybiBEM0RfT0s7CgkJfQoKCQlzd2l0Y2gocmVzb3VyY2VUeXBlKQoJCXsKCQljYXNlIEQzRFJUWVBFX1NVUkZBQ0U6CgkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6TlVMTF8pCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyUjEwRzEwQjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIxNkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIzMkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6REYyNCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RGMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpERjE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlIxMEcxMEIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkExNkIxNkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0FUSTE6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRJMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0FUSTI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRJMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2RikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEzMkIzMkczMlIzMkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UTE2VzE2VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfTDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkwxNikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBEZXB0aCBCb3VuZHMgVGVzdAoJCQkJY2FzZSBEM0RGTVRfTlZEQjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpOVkRCKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gVHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKCQkJCWNhc2UgRDNERk1UX0FUT0M6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRPQykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQl9CgkJY2FzZSBEM0RSVFlQRV9WT0xVTUU6CgkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlgxUjVHNUI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExUjVHNUI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0UjRHNEI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg0UjRHNEI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4QjhHOFI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4QjhHOFI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1A4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExNkIxNkcxNlIxNikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfRFhUMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQxKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQzKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ1KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQVRJMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBVEkxKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQVRJMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBVEkyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9SMTZGOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIxNkYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTE2QjE2RzE2UjE2RikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1IzMkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjMyRikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpHMzJSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlY4VTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4TDhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlE4VzhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUTE2VzE2VjE2VTE2OgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpRMTZXMTZWMTZVMTYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNEw0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfTDE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkwxNikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4TDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQljYXNlIEQzRFJUWVBFX0NVQkVURVhUVVJFOgoJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfTlVMTDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Ok5VTExfKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThCOEc4UjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzE2UjE2KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2KQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzE2UjE2RikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzMyUjMyRikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0RlM4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkRGMjQpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6REYxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0lOVFo6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpJTlRaKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9BODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjNHM0IyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UDg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThQOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJSMTBHMTBCMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMTZCMTZHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQzOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDMpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BVEkxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkFUSTEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BVEkyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkFUSTIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlIxNkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4TDhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlExNlcxNlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfTDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0wxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThMODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEw4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6CgkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjVHNkI1KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDFSNUc1QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0UjRHNEI0KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSM0czQjIpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg0UjRHNEI0KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjhHOEI4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhCOEc4UjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEI4RzhSOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfUDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpQOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyUjEwRzEwQjEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMTZCMTZHMTZSMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQxKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0RYVDI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMykJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQ0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0RYVDU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQVRJMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QVRJMSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BVEkyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBVEkyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjE2RikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTE2QjE2RzE2UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjMyRikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkczMlIzMkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTMyQjMyRzMyUjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDZWNVU1KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhMOFY4VTgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpROFc4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMlcxMFYxMFUxMCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUTE2VzE2VjE2VTE2OgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UTE2VzE2VjE2VTE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9MODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfTDE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMMTYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThMOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJY2FzZSBEM0RSVFlQRV9URVhUVVJFOgoJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfTlVMTDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Ok5VTExfKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThCOEc4UjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzE2UjE2KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2KQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzE2UjE2RikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzMyUjMyRikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0RlM4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkRGMjQpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0lOVFo6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpJTlRaKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Ok5VTExfKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSNUc2QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFA4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTE2QjE2RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRFhUMToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQVRJMToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQVRJMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkcxNlIxNkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMzJSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUTE2VzE2VjE2VTE2OglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpRMTZXMTZWMTZVMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNEw0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE0TDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIERlcHRoIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzIpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0UzgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRYOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNEZTOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMkZfTE9DS0FCTEUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpJTlRaKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQljYXNlIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjoKCQkJaWYoY2hlY2tGb3JtYXQgPT0gRDNERk1UX1ZFUlRFWERBVEEpCgkJCXsKCQkJCXJldHVybiBEM0RfT0s7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQljYXNlIEQzRFJUWVBFX0lOREVYQlVGRkVSOgoJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKCQkJY2FzZSBEM0RGTVRfSU5ERVgzMjoKCQkJCXJldHVybiBEM0RfT0s7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX07CgkJZGVmYXVsdDoKCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCX0KCX0KCglsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgc291cmNlRm9ybWF0ID0gJWQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKGFkYXB0ZXIsIGRldmljZVR5cGUsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24oYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKCQkJfQoJCX0KCgkJcmV0dXJuIEQzRF9PSzsKCX0KCglsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCA9ICVkLCBpbnQgd2luZG93ZWQgPSAlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqcXVhbGl0eUxldmVscyA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOwoJCQl9CgkJfQoKCQlpZihhZGFwdGVyID49IEdldEFkYXB0ZXJDb3VudCgpKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlpZihxdWFsaXR5TGV2ZWxzKQoJCXsKCQkJaWYobXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFX05PTk1BU0tBQkxFKQoJCQl7CgkJCQkqcXVhbGl0eUxldmVscyA9IDQ7ICAgLy8gMiwgNCwgOCwgMTYgc2FtcGxlcwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJKnF1YWxpdHlMZXZlbHMgPSAxOwoJCQl9CgkJfQoKCQlpZihtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAoJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05NQVNLQUJMRSB8fAoJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV8yX1NBTVBMRVMgfHwKCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfNF9TQU1QTEVTIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzhfU0FNUExFUyB8fAoJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV8xNl9TQU1QTEVTKQoJCXsKCQkJaWYoQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIEQzRFJUWVBFX1NVUkZBQ0UsIHN1cmZhY2VGb3JtYXQpID09IEQzRF9PSyB8fAoJCQkgICBDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCwgRDNEUlRZUEVfU1VSRkFDRSwgc3VyZmFjZUZvcm1hdCkgPT0gRDNEX09LKQoJCQl7CgkJCQlpZihzdXJmYWNlRm9ybWF0ICE9IEQzREZNVF9EMzJGX0xPQ0tBQkxFICYmIHN1cmZhY2VGb3JtYXQgIT0gRDNERk1UX0QxNl9MT0NLQUJMRSkKCQkJCXsKCQkJCQlyZXR1cm4gRDNEX09LOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBjaGVja1R5cGUsIEQzREZPUk1BVCBkaXNwbGF5Rm9ybWF0LCBEM0RGT1JNQVQgYmFja0J1ZmZlckZvcm1hdCwgaW50IHdpbmRvd2VkKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGNoZWNrVHlwZSA9ICVkLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgYmFja0J1ZmZlckZvcm1hdCA9ICVkLCBpbnQgd2luZG93ZWQgPSAlZCIsIGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwoKCQlpZihjaGVja1R5cGUgIT0gRDNEREVWVFlQRV9IQUwpCgkJewoJCQlsb2FkU3lzdGVtRDNEOSgpOwoKCQkJaWYoZDNkOSkKCQkJewoJCQkJcmV0dXJuIGQzZDktPkNoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBjaGVja1R5cGUsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDaGVja0RldmljZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKCQkJfQoJCX0KCgkJaWYoYWRhcHRlciA+PSBHZXRBZGFwdGVyQ291bnQoKSkKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCgkJc3dpdGNoKGRpc3BsYXlGb3JtYXQpCgkJewoJCWNhc2UgRDNERk1UX1VOS05PV046CgkJCWlmKHdpbmRvd2VkID09IEZBTFNFKQoJCQl7CgkJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOgoJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgoJCQlpZihkaXNhYmxlMTBCaXRNb2RlKQoJCQl7CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQljYXNlIEQzREZNVF9YOFI4RzhCODoKCQljYXNlIEQzREZNVF9SNUc2QjU6CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQl9CgoJCWlmKHdpbmRvd2VkICE9IEZBTFNFKQoJCXsKCQkJc3dpdGNoKGJhY2tCdWZmZXJGb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CgkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgoJCQkJaWYoZGlzYWJsZTEwQml0TW9kZSkKCQkJCXsKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgoJCQkJaWYoZGlzYWJsZUFscGhhTW9kZSkKCQkJCXsKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCWNhc2UgRDNERk1UX1VOS05PV046CgkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgoJCQljYXNlIEQzREZNVF9SNUc2QjU6CgkJLy8JY2FzZSBEM0RGTVRfWDFSNUc1QjU6ICAgICAgLy8gRklYTUU6IFN1cHBvcnRlZCBieSBSRUYKCQkvLwljYXNlIEQzREZNVF9BMVI1RzVCNTogICAgICAvLyBGSVhNRTogU3VwcG9ydGVkIGJ5IFJFRgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJc3dpdGNoKGJhY2tCdWZmZXJGb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfVU5LTk9XTjoKCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CgkJCQlpZihkaXNhYmxlMTBCaXRNb2RlKQoJCQkJewoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CgkJCQlpZihkaXNhYmxlQWxwaGFNb2RlKQoJCQkJewoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIEQzRF9PSzsKCX0KCglsb25nIERpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgSFdORCBmb2N1c1dpbmRvdyA9ICVkLCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MgPSAweCUwLjhYLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzID0gMHglMC44cCwgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwoKCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQoJCXsKCQkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJCWlmKGQzZDkpCgkJCXsKCQkJCXJldHVybiBkM2Q5LT5DcmVhdGVEZXZpY2UoYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gQ3JlYXRlRGV2aWNlKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKCQkJfQoJCX0KCgkJaWYoIWZvY3VzV2luZG93IHx8ICFwcmVzZW50UGFyYW1ldGVycyB8fCAhcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCgkJewoJCQkqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAwOwoKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQkqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSBuZXcgRGlyZWN0M0REZXZpY2U5KGluc3RhbmNlLCB0aGlzLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMpOwoKCQlpZigqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCgkJewoJCQkoKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKS0+QWRkUmVmKCk7CgkJfQoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpFbnVtQWRhcHRlck1vZGVzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0LCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIHVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBEM0RESVNQTEFZTU9ERSAqbW9kZSA9IDB4JTAuOHAiLCBhZGFwdGVyLCBmb3JtYXQsIGluZGV4LCBtb2RlKTsKCgkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCXVuc2lnbmVkIGludCBicHAgPSAzMjsKCgkJc3dpdGNoKGZvcm1hdCkKCQl7CgkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlicHAgPSAxNjsgYnJlYWs7CgkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWJwcCA9IDMyOyBicmVhazsKCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWJwcCA9IDMyOyBicmVhazsKCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJYnBwID0gMTY7IGJyZWFrOwoJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJYnBwID0gMTY7IGJyZWFrOwoJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJYnBwID0gMzI7IGJyZWFrOwoJCWRlZmF1bHQ6IHJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCgkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQoJCXsKCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IGJwcCkKCQkJewoJCQkJaWYoaW5kZXgtLSA9PSAwKQoJCQkJewoJCQkJCW1vZGUtPldpZHRoID0gZGlzcGxheU1vZGVbaV0uZG1QZWxzV2lkdGg7CgkJCQkJbW9kZS0+SGVpZ2h0ID0gZGlzcGxheU1vZGVbaV0uZG1QZWxzSGVpZ2h0OwoJCQkJCW1vZGUtPlJlZnJlc2hSYXRlID0gZGlzcGxheU1vZGVbaV0uZG1EaXNwbGF5RnJlcXVlbmN5OwoJCQkJCW1vZGUtPkZvcm1hdCA9IGZvcm1hdDsKCgkJCQkJcmV0dXJuIEQzRF9PSzsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIElOVkFMSURDQUxMKCk7Cgl9CgoJdW5zaWduZWQgaW50IERpcmVjdDNEOTo6R2V0QWRhcHRlckNvdW50KCkKCXsKCQlUUkFDRSgidm9pZCIpOwoKCQlyZXR1cm4gMTsgICAvLyBTd2lmdFNoYWRlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGRpc3BsYXkgYWRhcHRlcnMKCX0KCglsb25nIERpcmVjdDNEOTo6R2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNERElTUExBWU1PREUgKm1vZGUgPSAweCUwLjhwIiwgYWRhcHRlciwgbW9kZSk7CgoJCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUIHx8ICFtb2RlKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlIREMgZGV2aWNlQ29udGV4dCA9IEdldERDKDApOwoKCQltb2RlLT5XaWR0aCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBIT1JaUkVTKTsKCQltb2RlLT5IZWlnaHQgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVkVSVFJFUyk7CgkJbW9kZS0+UmVmcmVzaFJhdGUgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVlJFRlJFU0gpOwoJCXVuc2lnbmVkIGludCBicHAgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgQklUU1BJWEVMKTsKCgkJUmVsZWFzZURDKDAsIGRldmljZUNvbnRleHQpOwoKCQlicHAgPSAzMjsgICAvLyBGSVhNRQoKCQlzd2l0Y2goYnBwKQoJCXsKCQljYXNlIDMyOiBtb2RlLT5Gb3JtYXQgPSBEM0RGTVRfWDhSOEc4Qjg7IGJyZWFrOwoJCWNhc2UgMjQ6IG1vZGUtPkZvcm1hdCA9IEQzREZNVF9SOEc4Qjg7ICAgYnJlYWs7CgkJY2FzZSAxNjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I1RzZCNTsgICBicmVhazsKCQlkZWZhdWx0OgoJCQlBU1NFUlQoZmFsc2UpOyAgIC8vIFVuZXhwZWN0ZWQgZGlzcGxheSBtb2RlIGNvbG9yIGRlcHRoCgkJfQoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpHZXRBZGFwdGVySWRlbnRpZmllcih1bnNpZ25lZCBpbnQgYWRhcHRlciwgdW5zaWduZWQgbG9uZyBmbGFncywgRDNEQURBUFRFUl9JREVOVElGSUVSOSAqaWRlbnRpZmllcikKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIEQzREFEQVBURVJfSURFTlRJRklFUjkgKmlkZW50aWZpZXIgPSAweCUwLjhwIiwgYWRhcHRlciwgZmxhZ3MsIGlkZW50aWZpZXIpOwoKCQlpZighaWRlbnRpZmllcikKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCgkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOwoJCWludCBpZCA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiSWRlbnRpZmllciIsIDApOwoKCQlpZihpZCA9PSAxKQoJCXsKCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDY7CgkJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAxNDsKCQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDEwOwoJCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDg0NDA7CgkJCUdVSUQgZ3VpZCA9IHsweEQ3QjcxRTNFLCAweDQxRDIsIDB4MTFDRiwgezB4OTYsIDB4NTMsIDB4N0EsIDB4MjMsIDB4MDAsIDB4QzIsIDB4Q0IsIDB4MzV9fTsKCgkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uSGlnaFBhcnQgPSBwcm9kdWN0IDw8IDE2IHwgdmVyc2lvbjsKCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAibnY0X2Rpc3AuZGxsIik7CgkJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIk5WSURJQSBHZUZvcmNlIDc5MDAgR1MiKTsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKCQkJaWRlbnRpZmllci0+VmVuZG9ySWQgPSAweDEwREU7CgkJCWlkZW50aWZpZXItPkRldmljZUlkID0gMHgwMjkyOwoJCQlpZGVudGlmaWVyLT5TdWJTeXNJZCA9IDB4MDM3MDEwREU7CgkJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMHgwMEExOwoJCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKCQkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMTsKCgkJCXJldHVybiBEM0RfT0s7CgkJfQoJCWVsc2UgaWYoaWQgPT0gMikKCQl7CgkJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSA3OwoJCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMTQ7CgkJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAxMDsKCQkJdW5zaWduZWQgc2hvcnQgcmV2aXNpb24gPSA0NjQ7CgkJCUdVSUQgZ3VpZCA9IHsweEQ3QjcxRUUyLCAweDMyODUsIDB4MTFDRiwgezB4MTEsIDB4NzIsIDB4MEQsIDB4QTIsIDB4QTEsIDB4QzIsIDB4Q0EsIDB4MzV9fTsKCgkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uSGlnaFBhcnQgPSBwcm9kdWN0IDw8IDE2IHwgdmVyc2lvbjsKCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAiYXRpdW1kYWcuZGxsIik7CgkJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkFUSSBNb2JpbGl0eSBSYWRlb24gWDE2MDAiKTsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKCQkJaWRlbnRpZmllci0+VmVuZG9ySWQgPSAweDEwMDI7CgkJCWlkZW50aWZpZXItPkRldmljZUlkID0gMHg3MUM1OwoJCQlpZGVudGlmaWVyLT5TdWJTeXNJZCA9IDB4ODIwNzEwNzE7CgkJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMHgwMDAwOwoJCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKCQkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMTsKCgkJCXJldHVybiBEM0RfT0s7CgkJfQoJCWVsc2UgaWYoaWQgPT0gMykKCQl7CgkJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSA3OwoJCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMTQ7CgkJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAxMDsKCQkJdW5zaWduZWQgc2hvcnQgcmV2aXNpb24gPSAxNDM3OwoJCQlHVUlEIGd1aWQgPSB7MHhEN0I3OEU2NiwgMHg2OTQyLCAweDExQ0YsIHsweDA1LCAweDc2LCAweDAzLCAweDIyLCAweEFELCAweEMyLCAweENBLCAweDM1fX07CgoJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CgkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgImlnZHVtZDY0LmRsbCIpOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJJbnRlbCBHTUEgWDMxMDAiKTsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKCQkJaWRlbnRpZmllci0+VmVuZG9ySWQgPSAweDgwODY7CgkJCWlkZW50aWZpZXItPkRldmljZUlkID0gMHgyQTAyOwoJCQlpZGVudGlmaWVyLT5TdWJTeXNJZCA9IDB4MDIwOTEwMjg7CgkJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMHgwMDBDOwoJCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKCQkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMTsKCgkJCXJldHVybiBEM0RfT0s7CgkJfQoJCWVsc2UgaWYoaWQgPT0gNCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+R2V0QWRhcHRlcklkZW50aWZpZXIoYWRhcHRlciwgZmxhZ3MsIGlkZW50aWZpZXIpOwoJCQl9CgkJfQoKCQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0ID0gJ3N3JzsKCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMzsKCQl1bnNpZ25lZCBzaG9ydCBzdWJWZXJzaW9uID0gMDsKCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IEJVSUxEX1JFVklTSU9OOwoJCUdVSUQgZ3VpZCA9IHsweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKCgkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5IaWdoUGFydCA9IHByb2R1Y3QgPDwgMTYgfCB2ZXJzaW9uOwoJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAiU3dpZnRTaGFkZXIiKTsKCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJHb29nbGUgU3dpZnRTaGFkZXIgM0QgUmVuZGVyZXIiKTsKCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwoJCWlkZW50aWZpZXItPlZlbmRvcklkID0gMDsKCQlpZGVudGlmaWVyLT5EZXZpY2VJZCA9IDA7CgkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOwoJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMDsKCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOwoKCQljaGFyIGV4ZU5hbWVbTUFYX1BBVEggKyAxXTsKCQlpbnQgbiA9IEdldE1vZHVsZUJhc2VOYW1lKEdldEN1cnJlbnRQcm9jZXNzKCksIDAsIGV4ZU5hbWUsIE1BWF9QQVRIKTsKCQlleGVOYW1lW25dID0gJ1wwJzsKCgkJaWYoc3RybmNtcChleGVOYW1lLCAiRmFsbG91dCIsIDcpID09IDApCgkJewoJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAibnY0X2Rpc3AuZGxsIik7CgkJfQoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCXVuc2lnbmVkIGludCBEaXJlY3QzRDk6OkdldEFkYXB0ZXJNb2RlQ291bnQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzREZPUk1BVCBmb3JtYXQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGZvcm1hdCk7CgoJCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUKQoJCXsKCQkJcmV0dXJuIDA7CgkJfQoKCQlpbnQgbW9kZUNvdW50ID0gMDsKCgkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQoJCXsKCQkJc3dpdGNoKGZvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9BOFI4RzhCODoKCQkJCWlmKCFkaXNhYmxlQWxwaGFNb2RlKQoJCQkJewoJCQkJCWlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAzMikgbW9kZUNvdW50Kys7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6ICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAzMikgbW9kZUNvdW50Kys7IGJyZWFrOwoJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CgkJCQlpZighZGlzYWJsZTEwQml0TW9kZSkKCQkJCXsKCQkJCQlpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMzIpIG1vZGVDb3VudCsrOwoJCQkJfQoJCQkJYnJlYWs7CgkJLy8JY2FzZSBEM0RGTVRfUjhHOEI4OiAgICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAyNCkgbW9kZUNvdW50Kys7IGJyZWFrOyAgIC8vIE5PVEU6IERlcHJlY2F0ZWQgYnkgRGlyZWN0WCA5CgkJCWNhc2UgRDNERk1UX1I1RzZCNTogICAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMTYpIG1vZGVDb3VudCsrOyBicmVhazsKCQkvLwljYXNlIEQzREZNVF9YMVI1RzVCNTogICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDE2KSBtb2RlQ291bnQrKzsgYnJlYWs7CgkJLy8JY2FzZSBEM0RGTVRfQTFSNUc1QjU6ICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAxNikgbW9kZUNvdW50Kys7IGJyZWFrOwoJCS8vCWRlZmF1bHQ6CgkJLy8JCUFTU0VSVChmYWxzZSk7CgkJCX0KCQl9CgoJCXJldHVybiBtb2RlQ291bnQ7Cgl9CgoJSE1PTklUT1IgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyTW9uaXRvcih1bnNpZ25lZCBpbnQgYWRhcHRlcikKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCIsIGFkYXB0ZXIpOwoKCQlQT0lOVCBwb2ludCA9IHswLCAwfTsKCgkJcmV0dXJuIE1vbml0b3JGcm9tUG9pbnQocG9pbnQsIE1PTklUT1JfREVGQVVMVFRPUFJJTUFSWSk7ICAgLy8gRklYTUU6IElnbm9yZXMgYWRhcHRlciBwYXJhbWV0ZXIKCX0KCglsb25nIERpcmVjdDNEOTo6R2V0RGV2aWNlQ2Fwcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RDQVBTOSAqY2FwYWJpbGl0aWVzKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcyA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOwoKCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQoJCXsKCQkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJCWlmKGQzZDkpCgkJCXsKCQkJCXJldHVybiBkM2Q5LT5HZXREZXZpY2VDYXBzKGFkYXB0ZXIsIGRldmljZVR5cGUsIGNhcGFiaWxpdGllcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gR2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgY2FwYWJpbGl0aWVzKTsKCQkJfQoJCX0KCgkJaWYoIWNhcGFiaWxpdGllcykKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCgkJdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyVmVyc2lvbiA9IHBpeGVsU2hhZGVyVmVyc2lvblg7CgkJdW5zaWduZWQgaW50IHZlcnRleFNoYWRlclZlcnNpb24gPSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWDsKCgkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID09IEQzRFBTX1ZFUlNJT04oMiwgMSkpIHBpeGVsU2hhZGVyVmVyc2lvbiA9IEQzRFBTX1ZFUlNJT04oMiwgMCk7CgkJaWYodmVydGV4U2hhZGVyVmVyc2lvbiA9PSBEM0RWU19WRVJTSU9OKDIsIDEpKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigyLCAwKTsKCgkJdW5zaWduZWQgaW50IG1heGltdW1WZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7CgkJdW5zaWduZWQgaW50IG1heGltdW1QaXhlbFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gMDsKCQl1bnNpZ25lZCBpbnQgbWF4aW11bVZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDA7CgkJdW5zaWduZWQgaW50IG1heGltdW1QaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDA7CgoJCWlmKHZlcnRleFNoYWRlclZlcnNpb24gPj0gRDNEVlNfVkVSU0lPTigxLCAwKSkgbWF4aW11bVZlcnRleFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gMHhGRkZGRkZGRjsKCQlpZihwaXhlbFNoYWRlclZlcnNpb24gPj0gRDNEUFNfVkVSU0lPTigxLCAwKSkgbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAweEZGRkZGRkZGOwoJCWlmKHZlcnRleFNoYWRlclZlcnNpb24gPj0gRDNEVlNfVkVSU0lPTigzLCAwKSkgbWF4aW11bVZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDMyNzY4OwoJCWlmKHBpeGVsU2hhZGVyVmVyc2lvbiA+PSBEM0RQU19WRVJTSU9OKDMsIDApKSBtYXhpbXVtUGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAzMjc2ODsKCgkJRDNEQ0FQUzkgY2FwczsKCQlaZXJvTWVtb3J5KCZjYXBzLCBzaXplb2YoRDNEQ0FQUzkpKTsKCgkJLy8gRGV2aWNlIGluZm8KCQljYXBzLkRldmljZVR5cGUgPSBEM0RERVZUWVBFX0hBTDsKCQljYXBzLkFkYXB0ZXJPcmRpbmFsID0gRDNEQURBUFRFUl9ERUZBVUxUOwoKCQkvLyBDYXBzIGZyb20gRFg3CgkJY2Fwcy5DYXBzID0JRDNEQ0FQU19SRUFEX1NDQU5MSU5FOwoKCQljYXBzLkNhcHMyID0JCUQzRENBUFMyX0NBTkFVVE9HRU5NSVBNQVAgfAkJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyBtaXBtYXBzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEF1dG9tYXRpYyBHZW5lcmF0aW9uIG9mIE1pcG1hcHMgKERpcmVjdDNEIDkpLgoJCQkJCQkvLwlEM0RDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSB8CS8vIFRoZSBzeXN0ZW0gaGFzIGEgY2FsaWJyYXRvciBpbnN0YWxsZWQgdGhhdCBjYW4gYXV0b21hdGljYWxseSBhZGp1c3QgdGhlIGdhbW1hIHJhbXAgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGlkZW50aWNhbCBvbiBhbGwgc3lzdGVtcyB0aGF0IGhhdmUgYSBjYWxpYnJhdG9yLiBUbyBpbnZva2UgdGhlIGNhbGlicmF0b3Igd2hlbiBzZXR0aW5nIG5ldyBnYW1tYSBsZXZlbHMsIHVzZSB0aGUgRDNEU0dSX0NBTElCUkFURSBmbGFnIHdoZW4gY2FsbGluZyBTZXRHYW1tYVJhbXAuIENhbGlicmF0aW5nIGdhbW1hIHJhbXBzIGluY3VycyBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5LgoJCQkJCQkvLwlEM0RDQVBTMl9DQU5TSEFSRVJFU09VUkNFIHwJCS8vIFRoZSBkZXZpY2UgY2FuIGNyZWF0ZSBzaGFyYWJsZSByZXNvdXJjZXMuIE1ldGhvZHMgdGhhdCBjcmVhdGUgcmVzb3VyY2VzIGNhbiBzZXQgbm9uLU5VTEwgdmFsdWVzIGZvciB0aGVpciBwU2hhcmVkSGFuZGxlIHBhcmFtZXRlcnMuIERpZmZlcmVuY2VzIGJldHdlZW4gRGlyZWN0M0QgOSBhbmQgRGlyZWN0M0QgOUV4OlRoaXMgZmxhZyBpcyBhdmFpbGFibGUgaW4gRGlyZWN0M0QgOUV4IG9ubHkuCgkJCQkJCS8vCUQzRENBUFMyX0NBTk1BTkFHRVJFU09VUkNFIHwJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIG1hbmFnaW5nIHJlc291cmNlcy4gT24gc3VjaCBkcml2ZXJzLCBEM0RQT09MX01BTkFHRUQgcmVzb3VyY2VzIHdpbGwgYmUgbWFuYWdlZCBieSB0aGUgZHJpdmVyLiBUbyBoYXZlIERpcmVjdDNEIG92ZXJyaWRlIHRoZSBkcml2ZXIgc28gdGhhdCBEaXJlY3QzRCBtYW5hZ2VzIHJlc291cmNlcywgdXNlIHRoZSBEM0RDUkVBVEVfRElTQUJMRV9EUklWRVJfTUFOQUdFTUVOVCBmbGFnIHdoZW4gY2FsbGluZyBDcmVhdGVEZXZpY2UuCgkJCQkJCQlEM0RDQVBTMl9EWU5BTUlDVEVYVFVSRVMgfCAJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyB0ZXh0dXJlcy4KCQkJCQkJCUQzRENBUFMyX0ZVTExTQ1JFRU5HQU1NQTsJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyBnYW1tYSByYW1wIGFkanVzdG1lbnQgaW4gZnVsbC1zY3JlZW4gbW9kZS4KCgkJY2Fwcy5DYXBzMyA9CQlEM0RDQVBTM19BTFBIQV9GVUxMU0NSRUVOX0ZMSVBfT1JfRElTQ0FSRCB8CS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHJlc3BlY3QgdGhlIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUgcmVuZGVyIHN0YXRlIGluIGZ1bGwtc2NyZWVuIG1vZGUgd2hpbGUgdXNpbmcgdGhlIEZMSVAgb3IgRElTQ0FSRCBzd2FwIGVmZmVjdC4KCQkJCQkJCUQzRENBUFMzX0NPUFlfVE9fVklETUVNIHwJCQkJCS8vIERldmljZSBjYW4gYWNjZWxlcmF0ZSBhIG1lbW9yeSBjb3B5IGZyb20gc3lzdGVtIG1lbW9yeSB0byBsb2NhbCB2aWRlbyBtZW1vcnkuCgkJCQkJCQlEM0RDQVBTM19DT1BZX1RPX1NZU1RFTU1FTTsJCQkJCS8vIERldmljZSBjYW4gYWNjZWxlcmF0ZSBhIG1lbW9yeSBjb3B5IGZyb20gbG9jYWwgdmlkZW8gbWVtb3J5IHRvIHN5c3RlbSBtZW1vcnkuCgkJCQkJCS8vCUQzRENBUFMzX0xJTkVBUl9UT19TUkdCX1BSRVNFTlRBVElPTjsJCS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHBlcmZvcm0gZ2FtbWEgY29ycmVjdGlvbiBmcm9tIGEgd2luZG93ZWQgYmFjayBidWZmZXIgKGNvbnRhaW5pbmcgbGluZWFyIGNvbnRlbnQpIHRvIGFuIHNSR0IgZGVza3RvcC4KCgkJY2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPQkJRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgfAoJCQkJCQkJCQkJCUQzRFBSRVNFTlRfSU5URVJWQUxfT05FOwoJCQkJCQkJCQkJLy8JRDNEUFJFU0VOVF9JTlRFUlZBTF9UV087CgkJCQkJCQkJCQkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RIUkVFOwoJCQkJCQkJCQkJLy8JRDNEUFJFU0VOVF9JTlRFUlZBTF9GT1VSOwoKCQkvLyBDdXJzb3IgY2FwcwoJCWNhcHMuQ3Vyc29yQ2FwcyA9CUQzRENVUlNPUkNBUFNfQ09MT1IJfAkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhdCBsZWFzdCBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBoaWdoLXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNDAwKS4KCQkJCQkJCUQzRENVUlNPUkNBUFNfTE9XUkVTOwkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBib3RoIGhpZ2gtcmVzb2x1dGlvbiBhbmQgbG93LXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBsZXNzIHRoYW4gNDAwKS4KCgkJLy8gM0QgRGV2aWNlIGNhcHMKCQljYXBzLkRldkNhcHMgPQkJRDNEREVWQ0FQU19DQU5CTFRTWVNUT05PTkxPQ0FMIHwJCS8vIERldmljZSBzdXBwb3J0cyBibGl0cyBmcm9tIHN5c3RlbS1tZW1vcnkgdGV4dHVyZXMgdG8gbm9ubG9jYWwgdmlkZW8tbWVtb3J5IHRleHR1cmVzLgoJCQkJCQkJRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgfAkJCS8vIERldmljZSBjYW4gcXVldWUgcmVuZGVyaW5nIGNvbW1hbmRzIGFmdGVyIGEgcGFnZSBmbGlwLiBBcHBsaWNhdGlvbnMgZG8gbm90IGNoYW5nZSB0aGVpciBiZWhhdmlvciBpZiB0aGlzIGZsYWcgaXMgc2V0OyB0aGlzIGNhcGFiaWxpdHkgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIHJlbGF0aXZlbHkgZmFzdC4KCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyIHwJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgRHJhd1ByaW1pdGl2ZXMyLgoJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzJFWCB8CQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGV4dGVuZGVkIERyYXdQcmltaXRpdmVzMjsgdGhhdCBpcywgdGhpcyBpcyBhIERpcmVjdFggNy4wLWNvbXBsaWFudCBkcml2ZXIuCgkJCQkJCQlEM0RERVZDQVBTX0RSQVdQUklNVExWRVJURVggfAkJCS8vIERldmljZSBleHBvcnRzIGFuIElEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmUtYXdhcmUgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIgKEhBTCkuCgkJCQkJCQlEM0RERVZDQVBTX0VYRUNVVEVTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiB1c2UgZXhlY3V0ZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeS4KCQkJCQkJCUQzRERFVkNBUFNfRVhFQ1VURVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSB2aWRlbyBtZW1vcnkuCgkJCQkJCQlEM0RERVZDQVBTX0hXUkFTVEVSSVpBVElPTiB8CQkJLy8gRGV2aWNlIGhhcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZm9yIHNjZW5lIHJhc3Rlcml6YXRpb24uCgkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4KCQkJCQkJLy8JRDNEREVWQ0FQU19OUEFUQ0hFUyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgTiBwYXRjaGVzLgoJCQkJCQkJRDNEREVWQ0FQU19QVVJFREVWSUNFIHwJCQkJCS8vIERldmljZSBjYW4gc3VwcG9ydCByYXN0ZXJpemF0aW9uLCB0cmFuc2Zvcm0sIGxpZ2h0aW5nLCBhbmQgc2hhZGluZyBpbiBoYXJkd2FyZS4KCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuCgkJCQkJCS8vCUQzRERFVkNBUFNfUlRQQVRDSEVTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyByZWN0YW5ndWxhciBhbmQgdHJpYW5ndWxhciBwYXRjaGVzLgoJCQkJCQkJRDNEREVWQ0FQU19SVFBBVENISEFORExFWkVSTyB8CQkJLy8gV2hlbiB0aGlzIGRldmljZSBjYXBhYmlsaXR5IGlzIHNldCwgdGhlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNhY2hpbmcgb2YgYW55IGluZm9ybWF0aW9uIGFuZCB1bmNhY2hlZCBwYXRjaGVzIChoYW5kbGUgemVybykgd2lsbCBiZSBkcmF3biBhcyBlZmZpY2llbnRseSBhcyBjYWNoZWQgb25lcy4gTm90ZSB0aGF0IHNldHRpbmcgRDNEREVWQ0FQU19SVFBBVENISEFORExFWkVSTyBkb2VzIG5vdCBtZWFuIHRoYXQgYSBwYXRjaCB3aXRoIGhhbmRsZSB6ZXJvIGNhbiBiZSBkcmF3bi4gQSBoYW5kbGUtemVybyBwYXRjaCBjYW4gYWx3YXlzIGJlIGRyYXduIHdoZXRoZXIgdGhpcyBjYXAgaXMgc2V0IG9yIG5vdC4KCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuCgkJCQkJCQlEM0RERVZDQVBTX1RFWFRVUkVOT05MT0NBTFZJRE1FTSB8CQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gbm9uLWxvY2FsIHZpZGVvIG1lbW9yeS4KCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gc3lzdGVtIG1lbW9yeS4KCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4KCQkJCQkJCUQzRERFVkNBUFNfVExWRVJURVhTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiB1c2UgYnVmZmVycyBmcm9tIHN5c3RlbSBtZW1vcnkgZm9yIHRyYW5zZm9ybWVkIGFuZCBsaXQgdmVydGljZXMuCgkJCQkJCQlEM0RERVZDQVBTX1RMVkVSVEVYVklERU9NRU1PUlk7CQkJLy8gRGV2aWNlIGNhbiB1c2UgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4KCgkJY2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9IAkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCQkvLyBEZXZpY2UgY2FuIGVuYWJsZSBhbmQgZGlzYWJsZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcHRoIGJ1ZmZlciBvbiBwaXhlbCBvcGVyYXRpb25zLgoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExOT05FIHwJCQkJCQkvLyBUaGUgZHJpdmVyIGRvZXMgbm90IHBlcmZvcm0gdHJpYW5nbGUgY3VsbGluZy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9OT05FIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTENXIHwJCQkJCQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGNsb2Nrd2lzZSB0cmlhbmdsZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DVyBtZW1iZXIgb2YgdGhlIEQzRENVTEwgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDQ1cgfAkJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY291bnRlcmNsb2Nrd2lzZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DQ1cgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DT0xPUldSSVRFRU5BQkxFIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1jaGFubmVsIHdyaXRlcyBmb3IgdGhlIHJlbmRlci10YXJnZXQgY29sb3IgYnVmZmVyIHRocm91Z2ggdGhlIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUgc3RhdGUuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ0xJUFBMQU5FU0NBTEVEUE9JTlRTIHwJCS8vIERldmljZSBjb3JyZWN0bHkgY2xpcHMgc2NhbGVkIHBvaW50cyBvZiBzaXplIGdyZWF0ZXIgdGhhbiAxLjAgdG8gdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcy4KCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DTElQVExWRVJUUyB8CQkJCQkvLyBEZXZpY2UgY2xpcHMgcG9zdC10cmFuc2Zvcm1lZCB2ZXJ0ZXggcHJpbWl0aXZlcy4gU3BlY2lmeSBEM0RVU0FHRV9ET05PVENMSVAgd2hlbiB0aGUgcGlwZWxpbmUgc2hvdWxkIG5vdCBkbyBhbnkgY2xpcHBpbmcuIEZvciB0aGlzIGNhc2UsIGFkZGl0aW9uYWwgc29mdHdhcmUgY2xpcHBpbmcgbWF5IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGF0IGRyYXcgdGltZSwgcmVxdWlyaW5nIHRoZSB2ZXJ0ZXggYnVmZmVyIHRvIGJlIGluIHN5c3RlbSBtZW1vcnkuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfVFNTQVJHVEVNUCB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgRDNEVEEgZm9yIHRlbXBvcmFyeSByZWdpc3Rlci4KCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19CTEVORE9QIHwJCQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgYWxwaGEtYmxlbmRpbmcgb3BlcmF0aW9ucyBvdGhlciB0aGFuIEQzREJMRU5ET1BfQURELgoJCQkJCQkJCQkvLwlEM0RQTUlTQ0NBUFNfTlVMTFJFRkVSRU5DRSB8CQkJCS8vIEEgcmVmZXJlbmNlIGRldmljZSB0aGF0IGRvZXMgbm90IHJlbmRlci4KCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19JTkRFUEVOREVOVFdSSVRFTUFTS1MgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIGluZGVwZW5kZW50IHdyaXRlIG1hc2tzIGZvciBtdWx0aXBsZSBlbGVtZW50IHRleHR1cmVzIG9yIG11bHRpcGxlIHJlbmRlciB0YXJnZXRzLgoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX1BFUlNUQUdFQ09OU1RBTlQgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGNvbnN0YW50cy4gU2VlIEQzRFRTU19DT05TVEFOVCBpbiBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfRk9HQU5EU1BFQ1VMQVJBTFBIQSB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNlcGFyYXRlIGZvZyBhbmQgc3BlY3VsYXIgYWxwaGEuIE1hbnkgZGV2aWNlcyB1c2UgdGhlIHNwZWN1bGFyIGFscGhhIGNoYW5uZWwgdG8gc3RvcmUgdGhlIGZvZyBmYWN0b3IuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfU0VQQVJBVEVBTFBIQUJMRU5EIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2VwYXJhdGUgYmxlbmQgc2V0dGluZ3MgZm9yIHRoZSBhbHBoYSBjaGFubmVsLgoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01SVElOREVQRU5ERU5UQklUREVQVEhTIHwJCS8vIERldmljZSBzdXBwb3J0cyBkaWZmZXJlbnQgYml0IGRlcHRocyBmb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfTVJUUE9TVFBJWEVMU0hBREVSQkxFTkRJTkcgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcG9zdC1waXhlbCBzaGFkZXIgb3BlcmF0aW9ucyBmb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfRk9HVkVSVEVYQ0xBTVBFRDsJCQkJLy8gRGV2aWNlIGNsYW1wcyBmb2cgYmxlbmQgZmFjdG9yIHBlciB2ZXJ0ZXguCgoJCWNhcHMuUmFzdGVyQ2FwcyA9CQlEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFuaXNvdHJvcGljIGZpbHRlcmluZy4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19DT0xPUlBFUlNQRUNUSVZFIHwJCS8vIERldmljZSBpdGVyYXRlcyBjb2xvcnMgcGVyc3BlY3RpdmUgY29ycmVjdGx5LgoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19ERVBUSEJJQVMgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbGVnYWN5IGRlcHRoIGJpYXMuIEZvciB0cnVlIGRlcHRoIGJpYXMsIHNlZSBEM0RQUkFTVEVSQ0FQU19TTE9QRVNDQUxFREVQVEhCSUFTLgoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJhbmdlLWJhc2VkIGZvZy4gSW4gcmFuZ2UtYmFzZWQgZm9nLCB0aGUgZGlzdGFuY2Ugb2YgYW4gb2JqZWN0IGZyb20gdGhlIHZpZXdlciBpcyB1c2VkIHRvIGNvbXB1dGUgZm9nIGVmZmVjdHMsIG5vdCB0aGUgZGVwdGggb2YgdGhlIG9iamVjdCAodGhhdCBpcywgdGhlIHotY29vcmRpbmF0ZSkgaW4gdGhlIHNjZW5lLgoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1RBQkxFIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBieSByZWZlcnJpbmcgdG8gYSBsb29rdXAgdGFibGUgY29udGFpbmluZyBmb2cgdmFsdWVzIHRoYXQgYXJlIGluZGV4ZWQgdG8gdGhlIGRlcHRoIG9mIGEgZ2l2ZW4gcGl4ZWwuCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBkdXJpbmcgdGhlIGxpZ2h0aW5nIG9wZXJhdGlvbiBhbmQgaW50ZXJwb2xhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHJhc3Rlcml6YXRpb24uCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfTUlQTUFQTE9EQklBUyB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxldmVsIG9mIGRldGFpbCAoTE9EKSBiaWFzIGFkanVzdG1lbnRzLiBUaGVzZSBiaWFzIGFkanVzdG1lbnRzIGVuYWJsZSBhbiBhcHBsaWNhdGlvbiB0byBtYWtlIGEgbWlwbWFwIGFwcGVhciBjcmlzcGVyIG9yIGxlc3Mgc2hhcnAgdGhhbiBpdCBub3JtYWxseSB3b3VsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTE9EIGJpYXMgaW4gbWlwbWFwcywgc2VlIEQzRFNBTVBfTUlQTUFQTE9EQklBUy4KCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX01VTFRJU0FNUExFX1RPR0dMRSB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgdG9nZ2xpbmcgbXVsdGlzYW1wbGluZyBvbiBhbmQgb2ZmIGJldHdlZW4gSURpcmVjdDNERGV2aWNlOTo6QmVnaW5TY2VuZSBhbmQgSURpcmVjdDNERGV2aWNlOTo6RW5kU2NlbmUgKHVzaW5nIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKS4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19TQ0lTU09SVEVTVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNjaXNzb3IgdGVzdC4gU2VlIFNjaXNzb3IgVGVzdC4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19TTE9QRVNDQUxFREVQVEhCSUFTIHwJLy8gRGV2aWNlIHBlcmZvcm1zIHRydWUgc2xvcGUtc2NhbGUgYmFzZWQgZGVwdGggYmlhcy4gVGhpcyBpcyBpbiBjb250cmFzdCB0byB0aGUgbGVnYWN5IHN0eWxlIEQzRFBSQVNURVJDQVBTX0RFUFRIQklBUy4KCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1dCVUZGRVIgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgZGVwdGggYnVmZmVyaW5nIHVzaW5nIHcuCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19aQlVGRkVSTEVTU0hTUiB8CQkJLy8gRGV2aWNlIGNhbiBwZXJmb3JtIGhpZGRlbi1zdXJmYWNlIHJlbW92YWwgKEhTUikgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHNvcnQgcG9seWdvbnMgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGEgZGVwdGgtYnVmZmVyLiBUaGlzIGxlYXZlcyBtb3JlIHZpZGVvIG1lbW9yeSBmb3IgdGV4dHVyZXMuIFRoZSBtZXRob2QgdXNlZCB0byBwZXJmb3JtIEhTUiBpcyBoYXJkd2FyZS1kZXBlbmRlbnQgYW5kIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4gWi1idWZmZXJsZXNzIEhTUiBpcyBwZXJmb3JtZWQgaWYgbm8gZGVwdGgtYnVmZmVyIHN1cmZhY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZW5kZXJpbmctdGFyZ2V0IHN1cmZhY2UgYW5kIHRoZSBkZXB0aC1idWZmZXIgY29tcGFyaXNvbiB0ZXN0IGlzIGVuYWJsZWQgKHRoYXQgaXMsIHdoZW4gdGhlIHN0YXRlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRDNEUlNfWkVOQUJMRSBlbnVtZXJhdGlvbiBjb25zdGFudCBpcyBzZXQgdG8gVFJVRSkuCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgei1iYXNlZCBmb2cuCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWlRFU1Q7CQkJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gei10ZXN0IG9wZXJhdGlvbnMuIFRoaXMgZWZmZWN0aXZlbHkgcmVuZGVycyBhIHByaW1pdGl2ZSBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgYW55IHogcGl4ZWxzIGhhdmUgYmVlbiByZW5kZXJlZC4KCgkJY2Fwcy5aQ21wQ2FwcyA9CQlEM0RQQ01QQ0FQU19BTFdBWVMgfAkJLy8gQWx3YXlzIHBhc3MgdGhlIHotdGVzdC4KCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGVxdWFscyB0aGUgY3VycmVudCB6LgoJCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUiB8CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB6LgoJCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgei4KCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHouCgkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTRVFVQUwgfAkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgei4KCQkJCQkJCUQzRFBDTVBDQVBTX05FVkVSIHwJCQkvLyBBbHdheXMgZmFpbCB0aGUgei10ZXN0LgoJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IHouCgoJCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1IgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBib3RoIEQzREJMRU5EX0JMRU5ERkFDVE9SIGFuZCBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUi4gU2VlIEQzREJMRU5ELgoJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgfAkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZSBEM0RCTEVORF9CT1RIU1JDQUxQSEEgYmxlbmQgbW9kZS4gKFRoaXMgYmxlbmQgbW9kZSBpcyBvYnNvbGV0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEM0RCTEVORC4pCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChBZCwgQWQsIEFkLCBBZCkuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQWQsIDEtQWQsIDEtQWQsIDEtQWQpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJkLCAxLUdkLCAxLUJkLCAxLUFkKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUnMsIDEtR3MsIDEtQnMsIDEtQXMpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfT05FIHwJCQkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLCAxLCAxLCAxKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChmLCBmLCBmLCAxKTsgZiA9IG1pbihBcywgMS1BZCkuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKFJzLCBHcywgQnMsIEFzKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCgoJCWNhcHMuRGVzdEJsZW5kQ2FwcyA9IAlEM0RQQkxFTkRDQVBTX0JMRU5ERkFDVE9SIHwJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgYm90aCBEM0RCTEVORF9CTEVOREZBQ1RPUiBhbmQgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1IuIFNlZSBEM0RCTEVORC4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CS8vIFNvdXJjZSBibGVuZCBmYWN0b3IgaXMgKDEtQXMsMS1BcywxLUFzLDEtQXMpIGFuZCBkZXN0aW5hdGlvbiBibGVuZCBmYWN0b3IgaXMgKEFzLEFzLEFzLEFzKTsgdGhlIGRlc3RpbmF0aW9uIGJsZW5kIHNlbGVjdGlvbiBpcyBvdmVycmlkZGVuLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBIHwJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgRDNEQkxFTkRfQk9USFNSQ0FMUEhBIGJsZW5kIG1vZGUuIChUaGlzIGJsZW5kIG1vZGUgaXMgb2Jzb2xldGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEQkxFTkQuKQoJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVENPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUmQsIEdkLCBCZCwgQWQpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLUFkLCAxLUFkLCAxLUFkLCAxLUFkKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQXMsIDEtQXMsIDEtQXMsIDEtQXMpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJzLCAxLUdzLCAxLUJzLCAxLUFzKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFzLCBBcywgQXMsIEFzKS4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoZiwgZiwgZiwgMSk7IGYgPSBtaW4oQXMsIDEtQWQpLgoJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19aRVJPOwkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDAsIDAsIDAsIDApLgoKCQljYXBzLkFscGhhQ21wQ2FwcyA9IEQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgYXBoYS10ZXN0LgoJCQkJCQkJRDNEUENNUENBUFNfRVFVQUwgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZXF1YWxzIHRoZSBjdXJyZW50IGFwaGEuCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGFwaGEuCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLgoJCQkJCQkJRDNEUENNUENBUFNfTEVTUyB8CQkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4KCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1NFUVVBTCB8CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLgoJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSBhcGhhLXRlc3QuCgkJCQkJCQlEM0RQQ01QQ0FQU19OT1RFUVVBTDsJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZG9lcyBub3QgZXF1YWwgdGhlIGN1cnJlbnQgYXBoYS4KCgkJY2Fwcy5TaGFkZUNhcHMgPQlEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EIHwJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGFuIGFscGhhIGNvbXBvbmVudCBmb3IgR291cmF1ZC1ibGVuZGVkIHRyYW5zcGFyZW5jeSAodGhlIEQzRFNIQURFX0dPVVJBVUQgc3RhdGUgZm9yIHRoZSBEM0RTSEFERU1PREUgZW51bWVyYXRlZCB0eXBlKS4gSW4gdGhpcyBtb2RlLCB0aGUgYWxwaGEgY29sb3IgY29tcG9uZW50IG9mIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLgoJCQkJCQkJRDNEUFNIQURFQ0FQU19DT0xPUkdPVVJBVURSR0IgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGNvbG9yZWQgR291cmF1ZCBzaGFkaW5nIGluIHRoZSBSR0IgY29sb3IgbW9kZWwuIEluIHRoaXMgbW9kZSwgdGhlIGNvbG9yIGNvbXBvbmVudCBmb3IgYSBwcmltaXRpdmUgaXMgcHJvdmlkZWQgYXQgdmVydGljZXMgYW5kIGludGVycG9sYXRlZCBhY3Jvc3MgYSBmYWNlIGFsb25nIHdpdGggdGhlIG90aGVyIGNvbG9yIGNvbXBvbmVudHMuIEluIHRoZSBSR0IgbGlnaHRpbmcgbW9kZWwsIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnRzIGFyZSBpbnRlcnBvbGF0ZWQuCgkJCQkJCQlEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBmb2cgaW4gdGhlIEdvdXJhdWQgc2hhZGluZyBtb2RlLgoJCQkJCQkJRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0I7CS8vIERldmljZSBzdXBwb3J0cyBHb3VyYXVkIHNoYWRpbmcgb2Ygc3BlY3VsYXIgaGlnaGxpZ2h0cy4KCgkJY2Fwcy5UZXh0dXJlQ2FwcyA9CQlEM0RQVEVYVFVSRUNBUFNfQUxQSEEgfAkJCQkJCS8vIEFscGhhIGluIHRleHR1cmUgcGl4ZWxzIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQUxQSEFQQUxFVFRFIHwJCQkJLy8gRGV2aWNlIGNhbiBkcmF3IGFscGhhIGZyb20gdGV4dHVyZSBwYWxldHRlcy4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCB8CQkJCQkvLyBTdXBwb3J0cyBjdWJlIHRleHR1cmVzLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMiB8CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfTUlQQ1VCRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgY3ViZSB0ZXh0dXJlcy4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfTUlQTUFQIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdGV4dHVyZXMuCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCB8CQkvLyBDb25kaXRpb25hbGx5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgMi1EIHRleHR1cmVzIHdpdGggZGltZW5zaW9ucyB0aGF0IGFyZSBub3QgcG93ZXJzIG9mIHR3by4gQSBkZXZpY2UgdGhhdCBleHBvc2VzIHRoaXMgY2FwYWJpbGl0eSBjYW4gdXNlIHN1Y2ggYSB0ZXh0dXJlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgbWV0Li4uCgkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfTk9QUk9KRUNURURCVU1QRU5WIHwJCS8vIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IGEgcHJvamVjdGVkIGJ1bXAtZW52aXJvbm1lbnQgbG9vcGt1cCBvcGVyYXRpb24gaW4gcHJvZ3JhbW1hYmxlIGFuZCBmaXhlZCBmdW5jdGlvbiBzaGFkZXJzLgoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSB8CQkJCS8vIFBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gdGV4dHVyaW5nIGlzIHN1cHBvcnRlZC4KCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19QT1cyIHwJCQkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBoYXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBlaXRoZXIgY3ViZSB0ZXh0dXJlcyBvciB2b2x1bWUgdGV4dHVyZXMuCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BST0pFQ1RFRCB8CQkJCQkvLyBTdXBwb3J0cyB0aGUgRDNEVFRGRl9QUk9KRUNURUQgdGV4dHVyZSB0cmFuc2Zvcm1hdGlvbiBmbGFnLiBXaGVuIGFwcGxpZWQsIHRoZSBkZXZpY2UgZGl2aWRlcyB0cmFuc2Zvcm1lZCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGJ5IHRoZSBsYXN0IHRleHR1cmUgY29vcmRpbmF0ZS4gSWYgdGhpcyBjYXBhYmlsaXR5IGlzIHByZXNlbnQsIHRoZW4gdGhlIHByb2plY3RpdmUgZGl2aWRlIG9jY3VycyBwZXIgcGl4ZWwuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudCwgYnV0IHRoZSBwcm9qZWN0aXZlIGRpdmlkZSBuZWVkcyB0byBvY2N1ciBhbnl3YXksIHRoZW4gaXQgaXMgcGVyZm9ybWVkIG9uIGEgcGVyLXZlcnRleCBiYXNpcyBieSB0aGUgRGlyZWN0M0QgcnVudGltZS4KCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZIHwJCQkJLy8gQWxsIHRleHR1cmVzIG11c3QgYmUgc3F1YXJlLgoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19URVhSRVBFQVROT1RTQ0FMRURCWVNJWkUgfAkvLyBUZXh0dXJlIGluZGljZXMgYXJlIG5vdCBzY2FsZWQgYnkgdGhlIHRleHR1cmUgc2l6ZSBwcmlvciB0byBpbnRlcnBvbGF0aW9uLgoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVA7CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdm9sdW1lIHRleHR1cmVzLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX1ZPTFVNRU1BUF9QT1cyOwkJCQkvLyBEZXZpY2UgcmVxdWlyZXMgdGhhdCB2b2x1bWUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4KCgkJY2Fwcy5UZXh0dXJlRmlsdGVyQ2FwcyA9CQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuCgkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVI7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoKCQljYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9CQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4KCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCgkJY2Fwcy5Wb2x1bWVUZXh0dXJlRmlsdGVyQ2FwcyA9IAkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcHlyYW1pZGFsIG1hZ25pZnlpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BZUkFNSURBTFFVQUQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgoJCWNhcHMuVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuCgkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLgoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCgoJCWNhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuCgkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0NMQU1QIHwJCQkvLyBEZXZpY2UgY2FuIGNsYW1wIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVViB8CS8vIERldmljZSBjYW4gc2VwYXJhdGUgdGhlIHRleHR1cmUtYWRkcmVzc2luZyBtb2RlcyBvZiB0aGUgdSBhbmQgdiBjb29yZGluYXRlcyBvZiB0aGUgdGV4dHVyZS4gVGhpcyBhYmlsaXR5IGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RTQU1QX0FERFJFU1NVIGFuZCBEM0RTQU1QX0FERFJFU1NWIHJlbmRlci1zdGF0ZSB2YWx1ZXMuCgkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgoJCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1JPTkNFIHwJCS8vIERldmljZSBjYW4gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHRleHR1cmUgY29vcmRpbmF0ZSAodGh1cywgbWlycm9yaW5nIGFyb3VuZCAwKSBhbmQgdGhlbiBjbGFtcCB0byB0aGUgbWF4aW11bSB2YWx1ZS4KCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfV1JBUDsJCQkJLy8gRGV2aWNlIGNhbiB3cmFwIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KCgkJY2Fwcy5MaW5lQ2FwcyA9CQlEM0RMSU5FQ0FQU19BTFBIQUNNUCB8CS8vIFN1cHBvcnRzIGFscGhhLXRlc3QgY29tcGFyaXNvbnMuCgkJCQkJCS8vCUQzRExJTkVDQVBTX0FOVElBTElBUyB8IC8vIEFudGlhbGlhc2VkIGxpbmVzIGFyZSBzdXBwb3J0ZWQuCgkJCQkJCQlEM0RMSU5FQ0FQU19CTEVORCB8CQkvLyBTdXBwb3J0cyBzb3VyY2UtYmxlbmRpbmcuCgkJCQkJCQlEM0RMSU5FQ0FQU19GT0cgfAkJLy8gU3VwcG9ydHMgZm9nLgoJCQkJCQkJRDNETElORUNBUFNfVEVYVFVSRSB8CS8vIFN1cHBvcnRzIHRleHR1cmUtbWFwcGluZy4KCQkJCQkJCUQzRExJTkVDQVBTX1pURVNUOwkJLy8gU3VwcG9ydHMgei1idWZmZXIgY29tcGFyaXNvbnMuCgoJCWNhcHMuTWF4VGV4dHVyZVdpZHRoID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heFRleHR1cmVIZWlnaHQgPSAxIDw8IChzdzo6TUlQTUFQX0xFVkVMUyAtIDEpOwoJCWNhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heFRleHR1cmVSZXBlYXQgPSA4MTkyOwoJCWNhcHMuTWF4VGV4dHVyZUFzcGVjdFJhdGlvID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heEFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5OwoJCWNhcHMuTWF4VmVydGV4VyA9IDFlKzAxMDsKCgkJY2Fwcy5HdWFyZEJhbmRMZWZ0ID0gLTFlKzAwODsKCQljYXBzLkd1YXJkQmFuZFRvcCA9IC0xZSswMDg7CgkJY2Fwcy5HdWFyZEJhbmRSaWdodCA9IDFlKzAwODsKCQljYXBzLkd1YXJkQmFuZEJvdHRvbSA9IDFlKzAwODsKCgkJY2Fwcy5FeHRlbnRzQWRqdXN0ID0gMDsKCgkJY2Fwcy5TdGVuY2lsQ2FwcyA9CQlEM0RTVEVOQ0lMQ0FQU19LRUVQIHwJCS8vIERvIG5vdCB1cGRhdGUgdGhlIGVudHJ5IGluIHRoZSBzdGVuY2lsIGJ1ZmZlci4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19aRVJPIHwJCS8vIFNldCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgdG8gMC4KCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFIHwJLy8gUmVwbGFjZSB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgd2l0aCByZWZlcmVuY2UgdmFsdWUuCgkJCQkJCQkJRDNEU1RFTkNJTENBUFNfSU5DUlNBVCB8CS8vIEluY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIGNsYW1waW5nIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0RFQ1JTQVQgfAkvLyBEZWNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB6ZXJvLgoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOVkVSVCB8CQkvLyBJbnZlcnQgdGhlIGJpdHMgaW4gdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LgoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1IgfAkJLy8gSW5jcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgd3JhcHBpbmcgdG8gemVybyBpZiB0aGUgbmV3IHZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUuCgkJCQkJCQkJRDNEU1RFTkNJTENBUFNfREVDUiB8CQkvLyBEZWNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZSBpZiB0aGUgbmV3IHZhbHVlIGlzIGxlc3MgdGhhbiB6ZXJvLgoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX1RXT1NJREVEOwkvLyBUaGUgZGV2aWNlIHN1cHBvcnRzIHR3by1zaWRlZCBzdGVuY2lsLgoKCQljYXBzLkZWRkNhcHMgPQkJRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgfAkJLy8gSXQgaXMgcHJlZmVyYWJsZSB0aGF0IHZlcnRleCBlbGVtZW50cyBub3QgYmUgc3RyaXBwZWQuIFRoYXQgaXMsIGlmIHRoZSB2ZXJ0ZXggZm9ybWF0IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyIHN0YXRlcywgdGhlcmUgaXMgbm8gbmVlZCB0byByZWdlbmVyYXRlIHRoZSB2ZXJ0aWNlcy4gSWYgdGhpcyBjYXBhYmlsaXR5IGZsYWcgaXMgbm90IHByZXNlbnQsIHN0cmlwcGluZyBleHRyYW5lb3VzIGVsZW1lbnRzIGZyb20gdGhlIHZlcnRleCBmb3JtYXQgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLgoJCQkJCQkJRDNERlZGQ0FQU19QU0laRSB8CQkJCQkvLyBQb2ludCBzaXplIGlzIGRldGVybWluZWQgYnkgZWl0aGVyIHRoZSByZW5kZXIgc3RhdGUgb3IgdGhlIHZlcnRleCBkYXRhLgoJCQkJCQkvLwlEM0RGVkZDQVBTX1RFWENPT1JEQ09VTlRNQVNLIHwJCS8vIE1hc2tzIHRoZSBsb3cgV09SRCBvZiBGVkZDYXBzLiBUaGVzZSBiaXRzLCBjYXN0IHRvIHRoZSBXT1JEIGRhdGEgdHlwZSwgZGVzY3JpYmUgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyB0aGF0IHRoZSBkZXZpY2UgY2FuIHNpbXVsdGFuZW91c2x5IHVzZSBmb3IgbXVsdGlwbGUgdGV4dHVyZSBibGVuZGluZy4gKFlvdSBjYW4gdXNlIHVwIHRvIGVpZ2h0IHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIGZvciBhbnkgdmVydGV4LCBidXQgdGhlIGRldmljZSBjYW4gYmxlbmQgdXNpbmcgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cy4pCgkJCQkJCQk4OwoKCQljYXBzLlRleHR1cmVPcENhcHMgPQlEM0RURVhPUENBUFNfQUREIHwJCQkJCQkJLy8gVGhlIEQzRFRPUF9BREQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQgfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQyWCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNJR05FRDJYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU01PT1RIIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU01PT1RIIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORERJRkZVU0VBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERkFDVE9SQUxQSEEgfAkJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBUE0gfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVAgfAkJCQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRSB8CQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfRElTQUJMRSB8CQkJCQkJLy8gVGhlIEQzRFRPUF9ESVNBQkxFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfRE9UUFJPRFVDVDMgfAkJCQkJLy8gVGhlIEQzRFRPUF9ET1RQUk9EVUNUMyB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0xFUlAgfAkJCQkJCQkvLyBUaGUgRDNEVE9QX0xFUlAgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURSB8CQkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFMlggfAkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURTJYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEU0WCB8CQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFNFggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUFMUEhBX0FERENPTE9SIHwJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgfAkvLyBUaGUgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19NVUxUSVBMWUFERCB8CQkJCQkvLyBUaGUgRDNEVE9QX01VTFRJUExZQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfUFJFTU9EVUxBVEUgfAkJCQkJLy8gVGhlIEQzRFRPUF9QUkVNT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCgkJCQkJCQkJRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzEgfAkJCQkJLy8gVGhlIEQzRFRPUF9TRUxFQ1RBUkcxIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMiB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzIgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgoJCQkJCQkJCUQzRFRFWE9QQ0FQU19TVUJUUkFDVDsJCQkJCQkvLyBUaGUgRDNEVE9QX1NVQlRSQUNUIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KCgkJY2Fwcy5NYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSA4OwoJCWNhcHMuTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSA4OwoKCQljYXBzLlZlcnRleFByb2Nlc3NpbmdDYXBzID0JCUQzRFZUWFBDQVBTX0RJUkVDVElPTkFMTElHSFRTIHwJCQkvLyBEZXZpY2UgY2FuIGRvIGRpcmVjdGlvbmFsIGxpZ2h0cy4KCQkJCQkJCQkJCUQzRFZUWFBDQVBTX0xPQ0FMVklFV0VSIHwJCQkJLy8gRGV2aWNlIGNhbiBkbyBsb2NhbCB2aWV3ZXIuCgkJCQkJCQkJCQlEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcJfAkJCS8vIERldmljZSBjYW4gZG8gTWljcm9zb2Z0riBEaXJlY3RYriA3LjAgY29sb3JtYXRlcmlhbHNvdXJjZSBvcGVyYXRpb25zLgoJCQkJCQkJCQkvLwlEM0RWVFhQQ0FQU19OT19URVhHRU5fTk9OTE9DQUxWSUVXRVIgfAkvLyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0ZXh0dXJlIGdlbmVyYXRpb24gaW4gbm9uLWxvY2FsIHZpZXdlciBtb2RlLgoJCQkJCQkJCQkJRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBwb3NpdGlvbmFsIGxpZ2h0cyAoaW5jbHVkZXMgcG9pbnQgYW5kIHNwb3QpLgoJCQkJCQkJCQkJRDNEVlRYUENBUFNfVEVYR0VOIHwJCQkJCS8vIERldmljZSBjYW4gZG8gdGV4Z2VuLgoJCQkJCQkJCQkJRDNEVlRYUENBUFNfVEVYR0VOX1NQSEVSRU1BUDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgRDNEVFNTX1RDSV9TUEhFUkVNQVAuCgkJCQkJCQkJCS8vCUQzRFZUWFBDQVBTX1RXRUVOSU5HOwkJCQkJLy8gRGV2aWNlIGNhbiBkbyB2ZXJ0ZXggdHdlZW5pbmcuCgoJCWNhcHMuTWF4QWN0aXZlTGlnaHRzID0gODsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBsaWdodHMgdGhhdCBjYW4gYmUgYWN0aXZlIHNpbXVsdGFuZW91c2x5LiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtaWdodCB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q5OjpDcmVhdGVEZXZpY2UuCgkJY2Fwcy5NYXhVc2VyQ2xpcFBsYW5lcyA9IDY7CQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcyBzdXBwb3J0ZWQuIFRoaXMgbWVtYmVyIGNhbiByYW5nZSBmcm9tIDAgdGhyb3VnaCBEM0RNQVhVU0VSQ0xJUFBMQU5FUy4gRm9yIGEgZ2l2ZW4gcGh5c2ljYWwgZGV2aWNlLCB0aGlzIGNhcGFiaWxpdHkgbWF5IHZhcnkgYWNyb3NzIERpcmVjdDNERGV2aWNlIG9iamVjdHMgZGVwZW5kaW5nIG9uIHRoZSBwYXJhbWV0ZXJzIHN1cHBsaWVkIHRvIElEaXJlY3QzRDk6OkNyZWF0ZURldmljZS4KCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSA0OwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB0aGF0IHRoaXMgZGV2aWNlIGNhbiBhcHBseSB3aGVuIHBlcmZvcm1pbmcgbXVsdGltYXRyaXggdmVydGV4IGJsZW5kaW5nLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgoJCWNhcHMuTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCA9IDExOwkJCS8vIERXT1JEIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1hdHJpeCBpbmRleCB0aGF0IGNhbiBiZSBpbmRleGVkIGludG8gdXNpbmcgdGhlIHBlci12ZXJ0ZXggaW5kaWNlcy4gVGhlIG51bWJlciBvZiBtYXRyaWNlcyBpcyBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ICsgMSwgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBwYWxldHRlLiBJZiBub3JtYWxzIGFyZSBwcmVzZW50IGluIHRoZSB2ZXJ0ZXggZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGJsZW5kZWQgZm9yIGxpZ2h0aW5nLCB0aGVuIHRoZSBudW1iZXIgb2YgbWF0cmljZXMgaXMgaGFsZiB0aGUgbnVtYmVyIHNwZWNpZmllZCBieSB0aGlzIGNhcGFiaWxpdHkgZmxhZy4gSWYgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCBpcyBzZXQgdG8gemVybywgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGluZGV4ZWQgdmVydGV4IGJsZW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCB6ZXJvIHRoZW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMgaXMgemVybyB0aHJvdWdoIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXguCgkJY2Fwcy5NYXhQb2ludFNpemUgPSA4MTkyLjBmOwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGEgcG9pbnQgcHJpbWl0aXZlLiBJZiBzZXQgdG8gMS4wZiB0aGVuIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBvaW50IHNpemUgY29udHJvbC4gVGhlIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjBmLgoJCWNhcHMuTWF4UHJpbWl0aXZlQ291bnQgPSAxIDw8IDIxOwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBwcmltaXRpdmVzIGZvciBlYWNoIElEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmUgY2FsbC4gTm90ZSB0aGF0IHdoZW4gRGlyZWN0M0QgaXMgd29ya2luZyB3aXRoIGEgRGlyZWN0WCA2LjAgb3IgRGlyZWN0WCA3LjAgZHJpdmVyLCB0aGlzIGZpZWxkIGlzIHNldCB0byAweEZGRkYuIFRoaXMgbWVhbnMgdGhhdCBub3Qgb25seSB0aGUgbnVtYmVyIG9mIHByaW1pdGl2ZXMgYnV0IGFsc28gdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyBsaW1pdGVkIGJ5IHRoaXMgdmFsdWUuCgkJY2Fwcy5NYXhWZXJ0ZXhJbmRleCA9IDEgPDwgMjQ7CQkJCQkvLyBNYXhpbXVtIHNpemUgb2YgaW5kaWNlcyBzdXBwb3J0ZWQgZm9yIGhhcmR3YXJlIHZlcnRleCBwcm9jZXNzaW5nLiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgMzItYml0IGluZGV4IGJ1ZmZlcnMgYnkgc3BlY2lmeWluZyBEM0RGTVRfSU5ERVgzMjsgaG93ZXZlciwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcmVuZGVyIHdpdGggdGhlIGluZGV4IGJ1ZmZlciB1bmxlc3MgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMHgwMDAwRkZGRi4KCQljYXBzLk1heFN0cmVhbXMgPSAxNjsJCQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkYXRhIHN0cmVhbXMgZm9yIElEaXJlY3QzRERldmljZTk6OlNldFN0cmVhbVNvdXJjZS4gVGhlIHZhbGlkIHJhbmdlIGlzIDEgdG8gMTYuIE5vdGUgdGhhdCBpZiB0aGlzIHZhbHVlIGlzIDAsIHRoZW4gdGhlIGRyaXZlciBpcyBub3QgYSBEaXJlY3RYIDkuMCBkcml2ZXIuCgkJY2Fwcy5NYXhTdHJlYW1TdHJpZGUgPSA2NTUzNjsJCQkJCS8vIE1heGltdW0gc3RyaWRlIGZvciBJRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UuCgkJY2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvbjsJLy8gVHdvIG51bWJlcnMgdGhhdCByZXByZXNlbnQgdGhlIHZlcnRleCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCB2ZXJ0ZXggc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KCQljYXBzLk1heFZlcnRleFNoYWRlckNvbnN0ID0gMjU2OwkJCQkvLyBUaGUgbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgUmVnaXN0ZXJzIHRoYXQgYXJlIHJlc2VydmVkIGZvciBjb25zdGFudHMuCgkJY2Fwcy5QaXhlbFNoYWRlclZlcnNpb24gPSBwaXhlbFNoYWRlclZlcnNpb247CS8vIFR3byBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBwaXhlbCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCBwaXhlbCBzaGFkZXIgdmVyc2lvbiwgc2VlIFZlcnNpb24gMV94LCBWZXJzaW9uIDJfMCwgVmVyc2lvbiAyXzAgRXh0ZW5kZWQsIG9yIFZlcnNpb24gM18wLgoJCWNhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlID0gOC4wOwkJCQkvLyBNYXhpbXVtIHZhbHVlIG9mIHBpeGVsIHNoYWRlciBhcml0aG1ldGljIGNvbXBvbmVudC4gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGludGVybmFsIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgZm9yIHBpeGVsIGNvbG9yIGJsZW5kaW5nIG9wZXJhdGlvbnMuIFdpdGhpbiB0aGUgcmFuZ2UgdGhhdCB0aGV5IHJlcG9ydCB0bywgaW1wbGVtZW50YXRpb25zIG11c3QgYWxsb3cgZGF0YSB0byBwYXNzIHRocm91Z2ggcGl4ZWwgcHJvY2Vzc2luZyB1bm1vZGlmaWVkICh1bmNsYW1wZWQpLiBOb3JtYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyIGlzIGFuIGFic29sdXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgYSAxLjAgaW5kaWNhdGVzIHRoYXQgdGhlIHJhbmdlIGlzIC0xLjAgdG8gMSwgYW5kIGFuIDguMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmFuZ2UgaXMgLTguMCB0byA4LjAuIFRoZSB2YWx1ZSBtdXN0IGJlID49IDEuMCBmb3IgYW55IGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgcGl4ZWwgc2hhZGVycy4KCgkJY2Fwcy5EZXZDYXBzMiA9IC8vCUQzRERFVkNBUFMyX0FEQVBUSVZFVEVTU1JUUEFUQ0ggfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgYWRhcHRpdmUgdGVzc2VsbGF0aW9uIG9mIFJULXBhdGNoZXMKCQkJCQkJLy8JRDNEREVWQ0FQUzJfQURBUFRJVkVURVNTTlBBVENIIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFkYXB0aXZlIHRlc3NlbGxhdGlvbiBvZiBOLXBhdGNoZXMuCgkJCQkJCQlEM0RERVZDQVBTMl9DQU5fU1RSRVRDSFJFQ1RfRlJPTV9URVhUVVJFUyB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgYSB0ZXh0dXJlIGFzIHRoZSBzb3VyY2UuCgkJCQkJCS8vCUQzRERFVkNBUFMyX0RNQVBOUEFUQ0ggfAkJCQkJCS8vIERldmljZSBzdXBwb3J0cyBkaXNwbGFjZW1lbnQgbWFwcyBmb3IgTi1wYXRjaGVzLgoJCQkJCQkvLwlEM0RERVZDQVBTMl9QUkVTQU1QTEVERE1BUE5QQVRDSCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBwcmVzYW1wbGVkIGRpc3BsYWNlbWVudCBtYXBzIGZvciBOLXBhdGNoZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc3BsYWNlbWVudCBtYXBwaW5nLCBzZWUgRGlzcGxhY2VtZW50IE1hcHBpbmcuCgkJCQkJCQlEM0RERVZDQVBTMl9TVFJFQU1PRkZTRVQgfAkJCQkJCS8vIERldmljZSBzdXBwb3J0cyBzdHJlYW0gb2Zmc2V0cy4KCQkJCQkJCUQzRERFVkNBUFMyX1ZFUlRFWEVMRU1FTlRTQ0FOU0hBUkVTVFJFQU1PRkZTRVQ7CS8vIE11bHRpcGxlIHZlcnRleCBlbGVtZW50cyBjYW4gc2hhcmUgdGhlIHNhbWUgb2Zmc2V0IGluIGEgc3RyZWFtIGlmIEQzRERFVkNBUFMyX1ZFUlRFWEVMRU1FTlRTQ0FOU0hBUkVTVFJFQU1PRkZTRVQgaXMgc2V0IGJ5IHRoZSBkZXZpY2UgYW5kIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBlbGVtZW50IHdpdGggRDNEREVDTFVTQUdFX1BPU0lUSU9OVDAuCgoJCWNhcHMuTWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgPSAwOwkvLyBNYXhpbXVtIG51bWJlciBvZiBOLXBhdGNoIHN1YmRpdmlzaW9uIGxldmVscy4gVGhlIGRyaXZlciB3aWxsIGNsYW1wIGFwcGxpY2F0aW9ucyB0byB0aGlzIHZhbHVlLCBpZiB0aGV5IGFyZSB1c2luZyBwcmVzYW1wbGVkIGRpc3BsYWNlbWVudCBtYXBwaW5nLiBTZWUgVGVzc2VsbGF0aW9uIGFuZCBEaXNwbGFjZW1lbnQgTWFwcGluZy4KCQljYXBzLk1hc3RlckFkYXB0ZXJPcmRpbmFsID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHRoZSBtYXN0ZXIgZm9yIHRoaXMgc3Vib3JkaW5hdGUuIFRoaXMgbnVtYmVyIGlzIHRha2VuIGZyb20gdGhlIHNhbWUgc3BhY2UgYXMgdGhlIGFkYXB0ZXIgdmFsdWVzIHBhc3NlZCB0byB0aGUgSURpcmVjdDNEOSBtZXRob2RzLgoJCWNhcHMuQWRhcHRlck9yZGluYWxJbkdyb3VwID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIGhlYWRzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgKEFQSSkuIFRoZSBtYXN0ZXIgYWRhcHRlciBhbHdheXMgaGFzIEFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IDAuIFRoZXNlIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgYWRhcHRlciBvcmRpbmFscyBwYXNzZWQgdG8gdGhlIElEaXJlY3QzRDkgbWV0aG9kcy4gVGhleSBhcHBseSBvbmx5IHRvIGhlYWRzIHdpdGhpbiBhIGdyb3VwLgoJCWNhcHMuTnVtYmVyT2ZBZGFwdGVyc0luR3JvdXAgPSAxOwkJLy8gTnVtYmVyIG9mIGFkYXB0ZXJzIGluIHRoaXMgYWRhcHRlciBncm91cCAob25seSBpZiBtYXN0ZXIpLiBUaGlzIHdpbGwgYmUgMSBmb3IgY29udmVudGlvbmFsIGFkYXB0ZXJzLiBUaGUgdmFsdWUgd2lsbCBiZSBncmVhdGVyIHRoYW4gMSBmb3IgdGhlIG1hc3RlciBhZGFwdGVyIG9mIGEgbXVsdGloZWFkIGNhcmQuIFRoZSB2YWx1ZSB3aWxsIGJlIDAgZm9yIGEgc3Vib3JkaW5hdGUgYWRhcHRlciBvZiBhIG11bHRpaGVhZCBjYXJkLiBFYWNoIGNhcmQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgbWFzdGVyLCBidXQgbWF5IGhhdmUgbWFueSBzdWJvcmRpbmF0ZXMuCgoJCWNhcHMuRGVjbFR5cGVzID0JRDNERFRDQVBTX1VCWVRFNCB8CQkvLyA0LUQgdW5zaWduZWQgYnl0ZS4KCQkJCQkJCUQzRERUQ0FQU19VQllURTROIHwJCS8vIE5vcm1hbGl6ZWQsIDQtRCB1bnNpZ25lZCBieXRlLiBFYWNoIG9mIHRoZSBmb3VyIGJ5dGVzIGlzIG5vcm1hbGl6ZWQgYnkgZGl2aWRpbmcgdG8gMjU1LjAuCgkJCQkJCQlEM0REVENBUFNfU0hPUlQyTiB8CQkvLyBOb3JtYWxpemVkLCAyLUQgc2lnbmVkIHNob3J0LCBleHBhbmRlZCB0byAoZmlyc3QgYnl0ZS8zMjc2Ny4wLCBzZWNvbmQgYnl0ZS8zMjc2Ny4wLCAwLCAxKS4KCQkJCQkJCUQzRERUQ0FQU19TSE9SVDROIHwJCS8vIE5vcm1hbGl6ZWQsIDQtRCBzaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzMyNzY3LjAsIHNlY29uZCBieXRlLzMyNzY3LjAsIHRoaXJkIGJ5dGUvMzI3NjcuMCwgZm91cnRoIGJ5dGUvMzI3NjcuMCkuCgkJCQkJCQlEM0REVENBUFNfVVNIT1JUMk4gfAkvLyBOb3JtYWxpemVkLCAyLUQgdW5zaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzY1NTM1LjAsIHNlY29uZCBieXRlLzY1NTM1LjAsIDAsIDEpLgoJCQkJCQkJRDNERFRDQVBTX1VTSE9SVDROIHwJLy8gTm9ybWFsaXplZCA0LUQgdW5zaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzY1NTM1LjAsIHNlY29uZCBieXRlLzY1NTM1LjAsIHRoaXJkIGJ5dGUvNjU1MzUuMCwgZm91cnRoIGJ5dGUvNjU1MzUuMCkuCgkJCQkJCQlEM0REVENBUFNfVURFQzMgfAkJLy8gMy1EIHVuc2lnbmVkIDEwIDEwIDEwIGZvcm1hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCB2YWx1ZSwgMSkuCgkJCQkJCQlEM0REVENBUFNfREVDM04gfAkJLy8gMy1EIHNpZ25lZCAxMCAxMCAxMCBmb3JtYXQgbm9ybWFsaXplZCBhbmQgZXhwYW5kZWQgdG8gKHZbMF0vNTExLjAsIHZbMV0vNTExLjAsIHZbMl0vNTExLjAsIDEpLgoJCQkJCQkJRDNERFRDQVBTX0ZMT0FUMTZfMiB8CS8vIDItRCAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KCQkJCQkJCUQzRERUQ0FQU19GTE9BVDE2XzQ7CS8vIDQtRCAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KCgkJY2Fwcy5OdW1TaW11bHRhbmVvdXNSVHMgPSA0OwkvLyBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlbmRlciB0YXJnZXRzLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IG9uZS4KCgkJY2Fwcy5TdHJldGNoUmVjdEZpbHRlckNhcHMgPSAJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9QT0lOVC4KCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX1BPSU5ULgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyByZWN0YW5nbGVzLiBUaGlzIGZpbHRlciB0eXBlIGlzIHJlcXVlc3RlZCBieSBjYWxsaW5nIElEaXJlY3QzRERldmljZTk6OlN0cmV0Y2hSZWN0IHVzaW5nIEQzRFRFWEZfTElORUFSLgoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVI7CQkvLyBEZXZpY2Ugc3VwcG9ydHMgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX0xJTkVBUi4KCgkJY2Fwcy5WUzIwQ2Fwcy5DYXBzID0gdmVydGV4U2hhZGVyUHJlZGljYXRpb247CQkJCQkJCQkJLy8gSW5zdHJ1Y3Rpb24gcHJlZGljYXRpb24gaXMgc3VwcG9ydGVkLiBTZWUgc2V0cF9jb21wLgoJCWNhcHMuVlMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSB2ZXJ0ZXhTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aDsJLy8gVGhlIG1heGltdW0gbGV2ZWwgb2YgbmVzdGluZyBvZiBkeW5hbWljIGZsb3cgY29udHJvbCBpbnN0cnVjdGlvbnMgKGJyZWFrLCBicmVha2MsIGlmYykuCgkJY2Fwcy5WUzIwQ2Fwcy5OdW1UZW1wcyA9IEQzRFZTMjBfTUFYX05VTVRFTVBTOwkJCQkJCQkJCS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHN1cHBvcnRlZC4KCQljYXBzLlZTMjBDYXBzLlN0YXRpY0Zsb3dDb250cm9sRGVwdGggPSBEM0RWUzIwX01BWF9TVEFUSUNGTE9XQ09OVFJPTERFUFRIOwkJLy8gVGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZyBvZiB0aGUgbG9vcC9yZXAgYW5kIGNhbGwvY2FsbG56IGJvb2wgaW5zdHJ1Y3Rpb25zLgoKCQljYXBzLlBTMjBDYXBzLkNhcHMgPQlwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgfAkJCQkJCS8vIEFyYml0cmFyeSBzd2l6emxpbmcgaXMgc3VwcG9ydGVkLgoJCQkJCQkJCXBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgfAkJCQkJLy8gR3JhZGllbnQgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuCgkJCQkJCQkJcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiB8CQkJCQkJCS8vIEluc3RydWN0aW9uIHByZWRpY2F0aW9uIGlzIHN1cHBvcnRlZC4gU2VlIHNldHBfY29tcCAtIHBzLgoJCQkJCQkJCXBpeGVsU2hhZGVyTm9EZXBlbmRlbnRSZWFkTGltaXQgfAkJCQkJLy8gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBkZXBlbmRlbnQgcmVhZHMgcGVyIGluc3RydWN0aW9uLgoJCQkJCQkJCXBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0OwkJCQkJLy8gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiB0ZXggaW5zdHJ1Y3Rpb25zLgoKCQljYXBzLlBTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aDsJCS8vIFRoZSBtYXhpbXVtIGxldmVsIG9mIG5lc3Rpbmcgb2YgZHluYW1pYyBmbG93IGNvbnRyb2wgaW5zdHJ1Y3Rpb25zIChicmVhaywgYnJlYWtjLCBpZmMpLgoJCWNhcHMuUFMyMENhcHMuTnVtSW5zdHJ1Y3Rpb25TbG90cyA9IEQzRFBTMjBfTUFYX05VTUlOU1RSVUNUSU9OU0xPVFM7CQkJLy8gVGhlIGRyaXZlciB3aWxsIHN1cHBvcnQgYXQgbW9zdCB0aGlzIG1hbnkgaW5zdHJ1Y3Rpb25zLgoJCWNhcHMuUFMyMENhcHMuTnVtVGVtcHMgPSBEM0RQUzIwX01BWF9OVU1URU1QUzsJCQkJCQkJCQkvLyBUaGUgZHJpdmVyIHdpbGwgc3VwcG9ydCBhdCBtb3N0IHRoaXMgbWFueSB0ZW1wb3JhcnkgcmVnaXN0ZXIuCgkJY2Fwcy5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoOwkJLy8gVGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZyBvZiB0aGUgbG9vcC9yZXAgYW5kIGNhbGwvY2FsbG56IGJvb2wgaW5zdHJ1Y3Rpb25zLgoKCQljYXBzLlZlcnRleFRleHR1cmVGaWx0ZXJDYXBzID0JCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcHlyYW1pZGFsIG1hZ25pZnlpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BZUkFNSURBTFFVQUQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgoJCWNhcHMuTWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVZlcnRleFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkOwkvLyBNYXhpbXVtIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBydW4uCgkJY2Fwcy5NYXhQU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSBtYXhpbXVtUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZDsJLy8gTWF4aW11bSBudW1iZXIgb2YgcGl4ZWwgc2hhZGVyIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBydW4uCgkJY2Fwcy5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBtYXhpbXVtVmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzOwkvLyBNYXhpbXVtIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIGluc3RydWN0aW9uIHNsb3RzIHN1cHBvcnRlZC4gVGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgc2V0IG9uIHRoaXMgY2FwIGlzIDMyNzY4LiBEZXZpY2VzIHRoYXQgc3VwcG9ydCB2c18zXzAgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgYXQgbGVhc3QgNTEyIGluc3RydWN0aW9uIHNsb3RzLgoJCWNhcHMuTWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBtYXhpbXVtUGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbiBzbG90cyBzdXBwb3J0ZWQuIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHNldCBvbiB0aGlzIGNhcCBpcyAzMjc2OC4gRGV2aWNlcyB0aGF0IHN1cHBvcnQgcHNfM18wIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGF0IGxlYXN0IDUxMiBpbnN0cnVjdGlvbiBzbG90cy4KCgkJKmNhcGFiaWxpdGllcyA9IGNhcHM7CgoJCXJldHVybiBEM0RfT0s7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OlJlZ2lzdGVyU29mdHdhcmVEZXZpY2Uodm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uKQoJewoJCVRSQUNFKCJ2b2lkICppbml0aWFsaXplRnVuY3Rpb24gPSAweCUwLjhwIiwgaW5pdGlhbGl6ZUZ1bmN0aW9uKTsKCgkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJaWYoZDNkOSkKCQl7CgkJCXJldHVybiBkM2Q5LT5SZWdpc3RlclNvZnR3YXJlRGV2aWNlKGluaXRpYWxpemVGdW5jdGlvbik7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCX0KCgl2b2lkIERpcmVjdDNEOTo6bG9hZFN5c3RlbUQzRDkoKQoJewoJCWlmKGQzZDkpCgkJewoJCQlyZXR1cm47CgkJfQoKCQljaGFyIGQzZDlQYXRoW01BWF9QQVRIICsgMTZdOwoJCUdldFN5c3RlbURpcmVjdG9yeShkM2Q5UGF0aCwgTUFYX1BBVEgpOwoJCXN0cmNhdChkM2Q5UGF0aCwgIlxcZDNkOS5kbGwiKTsKCQlkM2Q5TGliID0gTG9hZExpYnJhcnkoZDNkOVBhdGgpOwoKCQlpZihkM2Q5TGliKQoJCXsKCQkJdHlwZWRlZiBJRGlyZWN0M0Q5KiAoX19zdGRjYWxsICpESVJFQ1QzRENSRUFURTkpKHVuc2lnbmVkIGludCk7CgkJCURJUkVDVDNEQ1JFQVRFOSBkaXJlY3QzRENyZWF0ZTkgPSAoRElSRUNUM0RDUkVBVEU5KUdldFByb2NBZGRyZXNzKGQzZDlMaWIsICJEaXJlY3QzRENyZWF0ZTkiKTsKCQkJZDNkOSA9IGRpcmVjdDNEQ3JlYXRlOShEM0RfU0RLX1ZFUlNJT04pOwoJCX0KCX0KfQo=