LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIndpbmUvbGlzdC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgLSBhIGhlbHBlciBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERUZJTkVfR1VJRChJSURfSVBhcmVudCwgMHhjMjBlNGM4OCwgMHg3NGU3LCAweDQ5NDAsIDB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODEpOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50ICpMUFBBUkVOVCwgKlBQQVJFTlQ7CgojZGVmaW5lIElOVEVSRkFDRSBJUGFyZW50CkRFQ0xBUkVfSU5URVJGQUNFXyhJUGFyZW50LElVbmtub3duKQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgU1RETUVUSE9EXyhIUkVTVUxULFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCkgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOwogICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOwp9OwojdW5kZWYgSU5URVJGQUNFCgojaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkKLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KI2RlZmluZSBJUGFyZW50X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiNkZWZpbmUgSVBhcmVudF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQojZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiNlbmRpZgoKCi8qIFR5cGRlZiB0aGUgaW50ZXJmYWNlcyAqLwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgIElEaXJlY3QzRExpZ2h0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKCi8qIENhbGxiYWNrcyBmb3IgaW1wbGljaXQgb2JqZWN0IGRlc3RydWN0aW9uICovCmV4dGVybiBVTE9ORyBXSU5BUEkgRDNEN0NCX0Rlc3Ryb3lTd2FwQ2hhaW4oSVdpbmVEM0RTd2FwQ2hhaW4gKnBTd2FwQ2hhaW4pOwoKZXh0ZXJuIFVMT05HIFdJTkFQSSBEM0Q3Q0JfRGVzdHJveURlcHRoU3RlbmNpbFN1cmZhY2UoSVdpbmVEM0RTdXJmYWNlICpwU3VyZmFjZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXcgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBJRGlyZWN0RHJhd0ltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXc0KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Myk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNENyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEKTsKCiAgICAvKiBTZWUgY29tbWVudCBpbiBJRGlyZWN0RHJhdzo6QWRkUmVmICovCiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY3LCByZWY0LCByZWYyLCByZWYzLCByZWYxLCBudW1JZmFjZXM7CgogICAgLyogV2luZUQzRCBsaW5rYWdlICovCiAgICBJV2luZUQzRCAgICAgICAgICAgICAgICAqd2luZUQzRDsKICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgICp3aW5lRDNERGV2aWNlOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKkRlcHRoU3RlbmNpbEJ1ZmZlcjsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGQzZF9pbml0aWFsaXplZDsKCiAgICAvKiBNaXNjIGRkcmF3IGZpZWxkcyAqLwogICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdG90YWxfdmlkbWVtOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY3VyX3NjYW5saW5lOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZmFrZV92Ymxhbms7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZDsKCiAgICAvKiBEaXJlY3REcmF3IHRoaW5ncywgd2hpY2ggYXJlIG5vdCBoYW5kbGVkIGJ5IFdpbmVEM0QgKi8KICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGNvb3BlcmF0aXZlX2xldmVsOwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0OwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgb3JpZ19icHA7CgogICAgRERDQVBTICAgICAgICAgICAgICAgICAgY2FwczsKCiAgICAvKiBEM0QgdGhpbmdzICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqZDNkX3RhcmdldDsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGQzZF93aW5kb3c7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAqZDNkZGV2aWNlOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgZDNkdmVyc2lvbjsKCiAgICAvKiBWYXJpb3VzIEhXTkRzICovCiAgICBIV05EICAgICAgICAgICAgICAgICAgICBmb2N1c3dpbmRvdzsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgIGRldmljZXdpbmRvdzsKCiAgICAvKiBUaGUgc3VyZmFjZSB0eXBlIHRvIHJlcXVlc3QgKi8KICAgIFdJTkVEM0RTVVJGVFlQRSAgICAgICAgIEltcGxUeXBlOwoKCiAgICAvKiBPdXIgcHJpdmF0ZSB3aW5kb3cgY2xhc3MgKi8KICAgIGNoYXIgY2xhc3NuYW1lWzMyXTsKICAgIFdORENMQVNTQSB3bmRfY2xhc3M7CgogICAgLyogSGVscGVycyBmb3Igc3VyZmFjZSBjcmVhdGlvbiAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGV4X3Jvb3Q7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBkZXB0aHN0ZW5jaWw7CgogICAgLyogRm9yIHRoZSBkbGwgdW5sb2FkIGNsZWFudXAgY29kZSAqLwogICAgc3RydWN0IGxpc3QgZGRyYXdfbGlzdF9lbnRyeTsKICAgIC8qIFRoZSBzdXJmYWNlIGxpc3QgLSBjYW4ndCByZWxheSB0aGlzIHRvIFdpbmVEM0QKICAgICAqIGJlY2F1c2Ugb2YgSVBhcmVudAogICAgICovCiAgICBzdHJ1Y3QgbGlzdCBzdXJmYWNlX2xpc3Q7CiAgICBMT05HIHN1cmZhY2VzOwp9OwoKLyogRGVjbGFyZSB0aGUgVlRhYmxlcy4gVGhleSBjYW4gYmUgZm91bmQgZGRyYXcuYyAqLwpjb25zdCBJRGlyZWN0RHJhdzdWdGJsIElEaXJlY3REcmF3N19WdGJsOwpjb25zdCBJRGlyZWN0RHJhdzRWdGJsIElEaXJlY3REcmF3NF9WdGJsOwpjb25zdCBJRGlyZWN0RHJhdzNWdGJsIElEaXJlY3REcmF3M19WdGJsOwpjb25zdCBJRGlyZWN0RHJhdzJWdGJsIElEaXJlY3REcmF3Ml9WdGJsOwpjb25zdCBJRGlyZWN0RHJhd1Z0YmwgIElEaXJlY3REcmF3MV9WdGJsOwoKLyogSGVscGVyIHN0cnVjdHVyZXMgKi8KdHlwZWRlZiBzdHJ1Y3QgRW51bURpc3BsYXlNb2Rlc0NCUwp7CiAgICB2b2lkICpjb250ZXh0OwogICAgTFBEREVOVU1NT0RFU0NBTExCQUNLMiBjYWxsYmFjazsKfSBFbnVtRGlzcGxheU1vZGVzQ0JTOwoKdHlwZWRlZiBzdHJ1Y3QgRW51bVN1cmZhY2VzQ0JTCnsKICAgIHZvaWQgKmNvbnRleHQ7CiAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNhbGxiYWNrOwogICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRDsKICAgIERXT1JEIEZsYWdzOwp9IEVudW1TdXJmYWNlc0NCUzsKCi8qIFV0aWxpdHkgZnVuY3Rpb25zICovCnZvaWQKRERSQVdfQ29udmVydF9ERFNDQVBTXzFfVG9fMihjb25zdCBERFNDQVBTKiBwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQUzIqIHBPdXQpOwp2b2lkCkREUkFXX0NvbnZlcnRfRERERVZJQ0VJREVOVElGSUVSXzJfVG9fMShjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERERFVklDRUlERU5USUZJRVIqIHBPdXQpOwp2b2lkCklEaXJlY3REcmF3SW1wbF9EZXN0cm95KElEaXJlY3REcmF3SW1wbCAqVGhpcyk7CgpIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd0ltcGxfUmVjcmVhdGVTdXJmYWNlc0NhbGxiYWNrKElEaXJlY3REcmF3U3VyZmFjZTcgKnN1cmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCk7CnZvaWQKcmVtb3ZlX2RkcmF3X29iamVjdChJRGlyZWN0RHJhd0ltcGwgKmRkcmF3KTsKCi8qIFRoZSBkZWZhdWx0IHN1cmZhY2UgdHlwZSAqLwpleHRlcm4gV0lORUQzRFNVUkZUWVBFIERlZmF1bHRTdXJmYWNlVHlwZTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2UgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdTdXJmYWNlNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2UzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3R2FtbWFDb250cm9sKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFRleHR1cmUyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFRleHR1cmUpOwoKICAgIExPTkcgICAgICAgICAgICAgICAgICAgICByZWY7CiAgICBJVW5rbm93biAgICAgICAgICAgICAgICAqaWZhY2VUb1JlbGVhc2U7CgogICAgaW50ICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjsKCiAgICAvKiBDb25uZWN0aW9ucyB0byBvdGhlciBPYmplY3RzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAqZGRyYXc7CiAgICBJV2luZUQzRFN1cmZhY2UgICAgICAgICAqV2luZUQzRFN1cmZhY2U7CiAgICBJV2luZUQzRFRleHR1cmUgICAgICAgICAqd2luZUQzRFRleHR1cmU7CgogICAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIGF0dGFjaGluZyBzdXJmYWNlcyB0byBvdGhlciBzdXJmYWNlcyAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKm5leHRfYXR0YWNoZWQ7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqZmlyc3RfYXR0YWNoZWQ7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqbmV4dF9jb21wbGV4OwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmZpcnN0X2NvbXBsZXg7CgogICAgLyogU3VyZmFjZSBkZXNjcmlwdGlvbiwgZm9yIEdldEF0dGFjaGVkU3VyZmFjZSAqLwogICAgRERTVVJGQUNFREVTQzIgICAgICAgICAgc3VyZmFjZV9kZXNjOwoKICAgIC8qIE1pc2MgdGhpbmdzICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICB1bmlxdWVuZXNzX3ZhbHVlOwogICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbWlwbWFwX2xldmVsOwogICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CgogICAgLyogRm9yIEQzRERldmljZSBjcmVhdGlvbiAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaXNSZW5kZXJUYXJnZXQ7CgogICAgLyogQ2xpcHBlciBvYmplY3RzICovCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAqY2xpcHBlcjsKCiAgICAvKiBGb3IgdGhlIGRkcmF3IHN1cmZhY2UgbGlzdCAqLwogICAgc3RydWN0IGxpc3QgICAgICAgICAgICAgc3VyZmFjZV9saXN0X2VudHJ5OwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKfTsKCi8qIFZUYWJsZSBkZWNsYXJhdGlvbi4gSXQncyBsb2NhdGVkIGluIHN1cmZhY2UuYyAvIHN1cmZhY2VfdGh1bmtzLmMgKi8KY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlN19WdGJsOwpjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2UzVnRibCBJRGlyZWN0RHJhd1N1cmZhY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3R2FtbWFDb250cm9sVnRibCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9WdGJsOwpjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibDsKY29uc3QgSURpcmVjdDNEVGV4dHVyZVZ0YmwgSURpcmVjdDNEVGV4dHVyZTFfVnRibDsKCi8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBzdXJmYWNlICovCiNkZWZpbmUgUEZHRVRfQlBQKHBmKSAocGYuZHdGbGFncyZERFBGX1BBTEVUVEVJTkRFWEVEOD8xOigocGYuZHdSR0JCaXRDb3VudCs3KS84KSkKI2RlZmluZSBHRVRfQlBQKGRlc2MpIFBGR0VUX0JQUChkZXNjLmRkcGZQaXhlbEZvcm1hdCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJUGFyZW50IEltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElQYXJlbnRJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSVBhcmVudCk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogSVBhcmVudEltcGwgZmllbGRzICovCiAgICBJVW5rbm93biAgICAgICpjaGlsZDsKCn07Cgpjb25zdCBJUGFyZW50VnRibCBJUGFyZW50X1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtCnsKICAgIEREcmF3SGFuZGxlX1Vua25vd24gICAgICAgPSAwLAogICAgRERyYXdIYW5kbGVfVGV4dHVyZSAgICAgICA9IDEsCiAgICBERHJhd0hhbmRsZV9NYXRlcmlhbCAgICAgID0gMiwKICAgIEREcmF3SGFuZGxlX01hdHJpeCAgICAgICAgPSAzLAogICAgRERyYXdIYW5kbGVfU3RhdGVCbG9jayAgICA9IDQKfSBERHJhd0hhbmRsZVR5cGVzOwoKc3RydWN0IEhhbmRsZUVudHJ5CnsKICAgIHZvaWQgICAgKnB0cjsKICAgIEREcmF3SGFuZGxlVHlwZXMgICAgICB0eXBlOwp9OwoKc3RydWN0IElEaXJlY3QzRERldmljZUltcGwKewogICAgLyogSVVua25vd24gKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZSk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogT3RoZXIgb2JqZWN0IGNvbm5lY3Rpb25zICovCiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNESW5kZXhCdWZmZXIgICAgICppbmRleGJ1ZmZlcjsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICp0YXJnZXQ7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBPZmZTY3JlZW5UYXJnZXQ7CgogICAgLyogVmlld3BvcnQgbWFuYWdlbWVudCAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2aWV3cG9ydF9saXN0OwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpjdXJyZW50X3ZpZXdwb3J0OwogICAgRDNEVklFV1BPUlQ3IGFjdGl2ZV92aWV3cG9ydDsKCiAgICAvKiBMaWdodCBzdGF0ZSAqLwogICAgRFdPUkQgbWF0ZXJpYWw7CgogICAgLyogUmVuZGVyaW5nIGZ1bmN0aW9ucyB0byB3cmFwIEQzRCgxLTMpIHRvIEQzRDcgKi8KICAgIEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlX3R5cGU7CiAgICBEV09SRCB2ZXJ0ZXhfdHlwZTsKICAgIERXT1JEIHJlbmRlcl9mbGFnczsKICAgIERXT1JEIG5iX3ZlcnRpY2VzOwogICAgTFBCWVRFIHZlcnRleF9idWZmZXI7CiAgICBEV09SRCB2ZXJ0ZXhfc2l6ZTsKICAgIERXT1JEIGJ1ZmZlcl9zaXplOwoKICAgIC8qIEhhbmRsZSBtYW5hZ2VtZW50ICovCiAgICBzdHJ1Y3QgSGFuZGxlRW50cnkgICAgICAqSGFuZGxlczsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICBudW1IYW5kbGVzOwp9OwoKLyogVnRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCmNvbnN0IElEaXJlY3QzRERldmljZTdWdGJsIElEaXJlY3QzRERldmljZTdfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlM1Z0YmwgSURpcmVjdDNERGV2aWNlM19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UyVnRibCBJRGlyZWN0M0REZXZpY2UyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZVZ0YmwgIElEaXJlY3QzRERldmljZTFfVnRibDsKCi8qIFRoZSBJSUQgKi8KY29uc3QgR1VJRCBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCkhSRVNVTFQgSURpcmVjdDNESW1wbF9HZXRDYXBzKElXaW5lRDNEICpXaW5lRDNELCBEM0RERVZJQ0VERVNDICpEZXNjMTIzLCBEM0RERVZJQ0VERVNDNyAqRGVzYzcpOwpEV09SRCBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzKTsKCi8qIFN0cnVjdHVyZXMgKi8Kc3RydWN0IEVudW1UZXh0dXJlRm9ybWF0c0NCUwp7CiAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIGNidjI7CiAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBjYnY3OwogICAgdm9pZCAqQ29udGV4dDsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogTm8gaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIGFzIHRoaXMgaXMgb25seSBhbm90aGVyIGludGVyZmFjZSB0byBEaXJlY3REcmF3ICovCgovKiB0aGUgVnRhYmxlcyAqLwpjb25zdCBJRGlyZWN0M0RWdGJsICBJRGlyZWN0M0QxX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDJWdGJsIElEaXJlY3QzRDJfVnRibDsKY29uc3QgSURpcmVjdDNEM1Z0YmwgSURpcmVjdDNEM19WdGJsOwpjb25zdCBJRGlyZWN0M0Q3VnRibCBJRGlyZWN0M0Q3X1Z0Ymw7CgovKiBTdHJ1Y3R1cmUgZm9yIEVudW1aQnVmZmVyRm9ybWF0cyAqLwpzdHJ1Y3QgRW51bVpCdWZmZXJGb3JtYXRzRGF0YQp7CiAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBDYWxsYmFjazsKICAgIHZvaWQgKkNvbnRleHQ7Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdDbGlwcGVyKTsKICAgIExPTkcgcmVmOwoKICAgIC8qIElEaXJlY3REcmF3Q2xpcHBlciBmaWVsZHMgKi8KICAgIEhXTkQgaFduZDsKCiAgICBJRGlyZWN0RHJhd0ltcGwqIGRkcmF3X293bmVyOwogICAgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwqIHByZXZfZGRyYXc7CiAgICBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbCogbmV4dF9kZHJhdzsKfTsKCmNvbnN0IElEaXJlY3REcmF3Q2xpcHBlclZ0YmwgSURpcmVjdERyYXdDbGlwcGVyX1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdQYWxldHRlKTsKICAgIExPTkcgcmVmOwoKICAgIC8qIFdpbmVEM0QgdXBsaW5rICovCiAgICBJV2luZUQzRFBhbGV0dGUgICAgICAgICAgICp3aW5lRDNEUGFsZXR0ZTsKCiAgICAvKiBJRGlyZWN0RHJhd1BhbGV0dGUgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhd19vd25lcjsKICAgIElVbmtub3duICAgICAgICAgICAgICAgICAgKmlmYWNlVG9SZWxlYXNlOwp9Owpjb25zdCBJRGlyZWN0RHJhd1BhbGV0dGVWdGJsIElEaXJlY3REcmF3UGFsZXR0ZV9WdGJsOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEaXJlY3REcmF3IENsYXNzRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiAtIGluY29tcGxldGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgSUNPTV9WRklFTERfTVVMVEkoSUNsYXNzRmFjdG9yeSk7CgogICAgTE9ORyByZWY7CiAgICBIUkVTVUxUICgqcGZuQ3JlYXRlSW5zdGFuY2UpKElVbmtub3duICpwVW5rT3V0ZXIsIFJFRklJRCBpaWQsIExQVk9JRCAqcHBPYmopOwp9IElDbGFzc0ZhY3RvcnlJbXBsOwoKLyogSGVscGVyIHN0cnVjdHVyZXMgKi8Kc3RydWN0IG9iamVjdF9jcmVhdGlvbl9pbmZvCnsKICAgIGNvbnN0IENMU0lEICpjbHNpZDsKICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcE9iaik7Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0IGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RMaWdodCk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RMaWdodCBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3OwoKICAgIC8qIElmIHRoaXMgbGlnaHQgaXMgYWN0aXZlIGZvciBvbmUgdmlld3BvcnQsIHB1dCB0aGUgdmlld3BvcnQgaGVyZSAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAqYWN0aXZlX3ZpZXdwb3J0OwoKICAgIEQzRExJR0hUMiBsaWdodDsKICAgIEQzRExJR0hUNyBsaWdodDc7CgogICAgRFdPUkQgZHdMaWdodEluZGV4OwoKICAgIC8qIENoYWluZWQgbGlzdCB1c2VkIGZvciBhZGRpbmcgLyByZW1vdmluZyBmcm9tIHZpZXdwb3J0cyAqLwogICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbmV4dDsKCiAgICAvKiBBY3RpdmF0aW9uIGZ1bmN0aW9uICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmRlc2FjdGl2YXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCp1cGRhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwp9OwoKLyogVnRhYmxlICovCmNvbnN0IElEaXJlY3QzRExpZ2h0VnRibCBJRGlyZWN0M0RMaWdodF9WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIGxpZ2h0X3VwZGF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwp2b2lkIGxpZ2h0X2FjdGl2YXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CnZvaWQgbGlnaHRfZGVzYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNETWF0ZXJpYWxJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbDIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwpOwogICAgTE9ORyAgcmVmOwoKICAgIC8qIElEaXJlY3QzRE1hdGVyaWFsMiBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgICAgICpkZHJhdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICAgICAgICphY3RpdmVfZGV2aWNlOwoKICAgIEQzRE1BVEVSSUFMIG1hdDsKICAgIERXT1JEIEhhbmRsZTsKCiAgICB2b2lkICgqYWN0aXZhdGUpKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogdGhpcyk7Cn07CgovKiBWVGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMgKi8KY29uc3QgSURpcmVjdDNETWF0ZXJpYWxWdGJsIElEaXJlY3QzRE1hdGVyaWFsX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsMlZ0YmwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsM1Z0YmwgSURpcmVjdDNETWF0ZXJpYWwzX1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgbWF0ZXJpYWxfYWN0aXZhdGUoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydCAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZpZXdwb3J0Myk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RWaWV3cG9ydCBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3OwoKICAgIC8qIElmIHRoaXMgdmlld3BvcnQgaXMgYWN0aXZlIGZvciBvbmUgZGV2aWNlLCBwdXQgdGhlIGRldmljZSBoZXJlICovCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICphY3RpdmVfZGV2aWNlOwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgbnVtX2xpZ2h0czsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgbWFwX2xpZ2h0czsKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHVzZV92cDI7CgogICAgdW5pb24KICAgIHsKICAgICAgICBEM0RWSUVXUE9SVCB2cDE7CiAgICAgICAgRDNEVklFV1BPUlQyIHZwMjsKICAgIH0gdmlld3BvcnRzOwoKICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCphY3RpdmF0ZSkoSURpcmVjdDNEVmlld3BvcnRJbXBsKik7CgogICAgLyogRmllbGQgdXNlZCB0byBjaGFpbiB2aWV3cG9ydHMgdG9nZXRoZXIgKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgKm5leHQ7CgogICAgLyogTGlnaHRzIGxpc3QgKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgKmxpZ2h0czsKCiAgICAvKiBCYWNrZ3JvdW5kIG1hdGVyaWFsICovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICpiYWNrZ3JvdW5kOwp9OwoKLyogVnRhYmxlICovCmNvbnN0IElEaXJlY3QzRFZpZXdwb3J0M1Z0YmwgSURpcmVjdDNEVmlld3BvcnQzX1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgdmlld3BvcnRfYWN0aXZhdGUoSURpcmVjdDNEVmlld3BvcnRJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbAp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7CiAgICBMT05HICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICpkZHJhdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICpkM2RkZXY7CgogICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgZGVzYzsKICAgIEQzREVYRUNVVEVEQVRBICAgICAgIGRhdGE7CgogICAgLyogVGhpcyBidWZmZXIgd2lsbCBzdG9yZSB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICp2ZXJ0ZXhfZGF0YTsKICAgIFdPUkQgICAgICAgICAgICAgICAgICppbmRpY2VzOwogICAgaW50ICAgICAgICAgICAgICAgICAgbmJfaW5kaWNlczsKCiAgICAvKiBUaGlzIGZsYWdzIGlzIHNldCB0byBUUlVFIGlmIHdlIGFsbG9jYXRlZCBvdXJzZWx2ZXMgdGhlCiAgICAgKiBkYXRhIGJ1ZmZlcgogICAgICovCiAgICBCT09MICAgICAgICAgICAgICAgICBuZWVkX2ZyZWU7Cn07CgovKiBUaGUgVlRhYmxlICovCmNvbnN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJWdGJsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibDsKCi8qIFRoZSBleGVjdXRlIGZ1bmN0aW9uICovCnZvaWQKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfRXhlY3V0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpWaWV3cG9ydEltcGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsCnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcik7CiAgICBMT05HICAgICAgICAgICAgICAgICByZWY7CgogICAgLyoqKiBXaW5lRDNEIGFuZCBkZHJhdyBsaW5rcyAqKiovCiAgICBJV2luZUQzRFZlcnRleEJ1ZmZlciAqd2luZUQzRFZlcnRleEJ1ZmZlcjsKICAgIElEaXJlY3REcmF3SW1wbCAqZGRyYXc7CgogICAgLyoqKiBTdG9yYWdlIGZvciBEM0Q3IHNwZWNpZmljIHRoaW5ncyAqKiovCiAgICBEV09SRCAgICAgICAgICAgICAgICBDYXBzOwp9OwoKLyogVGhlIFZ0YWJsZXMgKi8KY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyN1Z0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyN19WdGJsOwpjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJWdGJsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjFfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBIZWxwZXIgZnVuY3Rpb25zIGZyb20gdXRpbHMuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpIFwKICAgICgoKGQzZHZ0VmVydGV4VHlwZSkgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUKQoKI2RlZmluZSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIHRleF9udW0pIFwKICAgICgoKCgoZDNkdnRWZXJ0ZXhUeXBlKSA+PiAoMTYgKyAoMiAqICh0ZXhfbnVtKSkpKSArIDEpICYgMHgwMykgKyAxKQoKdm9pZCBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0LCBXSU5FRDNERk9STUFUIFdpbmVEM0RGb3JtYXQpOwpXSU5FRDNERk9STUFUIFBpeGVsRm9ybWF0X0REMldpbmVEM0QoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCk7CnZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCk7CnZvaWQgRERSQVdfZHVtcF9waXhlbGZvcm1hdChjb25zdCBERFBJWEVMRk9STUFUICpQaXhlbEZvcm1hdCk7CnZvaWQgZHVtcF9EM0RNQVRSSVgoRDNETUFUUklYICptYXQpOwp2b2lkIEREUkFXX2R1bXBfRERDQVBTKGNvbnN0IEREQ0FQUyAqbHBjYXBzKTsKRFdPUkQgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSk7CnZvaWQgRERSQVdfZHVtcF9ERFNDQVBTMihjb25zdCBERFNDQVBTMiAqaW4pOwp2b2lkIEREUkFXX2R1bXBfY29vcGVyYXRpdmVsZXZlbChEV09SRCBjb29wbGV2ZWwpOwoKLyogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGhlcmUgYXMgbG9uZyB0aGUgcHJvY2Vzc3ZlcnRpY2VzIGZ1bmN0aW9uYWxpdHkgb2YKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBpc24ndCBpbiBXaW5lRDNEICovCnZvaWQgbXVsdGlwbHlfbWF0cml4KExQRDNETUFUUklYIGRlc3QsIExQRDNETUFUUklYIHNyYzEsIExQRDNETUFUUklYIHNyYzIpOwoKLyogVXNlZCBmb3IgZ2VuZXJpYyBkdW1waW5nICovCnR5cGVkZWYgc3RydWN0CnsKICAgIERXT1JEIHZhbDsKICAgIGNvbnN0IGNoYXIqIG5hbWU7Cn0gZmxhZ19pbmZvOwoKI2RlZmluZSBGRSh4KSB7IHgsICN4IH0KCnR5cGVkZWYgc3RydWN0CnsKICAgIERXT1JEIHZhbDsKICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICB2b2lkICgqZnVuYykoY29uc3Qgdm9pZCAqKTsKICAgIHB0cmRpZmZfdCBvZmZzZXQ7Cn0gbWVtYmVyX2luZm87CgovKiBTdHJ1Y3R1cmUgY29weSAqLwojZGVmaW5lIE1FKHgsZixlKSB7IHgsICN4LCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSkoZiksIG9mZnNldG9mKFNUUlVDVCwgZSkgfQoKI2RlZmluZSBERF9TVFJVQ1RfQ09QWV9CWVNJWkUodG8sZnJvbSkgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19zaXplID0gKHRvKS0+ZHdTaXplOyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fY29weXNpemUgPSBfX3NpemU7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX3Jlc2V0c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYXNzZXJ0KHRvICE9IGZyb20pOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChfX3Jlc2V0c2l6ZSA+IHNpemVvZigqdG8pKSAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19yZXNldHNpemUgPSBzaXplb2YoKnRvKTsgICAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtc2V0KHRvLDAsX19yZXNldHNpemUpOyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICgoZnJvbSktPmR3U2l6ZSA8IF9fc2l6ZSkgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgX19jb3B5c2l6ZSA9IChmcm9tKS0+ZHdTaXplOyAgICAgICAgXAogICAgICAgICAgICAgICAgbWVtY3B5KHRvLGZyb20sX19jb3B5c2l6ZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh0byktPmR3U2l6ZSA9IF9fc2l6ZTsvKnJlc3RvcmUgc2l6ZSovICBcCiAgICAgICAgfSB3aGlsZSAoMCkKCgojZW5kaWYKCkhSRVNVTFQgaHJfZGRyYXdfZnJvbV93aW5lZDNkKEhSRVNVTFQgaHIpOwo=