LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxycGMuaD4KI2luY2x1ZGUgPHJwY25kci5oPgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWFjcm9zIHRvIGRlZmluZSBhIENPTSBpbnRlcmZhY2UKICovCi8qCiAqIFRoZSBnb2FsIG9mIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gdXNlIHRoZSBzYW1lCiAqIGhlYWRlciBmaWxlIGRlZmluaXRpb25zIHRvIHByb3ZpZGUgYm90aCBhIEMgaW50ZXJmYWNlIGFuZCBhIEMrKyBvYmplY3Qgb3JpZW50ZWQKICogaW50ZXJmYWNlIHRvIENPTSBpbnRlcmZhY2VzLiBUaGUgdHlwZSBvZiBpbnRlcmZhY2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseQogKiBkZXBlbmRpbmcgb24gdGhlIGxhbmd1YWdlIGJ1dCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8gZ2V0IHRoZSBDIGludGVyZmFjZSBpbiBDKysKICogYnkgZGVmaW5pbmcgQ0lOVEVSRkFDRS4KICoKICogSXQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICogIC0gYWxsIENPTSBpbnRlcmZhY2VzIGRlcml2ZSBmcm9tIElVbmtub3duLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogKiAgLSB0aGUgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UsIHRoZSBhY3R1YWwgZmllbGRzIGFyZSBkZWZpbmVkCiAqICAgIHNlcGFyYXRlbHkgaW4gdGhlIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZS4KICoKICogVGhlIG5hdHVyYWwgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBDKysgY2xhc3MgYW5kCiAqIHZpcnR1YWwgbWV0aG9kcyBpbiBDKysgYW5kIGEgc3RydWN0dXJlIHdpdGggYSB0YWJsZSBvZiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBpbiBDLgogKiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXlvdXQgb2YgdGhlIHZpcnR1YWwgdGFibGUgaXMgY29tcGlsZXIgc3BlY2lmaWMsIHRoZSBsYXlvdXQgb2YKICogZysrIHZpcnR1YWwgdGFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFuIGVnY3MgdmlydHVhbCB0YWJsZSB3aGljaCBpcyBub3QgdGhlCiAqIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgVmlzdWFsIEMrLiBUaGVyZSBhcmUgd29ya2Fyb3VuZHMgdG8gbWFrZSB0aGUgdmlydHVhbCB0YWJsZXMKICogY29tcGF0aWJsZSB2aWEgcGFkZGluZyBidXQgdW5mb3J0dW5hdGVseSB0aGUgb25lIHdoaWNoIGlzIGltcG9zZWQgdG8gdGhlIFdJTkUgZW11bGF0b3IKICogYnkgdGhlIFdpbmRvd3MgYmluYXJpZXMsIGkuZS4gdGhlIFZpc3VhbCBDKysgb25lLCBpcyB0aGUgbW9zdCBjb21wYWN0IG9mIGFsbC4KICoKICogU28gdGhlIHNvbHV0aW9uIEkgZmluYWxseSBhZG9wdGVkIGRvZXMgbm90IHVzZSB2aXJ0dWFsIHRhYmxlcy4gSW5zdGVhZCBJIHVzZSBpbmxpbmUKICogbm9uIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGRlcmVmZXJlbmNlIHRoZSBtZXRob2QgcG9pbnRlciB0aGVtc2VsdmVzIGFuZCBwZXJmb3JtIHRoZSBjYWxsLgogKgogKiBMZXQncyB0YWtlIERpcmVjdDNEIGFzIGFuIGV4YW1wbGU6CiAqCiAqICAgICNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRAogKiAgICBERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNELElVbmtub3duKQogKiAgICB7CiAqICAgICAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRF8oSFJFU1VMVCxRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlELCB2b2lkKiopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsKICogICAgICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKICogICAgICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBSRUZJSUQpIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoRW51bURldmljZXMpKFRISVNfIExQRDNERU5VTURFVklDRVNDQUxMQkFDSywgTFBWT0lEKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKENyZWF0ZUxpZ2h0KShUSElTXyBMUERJUkVDVDNETElHSFQgKiwgSVVua25vd24gKikgUFVSRTsKICogICAgICAgIFNURE1FVEhPRChDcmVhdGVNYXRlcmlhbCkoVEhJU18gTFBESVJFQ1QzRE1BVEVSSUFMICosIElVbmtub3duICopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoQ3JlYXRlVmlld3BvcnQpKFRISVNfIExQRElSRUNUM0RWSUVXUE9SVCAqLCBJVW5rbm93biAqKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKEZpbmREZXZpY2UpKFRISVNfIExQRDNERklORERFVklDRVNFQVJDSCwgTFBEM0RGSU5EREVWSUNFUkVTVUxUKSBQVVJFOwogKiAgICB9OwogKiAgICAjdW5kZWYgSU5URVJGQUNFCiAqCiAqICAgICNpZmRlZiBDT0JKTUFDUk9TCiAqICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkKICogICAgLy8gKioqIElEaXJlY3QzRCBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9Jbml0aWFsaXplKHAsYSkgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9FbnVtRGV2aWNlcyhwLGEsYikgICAgKHApLT5scFZ0YmwtPkVudW1EZXZpY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICAocCktPmxwVnRibC0+Q3JlYXRlTGlnaHQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZU1hdGVyaWFsKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlTWF0ZXJpYWwocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZVZpZXdwb3J0KHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlVmlld3BvcnQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICAocCktPmxwVnRibC0+RmluZERldmljZShwLGEsYikKICogICAgI2VuZGlmCiAqCiAqIENvbW1lbnRzOgogKiAgLSBUaGUgSU5URVJGQUNFIG1hY3JvIGlzIHVzZWQgaW4gdGhlIFNURE1FVEhPRCBtYWNyb3MgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHRoZSAndGhpcycKICogICAgcG9pbnRlci4gRGVmaW5pbmcgdGhpcyBtYWNybyBoZXJlIHNhdmVzIHVzIHRoZSB0cm91YmxlIG9mIGhhdmluZyB0byByZXBlYXQgdGhlIGludGVyZmFjZQogKiAgICBuYW1lIGV2ZXJ5d2hlcmUuIE5vdGUgaG93ZXZlciB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSBtYWNyb3Mgd29yaywgYSBtYWNybyBsaWtlIFNURE1FVEhPRAogKiAgICBjYW5ub3QgdXNlICdJTlRFUkZBQ0UjI19WVEFCTEUnIGJlY2F1c2UgdGhpcyB3b3VsZCBnaXZlICdJTlRFUkZBQ0VfVlRBQkxFJyBhbmQgbm90CiAqICAgICdJRGlyZWN0M0RfVlRBQkxFJy4KICogIC0gVGhlIERFQ0xBUkVfSU5URVJGQUNFIGRlY2xhcmVzIGFsbCB0aGUgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIHRoZSBpbnRlcmZhY2UuIFdlIGhhdmUgdG8KICogICAgZXhwbGljaXRseSB1c2UgdGhlIGludGVyZmFjZSBuYW1lIGZvciBtYWNybyBleHBhbnNpb24gcmVhc29ucyBhZ2Fpbi4gSXQgZGVmaW5lcyB0aGUgbGlzdCBvZgogKiAgICBtZXRob2RzIHRoYXQgYXJlIGluaGVyaXRhYmxlIGZyb20gdGhpcyBpbnRlcmZhY2UuIEl0IG11c3QgYmUgd3JpdHRlbiBtYW51YWxseSAocmF0aGVyIHRoYW4KICogICAgdXNpbmcgYSBtYWNybyB0byBnZW5lcmF0ZSB0aGUgZXF1aXZhbGVudCBjb2RlKSB0byBhdm9pZCBtYWNybyByZWN1cnNpb24gKHdoaWNoIGNvbXBpbGVycwogKiAgICBkb24ndCBsaWtlKS4gSXQgbXVzdCBzdGFydCB3aXRoIHRoZSBtZXRob2RzIGRlZmluaXRpb24gb2YgdGhlIHBhcmVudCBpbnRlcmZhY2Ugc28gdGhhdAogKiAgICBtZXRob2QgaW5oZXJpdGFuY2Ugd29ya3MgcHJvcGVybHkuCiAqICAtIFRoZSAndW5kZWYgSU5URVJGQUNFJyBpcyBoZXJlIHRvIHJlbWluZCB5b3UgdGhhdCB1c2luZyBJTlRFUkZBQ0UgaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MKICogICAgd2lsbCBub3Qgd29yay4KICogIC0gRmluYWxseSB0aGUgc2V0IG9mICdJRGlyZWN0M0RfWHh4JyBtYWNyb3MgaXMgYSBzdGFuZGFyZCBzZXQgb2YgbWFjcm9zIGRlZmluZWQgdG8gZWFzZSBhY2Nlc3MKICogICAgdG8gdGhlIGludGVyZmFjZSBtZXRob2RzIGluIEMuIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBzZWUgYW55IHdheSB0byBhdm9pZCBoYXZpbmcgdG8gZHVwbGljYXRlCiAqICAgIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGRlZmluaXRpb25zIHRoZXJlLiBUaGlzIHRpbWUgSSBjb3VsZCBoYXZlIHVzZWQgYSB0cmljayB0byB1c2Ugb25seSBvbmUKICogICAgbWFjcm8gd2hhdGV2ZXIgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJ1dCBJIHByZWZlcmVkIHRvIGhhdmUgaXQgd29yayB0aGUgc2FtZSB3YXkgYXMgYWJvdmUuCiAqICAtIFlvdSBwcm9iYWJseSBoYXZlIG5vdGljZWQgdGhhdCB3ZSBkb24ndCBkZWZpbmUgdGhlIGZpZWxkcyB3ZSBuZWVkIHRvIGFjdHVhbGx5IGltcGxlbWVudCB0aGlzCiAqICAgIGludGVyZmFjZTogcmVmZXJlbmNlIGNvdW50LCBwb2ludGVyIHRvIG90aGVyIHJlc291cmNlcyBhbmQgbWlzY2VsbGFuZW91cyBmaWVsZHMuIFRoYXQncwogKiAgICBiZWNhdXNlIHRoZXNlIGludGVyZmFjZXMgYXJlIGp1c3QgdGhhdDogaW50ZXJmYWNlcy4gVGhleSBtYXkgYmUgaW1wbGVtZW50ZWQgbW9yZSB0aGFuIG9uY2UsIGluCiAqICAgIGRpZmZlcmVudCBjb250ZXh0cyBhbmQgc29tZXRpbWVzIG5vdCBldmVuIGluIFdpbmUuIFRodXMgaXQgd291bGQgbm90IG1ha2Ugc2Vuc2UgdG8gaW1wb3NlCiAqICAgIHRoYXQgdGhlIGludGVyZmFjZSBjb250YWlucyBzb21lIHNwZWNpZmljIGZpZWxkcy4KICoKICoKICogSW4gQyB0aGlzIGdpdmVzOgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWdGJsIElEaXJlY3QzRFZ0Ymw7CiAqICAgIHN0cnVjdCBJRGlyZWN0M0QgewogKiAgICAgICAgSURpcmVjdDNEVnRibCogbHBWdGJsOwogKiAgICB9OwogKiAgICBzdHJ1Y3QgSURpcmVjdDNEVnRibCB7CiAqICAgICAgICBIUkVTVUxUICgqUXVlcnlJbnRlcmZhY2UpKElEaXJlY3QzRCogbWUsIFJFRklJRCByaWlkLCBMUFZPSUQqIHBwdk9iaik7CiAqICAgICAgICBVTE9ORyAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lKTsKICogICAgICAgIFVMT05HICgqUXVlcnlJbnRlcmZhY2UpKElEaXJlY3QzRCogbWUpOwogKiAgICAgICAgSFJFU1VMVCAoKkluaXRpYWxpemUpKElEaXJlY3QzRCogbWUsIFJFRklJRCBhKTsKICogICAgICAgIEhSRVNVTFQgKCpFbnVtRGV2aWNlcykoSURpcmVjdDNEKiBtZSwgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGEsIExQVk9JRCBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVMaWdodCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRExJR0hUKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlTWF0ZXJpYWwpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RNQVRFUklBTCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZVZpZXdwb3J0KShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNEVklFV1BPUlQqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpGaW5kRGV2aWNlKShJRGlyZWN0M0QqIG1lLCBMUEQzREZJTkRERVZJQ0VTRUFSQ0ggYSwgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGIpOwogKiAgICB9OwogKgogKiAgICAjaWZkZWYgQ09CSk1BQ1JPUwogKiAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQWRkUmVmKHApICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKICogICAgI2RlZmluZSBJRGlyZWN0M0RfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiAqICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfSW5pdGlhbGl6ZShwLGEpICAgICAgIChwKS0+bHBWdGJsLT5Jbml0aWFsaXplKHAsYSkKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRW51bURldmljZXMocCxhLGIpICAgIChwKS0+bHBWdGJsLT5FbnVtRGV2aWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVMaWdodChwLGEsYikgICAgKHApLT5scFZ0YmwtPkNyZWF0ZUxpZ2h0KHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVNYXRlcmlhbChwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZU1hdGVyaWFsKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVWaWV3cG9ydChwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZVZpZXdwb3J0KHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9GaW5kRGV2aWNlKHAsYSxiKSAgICAgKHApLT5scFZ0YmwtPkZpbmREZXZpY2UocCxhLGIpCiAqICAgICNlbmRpZgogKgogKiBDb21tZW50czoKICogIC0gSURpcmVjdDNEIG9ubHkgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBJRGlyZWN0M0QgdmlydHVhbC9qdW1wIHRhYmxlLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nCiAqICAgIHRoZSB1c2VyIG5lZWRzIHRvIGtub3cgdG8gdXNlIHRoZSBpbnRlcmZhY2UuIE9mIGNvdXJzZSB0aGUgc3RydWN0dXJlIHdlIHdpbGwgZGVmaW5lIHRvCiAqICAgIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aWxsIGhhdmUgbW9yZSBmaWVsZHMgYnV0IHRoZSBmaXJzdCBvbmUgd2lsbCBtYXRjaCB0aGlzIHBvaW50ZXIuCiAqICAtIFRoZSBjb2RlIGdlbmVyYXRlZCBieSBERUNMQVJFX0lOVEVSRkFDRSBkZWZpbmVzIGJvdGggdGhlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGludGVyZmFjZSBhbmQKICogICAgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIGp1bXAgdGFibGUuCiAqICAtIEVhY2ggbWV0aG9kIGlzIGRlY2xhcmVkIGFzIGEgcG9pbnRlciB0byBmdW5jdGlvbiBmaWVsZCBpbiB0aGUganVtcCB0YWJsZS4gVGhlIGltcGxlbWVudGF0aW9uCiAqICAgIHdpbGwgZmlsbCB0aGlzIGp1bXAgdGFibGUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMsIHByb2JhYmx5IHVzaW5nIGEgc3RhdGljIHZhcmlhYmxlLCBhbmQKICogICAgaW5pdGlhbGl6ZSB0aGUgbHBWdGJsIGZpZWxkIHRvIHBvaW50IHRvIHRoaXMgdmFyaWFibGUuCiAqICAtIFRoZSBJRGlyZWN0M0RfWHh4IG1hY3JvcyB0aGVuIGp1c3QgZGVyZWZlbmNlIHRoZSBscFZ0YmwgcG9pbnRlciBhbmQgdXNlIHRoZSBmdW5jdGlvbiBwb2ludGVyCiAqICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hY3JvIG5hbWUuIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGEgdmlydHVhbCB0YWJsZSBhbmQgc2hvdWxkIGJlCiAqICAgIGp1c3QgYXMgZmFzdC4KICogIC0gVGhpcyBDIGNvZGUgc2hvdWxkIGJlIHF1aXRlIGNvbXBhdGlibGUgd2l0aCB0aGUgV2luZG93cyBoZWFkZXJzIGJvdGggZm9yIGNvZGUgdGhhdCB1c2VzIENPTQogKiAgICBpbnRlcmZhY2VzIGFuZCBmb3IgY29kZSBpbXBsZW1lbnRpbmcgYSBDT00gaW50ZXJmYWNlLgogKgogKgogKiBBbmQgaW4gQysrICh3aXRoIGdjYydzIGcrKyk6CiAqCiAqICAgIHR5cGVkZWYgc3RydWN0IElEaXJlY3QzRDogcHVibGljIElVbmtub3duIHsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBJbml0aWFsaXplKFJFRklJRCBhKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgRW51bURldmljZXMoTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGEsIExQVk9JRCBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlTGlnaHQoTFBESVJFQ1QzRExJR0hUKiBhLCBJVW5rbm93biogYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZU1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCogYSwgSVVua25vd24qIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVWaWV3cG9ydChMUERJUkVDVDNEVklFV1BPUlQqIGEsIElVbmtub3duKiBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgRmluZERldmljZShMUEQzREZJTkRERVZJQ0VTRUFSQ0ggYSwgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGIpID0gMDsKICogICAgfTsKICoKICogQ29tbWVudHM6CiAqICAtIE9mIGNvdXJzZSBpbiBDKysgd2UgdXNlIGluaGVyaXRhbmNlIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIG1ldGhvZCBkZWZpbml0aW9ucy4KICogIC0gRmluYWxseSB0aGVyZSBpcyBubyBJRGlyZWN0M0RfWHh4IG1hY3JvLiBUaGVzZSBhcmUgbm90IG5lZWRlZCBpbiBDKysgdW5sZXNzIHRoZSBDSU5URVJGQUNFCiAqICAgIG1hY3JvIGlzIGRlZmluZWQgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBub3QgYmUgaGVyZS4KICoKICoKICogSW1wbGVtZW50aW5nIGEgQ09NIGludGVyZmFjZS4KICoKICogVGhpcyBjb250aW51ZXMgdGhlIGFib3ZlIGV4YW1wbGUuIFRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGluIEMuCiAqCiAqICAgIHR5cGVkZWYgc3RydWN0IElEaXJlY3QzREltcGwgewogKiAgICAgICAgdm9pZCogbHBWdGJsOwogKiAgICAgICAgLy8gLi4uCiAqCiAqICAgIH0gSURpcmVjdDNESW1wbDsKICoKICogICAgc3RhdGljIElEaXJlY3QzRFZ0YmwgZDNkdnQ7CiAqCiAqICAgIC8vIGltcGxlbWVudCB0aGUgSURpcmVjdDNEIG1ldGhvZHMgaGVyZQogKgogKiAgICBpbnQgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRCogbWUpCiAqICAgIHsKICogICAgICAgIElEaXJlY3QzREltcGwgKlRoaXMgPSAoSURpcmVjdDNESW1wbCAqKW1lOwogKiAgICAgICAgLy8gLi4uCiAqICAgIH0KICoKICogICAgLy8gLi4uCiAqCiAqICAgIHN0YXRpYyBJRGlyZWN0M0RWdGJsIGQzZHZ0ID0gewogKiAgICAgICAgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlLAogKiAgICAgICAgSURpcmVjdDNEX0FkZCwKICogICAgICAgIElEaXJlY3QzRF9BZGQyLAogKiAgICAgICAgSURpcmVjdDNEX0luaXRpYWxpemUsCiAqICAgICAgICBJRGlyZWN0M0RfU2V0V2lkdGgKICogICAgfTsKICoKICogQ29tbWVudHM6CiAqICAtIFdlIGZpcnN0IGRlZmluZSB3aGF0IHRoZSBpbnRlcmZhY2UgcmVhbGx5IGNvbnRhaW5zLiBUaGlzIGlzIHRoZSBJRGlyZWN0M0RJbXBsIHN0cnVjdHVyZS4gVGhlCiAqICAgIGZpcnN0IGZpZWxkIG11c3Qgb2YgY291cnNlIGJlIHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBmcmVlLgogKiAgLSBUaGVuIHdlIHByZWRlY2xhcmUgb3VyIHN0YXRpYyB2aXJ0dWFsIHRhYmxlIHZhcmlhYmxlLCB3ZSB3aWxsIG5lZWQgaXRzIGFkZHJlc3MgaW4gc29tZQogKiAgICBtZXRob2RzIHRvIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUgcG9pbnRlciBvZiB0aGUgcmV0dXJuZWQgaW50ZXJmYWNlIG9iamVjdHMuCiAqICAtIFRoZW4gd2UgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgbWV0aG9kcy4gVG8gbWF0Y2ggd2hhdCBoYXMgYmVlbiBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUKICogICAgdGhleSBtdXN0IHRha2UgYSBwb2ludGVyIHRvIGEgSURpcmVjdDNEIHN0cnVjdHVyZSBhbmQgd2UgbXVzdCBjYXN0IGl0IHRvIGFuIElEaXJlY3QzREltcGwgc28KICogICAgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgZmllbGRzLgogKiAgLSBGaW5hbGx5IHdlIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUuCiAqLwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKENJTlRFUkZBQ0UpCgovKiBDKysgaW50ZXJmYWNlICovCgojZGVmaW5lIFNURE1FVEhPRChtZXRob2QpICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWKG1ldGhvZCkgICAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKCiNkZWZpbmUgUFVSRSAgID0gMAojZGVmaW5lIFRISVNfCiNkZWZpbmUgVEhJUyAgIHZvaWQKCiNkZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSAgICAgICAgaW50ZXJmYWNlIGlmYWNlCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0VfKGlmYWNlLGliYXNlKSBpbnRlcmZhY2UgaWZhY2UgOiBwdWJsaWMgaWJhc2UKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2Vsc2UgIC8qIF9fY3BsdXNwbHVzICYmICFDSU5URVJGQUNFICovCgovKiBDIGludGVyZmFjZSAqLwoKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSAgICAgICAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKm1ldGhvZCkKI2RlZmluZSBTVERNRVRIT0RfKHR5cGUsbWV0aG9kKSAgdHlwZSAoU1RETUVUSE9EQ0FMTFRZUEUgKm1ldGhvZCkKI2RlZmluZSBTVERNRVRIT0RWKG1ldGhvZCkgICAgICAgSFJFU1VMVCAoU1RETUVUSE9EVkNBTExUWVBFICptZXRob2QpCiNkZWZpbmUgU1RETUVUSE9EVl8odHlwZSxtZXRob2QpIHR5cGUgKFNURE1FVEhPRFZDQUxMVFlQRSAqbWV0aG9kKQoKI2RlZmluZSBQVVJFCiNkZWZpbmUgVEhJU18gSU5URVJGQUNFICpUaGlzLAojZGVmaW5lIFRISVMgIElOVEVSRkFDRSAqVGhpcwoKI2RlZmluZSBpbnRlcmZhY2Ugc3RydWN0CgojaWZkZWYgQ09OU1RfVlRBQkxFCiN1bmRlZiBDT05TVF9WVEJMCiNkZWZpbmUgQ09OU1RfVlRCTCBjb25zdAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSBcCiAgICAgICAgIC8qdHlwZWRlZiovIGludGVyZmFjZSBpZmFjZSB7IGNvbnN0IHN0cnVjdCBpZmFjZSMjVnRibCAqbHBWdGJsOyB9IC8qaWZhY2UqLzsgXAogICAgICAgICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2Vsc2UKI3VuZGVmIENPTlNUX1ZUQkwKI2RlZmluZSBDT05TVF9WVEJMCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpIFwKICAgICAgICAgLyp0eXBlZGVmKi8gaW50ZXJmYWNlIGlmYWNlIHsgc3RydWN0IGlmYWNlIyNWdGJsICpscFZ0Ymw7IH0gLyppZmFjZSovOyBcCiAgICAgICAgIHR5cGVkZWYgc3RydWN0IGlmYWNlIyNWdGJsIGlmYWNlIyNWdGJsOyBcCiAgICAgICAgIHN0cnVjdCBpZmFjZSMjVnRibAojZW5kaWYKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRV8oaWZhY2UsaWJhc2UpIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKQoKI2RlZmluZSBCRUdJTl9JTlRFUkZBQ0UKI2RlZmluZSBFTkRfSU5URVJGQUNFCgojZW5kaWYgIC8qIF9fY3BsdXNwbHVzICYmICFDSU5URVJGQUNFICovCgojaW5jbHVkZSA8b2JqaWRsLmg+CgojaWZuZGVmIFJDX0lOVk9LRUQKLyogRm9yIGNvbXBhdGliaWxpdHkgb25seSwgYXQgbGVhc3QgZm9yIG5vdyAqLwojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmbmRlZiBJTklUR1VJRAojaW5jbHVkZSA8Y2d1aWQuaD4KI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2lmbmRlZiBOT05BTUVMRVNTU1RSVUNUCiNkZWZpbmUgTElTZXQzMihsaSwgdikgICAoKGxpKS5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkuTG93UGFydCA9ICh2KSkKI2RlZmluZSBVTElTZXQzMihsaSwgdikgICgobGkpLkhpZ2hQYXJ0ID0gMCwgKGxpKS5Mb3dQYXJ0ID0gKHYpKQojZWxzZQojZGVmaW5lIExJU2V0MzIobGksIHYpICAgKChsaSkudS5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkudS5Mb3dQYXJ0ID0gKHYpKQojZGVmaW5lIFVMSVNldDMyKGxpLCB2KSAgKChsaSkudS5IaWdoUGFydCA9IDAsIChsaSkudS5Mb3dQYXJ0ID0gKHYpKQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTdGFuZGFyZCBBUEkKICovCkRXT1JEIFdJTkFQSSBDb0J1aWxkVmVyc2lvbih2b2lkKTsKCnR5cGVkZWYgZW51bSB0YWdDT0lOSVQKewogICAgQ09JTklUX0FQQVJUTUVOVFRIUkVBREVEICA9IDB4MiwgLyogQXBhcnRtZW50IG1vZGVsICovCiAgICBDT0lOSVRfTVVMVElUSFJFQURFRCAgICAgID0gMHgwLCAvKiBPTEUgY2FsbHMgb2JqZWN0cyBvbiBhbnkgdGhyZWFkICovCiAgICBDT0lOSVRfRElTQUJMRV9PTEUxRERFICAgID0gMHg0LCAvKiBEb24ndCB1c2UgRERFIGZvciBPbGUxIHN1cHBvcnQgKi8KICAgIENPSU5JVF9TUEVFRF9PVkVSX01FTU9SWSAgPSAweDggIC8qIFRyYWRlIG1lbW9yeSBmb3Igc3BlZWQgKi8KfSBDT0lOSVQ7CgpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUoTFBWT0lEIGxwUmVzZXJ2ZWQpOwpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVFeChMUFZPSUQgbHBSZXNlcnZlZCwgRFdPUkQgZHdDb0luaXQpOwp2b2lkIFdJTkFQSSBDb1VuaW5pdGlhbGl6ZSh2b2lkKTsKRFdPUkQgV0lOQVBJIENvR2V0Q3VycmVudFByb2Nlc3Modm9pZCk7CgpISU5TVEFOQ0UgV0lOQVBJIENvTG9hZExpYnJhcnkoTFBPTEVTVFIgbHBzekxpYk5hbWUsIEJPT0wgYkF1dG9GcmVlKTsKdm9pZCBXSU5BUEkgQ29GcmVlQWxsTGlicmFyaWVzKHZvaWQpOwp2b2lkIFdJTkFQSSBDb0ZyZWVMaWJyYXJ5KEhJTlNUQU5DRSBoTGlicmFyeSk7CnZvaWQgV0lOQVBJIENvRnJlZVVudXNlZExpYnJhcmllcyh2b2lkKTsKCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVua091dGVyLCBEV09SRCBkd0Nsc0NvbnRleHQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVJbnN0YW5jZUV4KFJFRkNMU0lEICAgICAgcmNsc2lkLAoJCQkJICBMUFVOS05PV04gICAgIHBVbmtPdXRlciwKCQkJCSAgRFdPUkQgICAgICAgICBkd0Nsc0NvbnRleHQsCgkJCQkgIENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sCgkJCQkgIFVMT05HICAgICAgICAgY21xLAoJCQkJICBNVUxUSV9RSSogICAgIHBSZXN1bHRzKTsKCkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tRmlsZShDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLCBDTFNJRCogcENsc2lkLCBJVW5rbm93biogcHVua091dGVyLCBEV09SRCBkd0Nsc0N0eCwgRFdPUkQgZ3JmTW9kZSwgT0xFQ0hBUiogcHdzek5hbWUsIERXT1JEIGR3Q291bnQsIE1VTFRJX1FJKiBwUmVzdWx0cyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tSVN0b3JhZ2UoQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywgQ0xTSUQqIHBDbHNpZCwgSVVua25vd24qIHB1bmtPdXRlciwgRFdPUkQgZHdDbHNDdHgsIElTdG9yYWdlKiBwc3RnLCBEV09SRCBkd0NvdW50LCBNVUxUSV9RSSogcFJlc3VsdHMpOwoKSFJFU1VMVCBXSU5BUEkgQ29HZXRNYWxsb2MoRFdPUkQgZHdNZW1Db250ZXh0LCBMUE1BTExPQyogbHBNYWxsb2MpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbUFsbG9jKFVMT05HIHNpemUpOwp2b2lkIFdJTkFQSSBDb1Rhc2tNZW1GcmVlKExQVk9JRCBwdHIpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbVJlYWxsb2MoTFBWT0lEIHB0ciwgVUxPTkcgc2l6ZSk7CgpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWFsbG9jU3B5KExQTUFMTE9DU1BZIHBNYWxsb2NTcHkpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZU1hbGxvY1NweSh2b2lkKTsKCi8qIGNsYXNzIHJlZ2lzdHJhdGlvbiBmbGFnczsgcGFzc2VkIHRvIENvUmVnaXN0ZXJDbGFzc09iamVjdCAqLwp0eXBlZGVmIGVudW0gdGFnUkVHQ0xTCnsKICAgIFJFR0NMU19TSU5HTEVVU0UgPSAwLAogICAgUkVHQ0xTX01VTFRJUExFVVNFID0gMSwKICAgIFJFR0NMU19NVUxUSV9TRVBBUkFURSA9IDIsCiAgICBSRUdDTFNfU1VTUEVOREVEID0gNAp9IFJFR0NMUzsKCkhSRVNVTFQgV0lOQVBJIENvR2V0Q2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBEV09SRCBkd0Nsc0NvbnRleHQsIENPU0VSVkVSSU5GTyAqcFNlcnZlckluZm8sIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3RlckNsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxMUFVOS05PV04gcFVuayxEV09SRCBkd0Nsc0NvbnRleHQsRFdPUkQgZmxhZ3MsTFBEV09SRCBscGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZUNsYXNzT2JqZWN0KERXT1JEIGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb0dldFBTQ2xzaWQoUkVGSUlEIHJpaWQsQ0xTSUQgKnBjbHNpZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJQU0Nsc2lkKFJFRklJRCByaWlkLCBSRUZDTFNJRCByY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1N1c3BlbmRDbGFzc09iamVjdHModm9pZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVzdW1lQ2xhc3NPYmplY3RzKHZvaWQpOwpVTE9ORyBXSU5BUEkgQ29BZGRSZWZTZXJ2ZXJQcm9jZXNzKHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1JlbGVhc2VTZXJ2ZXJQcm9jZXNzKHZvaWQpOwoKLyogbWFyc2hhbGxpbmcgKi8KSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVGcmVlVGhyZWFkZWRNYXJzaGFsZXIoTFBVTktOT1dOIHB1bmtPdXRlciwgTFBVTktOT1dOKiBwcHVua01hcnNoYWwpOwpIUkVTVUxUIFdJTkFQSSBDb0dldEludGVyZmFjZUFuZFJlbGVhc2VTdHJlYW0oTFBTVFJFQU0gcFN0bSwgUkVGSUlEIGlpZCwgTFBWT0lEKiBwcHYpOwpIUkVTVUxUIFdJTkFQSSBDb0dldE1hcnNoYWxTaXplTWF4KFVMT05HKiBwdWxTaXplLCBSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MpOwpIUkVTVUxUIFdJTkFQSSBDb0dldFN0YW5kYXJkTWFyc2hhbChSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MsIExQTUFSU0hBTCogcHBNYXJzaGFsKTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSHJlc3VsdChMUFNUUkVBTSBwc3RtLCBIUkVTVUxUIGhyZXN1bHQpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxJbnRlcmZhY2UoTFBTVFJFQU0gcFN0bSwgUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzKTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSW50ZXJUaHJlYWRJbnRlcmZhY2VJblN0cmVhbShSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIExQU1RSRUFNKiBwcFN0bSk7CkhSRVNVTFQgV0lOQVBJIENvUmVsZWFzZU1hcnNoYWxEYXRhKExQU1RSRUFNIHBTdG0pOwpIUkVTVUxUIFdJTkFQSSBDb0Rpc2Nvbm5lY3RPYmplY3QoTFBVTktOT1dOIGxwVW5rLCBEV09SRCByZXNlcnZlZCk7CkhSRVNVTFQgV0lOQVBJIENvVW5tYXJzaGFsSHJlc3VsdChMUFNUUkVBTSBwc3RtLCBIUkVTVUxUKiBwaHJlc3VsdCk7CkhSRVNVTFQgV0lOQVBJIENvVW5tYXJzaGFsSW50ZXJmYWNlKExQU1RSRUFNIHBTdG0sIFJFRklJRCByaWlkLCBMUFZPSUQqIHBwdik7CkhSRVNVTFQgV0lOQVBJIENvTG9ja09iamVjdEV4dGVybmFsKExQVU5LTk9XTiBwVW5rLCBCT09MIGZMb2NrLCBCT09MIGZMYXN0VW5sb2NrUmVsZWFzZXMpOwpCT09MIFdJTkFQSSBDb0lzSGFuZGxlckNvbm5lY3RlZChMUFVOS05PV04gcFVuayk7CgovKiBzZWN1cml0eSAqLwpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVTZWN1cml0eShQU0VDVVJJVFlfREVTQ1JJUFRPUiBwU2VjRGVzYywgTE9ORyBjQXV0aFN2YywgU09MRV9BVVRIRU5USUNBVElPTl9TRVJWSUNFKiBhc0F1dGhTdmMsIHZvaWQqIHBSZXNlcnZlZDEsIERXT1JEIGR3QXV0aG5MZXZlbCwgRFdPUkQgZHdJbXBMZXZlbCwgdm9pZCogcFJlc2VydmVkMiwgRFdPUkQgZHdDYXBhYmlsaXRpZXMsIHZvaWQqIHBSZXNlcnZlZDMpOwpIUkVTVUxUIFdJTkFQSSBDb0dldENhbGxDb250ZXh0KFJFRklJRCByaWlkLCB2b2lkKiogcHBJbnRlcmZhY2UpOwpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5QXV0aGVudGljYXRpb25TZXJ2aWNlcyhEV09SRCogcGNBdXRoU3ZjLCBTT0xFX0FVVEhFTlRJQ0FUSU9OX1NFUlZJQ0UqKiBhc0F1dGhTdmMpOwoKSFJFU1VMVCBXSU5BUEkgQ29RdWVyeVByb3h5QmxhbmtldChJVW5rbm93biogcFByb3h5LCBEV09SRCogcHdBdXRoblN2YywgRFdPUkQqIHBBdXRoelN2YywgT0xFQ0hBUioqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEKiBwQXV0aG5MZXZlbCwgRFdPUkQqIHBJbXBMZXZlbCwgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFKiBwQXV0aEluZm8sIERXT1JEKiBwQ2FwYWJpbGl0ZXMpOwpIUkVTVUxUIFdJTkFQSSBDb1NldFByb3h5QmxhbmtldChJVW5rbm93biogcFByb3h5LCBEV09SRCBkd0F1dGhuU3ZjLCBEV09SRCBkd0F1dGh6U3ZjLCBPTEVDSEFSKiBwU2VydmVyUHJpbmNOYW1lLCBEV09SRCBkd0F1dGhuTGV2ZWwsIERXT1JEIGR3SW1wTGV2ZWwsIFJQQ19BVVRIX0lERU5USVRZX0hBTkRMRSBwQXV0aEluZm8sIERXT1JEIGR3Q2FwYWJpbGl0aWVzKTsKSFJFU1VMVCBXSU5BUEkgQ29Db3B5UHJveHkoSVVua25vd24qIHBQcm94eSwgSVVua25vd24qKiBwcENvcHkpOwoKSFJFU1VMVCBXSU5BUEkgQ29JbXBlcnNvbmF0ZUNsaWVudCh2b2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29RdWVyeUNsaWVudEJsYW5rZXQoRFdPUkQqIHBBdXRoblN2YywgRFdPUkQqIHBBdXRoelN2YywgT0xFQ0hBUioqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEKiBwQXV0aG5MZXZlbCwgRFdPUkQqIHBJbXBMZXZlbCwgUlBDX0FVVEhaX0hBTkRMRSogcFByaXZzLCBEV09SRCogcENhcGFiaWxpdGllcyk7CkhSRVNVTFQgV0lOQVBJIENvUmV2ZXJ0VG9TZWxmKHZvaWQpOwoKLyogbWlzYyAqLwpIUkVTVUxUIFdJTkFQSSBDb0dldFRyZWF0QXNDbGFzcyhSRUZDTFNJRCBjbHNpZE9sZCwgTFBDTFNJRCBwQ2xzaWROZXcpOwpIUkVTVUxUIFdJTkFQSSBDb1RyZWF0QXNDbGFzcyhSRUZDTFNJRCBjbHNpZE9sZCwgUkVGQ0xTSUQgY2xzaWROZXcpOwoKSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVHdWlkKEdVSUQqIHBndWlkKTsKQk9PTCBXSU5BUEkgQ29Jc09sZTFDbGFzcyhSRUZDTFNJRCByY2xzaWQpOwoKQk9PTCBXSU5BUEkgQ29Eb3NEYXRlVGltZVRvRmlsZVRpbWUoV09SRCBuRG9zRGF0ZSwgV09SRCBuRG9zVGltZSwgRklMRVRJTUUqIGxwRmlsZVRpbWUpOwpCT09MIFdJTkFQSSBDb0ZpbGVUaW1lVG9Eb3NEYXRlVGltZShGSUxFVElNRSogbHBGaWxlVGltZSwgV09SRCogbHBEb3NEYXRlLCBXT1JEKiBscERvc1RpbWUpOwpIUkVTVUxUIFdJTkFQSSBDb0ZpbGVUaW1lTm93KEZJTEVUSU1FKiBscEZpbGVUaW1lKTsKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIoTFBNRVNTQUdFRklMVEVSIGxwTWVzc2FnZUZpbHRlcixMUE1FU1NBR0VGSUxURVIgKmxwbHBNZXNzYWdlRmlsdGVyKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHVUlEIEFQSQogKi8KSFJFU1VMVCBXSU5BUEkgU3RyaW5nRnJvbUNMU0lEKFJFRkNMU0lEIGlkLCBMUE9MRVNUUiopOwpIUkVTVUxUIFdJTkFQSSBDTFNJREZyb21TdHJpbmcoTFBPTEVTVFIsIENMU0lEICopOwpIUkVTVUxUIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQoTFBDT0xFU1RSIHByb2dpZCwgTFBDTFNJRCByaWlkKTsKSFJFU1VMVCBXSU5BUEkgUHJvZ0lERnJvbUNMU0lEKFJFRkNMU0lEIGNsc2lkLCBMUE9MRVNUUiAqbHBscHN6UHJvZ0lEKTsKCklOVCBXSU5BUEkgU3RyaW5nRnJvbUdVSUQyKFJFRkdVSUQgaWQsIExQT0xFU1RSIHN0ciwgSU5UIGNtYXgpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNPTSBTZXJ2ZXIgZGxsIC0gZXhwb3J0cwogKi8KSFJFU1VMVCBXSU5BUEkgRGxsR2V0Q2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2KTsKSFJFU1VMVCBXSU5BUEkgRGxsQ2FuVW5sb2FkTm93KHZvaWQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURhdGEgT2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVEYXRhQWR2aXNlSG9sZGVyKExQREFUQUFEVklTRUhPTERFUiogcHBEQUhvbGRlcik7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZURhdGFDYWNoZShMUFVOS05PV04gcFVua091dGVyLCBSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCogcHB2KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglNb25pa2VyIEFQSQogKi8KSFJFU1VMVCBXSU5BUEkgR2V0Q2xhc3NGaWxlKExQQ09MRVNUUiBmaWxlUGF0aE5hbWUsQ0xTSUQgKnBjbHNpZCk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVCaW5kQ3R4KERXT1JEIHJlc2VydmVkLCBMUEJDKiBwcGJjKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUZpbGVNb25pa2VyKExQQ09MRVNUUiBscHN6UGF0aE5hbWUsIExQTU9OSUtFUiogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVJdGVtTW9uaWtlcihMUENPTEVTVFIgbHBzekRlbGltLCBMUENPTEVTVFIgIGxwc3pJdGVtLCBMUE1PTklLRVIqIHBwbWspOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQW50aU1vbmlrZXIoTFBNT05JS0VSICogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVHZW5lcmljQ29tcG9zaXRlKExQTU9OSUtFUiBwbWtGaXJzdCwgTFBNT05JS0VSIHBta1Jlc3QsIExQTU9OSUtFUiogcHBta0NvbXBvc2l0ZSk7CgpIUkVTVUxUIFdJTkFQSSBCaW5kTW9uaWtlcihMUE1PTklLRVIgcG1rLCBEV09SRCBncmZPcHQsIFJFRklJRCBpaWRSZXN1bHQsIExQVk9JRCogcHB2UmVzdWx0KTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUNsYXNzTW9uaWtlcihSRUZDTFNJRCByY2xzaWQsIExQTU9OSUtFUiogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVQb2ludGVyTW9uaWtlcihMUFVOS05PV04gcHVuaywgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIE1vbmlrZXJDb21tb25QcmVmaXhXaXRoKElNb25pa2VyKiBwbWtUaGlzLElNb25pa2VyKiBwbWtPdGhlcixJTW9uaWtlcioqIHBwbWtDb21tb24pOwoKSFJFU1VMVCBXSU5BUEkgR2V0UnVubmluZ09iamVjdFRhYmxlKERXT1JEIHJlc2VydmVkLCBMUFJVTk5JTkdPQkpFQ1RUQUJMRSAqcHByb3QpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0b3JhZ2UgQVBJCiAqLwojZGVmaW5lIFNUR01fRElSRUNUCQkweDAwMDAwMDAwCiNkZWZpbmUgU1RHTV9UUkFOU0FDVEVECQkweDAwMDEwMDAwCiNkZWZpbmUgU1RHTV9TSU1QTEUJCTB4MDgwMDAwMDAKI2RlZmluZSBTVEdNX1JFQUQJCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX1dSSVRFCQkweDAwMDAwMDAxCiNkZWZpbmUgU1RHTV9SRUFEV1JJVEUJCTB4MDAwMDAwMDIKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfTk9ORQkweDAwMDAwMDQwCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX1JFQUQJMHgwMDAwMDAzMAojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9XUklURQkweDAwMDAwMDIwCiNkZWZpbmUgU1RHTV9TSEFSRV9FWENMVVNJVkUJMHgwMDAwMDAxMAojZGVmaW5lIFNUR01fUFJJT1JJVFkJCTB4MDAwNDAwMDAKI2RlZmluZSBTVEdNX0RFTEVURU9OUkVMRUFTRQkweDA0MDAwMDAwCiNkZWZpbmUgU1RHTV9DUkVBVEUJCTB4MDAwMDEwMDAKI2RlZmluZSBTVEdNX0NPTlZFUlQJCTB4MDAwMjAwMDAKI2RlZmluZSBTVEdNX0ZBSUxJRlRIRVJFCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX05PU0NSQVRDSAkJMHgwMDEwMDAwMAojZGVmaW5lIFNUR01fTk9TTkFQU0hPVAkJMHgwMDIwMDAwMAoKdHlwZWRlZiBzdHJ1Y3QgdGFnU1RHT1BUSU9OUwp7CiAgICBVU0hPUlQgdXNWZXJzaW9uOwogICAgVVNIT1JUIHJlc2VydmVkOwogICAgVUxPTkcgdWxTZWN0b3JTaXplOwogICAgY29uc3QgV0NIQVIqIHB3Y3NUZW1wbGF0ZUZpbGU7Cn0gU1RHT1BUSU9OUzsKCkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGUoTFBDT0xFU1RSIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdDcmVhdGVTdG9yYWdlRXgoY29uc3QgV0NIQVIqLERXT1JELERXT1JELERXT1JELFNUR09QVElPTlMqLHZvaWQqLFJFRklJRCx2b2lkKiopOwpIUkVTVUxUIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlKExQQ09MRVNUUiBmbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0KTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2UoY29uc3QgT0xFQ0hBUiogcHdjc05hbWUsSVN0b3JhZ2UqIHBzdGdQcmlvcml0eSxEV09SRCBncmZNb2RlLFNOQiBzbmJFeGNsdWRlLERXT1JEIHJlc2VydmVkLElTdG9yYWdlKipwcHN0Z09wZW4pOwoKSFJFU1VMVCBXSU5BUEkgV3JpdGVDbGFzc1N0ZyhJU3RvcmFnZSogcFN0ZywgUkVGQ0xTSUQgcmNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgUmVhZENsYXNzU3RnKElTdG9yYWdlICpwc3RnLENMU0lEICpwY2xzaWQpOwoKSFJFU1VMVCBXSU5BUEkgU3RnQ3JlYXRlRG9jZmlsZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQsRFdPUkQgZ3JmTW9kZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlKiogcHBzdGdPcGVuKTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2VPbklMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0LCBJU3RvcmFnZSAqcHN0Z1ByaW9yaXR5LCBEV09SRCBncmZNb2RlLCBTTkIgc25iRXhjbHVkZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlICoqcHBzdGdPcGVuKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKLyogRklYTUU6ICNpbmNsdWRlIDx1cmxtb24uaD4gKi8KI2luY2x1ZGUgPHByb3BpZGwuaD4KCiNpZm5kZWYgX19XSU5FU1JDX18KCiNkZWZpbmUgRkFSU1RSVUNUCiNkZWZpbmUgSFVHRVAKCiNkZWZpbmUgV0lOT0xFQVBJICAgICAgICBTVERBUEkKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIFNUREFQSV8odHlwZSkKCiNlbmRpZiAvKiBfX1dJTkVTUkNfXyAqLwoKI2VuZGlmIC8qIF9PQkpCQVNFX0hfICovCg==