LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIndpbmUvbGlzdC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgLSBhIGhlbHBlciBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERUZJTkVfR1VJRChJSURfSVBhcmVudCwgMHhjMjBlNGM4OCwgMHg3NGU3LCAweDQ5NDAsIDB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODEpOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50ICpMUFBBUkVOVCwgKlBQQVJFTlQ7CgojZGVmaW5lIElOVEVSRkFDRSBJUGFyZW50CkRFQ0xBUkVfSU5URVJGQUNFXyhJUGFyZW50LElVbmtub3duKQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgU1RETUVUSE9EXyhIUkVTVUxULFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCkgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOwogICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOwp9OwojdW5kZWYgSU5URVJGQUNFCgojaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkKLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KI2RlZmluZSBJUGFyZW50X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiNkZWZpbmUgSVBhcmVudF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQojZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiNlbmRpZgoKCi8qIFR5cGRlZiB0aGUgaW50ZXJmYWNlcyAqLwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgIElEaXJlY3QzRExpZ2h0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IElEaXJlY3REcmF3SW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Nyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzQpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRCk7CgogICAgLyogU2VlIGNvbW1lbnQgaW4gSURpcmVjdERyYXc6OkFkZFJlZiAqLwogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgcmVmNywgcmVmNCwgcmVmMiwgcmVmMSwgbnVtSWZhY2VzOwoKICAgIC8qIFdpbmVEM0QgbGlua2FnZSAqLwogICAgSVdpbmVEM0QgICAgICAgICAgICAgICAgKndpbmVEM0Q7CiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpEZXB0aFN0ZW5jaWxCdWZmZXI7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBkM2RfaW5pdGlhbGl6ZWQ7CgogICAgLyogTWlzYyBkZHJhdyBmaWVsZHMgKi8KICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHRvdGFsX3ZpZG1lbTsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGN1cl9zY2FubGluZTsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGZha2VfdmJsYW5rOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7CgogICAgLyogRGlyZWN0RHJhdyB0aGluZ3MsIHdoaWNoIGFyZSBub3QgaGFuZGxlZCBieSBXaW5lRDNEICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9sZXZlbDsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodDsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIG9yaWdfYnBwOwoKICAgIEREQ0FQUyAgICAgICAgICAgICAgICAgIGNhcHM7CgogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgc3R5bGU7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICBleFN0eWxlOwoKICAgIC8qIEQzRCB0aGluZ3MgKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpkM2RfdGFyZ2V0OwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZDNkX3dpbmRvdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICpkM2RkZXZpY2U7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkM2R2ZXJzaW9uOwoKICAgIC8qIFZhcmlvdXMgSFdORHMgKi8KICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGZvY3Vzd2luZG93OwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZGV2aWNld2luZG93OwoKICAgIC8qIFRoZSBzdXJmYWNlIHR5cGUgdG8gcmVxdWVzdCAqLwogICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CgoKICAgIC8qIE91ciBwcml2YXRlIHdpbmRvdyBjbGFzcyAqLwogICAgY2hhciBjbGFzc25hbWVbMzJdOwogICAgV05EQ0xBU1NBIHduZF9jbGFzczsKCiAgICAvKiBIZWxwZXJzIGZvciBzdXJmYWNlIGNyZWF0aW9uICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfcm9vdDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGRlcHRoc3RlbmNpbDsKCiAgICAvKiBGb3IgdGhlIGRsbCB1bmxvYWQgY2xlYW51cCBjb2RlICovCiAgICBzdHJ1Y3QgbGlzdCBkZHJhd19saXN0X2VudHJ5OwogICAgLyogVGhlIHN1cmZhY2UgbGlzdCAtIGNhbid0IHJlbGF5IHRoaXMgdG8gV2luZUQzRAogICAgICogYmVjYXVzZSBvZiBJUGFyZW50CiAgICAgKi8KICAgIHN0cnVjdCBsaXN0IHN1cmZhY2VfbGlzdDsKICAgIExPTkcgc3VyZmFjZXM7Cn07CgovKiBEZWNsYXJlIHRoZSBWVGFibGVzLiBUaGV5IGNhbiBiZSBmb3VuZCBkZHJhdy5jICovCmNvbnN0IElEaXJlY3REcmF3N1Z0YmwgSURpcmVjdERyYXc3X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3NFZ0YmwgSURpcmVjdERyYXc0X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3MlZ0YmwgSURpcmVjdERyYXcyX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3VnRibCAgSURpcmVjdERyYXcxX1Z0Ymw7CgovKiBIZWxwZXIgc3RydWN0dXJlcyAqLwp0eXBlZGVmIHN0cnVjdCBFbnVtRGlzcGxheU1vZGVzQ0JTCnsKICAgIHZvaWQgKmNvbnRleHQ7CiAgICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNhbGxiYWNrOwp9IEVudW1EaXNwbGF5TW9kZXNDQlM7Cgp0eXBlZGVmIHN0cnVjdCBFbnVtU3VyZmFjZXNDQlMKewogICAgdm9pZCAqY29udGV4dDsKICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2FsbGJhY2s7CiAgICBMUEREU1VSRkFDRURFU0MyIHBERFNEOwogICAgRFdPUkQgRmxhZ3M7Cn0gRW51bVN1cmZhY2VzQ0JTOwoKLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8Kdm9pZApERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTMiogcE91dCk7CnZvaWQKRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREREVWSUNFSURFTlRJRklFUiogcE91dCk7CnZvaWQKSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koSURpcmVjdERyYXdJbXBsICpUaGlzKTsKCkhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3SW1wbF9SZWNyZWF0ZVN1cmZhY2VzQ2FsbGJhY2soSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KTsKdm9pZApyZW1vdmVfZGRyYXdfb2JqZWN0KElEaXJlY3REcmF3SW1wbCAqZGRyYXcpOwoKLyogVGhlIGRlZmF1bHQgc3VyZmFjZSB0eXBlICovCmV4dGVybiBXSU5FRDNEU1VSRlRZUEUgRGVmYXVsdFN1cmZhY2VUeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2U3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdHYW1tYUNvbnRyb2wpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZSk7CgogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgIHJlZjsKICAgIElVbmtub3duICAgICAgICAgICAgICAgICppZmFjZVRvUmVsZWFzZTsKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOwoKICAgIC8qIENvbm5lY3Rpb25zIHRvIG90aGVyIE9iamVjdHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNEU3VyZmFjZSAgICAgICAgICpXaW5lRDNEU3VyZmFjZTsKICAgIElXaW5lRDNEVGV4dHVyZSAgICAgICAgICp3aW5lRDNEVGV4dHVyZTsKCiAgICAvKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgYXR0YWNoaW5nIHN1cmZhY2VzIHRvIG90aGVyIHN1cmZhY2VzICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqbmV4dF9hdHRhY2hlZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpmaXJzdF9hdHRhY2hlZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpuZXh0X2NvbXBsZXg7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqZmlyc3RfY29tcGxleDsKCiAgICAvKiBTdXJmYWNlIGRlc2NyaXB0aW9uLCBmb3IgR2V0QXR0YWNoZWRTdXJmYWNlICovCiAgICBERFNVUkZBQ0VERVNDMiAgICAgICAgICBzdXJmYWNlX2Rlc2M7CgogICAgLyogTWlzYyB0aGluZ3MgKi8KICAgIERXT1JEICAgICAgICAgICAgICAgICAgIHVuaXF1ZW5lc3NfdmFsdWU7CiAgICBVSU5UICAgICAgICAgICAgICAgICAgICBtaXBtYXBfbGV2ZWw7CiAgICBXSU5FRDNEU1VSRlRZUEUgICAgICAgICBJbXBsVHlwZTsKCiAgICAvKiBGb3IgRDNERGV2aWNlIGNyZWF0aW9uICovCiAgICBCT09MICAgICAgICAgICAgICAgICAgICBpc1JlbmRlclRhcmdldDsKCiAgICAvKiBDbGlwcGVyIG9iamVjdHMgKi8KICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgICpjbGlwcGVyOwoKICAgIC8qIEZvciB0aGUgZGRyYXcgc3VyZmFjZSBsaXN0ICovCiAgICBzdHJ1Y3QgbGlzdCAgICAgICAgICAgICBzdXJmYWNlX2xpc3RfZW50cnk7CgogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgSGFuZGxlOwp9OwoKLyogVlRhYmxlIGRlY2xhcmF0aW9uLiBJdCdzIGxvY2F0ZWQgaW4gc3VyZmFjZS5jIC8gc3VyZmFjZV90aHVua3MuYyAqLwpjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2U3VnRibCBJRGlyZWN0RHJhd1N1cmZhY2U3X1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTNWdGJsIElEaXJlY3REcmF3U3VyZmFjZTNfVnRibDsKY29uc3QgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xWdGJsIElEaXJlY3REcmF3R2FtbWFDb250cm9sX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRFRleHR1cmUyVnRibCBJRGlyZWN0M0RUZXh0dXJlMl9WdGJsOwpjb25zdCBJRGlyZWN0M0RUZXh0dXJlVnRibCBJRGlyZWN0M0RUZXh0dXJlMV9WdGJsOwoKLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciBhIGdpdmVuIHN1cmZhY2UgKi8KI2RlZmluZSBQRkdFVF9CUFAocGYpIChwZi5kd0ZsYWdzJkREUEZfUEFMRVRURUlOREVYRUQ4PzE6KChwZi5kd1JHQkJpdENvdW50KzcpLzgpKQojZGVmaW5lIEdFVF9CUFAoZGVzYykgUEZHRVRfQlBQKGRlc2MuZGRwZlBpeGVsRm9ybWF0KQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgSW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSVBhcmVudEltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJUGFyZW50KTsKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBJUGFyZW50SW1wbCBmaWVsZHMgKi8KICAgIElVbmtub3duICAgICAgKmNoaWxkOwoKfTsKCmNvbnN0IElQYXJlbnRWdGJsIElQYXJlbnRfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIGVudW0KewogICAgRERyYXdIYW5kbGVfVW5rbm93biAgICAgICA9IDAsCiAgICBERHJhd0hhbmRsZV9UZXh0dXJlICAgICAgID0gMSwKICAgIEREcmF3SGFuZGxlX01hdGVyaWFsICAgICAgPSAyLAogICAgRERyYXdIYW5kbGVfTWF0cml4ICAgICAgICA9IDMsCiAgICBERHJhd0hhbmRsZV9TdGF0ZUJsb2NrICAgID0gNAp9IEREcmF3SGFuZGxlVHlwZXM7CgpzdHJ1Y3QgSGFuZGxlRW50cnkKewogICAgdm9pZCAgICAqcHRyOwogICAgRERyYXdIYW5kbGVUeXBlcyAgICAgIHR5cGU7Cn07CgpzdHJ1Y3QgSURpcmVjdDNERGV2aWNlSW1wbAp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlKTsKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBPdGhlciBvYmplY3QgY29ubmVjdGlvbnMgKi8KICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgICp3aW5lRDNERGV2aWNlOwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgKmRkcmF3OwogICAgSVdpbmVEM0RJbmRleEJ1ZmZlciAgICAgKmluZGV4YnVmZmVyOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKnRhcmdldDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIE9mZlNjcmVlblRhcmdldDsKCiAgICAvKiBWaWV3cG9ydCBtYW5hZ2VtZW50ICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZpZXdwb3J0X2xpc3Q7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cnJlbnRfdmlld3BvcnQ7CiAgICBEM0RWSUVXUE9SVDcgYWN0aXZlX3ZpZXdwb3J0OwoKICAgIC8qIExpZ2h0IHN0YXRlICovCiAgICBEV09SRCBtYXRlcmlhbDsKCiAgICAvKiBSZW5kZXJpbmcgZnVuY3Rpb25zIHRvIHdyYXAgRDNEKDEtMykgdG8gRDNENyAqLwogICAgRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVfdHlwZTsKICAgIERXT1JEIHZlcnRleF90eXBlOwogICAgRFdPUkQgcmVuZGVyX2ZsYWdzOwogICAgRFdPUkQgbmJfdmVydGljZXM7CiAgICBMUEJZVEUgdmVydGV4X2J1ZmZlcjsKICAgIERXT1JEIHZlcnRleF9zaXplOwogICAgRFdPUkQgYnVmZmVyX3NpemU7CgogICAgLyogSGFuZGxlIG1hbmFnZW1lbnQgKi8KICAgIHN0cnVjdCBIYW5kbGVFbnRyeSAgICAgICpIYW5kbGVzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgIG51bUhhbmRsZXM7Cn07CgovKiBWdGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMgKi8KY29uc3QgSURpcmVjdDNERGV2aWNlN1Z0YmwgSURpcmVjdDNERGV2aWNlN19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZTJWdGJsIElEaXJlY3QzRERldmljZTJfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlVnRibCAgSURpcmVjdDNERGV2aWNlMV9WdGJsOwoKLyogVGhlIElJRCAqLwpjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfV2luZUQzRDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8KSFJFU1VMVCBJRGlyZWN0M0RJbXBsX0dldENhcHMoSVdpbmVEM0QgKldpbmVEM0QsIEQzRERFVklDRURFU0MgKkRlc2MxMjMsIEQzRERFVklDRURFU0M3ICpEZXNjNyk7CkRXT1JEIElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpOwoKLyogU3RydWN0dXJlcyAqLwpzdHJ1Y3QgRW51bVRleHR1cmVGb3JtYXRzQ0JTCnsKICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgY2J2MjsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGNidjc7CiAgICB2b2lkICpDb250ZXh0Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBObyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgYXMgdGhpcyBpcyBvbmx5IGFub3RoZXIgaW50ZXJmYWNlIHRvIERpcmVjdERyYXcgKi8KCi8qIHRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZ0YmwgIElEaXJlY3QzRDFfVnRibDsKY29uc3QgSURpcmVjdDNEMlZ0YmwgSURpcmVjdDNEMl9WdGJsOwpjb25zdCBJRGlyZWN0M0QzVnRibCBJRGlyZWN0M0QzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibDsKCi8qIFN0cnVjdHVyZSBmb3IgRW51bVpCdWZmZXJGb3JtYXRzICovCnN0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhCnsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrOwogICAgdm9pZCAqQ29udGV4dDsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0NsaXBwZXIpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdERyYXdDbGlwcGVyIGZpZWxkcyAqLwogICAgSFdORCBoV25kOwoKICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXdfb3duZXI7CiAgICBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbCogcHJldl9kZHJhdzsKICAgIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBuZXh0X2RkcmF3Owp9OwoKY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1BhbGV0dGUgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1BhbGV0dGUpOwogICAgTE9ORyByZWY7CgogICAgLyogV2luZUQzRCB1cGxpbmsgKi8KICAgIElXaW5lRDNEUGFsZXR0ZSAgICAgICAgICAgKndpbmVEM0RQYWxldHRlOwoKICAgIC8qIElEaXJlY3REcmF3UGFsZXR0ZSBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3X293bmVyOwogICAgSVVua25vd24gICAgICAgICAgICAgICAgICAqaWZhY2VUb1JlbGVhc2U7Cn07CmNvbnN0IElEaXJlY3REcmF3UGFsZXR0ZVZ0YmwgSURpcmVjdERyYXdQYWxldHRlX1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERpcmVjdERyYXcgQ2xhc3NGYWN0b3J5IGltcGxlbWVudGF0aW9uIC0gaW5jb21wbGV0ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJQ2xhc3NGYWN0b3J5KTsKCiAgICBMT05HIHJlZjsKICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcE9iaik7Cn0gSUNsYXNzRmFjdG9yeUltcGw7CgovKiBIZWxwZXIgc3RydWN0dXJlcyAqLwpzdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8KewogICAgY29uc3QgQ0xTSUQgKmNsc2lkOwogICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwT2JqKTsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNETGlnaHRJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRExpZ2h0KTsKICAgIExPTkcgcmVmOwoKICAgIC8qIElEaXJlY3QzRExpZ2h0IGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXc7CgogICAgLyogSWYgdGhpcyBsaWdodCBpcyBhY3RpdmUgZm9yIG9uZSB2aWV3cG9ydCwgcHV0IHRoZSB2aWV3cG9ydCBoZXJlICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgICAgICphY3RpdmVfdmlld3BvcnQ7CgogICAgRDNETElHSFQyIGxpZ2h0OwogICAgRDNETElHSFQ3IGxpZ2h0NzsKCiAgICBEV09SRCBkd0xpZ2h0SW5kZXg7CgogICAgLyogQ2hhaW5lZCBsaXN0IHVzZWQgZm9yIGFkZGluZyAvIHJlbW92aW5nIGZyb20gdmlld3BvcnRzICovCiAgICBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICpuZXh0OwoKICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCphY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7CiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqZGVzYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKnVwZGF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7Cn07CgovKiBWdGFibGUgKi8KY29uc3QgSURpcmVjdDNETGlnaHRWdGJsIElEaXJlY3QzRExpZ2h0X1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgbGlnaHRfdXBkYXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CnZvaWQgbGlnaHRfYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKdm9pZCBsaWdodF9kZXNhY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbCk7CiAgICBMT05HICByZWY7CgogICAgLyogSURpcmVjdDNETWF0ZXJpYWwyIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAgICAgKmRkcmF3OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgICAgICAgKmFjdGl2ZV9kZXZpY2U7CgogICAgRDNETUFURVJJQUwgbWF0OwogICAgRFdPUkQgSGFuZGxlOwoKICAgIHZvaWQgKCphY3RpdmF0ZSkoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiB0aGlzKTsKfTsKCi8qIFZUYWJsZXMgaW4gdmFyaW91cyB2ZXJzaW9ucyAqLwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbFZ0YmwgSURpcmVjdDNETWF0ZXJpYWxfVnRibDsKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwyVnRibCBJRGlyZWN0M0RNYXRlcmlhbDJfVnRibDsKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwzVnRibCBJRGlyZWN0M0RNYXRlcmlhbDNfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCBtYXRlcmlhbF9hY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0IC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RWaWV3cG9ydEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmlld3BvcnQzKTsKICAgIExPTkcgcmVmOwoKICAgIC8qIElEaXJlY3QzRFZpZXdwb3J0IGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXc7CgogICAgLyogSWYgdGhpcyB2aWV3cG9ydCBpcyBhY3RpdmUgZm9yIG9uZSBkZXZpY2UsIHB1dCB0aGUgZGV2aWNlIGhlcmUgKi8KICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICAgKmFjdGl2ZV9kZXZpY2U7CgogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICBudW1fbGlnaHRzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICBtYXBfbGlnaHRzOwoKICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgdXNlX3ZwMjsKCiAgICB1bmlvbgogICAgewogICAgICAgIEQzRFZJRVdQT1JUIHZwMTsKICAgICAgICBEM0RWSUVXUE9SVDIgdnAyOwogICAgfSB2aWV3cG9ydHM7CgogICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFjdGl2YXRlKShJRGlyZWN0M0RWaWV3cG9ydEltcGwqKTsKCiAgICAvKiBGaWVsZCB1c2VkIHRvIGNoYWluIHZpZXdwb3J0cyB0b2dldGhlciAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAqbmV4dDsKCiAgICAvKiBMaWdodHMgbGlzdCAqLwogICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbGlnaHRzOwoKICAgIC8qIEJhY2tncm91bmQgbWF0ZXJpYWwgKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAgICAgKmJhY2tncm91bmQ7Cn07CgovKiBWdGFibGUgKi8KY29uc3QgSURpcmVjdDNEVmlld3BvcnQzVnRibCBJRGlyZWN0M0RWaWV3cG9ydDNfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCB2aWV3cG9ydF9hY3RpdmF0ZShJRGlyZWN0M0RWaWV3cG9ydEltcGwqIFRoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsCnsKICAgIC8qIElVbmtub3duICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKICAgIExPTkcgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgKmRkcmF3OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgKmQzZGRldjsKCiAgICBEM0RFWEVDVVRFQlVGRkVSREVTQyBkZXNjOwogICAgRDNERVhFQ1VURURBVEEgICAgICAgZGF0YTsKCiAgICAvKiBUaGlzIGJ1ZmZlciB3aWxsIHN0b3JlIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0aWNlcyAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgKnZlcnRleF9kYXRhOwogICAgV09SRCAgICAgICAgICAgICAgICAgKmluZGljZXM7CiAgICBpbnQgICAgICAgICAgICAgICAgICBuYl9pbmRpY2VzOwoKICAgIC8qIFRoaXMgZmxhZ3MgaXMgc2V0IHRvIFRSVUUgaWYgd2UgYWxsb2NhdGVkIG91cnNlbHZlcyB0aGUKICAgICAqIGRhdGEgYnVmZmVyCiAgICAgKi8KICAgIEJPT0wgICAgICAgICAgICAgICAgIG5lZWRfZnJlZTsKfTsKCi8qIFRoZSBWVGFibGUgKi8KY29uc3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlclZ0YmwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcl9WdGJsOwoKLyogVGhlIGV4ZWN1dGUgZnVuY3Rpb24gKi8Kdm9pZApJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsICpUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZUltcGwgKkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKlZpZXdwb3J0SW1wbCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwKewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyKTsKICAgIExPTkcgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKioqIFdpbmVEM0QgbGluayAqKiovCiAgICBJV2luZUQzRFZlcnRleEJ1ZmZlciAqd2luZUQzRFZlcnRleEJ1ZmZlcjsKCiAgICAvKioqIFN0b3JhZ2UgZm9yIEQzRDcgc3BlY2lmaWMgdGhpbmdzICoqKi8KICAgIERXT1JEICAgICAgICAgICAgICAgIENhcHM7Cn07CgovKiBUaGUgVnRhYmxlcyAqLwpjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3VnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0Ymw7CmNvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlclZ0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEhlbHBlciBmdW5jdGlvbnMgZnJvbSB1dGlscy5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgR0VUX1RFWENPVU5UX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSkgXAogICAgKCgoZDNkdnRWZXJ0ZXhUeXBlKSAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCgojZGVmaW5lIEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSwgdGV4X251bSkgXAogICAgKCgoKChkM2R2dFZlcnRleFR5cGUpID4+ICgxNiArICgyICogKHRleF9udW0pKSkpICsgMSkgJiAweDAzKSArIDEpCgp2b2lkIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQsIFdJTkVEM0RGT1JNQVQgV2luZUQzREZvcm1hdCk7CldJTkVEM0RGT1JNQVQgUGl4ZWxGb3JtYXRfREQyV2luZUQzRChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0KTsKdm9pZCBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhjb25zdCBERFNVUkZBQ0VERVNDMiAqbHBkZHNkKTsKdm9pZCBERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKlBpeGVsRm9ybWF0KTsKdm9pZCBkdW1wX0QzRE1BVFJJWChEM0RNQVRSSVggKm1hdCk7CnZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpOwpEV09SRCBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKTsKdm9pZCBERFJBV19kdW1wX0REU0NBUFMyKGNvbnN0IEREU0NBUFMyICppbik7CnZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCk7CgovKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgaGVyZSBhcyBsb25nIHRoZSBwcm9jZXNzdmVydGljZXMgZnVuY3Rpb25hbGl0eSBvZgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGlzbid0IGluIFdpbmVEM0QgKi8Kdm9pZCBtdWx0aXBseV9tYXRyaXgoTFBEM0RNQVRSSVggZGVzdCwgTFBEM0RNQVRSSVggc3JjMSwgTFBEM0RNQVRSSVggc3JjMik7CgovKiBVc2VkIGZvciBnZW5lcmljIGR1bXBpbmcgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKfSBmbGFnX2luZm87CgojZGVmaW5lIEZFKHgpIHsgeCwgI3ggfQoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKICAgIHZvaWQgKCpmdW5jKShjb25zdCB2b2lkICopOwogICAgcHRyZGlmZl90IG9mZnNldDsKfSBtZW1iZXJfaW5mbzsKCi8qIFN0cnVjdHVyZSBjb3B5ICovCiNkZWZpbmUgRERSQVdfZHVtcF9mbGFncyhmbGFncyxuYW1lcyxudW1fbmFtZXMpIEREUkFXX2R1bXBfZmxhZ3NfKGZsYWdzLCBuYW1lcywgbnVtX25hbWVzLCAxKQojZGVmaW5lIE1FKHgsZixlKSB7IHgsICN4LCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSkoZiksIG9mZnNldG9mKFNUUlVDVCwgZSkgfQoKI2RlZmluZSBERF9TVFJVQ1RfQ09QWV9CWVNJWkUodG8sZnJvbSkgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19zaXplID0gKHRvKS0+ZHdTaXplOyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fY29weXNpemUgPSBfX3NpemU7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX3Jlc2V0c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYXNzZXJ0KHRvICE9IGZyb20pOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChfX3Jlc2V0c2l6ZSA+IHNpemVvZigqdG8pKSAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19yZXNldHNpemUgPSBzaXplb2YoKnRvKTsgICAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtc2V0KHRvLDAsX19yZXNldHNpemUpOyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICgoZnJvbSktPmR3U2l6ZSA8IF9fc2l6ZSkgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19jb3B5c2l6ZSA9IChmcm9tKS0+ZHdTaXplOyAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtY3B5KHRvLGZyb20sX19jb3B5c2l6ZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh0byktPmR3U2l6ZSA9IF9fc2l6ZTsvKnJlc3RvcmUgc2l6ZSovICBcCiAgICAgICAgfSB3aGlsZSAoMCkKCgojZW5kaWYKCkhSRVNVTFQgaHJfZGRyYXdfZnJvbV93aW5lZDNkKEhSRVNVTFQgaHIpOwo=