LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJUGFyZW50IC0gYSBoZWxwZXIgaW50ZXJmYWNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KREVGSU5FX0dVSUQoSUlEX0lQYXJlbnQsIDB4YzIwZTRjODgsIDB4NzRlNywgMHg0OTQwLCAweGJhLCAweDlmLCAweDJlLCAweDMyLCAweDNmLCAweDlkLCAweGM5LCAweDgxKTsKdHlwZWRlZiBzdHJ1Y3QgSVBhcmVudCAqTFBQQVJFTlQsICpQUEFSRU5UOwoKI2RlZmluZSBJTlRFUkZBQ0UgSVBhcmVudApERUNMQVJFX0lOVEVSRkFDRV8oSVBhcmVudCxJVW5rbm93bikKewogICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KICAgIFNURE1FVEhPRF8oSFJFU1VMVCxRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmplY3QpIFBVUkU7CiAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKfTsKI3VuZGVmIElOVEVSRkFDRQoKI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpCi8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCiNkZWZpbmUgSVBhcmVudF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQojZGVmaW5lIElQYXJlbnRfQWRkUmVmKHApICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKI2RlZmluZSBJUGFyZW50X1JlbGVhc2UocCkgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQojZW5kaWYKCgovKiBUeXBkZWYgdGhlIGludGVyZmFjZXMgKi8KdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICBJRGlyZWN0M0REZXZpY2VJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICBJRGlyZWN0M0RMaWdodEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNETWF0ZXJpYWxJbXBsICAgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSVBhcmVudEltcGwgICAgICAgICAgICAgICAgSVBhcmVudEltcGw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXcgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBJRGlyZWN0RHJhd0ltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXc0KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Mik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0Q3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QpOwoKICAgIC8qIFNlZSBjb21tZW50IGluIElEaXJlY3REcmF3OjpBZGRSZWYgKi8KICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjcsIHJlZjQsIHJlZjIsIHJlZjEsIG51bUlmYWNlczsKCiAgICAvKiBXaW5lRDNEIGxpbmthZ2UgKi8KICAgIElXaW5lRDNEICAgICAgICAgICAgICAgICp3aW5lRDNEOwogICAgSVdpbmVEM0REZXZpY2UgICAgICAgICAgKndpbmVEM0REZXZpY2U7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqRGVwdGhTdGVuY2lsQnVmZmVyOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZDNkX2luaXRpYWxpemVkOwoKICAgIC8qIE1pc2MgZGRyYXcgZmllbGRzICovCiAgICBVSU5UICAgICAgICAgICAgICAgICAgICB0b3RhbF92aWRtZW07CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjdXJfc2NhbmxpbmU7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBmYWtlX3ZibGFuazsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkOwoKICAgIC8qIERpcmVjdERyYXcgdGhpbmdzLCB3aGljaCBhcmUgbm90IGhhbmRsZWQgYnkgV2luZUQzRCAqLwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVfbGV2ZWw7CgogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQ7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX2JwcDsKCiAgICBERENBUFMgICAgICAgICAgICAgICAgICBjYXBzOwoKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHN0eWxlOwogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgZXhTdHlsZTsKCiAgICAvKiBEM0QgdGhpbmdzICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqZDNkX3RhcmdldDsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGQzZF93aW5kb3c7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAqZDNkZGV2aWNlOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgZDNkdmVyc2lvbjsKCiAgICAvKiBWYXJpb3VzIEhXTkRzICovCiAgICBIV05EICAgICAgICAgICAgICAgICAgICBmb2N1c3dpbmRvdzsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGRldmljZXdpbmRvdzsKCiAgICAvKiBUaGUgc3VyZmFjZSB0eXBlIHRvIHJlcXVlc3QgKi8KICAgIFdJTkVEM0RTVVJGVFlQRSAgICAgICAgIEltcGxUeXBlOwoKICAgIC8qIFRoZSBzdXJmYWNlIGxpc3QgLSBjYW4ndCByZWxheSB0aGlzIHRvIFdpbmVEM0QKICAgICAqIGJlY2F1c2Ugb2YgSVBhcmVudAogICAgICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmYWNlX2xpc3Q7CgogICAgLyogT3VyIHByaXZhdGUgd2luZG93IGNsYXNzICovCiAgICBjaGFyIGNsYXNzbmFtZVszMl07CiAgICBXTkRDTEFTU0Egd25kX2NsYXNzOwoKICAgIC8qIEhlbHBlcnMgZm9yIHN1cmZhY2UgY3JlYXRpb24gKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleF9yb290OwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZGVwdGhzdGVuY2lsOwoKICAgIC8qIEZvciB0aGUgZGxsIHVubG9hZCBjbGVhbnVwIGNvZGUgKi8KICAgIElEaXJlY3REcmF3SW1wbCAqbmV4dDsKICAgIExPTkcgc3VyZmFjZXM7Cn07CgovKiBEZWNsYXJlIHRoZSBWVGFibGVzLiBUaGV5IGNhbiBiZSBmb3VuZCBkZHJhdy5jICovCmNvbnN0IElEaXJlY3REcmF3N1Z0YmwgSURpcmVjdERyYXc3X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3NFZ0YmwgSURpcmVjdERyYXc0X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3MlZ0YmwgSURpcmVjdERyYXcyX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3VnRibCAgSURpcmVjdERyYXcxX1Z0Ymw7CgovKiBIZWxwZXIgc3RydWN0dXJlcyAqLwp0eXBlZGVmIHN0cnVjdCBFbnVtRGlzcGxheU1vZGVzQ0JTCnsKICAgIHZvaWQgKmNvbnRleHQ7CiAgICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNhbGxiYWNrOwp9IEVudW1EaXNwbGF5TW9kZXNDQlM7Cgp0eXBlZGVmIHN0cnVjdCBFbnVtU3VyZmFjZXNDQlMKewogICAgdm9pZCAqY29udGV4dDsKICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2FsbGJhY2s7CiAgICBMUEREU1VSRkFDRURFU0MyIHBERFNEOwogICAgRFdPUkQgRmxhZ3M7Cn0gRW51bVN1cmZhY2VzQ0JTOwoKLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8Kdm9pZApERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTMiogcE91dCk7CnZvaWQKRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREREVWSUNFSURFTlRJRklFUiogcE91dCk7CnZvaWQKSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koSURpcmVjdERyYXdJbXBsICpUaGlzKTsKCkhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3SW1wbF9SZWNyZWF0ZVN1cmZhY2VzQ2FsbGJhY2soSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KTsKLyogVGhlIGNsZWFudXAgbGlzdCAqLwpleHRlcm4gSURpcmVjdERyYXdJbXBsICpkZHJhd19saXN0OwoKLyogVGhlIGRlZmF1bHQgc3VyZmFjZSB0eXBlICovCmV4dGVybiBXSU5FRDNEU1VSRlRZUEUgRGVmYXVsdFN1cmZhY2VUeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2U3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdHYW1tYUNvbnRyb2wpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZSk7CgogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgIHJlZjsKICAgIElVbmtub3duICAgICAgICAgICAgICAgICppZmFjZVRvUmVsZWFzZTsKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOwoKICAgIC8qIENvbm5lY3Rpb25zIHRvIG90aGVyIE9iamVjdHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNEU3VyZmFjZSAgICAgICAgICpXaW5lRDNEU3VyZmFjZTsKICAgIElXaW5lRDNEVGV4dHVyZSAgICAgICAgICp3aW5lRDNEVGV4dHVyZTsKCiAgICAvKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgYXR0YWNoaW5nIHN1cmZhY2VzIHRvIG90aGVyIHN1cmZhY2VzICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqbmV4dF9hdHRhY2hlZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpmaXJzdF9hdHRhY2hlZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpuZXh0X2NvbXBsZXg7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqZmlyc3RfY29tcGxleDsKCiAgICAvKiBTdXJmYWNlIGRlc2NyaXB0aW9uLCBmb3IgR2V0QXR0YWNoZWRTdXJmYWNlICovCiAgICBERFNVUkZBQ0VERVNDMiAgICAgICAgICBzdXJmYWNlX2Rlc2M7CgogICAgLyogTWlzYyB0aGluZ3MgKi8KICAgIERXT1JEICAgICAgICAgICAgICAgICAgIHVuaXF1ZW5lc3NfdmFsdWU7CiAgICBVSU5UICAgICAgICAgICAgICAgICAgICBtaXBtYXBfbGV2ZWw7CiAgICBXSU5FRDNEU1VSRlRZUEUgICAgICAgICBJbXBsVHlwZTsKCiAgICAvKiBGb3IgRDNERGV2aWNlIGNyZWF0aW9uICovCiAgICBCT09MICAgICAgICAgICAgICAgICAgICBpc1JlbmRlclRhcmdldDsKCiAgICAvKiBDbGlwcGVyIG9iamVjdHMgKi8KICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgICpjbGlwcGVyOwoKICAgIC8qIEZvciB0aGUgZGRyYXcgc3VyZmFjZSBsaXN0ICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpuZXh0OwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqcHJldjsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBIYW5kbGU7Cn07CgovKiBWVGFibGUgZGVjbGFyYXRpb24uIEl0J3MgbG9jYXRlZCBpbiBzdXJmYWNlLmMgLyBzdXJmYWNlX3RodW5rcy5jICovCmNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIElEaXJlY3REcmF3U3VyZmFjZTdfVnRibDsKY29uc3QgSURpcmVjdERyYXdTdXJmYWNlM1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlM19WdGJsOwpjb25zdCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbFZ0YmwgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfVnRibDsKY29uc3QgSURpcmVjdDNEVGV4dHVyZTJWdGJsIElEaXJlY3QzRFRleHR1cmUyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0Ymw7CgovKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgZm9yIGEgZ2l2ZW4gc3VyZmFjZSAqLwojZGVmaW5lIFBGR0VUX0JQUChwZikgKHBmLmR3RmxhZ3MmRERQRl9QQUxFVFRFSU5ERVhFRDg/MTooKHBmLmR3UkdCQml0Q291bnQrNykvOCkpCiNkZWZpbmUgR0VUX0JQUChkZXNjKSBQRkdFVF9CUFAoZGVzYy5kZHBmUGl4ZWxGb3JtYXQpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVBhcmVudCBJbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJUGFyZW50SW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElQYXJlbnQpOwogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgcmVmOwoKICAgIC8qIElQYXJlbnRJbXBsIGZpZWxkcyAqLwogICAgSVVua25vd24gICAgICAqY2hpbGQ7Cgp9OwoKY29uc3QgSVBhcmVudFZ0YmwgSVBhcmVudF9WdGJsOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZSBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgZW51bQp7CiAgICBERHJhd0hhbmRsZV9Vbmtub3duICAgICAgID0gMCwKICAgIEREcmF3SGFuZGxlX1RleHR1cmUgICAgICAgPSAxLAogICAgRERyYXdIYW5kbGVfTWF0ZXJpYWwgICAgICA9IDIsCiAgICBERHJhd0hhbmRsZV9NYXRyaXggICAgICAgID0gMwp9IEREcmF3SGFuZGxlVHlwZXM7CgpzdHJ1Y3QgSGFuZGxlRW50cnkKewogICAgdm9pZCAgICAqcHRyOwogICAgRERyYXdIYW5kbGVUeXBlcyAgICAgIHR5cGU7Cn07CgpzdHJ1Y3QgSURpcmVjdDNERGV2aWNlSW1wbAp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlKTsKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBPdGhlciBvYmplY3QgY29ubmVjdGlvbnMgKi8KICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgICp3aW5lRDNERGV2aWNlOwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgKmRkcmF3OwogICAgSVdpbmVEM0RJbmRleEJ1ZmZlciAgICAgKmluZGV4YnVmZmVyOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKnRhcmdldDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIE9mZlNjcmVlblRhcmdldDsKCiAgICAvKiBWaWV3cG9ydCBtYW5hZ2VtZW50ICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZpZXdwb3J0X2xpc3Q7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cnJlbnRfdmlld3BvcnQ7CiAgICBEM0RWSUVXUE9SVDcgYWN0aXZlX3ZpZXdwb3J0OwoKICAgIC8qIExpZ2h0IHN0YXRlICovCiAgICBEV09SRCBtYXRlcmlhbDsKCiAgICAvKiBSZW5kZXJpbmcgZnVuY3Rpb25zIHRvIHdyYXAgRDNEKDEtMykgdG8gRDNENyAqLwogICAgRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVfdHlwZTsKICAgIERXT1JEIHZlcnRleF90eXBlOwogICAgRFdPUkQgcmVuZGVyX2ZsYWdzOwogICAgRFdPUkQgbmJfdmVydGljZXM7CiAgICBMUEJZVEUgdmVydGV4X2J1ZmZlcjsKICAgIERXT1JEIHZlcnRleF9zaXplOwogICAgRFdPUkQgYnVmZmVyX3NpemU7CgogICAgLyogSGFuZGxlIG1hbmFnZW1lbnQgKi8KICAgIHN0cnVjdCBIYW5kbGVFbnRyeSAgICAgICpIYW5kbGVzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgIG51bUhhbmRsZXM7Cn07CgovKiBWdGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMgKi8KY29uc3QgSURpcmVjdDNERGV2aWNlN1Z0YmwgSURpcmVjdDNERGV2aWNlN19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZTJWdGJsIElEaXJlY3QzRERldmljZTJfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlVnRibCAgSURpcmVjdDNERGV2aWNlMV9WdGJsOwoKLyogVGhlIElJRCAqLwpjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfV2luZUQzRDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8KSFJFU1VMVCBJRGlyZWN0M0RJbXBsX0dldENhcHMoSVdpbmVEM0QgKldpbmVEM0QsIEQzRERFVklDRURFU0MgKkRlc2MxMjMsIEQzRERFVklDRURFU0M3ICpEZXNjNyk7CkRXT1JEIElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpOwoKLyogU3RydWN0dXJlcyAqLwpzdHJ1Y3QgRW51bVRleHR1cmVGb3JtYXRzQ0JTCnsKICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgY2J2MjsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGNidjc7CiAgICB2b2lkICpDb250ZXh0Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBObyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgYXMgdGhpcyBpcyBvbmx5IGFub3RoZXIgaW50ZXJmYWNlIHRvIERpcmVjdERyYXcgKi8KCi8qIHRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZ0YmwgIElEaXJlY3QzRDFfVnRibDsKY29uc3QgSURpcmVjdDNEMlZ0YmwgSURpcmVjdDNEMl9WdGJsOwpjb25zdCBJRGlyZWN0M0QzVnRibCBJRGlyZWN0M0QzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibDsKCi8qIFN0cnVjdHVyZSBmb3IgRW51bVpCdWZmZXJGb3JtYXRzICovCnN0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhCnsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrOwogICAgdm9pZCAqQ29udGV4dDsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0NsaXBwZXIpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdERyYXdDbGlwcGVyIGZpZWxkcyAqLwogICAgSFdORCBoV25kOwoKICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXdfb3duZXI7CiAgICBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbCogcHJldl9kZHJhdzsKICAgIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBuZXh0X2RkcmF3Owp9OwoKY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1BhbGV0dGUgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1BhbGV0dGUpOwogICAgTE9ORyByZWY7CgogICAgLyogV2luZUQzRCB1cGxpbmsgKi8KICAgIElXaW5lRDNEUGFsZXR0ZSAgICAgICAgICAgKndpbmVEM0RQYWxldHRlOwoKICAgIC8qIElEaXJlY3REcmF3UGFsZXR0ZSBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3X293bmVyOwogICAgSVVua25vd24gICAgICAgICAgICAgICAgICAqaWZhY2VUb1JlbGVhc2U7Cn07CmNvbnN0IElEaXJlY3REcmF3UGFsZXR0ZVZ0YmwgSURpcmVjdERyYXdQYWxldHRlX1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERpcmVjdERyYXcgQ2xhc3NGYWN0b3J5IGltcGxlbWVudGF0aW9uIC0gaW5jb21wbGV0ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJQ2xhc3NGYWN0b3J5KTsKCiAgICBMT05HIHJlZjsKICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcE9iaik7Cn0gSUNsYXNzRmFjdG9yeUltcGw7CgovKiBIZWxwZXIgc3RydWN0dXJlcyAqLwpzdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8KewogICAgY29uc3QgQ0xTSUQgKmNsc2lkOwogICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwT2JqKTsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNETGlnaHRJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRExpZ2h0KTsKICAgIExPTkcgcmVmOwoKICAgIC8qIElEaXJlY3QzRExpZ2h0IGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXc7CgogICAgLyogSWYgdGhpcyBsaWdodCBpcyBhY3RpdmUgZm9yIG9uZSB2aWV3cG9ydCwgcHV0IHRoZSB2aWV3cG9ydCBoZXJlICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgICAgICphY3RpdmVfdmlld3BvcnQ7CgogICAgRDNETElHSFQyIGxpZ2h0OwogICAgRDNETElHSFQ3IGxpZ2h0NzsKCiAgICBEV09SRCBkd0xpZ2h0SW5kZXg7CgogICAgLyogQ2hhaW5lZCBsaXN0IHVzZWQgZm9yIGFkZGluZyAvIHJlbW92aW5nIGZyb20gdmlld3BvcnRzICovCiAgICBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICpuZXh0OwoKICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCphY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7CiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqZGVzYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKnVwZGF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7Cn07CgovKiBWdGFibGUgKi8KY29uc3QgSURpcmVjdDNETGlnaHRWdGJsIElEaXJlY3QzRExpZ2h0X1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgbGlnaHRfdXBkYXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CnZvaWQgbGlnaHRfYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKdm9pZCBsaWdodF9kZXNhY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbCk7CiAgICBMT05HICByZWY7CgogICAgLyogSURpcmVjdDNETWF0ZXJpYWwyIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAgICAgKmRkcmF3OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgICAgICAgKmFjdGl2ZV9kZXZpY2U7CgogICAgRDNETUFURVJJQUwgbWF0OwogICAgRFdPUkQgSGFuZGxlOwoKICAgIHZvaWQgKCphY3RpdmF0ZSkoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiB0aGlzKTsKfTsKCi8qIFZUYWJsZXMgaW4gdmFyaW91cyB2ZXJzaW9ucyAqLwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbFZ0YmwgSURpcmVjdDNETWF0ZXJpYWxfVnRibDsKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwyVnRibCBJRGlyZWN0M0RNYXRlcmlhbDJfVnRibDsKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwzVnRibCBJRGlyZWN0M0RNYXRlcmlhbDNfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCBtYXRlcmlhbF9hY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0IC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RWaWV3cG9ydEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmlld3BvcnQzKTsKICAgIExPTkcgcmVmOwoKICAgIC8qIElEaXJlY3QzRFZpZXdwb3J0IGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXc7CgogICAgLyogSWYgdGhpcyB2aWV3cG9ydCBpcyBhY3RpdmUgZm9yIG9uZSBkZXZpY2UsIHB1dCB0aGUgZGV2aWNlIGhlcmUgKi8KICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICAgKmFjdGl2ZV9kZXZpY2U7CgogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICBudW1fbGlnaHRzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICBtYXBfbGlnaHRzOwoKICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgdXNlX3ZwMjsKCiAgICB1bmlvbgogICAgewogICAgICAgIEQzRFZJRVdQT1JUIHZwMTsKICAgICAgICBEM0RWSUVXUE9SVDIgdnAyOwogICAgfSB2aWV3cG9ydHM7CgogICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFjdGl2YXRlKShJRGlyZWN0M0RWaWV3cG9ydEltcGwqKTsKCiAgICAvKiBGaWVsZCB1c2VkIHRvIGNoYWluIHZpZXdwb3J0cyB0b2dldGhlciAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAqbmV4dDsKCiAgICAvKiBMaWdodHMgbGlzdCAqLwogICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbGlnaHRzOwoKICAgIC8qIEJhY2tncm91bmQgbWF0ZXJpYWwgKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAgICAgKmJhY2tncm91bmQ7Cn07CgovKiBWdGFibGUgKi8KY29uc3QgSURpcmVjdDNEVmlld3BvcnQzVnRibCBJRGlyZWN0M0RWaWV3cG9ydDNfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCB2aWV3cG9ydF9hY3RpdmF0ZShJRGlyZWN0M0RWaWV3cG9ydEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsCnsKICAgIC8qIElVbmtub3duICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKICAgIExPTkcgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgKmRkcmF3OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgKmQzZGRldjsKCiAgICBEM0RFWEVDVVRFQlVGRkVSREVTQyBkZXNjOwogICAgRDNERVhFQ1VURURBVEEgICAgICAgZGF0YTsKCiAgICAvKiBUaGlzIGJ1ZmZlciB3aWxsIHN0b3JlIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0aWNlcyAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgKnZlcnRleF9kYXRhOwogICAgV09SRCAgICAgICAgICAgICAgICAgKmluZGljZXM7CiAgICBpbnQgICAgICAgICAgICAgICAgICBuYl9pbmRpY2VzOwoKICAgIC8qIFRoaXMgZmxhZ3MgaXMgc2V0IHRvIFRSVUUgaWYgd2UgYWxsb2NhdGVkIG91cnNlbHZlcyB0aGUKICAgICAqIGRhdGEgYnVmZmVyCiAgICAgKi8KICAgIEJPT0wgICAgICAgICAgICAgICAgIG5lZWRfZnJlZTsKfTsKCi8qIFRoZSBWVGFibGUgKi8KY29uc3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlclZ0YmwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcl9WdGJsOwoKLyogVGhlIGV4ZWN1dGUgZnVuY3Rpb24gKi8Kdm9pZApJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsICpUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZUltcGwgKkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKlZpZXdwb3J0SW1wbCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwKewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyKTsKICAgIExPTkcgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKioqIFdpbmVEM0QgbGluayAqKiovCiAgICBJV2luZUQzRFZlcnRleEJ1ZmZlciAqd2luZUQzRFZlcnRleEJ1ZmZlcjsKCiAgICAvKioqIFN0b3JhZ2UgZm9yIEQzRDcgc3BlY2lmaWMgdGhpbmdzICoqKi8KICAgIERXT1JEICAgICAgICAgICAgICAgIENhcHM7Cn07CgovKiBUaGUgVnRhYmxlcyAqLwpjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3VnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0Ymw7CmNvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlclZ0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEhlbHBlciBmdW5jdGlvbnMgZnJvbSB1dGlscy5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgR0VUX1RFWENPVU5UX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSkgXAogICAgKCgoZDNkdnRWZXJ0ZXhUeXBlKSAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCgojZGVmaW5lIEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSwgdGV4X251bSkgXAogICAgKCgoKChkM2R2dFZlcnRleFR5cGUpID4+ICgxNiArICgyICogKHRleF9udW0pKSkpICsgMSkgJiAweDAzKSArIDEpCgp2b2lkIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQsIFdJTkVEM0RGT1JNQVQgV2luZUQzREZvcm1hdCk7CldJTkVEM0RGT1JNQVQgUGl4ZWxGb3JtYXRfREQyV2luZUQzRChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0KTsKdm9pZCBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhjb25zdCBERFNVUkZBQ0VERVNDMiAqbHBkZHNkKTsKdm9pZCBERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKlBpeGVsRm9ybWF0KTsKdm9pZCBkdW1wX0QzRE1BVFJJWChEM0RNQVRSSVggKm1hdCk7CnZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpOwpEV09SRCBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKTsKdm9pZCBERFJBV19kdW1wX0REU0NBUFMyKGNvbnN0IEREU0NBUFMyICppbik7CnZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCk7CgovKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgaGVyZSBhcyBsb25nIHRoZSBwcm9jZXNzdmVydGljZXMgZnVuY3Rpb25hbGl0eSBvZgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGlzbid0IGluIFdpbmVEM0QgKi8Kdm9pZCBtdWx0aXBseV9tYXRyaXgoTFBEM0RNQVRSSVggZGVzdCwgTFBEM0RNQVRSSVggc3JjMSwgTFBEM0RNQVRSSVggc3JjMik7CgovKiBVc2VkIGZvciBnZW5lcmljIGR1bXBpbmcgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKfSBmbGFnX2luZm87CgojZGVmaW5lIEZFKHgpIHsgeCwgI3ggfQoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKICAgIHZvaWQgKCpmdW5jKShjb25zdCB2b2lkICopOwogICAgcHRyZGlmZl90IG9mZnNldDsKfSBtZW1iZXJfaW5mbzsKCi8qIFN0cnVjdHVyZSBjb3B5ICovCiNkZWZpbmUgRERSQVdfZHVtcF9mbGFncyhmbGFncyxuYW1lcyxudW1fbmFtZXMpIEREUkFXX2R1bXBfZmxhZ3NfKGZsYWdzLCBuYW1lcywgbnVtX25hbWVzLCAxKQojZGVmaW5lIE1FKHgsZixlKSB7IHgsICN4LCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSkoZiksIG9mZnNldG9mKFNUUlVDVCwgZSkgfQoKI2RlZmluZSBERF9TVFJVQ1RfQ09QWV9CWVNJWkUodG8sZnJvbSkgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19zaXplID0gKHRvKS0+ZHdTaXplOyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fY29weXNpemUgPSBfX3NpemU7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX3Jlc2V0c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYXNzZXJ0KHRvICE9IGZyb20pOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChfX3Jlc2V0c2l6ZSA+IHNpemVvZigqdG8pKSAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19yZXNldHNpemUgPSBzaXplb2YoKnRvKTsgICAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtc2V0KHRvLDAsX19yZXNldHNpemUpOyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICgoZnJvbSktPmR3U2l6ZSA8IF9fc2l6ZSkgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19jb3B5c2l6ZSA9IChmcm9tKS0+ZHdTaXplOyAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtY3B5KHRvLGZyb20sX19jb3B5c2l6ZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh0byktPmR3U2l6ZSA9IF9fc2l6ZTsvKnJlc3RvcmUgc2l6ZSovICBcCiAgICAgICAgfSB3aGlsZSAoMCkKCgojZW5kaWYKCkhSRVNVTFQgaHJfZGRyYXdfZnJvbV93aW5lZDNkKEhSRVNVTFQgaHIpOwo=