LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxycGMuaD4KI2luY2x1ZGUgPHJwY25kci5oPgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZGVmaW5lIElDT01fTVNWVEFCTEVfQ09NUEFUCiAqIHRvIGltcGxlbWVudCB0aGUgbWljcm9zb2Z0IGNvbSB2dGFibGUgY29tcGF0aWJpbGl0eSB3b3JrYXJvdW5kIGZvciBnKysuCiAqCiAqIE5PVEU6IFR1cm5pbmcgdGhpcyBvcHRpb24gb24gd2lsbCBwcm9kdWNlIGEgd2luZWxpYiB0aGF0IGlzIGluY29tcGF0aWJsZQogKiB3aXRoIHRoZSBiaW5hcnkgZW11bGF0b3IuCiAqCiAqIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgY29tX2ludGVyZmFjZSBhdHRyaWJ1dGUsIGxlYXZlIHRoaXMgb2ZmLCBhbmQKICogZGVmaW5lIHRoZSBJQ09NX1VTRV9DT01fSU5URVJGQUNFX0FUVFJJQlVURSBtYWNybyBiZWxvdy4gVGhpcyBtYXkgYWxzbwogKiByZXF1aXJlIHRoZSBhZGRpdGlvbiBvZiB0aGUgLXZ0YWJsZS10aHVua3Mgb3B0aW9uIGZvciBnKysuCiAqCiAqIElmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBXaW5lbGliIEMrKyBjb21wYXRpYmlsaXR5IGF0IGFsbCwgbGVhdmUgYm90aAogKiBvcHRpb25zIG9mZi4KICoKICogVGhlIHByZWZlcmFibGUgbWV0aG9kIGZvciB1c2luZyBJQ09NX1VTRV9DT01fSU5URVJGQUNFX0FUVFJJQlVURSBtYWNybwogKiB3b3VsZCBiZSB0byBkZWZpbmUgaXQgb25seSBmb3IgeW91ciBXaW5lbGliIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cyB5b3UKICogdG8gaGF2ZSBib3RoIGJpbmFyeSBhbmQgV2luZWxpYiBjb21wYXRpYmlsaXR5IGZvciBDIGFuZCBDKysgYXQgdGhlIHNhbWUKICogdGltZSA6KQogKi8KLyogI2RlZmluZSBJQ09NX01TVlRBQkxFX0NPTVBBVCAxICovCi8qICNkZWZpbmUgSUNPTV9VU0VfQ09NX0lOVEVSRkFDRV9BVFRSSUJVVEUgMSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBNYWNyb3MgdG8gZGVmaW5lIGEgQ09NIGludGVyZmFjZQogKi8KLyoKICogVGhlIGdvYWwgb2YgdGhlIGZvbGxvd2luZyBzZXQgb2YgZGVmaW5pdGlvbnMgaXMgdG8gcHJvdmlkZSBhIHdheSB0byB1c2UgdGhlIHNhbWUKICogaGVhZGVyIGZpbGUgZGVmaW5pdGlvbnMgdG8gcHJvdmlkZSBib3RoIGEgQyBpbnRlcmZhY2UgYW5kIGEgQysrIG9iamVjdCBvcmllbnRlZAogKiBpbnRlcmZhY2UgdG8gQ09NIGludGVyZmFjZXMuIFRoZSB0eXBlIG9mIGludGVyZmFjZSBpcyBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5CiAqIGRlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UgYnV0IGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBnZXQgdGhlIEMgaW50ZXJmYWNlIGluIEMrKwogKiBieSBkZWZpbmluZyBDSU5URVJGQUNFLgogKgogKiBJdCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogKiAgLSBhbGwgQ09NIGludGVyZmFjZXMgZGVyaXZlIGZyb20gSVVua25vd24sIHRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uCiAqICAtIHRoZSBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIGludGVyZmFjZSwgdGhlIGFjdHVhbCBmaWVsZHMgYXJlIGRlZmluZWQKICogICAgc2VwYXJhdGVseSBpbiB0aGUgQyBmaWxlIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlLgogKgogKiBUaGUgbmF0dXJhbCBhcHByb2FjaCB0byB0aGlzIHByb2JsZW0gd291bGQgYmUgdG8gbWFrZSBzdXJlIHdlIGdldCBhIEMrKyBjbGFzcyBhbmQKICogdmlydHVhbCBtZXRob2RzIGluIEMrKyBhbmQgYSBzdHJ1Y3R1cmUgd2l0aCBhIHRhYmxlIG9mIHBvaW50ZXIgdG8gZnVuY3Rpb25zIGluIEMuCiAqIFVuZm9ydHVuYXRlbHkgdGhlIGxheW91dCBvZiB0aGUgdmlydHVhbCB0YWJsZSBpcyBjb21waWxlciBzcGVjaWZpYywgdGhlIGxheW91dCBvZgogKiBnKysgdmlydHVhbCB0YWJsZXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoYXQgb2YgYW4gZWdjcyB2aXJ0dWFsIHRhYmxlIHdoaWNoIGlzIG5vdCB0aGUKICogc2FtZSBhcyB0aGF0IGdlbmVyYXRlZCBieSBWaXN1YWwgQysuIFRoZXJlIGFyZSB3b3JrYXJvdW5kcyB0byBtYWtlIHRoZSB2aXJ0dWFsIHRhYmxlcwogKiBjb21wYXRpYmxlIHZpYSBwYWRkaW5nIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBvbmUgd2hpY2ggaXMgaW1wb3NlZCB0byB0aGUgV0lORSBlbXVsYXRvcgogKiBieSB0aGUgV2luZG93cyBiaW5hcmllcywgaS5lLiB0aGUgVmlzdWFsIEMrKyBvbmUsIGlzIHRoZSBtb3N0IGNvbXBhY3Qgb2YgYWxsLgogKgogKiBTbyB0aGUgc29sdXRpb24gSSBmaW5hbGx5IGFkb3B0ZWQgZG9lcyBub3QgdXNlIHZpcnR1YWwgdGFibGVzLiBJbnN0ZWFkIEkgdXNlIGlubGluZQogKiBub24gdmlydHVhbCBtZXRob2RzIHRoYXQgZGVyZWZlcmVuY2UgdGhlIG1ldGhvZCBwb2ludGVyIHRoZW1zZWx2ZXMgYW5kIHBlcmZvcm0gdGhlIGNhbGwuCiAqCiAqIExldCdzIHRha2UgRGlyZWN0M0QgYXMgYW4gZXhhbXBsZToKICoKICogICAgI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNECiAqICAgICNkZWZpbmUgSURpcmVjdDNEX01FVEhPRFMgXAogKiAgICAgICAgSVVua25vd25fTUVUSE9EUyBcCiAqICAgICAgICBTVERNRVRIT0QoSW5pdGlhbGl6ZSkoVEhJU18gUkVGSUlEKSBQVVJFOyBcCiAqICAgICAgICBTVERNRVRIT0QoRW51bURldmljZXMpKFRISVNfIExQRDNERU5VTURFVklDRVNDQUxMQkFDSywgTFBWT0lEKSBQVVJFOyBcCiAqICAgICAgICBTVERNRVRIT0QoQ3JlYXRlTGlnaHQpKFRISVNfIExQRElSRUNUM0RMSUdIVCosIElVbmtub3duKikgUFVSRTsgXAogKiAgICAgICAgU1RETUVUSE9EKENyZWF0ZU1hdGVyaWFsKShUSElTXyBMUERJUkVDVDNETUFURVJJQUwqLCBJVW5rbm93biopIFBVUkU7IFwKICogICAgICAgIFNURE1FVEhPRChDcmVhdGVWaWV3cG9ydCkoVEhJU18gTFBESVJFQ1QzRFZJRVdQT1JUKiwgSVVua25vd24qKSBQVVJFOyBcCiAqICAgICAgICBTVERNRVRIT0QoRmluZERldmljZSkoVEhJU18gTFBEM0RGSU5EREVWSUNFU0VBUkNILCBMUEQzREZJTkRERVZJQ0VSRVNVTFQpIFBVUkU7CiAqICAgIElDT01fREVGSU5FKElEaXJlY3QzRCxJVW5rbm93bikKICogICAgI3VuZGVmIElOVEVSRkFDRQogKgogKiAgICAjaWZkZWYgQ09CSk1BQ1JPUwogKiAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQWRkUmVmKHApICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKICogICAgI2RlZmluZSBJRGlyZWN0M0RfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiAqICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfSW5pdGlhbGl6ZShwLGEpICAgICAgIChwKS0+bHBWdGJsLT5Jbml0aWFsaXplKHAsYSkKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRW51bURldmljZXMocCxhLGIpICAgIChwKS0+bHBWdGJsLT5FbnVtRGV2aWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVMaWdodChwLGEsYikgICAgKHApLT5scFZ0YmwtPkNyZWF0ZUxpZ2h0KHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVNYXRlcmlhbChwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZU1hdGVyaWFsKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVWaWV3cG9ydChwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZVZpZXdwb3J0KHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9GaW5kRGV2aWNlKHAsYSxiKSAgICAgKHApLT5scFZ0YmwtPkZpbmREZXZpY2UocCxhLGIpCiAqICAgICNlbmRpZgogKgogKiBDb21tZW50czoKICogIC0gVGhlIElOVEVSRkFDRSBtYWNybyBpcyB1c2VkIGluIHRoZSBTVERNRVRIT0QgbWFjcm9zIHRvIGRlZmluZSB0aGUgdHlwZSBvZiB0aGUgJ3RoaXMnCiAqICAgIHBvaW50ZXIuIERlZmluaW5nIHRoaXMgbWFjcm8gaGVyZSBzYXZlcyB1cyB0aGUgdHJvdWJsZSBvZiBoYXZpbmcgdG8gcmVwZWF0IHRoZSBpbnRlcmZhY2UKICogICAgbmFtZSBldmVyeXdoZXJlLiBOb3RlIGhvd2V2ZXIgdGhhdCBiZWNhdXNlIG9mIHRoZSB3YXkgbWFjcm9zIHdvcmssIGEgbWFjcm8gbGlrZSBTVERNRVRIT0QKICogICAgY2Fubm90IHVzZSAnSU5URVJGQUNFIyNfVlRBQkxFJyBiZWNhdXNlIHRoaXMgd291bGQgZ2l2ZSAnSU5URVJGQUNFX1ZUQUJMRScgYW5kIG5vdAogKiAgICAnSURpcmVjdDNEX1ZUQUJMRScuCiAqICAtIElDT01fTUVUSE9EUyBkZWZpbmVzIHRoZSBsaXN0IG9mIG1ldGhvZHMgdGhhdCBhcmUgaW5oZXJpdGFibGUgZnJvbSB0aGlzIGludGVyZmFjZS4gSXQgbXVzdAogKiAgICBiZSB3cml0dGVuIG1hbnVhbGx5IChyYXRoZXIgdGhhbiB1c2luZyBhIG1hY3JvIHRvIGdlbmVyYXRlIHRoZSBlcXVpdmFsZW50IGNvZGUpIHRvIGF2b2lkCiAqICAgIG1hY3JvIHJlY3Vyc2lvbiAod2hpY2ggY29tcGlsZXJzIGRvbid0IGxpa2UpLiBJdCBtdXN0IHN0YXJ0IHdpdGggdGhlIE1FVEhPRFMgZGVmaW5pdGlvbgogKiAgICBvZiB0aGUgcGFyZW50IGludGVyZmFjZSBzbyB0aGF0IG1ldGhvZCBpbmhlcml0YW5jZSB3b3JrcyBwcm9wZXJseS4KICogIC0gVGhlIElDT01fREVGSU5FIGZpbmFsbHkgZGVjbGFyZXMgYWxsIHRoZSBzdHJ1Y3R1cmVzIG5lY2Vzc2FyeSBmb3IgdGhlIGludGVyZmFjZS4gV2UgaGF2ZSB0bwogKiAgICBleHBsaWNpdGx5IHVzZSB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIG1hY3JvIGV4cGFuc2lvbiByZWFzb25zIGFnYWluLgogKiAgLSBUaGUgJ3VuZGVmIElOVEVSRkFDRScgaXMgaGVyZSB0byByZW1pbmQgeW91IHRoYXQgdXNpbmcgSU5URVJGQUNFIGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zCiAqICAgIHdpbGwgbm90IHdvcmsuCiAqICAtIEZpbmFsbHkgdGhlIHNldCBvZiAnSURpcmVjdDNEX1h4eCcgbWFjcm9zIGlzIGEgc3RhbmRhcmQgc2V0IG9mIG1hY3JvcyBkZWZpbmVkIHRvIGVhc2UgYWNjZXNzCiAqICAgIHRvIHRoZSBpbnRlcmZhY2UgbWV0aG9kcyBpbiBDLiBVbmZvcnR1bmF0ZWx5IEkgZG9uJ3Qgc2VlIGFueSB3YXkgdG8gYXZvaWQgaGF2aW5nIHRvIGR1cGxpY2F0ZQogKiAgICB0aGUgaW5oZXJpdGVkIG1ldGhvZCBkZWZpbml0aW9ucyB0aGVyZS4gVGhpcyB0aW1lIEkgY291bGQgaGF2ZSB1c2VkIGEgdHJpY2sgdG8gdXNlIG9ubHkgb25lCiAqICAgIG1hY3JvIHdoYXRldmVyIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBidXQgSSBwcmVmZXJlZCB0byBoYXZlIGl0IHdvcmsgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLgogKiAgLSBZb3UgcHJvYmFibHkgaGF2ZSBub3RpY2VkIHRoYXQgd2UgZG9uJ3QgZGVmaW5lIHRoZSBmaWVsZHMgd2UgbmVlZCB0byBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcwogKiAgICBpbnRlcmZhY2U6IHJlZmVyZW5jZSBjb3VudCwgcG9pbnRlciB0byBvdGhlciByZXNvdXJjZXMgYW5kIG1pc2NlbGxhbmVvdXMgZmllbGRzLiBUaGF0J3MKICogICAgYmVjYXVzZSB0aGVzZSBpbnRlcmZhY2VzIGFyZSBqdXN0IHRoYXQ6IGludGVyZmFjZXMuIFRoZXkgbWF5IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlLCBpbgogKiAgICBkaWZmZXJlbnQgY29udGV4dHMgYW5kIHNvbWV0aW1lcyBub3QgZXZlbiBpbiBXaW5lLiBUaHVzIGl0IHdvdWxkIG5vdCBtYWtlIHNlbnNlIHRvIGltcG9zZQogKiAgICB0aGF0IHRoZSBpbnRlcmZhY2UgY29udGFpbnMgc29tZSBzcGVjaWZpYyBmaWVsZHMuCiAqCiAqCiAqIEluIEMgdGhpcyBnaXZlczoKICogICAgdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVnRibCBJRGlyZWN0M0RWdGJsOwogKiAgICBzdHJ1Y3QgSURpcmVjdDNEIHsKICogICAgICAgIElEaXJlY3QzRFZ0YmwqIGxwVnRibDsKICogICAgfTsKICogICAgc3RydWN0IElEaXJlY3QzRFZ0YmwgewogKiAgICAgICAgSFJFU1VMVCAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopOwogKiAgICAgICAgVUxPTkcgKCpRdWVyeUludGVyZmFjZSkoSURpcmVjdDNEKiBtZSk7CiAqICAgICAgICBVTE9ORyAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lKTsKICogICAgICAgIEhSRVNVTFQgKCpJbml0aWFsaXplKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgYSk7CiAqICAgICAgICBIUkVTVUxUICgqRW51bURldmljZXMpKElEaXJlY3QzRCogbWUsIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlTGlnaHQpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZU1hdGVyaWFsKShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNETUFURVJJQUwqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVWaWV3cG9ydCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqRmluZERldmljZSkoSURpcmVjdDNEKiBtZSwgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKTsKICogICAgfTsKICoKICogICAgI2lmZGVmIENPQkpNQUNST1MKICogICAgLy8gKioqIElVbmtub3duIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0FkZFJlZihwKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1JlbGVhc2UocCkgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQogKiAgICAvLyAqKiogSURpcmVjdDNEIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0luaXRpYWxpemUocCxhKSAgICAgICAocCktPmxwVnRibC0+SW5pdGlhbGl6ZShwLGEpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0VudW1EZXZpY2VzKHAsYSxiKSAgICAocCktPmxwVnRibC0+RW51bURldmljZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTGlnaHQocCxhLGIpICAgIChwKS0+bHBWdGJsLT5DcmVhdGVMaWdodChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTWF0ZXJpYWwocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVNYXRlcmlhbChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlVmlld3BvcnQocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVWaWV3cG9ydChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRmluZERldmljZShwLGEsYikgICAgIChwKS0+bHBWdGJsLT5GaW5kRGV2aWNlKHAsYSxiKQogKiAgICAjZW5kaWYKICoKICogQ29tbWVudHM6CiAqICAtIElEaXJlY3QzRCBvbmx5IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgSURpcmVjdDNEIHZpcnR1YWwvanVtcCB0YWJsZS4gVGhpcyBpcyB0aGUgb25seSB0aGluZwogKiAgICB0aGUgdXNlciBuZWVkcyB0byBrbm93IHRvIHVzZSB0aGUgaW50ZXJmYWNlLiBPZiBjb3Vyc2UgdGhlIHN0cnVjdHVyZSB3ZSB3aWxsIGRlZmluZSB0bwogKiAgICBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugd2lsbCBoYXZlIG1vcmUgZmllbGRzIGJ1dCB0aGUgZmlyc3Qgb25lIHdpbGwgbWF0Y2ggdGhpcyBwb2ludGVyLgogKiAgLSBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgSUNPTV9ERUZJTkUgZGVmaW5lcyBib3RoIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBpbnRlcmZhY2UgYW5kCiAqICAgIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBqdW1wIHRhYmxlLiBJQ09NX0RFRklORSB1c2VzIHRoZSBwYXJlbnQncyBYeHhfTUVUSE9EUyBtYWNybyB0bwogKiAgICBhdXRvbWF0aWNhbGx5IHJlcGVhdCB0aGUgcHJvdG90eXBlcyBvZiBhbGwgdGhlIGluaGVyaXRlZCBtZXRob2RzIGFuZCB0aGVuIHVzZXMgSURpcmVjdDNEX01FVEhPRFMKICogICAgdG8gZGVmaW5lIHRoZSBJRGlyZWN0M0QgbWV0aG9kcy4KICogIC0gRWFjaCBtZXRob2QgaXMgZGVjbGFyZWQgYXMgYSBwb2ludGVyIHRvIGZ1bmN0aW9uIGZpZWxkIGluIHRoZSBqdW1wIHRhYmxlLiBUaGUgaW1wbGVtZW50YXRpb24KICogICAgd2lsbCBmaWxsIHRoaXMganVtcCB0YWJsZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlcywgcHJvYmFibHkgdXNpbmcgYSBzdGF0aWMgdmFyaWFibGUsIGFuZAogKiAgICBpbml0aWFsaXplIHRoZSBscFZ0YmwgZmllbGQgdG8gcG9pbnQgdG8gdGhpcyB2YXJpYWJsZS4KICogIC0gVGhlIElEaXJlY3QzRF9YeHggbWFjcm9zIHRoZW4ganVzdCBkZXJlZmVuY2UgdGhlIGxwVnRibCBwb2ludGVyIGFuZCB1c2UgdGhlIGZ1bmN0aW9uIHBvaW50ZXIKICogICAgY29ycmVzcG9uZGluZyB0byB0aGUgbWFjcm8gbmFtZS4gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgYSB2aXJ0dWFsIHRhYmxlIGFuZCBzaG91bGQgYmUKICogICAganVzdCBhcyBmYXN0LgogKiAgLSBUaGlzIEMgY29kZSBzaG91bGQgYmUgcXVpdGUgY29tcGF0aWJsZSB3aXRoIHRoZSBXaW5kb3dzIGhlYWRlcnMgYm90aCBmb3IgY29kZSB0aGF0IHVzZXMgQ09NCiAqICAgIGludGVyZmFjZXMgYW5kIGZvciBjb2RlIGltcGxlbWVudGluZyBhIENPTSBpbnRlcmZhY2UuCiAqCiAqCiAqIEFuZCBpbiBDKysgKHdpdGggZ2NjJ3MgZysrKToKICoKICogICAgdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEOiBwdWJsaWMgSVVua25vd24gewogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIEluaXRpYWxpemUoUkVGSUlEIGEpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBFbnVtRGV2aWNlcyhMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgYSwgTFBWT0lEIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVMaWdodChMUERJUkVDVDNETElHSFQqIGEsIElVbmtub3duKiBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlTWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMKiBhLCBJVW5rbm93biogYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZVZpZXdwb3J0KExQRElSRUNUM0RWSUVXUE9SVCogYSwgSVVua25vd24qIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBGaW5kRGV2aWNlKExQRDNERklORERFVklDRVNFQVJDSCBhLCBMUEQzREZJTkRERVZJQ0VSRVNVTFQgYikgPSAwOwogKiAgICB9OwogKgogKiBDb21tZW50czoKICogIC0gT2YgY291cnNlIGluIEMrKyB3ZSB1c2UgaW5oZXJpdGFuY2Ugc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbWV0aG9kIGRlZmluaXRpb25zLgogKiAgLSBGaW5hbGx5IHRoZXJlIGlzIG5vIElEaXJlY3QzRF9YeHggbWFjcm8uIFRoZXNlIGFyZSBub3QgbmVlZGVkIGluIEMrKyB1bmxlc3MgdGhlIENJTlRFUkZBQ0UKICogICAgbWFjcm8gaXMgZGVmaW5lZCBpbiB3aGljaCBjYXNlIHdlIHdvdWxkIG5vdCBiZSBoZXJlLgogKgogKgogKiBJbXBsZW1lbnRpbmcgYSBDT00gaW50ZXJmYWNlLgogKgogKiBUaGlzIGNvbnRpbnVlcyB0aGUgYWJvdmUgZXhhbXBsZS4gVGhpcyBleGFtcGxlIGFzc3VtZXMgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgaW4gQy4KICoKICogICAgdHlwZWRlZiBzdHJ1Y3QgX0lEaXJlY3QzRCB7CiAqICAgICAgICB2b2lkKiBscFZ0Ymw7CiAqICAgICAgICAvLyAuLi4KICoKICogICAgfSBfSURpcmVjdDNEOwogKgogKiAgICBzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdDNEKSBkM2R2dDsKICoKICogICAgLy8gaW1wbGVtZW50IHRoZSBJRGlyZWN0M0QgbWV0aG9kcyBoZXJlCiAqCiAqICAgIGludCBJRGlyZWN0M0RfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEKiBtZSkKICogICAgewogKiAgICAgICAgSUNPTV9USElTKElEaXJlY3QzRCxtZSk7CiAqICAgICAgICAvLyAuLi4KICogICAgfQogKgogKiAgICAvLyAuLi4KICoKICogICAgc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3QzRCkgZDNkdnQgPSB7CiAqICAgICAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQogKiAgICAgICAgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlLAogKiAgICAgICAgSURpcmVjdDNEX0FkZCwKICogICAgICAgIElEaXJlY3QzRF9BZGQyLAogKiAgICAgICAgSURpcmVjdDNEX0luaXRpYWxpemUsCiAqICAgICAgICBJRGlyZWN0M0RfU2V0V2lkdGgKICogICAgfTsKICoKICogQ29tbWVudHM6CiAqICAtIFdlIGZpcnN0IGRlZmluZSB3aGF0IHRoZSBpbnRlcmZhY2UgcmVhbGx5IGNvbnRhaW5zLiBUaGlzIGlzIHRoIGVfSURpcmVjdDNEIHN0cnVjdHVyZS4gVGhlCiAqICAgIGZpcnN0IGZpZWxkIG11c3Qgb2YgY291cnNlIGJlIHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBmcmVlLgogKiAgLSBUaGVuIHdlIHByZWRlY2xhcmUgb3VyIHN0YXRpYyB2aXJ0dWFsIHRhYmxlIHZhcmlhYmxlLCB3ZSB3aWxsIG5lZWQgaXRzIGFkZHJlc3MgaW4gc29tZQogKiAgICBtZXRob2RzIHRvIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUgcG9pbnRlciBvZiB0aGUgcmV0dXJuZWQgaW50ZXJmYWNlIG9iamVjdHMuCiAqICAtIFRoZW4gd2UgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgbWV0aG9kcy4gVG8gbWF0Y2ggd2hhdCBoYXMgYmVlbiBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUKICogICAgdGhleSBtdXN0IHRha2UgYSBwb2ludGVyIHRvIGEgSURpcmVjdDNEIHN0cnVjdHVyZSBhbmQgd2UgbXVzdCBjYXN0IGl0IHRvIGFuIF9JRGlyZWN0M0Qgc28gdGhhdAogKiAgICB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgZmllbGRzLiBUaGlzIGlzIHBlcmZvcm1lZCBieSB0aGUgSUNPTV9USElTIG1hY3JvLgogKiAgLSBGaW5hbGx5IHdlIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUuCiAqLwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKENJTlRFUkZBQ0UpCgovKiBDKysgaW50ZXJmYWNlICovCgojZGVmaW5lIFNURE1FVEhPRChtZXRob2QpICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWKG1ldGhvZCkgICAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKCiNkZWZpbmUgUFVSRSAgID0gMAojZGVmaW5lIFRISVNfCiNkZWZpbmUgVEhJUyAgIHZvaWQKCiNkZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAojaWZkZWYgSUNPTV9VU0VfQ09NX0lOVEVSRkFDRV9BVFRSSUJVVEUKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgICAgICAgIGludGVyZmFjZSBfX2F0dHJpYnV0ZV9fKChjb21faW50ZXJmYWNlKSkgaWZhY2UKI2Vsc2UKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgICAgICAgIGludGVyZmFjZSBpZmFjZQojZW5kaWYKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRV8oaWZhY2UsaWJhc2UpIGludGVyZmFjZSBpZmFjZSA6IHB1YmxpYyBpYmFzZQoKI2RlZmluZSBCRUdJTl9JTlRFUkZBQ0UKI2RlZmluZSBFTkRfSU5URVJGQUNFCgojZWxzZSAgLyogX19jcGx1c3BsdXMgJiYgIUNJTlRFUkZBQ0UgKi8KCi8qIEMgaW50ZXJmYWNlICovCgojZGVmaW5lIENPQkpNQUNST1MKCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgICAgICAgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICptZXRob2QpCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgIHR5cGUgKFNURE1FVEhPRENBTExUWVBFICptZXRob2QpCiNkZWZpbmUgU1RETUVUSE9EVihtZXRob2QpICAgICAgIEhSRVNVTFQgKFNURE1FVEhPRFZDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRFZfKHR5cGUsbWV0aG9kKSB0eXBlIChTVERNRVRIT0RWQ0FMTFRZUEUgKm1ldGhvZCkKCiNkZWZpbmUgUFVSRQojZGVmaW5lIFRISVNfIElOVEVSRkFDRSAqVGhpcywKI2RlZmluZSBUSElTICBJTlRFUkZBQ0UgKlRoaXMKCiNkZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAoKI2lmZGVmIENPTlNUX1ZUQUJMRQojdW5kZWYgQ09OU1RfVlRCTAojZGVmaW5lIENPTlNUX1ZUQkwgY29uc3QKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgXAogICAgICAgICAvKnR5cGVkZWYqLyBpbnRlcmZhY2UgaWZhY2UgeyBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwgKmxwVnRibDsgfSAvKmlmYWNlKi87IFwKICAgICAgICAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwgaWZhY2UjI1Z0Ymw7IFwKICAgICAgICAgY29uc3Qgc3RydWN0IGlmYWNlIyNWdGJsCiNlbHNlCiN1bmRlZiBDT05TVF9WVEJMCiNkZWZpbmUgQ09OU1RfVlRCTAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSBcCiAgICAgICAgIC8qdHlwZWRlZiovIGludGVyZmFjZSBpZmFjZSB7IHN0cnVjdCBpZmFjZSMjVnRibCAqbHBWdGJsOyB9IC8qaWZhY2UqLzsgXAogICAgICAgICB0eXBlZGVmIHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2VuZGlmCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0VfKGlmYWNlLGliYXNlKSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAmJiAhQ0lOVEVSRkFDRSAqLwoKLyogV2luZS1zcGVjaWZpYyBtYWNyb3MgKi8KCiNkZWZpbmUgSUNPTV9ERUZJTkUoaWZhY2UsaWJhc2UpIERFQ0xBUkVfSU5URVJGQUNFXyhpZmFjZSxpYmFzZSkgeyBpZmFjZSMjX01FVEhPRFMgfTsKI2RlZmluZSBJQ09NX1ZUQUJMRShpZmFjZSkgICAgICAgaWZhY2UjI1Z0YmwKI2RlZmluZSBJQ09NX1ZGSUVMRChpZmFjZSkgICAgICAgSUNPTV9WVEFCTEUoaWZhY2UpKiBscFZ0YmwKI2RlZmluZSBJQ09NX1RISVMoaW1wbCxpZmFjZSkgICAgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKGlmYWNlKQojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSAgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKChjaGFyKikoaWZhY2UpIC0gb2Zmc2V0b2YoaW1wbCxmaWVsZCkpCgojaW5jbHVkZSA8b2JqaWRsLmg+CgojaWZuZGVmIFJDX0lOVk9LRUQKLyogRm9yIGNvbXBhdGliaWxpdHkgb25seSwgYXQgbGVhc3QgZm9yIG5vdyAqLwojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmbmRlZiBJTklUR1VJRAojaW5jbHVkZSA8Y2d1aWQuaD4KI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2lmbmRlZiBOT05BTUVMRVNTU1RSVUNUCiNkZWZpbmUgTElTZXQzMihsaSwgdikgICAoKGxpKS5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkuTG93UGFydCA9ICh2KSkKI2RlZmluZSBVTElTZXQzMihsaSwgdikgICgobGkpLkhpZ2hQYXJ0ID0gMCwgKGxpKS5Mb3dQYXJ0ID0gKHYpKQojZWxzZQojZGVmaW5lIExJU2V0MzIobGksIHYpICAgKChsaSkucy5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkucy5Mb3dQYXJ0ID0gKHYpKQojZGVmaW5lIFVMSVNldDMyKGxpLCB2KSAgKChsaSkucy5IaWdoUGFydCA9IDAsIChsaSkucy5Mb3dQYXJ0ID0gKHYpKQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTdGFuZGFyZCBBUEkKICovCkRXT1JEIFdJTkFQSSBDb0J1aWxkVmVyc2lvbih2b2lkKTsKCnR5cGVkZWYgZW51bSB0YWdDT0lOSVQKewogICAgQ09JTklUX0FQQVJUTUVOVFRIUkVBREVEICA9IDB4MiwgLyogQXBhcnRtZW50IG1vZGVsICovCiAgICBDT0lOSVRfTVVMVElUSFJFQURFRCAgICAgID0gMHgwLCAvKiBPTEUgY2FsbHMgb2JqZWN0cyBvbiBhbnkgdGhyZWFkICovCiAgICBDT0lOSVRfRElTQUJMRV9PTEUxRERFICAgID0gMHg0LCAvKiBEb24ndCB1c2UgRERFIGZvciBPbGUxIHN1cHBvcnQgKi8KICAgIENPSU5JVF9TUEVFRF9PVkVSX01FTU9SWSAgPSAweDggIC8qIFRyYWRlIG1lbW9yeSBmb3Igc3BlZWQgKi8KfSBDT0lOSVQ7CgpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUoTFBWT0lEIGxwUmVzZXJ2ZWQpOwpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVFeChMUFZPSUQgbHBSZXNlcnZlZCwgRFdPUkQgZHdDb0luaXQpOwp2b2lkIFdJTkFQSSBDb1VuaW5pdGlhbGl6ZSh2b2lkKTsKRFdPUkQgV0lOQVBJIENvR2V0Q3VycmVudFByb2Nlc3Modm9pZCk7CgpISU5TVEFOQ0UgV0lOQVBJIENvTG9hZExpYnJhcnkoTFBPTEVTVFIgbHBzekxpYk5hbWUsIEJPT0wgYkF1dG9GcmVlKTsKdm9pZCBXSU5BUEkgQ29GcmVlQWxsTGlicmFyaWVzKHZvaWQpOwp2b2lkIFdJTkFQSSBDb0ZyZWVMaWJyYXJ5KEhJTlNUQU5DRSBoTGlicmFyeSk7CnZvaWQgV0lOQVBJIENvRnJlZVVudXNlZExpYnJhcmllcyh2b2lkKTsKCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVua091dGVyLCBEV09SRCBkd0Nsc0NvbnRleHQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVJbnN0YW5jZUV4KFJFRkNMU0lEICAgICAgcmNsc2lkLAoJCQkJICBMUFVOS05PV04gICAgIHBVbmtPdXRlciwKCQkJCSAgRFdPUkQgICAgICAgICBkd0Nsc0NvbnRleHQsCgkJCQkgIENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sCgkJCQkgIFVMT05HICAgICAgICAgY21xLAoJCQkJICBNVUxUSV9RSSogICAgIHBSZXN1bHRzKTsKCkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tRmlsZShDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLCBDTFNJRCogcENsc2lkLCBJVW5rbm93biogcHVua091dGVyLCBEV09SRCBkd0Nsc0N0eCwgRFdPUkQgZ3JmTW9kZSwgT0xFQ0hBUiogcHdzek5hbWUsIERXT1JEIGR3Q291bnQsIE1VTFRJX1FJKiBwUmVzdWx0cyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tSVN0b3JhZ2UoQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywgQ0xTSUQqIHBDbHNpZCwgSVVua25vd24qIHB1bmtPdXRlciwgRFdPUkQgZHdDbHNDdHgsIElTdG9yYWdlKiBwc3RnLCBEV09SRCBkd0NvdW50LCBNVUxUSV9RSSogcFJlc3VsdHMpOwoKSFJFU1VMVCBXSU5BUEkgQ29HZXRNYWxsb2MoRFdPUkQgZHdNZW1Db250ZXh0LCBMUE1BTExPQyogbHBNYWxsb2MpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbUFsbG9jKFVMT05HIHNpemUpOwp2b2lkIFdJTkFQSSBDb1Rhc2tNZW1GcmVlKExQVk9JRCBwdHIpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbVJlYWxsb2MoTFBWT0lEIHB0ciwgVUxPTkcgc2l6ZSk7CgpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWFsbG9jU3B5KExQTUFMTE9DU1BZIHBNYWxsb2NTcHkpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZU1hbGxvY1NweSh2b2lkKTsKCi8qIGNsYXNzIHJlZ2lzdHJhdGlvbiBmbGFnczsgcGFzc2VkIHRvIENvUmVnaXN0ZXJDbGFzc09iamVjdCAqLwp0eXBlZGVmIGVudW0gdGFnUkVHQ0xTCnsKICAgIFJFR0NMU19TSU5HTEVVU0UgPSAwLAogICAgUkVHQ0xTX01VTFRJUExFVVNFID0gMSwKICAgIFJFR0NMU19NVUxUSV9TRVBBUkFURSA9IDIsCiAgICBSRUdDTFNfU1VTUEVOREVEID0gNAp9IFJFR0NMUzsKCkhSRVNVTFQgV0lOQVBJIENvR2V0Q2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBEV09SRCBkd0Nsc0NvbnRleHQsIENPU0VSVkVSSU5GTyAqcFNlcnZlckluZm8sIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3RlckNsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxMUFVOS05PV04gcFVuayxEV09SRCBkd0Nsc0NvbnRleHQsRFdPUkQgZmxhZ3MsTFBEV09SRCBscGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZUNsYXNzT2JqZWN0KERXT1JEIGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb0dldFBTQ2xzaWQoUkVGSUlEIHJpaWQsQ0xTSUQgKnBjbHNpZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJQU0Nsc2lkKFJFRklJRCByaWlkLCBSRUZDTFNJRCByY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1N1c3BlbmRDbGFzc09iamVjdHModm9pZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVzdW1lQ2xhc3NPYmplY3RzKHZvaWQpOwpVTE9ORyBXSU5BUEkgQ29BZGRSZWZTZXJ2ZXJQcm9jZXNzKHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1JlbGVhc2VTZXJ2ZXJQcm9jZXNzKHZvaWQpOwoKLyogbWFyc2hhbGxpbmcgKi8KSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVGcmVlVGhyZWFkZWRNYXJzaGFsZXIoTFBVTktOT1dOIHB1bmtPdXRlciwgTFBVTktOT1dOKiBwcHVua01hcnNoYWwpOwpIUkVTVUxUIFdJTkFQSSBDb0dldEludGVyZmFjZUFuZFJlbGVhc2VTdHJlYW0oTFBTVFJFQU0gcFN0bSwgUkVGSUlEIGlpZCwgTFBWT0lEKiBwcHYpOwpIUkVTVUxUIFdJTkFQSSBDb0dldE1hcnNoYWxTaXplTWF4KFVMT05HKiBwdWxTaXplLCBSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MpOwpIUkVTVUxUIFdJTkFQSSBDb0dldFN0YW5kYXJkTWFyc2hhbChSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MsIExQTUFSU0hBTCogcHBNYXJzaGFsKTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSHJlc3VsdChMUFNUUkVBTSBwc3RtLCBIUkVTVUxUIGhyZXN1bHQpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxJbnRlcmZhY2UoTFBTVFJFQU0gcFN0bSwgUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzKTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSW50ZXJUaHJlYWRJbnRlcmZhY2VJblN0cmVhbShSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIExQU1RSRUFNKiBwcFN0bSk7CkhSRVNVTFQgV0lOQVBJIENvUmVsZWFzZU1hcnNoYWxEYXRhKExQU1RSRUFNIHBTdG0pOwpIUkVTVUxUIFdJTkFQSSBDb0Rpc2Nvbm5lY3RPYmplY3QoTFBVTktOT1dOIGxwVW5rLCBEV09SRCByZXNlcnZlZCk7CkhSRVNVTFQgV0lOQVBJIENvVW5tYXJzaGFsSHJlc3VsdChMUFNUUkVBTSBwc3RtLCBIUkVTVUxUKiBwaHJlc3VsdCk7CkhSRVNVTFQgV0lOQVBJIENvVW5tYXJzaGFsSW50ZXJmYWNlKExQU1RSRUFNIHBTdG0sIFJFRklJRCByaWlkLCBMUFZPSUQqIHBwdik7CkhSRVNVTFQgV0lOQVBJIENvTG9ja09iamVjdEV4dGVybmFsKExQVU5LTk9XTiBwVW5rLCBCT09MIGZMb2NrLCBCT09MIGZMYXN0VW5sb2NrUmVsZWFzZXMpOwpCT09MIFdJTkFQSSBDb0lzSGFuZGxlckNvbm5lY3RlZChMUFVOS05PV04gcFVuayk7CgovKiBzZWN1cml0eSAqLwpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVTZWN1cml0eShQU0VDVVJJVFlfREVTQ1JJUFRPUiBwU2VjRGVzYywgTE9ORyBjQXV0aFN2YywgU09MRV9BVVRIRU5USUNBVElPTl9TRVJWSUNFKiBhc0F1dGhTdmMsIHZvaWQqIHBSZXNlcnZlZDEsIERXT1JEIGR3QXV0aG5MZXZlbCwgRFdPUkQgZHdJbXBMZXZlbCwgdm9pZCogcFJlc2VydmVkMiwgRFdPUkQgZHdDYXBhYmlsaXRpZXMsIHZvaWQqIHBSZXNlcnZlZDMpOwpIUkVTVUxUIFdJTkFQSSBDb0dldENhbGxDb250ZXh0KFJFRklJRCByaWlkLCB2b2lkKiogcHBJbnRlcmZhY2UpOwpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5QXV0aGVudGljYXRpb25TZXJ2aWNlcyhEV09SRCogcGNBdXRoU3ZjLCBTT0xFX0FVVEhFTlRJQ0FUSU9OX1NFUlZJQ0UqKiBhc0F1dGhTdmMpOwoKSFJFU1VMVCBXSU5BUEkgQ29RdWVyeVByb3h5QmxhbmtldChJVW5rbm93biogcFByb3h5LCBEV09SRCogcHdBdXRoblN2YywgRFdPUkQqIHBBdXRoelN2YywgT0xFQ0hBUioqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEKiBwQXV0aG5MZXZlbCwgRFdPUkQqIHBJbXBMZXZlbCwgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFKiBwQXV0aEluZm8sIERXT1JEKiBwQ2FwYWJpbGl0ZXMpOwpIUkVTVUxUIFdJTkFQSSBDb1NldFByb3h5QmxhbmtldChJVW5rbm93biogcFByb3h5LCBEV09SRCBkd0F1dGhuU3ZjLCBEV09SRCBkd0F1dGh6U3ZjLCBPTEVDSEFSKiBwU2VydmVyUHJpbmNOYW1lLCBEV09SRCBkd0F1dGhuTGV2ZWwsIERXT1JEIGR3SW1wTGV2ZWwsIFJQQ19BVVRIX0lERU5USVRZX0hBTkRMRSBwQXV0aEluZm8sIERXT1JEIGR3Q2FwYWJpbGl0aWVzKTsKSFJFU1VMVCBXSU5BUEkgQ29Db3B5UHJveHkoSVVua25vd24qIHBQcm94eSwgSVVua25vd24qKiBwcENvcHkpOwoKSFJFU1VMVCBXSU5BUEkgQ29JbXBlcnNvbmF0ZUNsaWVudCh2b2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29RdWVyeUNsaWVudEJsYW5rZXQoRFdPUkQqIHBBdXRoblN2YywgRFdPUkQqIHBBdXRoelN2YywgT0xFQ0hBUjE2KiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSFpfSEFORExFKiBwUHJpdnMsIERXT1JEKiBwQ2FwYWJpbGl0aWVzKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZlcnRUb1NlbGYodm9pZCk7CgovKiBtaXNjICovCkhSRVNVTFQgV0lOQVBJIENvR2V0VHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBMUENMU0lEIHBDbHNpZE5ldyk7CkhSRVNVTFQgV0lOQVBJIENvVHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBSRUZDTFNJRCBjbHNpZE5ldyk7CgpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUd1aWQoR1VJRCogcGd1aWQpOwpCT09MIFdJTkFQSSBDb0lzT2xlMUNsYXNzKFJFRkNMU0lEIHJjbHNpZCk7CgpCT09MIFdJTkFQSSBDb0Rvc0RhdGVUaW1lVG9GaWxlVGltZShXT1JEIG5Eb3NEYXRlLCBXT1JEIG5Eb3NUaW1lLCBGSUxFVElNRSogbHBGaWxlVGltZSk7CkJPT0wgV0lOQVBJIENvRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKEZJTEVUSU1FKiBscEZpbGVUaW1lLCBXT1JEKiBscERvc0RhdGUsIFdPUkQqIGxwRG9zVGltZSk7CkhSRVNVTFQgV0lOQVBJIENvRmlsZVRpbWVOb3coRklMRVRJTUUqIGxwRmlsZVRpbWUpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcihMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdVSUQgQVBJCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQxNihSRUZDTFNJRCBpZCwgTFBPTEVTVFIxNiopOwpIUkVTVUxUIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQoUkVGQ0xTSUQgaWQsIExQT0xFU1RSKik7CgpIUkVTVUxUIFdJTkFQSSBDTFNJREZyb21TdHJpbmcxNihMUENPTEVTVFIxNiwgQ0xTSUQgKik7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVN0cmluZyhMUENPTEVTVFIsIENMU0lEICopOwoKSFJFU1VMVCBXSU5BUEkgQ0xTSURGcm9tUHJvZ0lEMTYoTFBDT0xFU1RSMTYgcHJvZ2lkLCBMUENMU0lEIHJpaWQpOwpIUkVTVUxUIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQoTFBDT0xFU1RSIHByb2dpZCwgTFBDTFNJRCByaWlkKTsKCkhSRVNVTFQgV0lOQVBJIFByb2dJREZyb21DTFNJRChSRUZDTFNJRCBjbHNpZCwgTFBPTEVTVFIgKmxwbHBzelByb2dJRCk7CgpJTlQgV0lOQVBJIFN0cmluZ0Zyb21HVUlEMihSRUZHVUlEIGlkLCBMUE9MRVNUUiBzdHIsIElOVCBjbWF4KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDT00gU2VydmVyIGRsbCAtIGV4cG9ydHMKICovCkhSRVNVTFQgV0lOQVBJIERsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdik7CkhSRVNVTFQgV0lOQVBJIERsbENhblVubG9hZE5vdyh2b2lkKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEYXRhIE9iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRGF0YUFkdmlzZUhvbGRlcihMUERBVEFBRFZJU0VIT0xERVIqIHBwREFIb2xkZXIpOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVEYXRhQ2FjaGUoTFBVTktOT1dOIHBVbmtPdXRlciwgUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFZPSUQqIHBwdik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJTW9uaWtlciBBUEkKICovCkhSRVNVTFQgV0lOQVBJIEdldENsYXNzRmlsZShMUENPTEVTVFIgZmlsZVBhdGhOYW1lLENMU0lEICpwY2xzaWQpOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQmluZEN0eDE2KERXT1JEIHJlc2VydmVkLCBMUEJDKiBwcGJjKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQmluZEN0eChEV09SRCByZXNlcnZlZCwgTFBCQyogcHBiYyk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVGaWxlTW9uaWtlcjE2KExQQ09MRVNUUjE2IGxwc3pQYXRoTmFtZSwgTFBNT05JS0VSKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRmlsZU1vbmlrZXIoTFBDT0xFU1RSIGxwc3pQYXRoTmFtZSwgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUl0ZW1Nb25pa2VyMTYoTFBDT0xFU1RSMTYgbHBzekRlbGltLCBMUENPTEVTVFIgIGxwc3pJdGVtLCBMUE1PTklLRVIqIHBwbWspOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVJdGVtTW9uaWtlcihMUENPTEVTVFIgbHBzekRlbGltLCBMUENPTEVTVFIgIGxwc3pJdGVtLCBMUE1PTklLRVIqIHBwbWspOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQW50aU1vbmlrZXIoTFBNT05JS0VSICogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVHZW5lcmljQ29tcG9zaXRlKExQTU9OSUtFUiBwbWtGaXJzdCwgTFBNT05JS0VSIHBta1Jlc3QsIExQTU9OSUtFUiogcHBta0NvbXBvc2l0ZSk7CgpIUkVTVUxUIFdJTkFQSSBCaW5kTW9uaWtlcihMUE1PTklLRVIgcG1rLCBEV09SRCBncmZPcHQsIFJFRklJRCBpaWRSZXN1bHQsIExQVk9JRCogcHB2UmVzdWx0KTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUNsYXNzTW9uaWtlcihSRUZDTFNJRCByY2xzaWQsIExQTU9OSUtFUiogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVQb2ludGVyTW9uaWtlcihMUFVOS05PV04gcHVuaywgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIE1vbmlrZXJDb21tb25QcmVmaXhXaXRoKElNb25pa2VyKiBwbWtUaGlzLElNb25pa2VyKiBwbWtPdGhlcixJTW9uaWtlcioqIHBwbWtDb21tb24pOwoKSFJFU1VMVCBXSU5BUEkgR2V0UnVubmluZ09iamVjdFRhYmxlKERXT1JEIHJlc2VydmVkLCBMUFJVTk5JTkdPQkpFQ1RUQUJMRSAqcHByb3QpOwpIUkVTVUxUIFdJTkFQSSBHZXRSdW5uaW5nT2JqZWN0VGFibGUxNihEV09SRCByZXNlcnZlZCwgTFBSVU5OSU5HT0JKRUNUVEFCTEUgKnBwcm90KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTdG9yYWdlIEFQSQogKi8KI2RlZmluZSBTVEdNX0RJUkVDVAkJMHgwMDAwMDAwMAojZGVmaW5lIFNUR01fVFJBTlNBQ1RFRAkJMHgwMDAxMDAwMAojZGVmaW5lIFNUR01fU0lNUExFCQkweDA4MDAwMDAwCiNkZWZpbmUgU1RHTV9SRUFECQkweDAwMDAwMDAwCiNkZWZpbmUgU1RHTV9XUklURQkJMHgwMDAwMDAwMQojZGVmaW5lIFNUR01fUkVBRFdSSVRFCQkweDAwMDAwMDAyCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX05PTkUJMHgwMDAwMDA0MAojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9SRUFECTB4MDAwMDAwMzAKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfV1JJVEUJMHgwMDAwMDAyMAojZGVmaW5lIFNUR01fU0hBUkVfRVhDTFVTSVZFCTB4MDAwMDAwMTAKI2RlZmluZSBTVEdNX1BSSU9SSVRZCQkweDAwMDQwMDAwCiNkZWZpbmUgU1RHTV9ERUxFVEVPTlJFTEVBU0UJMHgwNDAwMDAwMAojZGVmaW5lIFNUR01fQ1JFQVRFCQkweDAwMDAxMDAwCiNkZWZpbmUgU1RHTV9DT05WRVJUCQkweDAwMDIwMDAwCiNkZWZpbmUgU1RHTV9GQUlMSUZUSEVSRQkweDAwMDAwMDAwCiNkZWZpbmUgU1RHTV9OT1NDUkFUQ0gJCTB4MDAxMDAwMDAKI2RlZmluZSBTVEdNX05PU05BUFNIT1QJCTB4MDAyMDAwMDAKCkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGUoTFBDT0xFU1RSIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlKExQQ09MRVNUUiBmbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0KTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2UoY29uc3QgT0xFQ0hBUiogcHdjc05hbWUsSVN0b3JhZ2UqIHBzdGdQcmlvcml0eSxEV09SRCBncmZNb2RlLFNOQiBzbmJFeGNsdWRlLERXT1JEIHJlc2VydmVkLElTdG9yYWdlKipwcHN0Z09wZW4pOwoKSFJFU1VMVCBXSU5BUEkgV3JpdGVDbGFzc1N0ZyhJU3RvcmFnZSogcFN0ZywgUkVGQ0xTSUQgcmNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgUmVhZENsYXNzU3RnKElTdG9yYWdlICpwc3RnLENMU0lEICpwY2xzaWQpOwoKSFJFU1VMVCBXSU5BUEkgU3RnQ3JlYXRlRG9jZmlsZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQsRFdPUkQgZ3JmTW9kZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlKiogcHBzdGdPcGVuKTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2VPbklMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0LCBJU3RvcmFnZSAqcHN0Z1ByaW9yaXR5LCBEV09SRCBncmZNb2RlLCBTTkIgc25iRXhjbHVkZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlICoqcHBzdGdPcGVuKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKCiNpZm5kZWYgX19XSU5FU1JDX18KCiNkZWZpbmUgRkFSU1RSVUNUCiNkZWZpbmUgSFVHRVAKCiNkZWZpbmUgV0lOT0xFQVBJICAgICAgICBTVERBUEkKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIFNUREFQSV8odHlwZSkKCiNlbmRpZiAvKiBfX1dJTkVTUkNfXyAqLwoKI2VuZGlmIC8qIF9PQkpCQVNFX0hfICovCg==