LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBBcHIgMywgMTk5OS4gIExhd3NvbiBXaGl0bmV5IDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KICogLSBGaXhlZCB0aGUgbW9kZW0gY29udHJvbCBwYXJ0IG9mIEVzY2FwZUNvbW1GdW5jdGlvbjE2LgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICogSnVseSA2LCAxOTk4LiBGaXhlcyBhbmQgY29tbWVudHMgYnkgVmFsZW50aWpuIFNlc3NpbmsKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZzZXNzaW5rQGljLnV2YS5ubD4gW1ZdCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqCiAqIE1heSAyNiwgMTk5Ny4gIEZpeGVzIGFuZCBjb21tZW50cyBieSBSaWNrIFJpY2hhcmRzb24gPHJpY2tAZGdpaS5jb20+IFtSRVJdCiAqIC0gcHRyLT5mZCB3YXNuJ3QgZ2V0dGluZyBjbGVhcmVkIG9uIGNsb3NlLgogKiAtIEdldENvbW1FdmVudE1hc2soKSBhbmQgR2V0Q29tbUVycm9yKCkgZGlkbid0IGRvIG11Y2ggb2YgYW55dGhpbmcuCiAqICAgSU1ITywgdGhleSBhcmUgc3RpbGwgd3JvbmcsIGJ1dCB0aGV5IGF0IGxlYXN0IGltcGxlbWVudCB0aGUgUlhDSEFSCiAqICAgZXZlbnQgYW5kIHJldHVybiBJL08gcXVldWUgc2l6ZXMsIHdoaWNoIG1ha2VzIHRoZSBhcHAgSSdtIGludGVyZXN0ZWQKICogICBpbiAoYW5hbG9nIGRldmljZXMgRVpLSVQgRFNQIGRldmVsb3BtZW50IHN5c3RlbSkgd29yay4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmZGVmIEhBVkVfVEVSTUlPU19ICiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNlbmRpZgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfUE9MTF9ICiMgaW5jbHVkZSA8c3lzL3BvbGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NT0RFTV9ICiMgaW5jbHVkZSA8c3lzL21vZGVtLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfU1RSVElPX0gKIyBpbmNsdWRlIDxzeXMvc3RydGlvLmg+CiNlbmRpZgoKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCiNpbmNsdWRlICJudHN0YXR1cy5oIgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgoKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAid2luZS9zZXJ2ZXIuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpZmRlZiBIQVZFX0xJTlVYX1NFUklBTF9ICiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2VuZGlmCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChjb21tKTsKCi8qIHJldHJpZXZlIHRoZSBVbml4IGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGEgY29tbSBoYW5kbGUgKi8Kc3RhdGljIGludCBnZXRfY29tbV9mZCggSEFORExFIGhhbmRsZSwgRFdPUkQgYWNjZXNzICkKewogICAgaW50IGZkLCByZXQ7CgogICAgcmV0ID0gd2luZV9zZXJ2ZXJfaGFuZGxlX3RvX2ZkKCBoYW5kbGUsIGFjY2VzcywgJmZkLCBOVUxMICk7CiAgICBpZiAocmV0KSBTZXRMYXN0RXJyb3IoIFJ0bE50U3RhdHVzVG9Eb3NFcnJvcihyZXQpICk7CiAgICByZXR1cm4gZmQ7Cn0KCi8qIHJlbGVhc2UgdGhlIFVuaXggaGFuZGxlIHJldHVybmVkIGJ5IGdldF9jb21tX2ZkICovCnN0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX2NvbW1fZmQoIEhBTkRMRSBoYW5kbGUsIGludCBmZCApCnsKICAgIHdpbmVfc2VydmVyX3JlbGVhc2VfZmQoIGhhbmRsZSwgZmQgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBc3luY2hyb25vdXMgSS9PIGZvciBhc3luY2hyb25vdXMgd2FpdCByZXF1ZXN0cyAgICAgICAgICAgICAgICAgICAgICoKICovCgp0eXBlZGVmIHN0cnVjdCBhc3luY19jb21taW8KewogICAgSEFORExFICAgICAgICAgICAgICBoYW5kbGU7CiAgICBQSU9fQVBDX1JPVVRJTkUgICAgIGFwY19pbnRlcm5hbDsKICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIqICAgICAgICAgICAgICAgYnVmZmVyOwogICAgaW50ICAgICAgICAgICAgICAgICBmZDsKfSBhc3luY19jb21taW87CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgIWRlZmluZWQoVElPQ0lOUSkgJiYgZGVmaW5lZChGSU9OUkVBRCkKI2RlZmluZQlUSU9DSU5RIEZJT05SRUFECiNlbmRpZgoKc3RhdGljIGludCBDT01NX1doYWNrTW9kZW0oaW50IGZkLCB1bnNpZ25lZCBpbnQgYW5keSwgdW5zaWduZWQgaW50IG9ycmllKQp7CiNpZmRlZiBUSU9DTUdFVAogICAgdW5zaWduZWQgaW50IG1zdGF0LCBva2F5OwogICAgb2theSA9IGlvY3RsKGZkLCBUSU9DTUdFVCwgJm1zdGF0KTsKICAgIGlmIChva2F5KSByZXR1cm4gb2theTsKICAgIGlmIChhbmR5KSBtc3RhdCAmPSBhbmR5OwogICAgbXN0YXQgfD0gb3JyaWU7CiAgICByZXR1cm4gaW9jdGwoZmQsIFRJT0NNU0VULCAmbXN0YXQpOwojZWxzZQogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENPTU1fUGFyc2UqICAgKEludGVybmFsKQogKgogKiAgVGhlIGZvbGxvd2luZyBDT01NX1BhcnNlKiBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgdGhlIEJ1aWxkQ29tbURDQgogKiAgZnVuY3Rpb25zIHRvIGhlbHAgcGFyc2UgdGhlIHZhcmlvdXMgcGFydHMgb2YgdGhlIGRldmljZSBjb250cm9sIHN0cmluZy4KICovCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VTdGFydChMUENXU1RSIHB0cikKewoJc3RhdGljIGNvbnN0IFdDSEFSIGNvbVdbXSA9IHsnQycsJ08nLCdNJywwfTsKCgkvKiBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIG1heSBvcHRpb25hbGx5IHN0YXJ0IHdpdGggIkNPTXgiIGZvbGxvd2VkCgkgICBieSBhbiBvcHRpb25hbCAnOicgYW5kIHNwYWNlcy4gKi8KCWlmKCFzdHJuY21waVcocHRyLCBjb21XLCAzKSkKCXsKCQlwdHIgKz0gMzsKCgkJLyogQWxsb3cgYW55IGNvbSBwb3J0IGFib3ZlIDAgYXMgV2luIDl4IGRvZXMgKE5UIG9ubHkgYWxsb3dzCgkJICAgdmFsdWVzIGZvciBjb20gcG9ydHMgd2hpY2ggYXJlIGFjdHVhbGx5IHByZXNlbnQpICovCgkJaWYoKnB0ciA8ICcxJyB8fCAqcHRyID4gJzknKQoJCQlyZXR1cm4gTlVMTDsKCQkKCQkvKiBBZHZhbmNlIHBvaW50ZXIgcGFzdCBwb3J0IG51bWJlciAqLwoJCXdoaWxlKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKSBwdHIrKzsKCQkKCQkvKiBUaGUgY29tIHBvcnQgbnVtYmVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSAnOicgb3IgJyAnICovCgkJaWYoKnB0ciAhPSAnOicgJiYgKnB0ciAhPSAnICcpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBBZHZhbmNlIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG5leHQgcGFyYW1ldGVyICovCgkJd2hpbGUoKnB0ciA9PSAnICcpIHB0cisrOwoJCWlmKCpwdHIgPT0gJzonKQoJCXsKCQkJcHRyKys7CgkJCXdoaWxlKCpwdHIgPT0gJyAnKSBwdHIrKzsKCQl9Cgl9CgkvKiBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBzcGFjZS4gKi8KCWVsc2UgaWYoKnB0ciA9PSAnICcpCgkJcmV0dXJuIE5VTEw7CgkKCXJldHVybiBwdHI7Cn0KIApzdGF0aWMgTFBDV1NUUiBDT01NX1BhcnNlTnVtYmVyKExQQ1dTVFIgcHRyLCBMUERXT1JEIGxwbnVtYmVyKQp7CglpZigqcHRyIDwgJzAnIHx8ICpwdHIgPiAnOScpIHJldHVybiBOVUxMOwoJKmxwbnVtYmVyID0gc3RydG91bFcocHRyLCBOVUxMLCAxMCk7Cgl3aGlsZSgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JykgcHRyKys7CglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgTFBDV1NUUiBDT01NX1BhcnNlUGFyaXR5KExQQ1dTVFIgcHRyLCBMUEJZVEUgbHBwYXJpdHkpCnsKCS8qIENvbnRyYXJ5IHRvIHdoYXQgeW91IG1pZ2h0IGV4cGVjdCwgV2luZG93cyBvbmx5IHNldHMgdGhlIFBhcml0eQoJICAgbWVtYmVyIG9mIERDQiBhbmQgbm90IGZQYXJpdHkgZXZlbiB3aGVuIHBhcml0eSBpcyBzcGVjaWZpZWQgaW4gdGhlCgkgICBkZXZpY2UgY29udHJvbCBzdHJpbmcgKi8KCglzd2l0Y2godG91cHBlclcoKnB0cisrKSkKCXsKCWNhc2UgJ0UnOgoJCSpscHBhcml0eSA9IEVWRU5QQVJJVFk7CgkJYnJlYWs7CgljYXNlICdNJzoKCQkqbHBwYXJpdHkgPSBNQVJLUEFSSVRZOwoJCWJyZWFrOwoJY2FzZSAnTic6CgkJKmxwcGFyaXR5ID0gTk9QQVJJVFk7CgkJYnJlYWs7CgljYXNlICdPJzoKCQkqbHBwYXJpdHkgPSBPRERQQVJJVFk7CgkJYnJlYWs7CgljYXNlICdTJzoKCQkqbHBwYXJpdHkgPSBTUEFDRVBBUklUWTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJuIHB0cjsKfQoKc3RhdGljIExQQ1dTVFIgQ09NTV9QYXJzZUJ5dGVTaXplKExQQ1dTVFIgcHRyLCBMUEJZVEUgbHBieXRlc2l6ZSkKewoJRFdPUkQgdGVtcDsKCglpZighKHB0ciA9IENPTU1fUGFyc2VOdW1iZXIocHRyLCAmdGVtcCkpKQoJCXJldHVybiBOVUxMOwoKCWlmKHRlbXAgPj0gNSAmJiB0ZW1wIDw9IDgpCgl7CgkJKmxwYnl0ZXNpemUgPSB0ZW1wOwoJCXJldHVybiBwdHI7Cgl9CgllbHNlCgkJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VTdG9wQml0cyhMUENXU1RSIHB0ciwgTFBCWVRFIGxwc3RvcGJpdHMpCnsKCURXT1JEIHRlbXA7CglzdGF0aWMgY29uc3QgV0NIQVIgc3RvcGJpdHMxNVdbXSA9IHsnMScsJy4nLCc1JywwfTsKCglpZighc3RybmNtcFcoc3RvcGJpdHMxNVcsIHB0ciwgMykpCgl7CgkJcHRyICs9IDM7CgkJKmxwc3RvcGJpdHMgPSBPTkU1U1RPUEJJVFM7Cgl9CgllbHNlCgl7CgkJaWYoIShwdHIgPSBDT01NX1BhcnNlTnVtYmVyKHB0ciwgJnRlbXApKSkKCQkJcmV0dXJuIE5VTEw7CgoJCWlmKHRlbXAgPT0gMSkKCQkJKmxwc3RvcGJpdHMgPSBPTkVTVE9QQklUOwoJCWVsc2UgaWYodGVtcCA9PSAyKQoJCQkqbHBzdG9wYml0cyA9IFRXT1NUT1BCSVRTOwoJCWVsc2UKCQkJcmV0dXJuIE5VTEw7Cgl9CgkKCXJldHVybiBwdHI7Cn0KCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VPbk9mZihMUENXU1RSIHB0ciwgTFBEV09SRCBscG9ub2ZmKQp7CglzdGF0aWMgY29uc3QgV0NIQVIgb25XW10gPSB7J28nLCduJywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBvZmZXW10gPSB7J28nLCdmJywnZicsMH07CgoJaWYoIXN0cm5jbXBpVyhvblcsIHB0ciwgMikpCgl7CgkJcHRyICs9IDI7CgkJKmxwb25vZmYgPSAxOwoJfQoJZWxzZSBpZighc3RybmNtcGlXKG9mZlcsIHB0ciwgMykpCgl7CgkJcHRyICs9IDM7CgkJKmxwb25vZmYgPSAwOwoJfQoJZWxzZQoJCXJldHVybiBOVUxMOwoKCXJldHVybiBwdHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ09NTV9CdWlsZE9sZENvbW1EQ0IgICAoSW50ZXJuYWwpCiAqCiAqICBCdWlsZCBhIERDQiB1c2luZyB0aGUgb2xkIHN0eWxlIHNldHRpbmdzIHN0cmluZyBlZzogIjk2LG4sOCwxIgogKi8Kc3RhdGljIEJPT0wgQ09NTV9CdWlsZE9sZENvbW1EQ0IoTFBDV1NUUiBkZXZpY2UsIExQRENCIGxwZGNiKQp7CglXQ0hBUiBsYXN0ID0gMDsKCglpZighKGRldmljZSA9IENPTU1fUGFyc2VOdW1iZXIoZGV2aWNlLCAmbHBkY2ItPkJhdWRSYXRlKSkpCgkJcmV0dXJuIEZBTFNFOwoJCglzd2l0Y2gobHBkY2ItPkJhdWRSYXRlKQoJewoJY2FzZSAxMToKCWNhc2UgMzA6CgljYXNlIDYwOgoJCWxwZGNiLT5CYXVkUmF0ZSAqPSAxMDsKCQlicmVhazsKCWNhc2UgMTI6CgljYXNlIDI0OgoJY2FzZSA0ODoKCWNhc2UgOTY6CgkJbHBkY2ItPkJhdWRSYXRlICo9IDEwMDsKCQlicmVhazsKCWNhc2UgMTk6CgkJbHBkY2ItPkJhdWRSYXRlID0gMTkyMDA7CgkJYnJlYWs7Cgl9CgoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJaWYoKmRldmljZSsrICE9ICcsJykgcmV0dXJuIEZBTFNFOwoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoKCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZVBhcml0eShkZXZpY2UsICZscGRjYi0+UGFyaXR5KSkpCgkJcmV0dXJuIEZBTFNFOwoKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCWlmKCpkZXZpY2UrKyAhPSAnLCcpIHJldHVybiBGQUxTRTsKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCQkKCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZUJ5dGVTaXplKGRldmljZSwgJmxwZGNiLT5CeXRlU2l6ZSkpKQoJCXJldHVybiBGQUxTRTsKCgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CglpZigqZGV2aWNlKysgIT0gJywnKSByZXR1cm4gRkFMU0U7Cgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CgoJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlU3RvcEJpdHMoZGV2aWNlLCAmbHBkY2ItPlN0b3BCaXRzKSkpCgkJcmV0dXJuIEZBTFNFOwoKCS8qIFRoZSBsYXN0IHBhcmFtZXRlciBmb3IgZmxvdyBjb250cm9sIGlzIG9wdGlvbmFsLiAqLwoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJaWYoKmRldmljZSA9PSAnLCcpCgl7CgkJZGV2aWNlKys7CgkJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJCWlmKCpkZXZpY2UpIGxhc3QgPSB0b3VwcGVyVygqZGV2aWNlKyspOwoJCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCX0KCgkvKiBXaW4gTlQgc2V0cyB0aGUgZmxvdyBjb250cm9sIG1lbWJlcnMgYmFzZWQgb24gKG9yIGxhY2sgb2YpIHRoZSBsYXN0CgkgICBwYXJhbWV0ZXIuICBXaW4gOXggZG9lcyBub3Qgc2V0IHRoZXNlIG1lbWJlcnMuICovCglzd2l0Y2gobGFzdCkKCXsKCWNhc2UgMDoKCQlscGRjYi0+ZkluWCA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0WCA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSBGQUxTRTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gRkFMU0U7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgJ1gnOgoJCWxwZGNiLT5mSW5YID0gVFJVRTsKCQlscGRjYi0+Zk91dFggPSBUUlVFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSBGQUxTRTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gRkFMU0U7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgJ1AnOgoJCWxwZGNiLT5mSW5YID0gRkFMU0U7CgkJbHBkY2ItPmZPdXRYID0gRkFMU0U7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IFRSVUU7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IFRSVUU7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIEZBTFNFOwoJfQoKCS8qIFRoaXMgc2hvdWxkIGJlIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KCWlmKCpkZXZpY2UpIHJldHVybiBGQUxTRTsKCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ09NTV9CdWlsZE5ld0NvbW1EQ0IgICAoSW50ZXJuYWwpCiAqCiAqICBCdWlsZCBhIERDQiB1c2luZyB0aGUgbmV3IHN0eWxlIHNldHRpbmdzIHN0cmluZy4KICogICBlZzogImJhdWQ9OTYwMCBwYXJpdHk9biBkYXRhPTggc3RvcD0xIHhvbj1vbiB0bz1vbiIKICovCnN0YXRpYyBCT09MIENPTU1fQnVpbGROZXdDb21tRENCKExQQ1dTVFIgZGV2aWNlLCBMUERDQiBscGRjYiwgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykKewoJRFdPUkQgdGVtcDsKCUJPT0wgYmF1ZCA9IEZBTFNFLCBzdG9wID0gRkFMU0U7CglzdGF0aWMgY29uc3QgV0NIQVIgYmF1ZFdbXSA9IHsnYicsJ2EnLCd1JywnZCcsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHBhcml0eVdbXSA9IHsncCcsJ2EnLCdyJywnaScsJ3QnLCd5JywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgZGF0YVdbXSA9IHsnZCcsJ2EnLCd0JywnYScsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHN0b3BXW10gPSB7J3MnLCd0JywnbycsJ3AnLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiB0b1dbXSA9IHsndCcsJ28nLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiB4b25XW10gPSB7J3gnLCdvJywnbicsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIG9kc3JXW10gPSB7J28nLCdkJywncycsJ3InLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBvY3RzV1tdID0geydvJywnYycsJ3QnLCdzJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgZHRyV1tdID0geydkJywndCcsJ3InLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBydHNXW10gPSB7J3InLCd0JywncycsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIGlkc3JXW10gPSB7J2knLCdkJywncycsJ3InLCc9JywwfTsKCgl3aGlsZSgqZGV2aWNlKQoJewoJCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCgkJaWYoIXN0cm5jbXBpVyhiYXVkVywgZGV2aWNlLCA1KSkKCQl7CgkJCWJhdWQgPSBUUlVFOwoJCQkKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlTnVtYmVyKGRldmljZSArIDUsICZscGRjYi0+QmF1ZFJhdGUpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHBhcml0eVcsIGRldmljZSwgNykpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VQYXJpdHkoZGV2aWNlICsgNywgJmxwZGNiLT5QYXJpdHkpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGRhdGFXLCBkZXZpY2UsIDUpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlQnl0ZVNpemUoZGV2aWNlICsgNSwgJmxwZGNiLT5CeXRlU2l6ZSkpKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoc3RvcFcsIGRldmljZSwgNSkpCgkJewoJCQlzdG9wID0gVFJVRTsKCQkJCgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZVN0b3BCaXRzKGRldmljZSArIDUsICZscGRjYi0+U3RvcEJpdHMpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHRvVywgZGV2aWNlLCAzKSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDMsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0ID0gMDsKCQkJbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgPSAwOwoJCQlscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQgPSAwOwoJCQlscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIgPSAwOwoJCQlscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50ID0gdGVtcCA/IDYwMDAwIDogMDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHhvblcsIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZPdXRYID0gdGVtcDsKCQkJbHBkY2ItPmZJblggPSB0ZW1wOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcob2RzclcsIGRldmljZSwgNSkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA1LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IHRlbXA7CgkJfQoJCWVsc2UgaWYoIXN0cm5jbXBpVyhvY3RzVywgZGV2aWNlLCA1KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDUsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGR0clcsIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZEdHJDb250cm9sID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHJ0c1csIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZSdHNDb250cm9sID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGlkc3JXLCBkZXZpY2UsIDUpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlT25PZmYoZGV2aWNlICsgNSwgJnRlbXApKSkKCQkJCXJldHVybiBGQUxTRTsKCgkJCS8qIFdpbiBOVCBzZXRzIHRoZSBmRHNyU2Vuc2l0aXZpdHkgbWVtYmVyIGJhc2VkIG9uIHRoZQoJCQkgICBpZHNyIHBhcmFtZXRlci4gIFdpbiA5eCBzZXRzIGZPdXR4RHNyRmxvdyBpbnN0ZWFkLiAqLwoJCQlscGRjYi0+ZkRzclNlbnNpdGl2aXR5ID0gdGVtcDsKCQl9CgkJZWxzZQoJCQlyZXR1cm4gRkFMU0U7CgoJCS8qIEFmdGVyIHRoZSBhYm92ZSBwYXJzaW5nLCB0aGUgbmV4dCBjaGFyYWN0ZXIgKGlmIG5vdCB0aGUgZW5kIG9mCgkJICAgdGhlIHN0cmluZykgc2hvdWxkIGJlIGEgc3BhY2UgKi8KCQlpZigqZGV2aWNlICYmICpkZXZpY2UgIT0gJyAnKQoJCQlyZXR1cm4gRkFMU0U7Cgl9CgoJLyogSWYgc3RvcCBiaXRzIHdlcmUgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IGlzIGFsd2F5cyBzdXBwbGllZC4gKi8KCWlmKCFzdG9wKQoJewoJCWlmKGJhdWQgJiYgbHBkY2ItPkJhdWRSYXRlID09IDExMCkKCQkJbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgkJZWxzZQoJCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoJfQoKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuQCkKICoKICogIFVwZGF0ZXMgYSBkZXZpY2UgY29udHJvbCBibG9jayBkYXRhIHN0cnVjdHVyZSB3aXRoIHZhbHVlcyBmcm9tIGFuCiAqICBhc2NpaSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIGhhcyB0d28gZm9ybXMKICogIG5vcm1hbCBhbmQgZXh0ZW5kZWQsIGl0IG11c3QgYmUgZXhjbHVzaXZlbHkgaW4gb25lIG9yIHRoZSBvdGhlciBmb3JtLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGEgbWFsZm9ybWVkIGNvbnRyb2wgc3RyaW5nLgogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQSgKICAgIExQQ1NUUiBkZXZpY2UsIC8qIFtpbl0gVGhlIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZyB1c2VkIHRvIHVwZGF0ZSB0aGUgRENCLiAqLwogICAgTFBEQ0IgIGxwZGNiKSAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrIHRvIGJlIHVwZGF0ZWQuICovCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJCShLRVJORUwzMi5AKQogKgogKiAgVXBkYXRlcyBhIGRldmljZSBjb250cm9sIGJsb2NrIGRhdGEgc3RydWN0dXJlIHdpdGggdmFsdWVzIGZyb20gYW4KICogIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRha2luZyB0aW1lb3V0IHZhbHVlcyBmcm9tIGEgdGltZW91dHMKICogIHN0cnVjdCBpZiBkZXNpcmVkIGJ5IHRoZSBjb250cm9sIHN0cmluZy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBiYWQgaGFuZGxlcyBldGMuCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoCiAgICBMUENTVFIgICAgICAgICBkZXZpY2UsICAgICAvKiBbaW5dIFRoZSBhc2NpaSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICovCiAgICBMUERDQiAgICAgICAgICBscGRjYiwgICAgICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgdG8gYmUgdXBkYXRlZC4gKi8KICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIC8qIFtpbl0gVGhlIENPTU1USU1FT1VUUyBzdHJ1Y3R1cmUgdG8gYmUgdXBkYXRlZC4gKi8KewoJQk9PTCByZXQgPSBGQUxTRTsKCVVOSUNPREVfU1RSSU5HIGRldmljZVc7CgoJVFJBQ0UoIiglcywlcCwlcClcbiIsZGV2aWNlLGxwZGNiLGxwdGltZW91dHMpOwoJaWYoZGV2aWNlKSBSdGxDcmVhdGVVbmljb2RlU3RyaW5nRnJvbUFzY2lpeigmZGV2aWNlVyxkZXZpY2UpOwoJZWxzZSBkZXZpY2VXLkJ1ZmZlciA9IE5VTEw7CgoJaWYoZGV2aWNlVy5CdWZmZXIpIHJldCA9IEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVyhkZXZpY2VXLkJ1ZmZlcixscGRjYixscHRpbWVvdXRzKTsKCglSdGxGcmVlVW5pY29kZVN0cmluZygmZGV2aWNlVyk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1cJKEtFUk5FTDMyLkApCiAqCiAqICBVcGRhdGVzIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgd2l0aCB2YWx1ZXMgZnJvbSBhCiAqICB1bmljb2RlIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRha2luZyB0aW1lb3V0IHZhbHVlcyBmcm9tIGEgdGltZW91dHMKICogIHN0cnVjdCBpZiBkZXNpcmVkIGJ5IHRoZSBjb250cm9sIHN0cmluZy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBiYWQgaGFuZGxlcyBldGMKICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVygKICAgIExQQ1dTVFIgICAgICAgIGRldmlkLCAgICAgIC8qIFtpbl0gVGhlIHVuaWNvZGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAqLwogICAgTFBEQ0IgICAgICAgICAgbHBkY2IsICAgICAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrIHRvIGJlIHVwZGF0ZWQuICovCiAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSAvKiBbaW5dIFRoZSBDT01NVElNRU9VVFMgc3RydWN0dXJlIHRvIGJlIHVwZGF0ZWQuICovCnsKCURDQiBkY2I7CglDT01NVElNRU9VVFMgdGltZW91dHM7CglCT09MIHJlc3VsdDsKCUxQQ1dTVFIgcHRyID0gZGV2aWQ7CgkKCVRSQUNFKCIoJXMsJXAsJXApXG4iLGRlYnVnc3RyX3coZGV2aWQpLGxwZGNiLGxwdGltZW91dHMpOwoKCS8qIFNldCBEQ0JsZW5ndGguIChXaW5kb3dzIE5UIGRvZXMgbm90IGRvIHRoaXMsIGJ1dCA5eCBkb2VzKSAqLwoJbHBkY2ItPkRDQmxlbmd0aCA9IHNpemVvZihEQ0IpOwoKCS8qIE1ha2UgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBkYXRhIHN0cnVjdHVyZXMgdG8gd29yayB3aXRoIHNpbmNlIGlmCgkgICBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIHRoZSBvcmlnaW5hbHMKCSAgIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgKGV4Y2VwdCBwb3NzaWJseSBEQ0JsZW5ndGgpICovCgltZW1jcHkoJmRjYiwgbHBkY2IsIHNpemVvZihEQ0IpKTsKCWlmKGxwdGltZW91dHMpIG1lbWNweSgmdGltZW91dHMsIGxwdGltZW91dHMsIHNpemVvZihDT01NVElNRU9VVFMpKTsKCglwdHIgPSBDT01NX1BhcnNlU3RhcnQocHRyKTsKCglpZihwdHIgPT0gTlVMTCkKCQlyZXN1bHQgPSBGQUxTRTsKCWVsc2UgaWYoc3RyY2hyVyhwdHIsICcsJykpCgkJcmVzdWx0ID0gQ09NTV9CdWlsZE9sZENvbW1EQ0IocHRyLCAmZGNiKTsKCWVsc2UKCQlyZXN1bHQgPSBDT01NX0J1aWxkTmV3Q29tbURDQihwdHIsICZkY2IsICZ0aW1lb3V0cyk7CgoJaWYocmVzdWx0KQoJewoJCW1lbWNweShscGRjYiwgJmRjYiwgc2l6ZW9mKERDQikpOwoJCWlmKGxwdGltZW91dHMpIG1lbWNweShscHRpbWVvdXRzLCAmdGltZW91dHMsIHNpemVvZihDT01NVElNRU9VVFMpKTsKCQlyZXR1cm4gVFJVRTsKCX0KCWVsc2UKCXsKCQlXQVJOKCJJbnZhbGlkIGRldmljZSBjb250cm9sIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX3coZGV2aWQpKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiBGQUxTRTsKCX0JCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQlcJCShLRVJORUwzMi5AKQogKgogKiAgVXBkYXRlcyBhIGRldmljZSBjb250cm9sIGJsb2NrIHN0cnVjdHVyZSB3aXRoIHZhbHVlcyBmcm9tIGFuCiAqICB1bmljb2RlIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgaGFzIHR3byBmb3JtcwogKiAgbm9ybWFsIGFuZCBleHRlbmRlZCwgaXQgbXVzdCBiZSBleGNsdXNpdmVseSBpbiBvbmUgb3IgdGhlIG90aGVyIGZvcm0uCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gYSBtYWxmb3JtZWQgY29udHJvbCBzdHJpbmcuCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JXKAogICAgTFBDV1NUUiBkZXZpZCwgLyogW2luXSBUaGUgdW5pY29kZSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICovCiAgICBMUERDQiAgIGxwZGNiKSAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgdG8gYmUgdXBkYXRlZC4gKi8KewoJcmV0dXJuIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVyhkZXZpZCxscGRjYixOVUxMKTsKfQoKc3RhdGljIEJPT0wgQ09NTV9TZXRDb21tRXJyb3IoSEFORExFIGhhbmRsZSwgRFdPUkQgZXJyb3IpCnsKICAgIERXT1JEIHJldDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaGFuZGxlOwogICAgICAgIHJlcS0+ZmxhZ3MgPSBTRVJJQUxJTkZPX1NFVF9FUlJPUjsKICAgICAgICByZXEtPmNvbW1lcnJvciA9IGVycm9yOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBCT09MIENPTU1fR2V0Q29tbUVycm9yKEhBTkRMRSBoYW5kbGUsIExQRFdPUkQgbHBlcnJvcikKewogICAgRFdPUkQgcmV0OwoKICAgIGlmKCFscGVycm9yKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaGFuZGxlOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICk7CiAgICAgICAgKmxwZXJyb3IgPSByZXBseS0+Y29tbWVycm9yOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKEtFUk5FTDMyLkApCiAqCiAqICBIYWx0cyB0aGUgdHJhbnNtaXNzaW9uIG9mIGNoYXJhY3RlcnMgdG8gYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgYW5kIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UgY291bGQgbm90IGJlIGZvdW5kLAogKiAgdGhlIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZC4KICoKICogQlVHUwogKgogKiAgT25seSBUSU9DU0JSSyBhbmQgVElPQ0NCUksgYXJlIHN1cHBvcnRlZC4KICovCkJPT0wgV0lOQVBJIFNldENvbW1CcmVhaygKICAgIEhBTkRMRSBoYW5kbGUpIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZSB0byBzdXNwZW5kLiAqLwp7CiNpZiBkZWZpbmVkKFRJT0NTQlJLKSAmJiBkZWZpbmVkKFRJT0NDQlJLKSAvKiBjaGVjayBpZiBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uICovCiAgICAgICAgaW50IGZkLHJlc3VsdDsKCglmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CglyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkJKEtFUk5FTDMyLkApCiAqCiAqICBSZXN1bWVzIGNoYXJhY3RlciB0cmFuc21pc3Npb24gZnJvbSBhIGNvbW11bmljYXRpb24gZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UgY291bGQgbm90IGJlIGZvdW5kLgogKgogKiBCVUdTCiAqCiAqICBPbmx5IFRJT0NTQlJLIGFuZCBUSU9DQ0JSSyBhcmUgc3VwcG9ydGVkLgogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tQnJlYWsoCiAgICBIQU5ETEUgaGFuZGxlKSAvKiBbaW5dIFRoZSBoYWx0ZWQgY29tbXVuaWNhdGlvbiBkZXZpY2Ugd2hvc2UgY2hhcmFjdGVyIHRyYW5zbWlzc2lvbiBpcyB0byBiZSByZXN1bWVkLiAqLwp7CiNpZiBkZWZpbmVkKFRJT0NTQlJLKSAmJiBkZWZpbmVkKFRJT0NDQlJLKSAvKiBjaGVjayBpZiBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uICovCiAgICAgICAgaW50IGZkLHJlc3VsdDsKCglmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CglyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLkApCiAqCiAqICBEaXJlY3RzIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UgdG8gcGVyZm9ybSBhbiBleHRlbmRlZCBmdW5jdGlvbi4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvciByZXF1ZXN0ZWQgZGF0YSBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIGNvbW1hbmQsCiAqICBmYWxzZSBpZiB0aGUgZGV2aWNlIGlzIG5vdCBwcmVzZW50IGNhbm5vdCBleGVjdXRlIHRoZSBjb21tYW5kCiAqICBvciB0aGUgY29tbWFuZCBmYWlsZWQuCiAqLwpCT09MIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24oCiAgICBIQU5ETEUgaGFuZGxlLCAgICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9uIGRldmljZSB0byBwZXJmb3JtIHRoZSBleHRlbmRlZCBmdW5jdGlvbi4gKi8KICAgIFVJTlQgICBuRnVuY3Rpb24pIC8qIFtpbl0gVGhlIGV4dGVuZGVkIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gKi8KewoJaW50IGZkLGRpcmVjdD1GQUxTRSxyZXN1bHQ9RkFMU0U7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRSgiaGFuZGxlICVwLCBmdW5jdGlvbj0lZFxuIiwgaGFuZGxlLCBuRnVuY3Rpb24pOwoJZmQgPSBnZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKCWlmKGZkPDApIHJldHVybiBGQUxTRTsKCglpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewoJCUNPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwoJCXJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJCWNhc2UgUkVTRVRERVY6CgkJICAgICAgICBUUkFDRSgiXG4iKTsKCQkJYnJlYWs7CgoJCWNhc2UgQ0xSRFRSOgoJCSAgICAgICAgVFJBQ0UoIkNMUkRUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOwojaWZkZWYgVElPQ01fUlRTCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVREVFI6CgkJICAgICAgICBUUkFDRSgiU0VURFRSXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX0RUUik7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRSVFM6CgkJICAgICAgICBUUkFDRSgiU0VUUlRTXG4iKTsKI2lmZGVmIFRJT0NNX1JUUwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX1JUUyk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRYT0ZGOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPRkZcbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgkJCWJyZWFrOwoKCQljYXNlIFNFVFhPTjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT05cbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgkJY2FzZSBTRVRCUkVBSzoKCQkJVFJBQ0UoInNldGJyZWFrXG4iKTsKI2lmZGVmIAlUSU9DU0JSSwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CgkJCWJyZWFrOwojZW5kaWYKCQljYXNlIENMUkJSRUFLOgoJCQlUUkFDRSgiY2xyYnJlYWtcbiIpOwojaWZkZWYgCVRJT0NTQlJLCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihoYW5kbGU9JXAsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwKCQkJaGFuZGxlLCBuRnVuY3Rpb24pOwoJCQlicmVhazsKCX0KCglpZiAoIWRpcmVjdCkKCSAgaWYgKHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQlyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQlDT01NX1NldENvbW1FcnJvcihoYW5kbGUsQ0VfSU9FKTsKCQlyZXR1cm4gRkFMU0U7CgkgIH0gZWxzZQoJICAgICAgICByZXN1bHQ9IFRSVUU7CgllbHNlCgkgIHsKCSAgICBpZiAocmVzdWx0ID09IC0xKQoJICAgICAgewoJCXJlc3VsdD0gRkFMU0U7CgkJQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcmVzdWx0ID0gVFJVRTsKCSAgfQoJcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CglyZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBQdXJnZUNvbW0gICAgICAgIChLRVJORUwzMi5AKQogKgogKiAgVGVybWluYXRlcyBwZW5kaW5nIG9wZXJhdGlvbnMgYW5kL29yIGRpc2NhcmRzIGJ1ZmZlcnMgb24gYQogKiAgY29tbXVuaWNhdGlvbiByZXNvdXJjZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgaGFuZGxlIGlzIGJhZC4KICovCkJPT0wgV0lOQVBJIFB1cmdlQ29tbSgKICAgIEhBTkRMRSBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UgdG8gYmUgcHVyZ2VkLiAqLwogICAgRFdPUkQgIGZsYWdzKSAgLyogW2luXSBGbGFncyBmb3IgY2xlYXIgcGVuZGluZy9idWZmZXIgb24gaW5wdXQvb3V0cHV0LiAqLwp7CiAgICAgaW50IGZkOwoKICAgICBUUkFDRSgiaGFuZGxlICVwLCBmbGFncyAlbHhcbiIsIGhhbmRsZSwgZmxhZ3MpOwoKICAgICBmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgIGlmKGZkPDApIHJldHVybiBGQUxTRTsKCiAgICAgLyoKICAgICAqKiBub3QgZXhhY3RseSBzdXJlIGhvdyB0aGVzZSBhcmUgZGlmZmVyZW50CiAgICAgKiogUGVyaGFwcyBpZiB3ZSBoYWQgb3VyIG93biBpbnRlcm5hbCBxdWV1ZXMsIG9uZSBmbHVzaGVzIHRoZW0KICAgICAqKiBhbmQgdGhlIG90aGVyIGZsdXNoZXMgdGhlIGtlcm5lbCdzIGJ1ZmZlcnMuCiAgICAgKi8KICAgICBpZihmbGFncyZQVVJHRV9UWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9UWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCiAgICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1FcnJvcgkoS0VSTkVMMzIuQCkKICoKICogIEVuYWJsZXMgZnVydGhlciBJL08gb3BlcmF0aW9ucyBvbiBhIGNvbW11bmljYXRpb25zIHJlc291cmNlIGFmdGVyCiAqICBzdXBwbHlpbmcgZXJyb3IgYW5kIGN1cnJlbnQgc3RhdHVzIGluZm9ybWF0aW9uLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9uIHJlc291cmNlIGhhbmRsZSBpcyBiYWQuCiAqLwpCT09MIFdJTkFQSSBDbGVhckNvbW1FcnJvcigKICAgIEhBTkRMRSAgICBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IuICovCiAgICBMUERXT1JEICAgZXJyb3JzLCAvKiBbb3V0XSBGbGFncyBpbmRpY2F0aW5nIGVycm9yIHRoZSByZXNvdXJjZSBleHBlcmllbmNlZC4gKi8KICAgIExQQ09NU1RBVCBscFN0YXQpIC8qIFtvdXRdIFRoZSBzdGF0dXMgb2YgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UuICovCnsKICAgIGludCBmZDsKCiAgICBmZD1nZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgIGlmKDA+ZmQpIHJldHVybiBGQUxTRTsKCiAgICBpZiAobHBTdGF0KQogICAgewogICAgICAgIGxwU3RhdC0+ZkN0c0hvbGQgPSAwOwoJbHBTdGF0LT5mRHNySG9sZCA9IDA7CglscFN0YXQtPmZSbHNkSG9sZCA9IDA7CglscFN0YXQtPmZYb2ZmSG9sZCA9IDA7CglscFN0YXQtPmZYb2ZmU2VudCA9IDA7CglscFN0YXQtPmZFb2YgPSAwOwoJbHBTdGF0LT5mVHhpbSA9IDA7CglscFN0YXQtPmZSZXNlcnZlZCA9IDA7CgojaWZkZWYgVElPQ09VVFEKCWlmKGlvY3RsKGZkLCBUSU9DT1VUUSwgJmxwU3RhdC0+Y2JPdXRRdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKI2Vsc2UKCWxwU3RhdC0+Y2JPdXRRdWUgPSAwOyAvKiBGSVhNRTogZmluZCBhIGRpZmZlcmVudCB3YXkgdG8gZmluZCBvdXQgKi8KI2VuZGlmCgojaWZkZWYgVElPQ0lOUQoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKI2VuZGlmCgoJVFJBQ0UoImhhbmRsZSAlcCBjYkluUXVlID0gJWxkIGNiT3V0UXVlID0gJWxkXG4iLAoJICAgICAgaGFuZGxlLCBscFN0YXQtPmNiSW5RdWUsIGxwU3RhdC0+Y2JPdXRRdWUpOwogICAgfQoKICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoKICAgIENPTU1fR2V0Q29tbUVycm9yKGhhbmRsZSwgZXJyb3JzKTsKICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSwgMCk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNldHVwQ29tbSAgICAgICAoS0VSTkVMMzIuQCkKICoKICogIENhbGxlZCBhZnRlciBDcmVhdGVGaWxlIHRvIGhpbnQgdG8gdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UgdG8gdXNlCiAqICBzcGVjaWZpZWQgc2l6ZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb25zIHJlc291cmNlIGhhbmRsZSBpcyBiYWQuCiAqCiAqIEJVR1MKICoKICogIFN0dWIuCiAqLwpCT09MIFdJTkFQSSBTZXR1cENvbW0oCiAgICBIQU5ETEUgaGFuZGxlLCAgLyogW2luXSBUaGUganVzdCBjcmVhdGVkIGNvbW11bmljYXRpb24gcmVzb3VyY2UgaGFuZGxlLiAqLwogICAgRFdPUkQgIGluc2l6ZSwgIC8qIFtpbl0gVGhlIHN1Z2dlc3RlZCBzaXplIG9mIHRoZSBjb21tdW5pY2F0aW9uIHJlc291cmNlcyBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuICovCiAgICBEV09SRCAgb3V0c2l6ZSkgLyogW2luXSBUaGUgc3VnZ2VzdGVkIHNpemUgb2YgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2VzIG91dHB1dCBidWZmZXIgaW4gYnl0ZXMuICovCnsKICAgIGludCBmZDsKCiAgICBGSVhNRSgiaW5zaXplICVsZCBvdXRzaXplICVsZCB1bmltcGxlbWVudGVkIHN0dWJcbiIsIGluc2l6ZSwgb3V0c2l6ZSk7CiAgICBmZD1nZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgIGlmKDA+ZmQpIHJldHVybiBGQUxTRTsKICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tTWFzawkoS0VSTkVMMzIuQCkKICoKICogIE9idGFpbiB0aGUgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRpb24gZGV2aWNlIHRoYXQgd2lsbCBjYXVzZQogKiAgYSBjYWxsIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLgogKgogKiAgUkVUVVJOUwogKgogKiAgIFRydWUgb24gc3VjY2VzcywgZmFpbCBvbiBiYWQgZGV2aWNlIGhhbmRsZSBldGMuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTWFzaygKICAgIEhBTkRMRSAgaGFuZGxlLCAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBEV09SRCBldnRtYXNrKSAvKiBbb3V0XSBUaGUgZXZlbnRzIHdoaWNoIGNhdXNlIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLiAqLwp7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiaGFuZGxlICVwLCBtYXNrICVwXG4iLCBoYW5kbGUsIGV2dG1hc2spOwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIGdldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICAgICAgaWYgKChyZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChldnRtYXNrKSAqZXZ0bWFzayA9IHJlcGx5LT5ldmVudG1hc2s7CiAgICAgICAgfQogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbU1hc2sJKEtFUk5FTDMyLkApCiAqCiAqICBUaGVyZSBiZSBzb21lIHRoaW5ncyB3ZSBuZWVkIHRvIGhlYXIgYWJvdXQgeW9uIHRoZXJlIGNvbW11bmljYXRpb25zIGRldmljZS4KICogIChTZXQgd2hpY2ggZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRpb24gZGV2aWNlIHNob3VsZCBjYXVzZQogKiAgYSBjYWxsIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLikKICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBiYWQgaGFuZGxlIGV0Yy4KICovCkJPT0wgV0lOQVBJIFNldENvbW1NYXNrKAogICAgSEFORExFIGhhbmRsZSwgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gICovCiAgICBEV09SRCAgZXZ0bWFzaykgLyogW2luXSBUaGUgZXZlbnRzIHRoYXQgYXJlIHRvIGJlIG1vbml0b3JlZC4gKi8KewogICAgQk9PTCByZXQ7CgogICAgVFJBQ0UoImhhbmRsZSAlcCwgbWFzayAlbHhcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggc2V0X3NlcmlhbF9pbmZvICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSAgICA9IGhhbmRsZTsKICAgICAgICByZXEtPmZsYWdzICAgICA9IFNFUklBTElORk9fU0VUX01BU0s7CiAgICAgICAgcmVxLT5ldmVudG1hc2sgPSBldnRtYXNrOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUgICAgKEtFUk5FTDMyLkApCiAqCiAqICBSZS1pbml0aWFsaXplcyBhbGwgaGFyZHdhcmUgYW5kIGNvbnRyb2wgc2V0dGluZ3Mgb2YgYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UsCiAqICB3aXRoIHZhbHVlcyBmcm9tIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgd2l0aG91dCBlZmZlY3RpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQKICogIHF1ZXVlcy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIGVnIGlmIHRoZSBYb25DaGFyIGlzIGVxdWFsIHRvIHRoZSBYb2ZmQ2hhci4KICovCkJPT0wgV0lOQVBJIFNldENvbW1TdGF0ZSgKICAgIEhBTkRMRSBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQRENCICBscGRjYikgIC8qIFtvdXRdIFRoZSBkZXZpY2UgY29udHJvbCBibG9jay4gKi8KewogICAgIHN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAgICAgaW50IGZkLCBieXRlc2l6ZSwgc3RvcGJpdHM7CiAgICAgQk9PTCByZXQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJXAsIHB0ciAlcFxuIiwgaGFuZGxlLCBscGRjYik7CiAgICAgVFJBQ0UoImJ5dGVzaXplICVkIGJhdWRyYXRlICVsZCBmUGFyaXR5ICVkIFBhcml0eSAlZCBzdG9wYml0cyAlZFxuIiwKCSAgIGxwZGNiLT5CeXRlU2l6ZSxscGRjYi0+QmF1ZFJhdGUsbHBkY2ItPmZQYXJpdHksIGxwZGNiLT5QYXJpdHksCgkgICAobHBkY2ItPlN0b3BCaXRzID09IE9ORVNUT1BCSVQpPzE6CgkgICAobHBkY2ItPlN0b3BCaXRzID09IFRXT1NUT1BCSVRTKT8yOjApOwogICAgIFRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiAgICAgVFJBQ0UoImZPdXR4Q3RzRmxvdyAlZCBmUnRzQ29udHJvbCAlZFxuIiwgbHBkY2ItPmZPdXR4Q3RzRmxvdywKICAgICAgICAgICAgIGxwZGNiLT5mUnRzQ29udHJvbCk7CiAgICAgVFJBQ0UoImZPdXR4RHNyRmxvdyAlZCBmRHRyQ29udHJvbCVkXG4iLCBscGRjYi0+Zk91dHhEc3JGbG93LAogICAgICAgICAgICAgbHBkY2ItPmZEdHJDb250cm9sKTsKICAgICAgICAgICAgIAoKICAgICBmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgIGlmIChmZCA8IDApIHJldHVybiBGQUxTRTsKCiAgICAgaWYgKCh0Y2dldGF0dHIoZmQsJnBvcnQpKSA9PSAtMSkgewogICAgICAgICBpbnQgc2F2ZV9lcnJvciA9IGVycm5vOwogICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsQ0VfSU9FKTsKICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KCglwb3J0LmNfY2NbVk1JTl0gPSAwOwoJcG9ydC5jX2NjW1ZUSU1FXSA9IDE7CgojaWZkZWYgSU1BWEJFTAoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUnxJTUFYQkVMKTsKI2Vsc2UKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1IpOwojZW5kaWYKCXBvcnQuY19pZmxhZyB8PSAoSUdOQlJLKTsKCglwb3J0LmNfb2ZsYWcgJj0gfihPUE9TVCk7CgoJcG9ydC5jX2NmbGFnICY9IH4oSFVQQ0wpOwoJcG9ydC5jX2NmbGFnIHw9IENMT0NBTCB8IENSRUFEOwoKCXBvcnQuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPfElTSUcpOwoJcG9ydC5jX2xmbGFnIHw9IE5PRkxTSDsKCiNpZmRlZiBDQkFVRAoJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CgkJY2FzZSAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjA7CgkJCWJyZWFrOwoJCWNhc2UgNTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTA7CgkJCWJyZWFrOwoJCWNhc2UgNzU6CgkJCXBvcnQuY19jZmxhZyB8PSBCNzU7CgkJCWJyZWFrOwoJCWNhc2UgMTEwOgoJCWNhc2UgQ0JSXzExMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTA7CgkJCWJyZWFrOwoJCWNhc2UgMTM0OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEzNDsKCQkJYnJlYWs7CgkJY2FzZSAxNTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTUwOwoJCQlicmVhazsKCQljYXNlIDIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwoJCWNhc2UgNjAwOgoJCWNhc2UgQ0JSXzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTIwMDoKCQljYXNlIENCUl8xMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMTgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxODAwOwoJCQlicmVhazsKCQljYXNlIDI0MDA6CgkJY2FzZSBDQlJfMjQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyNDAwOwoJCQlicmVhazsKCQljYXNlIDQ4MDA6CgkJY2FzZSBDQlJfNDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0ODAwOwoJCQlicmVhazsKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsKCQljYXNlIDE5MjAwOgoJCWNhc2UgQ0JSXzE5MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjE5MjAwOwoJCQlicmVhazsKCQljYXNlIDM4NDAwOgoJCWNhc2UgQ0JSXzM4NDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIxMTUyMDAKCQljYXNlIDExNTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKCQljYXNlIDIzMDQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMzA0MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwojZW5kaWYKICAgICAgIAkgICAgICAgIGRlZmF1bHQ6CiNpZiBkZWZpbmVkIChIQVZFX0xJTlVYX1NFUklBTF9IKSAmJiBkZWZpbmVkIChUSU9DU1NFUklBTCkKCQkJeyAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IG51dHM7CgkJCSAgICBpbnQgYXJieTsKCQkJICAgIGlvY3RsKGZkLCBUSU9DR1NFUklBTCwgJm51dHMpOwoJCQkgICAgbnV0cy5jdXN0b21fZGl2aXNvciA9IG51dHMuYmF1ZF9iYXNlIC8gbHBkY2ItPkJhdWRSYXRlOwoJCQkgICAgaWYgKCEobnV0cy5jdXN0b21fZGl2aXNvcikpIG51dHMuY3VzdG9tX2Rpdmlzb3IgPSAxOwoJCQkgICAgYXJieSA9IG51dHMuYmF1ZF9iYXNlIC8gbnV0cy5jdXN0b21fZGl2aXNvcjsKCQkJICAgIG51dHMuZmxhZ3MgJj0gfkFTWU5DX1NQRF9NQVNLOwoJCQkgICAgbnV0cy5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKCQkJICAgIFdBUk4oIllvdSAob3IgYSBwcm9ncmFtIGFjdGluZyBhdCB5b3VyIGJlaGVzdCkgaGF2ZSBzcGVjaWZpZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZSAlbGQuICBXaW5lIHdpbGwgc2V0IHRoZSByYXRlIHRvICVkLFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggaXMgYXMgY2xvc2UgYXMgd2UgY2FuIGdldCBieSBvdXIgcHJlc2VudCB1bmRlcnN0YW5kaW5nIG9mIHlvdXJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcmR3YXJlLiBJIGhvcGUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgQW55IGRpc3J1cHRpb24gV2luZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGNhdXNlZCB0byB5b3VyIGxpbnV4IHN5c3RlbSBjYW4gYmUgdW5kb25lIHdpdGggc2V0c2VyaWFsIFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlZSBtYW4gc2V0c2VyaWFsKS4gSWYgeW91IGhhdmUgaW5jYXBhY2l0YXRlZCBhIEhheWVzIHR5cGUgbW9kZW0sXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldCBpdCBhbmQgaXQgd2lsbCBwcm9iYWJseSByZWNvdmVyLlxuIiwgbHBkY2ItPkJhdWRSYXRlLCBhcmJ5KTsKICAJCQkgICAgaW9jdGwoZmQsIFRJT0NTU0VSSUFMLCAmbnV0cyk7CgkJCSAgICBwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwogCQkJfQogCQkJYnJlYWs7CiNlbmRpZiAgICAvKiBEb24ndCBoYXZlIGxpbnV4L3NlcmlhbC5oIG9yIGxhY2sgVElPQ1NTRVJJQUwgKi8KCgogICAgICAgICAgICAgICAgICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsSUVfQkFVRFJBVEUpOwogICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQkJRVJSKCJiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQojZWxpZiAhZGVmaW5lZChfX0VNWF9fKQogICAgICAgIHN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjUwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNzU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTM0OgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjEzNDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE1MDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxNTA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQljYXNlIENCUl81NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgMTE1MjAwOgoJCWNhc2UgQ0JSXzExNTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKCQljYXNlIDIzMDQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMzA0MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CQVVEUkFURSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwojZW5kaWYKICAgICAgICBieXRlc2l6ZT1scGRjYi0+Qnl0ZVNpemU7CiAgICAgICAgc3RvcGJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKI2lmZGVmIENNU1BBUgoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKI2Vsc2UKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiNlbmRpZgoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBDTVNQQVIKICAgICAgICAgICAgICAgIC8qIExpbnV4IGRlZmluZXMgbWFyay9zcGFjZSAoc3RpY2spIHBhcml0eSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQgfCAgQ01TUEFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgICAgICAgICAvKiB0cnkgdGhlIFBPU0lYIHdheSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggc3RvcGJpdHMgPT0gT05FU1RPUEJJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcGJpdHMgPSBUV09TVE9QQklUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsSUVfQllURVNJWkUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkNhbm5vdCBzZXQgTUFSSyBQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJ5dGVzaXplIDwgOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNpemUgKz0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiQ2Fubm90IHNldCBTUEFDRSBQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiUGFyaXR5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KCgoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAoYnl0ZXNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoIkJ5dGVTaXplXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQoKCXN3aXRjaCAoc3RvcGJpdHMpIHsKCQljYXNlIE9ORVNUT1BCSVQ6CgkJCQlwb3J0LmNfY2ZsYWcgJj0gfkNTVE9QQjsKCQkJCWJyZWFrOwoJCWNhc2UgT05FNVNUT1BCSVRTOiAvKiB3aWxsIGJlIHNlbGVjdGVkIGlmIGJ5dGVzaXplIGlzIDUgKi8KCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoIlN0b3BCaXRzXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQojaWZkZWYgQ1JUU0NUUwoJaWYgKAlscGRjYi0+Zk91dHhDdHNGbG93IAkJCXx8CgkJbHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX0hBTkRTSEFLRQoJKQoJICB7CgkgICAgcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgkgICAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJICB9CiNlbmRpZgoKCWlmIChscGRjYi0+ZkluWCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT047CglpZiAobHBkY2ItPmZPdXRYKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT0ZGOwoKCWlmICh0Y3NldGF0dHIoZmQsVENTQU5PVywmcG9ydCk9PS0xKSB7IC8qIG90aGVyd2lzZSBpdCBoYW5ncyB3aXRoIHBlbmRpbmcgaW5wdXQqLwogICAgICAgICAgICAgICAgRVJSKCJ0Y3NldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwoJCXJldCA9IEZBTFNFOwoJfSBlbHNlIHsKICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSwwKTsKCQlyZXQgPSBUUlVFOwoJfQoKICAgICAgICAvKiBub3RlOiBjaGFuZ2UgRFRSL1JUUyBsaW5lcyBhZnRlciBzZXR0aW5nIHRoZSBjb21tIGF0dHJpYnV0ZXMsCiAgICAgICAgICogc28gZmxvdyBjb250cm9sIGRvZXMgbm90IGludGVyZmVyZS4gKi8KI2lmZGVmIFRJT0NNX0RUUgoJaWYgKGxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9IQU5EU0hBS0UpCiAgICAgICAgewogICAgICAgICAgICAgV0FSTigiRFNSL0RUUiBmbG93IGNvbnRyb2wgbm90IHN1cHBvcnRlZFxuIik7Cgl9IGVsc2UgaWYobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0RJU0FCTEUpCiAgICAgICAgICAgIENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX0RUUiwgMCk7CiAgICAgICAgZWxzZSAgICAKICAgICAgICAgICAgQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9EVFIpOwojZW5kaWYKI2lmZGVmIFRJT0NNX1JUUwoJaWYoIWxwZGNiLT5mT3V0eEN0c0Zsb3cgKQogICAgICAgIHsKICAgICAgICAgICAgaWYobHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX0RJU0FCTEUpCiAgICAgICAgICAgICAgICBDT01NX1doYWNrTW9kZW0oZmQsIH5USU9DTV9SVFMsIDApOwogICAgICAgICAgICBlbHNlICAgIAogICAgICAgICAgICAgICAgQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9SVFMpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgaWYobHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX1RPR0dMRSkKICAgICAgICAgICAgRklYTUUoIlJUU19DT05UUk9MX1RPR0dMRSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICAgICAgcmV0dXJuIHJldDsKCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShLRVJORUwzMi5AKQogKgogKiAgRmlsbHMgaW4gYSBkZXZpY2UgY29udHJvbCBibG9jayB3aXRoIGluZm9ybWF0aW9uIGZyb20gYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb24gZGV2aWNlIGhhbmRsZSBpcyBiYWQgZXRjCiAqCiAqIEJVR1MKICoKICogIFhvbkNoYXIgYW5kIFhvZmZDaGFyIGFyZSBub3Qgc2V0LgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVN0YXRlKAogICAgSEFORExFIGhhbmRsZSwgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBEQ0IgIGxwZGNiKSAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrLiAqLwp7CiAgICAgc3RydWN0IHRlcm1pb3MgcG9ydDsKICAgICBpbnQgZmQsc3BlZWQ7CiAgICAgaW50IHN0YXQgPSBEVFJfQ09OVFJPTF9FTkFCTEUgfCBSVFNfQ09OVFJPTF9FTkFCTEU7CgogICAgIFRSQUNFKCJoYW5kbGUgJXAsIHB0ciAlcFxuIiwgaGFuZGxlLCBscGRjYik7CgogICAgIGZkID0gZ2V0X2NvbW1fZmQoIGhhbmRsZSwgR0VORVJJQ19SRUFEICk7CiAgICAgaWYgKGZkIDwgMCkgcmV0dXJuIEZBTFNFOwogICAgIGlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMQojaWZkZWYgVElPQ01HRVQKICAgICAgICAgICAgIHx8IGlvY3RsKGZkLCBUSU9DTUdFVCwgJnN0YXQpID09IC0xCiNlbmRpZgogICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpbnQgc2F2ZV9lcnJvcj1lcnJubzsKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIG9yIGlvY3RsIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwogICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJcmV0dXJuIEZBTFNFOwoJfQogICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwojaWZuZGVmIF9fRU1YX18KI2lmZGVmIENCQVVECiAgICAgc3BlZWQ9IChwb3J0LmNfY2ZsYWcgJiBDQkFVRCk7CiNlbHNlCiAgICAgc3BlZWQ9IChjZmdldG9zcGVlZCgmcG9ydCkpOwojZW5kaWYKICAgICBzd2l0Y2ggKHNwZWVkKSB7CgkJY2FzZSBCMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMDsKCQkJYnJlYWs7CgkJY2FzZSBCNTA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDUwOwoJCQlicmVhazsKCQljYXNlIEI3NToKCQkJbHBkY2ItPkJhdWRSYXRlID0gNzU7CgkJCWJyZWFrOwoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIxMzQ6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEzNDsKCQkJYnJlYWs7CgkJY2FzZSBCMTUwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxNTA7CgkJCWJyZWFrOwoJCWNhc2UgQjIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjAwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgQjExNTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTE1MjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMjMwNDAwCiAgICAgICAgICAgICAgICBjYXNlIEIyMzA0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDIzMDQwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjQ2MDgwMAogICAgICAgICAgICAgICAgY2FzZSBCNDYwODAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA0NjA4MDA7CgkJCWJyZWFrOwojZW5kaWYKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzcGVlZCAleCBcbiIsc3BlZWQpOwoJfQojZW5kaWYKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgQ1NJWkUpIHsKCQljYXNlIENTNToKCQkJbHBkY2ItPkJ5dGVTaXplID0gNTsKCQkJYnJlYWs7CgkJY2FzZSBDUzY6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDY7CgkJCWJyZWFrOwoJCWNhc2UgQ1M3OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA3OwoJCQlicmVhazsKCQljYXNlIENTODoKCQkJbHBkY2ItPkJ5dGVTaXplID0gODsKCQkJYnJlYWs7CgkgICAgICAgIGRlZmF1bHQ6CgkJICAgICAgICBFUlIoInVua25vd24gc2l6ZSAleCBcbiIscG9ydC5jX2NmbGFnICYgQ1NJWkUpOwoJfQoKICAgICAgICBpZihwb3J0LmNfaWZsYWcgJiBJTlBDSykKICAgICAgICAgICAgbHBkY2ItPmZQYXJpdHkgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbHBkY2ItPmZQYXJpdHkgPSBGQUxTRTsKI2lmZGVmIENNU1BBUgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKSkKI2Vsc2UKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCkpCiNlbmRpZgoJewoJCWNhc2UgMDoKCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIFBBUkVOQjoKCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgKFBBUkVOQiB8IFBBUk9ERCk6CgkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CgkJCWJyZWFrOwojaWZkZWYgQ01TUEFSCgkJY2FzZSAoUEFSRU5CIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CgkJCWJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IFNQQUNFUEFSSVRZOwoJCQlicmVhazsKI2VuZGlmCgl9CgoJaWYgKHBvcnQuY19jZmxhZyAmIENTVE9QQikKICAgICAgICAgICAgaWYobHBkY2ItPkJ5dGVTaXplID09IDUpCiAgICAgICAgICAgICAgICBscGRjYi0+U3RvcEJpdHMgPSBPTkU1U1RPUEJJVFM7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IFRXT1NUT1BCSVRTOwoJZWxzZQogICAgICAgICAgICBscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoKCWxwZGNiLT5mTnVsbCA9IDA7CglscGRjYi0+ZkJpbmFyeSA9IDE7CgoJLyogdGVybWlvcyBkb2VzIG5vdCBzdXBwb3J0IERUUi9EU1IgZmxvdyBjb250cm9sICovCglscGRjYi0+Zk91dHhEc3JGbG93ID0gMDsKCWxwZGNiLT5mRHRyQ29udHJvbCA9CiNpZmRlZiBUSU9DTV9EVFIKICAgICAgICAgICAgIShzdGF0ICYgVElPQ01fRFRSKSA/ICBEVFJfQ09OVFJPTF9ESVNBQkxFOgojZW5kaWYKICAgICAgICAgICAgICAgIERUUl9DT05UUk9MX0VOQUJMRSAgOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKCX0gZWxzZQojZW5kaWYKCXsKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSAKI2lmZGVmIFRJT0NNX1JUUwogICAgICAgICAgICAgICAgICAgICEoc3RhdCAmIFRJT0NNX1JUUykgPyAgUlRTX0NPTlRST0xfRElTQUJMRSA6CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIFJUU19DT05UUk9MX0VOQUJMRSA7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IDA7Cgl9CglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9CglscGRjYi0+WG9mZkNoYXIgPQogKi8KCWxwZGNiLT5Yb25MaW0gPSAxMDsKCWxwZGNiLT5Yb2ZmTGltID0gMTA7CgogICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSwwKTsKCiAgICAgICAgVFJBQ0UoIk9LXG4iKTsKCglUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgICAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgICAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CglUUkFDRSgiJXMgJXNcbiIsKGxwZGNiLT5mSW5YKT8iSVhPTiI6In5JWE9OIiwKCSAgICAgIChscGRjYi0+Zk91dFgpPyJJWE9GRiI6In5JWE9GRiIpOwogICAgICAgICBUUkFDRSgiZk91dHhDdHNGbG93ICVkIGZSdHNDb250cm9sICVkXG4iLCBscGRjYi0+Zk91dHhDdHNGbG93LAogICAgICAgICAgICAgICAgIGxwZGNiLT5mUnRzQ29udHJvbCk7CiAgICAgICAgIFRSQUNFKCJmT3V0eERzckZsb3cgJWQgZkR0ckNvbnRyb2wlZFxuIiwgbHBkY2ItPmZPdXR4RHNyRmxvdywKICAgICAgICAgICAgICAgICBscGRjYi0+ZkR0ckNvbnRyb2wpOwojaWZkZWYgQ1JUU0NUUwoJaWYgKAlscGRjYi0+Zk91dHhDdHNGbG93IAkJCXx8CgkJbHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX0hBTkRTSEFLRQoJCSkKCSAgVFJBQ0UoIkNSVFNDVFNcbiIpOwogICAgICAgIGVsc2UKCgkgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CiNlbmRpZgoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShLRVJORUwzMi5AKQogKgogKiAgVHJhbnNtaXRzIGEgc2luZ2xlIGNoYXJhY3RlciBpbiBmcm9udCBvZiBhbnkgcGVuZGluZyBjaGFyYWN0ZXJzIGluIHRoZQogKiAgb3V0cHV0IGJ1ZmZlci4gIFVzdWFsbHkgdXNlZCB0byBzZW5kIGFuIGludGVycnVwdCBjaGFyYWN0ZXIgdG8gYSBob3N0LgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIGlmIHRoZSBjYWxsIHN1Y2NlZWRlZCwgZmFsc2UgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQgY2hhcmFjdGVyIHRvIHRoZQogKiAgc2FtZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHNlbnQgeWV0IHRoZSBoYW5kbGUgaXMgYmFkIGV0Yy4KICoKICogQlVHUwogKgogKiAgU3R1Yi4KICovCkJPT0wgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIoCiAgICBIQU5ETEUgaENvbW0sICAgICAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbiBkZXZpY2UgaW4gbmVlZCBvZiBhIGNvbW1hbmQgY2hhcmFjdGVyLiAqLwogICAgQ0hBUiAgIGNoVHJhbnNtaXQpIC8qIFtpbl0gVGhlIGNoYXJhY3RlciB0byB0cmFuc21pdC4gKi8KewogICAgRFdPUkQgdzsKICAgIFdBUk4oIiglcCwnJWMnKSBub3QgcGVyZmVjdCFcbiIsaENvbW0sY2hUcmFuc21pdCk7CgogICAgcmV0dXJuIFdyaXRlRmlsZSggaENvbW0sICZjaFRyYW5zbWl0LCAxLCAmdywgTlVMTCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLkApCiAqCiAqICBPYnRhaW5zIHRoZSByZXF1ZXN0IHRpbWVvdXQgdmFsdWVzIGZvciB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGNvbW11bmljYXRpb25zIGRldmljZSBoYW5kbGUgaXMgYmFkCiAqICBvciB0aGUgdGFyZ2V0IHN0cnVjdHVyZSBpcyBudWxsLgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVRpbWVvdXRzKAogICAgSEFORExFICAgICAgICAgaENvbW0sICAgICAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgLyogW291dF0gVGhlIHN0cnVjdCBvZiByZXF1ZXN0IHRpbWVvdXRzLiAqLwp7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiKCVwLCVwKVxuIixoQ29tbSxscHRpbWVvdXRzKTsKCiAgICBpZighbHB0aW1lb3V0cykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaENvbW07CiAgICAgICAgaWYgKChyZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgICAgICAgICA9IHJlcGx5LT5yZWFkaW50ZXJ2YWw7CiAgICAgICAgICAgIGxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyICA9IHJlcGx5LT5yZWFkbXVsdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50ICAgID0gcmVwbHktPnJlYWRjb25zdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyID0gcmVwbHktPndyaXRlbXVsdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCAgID0gcmVwbHktPndyaXRlY29uc3Q7CiAgICAgICAgfQogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuQCkKICoKICogU2V0cyB0aGUgdGltZW91dHMgdXNlZCB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YSB0by9mcm9tIENPTU0gcG9ydHMuCiAqCiAqIFJlYWRJbnRlcnZhbFRpbWVvdXQKICogICAgIC0gY29udmVydGVkIGFuZCBwYXNzZXMgdG8gbGludXgga2VybmVsIGFzIGNfY2NbVlRJTUVdCiAqIFJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyLCBSZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQKICogICAgIC0gdXNlZCBpbiBSZWFkRmlsZSB0byBjYWxjdWxhdGUgR2V0T3ZlcmxhcHBlZFJlc3VsdCdzIHRpbWVvdXQKICogV3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyLCBXcml0ZVRvdGFsVGltZW91dENvbnN0YW50CiAqICAgICAtIHVzZWQgaW4gV3JpdGVGaWxlIHRvIGNhbGN1bGF0ZSBHZXRPdmVybGFwcGVkUmVzdWx0J3MgdGltZW91dAogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIGlmIHRoZSB0aW1lb3V0cyB3ZXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVRpbWVvdXRzKAogICAgSEFORExFIGhDb21tLCAgICAgICAgICAgICAgLyogW2luXSBoYW5kbGUgb2YgQ09NTSBkZXZpY2UgKi8KICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIC8qIFtpbl0gcG9pbnRlciB0byBDT01NVElNRU9VVFMgc3RydWN0dXJlICovCnsKICAgIEJPT0wgcmV0OwogICAgaW50IGZkOwogICAgc3RydWN0IHRlcm1pb3MgdGlvczsKCiAgICBUUkFDRSgiKCVwLCVwKVxuIixoQ29tbSxscHRpbWVvdXRzKTsKCiAgICBpZighbHB0aW1lb3V0cykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlICAgICAgID0gaENvbW07CiAgICAgICAgcmVxLT5mbGFncyAgICAgICAgPSBTRVJJQUxJTkZPX1NFVF9USU1FT1VUUzsKICAgICAgICByZXEtPnJlYWRpbnRlcnZhbCA9IGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgOwogICAgICAgIHJlcS0+cmVhZG11bHQgICAgID0gbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgOwogICAgICAgIHJlcS0+cmVhZGNvbnN0ICAgID0gbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50IDsKICAgICAgICByZXEtPndyaXRlbXVsdCAgICA9IGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllciA7CiAgICAgICAgcmVxLT53cml0ZWNvbnN0ICAgPSBscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50IDsKICAgICAgICByZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICBpZiAoIXJldCkgcmV0dXJuIEZBTFNFOwoKICAgIC8qIEZJWE1FOiBtb3ZlIHRoaXMgc3R1ZmYgdG8gdGhlIHNlcnZlciAqLwogICAgZmQgPSBnZXRfY29tbV9mZCggaENvbW0sIEdFTkVSSUNfUkVBRCApOwogICAgaWYgKGZkIDwgMCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmICgtMT09dGNnZXRhdHRyKGZkLCZ0aW9zKSkgewogICAgICAgIEZJWE1FKCJ0Y2dldGF0dHIgb24gZmQgJWQgZmFpbGVkIVxuIixmZCk7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoQ29tbSwgZmQgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogVlRJTUUgaXMgaW4gMS8xMCBzZWNvbmRzICovCgl7CgkJdW5zaWduZWQgaW50IHV4X3RpbWVvdXQ7CgoJCWlmKGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgPT0gMCkgLyogMCBtZWFucyBubyB0aW1lb3V0ICovCgkJewoJCQl1eF90aW1lb3V0ID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJdXhfdGltZW91dCA9IChscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0Kzk5KS8xMDA7CgkJCWlmKHV4X3RpbWVvdXQgPT0gMCkKCQkJewoJCQkJdXhfdGltZW91dCA9IDE7IC8qIG11c3QgYmUgYXQgbGVhc3Qgc29tZSB0aW1lb3V0ICovCgkJCX0KCQl9CgkJdGlvcy5jX2NjW1ZUSU1FXSA9IHV4X3RpbWVvdXQ7Cgl9CgogICAgaWYgKC0xPT10Y3NldGF0dHIoZmQsMCwmdGlvcykpIHsKICAgICAgICBGSVhNRSgidGNzZXRhdHRyIG9uIGZkICVkIGZhaWxlZCFcbiIsZmQpOwogICAgICAgIHJlbGVhc2VfY29tbV9mZCggaENvbW0sIGZkICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmVsZWFzZV9jb21tX2ZkKCBoQ29tbSwgZmQgKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Nb2RlbVN0YXR1cyAgIChLRVJORUwzMi5AKQogKgogKiAgT2J0YWlucyB0aGUgZm91ciBjb250cm9sIHJlZ2lzdGVyIGJpdHMgaWYgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgaGFuZGxlIHdhcyBnb29kIGFuZCBmb3IgaGFyZHdhcmUgdGhhdAogKiAgY29udHJvbCByZWdpc3RlciBhY2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICovCkJPT0wgV0lOQVBJIEdldENvbW1Nb2RlbVN0YXR1cygKICAgIEhBTkRMRSAgaEZpbGUsICAgICAgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQRFdPUkQgbHBNb2RlbVN0YXQpIC8qIFtvdXRdIFRoZSBjb250cm9sIHJlZ2lzdGVyIGJpdHMuICovCnsKCWludCBmZCxtc3RhdCwgcmVzdWx0PUZBTFNFOwoKCSpscE1vZGVtU3RhdD0wOwojaWZkZWYgVElPQ01HRVQKCWZkID0gZ2V0X2NvbW1fZmQoIGhGaWxlLCBHRU5FUklDX1JFQUQgKTsKCWlmKGZkPDApCgkJcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwoJcmVsZWFzZV9jb21tX2ZkKCBoRmlsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0gLTEpCgkgIHsKCSAgICBXQVJOKCJpb2N0bCBmYWlsZWRcbiIpOwoJICAgIHJldHVybiBGQUxTRTsKCSAgfQojaWZkZWYgVElPQ01fQ1RTCglpZiAobXN0YXQgJiBUSU9DTV9DVFMpCgkgICAgKmxwTW9kZW1TdGF0IHw9IE1TX0NUU19PTjsKI2VuZGlmCiNpZmRlZiBUSU9DTV9EU1IKCWlmIChtc3RhdCAmIFRJT0NNX0RTUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX0RTUl9PTjsKI2VuZGlmCiNpZmRlZiBUSU9DTV9STkcKCWlmIChtc3RhdCAmIFRJT0NNX1JORykKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JJTkdfT047CiNlbmRpZgojaWZkZWYgVElPQ01fQ0FSCgkvKkZJWE1FOiAgTm90IHJlYWxseSBzdXJlIGFib3V0IFJMU0QgIFVCIDk5MDgxMCovCglpZiAobXN0YXQgJiBUSU9DTV9DQVIpCgkgICpscE1vZGVtU3RhdCB8PSBNU19STFNEX09OOwojZW5kaWYKCVRSQUNFKCIlMDR4IC0+ICVzJXMlcyVzXG4iLCBtc3RhdCwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JMU0RfT04pPyJNU19STFNEX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19SSU5HX09OKT8iTVNfUklOR19PTiAiOiIiLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfRFNSX09OKT8iTVNfRFNSX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19DVFNfT04pPyJNU19DVFNfT04gIjoiIik7CglyZXR1cm4gVFJVRTsKI2Vsc2UKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBDT01NX1dhaXRDb21tRXZlbnRTZXJ2aWNlICAgICAgKElOVEVSTkFMKQogKgogKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgdGhlIGNsaWVudCBpcyB3YWl0aW5nIG9uIHRoZQogKiAgc2VydmVyLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBzZXJ2ZXIgY2FsbHMgaGVyZS4KICovCnN0YXRpYyB2b2lkIFdJTkFQSSBDT01NX1dhaXRDb21tRXZlbnRTZXJ2aWNlKHZvaWQqIG92cCwgSU9fU1RBVFVTX0JMT0NLKiBpb3NiLCBVTE9ORyBzdGF0dXMpCnsKICAgIGFzeW5jX2NvbW1pbyAqY29tbWlvID0gKGFzeW5jX2NvbW1pbyopIG92cDsKCiAgICBUUkFDRSgiaW9zYiAlcFxuIiwgaW9zYik7CgogICAgc3dpdGNoIChzdGF0dXMpCiAgICB7CiAgICBjYXNlIFNUQVRVU19BTEVSVEVEOiAvKiBnb3Qgc29tZSBuZXcgc3R1ZmYgKi8KICAgICAgICAvKiBGSVhNRTogZGV0ZWN0IG90aGVyIGV2ZW50cyAqLwogICAgICAgICpjb21taW8tPmJ1ZmZlciA9IEVWX1JYQ0hBUjsKICAgICAgICBpb3NiLT51LlN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBpb3NiLT51LlN0YXR1cyA9IHN0YXR1czsKICAgICAgICBicmVhazsKICAgIH0KICAgIHdpbmVfc2VydmVyX3JlbGVhc2VfZmQoIGNvbW1pby0+aGFuZGxlLCBjb21taW8tPmZkICk7CiAgICBpZiAoICgoTFBPVkVSTEFQUEVEKWlvc2IpLT5oRXZlbnQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgKQogICAgICAgIE50U2V0RXZlbnQoICgoTFBPVkVSTEFQUEVEKWlvc2IpLT5oRXZlbnQsIE5VTEwgKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNvbW1pbyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIENPTU1fV2FpdENvbW1FdmVudCAgICAgICAgIChJTlRFUk5BTCkKICoKICogIFRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIGFuIGxwT3ZlcmxhcHBlZC4KICovCnN0YXRpYyBCT09MIENPTU1fV2FpdENvbW1FdmVudCgKICAgIEhBTkRMRSBoRmlsZSwgICAgICAgICAgICAgIC8qIFtpbl0gaGFuZGxlIG9mIGNvbW0gcG9ydCB0byB3YWl0IGZvciAqLwogICAgTFBEV09SRCBscGR3RXZlbnRzLCAgICAgICAgLyogW291dF0gZXZlbnQocykgdGhhdCB3ZXJlIGRldGVjdGVkICovCiAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKSAvKiBbaW4vb3V0XSBmb3IgQXN5bmNocm9ub3VzIHdhaXRpbmcgKi8KewogICAgaW50ICAgICAgICAgICAgICAgICBmZDsKICAgIGFzeW5jX2NvbW1pbyogICAgICAgY29tbWlvOwogICAgTlRTVEFUVVMgICAgICAgICAgICBzdGF0dXM7CgogICAgaWYgKCFscE92ZXJsYXBwZWQpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKE50UmVzZXRFdmVudChscE92ZXJsYXBwZWQtPmhFdmVudCxOVUxMKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgZmQgPSBnZXRfY29tbV9mZCggaEZpbGUsIEdFTkVSSUNfV1JJVEUgKTsKICAgIGlmIChmZCA8IDApIHJldHVybiBGQUxTRTsKCiAgICBjb21taW8gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mIChhc3luY19jb21taW8pKTsKICAgIGlmICghY29tbWlvKQogICAgewogICAgICAgIHJlbGVhc2VfY29tbV9mZCggaEZpbGUsIGZkICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGNvbW1pby0+aGFuZGxlID0gaEZpbGU7CiAgICBjb21taW8tPnR5cGUgPSBBU1lOQ19UWVBFX1dBSVQ7CiAgICBjb21taW8tPmFwY19pbnRlcm5hbCA9IENPTU1fV2FpdENvbW1FdmVudFNlcnZpY2U7CiAgICBjb21taW8tPmJ1ZmZlciA9IChjaGFyICopbHBkd0V2ZW50czsKICAgIGNvbW1pby0+ZmQgPSBmZDsgIC8qIEZJWE1FICovCgogICAgbHBPdmVybGFwcGVkLT5JbnRlcm5hbEhpZ2ggPSAwOwogICAgbHBPdmVybGFwcGVkLT51LnMuT2Zmc2V0ID0gMDsKICAgIGxwT3ZlcmxhcHBlZC0+dS5zLk9mZnNldEhpZ2ggPSAwOwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHJlZ2lzdGVyX2FzeW5jICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSA9IGhGaWxlOwogICAgICAgIHJlcS0+aW9fYXBjID0gQ09NTV9XYWl0Q29tbUV2ZW50U2VydmljZTsKICAgICAgICByZXEtPmlvX3VzZXIgPSBjb21taW87CiAgICAgICAgcmVxLT5pb19zYiA9IChJT19TVEFUVVNfQkxPQ0sqKWxwT3ZlcmxhcHBlZDsKICAgICAgICByZXEtPmNvdW50ID0gMDsKICAgICAgICBzdGF0dXMgPSB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwoKICAgIGlmICggc3RhdHVzICkgU2V0TGFzdEVycm9yKCBSdGxOdFN0YXR1c1RvRG9zRXJyb3Ioc3RhdHVzKSApOwogICAgZWxzZSBOdEN1cnJlbnRUZWIoKS0+bnVtX2FzeW5jX2lvKys7CgogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFdhaXRDb21tRXZlbnQgICAoS0VSTkVMMzIuQCkKICoKICogV2FpdCB1bnRpbCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucyBvbiBhIENPTU0gcG9ydC4KICogSW50ZXJlc3RpbmcgdGhpbmdzIChldmVudHMpIGFyZSBzZXQgYnkgY2FsbGluZyBTZXRDb21tTWFzayBiZWZvcmUKICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAqCiAqIFJFVFVSTlM6CiAqICAgVFJVRSBpZiBzdWNjZXNzZnVsCiAqICAgRkFMU0UgaWYgZmFpbHVyZQogKgogKiAgIFRoZSBzZXQgb2YgZGV0ZWN0ZWQgZXZlbnRzIHdpbGwgYmUgd3JpdHRlbiB0byAqbHBkd0V2ZW50TWFzawogKiAgIEVSUk9SX0lPX1BFTkRJTkcgd2lsbCBiZSByZXR1cm5lZCB0aGUgb3ZlcmxhcHBlZCBzdHJ1Y3R1cmUgd2FzIHBhc3NlZAogKgogKiBCVUdTOgogKiAgT25seSBzdXBwb3J0cyBFVl9SWENIQVIgYW5kIEVWX1RYRU1QVFkKICovCkJPT0wgV0lOQVBJIFdhaXRDb21tRXZlbnQoCiAgICBIQU5ETEUgaEZpbGUsICAgICAgICAgICAgICAvKiBbaW5dIGhhbmRsZSBvZiBjb21tIHBvcnQgdG8gd2FpdCBmb3IgKi8KICAgIExQRFdPUkQgbHBkd0V2ZW50cywgICAgICAgIC8qIFtvdXRdIGV2ZW50KHMpIHRoYXQgd2VyZSBkZXRlY3RlZCAqLwogICAgTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkgLyogW2luL291dF0gZm9yIEFzeW5jaHJvbm91cyB3YWl0aW5nICovCnsKICAgIE9WRVJMQVBQRUQgb3Y7CiAgICBpbnQgcmV0OwoKICAgIFRSQUNFKCIoJXAgJXAgJXAgKVxuIixoRmlsZSwgbHBkd0V2ZW50cyxscE92ZXJsYXBwZWQpOwoKICAgIGlmKGxwT3ZlcmxhcHBlZCkKICAgICAgICByZXR1cm4gQ09NTV9XYWl0Q29tbUV2ZW50KGhGaWxlLCBscGR3RXZlbnRzLCBscE92ZXJsYXBwZWQpOwoKICAgIC8qIGlmIHRoZXJlIGlzIG5vIG92ZXJsYXBwZWQgc3RydWN0dXJlLCBjcmVhdGUgb3VyIG93biAqLwogICAgb3YuaEV2ZW50ID0gQ3JlYXRlRXZlbnRXKE5VTEwsRkFMU0UsRkFMU0UsTlVMTCk7CgogICAgQ09NTV9XYWl0Q29tbUV2ZW50KGhGaWxlLCBscGR3RXZlbnRzLCAmb3YpOwoKICAgIC8qIHdhaXQgZm9yIHRoZSBvdmVybGFwcGVkIHRvIGNvbXBsZXRlICovCiAgICByZXQgPSBHZXRPdmVybGFwcGVkUmVzdWx0KGhGaWxlLCAmb3YsIE5VTEwsIFRSVUUpOwogICAgQ2xvc2VIYW5kbGUob3YuaEV2ZW50KTsKCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gYSBzdHJ1Y3R1cmUgd2l0aCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQogKiBjb21tdW5pY2F0aW9ucyBwb3J0IGRyaXZlci4KICoKICogUkVUVVJOUwogKgogKiAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAqICBJZiBzdWNjZXNzZnVsLCB0aGUgbHBDb21tUHJvcCBzdHJ1Y3R1cmUgYmUgZmlsbGVkIGluIHdpdGgKICogIHByb3BlcnRpZXMgb2YgdGhlIGNvbW0gcG9ydC4KICovCkJPT0wgV0lOQVBJIEdldENvbW1Qcm9wZXJ0aWVzKAogICAgSEFORExFIGhGaWxlLCAgICAgICAgICAvKiBbaW5dIGhhbmRsZSBvZiB0aGUgY29tbSBwb3J0ICovCiAgICBMUENPTU1QUk9QIGxwQ29tbVByb3ApIC8qIFtvdXRdIHBvaW50ZXIgdG8gc3RydWN0IHRvIGJlIGZpbGxlZCAqLwp7CiAgICBGSVhNRSgiKCVwICVwIClcbiIsaEZpbGUsbHBDb21tUHJvcCk7CiAgICBpZighbHBDb21tUHJvcCkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgLyoKICAgICAqIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgdmFsaWQgZm9yIExJTlVYJ3Mgc2VyaWFsIGRyaXZlcgogICAgICogRklYTUU6IFBlcmhhcHMgdGhleSBkZXNlcnZlIGFuICNpZmRlZiBMSU5VWAogICAgICovCiAgICBtZW1zZXQobHBDb21tUHJvcCwwLHNpemVvZihDT01NUFJPUCkpOwogICAgbHBDb21tUHJvcC0+d1BhY2tldExlbmd0aCAgICAgICA9IDE7CiAgICBscENvbW1Qcm9wLT53UGFja2V0VmVyc2lvbiAgICAgID0gMTsKICAgIGxwQ29tbVByb3AtPmR3U2VydmljZU1hc2sgICAgICAgPSBTUF9TRVJJQUxDT01NOwogICAgbHBDb21tUHJvcC0+ZHdSZXNlcnZlZDEgICAgICAgICA9IDA7CiAgICBscENvbW1Qcm9wLT5kd01heFR4UXVldWUgICAgICAgID0gNDA5NjsKICAgIGxwQ29tbVByb3AtPmR3TWF4UnhRdWV1ZSAgICAgICAgPSA0MDk2OwogICAgbHBDb21tUHJvcC0+ZHdNYXhCYXVkICAgICAgICAgICA9IEJBVURfMTE1MjAwOwogICAgbHBDb21tUHJvcC0+ZHdQcm92U3ViVHlwZSAgICAgICA9IFBTVF9SUzIzMjsKICAgIGxwQ29tbVByb3AtPmR3UHJvdkNhcGFiaWxpdGllcyAgPSBQQ0ZfRFRSRFNSIHwgUENGX1BBUklUWV9DSEVDSyB8IFBDRl9SVFNDVFMgfCBQQ0ZfVE9UQUxUSU1FT1VUUzsKICAgIGxwQ29tbVByb3AtPmR3U2V0dGFibGVQYXJhbXMgICAgPSBTUF9CQVVEIHwgU1BfREFUQUJJVFMgfCBTUF9IQU5EU0hBS0lORyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BfUEFSSVRZIHwgU1BfUEFSSVRZX0NIRUNLIHwgU1BfU1RPUEJJVFMgOwogICAgbHBDb21tUHJvcC0+ZHdTZXR0YWJsZUJhdWQgICAgICA9IEJBVURfMDc1IHwgQkFVRF8xMTAgfCBCQVVEXzEzNF81IHwgQkFVRF8xNTAgfAogICAgICAgICAgICAgICAgQkFVRF8zMDAgfCBCQVVEXzYwMCB8IEJBVURfMTIwMCB8IEJBVURfMTgwMCB8IEJBVURfMjQwMCB8IEJBVURfNDgwMCB8CiAgICAgICAgICAgICAgICBCQVVEXzk2MDAgfCBCQVVEXzE5MjAwIHwgQkFVRF8zODQwMCB8IEJBVURfNTc2MDAgfCBCQVVEXzExNTIwMCA7CiAgICBscENvbW1Qcm9wLT53U2V0dGFibGVEYXRhICAgICAgID0gREFUQUJJVFNfNSB8IERBVEFCSVRTXzYgfCBEQVRBQklUU183IHwgREFUQUJJVFNfOCA7CiAgICBscENvbW1Qcm9wLT53U2V0dGFibGVTdG9wUGFyaXR5ID0gU1RPUEJJVFNfMTAgfCBTVE9QQklUU18xNSB8IFNUT1BCSVRTXzIwIHwKICAgICAgICAgICAgICAgIFBBUklUWV9OT05FIHwgUEFSSVRZX09ERCB8UEFSSVRZX0VWRU4gfCBQQVJJVFlfTUFSSyB8IFBBUklUWV9TUEFDRTsKICAgIGxwQ29tbVByb3AtPmR3Q3VycmVudFR4UXVldWUgICAgPSBscENvbW1Qcm9wLT5kd01heFR4UXVldWU7CiAgICBscENvbW1Qcm9wLT5kd0N1cnJlbnRSeFF1ZXVlICAgID0gbHBDb21tUHJvcC0+ZHdNYXhSeFF1ZXVlOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRklYTUU6CiAqIFRoZSBmdW5jdGlvbmFsaXR5IG9mIENvbW1Db25maWdEaWFsb2dBLCBHZXREZWZhdWx0Q29tbUNvbmZpZyBhbmQKICogU2V0RGVmYXVsdENvbW1Db25maWcgaXMgaW1wbGVtZW50ZWQgaW4gYSBETEwgKHVzdWFsbHkgU0VSSUFMVUkuRExMKS4KICogVGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YgQ09NTSBwb3J0LCBidXQgc2luY2UgaXQgaXMgZG91YnRmdWwKICogYW55Ym9keSB3aWxsIGdldCBhcm91bmQgdG8gaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIGZhbmN5IHNlcmlhbAogKiBwb3J0cyBpbiBXSU5FLCB0aGlzIGlzIGhhcmRjb2RlZCBmb3IgdGhlIHRpbWUgYmVpbmcuICBUaGUgbmFtZSBvZgogKiB0aGlzIERMTCBzaG91bGQgYmUgc3RvcmVkIGluIGFuZCByZWFkIGZyb20gdGhlIHN5c3RlbSByZWdpc3RyeSBpbgogKiB0aGUgaGl2ZSBIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleQogKiBTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcQ2xhc3NcXFBvcnRzXFw/Pz8/CiAqIHdoZXJlID8/Pz8gaXMgdGhlIHBvcnQgbnVtYmVyLi4uIHRoYXQgaXMgZGV0ZXJtaW5lZCBieSBQTlAKICogVGhlIERMTCBzaG91bGQgYmUgbG9hZGVkIHdoZW4gdGhlIENPTU0gcG9ydCBpcyBvcGVuZWQsIGFuZCBjbG9zZWQKICogd2hlbiB0aGUgQ09NTSBwb3J0IGlzIGNsb3NlZC4gLSBNSk0gMjAgSnVuZSAyMDAwCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFdDSEFSIGxwc3pTZXJpYWxVSVtdID0geyAKICAgJ3MnLCdlJywncicsJ2knLCdhJywnbCcsJ3UnLCdpJywnLicsJ2QnLCdsJywnbCcsMCB9OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tbUNvbmZpZ0RpYWxvZ0EgICAoS0VSTkVMMzIuQCkKICoKICogUmFpc2VzIGEgZGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBhIGNvbW0gcG9ydC4KICogRmlsbHMgdGhlIENPTU1DT05GSUcgc3RydWN0IHdpdGggaW5mb3JtYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgogKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjYWxsIGEgc2ltaWxhciByb3V0aW5lIGluIHRoZSBDT01NIGRyaXZlci4uLgogKgogKiBSRVRVUk5TCiAqCiAqICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICogIElmIHN1Y2Nlc3NmdWwsIHRoZSBscENvbW1Db25maWcgc3RydWN0dXJlIHdpbGwgY29udGFpbiBhIG5ldwogKiAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbW0gcG9ydCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgogKgogKiBCVUdTCiAqICBUaGUgbGlicmFyeSB3aXRoIHRoZSBDb21tQ29uZmlnRGlhbG9nIGNvZGUgaXMgbmV2ZXIgdW5sb2FkZWQuCiAqIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgZG9uZSB3aGVuIHRoZSBjb21tIHBvcnQgaXMgY2xvc2VkPwogKi8KQk9PTCBXSU5BUEkgQ29tbUNvbmZpZ0RpYWxvZ0EoCiAgICBMUENTVFIgbHBzekRldmljZSwgICAgICAgICAvKiBbaW5dIG5hbWUgb2YgY29tbXVuaWNhdGlvbnMgZGV2aWNlICovCiAgICBIV05EIGhXbmQsICAgICAgICAgICAgICAgICAvKiBbaW5dIHBhcmVudCB3aW5kb3cgZm9yIHRoZSBkaWFsb2cgKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcpIC8qIFtvdXRdIHBvaW50ZXIgdG8gc3RydWN0IHRvIGZpbGwgKi8KewogICAgRkFSUFJPQyBscGZuQ29tbURpYWxvZzsKICAgIEhNT0RVTEUgaENvbmZpZ01vZHVsZTsKICAgIEJPT0wgciA9IEZBTFNFOwoKICAgIFRSQUNFKCIoJXAgJXAgJXApXG4iLGxwc3pEZXZpY2UsIGhXbmQsIGxwQ29tbUNvbmZpZyk7CgogICAgaENvbmZpZ01vZHVsZSA9IExvYWRMaWJyYXJ5VyhscHN6U2VyaWFsVUkpOwogICAgaWYoIWhDb25maWdNb2R1bGUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwZm5Db21tRGlhbG9nID0gR2V0UHJvY0FkZHJlc3MoaENvbmZpZ01vZHVsZSwgImRydkNvbW1Db25maWdEaWFsb2dBIik7CgogICAgaWYobHBmbkNvbW1EaWFsb2cpCiAgICAgICAgciA9IGxwZm5Db21tRGlhbG9nKGxwc3pEZXZpY2UsaFduZCxscENvbW1Db25maWcpOwoKICAgIEZyZWVMaWJyYXJ5KGhDb25maWdNb2R1bGUpOwoKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbW1Db25maWdEaWFsb2dXICAgKEtFUk5FTDMyLkApCiAqCiAqIHNlZSBDb21tQ29uZmlnRGlhbG9nQSBmb3IgbW9yZSBpbmZvCiAqLwpCT09MIFdJTkFQSSBDb21tQ29uZmlnRGlhbG9nVygKICAgIExQQ1dTVFIgbHBzekRldmljZSwgICAgICAgIC8qIFtpbl0gbmFtZSBvZiBjb21tdW5pY2F0aW9ucyBkZXZpY2UgKi8KICAgIEhXTkQgaFduZCwgICAgICAgICAgICAgICAgIC8qIFtpbl0gcGFyZW50IHdpbmRvdyBmb3IgdGhlIGRpYWxvZyAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZykgLyogW291dF0gcG9pbnRlciB0byBzdHJ1Y3QgdG8gZmlsbCAqLwp7CiAgICBGQVJQUk9DIGxwZm5Db21tRGlhbG9nOwogICAgSE1PRFVMRSBoQ29uZmlnTW9kdWxlOwogICAgQk9PTCByID0gRkFMU0U7CgogICAgVFJBQ0UoIiglcCAlcCAlcClcbiIsbHBzekRldmljZSwgaFduZCwgbHBDb21tQ29uZmlnKTsKCiAgICBoQ29uZmlnTW9kdWxlID0gTG9hZExpYnJhcnlXKGxwc3pTZXJpYWxVSSk7CiAgICBpZighaENvbmZpZ01vZHVsZSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgbHBmbkNvbW1EaWFsb2cgPSBHZXRQcm9jQWRkcmVzcyhoQ29uZmlnTW9kdWxlLCAiZHJ2Q29tbUNvbmZpZ0RpYWxvZ1ciKTsKCiAgICBpZihscGZuQ29tbURpYWxvZykKICAgICAgICByID0gbHBmbkNvbW1EaWFsb2cobHBzekRldmljZSxoV25kLGxwQ29tbUNvbmZpZyk7CgogICAgRnJlZUxpYnJhcnkoaENvbmZpZ01vZHVsZSk7CgogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbUNvbmZpZyAgICAgKEtFUk5FTDMyLkApCiAqCiAqIEZpbGwgaW4gdGhlIENPTU1DT05GSUcgc3RydWN0dXJlIGZvciB0aGUgY29tbSBwb3J0IGhGaWxlCiAqCiAqIFJFVFVSTlMKICoKICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogKiAgSWYgc3VjY2Vzc2Z1bCwgbHBDb21tQ29uZmlnIGNvbnRhaW5zIHRoZSBjb21tIHBvcnQgY29uZmlndXJhdGlvbi4KICoKICogQlVHUwogKgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbUNvbmZpZygKICAgIEhBTkRMRSAgICAgICBoRmlsZSwgICAgICAgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcsIC8qIFtvdXRdIFRoZSBjb21tdW5pY2F0aW9ucyBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UgKGlmIGl0IGZpdHMpLiAqLwogICAgTFBEV09SRCAgICAgIGxwZHdTaXplKSAgICAgLyogW2luL291dF0gSW5pdGlhbGx5IHRoZSBzaXplIG9mIHRoZSBjb25maWd1cmF0aW9uIGJ1ZmZlci9zdHJ1Y3R1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcndhcmRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBidWZmZXIgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLiAqLwp7CiAgICBCT09MIHI7CgogICAgVFJBQ0UoIiglcCAlcClcbiIsaEZpbGUsbHBDb21tQ29uZmlnKTsKCiAgICBpZihscENvbW1Db25maWcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICByID0gKmxwZHdTaXplIDwgc2l6ZW9mKENPTU1DT05GSUcpOyAvKiBUUlVFIGlmIG5vdCBlbm91Z2ggc3BhY2UgKi8KICAgICpscGR3U2l6ZSA9IHNpemVvZihDT01NQ09ORklHKTsKICAgIGlmKHIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwQ29tbUNvbmZpZy0+ZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgbHBDb21tQ29uZmlnLT53VmVyc2lvbiA9IDE7CiAgICBscENvbW1Db25maWctPndSZXNlcnZlZCA9IDA7CiAgICByID0gR2V0Q29tbVN0YXRlKGhGaWxlLCZscENvbW1Db25maWctPmRjYik7CiAgICBscENvbW1Db25maWctPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgbHBDb21tQ29uZmlnLT5kd1Byb3ZpZGVyT2Zmc2V0ID0gMDsKICAgIGxwQ29tbUNvbmZpZy0+ZHdQcm92aWRlclNpemUgPSAwOwoKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldENvbW1Db25maWcgICAgIChLRVJORUwzMi5AKQogKgogKiAgU2V0cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBoYW5kbGUgd2FzIGJhZCBpcyBub3QgYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQ29uZmlnKAogICAgSEFORExFICAgICAgIGhGaWxlLAkJLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZywJLyogW2luXSBUaGUgZGVzaXJlZCBjb25maWd1cmF0aW9uLiAqLwogICAgRFdPUkQgZHdTaXplKSAJCS8qIFtpbl0gc2l6ZSBvZiB0aGUgbHBDb21tQ29uZmlnIHN0cnVjdCAqLwp7CiAgICBUUkFDRSgiKCVwICVwKVxuIixoRmlsZSxscENvbW1Db25maWcpOwogICAgcmV0dXJuIFNldENvbW1TdGF0ZShoRmlsZSwmbHBDb21tQ29uZmlnLT5kY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldERlZmF1bHRDb21tQ29uZmlnQSAgIChLRVJORUwzMi5AKQogKgogKiAgSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uCiAqICBkZXZpY2UuIChhc2NpaSkKICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBpZiB0aGUgZGV2aWNlIHdhcyBmb3VuZCBhbmQgdGhlIGRlZmF1bHRzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlCiAqLwpCT09MIFdJTkFQSSBTZXREZWZhdWx0Q29tbUNvbmZpZ1coCiAgICBMUENXU1RSICAgICAgIGxwc3pEZXZpY2UsICAvKiBbaW5dIFRoZSBhc2NpaSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnLCAvKiBbaW5dIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBEV09SRCAgICAgICAgZHdTaXplKSAgICAgICAvKiBbaW5dIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLwp7CiAgICBGQVJQUk9DIGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZzsKICAgIEhNT0RVTEUgaENvbmZpZ01vZHVsZTsKICAgIEJPT0wgciA9IEZBTFNFOwoKICAgIFRSQUNFKCIoJXAgJXAgJWx4KVxuIixscHN6RGV2aWNlLCBscENvbW1Db25maWcsIGR3U2l6ZSk7CgogICAgaENvbmZpZ01vZHVsZSA9IExvYWRMaWJyYXJ5VyhscHN6U2VyaWFsVUkpOwogICAgaWYoIWhDb25maWdNb2R1bGUpCiAgICAgICAgcmV0dXJuIHI7CgogICAgbHBmblNldERlZmF1bHRDb21tQ29uZmlnID0gR2V0UHJvY0FkZHJlc3MoaENvbmZpZ01vZHVsZSwgImRydlNldERlZmF1bHRDb21tQ29uZmlnVyIpOwogICAgaWYgKGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZykKICAgICAgICByID0gbHBmblNldERlZmF1bHRDb21tQ29uZmlnKGxwc3pEZXZpY2UsIGxwQ29tbUNvbmZpZywgZHdTaXplKTsKCiAgICBGcmVlTGlicmFyeShoQ29uZmlnTW9kdWxlKTsKCiAgICByZXR1cm4gcjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0RGVmYXVsdENvbW1Db25maWdXICAgICAoS0VSTkVMMzIuQCkKICoKICogIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKICogIGNvbW11bmljYXRpb24gZGV2aWNlLiAodW5pY29kZSkKICoKICogUkVUVVJOUwogKgogKi8KQk9PTCBXSU5BUEkgU2V0RGVmYXVsdENvbW1Db25maWdBKAogICAgTFBDU1RSICAgICAgbHBzekRldmljZSwgICAgLyogW2luXSBUaGUgdW5pY29kZSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnLCAvKiBbaW5dIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBEV09SRCAgICAgICAgZHdTaXplKSAgICAgICAvKiBbaW5dIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLwp7CiAgICBCT09MIHI7CiAgICBMUFdTVFIgbHBEZXZpY2VXID0gTlVMTDsKICAgIERXT1JEIGxlbjsKCiAgICBUUkFDRSgiKCVzICVwICVseClcbiIsZGVidWdzdHJfYShscHN6RGV2aWNlKSxscENvbW1Db25maWcsZHdTaXplKTsKCiAgICBpZiAobHBzekRldmljZSkKICAgIHsKICAgICAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGxwc3pEZXZpY2UsIC0xLCBOVUxMLCAwICk7CiAgICAgICAgbHBEZXZpY2VXID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4qc2l6ZW9mKFdDSEFSKSApOwogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgbHBzekRldmljZSwgLTEsIGxwRGV2aWNlVywgbGVuICk7CiAgICB9CiAgICByID0gU2V0RGVmYXVsdENvbW1Db25maWdXKGxwRGV2aWNlVyxscENvbW1Db25maWcsZHdTaXplKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscERldmljZVcgKTsKICAgIHJldHVybiByOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXREZWZhdWx0Q29tbUNvbmZpZ1cgICAoS0VSTkVMMzIuQCkKICoKICogICBBY3F1aXJlcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29tbXVuaWNhdGlvbiBkZXZpY2UuICh1bmljb2RlKQogKgogKiAgUkVUVVJOUwogKgogKiAgIFRydWUgb24gc3VjY2Vzc2Z1bCByZWFkaW5nIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCiAqICAgaWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQgb3IgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCiAqLwpCT09MIFdJTkFQSSBHZXREZWZhdWx0Q29tbUNvbmZpZ1coCiAgICBMUENXU1RSICAgICAgbHBzek5hbWUsIC8qIFtpbl0gVGhlIHVuaWNvZGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRhcmdldGVkIGZvciBjb25maWd1cmF0aW9uLiAqLwogICAgTFBDT01NQ09ORklHIGxwQ0MsICAgICAvKiBbb3V0XSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgZGV2aWNlLiAqLwogICAgTFBEV09SRCAgICAgIGxwZHdTaXplKSAvKiBbaW4vb3V0XSBJbml0aWFsbHkgdGhlIHNpemUgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZHMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmVlZGVkIHNpemUgb2YgdGhlIGJ1ZmZlci4gKi8KewogICAgIExQRENCIGxwZGNiID0gJihscENDLT5kY2IpOwogICAgIFdDSEFSIHRlbXBbNDBdOwogICAgIHN0YXRpYyBjb25zdCBXQ0hBUiBjb21XW10gPSB7J0MnLCdPJywnTScsMH07CiAgICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnQycsJ08nLCdNJywnJScsJ2MnLCc6JywnMycsJzgnLCc0JywnMCcsJzAnLCcsJywnbicsJywnLCc4JywnLCcsJzEnLDB9OwoKICAgICBpZiAoc3RybmNtcGlXKGxwc3pOYW1lLGNvbVcsMykpIHsKICAgICAgICBFUlIoIm5vdCBpbXBsZW1lbnRlZCBmb3IgPCVzPlxuIiwgZGVidWdzdHJfdyhscHN6TmFtZSkpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CgogICAgIFRSQUNFKCIoJXMgJXAgJWxkKVxuIiwgZGVidWdzdHJfdyhscHN6TmFtZSksIGxwQ0MsICpscGR3U2l6ZSApOwogICAgIGlmICgqbHBkd1NpemUgPCBzaXplb2YoQ09NTUNPTkZJRykpIHsKICAgICAgICAgKmxwZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICB9CgogICAgICpscGR3U2l6ZSA9IHNpemVvZihDT01NQ09ORklHKTsKCiAgICAgbHBDQy0+ZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgIGxwQ0MtPndWZXJzaW9uID0gMTsKICAgICBscENDLT5kd1Byb3ZpZGVyU3ViVHlwZSA9IFBTVF9SUzIzMjsKICAgICBscENDLT5kd1Byb3ZpZGVyT2Zmc2V0ID0gMEw7CiAgICAgbHBDQy0+ZHdQcm92aWRlclNpemUgPSAwTDsKCiAgICAgc3ByaW50ZlcoIHRlbXAsIGZvcm1hdFcsIGxwc3pOYW1lWzNdKTsKICAgICBGSVhNRSgic2V0dGluZyAlcyBhcyBkZWZhdWx0XG4iLCBkZWJ1Z3N0cl93KHRlbXApKTsKCiAgICAgcmV0dXJuIEJ1aWxkQ29tbURDQlcoIHRlbXAsIGxwZGNiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0RGVmYXVsdENvbW1Db25maWdBCQkoS0VSTkVMMzIuQCkKICoKICogICBBY3F1aXJlcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29tbXVuaWNhdGlvbiBkZXZpY2UuIChhc2NpaSkKICoKICogIFJFVFVSTlMKICoKICogICBUcnVlIG9uIHN1Y2Nlc3NmdWwgcmVhZGluZyBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLAogKiAgIGlmIHRoZSBkZXZpY2UgaXMgbm90IGZvdW5kIG9yIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLgogKi8KQk9PTCBXSU5BUEkgR2V0RGVmYXVsdENvbW1Db25maWdBKAogICAgTFBDU1RSICAgICAgIGxwc3pOYW1lLCAvKiBbaW5dIFRoZSBhc2NpaSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDQywgICAgIC8qIFtvdXRdIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBMUERXT1JEICAgICAgbHBkd1NpemUpIC8qIFtpbi9vdXRdIEluaXRpYWxseSB0aGUgc2l6ZSBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGJ1ZmZlciwKCQkJICAgICAgYWZ0ZXJ3YXJkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgYnVmZmVyIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLiAqLwp7CglCT09MIHJldCA9IEZBTFNFOwoJVU5JQ09ERV9TVFJJTkcgbHBzek5hbWVXOwoKCVRSQUNFKCIoJXMsJXAsJWxkKVxuIixscHN6TmFtZSxscENDLCpscGR3U2l6ZSk7CglpZihscHN6TmFtZSkgUnRsQ3JlYXRlVW5pY29kZVN0cmluZ0Zyb21Bc2NpaXooJmxwc3pOYW1lVyxscHN6TmFtZSk7CgllbHNlIGxwc3pOYW1lVy5CdWZmZXIgPSBOVUxMOwoKCWlmKGxwc3pOYW1lVy5CdWZmZXIpIHJldCA9IEdldERlZmF1bHRDb21tQ29uZmlnVyhscHN6TmFtZVcuQnVmZmVyLGxwQ0MsbHBkd1NpemUpOwoKCVJ0bEZyZWVVbmljb2RlU3RyaW5nKCZscHN6TmFtZVcpOwoJcmV0dXJuIHJldDsKfQo=