LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBBcHIgMywgMTk5OS4gIExhd3NvbiBXaGl0bmV5IDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KICogLSBGaXhlZCB0aGUgbW9kZW0gY29udHJvbCBwYXJ0IG9mIEVzY2FwZUNvbW1GdW5jdGlvbjE2LgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICogSnVseSA2LCAxOTk4LiBGaXhlcyBhbmQgY29tbWVudHMgYnkgVmFsZW50aWpuIFNlc3NpbmsKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZzZXNzaW5rQGljLnV2YS5ubD4gW1ZdCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqCiAqIE1heSAyNiwgMTk5Ny4gIEZpeGVzIGFuZCBjb21tZW50cyBieSBSaWNrIFJpY2hhcmRzb24gPHJpY2tAZGdpaS5jb20+IFtSRVJdCiAqIC0gcHRyLT5mZCB3YXNuJ3QgZ2V0dGluZyBjbGVhcmVkIG9uIGNsb3NlLgogKiAtIEdldENvbW1FdmVudE1hc2soKSBhbmQgR2V0Q29tbUVycm9yKCkgZGlkbid0IGRvIG11Y2ggb2YgYW55dGhpbmcuCiAqICAgSU1ITywgdGhleSBhcmUgc3RpbGwgd3JvbmcsIGJ1dCB0aGV5IGF0IGxlYXN0IGltcGxlbWVudCB0aGUgUlhDSEFSCiAqICAgZXZlbnQgYW5kIHJldHVybiBJL08gcXVldWUgc2l6ZXMsIHdoaWNoIG1ha2VzIHRoZSBhcHAgSSdtIGludGVyZXN0ZWQKICogICBpbiAoYW5hbG9nIGRldmljZXMgRVpLSVQgRFNQIGRldmVsb3BtZW50IHN5c3RlbSkgd29yay4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmZGVmIEhBVkVfVEVSTUlPU19ICiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNlbmRpZgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaWZkZWYgSEFWRV9TWVNfRklMSU9fSAojIGluY2x1ZGUgPHN5cy9maWxpby5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QT0xMX0gKIyBpbmNsdWRlIDxzeXMvcG9sbC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01PREVNX0gKIyBpbmNsdWRlIDxzeXMvbW9kZW0uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TVFJUSU9fSAojIGluY2x1ZGUgPHN5cy9zdHJ0aW8uaD4KI2VuZGlmCgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIm50c3RhdHVzLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAid2luZS9zZXJ2ZXIuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2lmZGVmIEhBVkVfTElOVVhfU0VSSUFMX0gKI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgojZW5kaWYKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGNvbW0pOwoKLyogcmV0cmlldmUgdGhlIFVuaXggaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21tIGhhbmRsZSAqLwpzdGF0aWMgaW50IGdldF9jb21tX2ZkKCBIQU5ETEUgaGFuZGxlLCBEV09SRCBhY2Nlc3MgKQp7CiAgICBpbnQgZmQsIHJldDsKCiAgICByZXQgPSB3aW5lX3NlcnZlcl9oYW5kbGVfdG9fZmQoIGhhbmRsZSwgYWNjZXNzLCAmZmQsIE5VTEwgKTsKICAgIGlmIChyZXQpIFNldExhc3RFcnJvciggUnRsTnRTdGF0dXNUb0Rvc0Vycm9yKHJldCkgKTsKICAgIHJldHVybiBmZDsKfQoKLyogcmVsZWFzZSB0aGUgVW5peCBoYW5kbGUgcmV0dXJuZWQgYnkgZ2V0X2NvbW1fZmQgKi8Kc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2VfY29tbV9mZCggSEFORExFIGhhbmRsZSwgaW50IGZkICkKewogICAgd2luZV9zZXJ2ZXJfcmVsZWFzZV9mZCggaGFuZGxlLCBmZCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFzeW5jaHJvbm91cyBJL08gZm9yIGFzeW5jaHJvbm91cyB3YWl0IHJlcXVlc3RzICAgICAgICAgICAgICAgICAgICAgKgogKi8KCnR5cGVkZWYgc3RydWN0IGFzeW5jX2NvbW1pbwp7CiAgICBIQU5ETEUgICAgICAgICAgICAgIGhhbmRsZTsKICAgIFBJT19BUENfUk9VVElORSAgICAgYXBjX2ludGVybmFsOwogICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOwogICAgY2hhciogICAgICAgICAgICAgICBidWZmZXI7CiAgICBpbnQgICAgICAgICAgICAgICAgIGZkOwp9IGFzeW5jX2NvbW1pbzsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAhZGVmaW5lZChUSU9DSU5RKSAmJiBkZWZpbmVkKEZJT05SRUFEKQojZGVmaW5lCVRJT0NJTlEgRklPTlJFQUQKI2VuZGlmCgpzdGF0aWMgaW50IENPTU1fV2hhY2tNb2RlbShpbnQgZmQsIHVuc2lnbmVkIGludCBhbmR5LCB1bnNpZ25lZCBpbnQgb3JyaWUpCnsKI2lmZGVmIFRJT0NNR0VUCiAgICB1bnNpZ25lZCBpbnQgbXN0YXQsIG9rYXk7CiAgICBva2F5ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwogICAgaWYgKG9rYXkpIHJldHVybiBva2F5OwogICAgaWYgKGFuZHkpIG1zdGF0ICY9IGFuZHk7CiAgICBtc3RhdCB8PSBvcnJpZTsKICAgIHJldHVybiBpb2N0bChmZCwgVElPQ01TRVQsICZtc3RhdCk7CiNlbHNlCiAgICByZXR1cm4gMDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ09NTV9QYXJzZSogICAoSW50ZXJuYWwpCiAqCiAqICBUaGUgZm9sbG93aW5nIENPTU1fUGFyc2UqIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSB0aGUgQnVpbGRDb21tRENCCiAqICBmdW5jdGlvbnMgdG8gaGVscCBwYXJzZSB0aGUgdmFyaW91cyBwYXJ0cyBvZiB0aGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLgogKi8Kc3RhdGljIExQQ1dTVFIgQ09NTV9QYXJzZVN0YXJ0KExQQ1dTVFIgcHRyKQp7CglzdGF0aWMgY29uc3QgV0NIQVIgY29tV1tdID0geydDJywnTycsJ00nLDB9OwoKCS8qIFRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgbWF5IG9wdGlvbmFsbHkgc3RhcnQgd2l0aCAiQ09NeCIgZm9sbG93ZWQKCSAgIGJ5IGFuIG9wdGlvbmFsICc6JyBhbmQgc3BhY2VzLiAqLwoJaWYoIXN0cm5jbXBpVyhwdHIsIGNvbVcsIDMpKQoJewoJCXB0ciArPSAzOwoKCQkvKiBBbGxvdyBhbnkgY29tIHBvcnQgYWJvdmUgMCBhcyBXaW4gOXggZG9lcyAoTlQgb25seSBhbGxvd3MKCQkgICB2YWx1ZXMgZm9yIGNvbSBwb3J0cyB3aGljaCBhcmUgYWN0dWFsbHkgcHJlc2VudCkgKi8KCQlpZigqcHRyIDwgJzEnIHx8ICpwdHIgPiAnOScpCgkJCXJldHVybiBOVUxMOwoJCQoJCS8qIEFkdmFuY2UgcG9pbnRlciBwYXN0IHBvcnQgbnVtYmVyICovCgkJd2hpbGUoKnB0ciA+PSAnMCcgJiYgKnB0ciA8PSAnOScpIHB0cisrOwoJCQoJCS8qIFRoZSBjb20gcG9ydCBudW1iZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhICc6JyBvciAnICcgKi8KCQlpZigqcHRyICE9ICc6JyAmJiAqcHRyICE9ICcgJykKCQkJcmV0dXJuIE5VTEw7CgoJCS8qIEFkdmFuY2UgcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgbmV4dCBwYXJhbWV0ZXIgKi8KCQl3aGlsZSgqcHRyID09ICcgJykgcHRyKys7CgkJaWYoKnB0ciA9PSAnOicpCgkJewoJCQlwdHIrKzsKCQkJd2hpbGUoKnB0ciA9PSAnICcpIHB0cisrOwoJCX0KCX0KCS8qIFRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIHNwYWNlLiAqLwoJZWxzZSBpZigqcHRyID09ICcgJykKCQlyZXR1cm4gTlVMTDsKCQoJcmV0dXJuIHB0cjsKfQogCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VOdW1iZXIoTFBDV1NUUiBwdHIsIExQRFdPUkQgbHBudW1iZXIpCnsKCWlmKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5JykgcmV0dXJuIE5VTEw7CgkqbHBudW1iZXIgPSBzdHJ0b3VsVyhwdHIsIE5VTEwsIDEwKTsKCXdoaWxlKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKSBwdHIrKzsKCXJldHVybiBwdHI7Cn0KCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VQYXJpdHkoTFBDV1NUUiBwdHIsIExQQllURSBscHBhcml0eSkKewoJLyogQ29udHJhcnkgdG8gd2hhdCB5b3UgbWlnaHQgZXhwZWN0LCBXaW5kb3dzIG9ubHkgc2V0cyB0aGUgUGFyaXR5CgkgICBtZW1iZXIgb2YgRENCIGFuZCBub3QgZlBhcml0eSBldmVuIHdoZW4gcGFyaXR5IGlzIHNwZWNpZmllZCBpbiB0aGUKCSAgIGRldmljZSBjb250cm9sIHN0cmluZyAqLwoKCXN3aXRjaCh0b3VwcGVyVygqcHRyKyspKQoJewoJY2FzZSAnRSc6CgkJKmxwcGFyaXR5ID0gRVZFTlBBUklUWTsKCQlicmVhazsKCWNhc2UgJ00nOgoJCSpscHBhcml0eSA9IE1BUktQQVJJVFk7CgkJYnJlYWs7CgljYXNlICdOJzoKCQkqbHBwYXJpdHkgPSBOT1BBUklUWTsKCQlicmVhazsKCWNhc2UgJ08nOgoJCSpscHBhcml0eSA9IE9ERFBBUklUWTsKCQlicmVhazsKCWNhc2UgJ1MnOgoJCSpscHBhcml0eSA9IFNQQUNFUEFSSVRZOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgTFBDV1NUUiBDT01NX1BhcnNlQnl0ZVNpemUoTFBDV1NUUiBwdHIsIExQQllURSBscGJ5dGVzaXplKQp7CglEV09SRCB0ZW1wOwoKCWlmKCEocHRyID0gQ09NTV9QYXJzZU51bWJlcihwdHIsICZ0ZW1wKSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYodGVtcCA+PSA1ICYmIHRlbXAgPD0gOCkKCXsKCQkqbHBieXRlc2l6ZSA9IHRlbXA7CgkJcmV0dXJuIHB0cjsKCX0KCWVsc2UKCQlyZXR1cm4gTlVMTDsKfQoKc3RhdGljIExQQ1dTVFIgQ09NTV9QYXJzZVN0b3BCaXRzKExQQ1dTVFIgcHRyLCBMUEJZVEUgbHBzdG9wYml0cykKewoJRFdPUkQgdGVtcDsKCXN0YXRpYyBjb25zdCBXQ0hBUiBzdG9wYml0czE1V1tdID0geycxJywnLicsJzUnLDB9OwoKCWlmKCFzdHJuY21wVyhzdG9wYml0czE1VywgcHRyLCAzKSkKCXsKCQlwdHIgKz0gMzsKCQkqbHBzdG9wYml0cyA9IE9ORTVTVE9QQklUUzsKCX0KCWVsc2UKCXsKCQlpZighKHB0ciA9IENPTU1fUGFyc2VOdW1iZXIocHRyLCAmdGVtcCkpKQoJCQlyZXR1cm4gTlVMTDsKCgkJaWYodGVtcCA9PSAxKQoJCQkqbHBzdG9wYml0cyA9IE9ORVNUT1BCSVQ7CgkJZWxzZSBpZih0ZW1wID09IDIpCgkJCSpscHN0b3BiaXRzID0gVFdPU1RPUEJJVFM7CgkJZWxzZQoJCQlyZXR1cm4gTlVMTDsKCX0KCQoJcmV0dXJuIHB0cjsKfQoKc3RhdGljIExQQ1dTVFIgQ09NTV9QYXJzZU9uT2ZmKExQQ1dTVFIgcHRyLCBMUERXT1JEIGxwb25vZmYpCnsKCXN0YXRpYyBjb25zdCBXQ0hBUiBvbldbXSA9IHsnbycsJ24nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIG9mZldbXSA9IHsnbycsJ2YnLCdmJywwfTsKCglpZighc3RybmNtcGlXKG9uVywgcHRyLCAyKSkKCXsKCQlwdHIgKz0gMjsKCQkqbHBvbm9mZiA9IDE7Cgl9CgllbHNlIGlmKCFzdHJuY21waVcob2ZmVywgcHRyLCAzKSkKCXsKCQlwdHIgKz0gMzsKCQkqbHBvbm9mZiA9IDA7Cgl9CgllbHNlCgkJcmV0dXJuIE5VTEw7CgoJcmV0dXJuIHB0cjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDT01NX0J1aWxkT2xkQ29tbURDQiAgIChJbnRlcm5hbCkKICoKICogIEJ1aWxkIGEgRENCIHVzaW5nIHRoZSBvbGQgc3R5bGUgc2V0dGluZ3Mgc3RyaW5nIGVnOiAiOTYsbiw4LDEiCiAqLwpzdGF0aWMgQk9PTCBDT01NX0J1aWxkT2xkQ29tbURDQihMUENXU1RSIGRldmljZSwgTFBEQ0IgbHBkY2IpCnsKCVdDSEFSIGxhc3QgPSAwOwoKCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU51bWJlcihkZXZpY2UsICZscGRjYi0+QmF1ZFJhdGUpKSkKCQlyZXR1cm4gRkFMU0U7CgkKCXN3aXRjaChscGRjYi0+QmF1ZFJhdGUpCgl7CgljYXNlIDExOgoJY2FzZSAzMDoKCWNhc2UgNjA6CgkJbHBkY2ItPkJhdWRSYXRlICo9IDEwOwoJCWJyZWFrOwoJY2FzZSAxMjoKCWNhc2UgMjQ6CgljYXNlIDQ4OgoJY2FzZSA5NjoKCQlscGRjYi0+QmF1ZFJhdGUgKj0gMTAwOwoJCWJyZWFrOwoJY2FzZSAxOToKCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQlicmVhazsKCX0KCgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CglpZigqZGV2aWNlKysgIT0gJywnKSByZXR1cm4gRkFMU0U7Cgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CgoJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlUGFyaXR5KGRldmljZSwgJmxwZGNiLT5QYXJpdHkpKSkKCQlyZXR1cm4gRkFMU0U7CgoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJaWYoKmRldmljZSsrICE9ICcsJykgcmV0dXJuIEZBTFNFOwoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJCQoJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlQnl0ZVNpemUoZGV2aWNlLCAmbHBkY2ItPkJ5dGVTaXplKSkpCgkJcmV0dXJuIEZBTFNFOwoKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCWlmKCpkZXZpY2UrKyAhPSAnLCcpIHJldHVybiBGQUxTRTsKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCglpZighKGRldmljZSA9IENPTU1fUGFyc2VTdG9wQml0cyhkZXZpY2UsICZscGRjYi0+U3RvcEJpdHMpKSkKCQlyZXR1cm4gRkFMU0U7CgoJLyogVGhlIGxhc3QgcGFyYW1ldGVyIGZvciBmbG93IGNvbnRyb2wgaXMgb3B0aW9uYWwuICovCgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CglpZigqZGV2aWNlID09ICcsJykKCXsKCQlkZXZpY2UrKzsKCQl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CgkJaWYoKmRldmljZSkgbGFzdCA9IHRvdXBwZXJXKCpkZXZpY2UrKyk7CgkJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJfQoKCS8qIFdpbiBOVCBzZXRzIHRoZSBmbG93IGNvbnRyb2wgbWVtYmVycyBiYXNlZCBvbiAob3IgbGFjayBvZikgdGhlIGxhc3QKCSAgIHBhcmFtZXRlci4gIFdpbiA5eCBkb2VzIG5vdCBzZXQgdGhlc2UgbWVtYmVycy4gKi8KCXN3aXRjaChsYXN0KQoJewoJY2FzZSAwOgoJCWxwZGNiLT5mSW5YID0gRkFMU0U7CgkJbHBkY2ItPmZPdXRYID0gRkFMU0U7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSBGQUxTRTsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAnWCc6CgkJbHBkY2ItPmZJblggPSBUUlVFOwoJCWxwZGNiLT5mT3V0WCA9IFRSVUU7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSBGQUxTRTsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAnUCc6CgkJbHBkY2ItPmZJblggPSBGQUxTRTsKCQlscGRjYi0+Zk91dFggPSBGQUxTRTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gVFJVRTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gVFJVRTsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9IQU5EU0hBS0U7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfSEFORFNIQUtFOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJLyogVGhpcyBzaG91bGQgYmUgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAqLwoJaWYoKmRldmljZSkgcmV0dXJuIEZBTFNFOwoJCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDT01NX0J1aWxkTmV3Q29tbURDQiAgIChJbnRlcm5hbCkKICoKICogIEJ1aWxkIGEgRENCIHVzaW5nIHRoZSBuZXcgc3R5bGUgc2V0dGluZ3Mgc3RyaW5nLgogKiAgIGVnOiAiYmF1ZD05NjAwIHBhcml0eT1uIGRhdGE9OCBzdG9wPTEgeG9uPW9uIHRvPW9uIgogKi8Kc3RhdGljIEJPT0wgQ09NTV9CdWlsZE5ld0NvbW1EQ0IoTFBDV1NUUiBkZXZpY2UsIExQRENCIGxwZGNiLCBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglEV09SRCB0ZW1wOwoJQk9PTCBiYXVkID0gRkFMU0UsIHN0b3AgPSBGQUxTRTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBiYXVkV1tdID0geydiJywnYScsJ3UnLCdkJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgcGFyaXR5V1tdID0geydwJywnYScsJ3InLCdpJywndCcsJ3knLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBkYXRhV1tdID0geydkJywnYScsJ3QnLCdhJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgc3RvcFdbXSA9IHsncycsJ3QnLCdvJywncCcsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHRvV1tdID0geyd0JywnbycsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHhvbldbXSA9IHsneCcsJ28nLCduJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgb2RzcldbXSA9IHsnbycsJ2QnLCdzJywncicsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIG9jdHNXW10gPSB7J28nLCdjJywndCcsJ3MnLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBkdHJXW10gPSB7J2QnLCd0JywncicsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHJ0c1dbXSA9IHsncicsJ3QnLCdzJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgaWRzcldbXSA9IHsnaScsJ2QnLCdzJywncicsJz0nLDB9OwoKCXdoaWxlKCpkZXZpY2UpCgl7CgkJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoKCQlpZighc3RybmNtcGlXKGJhdWRXLCBkZXZpY2UsIDUpKQoJCXsKCQkJYmF1ZCA9IFRSVUU7CgkJCQoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VOdW1iZXIoZGV2aWNlICsgNSwgJmxwZGNiLT5CYXVkUmF0ZSkpKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcocGFyaXR5VywgZGV2aWNlLCA3KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZVBhcml0eShkZXZpY2UgKyA3LCAmbHBkY2ItPlBhcml0eSkpKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoZGF0YVcsIGRldmljZSwgNSkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VCeXRlU2l6ZShkZXZpY2UgKyA1LCAmbHBkY2ItPkJ5dGVTaXplKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCWVsc2UgaWYoIXN0cm5jbXBpVyhzdG9wVywgZGV2aWNlLCA1KSkKCQl7CgkJCXN0b3AgPSBUUlVFOwoJCQkKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlU3RvcEJpdHMoZGV2aWNlICsgNSwgJmxwZGNiLT5TdG9wQml0cykpKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcodG9XLCBkZXZpY2UsIDMpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlT25PZmYoZGV2aWNlICsgMywgJnRlbXApKSkKCQkJCXJldHVybiBGQUxTRTsKCgkJCWxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgPSAwOwoJCQlscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllciA9IDA7CgkJCWxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRDb25zdGFudCA9IDA7CgkJCWxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllciA9IDA7CgkJCWxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0Q29uc3RhbnQgPSB0ZW1wID8gNjAwMDAgOiAwOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoeG9uVywgZGV2aWNlLCA0KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDQsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+Zk91dFggPSB0ZW1wOwoJCQlscGRjYi0+ZkluWCA9IHRlbXA7CgkJfQoJCWVsc2UgaWYoIXN0cm5jbXBpVyhvZHNyVywgZGV2aWNlLCA1KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDUsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKG9jdHNXLCBkZXZpY2UsIDUpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlT25PZmYoZGV2aWNlICsgNSwgJnRlbXApKSkKCQkJCXJldHVybiBGQUxTRTsKCgkJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSB0ZW1wOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoZHRyVywgZGV2aWNlLCA0KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDQsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSB0ZW1wOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcocnRzVywgZGV2aWNlLCA0KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDQsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSB0ZW1wOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoaWRzclcsIGRldmljZSwgNSkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA1LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJLyogV2luIE5UIHNldHMgdGhlIGZEc3JTZW5zaXRpdml0eSBtZW1iZXIgYmFzZWQgb24gdGhlCgkJCSAgIGlkc3IgcGFyYW1ldGVyLiAgV2luIDl4IHNldHMgZk91dHhEc3JGbG93IGluc3RlYWQuICovCgkJCWxwZGNiLT5mRHNyU2Vuc2l0aXZpdHkgPSB0ZW1wOwoJCX0KCQllbHNlCgkJCXJldHVybiBGQUxTRTsKCgkJLyogQWZ0ZXIgdGhlIGFib3ZlIHBhcnNpbmcsIHRoZSBuZXh0IGNoYXJhY3RlciAoaWYgbm90IHRoZSBlbmQgb2YKCQkgICB0aGUgc3RyaW5nKSBzaG91bGQgYmUgYSBzcGFjZSAqLwoJCWlmKCpkZXZpY2UgJiYgKmRldmljZSAhPSAnICcpCgkJCXJldHVybiBGQUxTRTsKCX0KCgkvKiBJZiBzdG9wIGJpdHMgd2VyZSBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgaXMgYWx3YXlzIHN1cHBsaWVkLiAqLwoJaWYoIXN0b3ApCgl7CgkJaWYoYmF1ZCAmJiBscGRjYi0+QmF1ZFJhdGUgPT0gMTEwKQoJCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCQllbHNlCgkJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkEJCShLRVJORUwzMi5AKQogKgogKiAgVXBkYXRlcyBhIGRldmljZSBjb250cm9sIGJsb2NrIGRhdGEgc3RydWN0dXJlIHdpdGggdmFsdWVzIGZyb20gYW4KICogIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgaGFzIHR3byBmb3JtcwogKiAgbm9ybWFsIGFuZCBleHRlbmRlZCwgaXQgbXVzdCBiZSBleGNsdXNpdmVseSBpbiBvbmUgb3IgdGhlIG90aGVyIGZvcm0uCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gYSBtYWxmb3JtZWQgY29udHJvbCBzdHJpbmcuCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBKAogICAgTFBDU1RSIGRldmljZSwgLyogW2luXSBUaGUgYXNjaWkgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIHVzZWQgdG8gdXBkYXRlIHRoZSBEQ0IuICovCiAgICBMUERDQiAgbHBkY2IpICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgdG8gYmUgdXBkYXRlZC4gKi8KewoJcmV0dXJuIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShkZXZpY2UsbHBkY2IsTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQQkJKEtFUk5FTDMyLkApCiAqCiAqICBVcGRhdGVzIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgd2l0aCB2YWx1ZXMgZnJvbSBhbgogKiAgYXNjaWkgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAgVGFraW5nIHRpbWVvdXQgdmFsdWVzIGZyb20gYSB0aW1lb3V0cwogKiAgc3RydWN0IGlmIGRlc2lyZWQgYnkgdGhlIGNvbnRyb2wgc3RyaW5nLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGJhZCBoYW5kbGVzIGV0Yy4KICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQSgKICAgIExQQ1NUUiAgICAgICAgIGRldmljZSwgICAgIC8qIFtpbl0gVGhlIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZy4gKi8KICAgIExQRENCICAgICAgICAgIGxwZGNiLCAgICAgIC8qIFtvdXRdIFRoZSBkZXZpY2UgY29udHJvbCBibG9jayB0byBiZSB1cGRhdGVkLiAqLwogICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgLyogW2luXSBUaGUgQ09NTVRJTUVPVVRTIHN0cnVjdHVyZSB0byBiZSB1cGRhdGVkLiAqLwp7CglCT09MIHJldCA9IEZBTFNFOwoJVU5JQ09ERV9TVFJJTkcgZGV2aWNlVzsKCglUUkFDRSgiKCVzLCVwLCVwKVxuIixkZXZpY2UsbHBkY2IsbHB0aW1lb3V0cyk7CglpZihkZXZpY2UpIFJ0bENyZWF0ZVVuaWNvZGVTdHJpbmdGcm9tQXNjaWl6KCZkZXZpY2VXLGRldmljZSk7CgllbHNlIGRldmljZVcuQnVmZmVyID0gTlVMTDsKCglpZihkZXZpY2VXLkJ1ZmZlcikgcmV0ID0gQnVpbGRDb21tRENCQW5kVGltZW91dHNXKGRldmljZVcuQnVmZmVyLGxwZGNiLGxwdGltZW91dHMpOwoKCVJ0bEZyZWVVbmljb2RlU3RyaW5nKCZkZXZpY2VXKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVwkoS0VSTkVMMzIuQCkKICoKICogIFVwZGF0ZXMgYSBkZXZpY2UgY29udHJvbCBibG9jayBkYXRhIHN0cnVjdHVyZSB3aXRoIHZhbHVlcyBmcm9tIGEKICogIHVuaWNvZGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAgVGFraW5nIHRpbWVvdXQgdmFsdWVzIGZyb20gYSB0aW1lb3V0cwogKiAgc3RydWN0IGlmIGRlc2lyZWQgYnkgdGhlIGNvbnRyb2wgc3RyaW5nLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGJhZCBoYW5kbGVzIGV0YwogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNXKAogICAgTFBDV1NUUiAgICAgICAgZGV2aWQsICAgICAgLyogW2luXSBUaGUgdW5pY29kZSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICovCiAgICBMUERDQiAgICAgICAgICBscGRjYiwgICAgICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgdG8gYmUgdXBkYXRlZC4gKi8KICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIC8qIFtpbl0gVGhlIENPTU1USU1FT1VUUyBzdHJ1Y3R1cmUgdG8gYmUgdXBkYXRlZC4gKi8KewoJRENCIGRjYjsKCUNPTU1USU1FT1VUUyB0aW1lb3V0czsKCUJPT0wgcmVzdWx0OwoJTFBDV1NUUiBwdHIgPSBkZXZpZDsKCQoJVFJBQ0UoIiglcywlcCwlcClcbiIsZGVidWdzdHJfdyhkZXZpZCksbHBkY2IsbHB0aW1lb3V0cyk7CgoJLyogU2V0IERDQmxlbmd0aC4gKFdpbmRvd3MgTlQgZG9lcyBub3QgZG8gdGhpcywgYnV0IDl4IGRvZXMpICovCglscGRjYi0+RENCbGVuZ3RoID0gc2l6ZW9mKERDQik7CgoJLyogTWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGRhdGEgc3RydWN0dXJlcyB0byB3b3JrIHdpdGggc2luY2UgaWYKCSAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgdGhlIG9yaWdpbmFscwoJICAgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCAoZXhjZXB0IHBvc3NpYmx5IERDQmxlbmd0aCkgKi8KCW1lbWNweSgmZGNiLCBscGRjYiwgc2l6ZW9mKERDQikpOwoJaWYobHB0aW1lb3V0cykgbWVtY3B5KCZ0aW1lb3V0cywgbHB0aW1lb3V0cywgc2l6ZW9mKENPTU1USU1FT1VUUykpOwoKCXB0ciA9IENPTU1fUGFyc2VTdGFydChwdHIpOwoKCWlmKHB0ciA9PSBOVUxMKQoJCXJlc3VsdCA9IEZBTFNFOwoJZWxzZSBpZihzdHJjaHJXKHB0ciwgJywnKSkKCQlyZXN1bHQgPSBDT01NX0J1aWxkT2xkQ29tbURDQihwdHIsICZkY2IpOwoJZWxzZQoJCXJlc3VsdCA9IENPTU1fQnVpbGROZXdDb21tRENCKHB0ciwgJmRjYiwgJnRpbWVvdXRzKTsKCglpZihyZXN1bHQpCgl7CgkJbWVtY3B5KGxwZGNiLCAmZGNiLCBzaXplb2YoRENCKSk7CgkJaWYobHB0aW1lb3V0cykgbWVtY3B5KGxwdGltZW91dHMsICZ0aW1lb3V0cywgc2l6ZW9mKENPTU1USU1FT1VUUykpOwoJCXJldHVybiBUUlVFOwoJfQoJZWxzZQoJewoJCVdBUk4oIkludmFsaWQgZGV2aWNlIGNvbnRyb2wgc3RyaW5nOiAlc1xuIiwgZGVidWdzdHJfdyhkZXZpZCkpOwoJCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkJcmV0dXJuIEZBTFNFOwoJfQkKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCVwkJKEtFUk5FTDMyLkApCiAqCiAqICBVcGRhdGVzIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgc3RydWN0dXJlIHdpdGggdmFsdWVzIGZyb20gYW4KICogIHVuaWNvZGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAgVGhlIGRldmljZSBjb250cm9sIHN0cmluZyBoYXMgdHdvIGZvcm1zCiAqICBub3JtYWwgYW5kIGV4dGVuZGVkLCBpdCBtdXN0IGJlIGV4Y2x1c2l2ZWx5IGluIG9uZSBvciB0aGUgb3RoZXIgZm9ybS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBhIG1hbGZvcm1lZCBjb250cm9sIHN0cmluZy4KICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQlcoCiAgICBMUENXU1RSIGRldmlkLCAvKiBbaW5dIFRoZSB1bmljb2RlIGRldmljZSBjb250cm9sIHN0cmluZy4gKi8KICAgIExQRENCICAgbHBkY2IpIC8qIFtvdXRdIFRoZSBkZXZpY2UgY29udHJvbCBibG9jayB0byBiZSB1cGRhdGVkLiAqLwp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNXKGRldmlkLGxwZGNiLE5VTEwpOwp9CgpzdGF0aWMgQk9PTCBDT01NX1NldENvbW1FcnJvcihIQU5ETEUgaGFuZGxlLCBEV09SRCBlcnJvcikKewogICAgRFdPUkQgcmV0OwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHNldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICAgICAgcmVxLT5mbGFncyA9IFNFUklBTElORk9fU0VUX0VSUk9SOwogICAgICAgIHJlcS0+Y29tbWVycm9yID0gZXJyb3I7CiAgICAgICAgcmV0ID0gIXdpbmVfc2VydmVyX2NhbGxfZXJyKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIEJPT0wgQ09NTV9HZXRDb21tRXJyb3IoSEFORExFIGhhbmRsZSwgTFBEV09SRCBscGVycm9yKQp7CiAgICBEV09SRCByZXQ7CgogICAgaWYoIWxwZXJyb3IpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIGdldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICAgICAgcmV0ID0gIXdpbmVfc2VydmVyX2NhbGxfZXJyKCByZXEgKTsKICAgICAgICAqbHBlcnJvciA9IHJlcGx5LT5jb21tZXJyb3I7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUJyZWFrCQkoS0VSTkVMMzIuQCkKICoKICogIEhhbHRzIHRoZSB0cmFuc21pc3Npb24gb2YgY2hhcmFjdGVycyB0byBhIGNvbW11bmljYXRpb25zIGRldmljZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBhbmQgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb25zIGRldmljZSBjb3VsZCBub3QgYmUgZm91bmQsCiAqICB0aGUgY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkLgogKgogKiBCVUdTCiAqCiAqICBPbmx5IFRJT0NTQlJLIGFuZCBUSU9DQ0JSSyBhcmUgc3VwcG9ydGVkLgogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbUJyZWFrKAogICAgSEFORExFIGhhbmRsZSkgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlIHRvIHN1c3BlbmQuICovCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwoKCWZkID0gZ2V0X2NvbW1fZmQoIGhhbmRsZSwgR0VORVJJQ19SRUFEICk7CglpZihmZDwwKSByZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DU0JSSywwKTsKCXJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJaWYgKHJlc3VsdCA9PS0xKQoJICB7CgkgICAgICAgIFRSQUNFKCJpb2N0bCBmYWlsZWRcbiIpOwoJCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCQlyZXR1cm4gRkFMU0U7CgkgIH0KCXJldHVybiBUUlVFOwojZWxzZQoJRklYTUUoImlvY3RsIG5vdCBhdmFpbGFibGVcbiIpOwoJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCQkoS0VSTkVMMzIuQCkKICoKICogIFJlc3VtZXMgY2hhcmFjdGVyIHRyYW5zbWlzc2lvbiBmcm9tIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb25zIGRldmljZSBjb3VsZCBub3QgYmUgZm91bmQuCiAqCiAqIEJVR1MKICoKICogIE9ubHkgVElPQ1NCUksgYW5kIFRJT0NDQlJLIGFyZSBzdXBwb3J0ZWQuCiAqLwpCT09MIFdJTkFQSSBDbGVhckNvbW1CcmVhaygKICAgIEhBTkRMRSBoYW5kbGUpIC8qIFtpbl0gVGhlIGhhbHRlZCBjb21tdW5pY2F0aW9uIGRldmljZSB3aG9zZSBjaGFyYWN0ZXIgdHJhbnNtaXNzaW9uIGlzIHRvIGJlIHJlc3VtZWQuICovCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwoKCWZkID0gZ2V0X2NvbW1fZmQoIGhhbmRsZSwgR0VORVJJQ19SRUFEICk7CglpZihmZDwwKSByZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCXJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJaWYgKHJlc3VsdCA9PS0xKQoJICB7CgkgICAgICAgIFRSQUNFKCJpb2N0bCBmYWlsZWRcbiIpOwoJCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCQlyZXR1cm4gRkFMU0U7CgkgIH0KCXJldHVybiBUUlVFOwojZWxzZQoJRklYTUUoImlvY3RsIG5vdCBhdmFpbGFibGVcbiIpOwoJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUVzY2FwZUNvbW1GdW5jdGlvbgkoS0VSTkVMMzIuQCkKICoKICogIERpcmVjdHMgYSBjb21tdW5pY2F0aW9uIGRldmljZSB0byBwZXJmb3JtIGFuIGV4dGVuZGVkIGZ1bmN0aW9uLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9yIHJlcXVlc3RlZCBkYXRhIG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZCwKICogIGZhbHNlIGlmIHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQgY2Fubm90IGV4ZWN1dGUgdGhlIGNvbW1hbmQKICogIG9yIHRoZSBjb21tYW5kIGZhaWxlZC4KICovCkJPT0wgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbigKICAgIEhBTkRMRSBoYW5kbGUsICAgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb24gZGV2aWNlIHRvIHBlcmZvcm0gdGhlIGV4dGVuZGVkIGZ1bmN0aW9uLiAqLwogICAgVUlOVCAgIG5GdW5jdGlvbikgLyogW2luXSBUaGUgZXh0ZW5kZWQgZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkLiAqLwp7CglpbnQgZmQsZGlyZWN0PUZBTFNFLHJlc3VsdD1GQUxTRTsKCXN0cnVjdCB0ZXJtaW9zCXBvcnQ7CgogICAgCVRSQUNFKCJoYW5kbGUgJXAsIGZ1bmN0aW9uPSVkXG4iLCBoYW5kbGUsIG5GdW5jdGlvbik7CglmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoKCWlmICh0Y2dldGF0dHIoZmQsJnBvcnQpID09IC0xKSB7CgkJQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CgkJcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkgICAgICAgIFRSQUNFKCJcbiIpOwoJCQlicmVhazsKCgkJY2FzZSBDTFJEVFI6CgkJICAgICAgICBUUkFDRSgiQ0xSRFRSXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIH5USU9DTV9EVFIsIDApOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgQ0xSUlRTOgoJCSAgICAgICAgVFJBQ0UoIkNMUlJUU1xuIik7CiNpZmRlZiBUSU9DTV9SVFMKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fUlRTLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVERUUjoKCQkgICAgICAgIFRSQUNFKCJTRVREVFJcbiIpOwojaWZkZWYgVElPQ01fRFRSCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgMCwgVElPQ01fRFRSKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVFJUUzoKCQkgICAgICAgIFRSQUNFKCJTRVRSVFNcbiIpOwojaWZkZWYgVElPQ01fUlRTCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgMCwgVElPQ01fUlRTKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVFhPRkY6CgkJICAgICAgICBUUkFDRSgiU0VUWE9GRlxuIik7CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPTlxuIik7CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJCQlicmVhazsKCQljYXNlIFNFVEJSRUFLOgoJCQlUUkFDRSgic2V0YnJlYWtcbiIpOwojaWZkZWYgCVRJT0NTQlJLCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQgPSBpb2N0bChmZCxUSU9DU0JSSywwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWNhc2UgQ0xSQlJFQUs6CgkJCVRSQUNFKCJjbHJicmVha1xuIik7CiNpZmRlZiAJVElPQ1NCUksKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdCA9IGlvY3RsKGZkLFRJT0NDQlJLLDApOwoJCQlicmVhazsKI2VuZGlmCgkJZGVmYXVsdDoKCQkJV0FSTigiKGhhbmRsZT0lcCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLAoJCQloYW5kbGUsIG5GdW5jdGlvbik7CgkJCWJyZWFrOwoJfQoKCWlmICghZGlyZWN0KQoJICBpZiAodGNzZXRhdHRyKGZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCXJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCUNPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwoJCXJldHVybiBGQUxTRTsKCSAgfSBlbHNlCgkgICAgICAgIHJlc3VsdD0gVFJVRTsKCWVsc2UKCSAgewoJICAgIGlmIChyZXN1bHQgPT0gLTEpCgkgICAgICB7CgkJcmVzdWx0PSBGQUxTRTsKCQlDT01NX1NldENvbW1FcnJvcihoYW5kbGUsQ0VfSU9FKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICByZXN1bHQgPSBUUlVFOwoJICB9CglyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFB1cmdlQ29tbSAgICAgICAgKEtFUk5FTDMyLkApCiAqCiAqICBUZXJtaW5hdGVzIHBlbmRpbmcgb3BlcmF0aW9ucyBhbmQvb3IgZGlzY2FyZHMgYnVmZmVycyBvbiBhCiAqICBjb21tdW5pY2F0aW9uIHJlc291cmNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9ucyBoYW5kbGUgaXMgYmFkLgogKi8KQk9PTCBXSU5BUEkgUHVyZ2VDb21tKAogICAgSEFORExFIGhhbmRsZSwgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbiByZXNvdXJjZSB0byBiZSBwdXJnZWQuICovCiAgICBEV09SRCAgZmxhZ3MpICAvKiBbaW5dIEZsYWdzIGZvciBjbGVhciBwZW5kaW5nL2J1ZmZlciBvbiBpbnB1dC9vdXRwdXQuICovCnsKICAgICBpbnQgZmQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJXAsIGZsYWdzICVseFxuIiwgaGFuZGxlLCBmbGFncyk7CgogICAgIGZkID0gZ2V0X2NvbW1fZmQoIGhhbmRsZSwgR0VORVJJQ19SRUFEICk7CiAgICAgaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoKICAgICAvKgogICAgICoqIG5vdCBleGFjdGx5IHN1cmUgaG93IHRoZXNlIGFyZSBkaWZmZXJlbnQKICAgICAqKiBQZXJoYXBzIGlmIHdlIGhhZCBvdXIgb3duIGludGVybmFsIHF1ZXVlcywgb25lIGZsdXNoZXMgdGhlbQogICAgICoqIGFuZCB0aGUgb3RoZXIgZmx1c2hlcyB0aGUga2VybmVsJ3MgYnVmZmVycy4KICAgICAqLwogICAgIGlmKGZsYWdzJlBVUkdFX1RYQUJPUlQpCiAgICAgICAgIHRjZmx1c2goZmQsVENPRkxVU0gpOwogICAgIGlmKGZsYWdzJlBVUkdFX1JYQUJPUlQpCiAgICAgICAgIHRjZmx1c2goZmQsVENJRkxVU0gpOwogICAgIGlmKGZsYWdzJlBVUkdFX1RYQ0xFQVIpCiAgICAgICAgIHRjZmx1c2goZmQsVENPRkxVU0gpOwogICAgIGlmKGZsYWdzJlBVUkdFX1JYQ0xFQVIpCiAgICAgICAgIHRjZmx1c2goZmQsVENJRkxVU0gpOwogICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoKICAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUVycm9yCShLRVJORUwzMi5AKQogKgogKiAgRW5hYmxlcyBmdXJ0aGVyIEkvTyBvcGVyYXRpb25zIG9uIGEgY29tbXVuaWNhdGlvbnMgcmVzb3VyY2UgYWZ0ZXIKICogIHN1cHBseWluZyBlcnJvciBhbmQgY3VycmVudCBzdGF0dXMgaW5mb3JtYXRpb24uCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UgaGFuZGxlIGlzIGJhZC4KICovCkJPT0wgV0lOQVBJIENsZWFyQ29tbUVycm9yKAogICAgSEFORExFICAgIGhhbmRsZSwgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbiByZXNvdXJjZSB3aXRoIHRoZSBlcnJvci4gKi8KICAgIExQRFdPUkQgICBlcnJvcnMsIC8qIFtvdXRdIEZsYWdzIGluZGljYXRpbmcgZXJyb3IgdGhlIHJlc291cmNlIGV4cGVyaWVuY2VkLiAqLwogICAgTFBDT01TVEFUIGxwU3RhdCkgLyogW291dF0gVGhlIHN0YXR1cyBvZiB0aGUgY29tbXVuaWNhdGlvbiByZXNvdXJjZS4gKi8KewogICAgaW50IGZkOwoKICAgIGZkPWdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgaWYoMD5mZCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChscFN0YXQpCiAgICB7CiAgICAgICAgbHBTdGF0LT5mQ3RzSG9sZCA9IDA7CglscFN0YXQtPmZEc3JIb2xkID0gMDsKCWxwU3RhdC0+ZlJsc2RIb2xkID0gMDsKCWxwU3RhdC0+ZlhvZmZIb2xkID0gMDsKCWxwU3RhdC0+ZlhvZmZTZW50ID0gMDsKCWxwU3RhdC0+ZkVvZiA9IDA7CglscFN0YXQtPmZUeGltID0gMDsKCWxwU3RhdC0+ZlJlc2VydmVkID0gMDsKCiNpZmRlZiBUSU9DT1VUUQoJaWYoaW9jdGwoZmQsIFRJT0NPVVRRLCAmbHBTdGF0LT5jYk91dFF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwojZWxzZQoJbHBTdGF0LT5jYk91dFF1ZSA9IDA7IC8qIEZJWE1FOiBmaW5kIGEgZGlmZmVyZW50IHdheSB0byBmaW5kIG91dCAqLwojZW5kaWYKCiNpZmRlZiBUSU9DSU5RCglpZihpb2N0bChmZCwgVElPQ0lOUSwgJmxwU3RhdC0+Y2JJblF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwojZW5kaWYKCglUUkFDRSgiaGFuZGxlICVwIGNiSW5RdWUgPSAlbGQgY2JPdXRRdWUgPSAlbGRcbiIsCgkgICAgICBoYW5kbGUsIGxwU3RhdC0+Y2JJblF1ZSwgbHBTdGF0LT5jYk91dFF1ZSk7CiAgICB9CgogICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgogICAgQ09NTV9HZXRDb21tRXJyb3IoaGFuZGxlLCBlcnJvcnMpOwogICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLCAwKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU2V0dXBDb21tICAgICAgIChLRVJORUwzMi5AKQogKgogKiAgQ2FsbGVkIGFmdGVyIENyZWF0ZUZpbGUgdG8gaGludCB0byB0aGUgY29tbXVuaWNhdGlvbiByZXNvdXJjZSB0byB1c2UKICogIHNwZWNpZmllZCBzaXplcyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IHZhbHVlcy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgcmVzb3VyY2UgaGFuZGxlIGlzIGJhZC4KICoKICogQlVHUwogKgogKiAgU3R1Yi4KICovCkJPT0wgV0lOQVBJIFNldHVwQ29tbSgKICAgIEhBTkRMRSBoYW5kbGUsICAvKiBbaW5dIFRoZSBqdXN0IGNyZWF0ZWQgY29tbXVuaWNhdGlvbiByZXNvdXJjZSBoYW5kbGUuICovCiAgICBEV09SRCAgaW5zaXplLCAgLyogW2luXSBUaGUgc3VnZ2VzdGVkIHNpemUgb2YgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2VzIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4gKi8KICAgIERXT1JEICBvdXRzaXplKSAvKiBbaW5dIFRoZSBzdWdnZXN0ZWQgc2l6ZSBvZiB0aGUgY29tbXVuaWNhdGlvbiByZXNvdXJjZXMgb3V0cHV0IGJ1ZmZlciBpbiBieXRlcy4gKi8KewogICAgaW50IGZkOwoKICAgIEZJWE1FKCJpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKICAgIGZkPWdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgaWYoMD5mZCkgcmV0dXJuIEZBTFNFOwogICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1NYXNrCShLRVJORUwzMi5AKQogKgogKiAgT2J0YWluIHRoZSBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UgdGhhdCB3aWxsIGNhdXNlCiAqICBhIGNhbGwgV2FpdENvbW1FdmVudCB0byByZXR1cm4uCiAqCiAqICBSRVRVUk5TCiAqCiAqICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWlsIG9uIGJhZCBkZXZpY2UgaGFuZGxlIGV0Yy4KICovCkJPT0wgV0lOQVBJIEdldENvbW1NYXNrKAogICAgSEFORExFICBoYW5kbGUsICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuICovCiAgICBMUERXT1JEIGV2dG1hc2spIC8qIFtvdXRdIFRoZSBldmVudHMgd2hpY2ggY2F1c2UgV2FpdENvbW1FdmVudCB0byByZXR1cm4uICovCnsKICAgIEJPT0wgcmV0OwoKICAgIFRSQUNFKCJoYW5kbGUgJXAsIG1hc2sgJXBcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggZ2V0X3NlcmlhbF9pbmZvICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSA9IGhhbmRsZTsKICAgICAgICBpZiAoKHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICkpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV2dG1hc2spICpldnRtYXNrID0gcmVwbHktPmV2ZW50bWFzazsKICAgICAgICB9CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tTWFzawkoS0VSTkVMMzIuQCkKICoKICogIFRoZXJlIGJlIHNvbWUgdGhpbmdzIHdlIG5lZWQgdG8gaGVhciBhYm91dCB5b24gdGhlcmUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKiAgKFNldCB3aGljaCBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdGlvbiBkZXZpY2Ugc2hvdWxkIGNhdXNlCiAqICBhIGNhbGwgV2FpdENvbW1FdmVudCB0byByZXR1cm4uKQogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGJhZCBoYW5kbGUgZXRjLgogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbU1hc2soCiAgICBIQU5ETEUgaGFuZGxlLCAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAgKi8KICAgIERXT1JEICBldnRtYXNrKSAvKiBbaW5dIFRoZSBldmVudHMgdGhhdCBhcmUgdG8gYmUgbW9uaXRvcmVkLiAqLwp7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiaGFuZGxlICVwLCBtYXNrICVseFxuIiwgaGFuZGxlLCBldnRtYXNrKTsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlICAgID0gaGFuZGxlOwogICAgICAgIHJlcS0+ZmxhZ3MgICAgID0gU0VSSUFMSU5GT19TRVRfTUFTSzsKICAgICAgICByZXEtPmV2ZW50bWFzayA9IGV2dG1hc2s7CiAgICAgICAgcmV0ID0gIXdpbmVfc2VydmVyX2NhbGxfZXJyKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZSAgICAoS0VSTkVMMzIuQCkKICoKICogIFJlLWluaXRpYWxpemVzIGFsbCBoYXJkd2FyZSBhbmQgY29udHJvbCBzZXR0aW5ncyBvZiBhIGNvbW11bmljYXRpb25zIGRldmljZSwKICogIHdpdGggdmFsdWVzIGZyb20gYSBkZXZpY2UgY29udHJvbCBibG9jayB3aXRob3V0IGVmZmVjdGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dAogKiAgcXVldWVzLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUgZWcgaWYgdGhlIFhvbkNoYXIgaXMgZXF1YWwgdG8gdGhlIFhvZmZDaGFyLgogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVN0YXRlKAogICAgSEFORExFIGhhbmRsZSwgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBEQ0IgIGxwZGNiKSAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrLiAqLwp7CiAgICAgc3RydWN0IHRlcm1pb3MgcG9ydDsKICAgICBpbnQgZmQsIGJ5dGVzaXplLCBzdG9wYml0czsKICAgICBCT09MIHJldDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlcCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKICAgICBUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CiAgICAgVFJBQ0UoIiVzICVzXG4iLChscGRjYi0+ZkluWCk/IklYT04iOiJ+SVhPTiIsCgkgICAobHBkY2ItPmZPdXRYKT8iSVhPRkYiOiJ+SVhPRkYiKTsKICAgICBUUkFDRSgiZk91dHhDdHNGbG93ICVkIGZSdHNDb250cm9sICVkXG4iLCBscGRjYi0+Zk91dHhDdHNGbG93LAogICAgICAgICAgICAgbHBkY2ItPmZSdHNDb250cm9sKTsKICAgICBUUkFDRSgiZk91dHhEc3JGbG93ICVkIGZEdHJDb250cm9sJWRcbiIsIGxwZGNiLT5mT3V0eERzckZsb3csCiAgICAgICAgICAgICBscGRjYi0+ZkR0ckNvbnRyb2wpOwogICAgICAgICAgICAgCgogICAgIGZkID0gZ2V0X2NvbW1fZmQoIGhhbmRsZSwgR0VORVJJQ19SRUFEICk7CiAgICAgaWYgKGZkIDwgMCkgcmV0dXJuIEZBTFNFOwoKICAgICBpZiAoKHRjZ2V0YXR0cihmZCwmcG9ydCkpID09IC0xKSB7CiAgICAgICAgIGludCBzYXZlX2Vycm9yID0gZXJybm87CiAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwogICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMDsKCQkJYnJlYWs7CgkJY2FzZSA1MDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1MDsKCQkJYnJlYWs7CgkJY2FzZSA3NToKCQkJcG9ydC5jX2NmbGFnIHw9IEI3NTsKCQkJYnJlYWs7CgkJY2FzZSAxMTA6CgkJY2FzZSBDQlJfMTEwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExMDsKCQkJYnJlYWs7CgkJY2FzZSAxMzQ6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTM0OwoJCQlicmVhazsKCQljYXNlIDE1MDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxNTA7CgkJCWJyZWFrOwoJCWNhc2UgMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjIwMDsKCQkJYnJlYWs7CgkJY2FzZSAzMDA6CgkJY2FzZSBDQlJfMzAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjMwMDsKCQkJYnJlYWs7CgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CgkJY2FzZSAxMjAwOgoJCWNhc2UgQ0JSXzEyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSAxODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjE4MDA7CgkJCWJyZWFrOwoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgNDgwMDoKCQljYXNlIENCUl80ODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgOTYwMDoKCQljYXNlIENCUl85NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzg0MDA6CgkJY2FzZSBDQlJfMzg0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgMTE1MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExNTIwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjIzMDQwMAoJCWNhc2UgMjMwNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjIzMDQwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjQ2MDgwMAoJCWNhc2UgNDYwODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ2MDgwMDsKCQkJYnJlYWs7CiNlbmRpZgogICAgICAgCSAgICAgICAgZGVmYXVsdDoKI2lmIGRlZmluZWQgKEhBVkVfTElOVVhfU0VSSUFMX0gpICYmIGRlZmluZWQgKFRJT0NTU0VSSUFMKQoJCQl7ICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbnV0czsKCQkJICAgIGludCBhcmJ5OwoJCQkgICAgaW9jdGwoZmQsIFRJT0NHU0VSSUFMLCAmbnV0cyk7CgkJCSAgICBudXRzLmN1c3RvbV9kaXZpc29yID0gbnV0cy5iYXVkX2Jhc2UgLyBscGRjYi0+QmF1ZFJhdGU7CgkJCSAgICBpZiAoIShudXRzLmN1c3RvbV9kaXZpc29yKSkgbnV0cy5jdXN0b21fZGl2aXNvciA9IDE7CgkJCSAgICBhcmJ5ID0gbnV0cy5iYXVkX2Jhc2UgLyBudXRzLmN1c3RvbV9kaXZpc29yOwoJCQkgICAgbnV0cy5mbGFncyAmPSB+QVNZTkNfU1BEX01BU0s7CgkJCSAgICBudXRzLmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJCQkgICAgV0FSTigiWW91IChvciBhIHByb2dyYW0gYWN0aW5nIGF0IHlvdXIgYmVoZXN0KSBoYXZlIHNwZWNpZmllZFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBub24tc3RhbmRhcmQgYmF1ZCByYXRlICVsZC4gIFdpbmUgd2lsbCBzZXQgdGhlIHJhdGUgdG8gJWQsXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBpcyBhcyBjbG9zZSBhcyB3ZSBjYW4gZ2V0IGJ5IG91ciBwcmVzZW50IHVuZGVyc3RhbmRpbmcgb2YgeW91clxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFyZHdhcmUuIEkgaG9wZSB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuICBBbnkgZGlzcnVwdGlvbiBXaW5lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgY2F1c2VkIHRvIHlvdXIgbGludXggc3lzdGVtIGNhbiBiZSB1bmRvbmUgd2l0aCBzZXRzZXJpYWwgXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc2VlIG1hbiBzZXRzZXJpYWwpLiBJZiB5b3UgaGF2ZSBpbmNhcGFjaXRhdGVkIGEgSGF5ZXMgdHlwZSBtb2RlbSxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc2V0IGl0IGFuZCBpdCB3aWxsIHByb2JhYmx5IHJlY292ZXIuXG4iLCBscGRjYi0+QmF1ZFJhdGUsIGFyYnkpOwogIAkJCSAgICBpb2N0bChmZCwgVElPQ1NTRVJJQUwsICZudXRzKTsKCQkJICAgIHBvcnQuY19jZmxhZyB8PSBCMzg0MDA7CiAJCQl9CiAJCQlicmVhazsKI2VuZGlmICAgIC8qIERvbid0IGhhdmUgbGludXgvc2VyaWFsLmggb3IgbGFjayBUSU9DU1NFUklBTCAqLwoKCiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CQVVEUkFURSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNTA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI3NTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDExMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzExMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMTA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMzQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTM0OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTUwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjE1MDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8zMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDEyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjEyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjE4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyNDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMjQwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIyNDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDgwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzQ4MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNDgwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl85NjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjk2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzE5MjAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjE5MjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzg0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8zODQwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzODQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBCNTc2MDAKCQljYXNlIDU3NjAwOgoJCWNhc2UgQ0JSXzU3NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjU3NjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSAxMTUyMDA6CgkJY2FzZSBDQlJfMTE1MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExNTIwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjIzMDQwMAoJCWNhc2UgMjMwNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjIzMDQwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjQ2MDgwMAoJCWNhc2UgNDYwODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ2MDgwMDsKCQkJYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JBVURSQVRFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgICAgIGJ5dGVzaXplPWxwZGNiLT5CeXRlU2l6ZTsKICAgICAgICBzdG9wYml0cz1scGRjYi0+U3RvcEJpdHM7CgojaWZkZWYgQ01TUEFSCglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOwojZWxzZQoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REKTsKI2VuZGlmCglpZiAobHBkY2ItPmZQYXJpdHkpCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyB8PSBJTlBDSzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgc3dpdGNoIChscGRjYi0+UGFyaXR5KSB7CiAgICAgICAgICAgICAgICBjYXNlIE5PUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgT0REUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IFBBUk9ERCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFVkVOUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKI2lmZGVmIENNU1BBUgogICAgICAgICAgICAgICAgLyogTGludXggZGVmaW5lcyBtYXJrL3NwYWNlIChzdGljaykgcGFyaXR5ICovCiAgICAgICAgICAgICAgICBjYXNlIE1BUktQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgQ01TUEFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNQQUNFUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IFBBUk9ERCB8ICBDTVNQQVIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKI2Vsc2UKICAgICAgICAgICAgICAgIC8qIHRyeSB0aGUgUE9TSVggd2F5ICovCiAgICAgICAgICAgICAgICBjYXNlIE1BUktQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzdG9wYml0cyA9PSBPTkVTVE9QQklUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wYml0cyA9IFRXT1NUT1BCSVRTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiQ2Fubm90IHNldCBNQVJLIFBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNQQUNFUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggYnl0ZXNpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc2l6ZSArPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJDYW5ub3Qgc2V0IFNQQUNFIFBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsSUVfQllURVNJWkUpOwogICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQkJRVJSKCJQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKCglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChieXRlc2l6ZSkgewoJCWNhc2UgNToKCQkJcG9ydC5jX2NmbGFnIHw9IENTNTsKCQkJYnJlYWs7CgkJY2FzZSA2OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M2OwoJCQlicmVhazsKCQljYXNlIDc6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzc7CgkJCWJyZWFrOwoJCWNhc2UgODoKCQkJcG9ydC5jX2NmbGFnIHw9IENTODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiQnl0ZVNpemVcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3dpdGNoIChzdG9wYml0cykgewoJCWNhc2UgT05FU1RPUEJJVDoKCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwoJCQkJYnJlYWs7CgkJY2FzZSBPTkU1U1RPUEJJVFM6IC8qIHdpbGwgYmUgc2VsZWN0ZWQgaWYgYnl0ZXNpemUgaXMgNSAqLwoJCWNhc2UgVFdPU1RPUEJJVFM6CgkJCQlwb3J0LmNfY2ZsYWcgfD0gQ1NUT1BCOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiU3RvcEJpdHNcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfSEFORFNIQUtFCgkpCgkgIHsKCSAgICBwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCSAgICBUUkFDRSgiQ1JUU0NUU1xuIik7CgkgIH0KI2VuZGlmCgoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJaWYgKHRjc2V0YXR0cihmZCxUQ1NBTk9XLCZwb3J0KT09LTEpIHsgLyogb3RoZXJ3aXNlIGl0IGhhbmdzIHdpdGggcGVuZGluZyBpbnB1dCovCiAgICAgICAgICAgICAgICBFUlIoInRjc2V0YXR0ciBlcnJvciAnJXMnXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CgkJcmV0ID0gRkFMU0U7Cgl9IGVsc2UgewogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLDApOwoJCXJldCA9IFRSVUU7Cgl9CgogICAgICAgIC8qIG5vdGU6IGNoYW5nZSBEVFIvUlRTIGxpbmVzIGFmdGVyIHNldHRpbmcgdGhlIGNvbW0gYXR0cmlidXRlcywKICAgICAgICAgKiBzbyBmbG93IGNvbnRyb2wgZG9lcyBub3QgaW50ZXJmZXJlLiAqLwojaWZkZWYgVElPQ01fRFRSCglpZiAobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0hBTkRTSEFLRSkKICAgICAgICB7CiAgICAgICAgICAgICBXQVJOKCJEU1IvRFRSIGZsb3cgY29udHJvbCBub3Qgc3VwcG9ydGVkXG4iKTsKCX0gZWxzZSBpZihscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRElTQUJMRSkKICAgICAgICAgICAgQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKICAgICAgICBlbHNlICAgIAogICAgICAgICAgICBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX0RUUik7CiNlbmRpZgojaWZkZWYgVElPQ01fUlRTCglpZighbHBkY2ItPmZPdXR4Q3RzRmxvdyApCiAgICAgICAgewogICAgICAgICAgICBpZihscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRElTQUJMRSkKICAgICAgICAgICAgICAgIENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CiAgICAgICAgICAgIGVsc2UgICAgCiAgICAgICAgICAgICAgICBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX1JUUyk7CiAgICAgICAgfQojZW5kaWYKICAgICAgICBpZihscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfVE9HR0xFKQogICAgICAgICAgICBGSVhNRSgiUlRTX0NPTlRST0xfVE9HR0xFIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICByZXR1cm4gcmV0OwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKEtFUk5FTDMyLkApCiAqCiAqICBGaWxscyBpbiBhIGRldmljZSBjb250cm9sIGJsb2NrIHdpdGggaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRpb25zIGRldmljZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UgaGFuZGxlIGlzIGJhZCBldGMKICoKICogQlVHUwogKgogKiAgWG9uQ2hhciBhbmQgWG9mZkNoYXIgYXJlIG5vdCBzZXQuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tU3RhdGUoCiAgICBIQU5ETEUgaGFuZGxlLCAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuICovCiAgICBMUERDQiAgbHBkY2IpICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2suICovCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZCxzcGVlZDsKICAgICBpbnQgc3RhdCA9IERUUl9DT05UUk9MX0VOQUJMRSB8IFJUU19DT05UUk9MX0VOQUJMRTsKCiAgICAgVFJBQ0UoImhhbmRsZSAlcCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgZmQgPSBnZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgICBpZiAoZmQgPCAwKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHRjZ2V0YXR0cihmZCwgJnBvcnQpID09IC0xCiNpZmRlZiBUSU9DTUdFVAogICAgICAgICAgICAgfHwgaW9jdGwoZmQsIFRJT0NNR0VULCAmc3RhdCkgPT0gLTEKI2VuZGlmCiAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIGludCBzYXZlX2Vycm9yPWVycm5vOwogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgb3IgaW9jdGwgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CiAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CiAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICBzcGVlZD0gKHBvcnQuY19jZmxhZyAmIENCQVVEKTsKI2Vsc2UKICAgICBzcGVlZD0gKGNmZ2V0b3NwZWVkKCZwb3J0KSk7CiNlbmRpZgogICAgIHN3aXRjaCAoc3BlZWQpIHsKCQljYXNlIEIwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAwOwoJCQlicmVhazsKCQljYXNlIEI1MDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTA7CgkJCWJyZWFrOwoJCWNhc2UgQjc1OgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA3NTsKCQkJYnJlYWs7CgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjEzNDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTM0OwoJCQlicmVhazsKCQljYXNlIEIxNTA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE1MDsKCQkJYnJlYWs7CgkJY2FzZSBCMjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSBCNTc2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDU3NjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKICAgICAgICAgICAgICAgIGNhc2UgQjIzMDQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjMwNDAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCNDYwODAwCiAgICAgICAgICAgICAgICBjYXNlIEI0NjA4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ2MDgwMDsKCQkJYnJlYWs7CiNlbmRpZgoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNwZWVkICV4IFxuIixzcGVlZCk7Cgl9CiNlbmRpZgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA1OwoJCQlicmVhazsKCQljYXNlIENTNjoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNjsKCQkJYnJlYWs7CgkJY2FzZSBDUzc6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDc7CgkJCWJyZWFrOwoJCWNhc2UgQ1M4OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA4OwoJCQlicmVhazsKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzaXplICV4IFxuIixwb3J0LmNfY2ZsYWcgJiBDU0laRSk7Cgl9CgogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwojaWZkZWYgQ01TUEFSCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpKQojZWxzZQoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkKI2VuZGlmCgl7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsKCQkJYnJlYWs7CiNpZmRlZiBDTVNQQVIKCQljYXNlIChQQVJFTkIgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gTUFSS1BBUklUWTsKCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gU1BBQ0VQQVJJVFk7CgkJCWJyZWFrOwojZW5kaWYKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQogICAgICAgICAgICBpZihscGRjYi0+Qnl0ZVNpemUgPT0gNSkKICAgICAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORTVTVE9QQklUUzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgllbHNlCiAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPmZOdWxsID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCgkvKiB0ZXJtaW9zIGRvZXMgbm90IHN1cHBvcnQgRFRSL0RTUiBmbG93IGNvbnRyb2wgKi8KCWxwZGNiLT5mT3V0eERzckZsb3cgPSAwOwoJbHBkY2ItPmZEdHJDb250cm9sID0KI2lmZGVmIFRJT0NNX0RUUgogICAgICAgICAgICAhKHN0YXQgJiBUSU9DTV9EVFIpID8gIERUUl9DT05UUk9MX0RJU0FCTEU6CiNlbmRpZgogICAgICAgICAgICAgICAgRFRSX0NPTlRST0xfRU5BQkxFICA7CgojaWZkZWYgQ1JUU0NUUwoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfSEFORFNIQUtFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJfSBlbHNlCiNlbmRpZgoJewoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IAojaWZkZWYgVElPQ01fUlRTCiAgICAgICAgICAgICAgICAgICAgIShzdGF0ICYgVElPQ01fUlRTKSA/ICBSVFNfQ09OVFJPTF9ESVNBQkxFIDoKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgUlRTX0NPTlRST0xfRU5BQkxFIDsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMDsKCX0KCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0KCWxwZGNiLT5Yb2ZmQ2hhciA9CiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCiAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLDApOwoKICAgICAgICBUUkFDRSgiT0tcbiIpOwoKCVRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICAgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKCVRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiAgICAgICAgIFRSQUNFKCJmT3V0eEN0c0Zsb3cgJWQgZlJ0c0NvbnRyb2wgJWRcbiIsIGxwZGNiLT5mT3V0eEN0c0Zsb3csCiAgICAgICAgICAgICAgICAgbHBkY2ItPmZSdHNDb250cm9sKTsKICAgICAgICAgVFJBQ0UoImZPdXR4RHNyRmxvdyAlZCBmRHRyQ29udHJvbCVkXG4iLCBscGRjYi0+Zk91dHhEc3JGbG93LAogICAgICAgICAgICAgICAgIGxwZGNiLT5mRHRyQ29udHJvbCk7CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfSEFORFNIQUtFCgkJKQoJICBUUkFDRSgiQ1JUU0NUU1xuIik7CiAgICAgICAgZWxzZQoKCSAgVFJBQ0UoIn5DUlRTQ1RTXG4iKTsKI2VuZGlmCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKEtFUk5FTDMyLkApCiAqCiAqICBUcmFuc21pdHMgYSBzaW5nbGUgY2hhcmFjdGVyIGluIGZyb250IG9mIGFueSBwZW5kaW5nIGNoYXJhY3RlcnMgaW4gdGhlCiAqICBvdXRwdXQgYnVmZmVyLiAgVXN1YWxseSB1c2VkIHRvIHNlbmQgYW4gaW50ZXJydXB0IGNoYXJhY3RlciB0byBhIGhvc3QuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgaWYgdGhlIGNhbGwgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBjaGFyYWN0ZXIgdG8gdGhlCiAqICBzYW1lIGRldmljZSBoYXMgbm90IGJlZW4gc2VudCB5ZXQgdGhlIGhhbmRsZSBpcyBiYWQgZXRjLgogKgogKiBCVUdTCiAqCiAqICBTdHViLgogKi8KQk9PTCBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcigKICAgIEhBTkRMRSBoQ29tbSwgICAgICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9uIGRldmljZSBpbiBuZWVkIG9mIGEgY29tbWFuZCBjaGFyYWN0ZXIuICovCiAgICBDSEFSICAgY2hUcmFuc21pdCkgLyogW2luXSBUaGUgY2hhcmFjdGVyIHRvIHRyYW5zbWl0LiAqLwp7CiAgICBEV09SRCB3OwogICAgV0FSTigiKCVwLCclYycpIG5vdCBwZXJmZWN0IVxuIixoQ29tbSxjaFRyYW5zbWl0KTsKCiAgICByZXR1cm4gV3JpdGVGaWxlKCBoQ29tbSwgJmNoVHJhbnNtaXQsIDEsICZ3LCBOVUxMICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuQCkKICoKICogIE9idGFpbnMgdGhlIHJlcXVlc3QgdGltZW91dCB2YWx1ZXMgZm9yIHRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY29tbXVuaWNhdGlvbnMgZGV2aWNlIGhhbmRsZSBpcyBiYWQKICogIG9yIHRoZSB0YXJnZXQgc3RydWN0dXJlIGlzIG51bGwuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tVGltZW91dHMoCiAgICBIQU5ETEUgICAgICAgICBoQ29tbSwgICAgICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuICovCiAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSAvKiBbb3V0XSBUaGUgc3RydWN0IG9mIHJlcXVlc3QgdGltZW91dHMuICovCnsKICAgIEJPT0wgcmV0OwoKICAgIFRSQUNFKCIoJXAsJXApXG4iLGhDb21tLGxwdGltZW91dHMpOwoKICAgIGlmKCFscHRpbWVvdXRzKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIGdldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBoQ29tbTsKICAgICAgICBpZiAoKHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICkpKQogICAgICAgIHsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCAgICAgICAgID0gcmVwbHktPnJlYWRpbnRlcnZhbDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgID0gcmVwbHktPnJlYWRtdWx0OwogICAgICAgICAgICBscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQgICAgPSByZXBseS0+cmVhZGNvbnN0OwogICAgICAgICAgICBscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIgPSByZXBseS0+d3JpdGVtdWx0OwogICAgICAgICAgICBscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50ICAgPSByZXBseS0+d3JpdGVjb25zdDsKICAgICAgICB9CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tVGltZW91dHMJCShLRVJORUwzMi5AKQogKgogKiBTZXRzIHRoZSB0aW1lb3V0cyB1c2VkIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyBkYXRhIHRvL2Zyb20gQ09NTSBwb3J0cy4KICoKICogUmVhZEludGVydmFsVGltZW91dAogKiAgICAgLSBjb252ZXJ0ZWQgYW5kIHBhc3NlcyB0byBsaW51eCBrZXJuZWwgYXMgY19jY1tWVElNRV0KICogUmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIsIFJlYWRUb3RhbFRpbWVvdXRDb25zdGFudAogKiAgICAgLSB1c2VkIGluIFJlYWRGaWxlIHRvIGNhbGN1bGF0ZSBHZXRPdmVybGFwcGVkUmVzdWx0J3MgdGltZW91dAogKiBXcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIsIFdyaXRlVG90YWxUaW1lb3V0Q29uc3RhbnQKICogICAgIC0gdXNlZCBpbiBXcml0ZUZpbGUgdG8gY2FsY3VsYXRlIEdldE92ZXJsYXBwZWRSZXN1bHQncyB0aW1lb3V0CiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgaWYgdGhlIHRpbWVvdXRzIHdlcmUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tVGltZW91dHMoCiAgICBIQU5ETEUgaENvbW0sICAgICAgICAgICAgICAvKiBbaW5dIGhhbmRsZSBvZiBDT01NIGRldmljZSAqLwogICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgLyogW2luXSBwb2ludGVyIHRvIENPTU1USU1FT1VUUyBzdHJ1Y3R1cmUgKi8KewogICAgQk9PTCByZXQ7CiAgICBpbnQgZmQ7CiAgICBzdHJ1Y3QgdGVybWlvcyB0aW9zOwoKICAgIFRSQUNFKCIoJXAsJXApXG4iLGhDb21tLGxwdGltZW91dHMpOwoKICAgIGlmKCFscHRpbWVvdXRzKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHNldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgICAgICAgPSBoQ29tbTsKICAgICAgICByZXEtPmZsYWdzICAgICAgICA9IFNFUklBTElORk9fU0VUX1RJTUVPVVRTOwogICAgICAgIHJlcS0+cmVhZGludGVydmFsID0gbHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCA7CiAgICAgICAgcmVxLT5yZWFkbXVsdCAgICAgPSBscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllciA7CiAgICAgICAgcmVxLT5yZWFkY29uc3QgICAgPSBscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQgOwogICAgICAgIHJlcS0+d3JpdGVtdWx0ICAgID0gbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyIDsKICAgICAgICByZXEtPndyaXRlY29uc3QgICA9IGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0Q29uc3RhbnQgOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIGlmICghcmV0KSByZXR1cm4gRkFMU0U7CgogICAgLyogRklYTUU6IG1vdmUgdGhpcyBzdHVmZiB0byB0aGUgc2VydmVyICovCiAgICBmZCA9IGdldF9jb21tX2ZkKCBoQ29tbSwgR0VORVJJQ19SRUFEICk7CiAgICBpZiAoZmQgPCAwKSByZXR1cm4gRkFMU0U7CgogICAgaWYgKC0xPT10Y2dldGF0dHIoZmQsJnRpb3MpKSB7CiAgICAgICAgRklYTUUoInRjZ2V0YXR0ciBvbiBmZCAlZCBmYWlsZWQhXG4iLGZkKTsKICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhDb21tLCBmZCApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICAvKiBWVElNRSBpcyBpbiAxLzEwIHNlY29uZHMgKi8KCXsKCQl1bnNpZ25lZCBpbnQgdXhfdGltZW91dDsKCgkJaWYobHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCA9PSAwKSAvKiAwIG1lYW5zIG5vIHRpbWVvdXQgKi8KCQl7CgkJCXV4X3RpbWVvdXQgPSAwOwoJCX0KCQllbHNlCgkJewoJCQl1eF90aW1lb3V0ID0gKGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQrOTkpLzEwMDsKCQkJaWYodXhfdGltZW91dCA9PSAwKQoJCQl7CgkJCQl1eF90aW1lb3V0ID0gMTsgLyogbXVzdCBiZSBhdCBsZWFzdCBzb21lIHRpbWVvdXQgKi8KCQkJfQoJCX0KCQl0aW9zLmNfY2NbVlRJTUVdID0gdXhfdGltZW91dDsKCX0KCiAgICBpZiAoLTE9PXRjc2V0YXR0cihmZCwwLCZ0aW9zKSkgewogICAgICAgIEZJWE1FKCJ0Y3NldGF0dHIgb24gZmQgJWQgZmFpbGVkIVxuIixmZCk7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoQ29tbSwgZmQgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZWxlYXNlX2NvbW1fZmQoIGhDb21tLCBmZCApOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbU1vZGVtU3RhdHVzICAgKEtFUk5FTDMyLkApCiAqCiAqICBPYnRhaW5zIHRoZSBmb3VyIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyBpZiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIGlmIHRoZSBjb21tdW5pY2F0aW9ucyBoYW5kbGUgd2FzIGdvb2QgYW5kIGZvciBoYXJkd2FyZSB0aGF0CiAqICBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1vZGVtU3RhdHVzKAogICAgSEFORExFICBoRmlsZSwgICAgICAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBEV09SRCBscE1vZGVtU3RhdCkgLyogW291dF0gVGhlIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4gKi8KewoJaW50IGZkLG1zdGF0LCByZXN1bHQ9RkFMU0U7CgoJKmxwTW9kZW1TdGF0PTA7CiNpZmRlZiBUSU9DTUdFVAoJZmQgPSBnZXRfY29tbV9mZCggaEZpbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkKCQlyZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCwgVElPQ01HRVQsICZtc3RhdCk7CglyZWxlYXNlX2NvbW1fZmQoIGhGaWxlLCBmZCApOwoJaWYgKHJlc3VsdCA9PSAtMSkKCSAgewoJICAgIFdBUk4oImlvY3RsIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuIEZBTFNFOwoJICB9CiNpZmRlZiBUSU9DTV9DVFMKCWlmIChtc3RhdCAmIFRJT0NNX0NUUykKCSAgICAqbHBNb2RlbVN0YXQgfD0gTVNfQ1RTX09OOwojZW5kaWYKI2lmZGVmIFRJT0NNX0RTUgoJaWYgKG1zdGF0ICYgVElPQ01fRFNSKQoJICAqbHBNb2RlbVN0YXQgfD0gTVNfRFNSX09OOwojZW5kaWYKI2lmZGVmIFRJT0NNX1JORwoJaWYgKG1zdGF0ICYgVElPQ01fUk5HKQoJICAqbHBNb2RlbVN0YXQgfD0gTVNfUklOR19PTjsKI2VuZGlmCiNpZmRlZiBUSU9DTV9DQVIKCS8qRklYTUU6ICBOb3QgcmVhbGx5IHN1cmUgYWJvdXQgUkxTRCAgVUIgOTkwODEwKi8KCWlmIChtc3RhdCAmIFRJT0NNX0NBUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JMU0RfT047CiNlbmRpZgoJVFJBQ0UoIiUwNHggLT4gJXMlcyVzJXNcbiIsIG1zdGF0LAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfUkxTRF9PTik/Ik1TX1JMU0RfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JJTkdfT04pPyJNU19SSU5HX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19EU1JfT04pPyJNU19EU1JfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX0NUU19PTik/Ik1TX0NUU19PTiAiOiIiKTsKCXJldHVybiBUUlVFOwojZWxzZQoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIENPTU1fV2FpdENvbW1FdmVudFNlcnZpY2UgICAgICAoSU5URVJOQUwpCiAqCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGlsZSB0aGUgY2xpZW50IGlzIHdhaXRpbmcgb24gdGhlCiAqICBzZXJ2ZXIsIHNvIHdlIGNhbid0IG1ha2UgYW55IHNlcnZlciBjYWxscyBoZXJlLgogKi8Kc3RhdGljIHZvaWQgV0lOQVBJIENPTU1fV2FpdENvbW1FdmVudFNlcnZpY2Uodm9pZCogb3ZwLCBJT19TVEFUVVNfQkxPQ0sqIGlvc2IsIFVMT05HIHN0YXR1cykKewogICAgYXN5bmNfY29tbWlvICpjb21taW8gPSAoYXN5bmNfY29tbWlvKikgb3ZwOwoKICAgIFRSQUNFKCJpb3NiICVwXG4iLCBpb3NiKTsKCiAgICBzd2l0Y2ggKHN0YXR1cykKICAgIHsKICAgIGNhc2UgU1RBVFVTX0FMRVJURUQ6IC8qIGdvdCBzb21lIG5ldyBzdHVmZiAqLwogICAgICAgIC8qIEZJWE1FOiBkZXRlY3Qgb3RoZXIgZXZlbnRzICovCiAgICAgICAgKmNvbW1pby0+YnVmZmVyID0gRVZfUlhDSEFSOwogICAgICAgIGlvc2ItPnUuU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGlvc2ItPnUuU3RhdHVzID0gc3RhdHVzOwogICAgICAgIGJyZWFrOwogICAgfQogICAgd2luZV9zZXJ2ZXJfcmVsZWFzZV9mZCggY29tbWlvLT5oYW5kbGUsIGNvbW1pby0+ZmQgKTsKICAgIGlmICggKChMUE9WRVJMQVBQRUQpaW9zYiktPmhFdmVudCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSApCiAgICAgICAgTnRTZXRFdmVudCggKChMUE9WRVJMQVBQRUQpaW9zYiktPmhFdmVudCwgTlVMTCApOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY29tbWlvICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgQ09NTV9XYWl0Q29tbUV2ZW50ICAgICAgICAgKElOVEVSTkFMKQogKgogKiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgYW4gbHBPdmVybGFwcGVkLgogKi8Kc3RhdGljIEJPT0wgQ09NTV9XYWl0Q29tbUV2ZW50KAogICAgSEFORExFIGhGaWxlLCAgICAgICAgICAgICAgLyogW2luXSBoYW5kbGUgb2YgY29tbSBwb3J0IHRvIHdhaXQgZm9yICovCiAgICBMUERXT1JEIGxwZHdFdmVudHMsICAgICAgICAvKiBbb3V0XSBldmVudChzKSB0aGF0IHdlcmUgZGV0ZWN0ZWQgKi8KICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpIC8qIFtpbi9vdXRdIGZvciBBc3luY2hyb25vdXMgd2FpdGluZyAqLwp7CiAgICBpbnQgICAgICAgICAgICAgICAgIGZkOwogICAgYXN5bmNfY29tbWlvKiAgICAgICBjb21taW87CiAgICBOVFNUQVRVUyAgICAgICAgICAgIHN0YXR1czsKCiAgICBpZiAoIWxwT3ZlcmxhcHBlZCkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAoTnRSZXNldEV2ZW50KGxwT3ZlcmxhcHBlZC0+aEV2ZW50LE5VTEwpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBmZCA9IGdldF9jb21tX2ZkKCBoRmlsZSwgR0VORVJJQ19XUklURSApOwogICAgaWYgKGZkIDwgMCkgcmV0dXJuIEZBTFNFOwoKICAgIGNvbW1pbyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YgKGFzeW5jX2NvbW1pbykpOwogICAgaWYgKCFjb21taW8pCiAgICB7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoRmlsZSwgZmQgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgY29tbWlvLT5oYW5kbGUgPSBoRmlsZTsKICAgIGNvbW1pby0+dHlwZSA9IEFTWU5DX1RZUEVfV0FJVDsKICAgIGNvbW1pby0+YXBjX2ludGVybmFsID0gQ09NTV9XYWl0Q29tbUV2ZW50U2VydmljZTsKICAgIGNvbW1pby0+YnVmZmVyID0gKGNoYXIgKilscGR3RXZlbnRzOwogICAgY29tbWlvLT5mZCA9IGZkOyAgLyogRklYTUUgKi8KCiAgICBscE92ZXJsYXBwZWQtPkludGVybmFsSGlnaCA9IDA7CiAgICBscE92ZXJsYXBwZWQtPnUucy5PZmZzZXQgPSAwOwogICAgbHBPdmVybGFwcGVkLT51LnMuT2Zmc2V0SGlnaCA9IDA7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggcmVnaXN0ZXJfYXN5bmMgKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaEZpbGU7CiAgICAgICAgcmVxLT5pb19hcGMgPSBDT01NX1dhaXRDb21tRXZlbnRTZXJ2aWNlOwogICAgICAgIHJlcS0+aW9fdXNlciA9IGNvbW1pbzsKICAgICAgICByZXEtPmlvX3NiID0gKElPX1NUQVRVU19CTE9DSyopbHBPdmVybGFwcGVkOwogICAgICAgIHJlcS0+Y291bnQgPSAwOwogICAgICAgIHN0YXR1cyA9IHdpbmVfc2VydmVyX2NhbGwoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CgogICAgaWYgKCBzdGF0dXMgKSBTZXRMYXN0RXJyb3IoIFJ0bE50U3RhdHVzVG9Eb3NFcnJvcihzdGF0dXMpICk7CiAgICBlbHNlIE50Q3VycmVudFRlYigpLT5udW1fYXN5bmNfaW8rKzsKCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgV2FpdENvbW1FdmVudCAgIChLRVJORUwzMi5AKQogKgogKiBXYWl0IHVudGlsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zIG9uIGEgQ09NTSBwb3J0LgogKiBJbnRlcmVzdGluZyB0aGluZ3MgKGV2ZW50cykgYXJlIHNldCBieSBjYWxsaW5nIFNldENvbW1NYXNrIGJlZm9yZQogKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICoKICogUkVUVVJOUzoKICogICBUUlVFIGlmIHN1Y2Nlc3NmdWwKICogICBGQUxTRSBpZiBmYWlsdXJlCiAqCiAqICAgVGhlIHNldCBvZiBkZXRlY3RlZCBldmVudHMgd2lsbCBiZSB3cml0dGVuIHRvICpscGR3RXZlbnRNYXNrCiAqICAgRVJST1JfSU9fUEVORElORyB3aWxsIGJlIHJldHVybmVkIHRoZSBvdmVybGFwcGVkIHN0cnVjdHVyZSB3YXMgcGFzc2VkCiAqCiAqIEJVR1M6CiAqICBPbmx5IHN1cHBvcnRzIEVWX1JYQ0hBUiBhbmQgRVZfVFhFTVBUWQogKi8KQk9PTCBXSU5BUEkgV2FpdENvbW1FdmVudCgKICAgIEhBTkRMRSBoRmlsZSwgICAgICAgICAgICAgIC8qIFtpbl0gaGFuZGxlIG9mIGNvbW0gcG9ydCB0byB3YWl0IGZvciAqLwogICAgTFBEV09SRCBscGR3RXZlbnRzLCAgICAgICAgLyogW291dF0gZXZlbnQocykgdGhhdCB3ZXJlIGRldGVjdGVkICovCiAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKSAvKiBbaW4vb3V0XSBmb3IgQXN5bmNocm9ub3VzIHdhaXRpbmcgKi8KewogICAgT1ZFUkxBUFBFRCBvdjsKICAgIGludCByZXQ7CgogICAgVFJBQ0UoIiglcCAlcCAlcCApXG4iLGhGaWxlLCBscGR3RXZlbnRzLGxwT3ZlcmxhcHBlZCk7CgogICAgaWYobHBPdmVybGFwcGVkKQogICAgICAgIHJldHVybiBDT01NX1dhaXRDb21tRXZlbnQoaEZpbGUsIGxwZHdFdmVudHMsIGxwT3ZlcmxhcHBlZCk7CgogICAgLyogaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcHBlZCBzdHJ1Y3R1cmUsIGNyZWF0ZSBvdXIgb3duICovCiAgICBvdi5oRXZlbnQgPSBDcmVhdGVFdmVudFcoTlVMTCxGQUxTRSxGQUxTRSxOVUxMKTsKCiAgICBDT01NX1dhaXRDb21tRXZlbnQoaEZpbGUsIGxwZHdFdmVudHMsICZvdik7CgogICAgLyogd2FpdCBmb3IgdGhlIG92ZXJsYXBwZWQgdG8gY29tcGxldGUgKi8KICAgIHJldCA9IEdldE92ZXJsYXBwZWRSZXN1bHQoaEZpbGUsICZvdiwgTlVMTCwgVFJVRSk7CiAgICBDbG9zZUhhbmRsZShvdi5oRXZlbnQpOwoKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbVByb3BlcnRpZXMgICAoS0VSTkVMMzIuQCkKICoKICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbiBhIHN0cnVjdHVyZSB3aXRoIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlCiAqIGNvbW11bmljYXRpb25zIHBvcnQgZHJpdmVyLgogKgogKiBSRVRVUk5TCiAqCiAqICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICogIElmIHN1Y2Nlc3NmdWwsIHRoZSBscENvbW1Qcm9wIHN0cnVjdHVyZSBiZSBmaWxsZWQgaW4gd2l0aAogKiAgcHJvcGVydGllcyBvZiB0aGUgY29tbSBwb3J0LgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVByb3BlcnRpZXMoCiAgICBIQU5ETEUgaEZpbGUsICAgICAgICAgIC8qIFtpbl0gaGFuZGxlIG9mIHRoZSBjb21tIHBvcnQgKi8KICAgIExQQ09NTVBST1AgbHBDb21tUHJvcCkgLyogW291dF0gcG9pbnRlciB0byBzdHJ1Y3QgdG8gYmUgZmlsbGVkICovCnsKICAgIEZJWE1FKCIoJXAgJXAgKVxuIixoRmlsZSxscENvbW1Qcm9wKTsKICAgIGlmKCFscENvbW1Qcm9wKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKgogICAgICogVGhlc2UgdmFsdWVzIHNob3VsZCBiZSB2YWxpZCBmb3IgTElOVVgncyBzZXJpYWwgZHJpdmVyCiAgICAgKiBGSVhNRTogUGVyaGFwcyB0aGV5IGRlc2VydmUgYW4gI2lmZGVmIExJTlVYCiAgICAgKi8KICAgIG1lbXNldChscENvbW1Qcm9wLDAsc2l6ZW9mKENPTU1QUk9QKSk7CiAgICBscENvbW1Qcm9wLT53UGFja2V0TGVuZ3RoICAgICAgID0gMTsKICAgIGxwQ29tbVByb3AtPndQYWNrZXRWZXJzaW9uICAgICAgPSAxOwogICAgbHBDb21tUHJvcC0+ZHdTZXJ2aWNlTWFzayAgICAgICA9IFNQX1NFUklBTENPTU07CiAgICBscENvbW1Qcm9wLT5kd1Jlc2VydmVkMSAgICAgICAgID0gMDsKICAgIGxwQ29tbVByb3AtPmR3TWF4VHhRdWV1ZSAgICAgICAgPSA0MDk2OwogICAgbHBDb21tUHJvcC0+ZHdNYXhSeFF1ZXVlICAgICAgICA9IDQwOTY7CiAgICBscENvbW1Qcm9wLT5kd01heEJhdWQgICAgICAgICAgID0gQkFVRF8xMTUyMDA7CiAgICBscENvbW1Qcm9wLT5kd1Byb3ZTdWJUeXBlICAgICAgID0gUFNUX1JTMjMyOwogICAgbHBDb21tUHJvcC0+ZHdQcm92Q2FwYWJpbGl0aWVzICA9IFBDRl9EVFJEU1IgfCBQQ0ZfUEFSSVRZX0NIRUNLIHwgUENGX1JUU0NUUyB8IFBDRl9UT1RBTFRJTUVPVVRTOwogICAgbHBDb21tUHJvcC0+ZHdTZXR0YWJsZVBhcmFtcyAgICA9IFNQX0JBVUQgfCBTUF9EQVRBQklUUyB8IFNQX0hBTkRTSEFLSU5HIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9QQVJJVFkgfCBTUF9QQVJJVFlfQ0hFQ0sgfCBTUF9TVE9QQklUUyA7CiAgICBscENvbW1Qcm9wLT5kd1NldHRhYmxlQmF1ZCAgICAgID0gQkFVRF8wNzUgfCBCQVVEXzExMCB8IEJBVURfMTM0XzUgfCBCQVVEXzE1MCB8CiAgICAgICAgICAgICAgICBCQVVEXzMwMCB8IEJBVURfNjAwIHwgQkFVRF8xMjAwIHwgQkFVRF8xODAwIHwgQkFVRF8yNDAwIHwgQkFVRF80ODAwIHwKICAgICAgICAgICAgICAgIEJBVURfOTYwMCB8IEJBVURfMTkyMDAgfCBCQVVEXzM4NDAwIHwgQkFVRF81NzYwMCB8IEJBVURfMTE1MjAwIDsKICAgIGxwQ29tbVByb3AtPndTZXR0YWJsZURhdGEgICAgICAgPSBEQVRBQklUU181IHwgREFUQUJJVFNfNiB8IERBVEFCSVRTXzcgfCBEQVRBQklUU184IDsKICAgIGxwQ29tbVByb3AtPndTZXR0YWJsZVN0b3BQYXJpdHkgPSBTVE9QQklUU18xMCB8IFNUT1BCSVRTXzE1IHwgU1RPUEJJVFNfMjAgfAogICAgICAgICAgICAgICAgUEFSSVRZX05PTkUgfCBQQVJJVFlfT0REIHxQQVJJVFlfRVZFTiB8IFBBUklUWV9NQVJLIHwgUEFSSVRZX1NQQUNFOwogICAgbHBDb21tUHJvcC0+ZHdDdXJyZW50VHhRdWV1ZSAgICA9IGxwQ29tbVByb3AtPmR3TWF4VHhRdWV1ZTsKICAgIGxwQ29tbVByb3AtPmR3Q3VycmVudFJ4UXVldWUgICAgPSBscENvbW1Qcm9wLT5kd01heFJ4UXVldWU7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGSVhNRToKICogVGhlIGZ1bmN0aW9uYWxpdHkgb2YgQ29tbUNvbmZpZ0RpYWxvZ0EsIEdldERlZmF1bHRDb21tQ29uZmlnIGFuZAogKiBTZXREZWZhdWx0Q29tbUNvbmZpZyBpcyBpbXBsZW1lbnRlZCBpbiBhIERMTCAodXN1YWxseSBTRVJJQUxVSS5ETEwpLgogKiBUaGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSBvZiBDT01NIHBvcnQsIGJ1dCBzaW5jZSBpdCBpcyBkb3VidGZ1bAogKiBhbnlib2R5IHdpbGwgZ2V0IGFyb3VuZCB0byBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgZmFuY3kgc2VyaWFsCiAqIHBvcnRzIGluIFdJTkUsIHRoaXMgaXMgaGFyZGNvZGVkIGZvciB0aGUgdGltZSBiZWluZy4gIFRoZSBuYW1lIG9mCiAqIHRoaXMgRExMIHNob3VsZCBiZSBzdG9yZWQgaW4gYW5kIHJlYWQgZnJvbSB0aGUgc3lzdGVtIHJlZ2lzdHJ5IGluCiAqIHRoZSBoaXZlIEhLRVlfTE9DQUxfTUFDSElORSwga2V5CiAqIFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxDbGFzc1xcUG9ydHNcXD8/Pz8KICogd2hlcmUgPz8/PyBpcyB0aGUgcG9ydCBudW1iZXIuLi4gdGhhdCBpcyBkZXRlcm1pbmVkIGJ5IFBOUAogKiBUaGUgRExMIHNob3VsZCBiZSBsb2FkZWQgd2hlbiB0aGUgQ09NTSBwb3J0IGlzIG9wZW5lZCwgYW5kIGNsb3NlZAogKiB3aGVuIHRoZSBDT01NIHBvcnQgaXMgY2xvc2VkLiAtIE1KTSAyMCBKdW5lIDIwMDAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgV0NIQVIgbHBzelNlcmlhbFVJW10gPSB7IAogICAncycsJ2UnLCdyJywnaScsJ2EnLCdsJywndScsJ2knLCcuJywnZCcsJ2wnLCdsJywwIH07CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21tQ29uZmlnRGlhbG9nQSAgIChLRVJORUwzMi5AKQogKgogKiBSYWlzZXMgYSBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGEgY29tbSBwb3J0LgogKiBGaWxscyB0aGUgQ09NTUNPTkZJRyBzdHJ1Y3Qgd2l0aCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNhbGwgYSBzaW1pbGFyIHJvdXRpbmUgaW4gdGhlIENPTU0gZHJpdmVyLi4uCiAqCiAqIFJFVFVSTlMKICoKICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogKiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGxwQ29tbUNvbmZpZyBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIGEgbmV3CiAqICBjb25maWd1cmF0aW9uIGZvciB0aGUgY29tbSBwb3J0LCBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCiAqCiAqIEJVR1MKICogIFRoZSBsaWJyYXJ5IHdpdGggdGhlIENvbW1Db25maWdEaWFsb2cgY29kZSBpcyBuZXZlciB1bmxvYWRlZC4KICogUGVyaGFwcyB0aGlzIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGNvbW0gcG9ydCBpcyBjbG9zZWQ/CiAqLwpCT09MIFdJTkFQSSBDb21tQ29uZmlnRGlhbG9nQSgKICAgIExQQ1NUUiBscHN6RGV2aWNlLCAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiBjb21tdW5pY2F0aW9ucyBkZXZpY2UgKi8KICAgIEhBTkRMRSBoV25kLCAgICAgICAgICAgICAgIC8qIFtpbl0gcGFyZW50IHdpbmRvdyBmb3IgdGhlIGRpYWxvZyAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZykgLyogW291dF0gcG9pbnRlciB0byBzdHJ1Y3QgdG8gZmlsbCAqLwp7CiAgICBGQVJQUk9DIGxwZm5Db21tRGlhbG9nOwogICAgSE1PRFVMRSBoQ29uZmlnTW9kdWxlOwogICAgQk9PTCByID0gRkFMU0U7CgogICAgVFJBQ0UoIiglcCAlcCAlcClcbiIsbHBzekRldmljZSwgaFduZCwgbHBDb21tQ29uZmlnKTsKCiAgICBoQ29uZmlnTW9kdWxlID0gTG9hZExpYnJhcnlXKGxwc3pTZXJpYWxVSSk7CiAgICBpZighaENvbmZpZ01vZHVsZSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgbHBmbkNvbW1EaWFsb2cgPSBHZXRQcm9jQWRkcmVzcyhoQ29uZmlnTW9kdWxlLCAiZHJ2Q29tbUNvbmZpZ0RpYWxvZ0EiKTsKCiAgICBpZihscGZuQ29tbURpYWxvZykKICAgICAgICByID0gbHBmbkNvbW1EaWFsb2cobHBzekRldmljZSxoV25kLGxwQ29tbUNvbmZpZyk7CgogICAgRnJlZUxpYnJhcnkoaENvbmZpZ01vZHVsZSk7CgogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tbUNvbmZpZ0RpYWxvZ1cgICAoS0VSTkVMMzIuQCkKICoKICogc2VlIENvbW1Db25maWdEaWFsb2dBIGZvciBtb3JlIGluZm8KICovCkJPT0wgV0lOQVBJIENvbW1Db25maWdEaWFsb2dXKAogICAgTFBDV1NUUiBscHN6RGV2aWNlLCAgICAgICAgLyogW2luXSBuYW1lIG9mIGNvbW11bmljYXRpb25zIGRldmljZSAqLwogICAgSEFORExFIGhXbmQsICAgICAgICAgICAgICAgLyogW2luXSBwYXJlbnQgd2luZG93IGZvciB0aGUgZGlhbG9nICovCiAgICBMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnKSAvKiBbb3V0XSBwb2ludGVyIHRvIHN0cnVjdCB0byBmaWxsICovCnsKICAgIEZBUlBST0MgbHBmbkNvbW1EaWFsb2c7CiAgICBITU9EVUxFIGhDb25maWdNb2R1bGU7CiAgICBCT09MIHIgPSBGQUxTRTsKCiAgICBUUkFDRSgiKCVwICVwICVwKVxuIixscHN6RGV2aWNlLCBoV25kLCBscENvbW1Db25maWcpOwoKICAgIGhDb25maWdNb2R1bGUgPSBMb2FkTGlicmFyeVcobHBzelNlcmlhbFVJKTsKICAgIGlmKCFoQ29uZmlnTW9kdWxlKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBscGZuQ29tbURpYWxvZyA9IEdldFByb2NBZGRyZXNzKGhDb25maWdNb2R1bGUsICJkcnZDb21tQ29uZmlnRGlhbG9nVyIpOwoKICAgIGlmKGxwZm5Db21tRGlhbG9nKQogICAgICAgIHIgPSBscGZuQ29tbURpYWxvZyhscHN6RGV2aWNlLGhXbmQsbHBDb21tQ29uZmlnKTsKCiAgICBGcmVlTGlicmFyeShoQ29uZmlnTW9kdWxlKTsKCiAgICByZXR1cm4gcjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tQ29uZmlnICAgICAoS0VSTkVMMzIuQCkKICoKICogRmlsbCBpbiB0aGUgQ09NTUNPTkZJRyBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21tIHBvcnQgaEZpbGUKICoKICogUkVUVVJOUwogKgogKiAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAqICBJZiBzdWNjZXNzZnVsLCBscENvbW1Db25maWcgY29udGFpbnMgdGhlIGNvbW0gcG9ydCBjb25maWd1cmF0aW9uLgogKgogKiBCVUdTCiAqCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tQ29uZmlnKAogICAgSEFORExFICAgICAgIGhGaWxlLCAgICAgICAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZywgLyogW291dF0gVGhlIGNvbW11bmljYXRpb25zIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRldmljZSAoaWYgaXQgZml0cykuICovCiAgICBMUERXT1JEICAgICAgbHBkd1NpemUpICAgICAvKiBbaW4vb3V0XSBJbml0aWFsbHkgdGhlIHNpemUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gYnVmZmVyL3N0cnVjdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZHMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lZWRlZCBzaXplIG9mIHRoZSBidWZmZXIuICovCnsKICAgIEJPT0wgcjsKCiAgICBUUkFDRSgiKCVwICVwKVxuIixoRmlsZSxscENvbW1Db25maWcpOwoKICAgIGlmKGxwQ29tbUNvbmZpZyA9PSBOVUxMKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIHIgPSAqbHBkd1NpemUgPCBzaXplb2YoQ09NTUNPTkZJRyk7IC8qIFRSVUUgaWYgbm90IGVub3VnaCBzcGFjZSAqLwogICAgKmxwZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgaWYocikKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgbHBDb21tQ29uZmlnLT5kd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICBscENvbW1Db25maWctPndWZXJzaW9uID0gMTsKICAgIGxwQ29tbUNvbmZpZy0+d1Jlc2VydmVkID0gMDsKICAgIHIgPSBHZXRDb21tU3RhdGUoaEZpbGUsJmxwQ29tbUNvbmZpZy0+ZGNiKTsKICAgIGxwQ29tbUNvbmZpZy0+ZHdQcm92aWRlclN1YlR5cGUgPSBQU1RfUlMyMzI7CiAgICBscENvbW1Db25maWctPmR3UHJvdmlkZXJPZmZzZXQgPSAwOwogICAgbHBDb21tQ29uZmlnLT5kd1Byb3ZpZGVyU2l6ZSA9IDA7CgogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0Q29tbUNvbmZpZyAgICAgKEtFUk5FTDMyLkApCiAqCiAqICBTZXRzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIGhhbmRsZSB3YXMgYmFkIGlzIG5vdCBhIGNvbW11bmljYXRpb25zIGRldmljZS4KICovCkJPT0wgV0lOQVBJIFNldENvbW1Db25maWcoCiAgICBIQU5ETEUgICAgICAgaEZpbGUsCQkvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuICovCiAgICBMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnLAkvKiBbaW5dIFRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24uICovCiAgICBEV09SRCBkd1NpemUpIAkJLyogW2luXSBzaXplIG9mIHRoZSBscENvbW1Db25maWcgc3RydWN0ICovCnsKICAgIFRSQUNFKCIoJXAgJXApXG4iLGhGaWxlLGxwQ29tbUNvbmZpZyk7CiAgICByZXR1cm4gU2V0Q29tbVN0YXRlKGhGaWxlLCZscENvbW1Db25maWctPmRjYik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0RGVmYXVsdENvbW1Db25maWdBICAgKEtFUk5FTDMyLkApCiAqCiAqICBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbW11bmljYXRpb24KICogIGRldmljZS4gKGFzY2lpKQogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIGlmIHRoZSBkZXZpY2Ugd2FzIGZvdW5kIGFuZCB0aGUgZGVmYXVsdHMgc2V0LCBmYWxzZSBvdGhlcndpc2UKICovCkJPT0wgV0lOQVBJIFNldERlZmF1bHRDb21tQ29uZmlnVygKICAgIExQQ1dTVFIgICAgICAgbHBzekRldmljZSwgIC8qIFtpbl0gVGhlIGFzY2lpIG5hbWUgb2YgdGhlIGRldmljZSB0YXJnZXRlZCBmb3IgY29uZmlndXJhdGlvbi4gKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcsIC8qIFtpbl0gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGRldmljZS4gKi8KICAgIERXT1JEICAgICAgICBkd1NpemUpICAgICAgIC8qIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCnsKICAgIEZBUlBST0MgbHBmblNldERlZmF1bHRDb21tQ29uZmlnOwogICAgSE1PRFVMRSBoQ29uZmlnTW9kdWxlOwogICAgQk9PTCByID0gRkFMU0U7CgogICAgVFJBQ0UoIiglcCAlcCAlbHgpXG4iLGxwc3pEZXZpY2UsIGxwQ29tbUNvbmZpZywgZHdTaXplKTsKCiAgICBoQ29uZmlnTW9kdWxlID0gTG9hZExpYnJhcnlXKGxwc3pTZXJpYWxVSSk7CiAgICBpZighaENvbmZpZ01vZHVsZSkKICAgICAgICByZXR1cm4gcjsKCiAgICBscGZuU2V0RGVmYXVsdENvbW1Db25maWcgPSBHZXRQcm9jQWRkcmVzcyhoQ29uZmlnTW9kdWxlLCAiZHJ2U2V0RGVmYXVsdENvbW1Db25maWdXIik7CiAgICBpZiAobHBmblNldERlZmF1bHRDb21tQ29uZmlnKQogICAgICAgIHIgPSBscGZuU2V0RGVmYXVsdENvbW1Db25maWcobHBzekRldmljZSwgbHBDb21tQ29uZmlnLCBkd1NpemUpOwoKICAgIEZyZWVMaWJyYXJ5KGhDb25maWdNb2R1bGUpOwoKICAgIHJldHVybiByOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBTZXREZWZhdWx0Q29tbUNvbmZpZ1cgICAgIChLRVJORUwzMi5AKQogKgogKiAgSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZAogKiAgY29tbXVuaWNhdGlvbiBkZXZpY2UuICh1bmljb2RlKQogKgogKiBSRVRVUk5TCiAqCiAqLwpCT09MIFdJTkFQSSBTZXREZWZhdWx0Q29tbUNvbmZpZ0EoCiAgICBMUENTVFIgICAgICBscHN6RGV2aWNlLCAgICAvKiBbaW5dIFRoZSB1bmljb2RlIG5hbWUgb2YgdGhlIGRldmljZSB0YXJnZXRlZCBmb3IgY29uZmlndXJhdGlvbi4gKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcsIC8qIFtpbl0gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGRldmljZS4gKi8KICAgIERXT1JEICAgICAgICBkd1NpemUpICAgICAgIC8qIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCnsKICAgIEJPT0wgcjsKICAgIExQV1NUUiBscERldmljZVcgPSBOVUxMOwogICAgRFdPUkQgbGVuOwoKICAgIFRSQUNFKCIoJXMgJXAgJWx4KVxuIixkZWJ1Z3N0cl9hKGxwc3pEZXZpY2UpLGxwQ29tbUNvbmZpZyxkd1NpemUpOwoKICAgIGlmIChscHN6RGV2aWNlKQogICAgewogICAgICAgIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgbHBzekRldmljZSwgLTEsIE5VTEwsIDAgKTsKICAgICAgICBscERldmljZVcgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbipzaXplb2YoV0NIQVIpICk7CiAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCBscHN6RGV2aWNlLCAtMSwgbHBEZXZpY2VXLCBsZW4gKTsKICAgIH0KICAgIHIgPSBTZXREZWZhdWx0Q29tbUNvbmZpZ1cobHBEZXZpY2VXLGxwQ29tbUNvbmZpZyxkd1NpemUpOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRGV2aWNlVyApOwogICAgcmV0dXJuIHI7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldERlZmF1bHRDb21tQ29uZmlnVyAgIChLRVJORUwzMi5AKQogKgogKiAgIEFjcXVpcmVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uIGRldmljZS4gKHVuaWNvZGUpCiAqCiAqICBSRVRVUk5TCiAqCiAqICAgVHJ1ZSBvbiBzdWNjZXNzZnVsIHJlYWRpbmcgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwKICogICBpZiB0aGUgZGV2aWNlIGlzIG5vdCBmb3VuZCBvciB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4KICovCkJPT0wgV0lOQVBJIEdldERlZmF1bHRDb21tQ29uZmlnVygKICAgIExQQ1dTVFIgICAgICBscHN6TmFtZSwgLyogW2luXSBUaGUgdW5pY29kZSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDQywgICAgIC8qIFtvdXRdIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBMUERXT1JEICAgICAgbHBkd1NpemUpIC8qIFtpbi9vdXRdIEluaXRpYWxseSB0aGUgc2l6ZSBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgYnVmZmVyIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLiAqLwp7CiAgICAgTFBEQ0IgbHBkY2IgPSAmKGxwQ0MtPmRjYik7CiAgICAgV0NIQVIgdGVtcFs0MF07CiAgICAgc3RhdGljIGNvbnN0IFdDSEFSIGNvbVdbXSA9IHsnQycsJ08nLCdNJywwfTsKICAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geydDJywnTycsJ00nLCclJywnYycsJzonLCczJywnOCcsJzQnLCcwJywnMCcsJywnLCduJywnLCcsJzgnLCcsJywnMScsMH07CgogICAgIGlmIChzdHJuY21waVcobHBzek5hbWUsY29tVywzKSkgewogICAgICAgIEVSUigibm90IGltcGxlbWVudGVkIGZvciA8JXM+XG4iLCBkZWJ1Z3N0cl93KGxwc3pOYW1lKSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgICAgVFJBQ0UoIiglcyAlcCAlbGQpXG4iLCBkZWJ1Z3N0cl93KGxwc3pOYW1lKSwgbHBDQywgKmxwZHdTaXplICk7CiAgICAgaWYgKCpscGR3U2l6ZSA8IHNpemVvZihDT01NQ09ORklHKSkgewogICAgICAgICAqbHBkd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgIH0KCiAgICAgKmxwZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwoKICAgICBscENDLT5kd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgbHBDQy0+d1ZlcnNpb24gPSAxOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJPZmZzZXQgPSAwTDsKICAgICBscENDLT5kd1Byb3ZpZGVyU2l6ZSA9IDBMOwoKICAgICBzcHJpbnRmVyggdGVtcCwgZm9ybWF0VywgbHBzek5hbWVbM10pOwogICAgIEZJWE1FKCJzZXR0aW5nICVzIGFzIGRlZmF1bHRcbiIsIGRlYnVnc3RyX3codGVtcCkpOwoKICAgICByZXR1cm4gQnVpbGRDb21tRENCVyggdGVtcCwgbHBkY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXREZWZhdWx0Q29tbUNvbmZpZ0EJCShLRVJORUwzMi5AKQogKgogKiAgIEFjcXVpcmVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uIGRldmljZS4gKGFzY2lpKQogKgogKiAgUkVUVVJOUwogKgogKiAgIFRydWUgb24gc3VjY2Vzc2Z1bCByZWFkaW5nIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCiAqICAgaWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQgb3IgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCiAqLwpCT09MIFdJTkFQSSBHZXREZWZhdWx0Q29tbUNvbmZpZ0EoCiAgICBMUENTVFIgICAgICAgbHBzek5hbWUsIC8qIFtpbl0gVGhlIGFzY2lpIG5hbWUgb2YgdGhlIGRldmljZSB0YXJnZXRlZCBmb3IgY29uZmlndXJhdGlvbi4gKi8KICAgIExQQ09NTUNPTkZJRyBscENDLCAgICAgLyogW291dF0gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGRldmljZS4gKi8KICAgIExQRFdPUkQgICAgICBscGR3U2l6ZSkgLyogW2luL291dF0gSW5pdGlhbGx5IHRoZSBzaXplIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYnVmZmVyLAoJCQkgICAgICBhZnRlcndhcmRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBidWZmZXIgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lZWRlZCBzaXplIG9mIHRoZSBidWZmZXIuICovCnsKCUJPT0wgcmV0ID0gRkFMU0U7CglVTklDT0RFX1NUUklORyBscHN6TmFtZVc7CgoJVFJBQ0UoIiglcywlcCwlbGQpXG4iLGxwc3pOYW1lLGxwQ0MsKmxwZHdTaXplKTsKCWlmKGxwc3pOYW1lKSBSdGxDcmVhdGVVbmljb2RlU3RyaW5nRnJvbUFzY2lpeigmbHBzek5hbWVXLGxwc3pOYW1lKTsKCWVsc2UgbHBzek5hbWVXLkJ1ZmZlciA9IE5VTEw7CgoJaWYobHBzek5hbWVXLkJ1ZmZlcikgcmV0ID0gR2V0RGVmYXVsdENvbW1Db25maWdXKGxwc3pOYW1lVy5CdWZmZXIsbHBDQyxscGR3U2l6ZSk7CgoJUnRsRnJlZVVuaWNvZGVTdHJpbmcoJmxwc3pOYW1lVyk7CglyZXR1cm4gcmV0Owp9Cg==